<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Doing the Dishes</title>
 <link href="http://doingthedishes.com/atom.xml" rel="self"/>
 <link href="http://doingthedishes.com/"/>
 <updated>2015-02-03T06:42:58+00:00</updated>
 <id>http://doingthedishes.com/</id>
 <author>
   <name>Derek Morrison</name>
   <email>me@derek-morrison.com</email>
 </author>

 
 <entry>
   <title>Mercurial Versus Git (Kind Of)</title>
   <link href="http://doingthedishes.com/2013/06/22/mercurial-vs-git-kind-of.html"/>
   <updated>2013-06-22T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2013/06/22/mercurial-vs-git-kind-of</id>
   <content type="html">&lt;p&gt;There are many posts comparing Mercurial and Git, but here are the top
things I noticed recently when I used Mercurial for an extended amount
of time. Before that, I had come from a Git background.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Git has a staging area and Mercurial doesn’t. In Mercurial, when you modify files already in a repo, they’re automatically added to the list of things that will be commited. In Git, you need to explicitly add these every time to the staging area.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Branches in Mercurial and Git are different in a few important ways:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Mercurial tracks global commits (which can be on different branches), but
Git tracks branches and the isolated commits inside these branches.&lt;/li&gt;
      &lt;li&gt;So, when you pull or push a Mercurial repository, you implicitly pull/push all branches.&lt;/li&gt;
      &lt;li&gt;In Mercurial, you “close” branches instead of deleting them (and they can be re-opened later at any time by just committing to them again). In Git, you actually delete branches. For Mercurial, this is good in that it preserves history, but, arguably, it’s not as clean.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Git’s &lt;code&gt;checkout&lt;/code&gt; is an overloaded, &lt;a href=&quot;http://stevelosh.com/blog/2010/01/the-real-difference-between-mercurial-and-git/#the-big-difference&quot;&gt;Swiss Army knife&lt;/a&gt;, whereas Mercurial splits things into &lt;code&gt;hg branch&lt;/code&gt;, &lt;code&gt;hg update&lt;/code&gt;, and &lt;code&gt;hg revert&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The often-used &lt;code&gt;git pull&lt;/code&gt; command combines two things (fetching and merging). In Mercurial, this shortcut command doesn’t really exist. You need to do &lt;code&gt;hg pull&lt;/code&gt; &lt;em&gt;and then&lt;/em&gt; an &lt;code&gt;hg update&lt;/code&gt;. Though, you can do &lt;code&gt;hg pull -u&lt;/code&gt; to achieve the same.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mercurial does garbage collection on a repository automatically when certain commands are called. Git makes you do it explicitly. I heard some people from GitHub at a recent presentation say that they get support tickets sometimes for people asking GitHub to do a &lt;code&gt;git gc&lt;/code&gt; for them to try and magically fix certain problems.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;In Git, you can remove a stash/shelf with &lt;code&gt;git stash drop&lt;/code&gt;, but it seems you can’t do this in Mercurial. Though, shelves &lt;a href=&quot;http://stackoverflow.com/questions/10001017/hg-shelve-equivalent-of-git-stash-drop&quot;&gt;are just stored as patches&lt;/a&gt; under .hg/shelves, so you can remove a file there to delete a shelf.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mercurial is more lenient on the format used for the user name and the
email settings, so things can, arguably, get messier in the commit log than with Git.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, I actually enjoyed using Mercurial, and I can see where it’s
perhaps better designed in several ways. However, the features of GitHub
versus BitBucket outweigh a lot of these factors.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python Package Management with Virtualenv on OS X Mountain Lion 10.8</title>
   <link href="http://doingthedishes.com/2013/06/18/python-package-management-with-virtualenv.html"/>
   <updated>2013-06-18T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2013/06/18/python-package-management-with-virtualenv</id>
   <content type="html">&lt;h1 id=&quot;preface&quot;&gt;Preface&lt;/h1&gt;

&lt;p&gt;I had worked with both Ruby’s RVM and rbenv a little, and setting up something similar for Python version and package management seemed a little undocumented, ambiguous, and generally quirky to me. Maybe doing this should not require a blog post, though the following was the simplest way for me to accomplish this.&lt;/p&gt;

&lt;p&gt;Also, &lt;a href=&quot;http://hackercodex.com/guide/python-virtualenv-on-mac-osx-mountain-lion-10.8/&quot;&gt;this post&lt;/a&gt; on the same topic was very helpful.&lt;/p&gt;

&lt;h1 id=&quot;python&quot;&gt;Python&lt;/h1&gt;

&lt;p&gt;I choose to leave OS X’s stock Python install alone, which was a slightly out-of-date version 2.7.2 for the system executable at /usr/bin/python. Also, the Python package manager easy_install comes with 10.8, but it’s &lt;a href=&quot;https://github.com/mxcl/homebrew/wiki/Gems,-Eggs-and-Perl-Modules#with-a-brewed-python--you-dont-need-sudo&quot;&gt;deprecated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, I wanted to start with a base Python version that was more recent than the OS X stock Python. I did this using Homebrew:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;brew install python
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This installed version 2.7.5. Note that the Homebrew install of Python also includes Pip (the preferred Python package manager these days) as well as Distribute (a lower-level package management piece &lt;a href=&quot;http://stackoverflow.com/a/8550546/33096&quot;&gt;that Pip builds upon&lt;/a&gt;).&lt;/p&gt;

&lt;h1 id=&quot;global-packages&quot;&gt;Global Packages&lt;/h1&gt;

&lt;p&gt;At this point, if I use Pip to install a package, it will be installed globally. In general, I want to only install packages into specific environments and leave the global package store alone. However, I still need a global package for virtualenv itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pip install virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I may have to install other global packages in the future, but the only package I’ve installed explicitly for now is virtualenv.&lt;/p&gt;

&lt;h1 id=&quot;setting-up-virtualenv&quot;&gt;Setting Up Virtualenv&lt;/h1&gt;

&lt;p&gt;I created a &lt;code&gt;~/.virtualenvs&lt;/code&gt; folder where I will create all or most of my environments:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir ~/.virtualenvs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For example, I can create a global environment for Python 2.7 packages, and a global environment for Python 3 packages. Note that I can also create project-specific environments if I want.&lt;/p&gt;

&lt;p&gt;Then, I added the following default settings to my &lt;code&gt;.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# virtualenv settings
export PIP_REQUIRE_VIRTUALENV=true # pip should only run if there is a virtualenv currently activated
export PIP_RESPECT_VIRTUALENV=true # tell pip to install packages into the active virtualenv environment
export VIRTUALENV_DISTRIBUTE=true  # tell virtualenv to use Distribute instead of legacy setuptools
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first setting is the most important. It tells pip to only run if inside a virtual environment. This keeps global packages untouched and stable, and it prevents a package from accidentally being installed globally when you mean to install it in a particular virtual environment. However, if global packages need to be installed/uninstalled/upgraded later, I’ll need to temporarily comment out and disable this setting.&lt;/p&gt;

&lt;p&gt;Also note the &lt;code&gt;VIRTUALENV_DISTRIBUTE&lt;/code&gt; option. This tells virtualenv to use the newer Distribute supporting library. From the official Python package page &lt;a href=&quot;https://pypi.python.org/pypi/distribute&quot;&gt;here&lt;/a&gt;: &lt;em&gt;Distribute is a fork of the Setuptools project. Distribute is intended to replace Setuptools as the standard method for working with Python module distributions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now, we can create an environment and activate it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ~/.virtualenvs
virtualenv default
. ~/.virtualenvs/default/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this environment active, any calls to the Python, Pip, etc. executables will pass through it, and packages will be installed to this environment.&lt;/p&gt;

&lt;h1 id=&quot;listing-and-uninstalling-environments&quot;&gt;Listing and Uninstalling Environments&lt;/h1&gt;

&lt;p&gt;Since I plan to create most environments in &lt;code&gt;~/.virtualenvs&lt;/code&gt;, I can just check that directory to see all installed environments. Likewise, to remove an environment, I can just remove the corresponding directory there.&lt;/p&gt;

&lt;h1 id=&quot;creating-a-default-environment&quot;&gt;Creating a Default Environment&lt;/h1&gt;

&lt;p&gt;To activate a default environment on login, I also added this to my &lt;code&gt;.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# set a default virtualenv
. ~/.virtualenvs/default/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h1&gt;

&lt;h2 id=&quot;virtualenvwrapper&quot;&gt;Virtualenvwrapper&lt;/h2&gt;

&lt;p&gt;Virtualenvwrapper claims to ease several of the pain points and manual steps I described above, but I wanted to see if I could use virtualenv directly without adding another layer of tooling to learn.&lt;/p&gt;

&lt;h2 id=&quot;modifying-the-shell&quot;&gt;Modifying the Shell&lt;/h2&gt;

&lt;p&gt;When you activate an environment, virtualenv modifies your prompt to indicate which environment you’re using. If this is undesirable, you can add the following line to your &lt;code&gt;.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export VIRTUAL_ENV_DISABLE_PROMPT=true # tell virtualenv not to modify my prompt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you disable this indicator in your prompt, you can check which environment you’re currently using by echoing the &lt;code&gt;$VIRTUAL_ENV&lt;/code&gt; variable.&lt;/p&gt;

&lt;h2 id=&quot;an-environments-bindings-to-a-python-executable&quot;&gt;An Environment’s Bindings to a Python Executable&lt;/h2&gt;

&lt;p&gt;When a new environment is created, it is bound to the current system Python executable by default (whatever &lt;code&gt;which python&lt;/code&gt; points to). In my case, this will be the Python 2 executable installed by Homebrew. You can, however, bind a new virtual environment to a particular Python executable by using the &lt;code&gt;-p&lt;/code&gt; flag. For example, you could do &lt;code&gt;virtualenv -p python3 foo-py3&lt;/code&gt; to create a Python 3 environment or even &lt;code&gt;virtualenv -p /usr/bin/python2.6 foo-py2.6&lt;/code&gt; to call out a specific path to a Python executable.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Try...Catch Blocks with Async Methods in .NET 4.5</title>
   <link href="http://doingthedishes.com/2013/05/31/using-try-catch-with-aync-methods-in-dot-net-4-5.html"/>
   <updated>2013-05-31T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2013/05/31/using-try-catch-with-aync-methods-in-dot-net-4-5</id>
   <content type="html">&lt;p&gt;In my &lt;a href=&quot;/2013/05/28/sending-to-statsd-with-udpclient-in-dotnet.html&quot;&gt;last post&lt;/a&gt;, I mentioned that you can still use &lt;code&gt;try...catch&lt;/code&gt; blocks with .NET 4.5 async methods. There is some interesting magic that .NET injects for you under the covers in this case. For example, imagine you have the following (simplified and contrived) code which uses the newer .NET 4.5 &lt;code&gt;SendAsync()&lt;/code&gt; method on &lt;code&gt;UdpClient&lt;/code&gt; instead of the older, synchronous &lt;code&gt;Send()&lt;/code&gt; version:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// Do something...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UdpClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SendAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datagram&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datagram&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hostname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;// Handle exception here...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Do something else...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let’s assume that the host specified by &lt;code&gt;hostname&lt;/code&gt; is down/invalid. The part about this flow that blew my mind was that the call to &lt;code&gt;SendAsync()&lt;/code&gt; will return immediately (and not delay the code in &lt;code&gt;// Do something else...&lt;/code&gt;), but the exception will still bubble up and be handled by the &lt;code&gt;catch&lt;/code&gt; block. &lt;a href=&quot;http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions&quot;&gt;This&lt;/a&gt; post has an in depth explanation of how the compiler handles this. In the post, he mentions how you can even debug and step through code like this in Visual Studio, pass over an async method and see it return immediately, step through more code, and be jarringly brought back to the thrown exception from a method that has already returned!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sending Statistics to StatsD with UdpClient in .NET</title>
   <link href="http://doingthedishes.com/2013/05/28/sending-to-statsd-with-udpclient-in-dotnet.html"/>
   <updated>2013-05-28T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2013/05/28/sending-to-statsd-with-udpclient-in-dotnet</id>
   <content type="html">&lt;p&gt;This post is just a note about a quick fix we did at work to remedy a brittle (and embarassing) dependency on StatsD. StatsD is a simple daemon that listens for and aggregates statistics sent over UDP and
can be plugged into various reporting tools and dashboards. We make a lot of calls to StatsD in our app (&lt;a href=&quot;http://codeascraft.com/2011/02/15/measure-anything-measure-everything/&quot;&gt;measure anything, measure everything&lt;/a&gt;), so any problems doing so is central to performance.&lt;/p&gt;

&lt;p&gt;One day, the our main web stack actually went down because our StatsD machine crashed and our app was inadvertently dependent on it. We rebooted the StatsD server and everything was up again, but we then immediately made it a priority to decouple our app from StatsD. &lt;/p&gt;

&lt;p&gt;The problem was in how we were using the &lt;code&gt;System.Net.Sockets.UdpClient&lt;/code&gt; class. We had a small utility wrapper class that, at its core, just used &lt;code&gt;UdpClient.Send()&lt;/code&gt; to throw packets at StatsD. At first, I just tried wrapping
the call to &lt;code&gt;Send()&lt;/code&gt; in a &lt;code&gt;try...catch&lt;/code&gt; block. When I tested this, though, I found that our app significantly slowed down. Why was this happening for something that sends UDP packets? Shouldn’t it be fire and forget? &lt;/p&gt;

&lt;p&gt;I mistakenly took this method to work asynchronously. &lt;code&gt;Send()&lt;/code&gt; actually seems to stall a bit when sending data (as it presumably establishes a connection), and even longer when it can’t reach the destination and throws an exception.&lt;/p&gt;

&lt;p&gt;To fix this, I simply switched to using the &lt;code&gt;SendAsync()&lt;/code&gt; method instead (which is new in .NET 4.5). I could have also used the older &lt;code&gt;BeginSend()&lt;/code&gt; method if the project wasn’t up to 4.5.&lt;/p&gt;

&lt;p&gt;Note that I still needed to wrap the call to &lt;code&gt;SendAync()&lt;/code&gt; in a &lt;code&gt;try...catch&lt;/code&gt; block in the (rare) case that our StatsD machine is down. More on that in my next post… &lt;strong&gt;Update 2013-05-31&lt;/strong&gt;: See &lt;a href=&quot;/2013/05/31/using-try-catch-with-aync-methods-in-dot-net-4-5.html&quot;&gt;here&lt;/a&gt; for more detail on this.&lt;/p&gt;

&lt;p&gt;In addition to not having a hard dependency on StatsD, we immediately noticed an increase in responsiveness in several central endpoints of our app as we’re now making all calls to StatsD aynchronously. Not our best moment, but we’ll take the easy wins wherever we can. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Upgrading to an SSD</title>
   <link href="http://doingthedishes.com/2011/09/19/ssd-upgrade.html"/>
   <updated>2011-09-19T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/09/19/ssd-upgrade</id>
   <content type="html">&lt;p&gt;I recently upgraded the hard drive in my laptop (a &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16822136459&quot;&gt;Western Digital Blue, 640GB&lt;/a&gt;) to an SSD (&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16820227707&quot;&gt;OCZ Vertex 3, 240GB&lt;/a&gt;). I’d heard how much an SSD improves performance, and I can now definitely vouch for this; the upgrade has been a substantial boost for my aging mid-2009 MacBook Pro (Intel Core 2 Duo 3.06GHz, 8 GB RAM).&lt;/p&gt;

&lt;p&gt;During the course of the upgrade, I did a couple before and after benchmarks.&lt;/p&gt;

&lt;h3 id=&quot;boot-times&quot;&gt;Boot Times&lt;/h3&gt;

&lt;p&gt;First, I took some very informal measurements of boot time. I routinely boot into Windows using Boot Camp for work, so I have boot times for both Windows 7 and OS X Lion.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Windows 7&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;From boot menu to desktop: 
    &lt;ul&gt;
      &lt;li&gt;Before: &lt;strong&gt;1:15&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;After: &lt;strong&gt;0:29&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;To launch Firefox
    &lt;ul&gt;
      &lt;li&gt;Before: &lt;strong&gt;2:13&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;After: &lt;strong&gt;0:40&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;OS X Lion&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;From boot menu to desktop
    &lt;ul&gt;
      &lt;li&gt;Before: &lt;strong&gt;1:12&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;After: &lt;strong&gt;0:17&lt;/strong&gt; (17 seconds!!!)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;To launching iTunes
    &lt;ul&gt;
      &lt;li&gt;Before: &lt;strong&gt;1:44&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;After: &lt;strong&gt;0:29&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;crystaldiskmark&quot;&gt;CrystalDiskMark&lt;/h3&gt;

&lt;p&gt;I also took before and after measurements using &lt;a href=&quot;http://crystalmark.info/software/CrystalDiskMark/index-e.html&quot;&gt;CrystalDiskMark&lt;/a&gt; (a disk benchmarking utility for Windows).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ssd-crystaldiskmark-before.jpg&quot; alt=&quot;CrystalDiskMark results, before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ssd-crystaldiskmark-after.jpg&quot; alt=&quot;CrystalDiskMark results, after&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;windows-experience-index&quot;&gt;Windows Experience Index&lt;/h3&gt;

&lt;p&gt;Lastly, here are the results from the Windows Experience Index utility on Windows 7.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ssd-wei-before.jpg&quot; alt=&quot;Windows Experience Index results, before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ssd-wei-after.jpg&quot; alt=&quot;Windows Experience Index results, before&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Software Engineering as Tinkering</title>
   <link href="http://doingthedishes.com/2011/09/14/tinkering.html"/>
   <updated>2011-09-14T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/09/14/tinkering</id>
   <content type="html">&lt;p&gt;I saw this fascinating graphic in an online &lt;a href=&quot;http://www.tele-task.de/archive/video/flash/14029/&quot;&gt;presentation&lt;/a&gt; called “Programming and Scaling” by Alan Kay:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tinkering.png&quot; alt=&quot;Engineering, mathematics, and science versus computer science and tinkering&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Kay used this to illustrate the role tinkering plays in mathematics, science, engineering, and also in making computer software. He uses the Empire State Building as a marvelous example of good engineering (and indeed it is; the building was completed ahead of schedule in 1 year and 45 days at a rate of over 7 floors per month), and contrasts that with how (even today) nothing this dependable can be “engineered” by the disciple of software engineering.&lt;/p&gt;

&lt;p&gt;Notice how disproportionate the tinkering circle elapses the computer software bubble. The premise is that we largely build software today by tinkering along with the related “make and fix paradigm” (which he also describes).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Custom Error Pages with ASP.NET MVC 3 and ELMAH</title>
   <link href="http://doingthedishes.com/2011/09/10/custom-errors-mvc-3-elmah.html"/>
   <updated>2011-09-10T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/09/10/custom-errors-mvc-3-elmah</id>
   <content type="html">&lt;p&gt;I was having a problem in an MVC 3 app with the &lt;code&gt;HandleErrorAttribute&lt;/code&gt; hiding exceptions from ELMAH and also clashing with the  &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt; section in the Web.config (similar to &lt;a href=&quot;http://stackoverflow.com/questions/7265193/mvc-problem-with-custom-error-pages&quot;&gt;this&lt;/a&gt; Stack Overflow question). TL;DR version: I ended up just removing the default registration of &lt;code&gt;HandleErrorAttribute&lt;/code&gt; and leaning on what’s specified in &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Some details…&lt;/p&gt;

&lt;p&gt;By default, a new MVC 3 project has a global filter registered in Global.asax that applies the &lt;code&gt;HandleErrorAttribute&lt;/code&gt; to each controller action. This attribute will essentially appy a try/catch around each controller action and render the Error.cshtml file (or .vbhtml if you’re using Razor with VB.NET, or .aspx if you’re using the WebForms view engine) in the Views/ControllerName or Views/Shared directory. A new MVC 3 project has a Error.cshtml file in the Views/Shared directory by default.&lt;/p&gt;

&lt;p&gt;If custom errors are enabled (either via the mode attribute being set to “On” or “RemoteOnly” on the &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt; element), then &lt;code&gt;HandleErrorAttribute&lt;/code&gt; will render the Error.cshtml view.&lt;/p&gt;

&lt;p&gt;My first problem was that I was using ELMAH to log errors, and exceptions would be swallowed by &lt;code&gt;HandleErrorAttribute&lt;/code&gt; and not logged in ELMAH. I saw a few posts such as &lt;a href=&quot;http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx&quot;&gt;this&lt;/a&gt; one from Scott Hanselman about making a custom attribute to handle errors and log to ELMAH, but stay with me for a few minutes more…&lt;/p&gt;

&lt;p&gt;To handle different kinds of custom errors, I removed the stock Error.cshtml from Views/Shared, made a new controller and set the following in the Web.config file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;customErrors&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;mode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;On&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;defaultRedirect=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;~/Error/ServerError&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;error&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;statusCode=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;404&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;redirect=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;~/Error/NotFound&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Other status codes here --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/customErrors&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, if an exception was thrown with &lt;code&gt;HandleErrorAttribute&lt;/code&gt; and the &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt; settings applied, I would first get another exception (logged in ELMAH):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The view ‘Error’ or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/ControllerName/Error.aspx ~/Views/ControllerName/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/ControllerName/Error.cshtml ~/Views/ControllerName/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, the app would fall back to rendering Error/ServerError as I had directed it to in &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt;. The real error was masked in ELMAH. This is because the &lt;code&gt;HandleErrorAttribute&lt;/code&gt; was looking for Shared/Error.cshtml, couldn’t find it, then threw up and fell back to what was specified in &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;(Note that 404 errors still passed through; it turns out &lt;code&gt;HandleErrorAttribute&lt;/code&gt; ignores all but 500 errors).&lt;/p&gt;

&lt;p&gt;Why did I even need to use the &lt;code&gt;HandleErrorAttribute&lt;/code&gt;? Can’t I just lean on the &lt;code&gt;&amp;lt;customErrors&amp;gt;&lt;/code&gt; section in vanilla ASP.NET? I ended up taking the attribute’s registration out of Global.asax and doing just that. Errors were then properly picked up by Elmah, and I would see friendly error messages when enabled in production.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Summoning a Professional</title>
   <link href="http://doingthedishes.com/2011/08/28/summoning-a-professional.html"/>
   <updated>2011-08-28T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/08/28/summoning-a-professional</id>
   <content type="html">&lt;p&gt;Dr. Dobb’s on the &lt;a href=&quot;http://drdobbs.com/joltawards/231500038&quot;&gt;easy dismissal&lt;/a&gt; of professional programming these days (emphasis mine):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This depreciation of our trade has roots in our trade, alas. COBOL was designed specifically to enable managers to run their own reports. The quixotic belief that non-programmers could do this is what still nourishes the BI field’s abuse of the term. This self-deception persists despite the now considerable body of evidence to the contrary. Everything is simple for the neophyte “programmer” until something unexpected happens. Then everything stops suddenly. &lt;strong&gt;Frequently, a professional programmer is summoned. If none is available, the project or report simply dies in its tracks. So ends the matter.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have a different, even bleaker, instinct and prediction for this scenario: the team pushes blindly without the aid of a “professional” and, more importantly, without the broader perspective and arsenal of techniques an experienced programmer may bring to the situation. They push on no matter what, until some crazy, hair-brained solution or workaround is found; basically, until anything that works is found.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using String.Format with Nulls</title>
   <link href="http://doingthedishes.com/2011/08/27/string-format-with-nulls.html"/>
   <updated>2011-08-27T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/08/27/string-format-with-nulls</id>
   <content type="html">&lt;p&gt;Just a quick tip from my &lt;a href=&quot;/2011/07/20/templates-nullable-types-mvc.html&quot;&gt;last post&lt;/a&gt;…&lt;/p&gt;

&lt;p&gt;Notice how I didn’t check for nulls in the code sample:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@model DateTime?
@string.Format(&quot;{0:yyyy-MM-dd}&quot;, Model)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You’d think it would be necessary to do something like so instead:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@model DateTime?
@(Model.HasValue ? Model.Value.ToString(&quot;yyyy-MM-dd&quot;) : &quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, String.Format in the .NET framework will &lt;a href=&quot;http://geekswithblogs.net/mnf/archive/2008/01/09/passing-null-parameters-to-string.format-is-safe.aspx&quot;&gt;just return an empty string&lt;/a&gt; when formatting null values. I thought this was handy, and it seems to pop up in a surprising number of cases.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Display and Editor Templates for Nullable Types in ASP.NET MVC</title>
   <link href="http://doingthedishes.com/2011/07/20/templates-nullable-types-mvc.html"/>
   <updated>2011-07-20T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/07/20/templates-nullable-types-mvc</id>
   <content type="html">&lt;p&gt;I was recently confused about how to specify a display and editor template for a nullable value type (such as &lt;code&gt;int?&lt;/code&gt;, &lt;code&gt;double?&lt;/code&gt;, and &lt;code&gt;DateTime?&lt;/code&gt;) in ASP.NET MVC, and couldn’t find much on this topic anywhere, so here’s a quick tip on how to do it.&lt;/p&gt;

&lt;p&gt;ASP.NET MVC has a feature called display and editor templates that let you specify in a central location how a given data type should be displayed. For example, if you want &lt;code&gt;DateTime&lt;/code&gt; values to be displayed in a certain format throughout your app, you can add a file called &lt;code&gt;DateTime.cshtml&lt;/code&gt; to the Views\Shared\DisplayTemplates folder (I’m using C# with the Razor view engine). When you use one of the built-in HTML helpers such as &lt;code&gt;@Html.Display()&lt;/code&gt; or &lt;code&gt;@Html.DisplayFor()&lt;/code&gt; in a view to display a DateTime, it will use the template you specified (note that the same applies for the Views\Shared\EditorTemplates folder and the &lt;code&gt;@Html.Editor()&lt;/code&gt; and &lt;code&gt;@Html.EditorFor()&lt;/code&gt; methods).&lt;/p&gt;

&lt;p&gt;So how would you specify a template for nullable &lt;code&gt;DateTime?&lt;/code&gt; Since Windows doesn’t allow the characters “?” and “&amp;lt;&amp;gt;” to be in a file name, that kills the convention of naming the file &lt;code&gt;DateTime?.cshtml&lt;/code&gt; or &lt;code&gt;Nullable&amp;lt;DateTime&amp;gt;.cshtml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It turns out that if you just specify a model type of &lt;code&gt;DateTime?&lt;/code&gt;, then a template named &lt;code&gt;DataTime.cshtml&lt;/code&gt; can cover both cases of displaying a nullable and non-nullable value type. Here’s the full contents of my display template for &lt;code&gt;DateTime?&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@model DateTime?
@string.Format(&quot;{0:yyyy-MM-dd}&quot;, Model)
&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Jason Fried on Designers and Writing</title>
   <link href="http://doingthedishes.com/2011/05/21/designers-and-writers.html"/>
   <updated>2011-05-21T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/05/21/designers-and-writers</id>
   <content type="html">&lt;p&gt;Sorry to keep posting &lt;a href=&quot;/2011/04/23/flat-company.html&quot;&gt;quotes&lt;/a&gt; by this guy, but…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We’re trying to encourage all of our designers to be great writers. To me, there is no difference between writing and design. You’re either designing a sentence or designing a screen - it’s all the same thing. I think a product that’s poorly written is not a well-designed product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Big Web Show: &lt;a href=&quot;http://5by5.tv/bigwebshow/10&quot;&gt;Episode #10&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Please, Please Back Up Your System Databases</title>
   <link href="http://doingthedishes.com/2011/05/20/backup-your-sys-dbs.html"/>
   <updated>2011-05-20T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/05/20/backup-your-sys-dbs</id>
   <content type="html">&lt;p&gt;I’m just recovering from a two-day bender of re-building our production SQL Server install at work. In hindsight (of course), it seems obvious what I should have done to prevent this, and at least I learned a couple things from this freak accident.&lt;/p&gt;

&lt;p&gt;The cause doesn’t even sound that glamorous: I installed service pack 2 for SQL Server 2008. The service pack said it installed correctly, and I rebooted the machine as instructed. When I tried to connect to the server afterwards, though, I got the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Server is in script upgrade mode. Only administrator can connect at this time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looking in the event viewer for more details, I saw this bone-chilling message:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Script level upgrade for database ‘master’ failed because upgrade step ‘sqlagent100_msdb_upgrade.sql’ encountered error 3602, state 126, severity 25. This is a serious error condition which might interfere with regular operation and the database will be taken offline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…followed by:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ouch. After seeing this and further googling and tinkering, my heart sank, and I realized we were in for an all-nighter. We couldn’t manage to restore or access the master database.&lt;/p&gt;

&lt;p&gt;The system databases in SQL Server store a bunch of metadata including login and security information, db mail settings, jobs, and (in our case) replication settings. So, while we had regular backups of our user databases being done, we had neglected to backup the system databaess and hadn’t thought through the process of rebuilding our server.&lt;/p&gt;

&lt;p&gt;The part that really stings is that we later just added a few lines (a few measly lines!!!) to the backup script to include the system databases. But, lesson learned, and plus we got to go through an instructive (though painful) process of going through and revising our disaster recovery process.&lt;/p&gt;

&lt;p&gt;Bottom line, please, please backup your system databases, and the next time I do a service pack install or other serious upgrade, I’m going to be sure to take a full backup of all user as well as system databases so that I can not only restore our data, but also our configuration.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Generic Repository</title>
   <link href="http://doingthedishes.com/2011/05/14/generic-repository.html"/>
   <updated>2011-05-14T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/05/14/generic-repository</id>
   <content type="html">&lt;p&gt;I’ve seen a few examples of repositories that are written for specific types, but I’ve been using a repository interface very similar to what is described &lt;a href=&quot;http://weblogs.asp.net/cibrax/archive/2011/05/05/we-have-iqueryable-so-why-bother-with-a-repository.aspx&quot;&gt;here&lt;/a&gt;. It’s worked out very well for me, and provides a lot of flexibility via a simple interface:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IRepository&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;IQueryable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I tweaked Pablo’s example to completely use generics (it seems he uses a concrete type on the Entities property).&lt;/p&gt;

&lt;p&gt;Here’s an implementation using Entity Framework 4 Code First:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyRepository&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IDisposable&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyDbContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyDbContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IQueryable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// Retrieves the entity from the database, then marks&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// it for deletion in the db context. Note that this&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// executes a query to retrieve the entity (if it&amp;#39;s not&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// already loaded in the context). Would be better to &lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// find a way to delete without retrieving the object first.&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entity&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;entity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SaveChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;GC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SuppressFinalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;virtual&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;disposing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disposing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Free managed resources&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;db&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dispose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Free unmanaged resources here&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(The Delete method is a little inefficient, as it seems to be a &lt;a href=&quot;http://stackoverflow.com/questions/502795/how-do-i-delete-an-object-from-an-entity-framework-model-without-first-loading-it&quot;&gt;little&lt;/a&gt; &lt;a href=&quot;http://stackoverflow.com/questions/2471433/how-to-delete-an-object-by-id-with-entity-framework&quot;&gt;difficult&lt;/a&gt; to delete without querying in Entity Framework)&lt;/p&gt;

&lt;p&gt;Here’s how it can be used inside an ASP.NET MVC 3 controller:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ActionResult&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SomeModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;());&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;[HttpPost]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;[Authorize(Roles = &amp;quot;Editor&amp;quot;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ActionResult&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SomeModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For unit testing, here’s an implementation of a mock repository (which is backed by an ArrayList):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MockRepository&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IRepository&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ArrayList&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SaveWasCalled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IQueryable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;
               &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
               &lt;span class=&quot;k&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AsQueryable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Delete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NotImplementedException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SaveWasCalled&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(I still need to figure out that Delete method using reflection… or something…)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Removing ASP.NET Membership Objects from SQL Server</title>
   <link href="http://doingthedishes.com/2011/05/08/remove-asp-membership.html"/>
   <updated>2011-05-08T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/05/08/remove-asp-membership</id>
   <content type="html">&lt;p&gt;On a recent project using ASP.NET MVC 3, I started out using the stock ASP.NET membership provider with SQL Server. I later decided that it was going to be too heavy, and went about making my own simpler membership, roles, and form services.&lt;/p&gt;

&lt;p&gt;As part of the change, I created the following script that I used in a database migration when I switched over to my new users and roles mechanism. I hope this helps someone if they need to quickly rip out the default membership provider:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/942148.js&quot;&gt; &lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Jason Fried on Running a Flat Company</title>
   <link href="http://doingthedishes.com/2011/04/23/flat-company.html"/>
   <updated>2011-04-23T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/04/23/flat-company</id>
   <content type="html">&lt;p&gt;Interesting &lt;a href=&quot;http://www.inc.com/magazine/20110401/jason-fried-why-i-run-a-flat-company.html&quot;&gt;take&lt;/a&gt; on employees inevitably progressing into management from Jason Fried of 37 Signals:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We always try to hire people who yearn to be master crafts people, that is, designers who want to be great designers, not managers of designers; developers who want to master the art of programming, not management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This kind of view would probably be hard for most companies to swallow, but it’s a compelling idea for someone like myself who’s interested in becoming the best they can be at their craft (at least for now).&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Mobile UI Influence</title>
   <link href="http://doingthedishes.com/2011/04/17/mobile-ui-influence.html"/>
   <updated>2011-04-17T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/04/17/mobile-ui-influence</id>
   <content type="html">&lt;p&gt;I noticed a couple tweets floating around today about &lt;a href=&quot;http://www.winrumors.com/microsoft-office-15-full-metro-ui-screenshot-leaks&quot;&gt;leaked images&lt;/a&gt; of UI in an upcoming version of Microsoft Outlook that mimics the Windows Phone 7 “Metro” UI style:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/office-15-outlook.jpg&quot; alt=&quot;Office 15 Outlook&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Also, keep in mind the demos of the upcoming OS X Lion that Apple’s been showing off (the Launchbar feature is shown here, which looks the same as folders on iOS):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/os-x-lion-launchpad.png&quot; alt=&quot;OS X Lion&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s interesting to see desktop OSes taking major cues from mobile UIs.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Moving to Jekyll</title>
   <link href="http://doingthedishes.com/2011/04/14/moving-to-jekyll.html"/>
   <updated>2011-04-14T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2011/04/14/moving-to-jekyll</id>
   <content type="html">&lt;p&gt;I moved this blog from BlogEngine.NET to a static site generator called &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt;. It was made by some of the smarty pants at GitHub, gives you easy and direct control over your blog’s markup, and it even allows you to host your site on GitHub (more on this later).&lt;/p&gt;

&lt;p&gt;BlogEngine.NET is backed by a database such as SQL Server and built upon the idea of dynamically generating content on each request. Static site generators work by having you write posts in plain text (in Jekyll’s case, in Markdown) and generating html files for the entire site on each update. The generator is smart enough to do things like wrap your posts in templates, insert post dates, and generate next/previous pages and links. While this might sound like a brute force method (generate the &lt;strong&gt;entire&lt;/strong&gt; site every time you write a new post???), with today’s computers it’s really not a big deal. &lt;/p&gt;

&lt;p&gt;There are some interesting side effects to using a static generator for your blog. For one, you get the benefits of high scalability inherent in the capability of web servers to serve simple html files very quickly without the added overhead and complexity of hitting a database, caching, etc. Dan and Marco had a good discussion about this on &lt;a href=&quot;http://5by5.tv/buildanalyze/18&quot;&gt;episode 18&lt;/a&gt; of the Build and Analyze podcast.&lt;/p&gt;

&lt;p&gt;I found myself not needing many of the features that modern blog engines such as WordPress, Movable Type, or (in the .NET space) SubText, dasBlog, and BlogEngine.NET offer. Not maintaining a separate database for the blog as well as an easily customizable and simple template system were also very appealing. I’ve been writing more and more in Markdown too, so this seemed like a natural way to write posts, and Jekyll supports this.&lt;/p&gt;

&lt;h1 id=&quot;importing-posts-from-blogenginenet&quot;&gt;Importing Posts from BlogEngine.NET&lt;/h1&gt;

&lt;p&gt;Jekyll has some support for &lt;a href=&quot;http://coolaj86.info/articles/migrate-from-blogger-to-jekyll.html&quot;&gt;importing from an RSS feed&lt;/a&gt;, but I didn’t get good results from this. BlogEngine.NET is capable of exporting to BlogML (which is a nice format - I wish I would have caught on), so I modified the RSS import script in Jekyll to such in my BlogML data and transform it to Jekyll’s post format.&lt;/p&gt;

&lt;h1 id=&quot;caveats&quot;&gt;Caveats&lt;/h1&gt;

&lt;p&gt;Jekyll’s not for everyone, and it’s squarely aimed at developers or at least advanced geeks. If you don’t want to set up your own blog installation, there are several good hosted blog platforms such as Tumblr, WordPress.com, and Blogger. I host my &lt;a href=&quot;http://www.nightshowerer.com/&quot;&gt;personal blog&lt;/a&gt; at Tumblr, and it’s great.&lt;/p&gt;

&lt;p&gt;For example, to write and publish a new blog entry, I write a post in Markdown, preview it locally using the Jekyll command line program (which does things like regenerating the site and starting a development web server), the commit my post and push to GitHub.&lt;/p&gt;

&lt;p&gt;Not for the faint of heart, but to me it’s comfortable and fits in with my desired workflow.&lt;/p&gt;

&lt;h1 id=&quot;hosting-at-github&quot;&gt;Hosting at GitHub&lt;/h1&gt;

&lt;p&gt;You can host your site at GitHub by storing your Jekyll repository there and using the &lt;a href=&quot;http://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; feature. You can find out more about how this is done by poking around the &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; repo on GitHub and by looking at some of the sites using Jekyll that are listed in the project’s wiki.&lt;/p&gt;

&lt;p&gt;Basically, each time you push a commit to your blog repository on GitHub, your site is regenerated and republished. It’s easy enough just to upload the files that Jekyll generates to your own server, but I find the workflow of having my blog automatically refreshed every time I make a commit very appealing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (May 8, 2011)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/dmorrison/dmorrison.github.com&quot;&gt;Here’s&lt;/a&gt; a link to this blog’s source on GitHub.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Yes, Yes. Another, Another Backup Lecture.</title>
   <link href="http://doingthedishes.com/2010/09/28/yes-yes-another-another-backup-lecture.html"/>
   <updated>2010-09-28T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/09/28/yes-yes-another-another-backup-lecture</id>
   <content type="html">&lt;p&gt;I realize there have been some &lt;a href=&quot;http://daringfireball.net/2010/03/ode_to_diskwarrior_superduper_dropbox&quot;&gt;very&lt;/a&gt; &lt;a href=&quot;http://www.43folders.com/2010/03/15/yes-another-backup-lecture&quot;&gt;popular&lt;/a&gt; web celebrities in recent memory post about backups, but here goes.&lt;/p&gt;
&lt;p&gt;Spurred on by posts like those from Gruber and Merlin Mann, I&#39;ve been working on getting backups right this year. A hard drive failure a few months ago along with a &lt;a href=&quot;http://vimeo.com/13607925&quot;&gt;fire in my apartment building&lt;/a&gt; recently also provided&lt;em&gt; &lt;/em&gt;motivation, and it looks like I&#39;ve settled on at least some kind of strategy. Maybe it&#39;s a little overkill and clumsy, and maybe I have a weird setup, but it feels redundant enough that I won&#39;t lose my (precious) home movies and personal pictures.&lt;/p&gt;
&lt;p&gt;I don&#39;t think of my setup so much as a strategy (although I have a backup plan that I follow regularly now), but rather as a hodgepodge that works for me and contains pieces that may be applicable to a lot of other people. So take away from it what you can, and I hope it helps.&lt;/p&gt;
&lt;h1&gt;Online Services&lt;/h1&gt;
&lt;p&gt;It turns out a lot of content I produce is uploaded and shared somewhere. Practically all of my pictures are hosted at Flickr (some marked as private or just for friends), my videos at Vimeo, my email to Gmail, many documents to Google Docs, etc, and I consider this a form of offsite backup.&lt;/p&gt;
&lt;p&gt;I also use Dropbox heavily. While not only serving to synchronize files on both my Windows 7 and OS X partitions, it also is a form of cloud backup. I&#39;ve come to use in in place of the user documents folder on both OSes.&lt;/p&gt;
&lt;p&gt;For code, I use version control systems (Team Foundation Server at work, and GitHub for personal projects). That, again, is redundant, as I have local copies on my laptop and another stored on a server somewhere.&lt;/p&gt;
&lt;p&gt;It could be said that you&#39;re entrusting too much to a third party,  but I just might trust Flickr with its thousands (millions?)  of users and the responsibility that goes along with maintaining a  datacenter to host all of this content reliably than I do my own backup  practices.&lt;/p&gt;
&lt;p&gt;However, I certainly do local backups, but it&#39;s interesting to note the impact of modern &quot;cloud computing&quot; services (whatever that means to you) on data redundancy.&lt;/p&gt;
&lt;h1&gt;My Setup&lt;/h1&gt;
&lt;p&gt;Even though I&#39;m an ASP.NET developer, I develop on a MacBook Pro running Windows 7 on Boot Camp during the day (Macs are... pretty). In the off hours at home, I boot into OS X Snow Leopard where all my media lives in iTunes, Aperture, iMovie, etc. So, I have two environments to back up: Windows 7 and Snow Leopard.&lt;/p&gt;
&lt;p&gt;I also have a Windows Home Server device (an &lt;a href=&quot;http://amzn.com/B001OI2ZG4&quot;&gt;HP EX485 Mediasmart&lt;/a&gt;), which I use for backups and network storage. The device has redundant storage spread across several discs, but I want to back it up too (in case the machine fails and for offsite backups). Make that three environments.&lt;/p&gt;
&lt;h1&gt;Backup Tools&lt;br /&gt;&lt;/h1&gt;
&lt;p&gt;Here are the tools I use:&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Windows Home Server (WHS)&lt;/li&gt;
&lt;li&gt;WHS&#39;s included backup software for Windows 7&lt;/li&gt;
&lt;li&gt;OS X&#39;s Time Machine (which can use WHS as a backup drive via software included with the HP WHS device)&lt;/li&gt;
&lt;li&gt;SuperDuper!&lt;/li&gt;
&lt;li&gt;WinClone&lt;/li&gt;
&lt;li&gt;Two external laptop hard drives&lt;/li&gt;
&lt;li&gt;Two external desktop drives with lots of space&lt;/li&gt;
&lt;li&gt;An extra 1 or 2 external drives for juggling files or images around in case of an emergency&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1&gt;Process&lt;/h1&gt;
&lt;p&gt;My setup is a little tricky because I spend time booted into two different OSes. This can make it difficult to reliably schedule backup jobs (e.g. if I work in the evening and stay booted into Windows 7, then Time Machine or SuperDuper&#39;s nightly backup won&#39;t run on the OS X side). While not foolproof, I&#39;ve found I get enough coverage so that I shouldn&#39;t lose more than, at worst, a week&#39;s worth of data on my hard drive.&lt;/p&gt;
&lt;p&gt;If I&#39;m in Windows 7 at home for an extended period of time, Windows Home Server will automatically back up the Windows partition every night at midnight, or I can explicitly trigger a backup.&lt;/p&gt;
&lt;p&gt;When in OS X (where I am most of the time at home), Time Machine backs up to WHS frequently (I think it&#39;s every hour or so). Since Time Machine takes snapshots of files and allows you to view file history, I&#39;m able to recover deleted or accientally overwritten files within a certain window (&lt;a href=&quot;http://www.infrageeks.com/groups/infrageeks/wiki/b32ae/&quot;&gt;Recovery Point Objective vs Recovery Time Objective&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I also make an image of the OS X partition regularly using SuperDuper! and one of the external laptop drives. If my laptop&#39;s hard drive completely fails, I can get my computer back up in the time it takes me to take the old hard drive out of my laptop and replace it with the new one containing the image. The SuperDuper! image isn&#39;t taken as regularly as Time Machine backups, but I can more quickly get my machine up from a failed drive than with Time Machine restoration process.&lt;/p&gt;
&lt;p&gt;To image the Windows 7 partition from OS X, I use WinClone. I take weekly snapshots, and store them on a separate partition of the laptop drive.&lt;/p&gt;
&lt;p&gt;I use Windows Home Server&#39;s included backup utility to archive files to one of the large desktop drives every week.&lt;/p&gt;
&lt;p&gt;For offsite backups, I rotate both the laptop and desktop drives every few weeks and store a set of drives in my office at work.&lt;/p&gt;
&lt;h1&gt;Remember Your Discs&lt;/h1&gt;
&lt;p&gt;If you need to troubleshoot your system or do a restoration, it&#39;s important to have your installation media. Both the Windows 7 and OS X discs include diagnostic utilities that you can use on boot. You should also have the discs for restoring with Time Machine (on the OS X disc) or with Windows Home Server (on the included WHS media).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Top Versus Left-Aligned Labels</title>
   <link href="http://doingthedishes.com/2010/09/01/top-versus-left-aligned-labels.html"/>
   <updated>2010-09-01T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/09/01/top-versus-left-aligned-labels</id>
   <content type="html">&lt;p&gt;While working on a new web app at work, I&#39;ve been flip flopping between two designs for forms: using top-aligned or left-aligned labels. While this was on my mind, a Hacker News entry appeared for an article claiming top-aligned labels are easier for users to scan and require less eye movement.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/form-labels.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The article cautions that designs with top-aligned labels take up more vertical space. Users are fairly comfortable with scrolling vertically in web pages, though, and forms can be split up into separate pages if they become too unruly.&lt;/p&gt;
&lt;p&gt;This makes sense anecdotally, but it would be nice if the article gave citations for studies backing the claim up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://uxmovement.com/design-articles/faster-with-top-aligned-labels&quot;&gt;UX Movement - Why Users Fill Out Forms Faster With Top Aligned Labels&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PowerShell Script to Clean Up Downloads Folder</title>
   <link href="http://doingthedishes.com/2010/09/01/powershell-script-to-clean-up-downloads-folder.html"/>
   <updated>2010-09-01T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/09/01/powershell-script-to-clean-up-downloads-folder</id>
   <content type="html">&lt;p&gt;Here&#39;s a simple PowerShell script to delete files and folders older than 1 month from my Downloads folder:&lt;/p&gt;
&lt;pre class=&quot;brush: powershell&quot;&gt;ls ~\Downloads | where {($_.LastWriteTime).AddMonths(1) -lt (get-date)} | remove-item -force -recurse&lt;/pre&gt;
&lt;p&gt;The script deletes items older than 1 month as-is, but this can be adjusted by changing the call to &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;AddMonths&lt;/span&gt; appropriately (there are &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ff730960.aspx&quot;&gt;other methods&lt;/a&gt; on the date object such as &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;AddDays&lt;/span&gt;, &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;AddHours&lt;/span&gt;, &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;AddMinutes&lt;/span&gt;, etc).&lt;/p&gt;
&lt;p&gt;The script calls &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;ls&lt;/span&gt; (alias for &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;Get-ChildItem&lt;/span&gt;) on my Downloads folder. The output is piped to a &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;where&lt;/span&gt; clause that filters on the &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;LastWriteTime&lt;/span&gt; property of the current object or &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;$_&lt;/span&gt; (pipline variable). One month is added to &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;LastWriteTime&lt;/span&gt;, and if it&#39;s less than (&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;-lt&lt;/span&gt;) the current date then it&#39;s piped to &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;remove-item&lt;/span&gt; (which has aliases of &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;rm&lt;/span&gt; and &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;rmdir&lt;/span&gt;) where the file/directory is forcefully removed without prompt and contents in directories is recursively deleted.&lt;/p&gt;
&lt;p&gt;This can be called manually every now and then or can be scheduled with Windows task scheduler.&lt;/p&gt;
&lt;p&gt;Although this can be done using the &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;forfiles&lt;/span&gt; command in the normal Windows command prompt, I had trouble deleting folders using it and PowerShell is more flexible overall.&lt;/p&gt;
&lt;p&gt;Surprisingly, this was hard to find after a little Googling around. It seems to be that way with PowerShell samples, and I hope that&#39;s just because it&#39;s still relatively new.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Quote from Luke Wroblewski</title>
   <link href="http://doingthedishes.com/2010/08/19/a-quote-from-luke-wroblewski.html"/>
   <updated>2010-08-19T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/08/19/a-quote-from-luke-wroblewski</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;There&#39;s nothing wrong with writing down specifications, but I would say write them down once you&#39;ve actually worked through some of the issues - that&#39;s the fundamental problem. If you can work through some of the issues with Keynote, great. If you can work through some of the issues with a lightweight HTML and JavaScript prototype, great. If you can do that on paper, more power to you.&lt;/p&gt;
&lt;p&gt;Until you can actually do that, you&#39;re pulling things out of thin air and it&#39;s going to lead to a lot of re-doing and iteration anyway, so you might as well get that iteration done up front.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
&lt;a href=&quot;http://5by5.tv/conversation/28&quot;&gt;The Conversation - Episode 28: Designing with Keynote?&lt;/a&gt;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SSIS Package Storage</title>
   <link href="http://doingthedishes.com/2010/08/02/ssis-package-storage.html"/>
   <updated>2010-08-02T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/08/02/ssis-package-storage</id>
   <content type="html">&lt;p&gt;At work recently, we had a little confusion about where SQL Server Integration Services (SSIS) packages should be stored on our database server, and we ended up having multiple copies of packages littered around the server. To me, the dialogs for dealing with SSIS packages seem a little confusing (as does SSIS in general, but that&#39;s another topic).&lt;/p&gt;
&lt;p&gt;We use SQL Server 2008, so I&#39;m not sure if there are slight differences between this and 2005 / 2008 R2.&lt;/p&gt;
&lt;h1&gt;Basics&lt;br /&gt;&lt;/h1&gt;
&lt;p&gt;After SSIS packages are developed (using Visual Studio Business Intelligence Development Studio - BIDS), they are deployed to a production environment in SQL Server. Within SQL Server, packages can be stored in two places: &quot;File System&quot; and &quot;MSDB&quot;. Shown below is a screen shot showing this in SQL Server Management Studio (SSMS) connected to Integration Services.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/integration-services-tree.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When you connect to Integration Services with SSMS then right-click and select Import Package on the MSDB tree node under Stored Packages, it stores the package in the MSDB system database (of course).&lt;br /&gt;&lt;br /&gt;When you right-click and select Import Package on the File System node under Stored Packages, you&#39;re able to select a .dtsx file in a dialog. It seems when you do this (or at least it did to us), that SQL Server will reference the file in the location that you specified. Actually, it copies it to a special directory that SQL Server manages (&quot;C:\Program Files\Microsoft SQL Server\100\DTS\Packages&quot; in our case).&lt;br /&gt;&lt;br /&gt;We had our own directory on the database server that we agreed to store SSIS packages in. When we stored the package files there, then went through the import process for the File System option, we ended up having two copies (one in our directory, one in SQL Server&#39;s).&lt;/p&gt;
&lt;p&gt;Another confusing point was the dialog itself when right-clicking and selecting Import Package on either the MSDB or File System nodes. It gives a choice of three locations to import from: SQL Server, File System, and SSIS Package Store. When you select SQL Server, you&#39;re given a choice to import items just under the MSDB node. When you select File System, you&#39;re can choose a .dtsx file that&#39;s on your hard drive (not in the File System node of the same name under Stored Packages). When you select SSIS Package Store, you&#39;re given a choice of anything under the Stored Packages node (including items under the MSDB node which you see when you select the SQL Server source - giving you two ways to access the same package).&lt;/p&gt;
&lt;p&gt;Although confusing, it seems this dialog is designed to be flexible enough for you to import packages stored not only locally on disk, but also stored on a different SQL Server either in that server&#39;s MSDB or File System store.&lt;/p&gt;
&lt;h1&gt;Where Should Packages be Stored?&lt;/h1&gt;
&lt;p&gt;Bear in mind that packages can just be stored on disk outside of SSMS and the file referenced directly from a SQL Agent job (where the package will commonly be triggered). This probably doesn&#39;t give you the flexibility or management that is intended with SSIS, though, as you can&#39;t see the list of all SSIS packages from within SSMS, you can fire a package directly from within SSMS if it&#39;s stored there, etc.&lt;br /&gt;&lt;br /&gt;Packages can be imported using the File System target and SQL Server can manage the files in its special directory, but this puts the package physically outside of database and it won&#39;t be backed up along with the database.&lt;br /&gt;&lt;br /&gt;What we ended up settling on is storing our packages in MSDB. Several Google results recommended this for ease of management and backups (if you backup MSDB, then all the packages are backed up too).&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A Quote from 37signals</title>
   <link href="http://doingthedishes.com/2010/07/03/a-quote-from-37signals.html"/>
   <updated>2010-07-03T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/07/03/a-quote-from-37signals</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;...then, if you cut down one or two more words, the sentence has gone from being clear to being really, really brief. Sometimes, people - I think programmers do this quite a bit -&amp;nbsp;mix up the idea of being concise and compressed with being clear. ... Brevity and clarity are two different things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://37signals.com/podcast/#episode16&quot;&gt;37signals Podcast Episode #16: Design roundtable&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SharePoint List Adapters for SSIS</title>
   <link href="http://doingthedishes.com/2010/05/25/sharepoint-list-adapters-for-ssis.html"/>
   <updated>2010-05-25T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2010/05/25/sharepoint-list-adapters-for-ssis</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update - August 2, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Support for specifying credentials in addition to using integrated  security was rolled into the main package. Currently, it&#39;s in beta, and  it can be downloaded from &lt;a href=&quot;http://sqlsrvintegrationsrv.codeplex.com/releases/view/17652&quot;&gt;here&lt;/a&gt; (named &quot;BetaSharePointListAdaptersSetup.msi&quot; under &quot;Other Available Downloads&quot;).&lt;/p&gt;
&lt;p&gt;My project is unneeded now, and will probably be deleted from Codeplex soon.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;On a project at work recently, we needed to create a report using SharePoint list data. We decided to use SQL Server Integration Services (SSIS), and looked at using &lt;a href=&quot;http://sqlsrvintegrationsrv.codeplex.com/releases/view/17652&quot;&gt;these&lt;/a&gt; SharePoint list source and destination adapters on CodePlex.&amp;nbsp;However, these sample adapters &lt;a href=&quot;http://sqlsrvintegrationsrv.codeplex.com/Thread/View.aspx?ThreadId=56119&quot;&gt;only supported Windows integrated authentication&lt;/a&gt;, so I modified them to accept basic authentication.&lt;/p&gt;
&lt;p&gt;I&#39;ve created a &lt;a href=&quot;http://sharepoint4ssis.codeplex.com/&quot;&gt;project on CodePlex&lt;/a&gt; for these modified source and destination adapters, and also put together a simple release with the pre-built assemblies and simple instructions.&lt;/p&gt;
&lt;p&gt;I hope this helps someone who has a similar problem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Reflections on StackOverflow DevDays Amstersdam</title>
   <link href="http://doingthedishes.com/2009/11/12/reflections-on-stackoverflow-devdays-amstersdam.html"/>
   <updated>2009-11-12T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/11/12/reflections-on-stackoverflow-devdays-amstersdam</id>
   <content type="html">&lt;p&gt;
I went to Amsterdam for the one-day &lt;a href=&quot;http://stackoverflow.carsonified.com/events/amsterdam/&quot;&gt;DevDays&lt;/a&gt; conference put on by the guys behind &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;Stack Overflow&lt;/a&gt;. While the creators of Stack Overflow are proponents of ASP.NET and the site itself is built on a Microsoft stack (ASP.NET, SQL Server, etc), the Stack Overflow is billed as language-agnostic. As such, the conference was meant to be &amp;quot;a sample platter for web developers&amp;quot;. That being said, the conference wasn&amp;#39;t afraid to toot its own horn, and detailed several of (rapidly expanding it seems) Stack Overflow properties such as Stack Overflow, Stack Exchange, Stack Overflow Careers, and even Fog Creek&amp;#39;s (Joel Spolsky&amp;#39;s company) main product, Fogbugz.
&lt;/p&gt;
&lt;p&gt;
And so, the sessions: 
&lt;/p&gt;
&lt;h2&gt;Keynote&lt;/h2&gt;
&lt;h3&gt;
Joel Spolsky, Fog Creek Software&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
This was my favorite session of the day. It kicked off  with a cheeky and geeky, but a bit lenghty intro video filmed at the Fog Creek office where Joel shows how he, despite all of his promotion over the years of good developer working conditions and proper respect for developers, really manages his &lt;strike&gt;peons&lt;/strike&gt; employees. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Choices&lt;/strong&gt;. Users are faced with, every day, a staggering amount of choices from software. Over abundant and illogical dialog boxes and prompts bombard us. More choices can be demotivating. In a study conducted at a supermarket, two tables were set up with samplers, one with 10 kinds of jam, and one with 2. The results indicated that, while more samplers attracted more people, the table with only 2 kinds of jam actually outsold the other table significantly. Every time you have an option is a dialog box, you&amp;#39;re asking someone to make a decision (this is generally a bad thing).
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;. There&amp;#39;s a trend in software (especially from Web 2.0
companies) towards simplicity, but software shouldn&amp;#39;t just be simple,
it should also be powerful. This is where elegant design and
programming comes in. Why did this idea of simplicity so popular in modern, trendy software? One reason is the number of startups with limited staff and resources. Is this taken too far? Maybe. Just google bug trackers and see how many of them advertise &amp;quot;simplicity&amp;quot;. In Joel&amp;#39;s experience, features added elegantly (with gracy, economy, strength, and modesty) generate more sales. Think about what motivates people and don&amp;#39;t think your code is so important. Elegance actually takes more work (not only in UI development, but also in coding).
&lt;/p&gt;
&lt;h2&gt;jQuery&lt;/h2&gt;
&lt;h3&gt;
Jorn Zaeffer, jQuery&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
jQuery. You might&amp;#39;ve heard of it. It&amp;#39;s big. So says Zaeffer (jQuery team memebrr and UI main developer). Thirty-five percent of sites using JavaScript use jQuery.
&lt;br /&gt;
Who uses jQuery? 35% of sites using JavaScript use jQuery. This talk was a fairly simple introduction to jQuery for those who might be interested.&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Qt&lt;/h2&gt;
&lt;h3&gt;
Eroe Bragge, Nokia&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
Ah, the worst session in my opinion and the one that got the worst backlash on the conference&amp;#39;s live Twitter hashtag (I started feeling sorry after awhile reading these tweets).
&lt;/p&gt;
&lt;p&gt;
Sounds great: write an application once and run it on Windows, Mac, Linux, and even phones running Nokia&amp;#39;s Symbian OS. Except that this is too reminiscent of Java&amp;#39;s failed promise and the demo is unexciting and tedious. Cough... cough... iPhone UI is better... cough... cough... &lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Fogbugz 7&lt;br /&gt;
&lt;/h2&gt;
&lt;h3&gt;Spolsky&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
The product looks fantastic, and I wish my company would pay to use this issue tracker. Estimates based on actual team member estimating and actual delivery dates (something they call Evidence-Based Scheduling), burndown charts, integration with a Mercurial-based version control system (&amp;quot;Kiln&amp;quot;), code review capabilities, oh my! 
&lt;/p&gt;
&lt;p&gt;
But, is it too much self-promotion?&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Python&lt;br /&gt;
&lt;/h2&gt;
&lt;h3&gt;Simon Willlison, Co-Creator of Django&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
Holy smokes what a great live-coding demo! What skill, what flare, what Python! Willison demonstrated an application from a real-world use case at The Guardian in which he sucked in data from a feed of H1N1 flu statistics and infused this with a SVG vector graphics file to create a heat map of infections for various countries. As well as being an interesting demonstration of a compelling and flashy application, it was fascinating to see first-hand how a proficient Python and web developer works.&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Google App Engine
&lt;/h2&gt;
&lt;h3&gt;Nick Johnson, Google&lt;/h3&gt;
&lt;p&gt;
It must have been tough following Willison&amp;#39;s impressive demo, but Johnson carried on nicely. He created a humorous knock-off application of Stack Overflow using Google App Engine, and, although the app itself was fairly simplistic, it still served as a sucessfull accessory to discuss some of Google App Engine&amp;#39;s features.
&lt;/p&gt;
&lt;p&gt;
What features, you say? Built-in memcache, mail, scheduled tasks, an extensive admin console with statistics, logging, XMPP support, and integration with Google Accounts.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Yahoo Developer Tools
&lt;/h2&gt;
&lt;h3&gt;Christian Heilman, Yahoo&lt;br /&gt;
&lt;/h3&gt;
&lt;p&gt;
Yahoo really wants you to create mash-ups using their JavaScript library (YUI), web services, and something called Yahoo Query Language (YQL). Using an SQL-like syntax, YQL allows you query over various data feeds (provided stock by Yahoo or with a customizable source). Heilman has even crafted his &lt;a href=&quot;http://icant.co.uk/&quot;&gt;homepage&lt;/a&gt; to be entirely composed of data brought in by YQL.
&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;ASP.NET MVC
&lt;/h2&gt;
&lt;h3&gt;Alex Thiessen&lt;/h3&gt;
&lt;p&gt;
Oh ASP, why can&amp;#39;t you attract hip, passionate figures such as Willison and Heilman. As an ASP.NET developer (who has a great interest in and respect for ASP.NET MVC), I wanted this to be a compelling talk. In spite of it being well-presented, however, I came away feeling that the Microsoft ASP.NET team had &lt;strike&gt;copied&lt;/strike&gt; been inspired by more progressive frameworks (especially after hearing talks using Python, Django, and YQL mashups). 
&lt;/p&gt;
&lt;p&gt;
Some truth to this? Sure. But I also believe in ASP.NET MVC and think it&amp;#39;s a great direction for ASP. Things must be taken in perspective, and in the world of Microsoft web development, ASP.NET MVC is one of the most exciting frameworks to arise in years.&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;
Various Overheard Quotes&amp;nbsp;
&lt;/h2&gt;
&lt;p&gt;
The problem with quick and dirty ... is that the dirty remains long after the quick has been forgotten. -Steve McConnell
&lt;/p&gt;
&lt;p&gt;
Every day that we spent not improving our products was a day wasted. -Joel Spolsky 
&lt;/p&gt;
&lt;p&gt;
Python is definitely what all the cool kids are using. -Joel Spolsky
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Running IE8 and IE7 Seamlessly on Windows 7 with Virtual PC and XP Mode</title>
   <link href="http://doingthedishes.com/2009/08/31/running-ie8-and-ie7-seamlessly-on-windows-7-with-virtual-pc-and-xp-mode.html"/>
   <updated>2009-08-31T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/08/31/running-ie8-and-ie7-seamlessly-on-windows-7-with-virtual-pc-and-xp-mode</id>
   <content type="html">&lt;p&gt;I often need to test against Internet Explorer 7 while developing, and while there are &lt;a href=&quot;http://blog.case.edu/jeremy.smith/2008/03/06/running_ie6_ie7_and_ie8&quot;&gt;several hacks&lt;/a&gt; to run IE7 alongside IE8, I&amp;#39;ve settled on using a virtual machine instance of Windows XP (such as the &lt;a href=&quot;http://www.microsoft.com/Downloads/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef&amp;amp;displaylang=en&quot;&gt;temporary ones&lt;/a&gt; provided by Microsoft).&lt;/p&gt;&lt;p&gt;Today, I tried running the release candidates of &lt;a href=&quot;http://www.microsoft.com/windows/virtual-pc/download.aspx&quot;&gt;Virtual PC and XP Mode&lt;/a&gt; for Windows 7 to more seamlessly accomplish the same thing. Here&amp;#39;s a screencast of it in action.&lt;/p&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot; width=&quot;560&quot; height=&quot;345&quot;&gt;	&lt;param name=&quot;width&quot; value=&quot;560&quot; /&gt;	&lt;param name=&quot;height&quot; value=&quot;345&quot; /&gt;	&lt;param name=&quot;flashvars&quot; value=&quot;i=8828&quot; /&gt;	&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;	&lt;param name=&quot;src&quot; value=&quot;http://screenr.com/Content/assets/screenr_0817090731.swf&quot; /&gt;	&lt;embed type=&quot;application/x-shockwave-flash&quot; width=&quot;560&quot; height=&quot;345&quot; flashvars=&quot;i=8828&quot; allowfullscreen=&quot;true&quot; src=&quot;http://screenr.com/Content/assets/screenr_0817090731.swf&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;After running the Virtual PC then XP Mode installers, you can either run a windowed XP virtual machine (just as e.g. Virtual PC 2007 allows), or you can add application shortcuts to the all users programs folder of the start menu inside the virtual machine and they&amp;#39;ll appear in the host&amp;#39;s start menu. Then, these applications run similar to a regular application (ala VMware Fusion for the Mac).&lt;/p&gt;&lt;p&gt;In the screencast, I show launching IE7, but this can be used for other applications as well.&amp;nbsp;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Converting An ASP.NET Web Forms Project To ASP.NET MVC</title>
   <link href="http://doingthedishes.com/2009/06/15/converting-an-aspnet-web-forms-project-to-aspnet-mvc.html"/>
   <updated>2009-06-15T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/06/15/converting-an-aspnet-web-forms-project-to-aspnet-mvc</id>
   <content type="html">&lt;p&gt;Continuing with my last post about the differences between Web Site projects and Web Application projects in ASP.NET, this post details how I converted a legacy ASP.NET Web Site project to an ASP.NET MVC project (a variant of a Web Application project).&lt;/p&gt;
&lt;h4&gt;Getting Started&amp;hellip; ASP.NET MVC?&lt;/h4&gt;
&lt;p&gt;I originally intended to only convert the project to a web application. I ran into a couple scenarios during development in which I wanted the capabilities that a Web Application project offers over a Web Site. See my &lt;a href=&quot;/post/ASPNET-Web-Sites-Versus-Web-Applications.aspx&quot;&gt;previous post&lt;/a&gt; for some of these differences.&lt;/p&gt;
&lt;p&gt;However, when I started looking into the conversion process, I decided to jump ahead and convert to the ASP.NET MVC framework.&lt;/p&gt;
&lt;p&gt;Why jump to ASP.NET MVC? I had been keeping an eye on the development of the ASP.NET team&amp;rsquo;s MVC framework (an alternative to the existing ASP.NET Web Forms model) and liked the direction it was headed. I had experimented with Ruby on Rails (probably the most well-known web MVC framework), and liked the clean separation of concerns, more natural model of web development (as opposed to the leaky abstractions of ASP.NET Web Forms), etc.&lt;/p&gt;
&lt;p&gt;I knew it wasn&amp;rsquo;t realistic to convert all pages in the existing project to new MVC ones. However, since it&amp;rsquo;s possible to run regular Web Forms inside of MVC projects, this seemed like a good compromise to preserve legacy code while using the MVC paradigm for future work. The MVC project type is a specialized version of a Web Application Project, and current Web Forms page, even in an MVC project, can still be processed as usual since the underlying ASP.NET engine is the same for Web Forms and MVC applications.&lt;/p&gt;
&lt;h4&gt;Steps and Caveats&lt;/h4&gt;
&lt;p&gt;I began by installing the ASP.NET MVC installer, which installs the MVC library DLLs into the GAC as well as the ASP.NET MVC Visual Studio project types and templates, and creating a new ASP.NET MVC project. I then started copying files from the old to the new project.&lt;/p&gt;
&lt;p&gt;There&#39;s a decent walkthrough &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb907624.aspx&quot;&gt;here&lt;/a&gt; (the guide is for Web Application projects, but it was close to what I needed). Still, I was greeted with over 5,000 build errors after following the official directions and trying to build the project for the first time. I found I needed to take things slower and at a more granular level, transferring a few files at a time to the new project and evaluating the differences one by one.&lt;/p&gt;
&lt;p&gt;I transferred several settings from the web site&amp;rsquo;s web.config appSettings section to settings in the Visual Studio project settings file (right click on project &amp;ndash;&amp;gt; Properties &amp;ndash;&amp;gt; Settings). This more closely follows the standard way of managing settings using Visual Studio project files, and also performs code generation to create strongly-typed properties automatically. These settings are still stored in the web.config file (so they can be changed while the web application is running), but they&amp;rsquo;re stored under a slightly different schema for project file properties.&lt;/p&gt;
&lt;p&gt;The mechanisms for references to web services is different in Web Application projects versus Web Sites, but this is fairly straightforward as I just re-added all my references (although this might take time if you have many references).&lt;/p&gt;
&lt;p&gt;I love ReSharper, but I had to shush it during the conversion process to avoid being nagged to death by premature warnings and code analysis.&lt;/p&gt;
&lt;p&gt;Something to keep in mind is that the automatically generated designer files for Web Application project aspx pages are automatically re-generated when aspx files are saved. This means that when you adjust the namespace in the aspx file (e.g. with an Inherits=&quot;C4IFACT.App.WebForms.ExecutionPlans&quot; attribute on the Page directive) then it is reflected in the designer file. I was getting many perturbing error messages about incorrect namespaces that were resolved by this (since the aspx page and designer files can temporarily get out of sync at times).&lt;/p&gt;
&lt;p&gt;While there is some level of security from static typing and having your project &quot;compiled&quot; into a DLL, you should remember that an ASP.NET project has a DLL for all of the plain C# code supporting the application, but the aspx pages are not compiled when a project is built, but instead reference types in the project&amp;rsquo;s assembly and are executed by the ASP.NET runtime when a page is visited. This means that you might still have compile errors in aspx files that won&amp;rsquo;t be reflected in the build. To help this, you can flip a switch on your MVC project to trigger the ASP.NET compiler to compile ASP.NET markup and code inside aspx pages on project compile (see &lt;a href=&quot;http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc&quot;&gt;here&lt;/a&gt; for directions on doing this &amp;ndash; it even works against Web Forms pages if you have some mixed in with your MVC project). However, this affects the performance of building the MVC project significantly.&lt;/p&gt;
&lt;h4&gt;Organization and Folder Structure&lt;/h4&gt;
&lt;p&gt;While trying to respect the default conventions of ASP.NET MVC, I also looked at Rob Conery&#39;s &lt;a href=&quot;http://blog.wekeroad.com/blog/my-mvc-starter-template/&quot;&gt;enhanced version&lt;/a&gt; and also the Rails &lt;a href=&quot;http://www.tutorialspoint.com/ruby-on-rails/rails-directory-structure.htm&quot;&gt;folder structure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While creating my folder structure, I thought about re-structuring parts of the old app and creating clean namespaces. I settled on this:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; title=&quot;MVC Folder Structure&quot; src=&quot;/images/mvc-folder-structure.png&quot; border=&quot;0&quot; alt=&quot;MVC Folder Structure&quot; width=&quot;156&quot; height=&quot;342&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The App folder contains most executable content (following the Rails convention). MVC controllers and views are here. &lt;/li&gt;
&lt;li&gt;The App\Helpers folder contains former App_Code files and miscellaneous utility classes. &lt;/li&gt;
&lt;li&gt;I have a separate project in the solution containing data access code and models, so I don&amp;rsquo;t have a strict folder for models. However, I have a ViewModels folder, where model classes tailored specifically for presenting view logic or data binding are. &lt;/li&gt;
&lt;li&gt;Master Pages and User Controls (Partials) are under Views\Shared. &lt;/li&gt;
&lt;li&gt;I wanted to put my Web Forms into the Views folder (even though they aren&#39;t true Views), but there seems to be a hard setting in ASP routing that doesn&#39;t serve anything from the Views folder, so I placed them into a separate WebForms folder. I could have also routed Web Forms pages to friendler URLs (using the routing portion of the MVC framework), but for now I kept things simple and used the physical location (e.g. &amp;ldquo;MyPage.aspx&amp;rdquo; is accessed at &amp;ldquo;www.mysite.com/app/webforms/mypage.aspx&amp;rdquo;). &lt;/li&gt;
&lt;li&gt;The Assemblies folder contains third-party, referenced assemblies (those not contained in the GAC). Note that things under here should be referenced in the project, but should also be set to Content and not be copied to the project&#39;s build output location so that they won&#39;t be included with the project output as content (although they will be included as necessary along with the project&#39;s built DLL in the published folder). &lt;/li&gt;
&lt;li&gt;The Public contains static content divided into Images, Stylesheets, and JavaScripts folders. &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;CodeFile Versus CodeBehind&lt;/h4&gt;
&lt;p&gt;One last point - Web Site project &quot;CodeFile&quot; directives should be &quot;CodeBehind&quot; in Web Application / MVC projects. I found a great tip in the comments from &lt;a href=&quot;http://aspadvice.com/blogs/ssmith/archive/2007/01/24/CodeFile-or-CodeBehind.aspx&quot;&gt;this&lt;/a&gt; post about possible confusion that can result when converting from Web Site to Web Application projects. Here&#39;s an excerpt from the comment:&lt;/p&gt;
&lt;blockquote&gt;The issue with CodeFile is that the code is compiled into its own (or directory level assembly) and so the type may not be available to another page unless the control is @Registered. If you dynamically load you pretty much can&#39;t reference the ASCX codebehind class. With WAP everything goes into a single assembly so you can reference the codebehind class from just about anywhere... The thing is that if you forget to set the proper format for WAP code the page/control will still work because ASP.NET internally doesn&#39;t care whether a project is stock or WAP so the page/control runs just fine with CodeFile.&lt;/blockquote&gt;
&lt;p&gt;This hit upon a frustrating problem I ran into: my user controls were being compiled into their own separate assembly because I left them using the CodeFile attribute, so when I tried to import the user control (with its custom server tag) globally via the web.config (as &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2006/11/26/tip-trick-how-to-register-user-controls-and-custom-controls-in-web-config.aspx&quot;&gt;this&lt;/a&gt; tip suggests) and I just referred to what I thought was the correct namespace I had problems because &lt;strong&gt;the user control was being compiled automagically into a separate assembly where CodeFiles are compiled&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &quot;Convert to Web Application&quot; context menu for aspx pages is supposed to handle this for you and change CodeFile directives to CodeBehind, but I had issues with several pages where this didn&#39;t work and I didn&#39;t realize it for awhile. Even still, this action doesn&#39;t handle namespaces for you and still accepts the Web Site-style &quot;Folder1_Folder2_ClassName&quot; unique name approach instead of conventional .Net class library &quot;Folder1.Folder2.ClassName&quot; namespaces (how I preferred things). Basically, adjusting namespaces properly ending up involving a lot of manual work, as simply copying files and clicking &quot;Convert to Web Application&quot; doesn&#39;t adjust namespaces properly even if you put the files in the conventional folders.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ASP.NET Web Sites Vs Web Applications</title>
   <link href="http://doingthedishes.com/2009/06/12/aspnet-web-sites-versus-web-applications.html"/>
   <updated>2009-06-12T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/06/12/aspnet-web-sites-versus-web-applications</id>
   <content type="html">&lt;p&gt;There are, confusingly, two basic types of Visual Studio projects for developing web apps with ASP.NET: &lt;strong&gt;Web Sites&lt;/strong&gt; (File &amp;ndash;&amp;gt; New &amp;ndash;&amp;gt; Web Site), and &lt;strong&gt;Web Applications&lt;/strong&gt; (File &amp;ndash;&amp;gt; New &amp;ndash;&amp;gt; Project &amp;ndash;&amp;gt; Web Application). I recently converted a legacy Web Site to a Web Application (and actually, to an ASP.NET MVC Web Application &amp;ndash; there&amp;rsquo;ll be more on the conversion to the MVC framework in the next post), and ran up against several differences between the two during the process. First, a little history&amp;hellip;&lt;/p&gt;
&lt;h2&gt;Lineage&lt;/h2&gt;
&lt;p&gt;Visual Studio .NET 2002 and 2003 both shipped with versions of ASP.NET projects that were of the Web Application variety: ASP.NET web apps were housed in Visual Studio projects similar to other project types (such as Windows Forms apps or class libraries). Upon each change, the project had to be rebuilt for the resulting web application to reflect changes. This was an unnatural model for web developers used to simple HTML or dynamic languages such as PHP and Perl (where you have a running site, make a change to some code, then simply refresh a page and have changes appear).&lt;/p&gt;
&lt;p&gt;In Visual Studio 2005, a new default type of ASP.NET project called Web Sites was introduced. This, through behind the scenes magic, allowed ASP.NET web apps to be created that were simply loose directories with code and aspx files (there was no Visual Studio project file that everything had to be associated with) that could be loosely edited and would be compiled at first page hit and dynamically refreshed as changes were made to the running web site. This followed a seemingly more natural model for web development, but got further away from normal model of application development with Visual Studio. There was some backlash from the community, and an add-on was later released for VS 2005 that allowed developers to use the older Web Application project type.&lt;/p&gt;
&lt;p&gt;When Visual Studio 2008 was released, it supported both the Web Site and Web Application models out of the box, developers being able to choose the style they preferred (although I doubt if this choice was a clear one for most developers).&lt;/p&gt;
&lt;p&gt;Until recently, both of these project types used the ASP.NET WebForms model. However, with the recent 1.0 release of the ASP.NET MVC Framework, there is yet another way to do ASP.NET (although, basically, MVC projects are Web Application projects).&lt;/p&gt;
&lt;h2&gt;Differences&lt;/h2&gt;
&lt;p&gt;Why did I do the conversion? Because, for my specific case, the features of the Web Application model better suited my project than those of the Web Site model.&lt;/p&gt;
&lt;p&gt;Here is a list of the major differences I came up against:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Applications can properly use conditional compilation constants (having them change based on build configurations). &lt;/li&gt;
&lt;li&gt;References are more tightly controlled with Web Applications (like normal VS projects). With web sites, it&#39;s a little indirect. Assemblies can be added to the Bin folder where they&#39;re automatically referenced by the site, or they can be referenced in the web.config file (for assemblies stored globally on a computer in the GAC). &lt;/li&gt;
&lt;li&gt;Since Web Application project files are proper MSBuild files, build actions can be done (pre- and post-build, etc). &lt;/li&gt;
&lt;li&gt;With Web Applications, namespaces can be more properly managed. With Web Sites, all compiled class code (not code behind files directly paired with a page), must be stored in a special &quot;App_Code&quot; folder. So, following the convention of storing classes in folders corresponding to their namespaces, these would have to be under an &quot;App_Code.Blah...&quot; namespace). &lt;/li&gt;
&lt;li&gt;Pages in web applications must have a &quot;designer&quot; file associated with them (e.g. &amp;ldquo;MyPage.aspx.designer.cs&amp;rdquo; for a C# web app). This is a partial class where the server controls in ASP.NET markup are declared in auto-generated code (all ASP server controls correspond to .NET objects). Here are Scott Guthrie&#39;s comments from his good &lt;a href=&quot;http://webproject.scottgu.com/CSharp/Migration2/Migration2.aspx&quot;&gt;walk-through&lt;/a&gt; (Rick Strahl also has a good description &lt;a href=&quot;http://west-wind.com/WebLog/posts/5378.aspx&quot;&gt;here&lt;/a&gt; and a re-visit to it &lt;a href=&quot;http://west-wind.com/weblog/posts/533644.aspx&quot;&gt;here&lt;/a&gt;):       
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;One difference between a VS 2005 Web Site Project and a VS 2005 Web Application Project is that the VS 2005 Web Site Project Model dynamically generates the tool-generated partial class half of a page, and does not persist it on disk. The VS 2005 Web Application Project model on the other-hand does save this partial class on disk within files that have a .designer.cs extension and compiles it using the in-memory VS compilers when a build occurs (one benefit of this is faster build times).&amp;ldquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A strongly-typed profile object is automatically generated with the Web Site project type, but requires a special add-in to Visual Studio when using web applications (available &lt;a href=&quot;http://code.msdn.microsoft.com/WebProfileBuilder&quot;&gt;here&lt;/a&gt;) for some reason. Alternatively, you can not use the strongly typed object and get values dynamically at runtime with magic strings. &lt;/li&gt;
&lt;li&gt;Web Site project &quot;CodeFile&quot; directives are &quot;CodeBehind&quot; in Web Application projects. These directives control how aspx pages are compiled. The CodeFile directive can still be used in Web Application projects, but are not compiled correctly. There&amp;rsquo;s a great tip in the comments on &lt;a href=&quot;http://aspadvice.com/blogs/ssmith/archive/2007/01/24/CodeFile-or-CodeBehind.aspx&quot;&gt;this&lt;/a&gt; post about possible confusion that can result when converting from a Web Site to Web Application project. Here&#39;s an excerpt from the comment:       
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;The issue with CodeFile is that the code is compiled into its own (or directory level assembly) and so the type may not be available to another page unless the control is @Registered. If you dynamically load you pretty much can&#39;t reference the ASCX codebehind class. With WAP everything goes into a single assembly so you can reference the codebehind class from just about anywhere... The thing is that if you forget to set the proper format for WAP code the page/control will still work because ASP.NET internally doesn&#39;t care whether a project is stock or WAP so the page/control runs just fine with CodeFile.&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web Applications have a strongly-typed app settings section in the web.config corresponding (and automatically updating with code-gen) to the Visual Studio Project settings. &lt;/li&gt;
&lt;li&gt;When you compile a Web Application, it compiles the code behind files so that if a change is made to a running web app&#39;s code behind file it must be re-compiled (however, if you make a change to the aspx file of even a Web Application, then it still auto updates with an explicit re-compile &amp;ndash; honestly, I&#39;m confused about this part). With a Web Site, however, it will detect the change and re-compile no matter what. &lt;/li&gt;
&lt;li&gt;You must recompile a Web Application almost each time you make changes to it. This sounds worse than it is. The build is generally fast for me, as Visual Studio does a good job of keeping track of what has already been built and what really needs to be rebuilt. Also, you can &quot;build&quot; a Web Site project type from within Visual Studio, but really this is only doing a dry run of the build to catch possible compilation errors in the manner that the ASP.NET runtime does when a Web Site is visited. &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>JavaScript Coding Guidelines for ASP.NET</title>
   <link href="http://doingthedishes.com/2009/05/30/javascript-coding-guidelines-for-aspnet.html"/>
   <updated>2009-05-30T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/05/30/javascript-coding-guidelines-for-aspnet</id>
   <content type="html">&lt;p&gt;
Recently for work as part of our sporadic push to create coding standards, I contributed by writing a draft of our JavaScript coding guidelines document. I&amp;#39;ve probably been the most active developer at work JavaScript and Ajax, and this combined with me having recently finished Douglas Crockford&amp;#39;s excellent &lt;a href=&quot;http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742&quot;&gt;Javascript: The Good Parts&lt;/a&gt; book made me the most likely candidate to do so. &lt;a rel=&quot;enclosure&quot; href=&quot;/files/JavaScript-Coding-Guidelines.doc&quot;&gt;Here&lt;/a&gt; is what I came up with.
&lt;/p&gt;
&lt;p&gt;
The document is written from an ASP.NET developer&amp;#39;s perspective, and since the direction for JavaScript that Microsoft is pushing now is a mix of its own ASP.NET Ajax library and jQuery, those are the libraries I focused on. Also, I didn&amp;#39;t write much into strict coding standards per se (i.e. variables should be named and cased this and this way...), but instead focused on general guidance for the JavaScript language and some key best practices.
&lt;/p&gt;
&lt;p&gt;
Here are several resources I used to come up with the standards (these are also in the references section at the end of the document):
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;a href=&quot;http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742&quot;&gt;JavaScript: The Good Parts&lt;/a&gt;, by Douglas Crockford. &lt;/li&gt;
	&lt;li&gt;A lecture related to the book (and which contains a large portion of the book&amp;#39;s content for free) can be found &lt;a href=&quot;http://video.yahoo.com/watch/630959/2974197&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://javascript.crockford.com/code.html&quot;&gt;Code Conventions for the JavaScript Programming Language&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Block_Statement&quot;&gt;Block Statement&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/&quot;&gt;With Statement Considered Harmful&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.west-wind.com/weblog/posts/259442.aspx&quot;&gt;WestWind Ajax Toolkit&lt;/a&gt;.
	&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Four Rules</title>
   <link href="http://doingthedishes.com/2009/05/18/four-rules.html"/>
   <updated>2009-05-18T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/05/18/four-rules</id>
   <content type="html">&lt;p&gt;
...for software project management. I heard these on a &lt;a href=&quot;http://www.dotnetrocks.com/default.aspx?showNum=438&quot;&gt;recent episode&lt;/a&gt; of .NET Rocks titled &amp;quot;Pat Hynds On Why Projects Fail&amp;quot; (skip to around the 13:00 minute mark - are the intros long enough on this show or what??).
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt; - if you&amp;#39;re not paranoid earlier, you&amp;#39;re going to be unhappy later.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Never Assume&lt;/strong&gt; - always make sure requirements are clear between you and the customer.&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Don&amp;#39;t Be Wishful&lt;/strong&gt;
	- a project is not done until after the coding is done and lots of
	other things happen. When asked if a project is done, you should be
	able to definitively say &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot; (without any &amp;quot;Yes... but....&amp;quot;
	responses). You must confirm with the customer that the project is done.&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;No Spec, No Estimate&lt;/strong&gt;
	- many people want a fixed-bid price when they give a time and
	materials spec. Make sure that a detailed spec is given by the client.
	Include what will &lt;u&gt;not&lt;/u&gt; be done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Ruby and Rake with ASP.NET</title>
   <link href="http://doingthedishes.com/2009/03/31/using-ruby-and-rake-with-aspnet.html"/>
   <updated>2009-03-31T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/03/31/using-ruby-and-rake-with-aspnet</id>
   <content type="html">&lt;p&gt;
For awhile now at work, I&amp;#39;ve been using a loose collection of &lt;a href=&quot;http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx&quot;&gt;PowerShell&lt;/a&gt; scripts and manual steps to handle deployment of ASP.NET sites and associated SQL Server databases. I recently switched to using a &lt;a href=&quot;http://rake.rubyforge.org/&quot;&gt;Rake&lt;/a&gt; build script to not only automate deployment, but also to help in a few other tasks such as re-building the development database, and synchronizing the staging database with the production db. 
&lt;/p&gt;
&lt;p&gt;
Briefly, Rake is a Ruby version of Make, and is a framework for build scripts written in Ruby. Since a Rakefile (the main build file you work with) uses a plain Ruby syntax (albeit one that uses a few Rake conventions), it&amp;#39;s very easy to get up to speed with if you know a little Ruby, and even if you don&amp;#39;t, Ruby&amp;#39;s syntax has a reputation for being fairly straightforward anyway. Rake also has many built-in library functions for handling builds and uses a &lt;a href=&quot;http://martinfowler.com/articles/rake.html#DependencyBasedProgramming&quot;&gt;dependency-based computational model&lt;/a&gt;. For example, I can specify that task A depends on task B and be sure that task B is always called before task A: 
&lt;/p&gt;
&lt;font size=&quot;2&quot;&gt;
&lt;pre&gt;
task :a =&amp;gt; :b do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; puts &amp;quot;World&amp;quot; 
end 
task :b do
&amp;nbsp;&amp;nbsp;&amp;nbsp; puts &amp;quot;Hello &amp;quot; 
end
&lt;/pre&gt;
&lt;/font&gt;
&lt;p&gt;
Rake is normally used in the Ruby world (such as for working with Ruby on Rails sites), but is generic enough to be usable with other setups such as .NET. Why did I switch to Rake? I tried, I really tried to like and use PowerShell. PowerShell is Microsoft&amp;#39;s newer command line environment and scripting language. It&amp;#39;s a definite improvement over the normal Windows command prompt, as it offers a greatly enhanced command set and direct interoperability with the .NET framework. PowerShell, as well as a light development environment for PowerShell scripts, are tentatively set to be included in Windows 7. 
&lt;/p&gt;
&lt;p&gt;
However, I was put off by PowerShell&amp;#39;s syntax, which uses a blend of curly braces, mixed case keywords, dollar signs,&amp;nbsp; and unconventional operators e.g. the less than or equal to operator in: 
&lt;/p&gt;
&lt;font size=&quot;2&quot;&gt;for ( $i = 7; $i -le 84; $i+=7 ) { $i }&lt;/font&gt; 
&lt;p&gt;
Also, since PowerShell is relatively new, there seems to be poor support for it. Editing support is not included with Visual Studio and it&amp;#39;s not natively supported (with syntax highlighting, etc) in common free text editors such as Notepad++. Also, while you can write individual PowerShell scripts and tie them together yourself, there&amp;#39;s not a robust framework such as Rake made specifically for builds (although there is the &lt;a href=&quot;http://codebetter.com/blogs/james.kovacs/archive/2008/06/27/introducing-psake.aspx&quot;&gt;psake&lt;/a&gt; upstart). Ruby and Rake, on the other hand, are much more mature and established. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
To deploy, the central steps that &lt;a href=&quot;/files/Rakefile.rb&quot;&gt;my Rakefile&lt;/a&gt; does are: 
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Take in an argument specifying whether to target the staging or production server. &lt;/li&gt;
	&lt;li&gt;Deploy the database 
	&lt;ol&gt;
		&lt;li&gt;If deploying to the staging server, synchronize the schema from the production server (using RedGate&amp;#39;s excellent schema comparison and synchronization &lt;a href=&quot;http://www.red-gate.com/products/SQL_Compare/index.htm&quot;&gt;tool&lt;/a&gt;). &lt;/li&gt;
		&lt;li&gt;If deploying to the staging server, synchronize the data from the production server (using &lt;a href=&quot;http://www.red-gate.com/products/SQL_Data_Compare/index.htm&quot;&gt;another&lt;/a&gt; RedGate tool). This and the step before insures that the staging server has a db that&amp;#39;s a mirror of production. &lt;/li&gt;
		&lt;li&gt;Run migrations to get the db up to the latest version. &lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
	&lt;li&gt;Deploy the site 
	&lt;ol&gt;
		&lt;li&gt;Compile the Visual Studio web site solution. &lt;/li&gt;
		&lt;li&gt;Copy the site files to the staging or production server (using the free &lt;a href=&quot;http://en.wikipedia.org/wiki/Robocopy&quot;&gt;Robycopy&lt;/a&gt; tool). &lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I should run the unit tests as a part of the deployment task, but since the project is fairly small, I&amp;#39;ve been running them independently before deploying. I have a task set up for the unit tests, so I could fairly easily plug this in later. 
&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s a task that recreates the test database on a developer&amp;#39;s local system, and it actually still calls out to an older PowerShell script that I haven&amp;#39;t bothered converting yet (but having Rake and PowerShell interact is fairly seamless at the moment). 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;/files/Rakefile.rb&quot;&gt;Here&amp;#39;s my Rakefile&lt;/a&gt;. The steps outlined above should be recognizable in the script, but please leave a comment if you have a question about anything in particular in it or any suggestions as well. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Upgrading My Home Theater PC</title>
   <link href="http://doingthedishes.com/2009/02/12/upgrading-my-home-theater-pc.html"/>
   <updated>2009-02-12T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/02/12/upgrading-my-home-theater-pc</id>
   <content type="html">&lt;p&gt;I recently turned on the TV to see &lt;a href=&quot;/post/Home-Theater-PC-Experiences.aspx&quot;&gt;my home theater PC&lt;/a&gt; frozen and a nasty buzzing sound coming from the speakers. Long story short, eventually I figured that my motherboard had gone bad (and not surprisingly too, as the system was my old main computer that I built almost 6 years ago and had an AMD Athlon XP single-core processor, etc). I can’t say I wasn’t expecting this sometime.&lt;/p&gt;  &lt;p&gt;The &lt;a href=&quot;http://www.flickr.com/photos/derekmorrison/sets/72157603323827778/&quot;&gt;skeleton of the system&lt;/a&gt; is still fairly modern, and the case looks good in the living room alongside the receiver, so I figured I could try to replace the guts. Since this computer is mainly used for playing video from a shared media folder or streamed from the web, I didn&#39;t need the most up-to-date hardware, and I wanted to find a motherboard with a lot of capabilities onboard that was fairly inexpensive. Additionally, I wanted the system to be quiet and low-power, as the old system, while not terribly annoying, was a little louder than most electronics you find in a living room.&lt;/p&gt;  &lt;p&gt;Luckily for me, Coding Horror had &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001107.html&quot;&gt;a great piece&lt;/a&gt; on building something very similar to what I wanted that was posted last April. The hardware I went with was slightly updated from what Jeff used, but essentially the same: &lt;/p&gt;  &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;478&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;CPU&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;332&quot;&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16819103255&quot;&gt;AMD Athlon X2 4850e 2.5GHz Dual Core (45w)&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;42&quot;&gt;$60&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;Motherboard&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;332&quot;&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16813128341&quot;&gt;GIGABYTE GA-MA78GPM-DS2H&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;42&quot;&gt;$100&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;RAM&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;332&quot;&gt;&lt;a href=&quot;http://www.mushkin.com/doc/products/memory_detail.asp?id=373&quot;&gt;2 x 1 GB Mushkin DDR2 800 Mhz EM2-6400&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;42&quot;&gt;$10&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;Blu-ray Drive&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;332&quot;&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16827136133&quot;&gt;LG 6X Blu-ray DVD±R DVD Burner&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;42&quot;&gt;$115&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;* I used my existing parts for the remainder.&lt;/p&gt;  &lt;p&gt;The &lt;a href=&quot;http://www.gigabyte.com.tw/Products/Motherboard/Products_Spec.aspx?ClassValue=Motherboard&amp;amp;ProductID=2859&amp;amp;ProductName=GA-MA78GPM-DS2H&quot;&gt;specs&lt;/a&gt; and &lt;a href=&quot;http://www.techreport.com/articles.x/14261/9&quot;&gt;reviews&lt;/a&gt; of the motherboard surprised me; I read it was capable of decoding Blu-ray video very smoothly with its miniscule (by today’s standards) 128 MB of on-board video memory. This being said, and even though bare Blu-ray drives are &lt;a href=&quot;http://www.newegg.com/Store/SubCategory.aspx?SubCategory=598&amp;amp;name=Blu-Ray-Drives&quot;&gt;numerous&lt;/a&gt;, they’ve come down in price, and Netflix has a growing catalog of Blu-ray discs, I still think getting a Blu-ray drive may have been unnecessary, but I caved in to the appeal of the bright and shiny.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/images/htpc-mobo-ports.jpg&quot;&gt;&lt;img title=&quot;20090131-185830-IMGP2757&quot; style=&quot;border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;337&quot; alt=&quot;20090131-185830-IMGP2757&quot; src=&quot;/images/htpc-mobo-ports.jpg&quot; width=&quot;504&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ports!&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Also, the processor is a fairly powerful dual-core one yet only uses 45W of power. Given this, the stock heat-sink and fan that’s included with the processor is supposed to suffice while being fairly quiet. The CPU’s fan speeds up as the processor temperature rises, and in my testing I never heard it kick into a higher gear.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/images/htpc-inside-case.jpg&quot;&gt;&lt;img title=&quot;20090207-130342-IMGP2759&quot; style=&quot;border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;337&quot; alt=&quot;20090207-130342-IMGP2759&quot; src=&quot;/images/htpc-inside-case.jpg&quot; width=&quot;504&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Putting it all together in the Antec HTPC case&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Resolution&lt;/h3&gt;  &lt;p&gt;The biggest problem I ran into was getting the proper resolution driven to the TV. The TV (a 46” Sony LCD), is capable of displaying up to 1920x1080 (1080p), and my old system would show this resolution in Windows for me to select. For some reason, the new system and video card would only let me select up to 1600x1200 using a VGA cable, and, after experimenting with different drivers, an HDMI cable (which would display the desired resolution but looked fuzzy), and ATI’s Catalyst display software, I eventually settled on using &lt;a href=&quot;http://entechtaiwan.com/util/ps.shtm&quot;&gt;PowerStrip&lt;/a&gt; to force 1920x1080 through the VGA cable. The results are good, and the picture is comparable in sharpness to a computer monitor.&lt;/p&gt;  &lt;h3&gt;Testing&lt;/h3&gt;  &lt;p&gt;I tested playing several HD &lt;a href=&quot;http://www.microsoft.com/windows/windowsmedia/musicandvideo/hdvideo/contentshowcase.aspx&quot;&gt;1080p sample videos&lt;/a&gt; with good results. In informal testing, overall CPU utilization stayed around 40-50% when playing full screen 1920x1080 video.&lt;/p&gt;  &lt;p&gt;I added Blu-ray access to my Netflix account (for an additional $1), and got my first Blu-ray disc in today (Burn After Reading). I needed to use PowerDVD to play the film (included with the drive), but the video was beautifully smooth.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/images/htpc-in-action.jpg&quot;&gt;&lt;img title=&quot;20090212-195856-IMGP2766&quot; style=&quot;border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;337&quot; alt=&quot;20090212-195856-IMGP2766&quot; src=&quot;/images/htpc-in-action.jpg&quot; width=&quot;504&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;The finished setup (receiver on the left, PC on the right)&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Windows 7 and Windows Media Center&lt;/h3&gt;  &lt;p&gt;I also did all of this testing using Windows 7 Beta 64-bit edition, and I didn’t experience any major stumbling blocks. Where applicable, I chose the Vista 64 version of software, and only encountered a few glitches (such as preferences not taking effect immediately or general UI bugs). &lt;/p&gt;  &lt;p&gt;Windows 7 Beta Ultimate edition includes Windows Media Center, and I tested using it to access shared video on my home network and some internet TV “channels” that are set up by default in the app, but since I don’t have cable TV and and don’t use Windows Media Center as a Tivo, I could manage (as I’ve been doing), by picking shared network video files from Windows explorer or by watching content on ABC.com, Hulu, etc.&lt;/p&gt;  &lt;h3&gt;Boxee&lt;/h3&gt;  &lt;p&gt;I also tried the alpha version of Boxee for Windows, but the display was distorted badly when the program started and it was unusable (driver? Windows 7 incompatibility?). I’ll have to see if there’s a workaround for this and look out for a beta version of it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Back To School</title>
   <link href="http://doingthedishes.com/2009/01/20/back-to-school.html"/>
   <updated>2009-01-20T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2009/01/20/back-to-school</id>
   <content type="html">&lt;p&gt;I was &lt;a href=&quot;/post/Academic-Versus-Real-World-Development.aspx&quot;&gt;a little put off&lt;/a&gt; by the last graduate class on formal methods that I took a little over a year ago. I got frustrated, and decided to quit with the idea that I would pursue a focused, independent course of study relevant to my career (meaning I would experiment with and study new technologies in my spare time). I know what’s better for me than the out of touch instructors at a university, right?&lt;/p&gt;  &lt;p&gt;Last week, I started a class at Auburn again (towards a Master of Software Engineering degree). A couple reasons come to mind:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I don’t have the discipline to direct myself on any outside of work study that’s remotely close to the level of work that is required of you from a university course. It’s far too easy for me to just spend an hour going through my RSS reader on development blogs and call that learning than it is for me to struggle with working on something in depth in my spare time. I hope I can get better at this someday.&lt;/li&gt;    &lt;li&gt;I’m over half-way through my master’s degree course requirements, and it would be nice to complete it.&lt;/li&gt;    &lt;li&gt;Although I don’t get a feeling that master’s degrees are a necessity for even advanced software engineering positions, I still think the degree will help me in my career.&lt;/li&gt;    &lt;li&gt;Work can be monotonous, and it would be good to get my neurons firing in different ways.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can make up seemingly reasonable excuses about why you shouldn&#39;t do something challenging, but even if that something is not 100% on target or good for you, if it&#39;s in some part beneficial, then when you look back at it you&#39;re probably not going to regret it.&lt;/p&gt;  &lt;p&gt;My current class is on web development using Java Server Pages. While JSP is by far not the hippest buzzword in the web development world, I’m still excited about learning something different. &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iPhone Duel - Evernote Vs Notes</title>
   <link href="http://doingthedishes.com/2008/11/19/iphone-duel-evernote-vs-notes.html"/>
   <updated>2008-11-19T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/11/19/iphone-duel-evernote-vs-notes</id>
   <content type="html">About a week after switching from the stock iPhone Notes app to Evernote, I&#39;m moving back to Notes.   &lt;br /&gt;  &lt;br /&gt;The feature list for Evernote is seemingly impressive. You can enter notes on their site, from a Windows or Mac desktop application, from email, or from a Windows Mobile or iPhone application. Content is stored on Evernote&#39;s servers and synchronized with all your devices. As the &lt;a title=&quot;intro video&quot; href=&quot;http://www.youtube.com/watch?v=i_ncr1Ee9e8&quot;&gt;intro video&lt;/a&gt; on &lt;a href=&quot;http://www.evernote.com/&quot;&gt;their site&lt;/a&gt; shows, you can highlight content on web pages and use the desktop client to easily send something to your Evernote account. Using the iPhone client, I was given the option of creating notes by entering text, taking a picture with the phone&#39;s camera, or even by capturing a voice message.   &lt;br /&gt;  &lt;br /&gt;For me, however, the way I mainly want to use it is to simply jot down something fairly short when an idea hits me so that I can later go through my notes and process it. I can do the same with the phone&#39;s built-in camera and photo management app, and I already use &lt;a id=&quot;umax&quot; title=&quot;Jott&quot; href=&quot;http://jott.com/default.aspx&quot;&gt;Jott&lt;/a&gt; for capturing and transcribing voice notes.   &lt;br /&gt;  &lt;br /&gt;Still, I decided to try something more advanced than the stock notes app and give Evernote a whirl.   &lt;br /&gt;  &lt;br /&gt;I can really understand &lt;a href=&quot;http://daringfireball.net/2008/11/iphone_likeness&quot;&gt;this&lt;/a&gt; Daring Fireball post on iPhone-Likeness now (scroll down to where the Notes app is discussed). It&#39;s as if the Evernote iPhone app is trying to be too clever, and in doing so, fails at following iPhone UI conventions and loses the simplicity that made using the Notes app useful. There were just too many fields and too many tabs to fidget with, and I felt the app was getting in the way of writing my thoughts down. The Notes app, by comparison, is beautifully designed and fun to work with (important for an app that you&#39;re going to be using on a regular basis).   &lt;br /&gt;  &lt;br /&gt;Also, Evernote&#39;s syncing service was ok, but there was misleading lag at times (I lost a couple of notes when I accidentally shut down the app before it had a chance to save and sync notes, and unsynchronized content would appear momentarily before changing), and I like the simple mental model of having things be in one place that I can depend on. And, after going through years of duplicated or missing contacts and calendar events using Outlook, Exchange, and even a trial of MobileMe, I&#39;m still nervous about syncing.   &lt;br /&gt;  &lt;br /&gt;For sure there are some perceived cons to Notes: there&#39;s no cut and paste (the same for all iPhone apps), notes can only be sorted one way, the &amp;quot;loading&amp;quot; screen is misleading and annoying, and there&#39;s no dedicated way of syncing notes to your desktop. But actually, these haven&#39;t bothered me and, for the way I use it, there are adequate workarounds. It&#39;s hard to believe, but I honestly don&#39;t miss having cut and paste, the sorting I just deal with, and if I have a long enough note that I want to get out of the phone, I can just email it to myself (but maybe these are symptoms of Apple Stockholm syndrome).   &lt;br /&gt;  &lt;br /&gt;But that&#39;s probably enough time devoted to a little note-taking app for now...
</content>
 </entry>
 
 <entry>
   <title>A Problem Unit Testing with .NET Private Accessors</title>
   <link href="http://doingthedishes.com/2008/10/11/a-problem-unit-testing-with-net-private-accessors.html"/>
   <updated>2008-10-11T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/10/11/a-problem-unit-testing-with-net-private-accessors</id>
   <content type="html">&lt;p&gt;Recently I ran into a problem using .NET accessor methods to unit test private methods. I was able to resolve the problem, but in doing so ended up abandoning accessor methods in favor of a simpler approach (using reflection). &lt;/p&gt;  &lt;h3&gt;But should you even test private methods?&lt;/h3&gt; It&#39;s a nuanced question. On one hand, it seems reasonable to break a class into small, purposeful private methods (exposing the main points of the class publicly) but still test the smallest possible chunks of functionality by testing those private methods in addition to the public ones. On the other, testing only public methods should exercise those private methods enough, and testing private methods can make your test code more brittle to change. There&#39;s a good table &lt;a href=&quot;http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx&quot;&gt;here&lt;/a&gt; with more arguing points.   &lt;p&gt;For my purposes, I decided that I should.&lt;/p&gt;  &lt;h3&gt;What&#39;s a private accessor method?&lt;/h3&gt;  &lt;p&gt;But how do you get at privates? The default .NET unit test suite (MSTest) provides a seemingly handy facility within Visual Studio to easily do this by generating so called &amp;quot;private accessors&amp;quot;.&amp;#160; &lt;/p&gt;  &lt;p&gt;Just right click on a private method in your code like so&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://docs.google.com/File?id=dhj8dxgf_208cv3r43f2_b&quot; /&gt;&lt;/p&gt;  &lt;p&gt;then click &amp;quot;Create Private Accessor&amp;quot; and point it to a project containing your test code. and the tool magically provides proxy types (with the suffix &amp;quot;_Accessor&amp;quot;) that expose these private methods publicly and that you can use from within your unit tests to access these private members like this:&lt;/p&gt;  &lt;code&gt; var myObject = new MyClass_Accessor();&lt;br /&gt; var result = myObject.PrivateMethod(); &lt;/code&gt;  &lt;p&gt;How useful, right?&lt;/p&gt;  &lt;h3&gt;A problem&lt;/h3&gt;  &lt;p&gt;I ran into trouble when I had a private method that returned a generic list of private classes. When I generated an accessor for the method, an accessor for the private class was also generated so that the accessor method actually returned a list of &amp;quot;MyPrivateClass_Accessor&amp;quot; types instead of &amp;quot;MyPrivateClass&amp;quot; types.&lt;/p&gt;  &lt;p&gt;This generated code actually gives an error, and &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/6ee0766f-329a-464f-a526-f89accca4f07/&quot;&gt;seems&lt;/a&gt; to be a bug in Visual Studio 2008. MyPrivateClass_Accessor derives from MyPrivateClass, and while you can cast a derived class to its base class, in .NET you can&#39;t cast a list of derived classes to a list of its base classes (as I assume it&#39;s doing internally in the generated code).&lt;/p&gt;  &lt;p&gt;I suppose they&#39;re working to fix this.&lt;/p&gt;  &lt;h3&gt;A simpler alternative&lt;/h3&gt;  &lt;p&gt;Using a bit of code (good samples are available &lt;a href=&quot;http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://melgrubb.spaces.live.com/blog/cns!A44BB98A805C8996!235.entry&quot;&gt;here&lt;/a&gt;) that uses reflection and extension methods, you can still fairly easily test these methods like so:&lt;/p&gt;  &lt;code&gt; var myObject = new MyClass();&lt;br /&gt; var result = (List&amp;lt;MyPrivateClass&amp;gt;) myObject.CallMethod(&amp;quot;PrivateMethod&amp;quot;); &lt;/code&gt;  &lt;p&gt;Sure, there&#39;s extra casting work and you have to use nasty string literals for the method names, but this is test code after all, and if it breaks you should know quickly from a regular test run.&lt;/p&gt;  &lt;h3&gt;A lesson&lt;/h3&gt; One of the hazards, it seems, working with Microsoft tools is the strong focus on tooling itself. This can sometimes get in the way of more elegant solutions based on simpler principles.   &lt;p&gt;Not that all or most of the tools are bad (a lot of them I feel make me more productive), but it&#39;s a glamorous trap that you should be aware of.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DevLink Conference - Day 2 Notes</title>
   <link href="http://doingthedishes.com/2008/10/07/devlink-conference-day-2-notes.html"/>
   <updated>2008-10-07T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/10/07/devlink-conference-day-2-notes</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;/images/dev-link-logo-2008.jpg&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;68&quot; alt=&quot;devLink2008Sponsors&quot; src=&quot;/images/dev-link-logo-2008.jpg&quot; width=&quot;228&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The session that made the biggest impression on me from Day 2 was an informal, impromptu talk that was arranged during lunch to demonstrate Test Driven Development (TDD). The premise was that several presenters or prominent developers from the conference were to start a simple, greenfield sample project and use TDD to write code from requirements.&lt;/p&gt;  &lt;p&gt;The results were striking (and not in a good way).&lt;/p&gt;  &lt;p&gt;The leaders took suggestions from the audience about what kind of app should be developed and simple requirements were gathered. As several volunteer developers took turns typing, there were arguments over difficulties with the environment, over naming guidelines, over Visual Studio add-ins, over testing frameworks, and over code templates. Some of the typists experienced with TDD jumped ahead of the general audience, writing code that they were accustomed to writing without properly explaining themselves. There were arguments from the audience that some of the code was being written without first writing tests and therefore was in violation of TDD.&lt;/p&gt;  &lt;p&gt;All in all, it was eye opening for me (having little experience with Test Driven Development) to see several proponents of TDD fall apart in this simple demonstration.&lt;/p&gt;  &lt;p&gt;Of course it was not a properly prepared talk. It did not have a focused vision, and there was a lot of informal distracting chatter between the audience and the group of people directing the talk. However, it was still discouraging to be denied the chance of seeing a cohesive demonstration of a practice I&#39;ve heard quite a lot about.&lt;/p&gt;  &lt;hr /&gt;  &lt;h2&gt;Day 2&lt;/h2&gt;  &lt;h3&gt;Web Testing&lt;/h3&gt;  &lt;h4&gt;McWherther&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;TestDriven.Net &lt;/li&gt;    &lt;li&gt;MbUnit row tests (like data driven tests in MSTest). &lt;/li&gt;    &lt;li&gt;The very precise .NET Stopwatch class used to performance test (dataset loading, etc). &lt;/li&gt;    &lt;li&gt;Test for 0, 1... N. If things work with 0 and 1, and some N, then they should work for other values (but watch out for large values). &lt;/li&gt;    &lt;li&gt;May need to run integration, web, slower tests at night because you want tests to run very quickly. &lt;/li&gt;    &lt;li&gt;Even if your unit tests are hitting the db, that&#39;s still ok and at least you&#39;re doing testing. &lt;/li&gt;    &lt;li&gt;Don&#39;t show me pictures of and talk about your dog - I don&#39;t care. &lt;/li&gt;    &lt;li&gt;Very expensive. Visual Studio Team System (AKA &amp;quot;Left Kidney&amp;quot;) Edition is $5000 for single developer. &lt;/li&gt;    &lt;li&gt;Web tests, recorder tool &lt;/li&gt;    &lt;li&gt;Load testing. Mercury tool, other load testing tools? &lt;/li&gt;    &lt;li&gt;Test 56k connections for time outs, don&#39;t assume everyone has broadband. &lt;/li&gt;    &lt;li&gt;Fiddler. Using to inspect payloads. &lt;/li&gt;    &lt;li&gt;FireBug has some performance measuring tools, but it&#39;s not as comprehensive as Fiddler. &lt;/li&gt;    &lt;li&gt;Watin (Ruby&#39; Watir for .Net). &lt;/li&gt;    &lt;li&gt;Watin test recorder. Updates fixed Ajax issues. &lt;/li&gt;    &lt;li&gt;Setting up Cassini for testing. &lt;/li&gt;    &lt;li&gt;Wcat (in resource kit for iis 6). &lt;/li&gt;    &lt;li&gt;Go command line. It&#39;ll be cheaper and more powerful. &lt;/li&gt;    &lt;li&gt;Profiling. Ants profiler. &lt;/li&gt;    &lt;li&gt;Web testing, load testing, profiling. Understanding these things seems to be concentrated on more maybe, but there could even be more sessions done with it. &lt;/li&gt;    &lt;li&gt;DotTrace. &lt;/li&gt;    &lt;li&gt;It&#39;s good hearing about the various tools, but doesn&#39;t seem to be enough real-world experience behind it. &lt;/li&gt;    &lt;li&gt;TDD by example, Kent Beck &lt;/li&gt;    &lt;li&gt;Pragmatic Unit Test with C# and NUnit &lt;/li&gt;    &lt;li&gt;Behavior Driven Development talk: Tinyurl.com/Mx4p2 &lt;/li&gt;    &lt;li&gt;They keep saying to sneak practices into organizations, as if managers will suddenly notice that code is better and ask &amp;quot;Wow, things are great! What did you change?&amp;quot;. &lt;/li&gt;    &lt;li&gt;I&#39;m getting fatigue from youthful enthusiasm. &lt;/li&gt;    &lt;li&gt;SiteWalker. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Open Spaces - SOA&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Kickoff, how to get enterprise to adopt SOA from existing communications code in place &lt;/li&gt;    &lt;li&gt;Flex doesn&#39;t work well with SOAP, so Rest is a better fit? &lt;/li&gt;    &lt;li&gt;Using SOA to tie disparite systems together. &lt;/li&gt;    &lt;li&gt;What is SOA is a bad quesstion. More appropriately, what do you want from it. What does your company want from it. &lt;/li&gt;    &lt;li&gt;It can be soap, rest, remoting. Whatever can work. &lt;/li&gt;    &lt;li&gt;It&#39;s message passing. To create a big interface that will bridge large #s of gaps is not good to focus on. &lt;/li&gt;    &lt;li&gt;Soa is very ambiguous I&#39;m feeling. It&#39;s people dealing with interconnected systems. &lt;/li&gt;    &lt;li&gt;It&#39;s a buzzword that non-technical people in companies can latch onto. &lt;/li&gt;    &lt;li&gt;Woa - web oriented arch &lt;/li&gt;    &lt;li&gt;Cloud computing sounds great, but we&#39;re still probably far away from having companies trust it. &lt;/li&gt;    &lt;li&gt;Excel being able to pull data is impressive to business people. They could get this ,it&#39;s hard to grasp sharePoint, bam, sitefinity. &lt;/li&gt;    &lt;li&gt;It&#39;s better to show than to tell about. &lt;/li&gt;    &lt;li&gt;Bof &lt;/li&gt;    &lt;li&gt;&amp;quot;I ducking hate sharepoint&amp;quot; &lt;/li&gt;    &lt;li&gt;You can&#39;t put Esb in a box &lt;/li&gt;    &lt;li&gt;Something that maintains a directory of services is valuable &lt;/li&gt;    &lt;li&gt;Uddi &lt;/li&gt;    &lt;li&gt;Couple of consultants expressing experience integrating services within companies. &lt;/li&gt;    &lt;li&gt;Oslo? Does uddi fall away with it? &lt;/li&gt;    &lt;li&gt;Msft has a roadmap, kinda private, and if they stop talking about something then maybe it&#39;s going away. &lt;/li&gt;    &lt;li&gt;Thomas Erl books. Great resource, big books, but a quick read. &lt;/li&gt;    &lt;li&gt;New patterns. Maybe driven by ego. But the value of a pattern is that it capitalizes on existing knowledge and experiences. &lt;/li&gt;    &lt;li&gt;Scott Bellware is becoming House MD &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;Soa in a word      &lt;ul&gt;       &lt;li&gt;Reusability? been promised before &lt;/li&gt;        &lt;li&gt;Reusability within the enterprise &lt;/li&gt;        &lt;li&gt;Interop maybe? &lt;/li&gt;        &lt;li&gt;Integration? &lt;/li&gt;        &lt;li&gt;Loosely coupled integration? &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;We&#39;re not doing anything new, you could still just pass a flat file around, but this is a more open way where you maybe don&#39;t have to understand an opaque util that processes that flat file. &lt;/li&gt;    &lt;li&gt;Noticed that laptops, slides didn&#39;t look near as refined and beautiful. &lt;/li&gt;    &lt;li&gt;Soa has a steeper learning curve because you need to know about several pieces. &lt;/li&gt;    &lt;li&gt;This is going to be a factor for me layer (integration), so should increase priority of Astoria, restful stuff ... Also, design patterns. &lt;/li&gt;    &lt;li&gt;It&#39;s important to separate components where they can be service oriented. &lt;/li&gt;    &lt;li&gt;With speaking and writing, even general conversation, explaining ideas elegantly is the key skill. I need to be able to think&amp;#160; clearly, and restrain myself. Can practice this is writing. Keep myself honest by proving my points. I don&#39;t think quickly though, so slow down to go&amp;#160; fast. &lt;/li&gt;    &lt;li&gt;Open spaces help to flesh out ideas from various people. The speaker has to be very, very good to attend a strictly face-forward presentation. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;b&gt;Lunch - TDD demo&lt;/b&gt;&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Start using TDD syntax for tests. Stop always calling things BlahTest. &lt;/li&gt;    &lt;li&gt;Take out template code and comments (it&#39;s noise). &lt;/li&gt;    &lt;li&gt;Lunch session on TDD was full. Seems to be interest in testing and tdd. Even though we&#39;re using statixally types languages, we still need tests (and it&#39;s a tool to develop business requirements) &lt;/li&gt;    &lt;li&gt;Try doing TDD on a refactoring or new feature. Let the design drive me. &lt;/li&gt;    &lt;li&gt;Was great to see speakers being engaged. Lots of stumbling, arguments over tooling. Good to see them in practice. &lt;/li&gt;    &lt;li&gt;Are getters and setters evil? &lt;/li&gt;    &lt;li&gt;The zealots have an aversion to MSTest. &lt;/li&gt;    &lt;li&gt;Class WhenAllPeopleAreFed &lt;/li&gt;    &lt;li&gt;Method Are_there_people_to_feed, for example. &lt;/li&gt;    &lt;li&gt;It take discipline to take small steps and not skipping things. &lt;/li&gt;    &lt;li&gt;Michael Feathers book was highly recommended. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;b&gt;Service Design&lt;/b&gt;&lt;/h3&gt;  &lt;h4&gt;&lt;b&gt;R&lt;/b&gt;&lt;b&gt;ayburn&lt;/b&gt;&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Best is the enemy of good. Good enough is by def good enough. &lt;/li&gt;    &lt;li&gt;Soa is nothing but evolution. &lt;/li&gt;    &lt;li&gt;Quotes a study that documents the most popular real world benefit of implementing SOA is agility. &lt;/li&gt;    &lt;li&gt;YAGNI &lt;/li&gt;    &lt;li&gt;You can&#39;t get it right. &lt;/li&gt;    &lt;li&gt;WF and WCF go together well and Msft will continue to support them. It&#39;s a good idea to invest learning in these. &lt;/li&gt;    &lt;li&gt;WSDL plus address &lt;/li&gt;    &lt;li&gt;Are open spaces for people who like to talk. Is it more ego driven? &lt;/li&gt;    &lt;li&gt;It&#39;s not RESTful &lt;/li&gt;    &lt;li&gt;How do WCF and REST work together &lt;/li&gt;    &lt;li&gt;Use XML namespaces. Many people neglect this. &lt;/li&gt;    &lt;li&gt;Service methods are not code. Take one parameter that has all parameters bundle, then can add optional parameters. &lt;/li&gt;    &lt;li&gt;What doesn&#39;t matter? New operations and new properties on existing types. &lt;/li&gt;    &lt;li&gt;Orgs that are just starting to use or create services shouldn&#39;t need an ESB. Don&#39;t get treatment until you feel pain. &lt;/li&gt;    &lt;li&gt;How will Astoria change this stuff? I haven&#39;t looked at it a lot, but I don&#39;t see this as the major problem. &lt;/li&gt;    &lt;li&gt;Some asks, what if I need to return a million rows? If it&#39;s possible and you have enough bandwidth and power, do it. Or consider using an async technique, such as a return address (if doing programmatically) or provide an FTP address, username, and pass that a file will be present at. &lt;/li&gt;    &lt;li&gt;Oslo. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;b&gt;Closing Keynote&lt;/b&gt;&lt;/h3&gt;  &lt;h4&gt;Joe Stagner&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Today&#39;s problems can&#39;t be solved with the same thinking that got us into those problems. Einstein. &lt;/li&gt;    &lt;li&gt;The web is completely broken? No!! &lt;/li&gt;    &lt;li&gt;Consumer IP traffic should surpass enterprise for the first time in 2008. &lt;/li&gt;    &lt;li&gt;Last year, my parents did most of their Christmas shopping online. &lt;/li&gt;    &lt;li&gt;Data centers are the fastest growing energy segment in the US. &lt;/li&gt;    &lt;li&gt;This is bullshit. He&#39;s just talking with his friends in the audience and making stupid jokes. Guy next to me just said, this is awesome, which makes me depressed about the audience. &lt;/li&gt;    &lt;li&gt;Develop habit of using time better. Pretending like I have less time and try to effectively work 4 days. Focus hardcore. Also, prepare this year for when I have to work in a real environment. Stricter. &lt;/li&gt;    &lt;li&gt;Msft is the biggest SW company. 78k employees. &lt;/li&gt;    &lt;li&gt;Question: What is Msft development division doing to reduce complexity and make adopting new techs that are rapidly being produced more palatable? &lt;/li&gt;    &lt;li&gt;Answer: You don&#39;t have to do it, and Mvc &lt;/li&gt;    &lt;li&gt;Although I don&#39;t think his talk was particularly innovative or inspirational, his attitude seems to generally be in the right place with regards to embracing future developments. &lt;/li&gt;    &lt;li&gt;Makes a joke to not use UpdatePanel. They&#39;ve apparently had bad experiences with it scaling. &lt;/li&gt;    &lt;li&gt;When OSS for Msft? &amp;quot;Honestly, I think a lot of people don&#39;t get OSS in Msft.&amp;quot; &lt;/li&gt;    &lt;li&gt;A lot of people don&#39;t realize that Msft cannot accept legally contributions from OSS contributors. They can&#39;t take the risk. Is the risk perceived? Will Msft ever get over this? Not likely. &lt;/li&gt; &lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>DevLink Conference - Day 1 Notes</title>
   <link href="http://doingthedishes.com/2008/10/03/devlink-conference-day-1-notes.html"/>
   <updated>2008-10-03T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/10/03/devlink-conference-day-1-notes</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;/images/dev-link-logo-2008.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;64&quot; alt=&quot;devLink2008Sponsors&quot; src=&quot;/images/dev-link-logo-2008.jpg&quot; width=&quot;224&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Partly because I&#39;m lazy and partly because I came away from the conference disillusioned and disheartened, I haven&#39;t posted my notes about DevLink (a .Net conference I went to several weeks back near Nashville, TN) like I did awhile back for the local Ruby conference (the Ruby Hoedown). I know you&#39;ve been holding your breath for my insightful impressions, so I&#39;m sorry for the delay.&lt;/p&gt;  &lt;p&gt;Recently I&#39;ve toyed with the idea of stepping away from developing in .NET and with Microsoft tools. Sure, there&#39;s a lot of good stuff they provide for developers, but the monopoly thing and their clunky reputation starts to grind on you after awhile. However, I&#39;m not sure if that&#39;s realistic, and maybe I&#39;m too entrenched. Or maybe not. Ehhh.&lt;/p&gt;  &lt;p&gt;Nevertheless, it&#39;s nice to be in a development community that you can look up to and that gives you a good feeling inside.&lt;/p&gt;  &lt;p&gt;Did I get a good feeling going to DevLink? Certainly not. It was more of a icky, awkward feeling - like walking in on your grandparents making love.&lt;/p&gt;  &lt;p&gt;Why? Well it wasn&#39;t all bad. There were some good presenters that gave me interesting perspectives. It&#39;s just that there were a lot of uninspiring talks too that made me question if I&#39;m in the right place with my career.&lt;/p&gt;  &lt;p&gt;But, I&#39;m just an inexperienced douche bag and it was just one conference in one particular place.&lt;/p&gt;  &lt;hr /&gt;  &lt;h2&gt;Day 1&lt;/h2&gt;  &lt;p&gt;The highlights of Day 1 were the disappointing keynote that caused a flurry of negative comments on Twitter and several people to abandon it. On a more positive note, there was a well-delivered and knowledgeable talk by .Net Rocks host Richard Campbell about scaling ASP.NET and and a look at a functional language that&#39;s being pimped a lot lately by Redmond.&lt;/p&gt;  &lt;h3&gt;Keynote: Stranger in a Strange Land&lt;/h3&gt;  &lt;h4&gt;Rex Black&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;[The big deal about this presentation was the twitter feedback that was present. People voiced their displeasure. Saw which people were participating on Twitter] &lt;/li&gt;    &lt;li&gt;What is outsourcing? Outsource developing and/or test. To even multiple companies. &lt;/li&gt;    &lt;li&gt;Immediately I&amp;#8217;m struck by how dense the presentation slides are. Shouldn&amp;#8217;t have this much information on slides? Can&amp;#8217;t pay attention to what he&amp;#8217;s saying (there&amp;#8217;s even an animated gif in his slide header!). &lt;/li&gt;    &lt;li&gt;How did outsourcing arise? The bubble, people sought to reduce costs. Also to take advantage of resources present in a different geographical region. Labor and cost savings. Inability to handle in-house. &lt;/li&gt;    &lt;li&gt;Unspoken reasons: peer-pressure (everyone&amp;#8217;s doing it), and dissatisfaction with in-house business. &lt;/li&gt;    &lt;li&gt;How to deal with it? &lt;/li&gt;    &lt;li&gt;Chaos does not scale! &lt;/li&gt;    &lt;li&gt;Outsourcing greatly increases complexity. &lt;/li&gt;    &lt;li&gt;Like any complex endeavor, careful planning, organization, and closely managed execution are key. &lt;/li&gt;    &lt;li&gt;Lifecycle / process choices? I&amp;#8217;m agnostic. Just have one, and stick to it (but still think about it). &lt;/li&gt;    &lt;li&gt;Take quality beyond CMM &lt;/li&gt;    &lt;li&gt;CMM can be used as a marketing device &lt;/li&gt;    &lt;li&gt;It does not say much about testing (even a CMM Level 5 org can score low in test maturity!). &lt;/li&gt;    &lt;li&gt;Plan for and manage project risks. Working with dev teams in certain regions can be influenced by politics (wars). &lt;/li&gt;    &lt;li&gt;Being there &lt;/li&gt;    &lt;li&gt;Do you trust people you&amp;#8217;ve never met? &lt;/li&gt;    &lt;li&gt;Do you really hear the whole message when you don&amp;#8217;t talk face to face? &lt;/li&gt;    &lt;li&gt;Conference calls and email work for routine communication &lt;/li&gt;    &lt;li&gt;But, sometimes only a visit will do &lt;/li&gt;    &lt;li&gt;Need to adapt to the cultures &lt;/li&gt;    &lt;li&gt;Conclusions: outsourcing is here to stay. It might be cheaper, but it&amp;#8217;s harder and more complex (and thus riskier). &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Gathering Business Requirements&lt;/h3&gt;  &lt;h4&gt;Tim Peek&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Many projects don&amp;#8217;t take the time to define requirements enough. &lt;/li&gt;    &lt;li&gt;Requirements: fill in the details of scope. &lt;/li&gt;    &lt;li&gt;Very important to define what details are not part of scope. &lt;/li&gt;    &lt;li&gt;When a new requirement emerges, check to see if it&amp;#8217;s in the scope. &lt;/li&gt;    &lt;li&gt;There are non-functional requirements such as how it looks, aesthetics. &lt;/li&gt;    &lt;li&gt;There are also false requirements such as vague requirements, opinions, technology decisions (&amp;#8220;Let&amp;#8217;s use an Oracle database on this project&amp;#8221;, &amp;#8220;This application needs to run on the intranet.&amp;#8221; &amp;#8211; why??) &lt;/li&gt;    &lt;li&gt;Techniques      &lt;ul&gt;       &lt;li&gt;Use cases. &amp;#8220;A user does an action and something happens&amp;#8221;. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Prototypes &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Requirements development. I ask questions, you talk, I listen. I analyze, ask follow-up questions. I document, ask follow-up questions, we all agree. Can take months, years. Is very hard work. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;[He emphasized being very stringent and thorough] &lt;/li&gt;    &lt;li&gt;[Someone asks how you can estimate requirements gathering though, if it can take so much time. His answer was &amp;quot;come see my other talk on so and so&amp;quot;.] &lt;/li&gt;    &lt;li&gt;Techniques for elicitation.      &lt;ul&gt;       &lt;li&gt;One on one interviews &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Group interviews &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Questionnaires &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Prototypes &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Follow people &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Validation (make sure requirements from Elicitation are accurate) &lt;/li&gt;    &lt;li&gt;Consolidate the requirements.      &lt;ul&gt;       &lt;li&gt;Put similar requirements together. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Determine if you have a complete picture or if gaps are present. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Eliminate requirements that are out of scope. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Specification      &lt;ul&gt;       &lt;li&gt;Prioritize &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Traceability &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Testability &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;[For me, sounds good in theory, but it just seems nebulous. I would need to be in an environment that values good requirements gathering and physically implements it and has a process to get a feel for what he&amp;#8217;s describing. I just can&amp;#8217;t relate well enough. It seems too hard to get it right.] &lt;/li&gt;    &lt;li&gt;[Still too much text in slides.] &lt;/li&gt;    &lt;li&gt;Make signoff a formal process. &lt;/li&gt;    &lt;li&gt;Someone asked how to test WinForms or WPF apps at the moment. These are more opaque than HTML testing. Do WinForms and WPF represent inferior ways to dev apps? &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Scaling ASP.NET Web Apps&lt;/h3&gt;  &lt;h4&gt;Richard Campbell&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Scaling means that the page behaves the same as concurrent users increase. The page is consistent as the number of users scale.&amp;#160; We can even sacrifice the performance of a single page to improve consistency for users. &lt;/li&gt;    &lt;li&gt;IE 7 does 2 requests at same time. FF does 2. http spec specifies 2.&amp;#160; IE 8 will do about 6. &lt;/li&gt;    &lt;li&gt;Web browser makes a request, then gives back data (TTFB), but the page still has to request CSS, JS, and images (2 simultaneously). &lt;/li&gt;    &lt;li&gt;Websiteoptimization.com analyzer &lt;/li&gt;    &lt;li&gt;Latency matters &lt;/li&gt;    &lt;li&gt;Decomposing the problem. Server compute time, client compute tiem, bandwidth, concurrent connections, latency (http ping time). &lt;/li&gt;    &lt;li&gt;Performance spreadsheet and formula. &lt;/li&gt;    &lt;li&gt;Make sure you&amp;#8217;re working on the right problem! &lt;/li&gt;    &lt;li&gt;Consolidating JS and CSS cuts down on round trips. &lt;/li&gt;    &lt;li&gt;In a perfect world, we should have 4 files: 1 for html, 1 JS, 1 for CSS, and 1 image (using CSS sprites). &lt;/li&gt;    &lt;li&gt;Server compute time is, in the end, the thing that doesn&amp;#8217;t scale and is genuinely a problem (but make sure you&amp;#8217;re working on the right problem and not choking on something else). &lt;/li&gt;    &lt;li&gt;Set cache refresh? Don&amp;#8217;t do too often (or else you loose the benefit), but maybe once a day. &lt;/li&gt;    &lt;li&gt;Everyone has too much content on slides!! No presentation zen that I saw. &lt;/li&gt;    &lt;li&gt;ASP.NET&amp;#8217;s signature problem is memory consumption. &lt;/li&gt;    &lt;li&gt;ASP.NET comes under load, memory runs out, GC kicks in, asp.net tells IIS to hold all requests, IIS stacks up requests. &lt;/li&gt;    &lt;li&gt;Everyone wants 100% of everything (uptime, accuracy, scalablity). But you really need to do what&amp;#8217;s important to the business (e.g. For a bank, it&amp;#8217;s much better to do nothing, than to do a transaction incorrectly). &lt;/li&gt;    &lt;li&gt;Dell 1950 = 250 req/sec (untuned asp app) &lt;/li&gt;    &lt;li&gt;It&amp;#8217;s important to have communication between development and IT so each one is aware of the other&amp;#8217;s world and is respectful. &lt;/li&gt;    &lt;li&gt;Lots of people are saying they can do a better garabage collection algorithm, but they have yet to prove it. There are very smart people working on this at Msft. It&amp;#8217;s easy to criticize decisions made in 2000, 8 years later. &lt;/li&gt;    &lt;li&gt;Tech politics. When a business is successful, you tend to get cowboys who say they they wan to improve things (aka circumvent the procedure). &lt;/li&gt;    &lt;li&gt;It&amp;#8217;s hard to do good, accurate load testing. &lt;/li&gt;    &lt;li&gt;Summary      &lt;ul&gt;       &lt;li&gt;Focus on actual user perf problems. What is reality. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Start with low hanging fruit. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Use methodical perf improvement. &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;At large scale the network is the computer. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Open Space - Distributed Source Control Management&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Is Svn good enough? &lt;/li&gt;    &lt;li&gt;What&#39;s the compelling reason to move to Git? I just got people off SourceSafe to Svn, and now I have to explain DSCM and branching? &lt;/li&gt;    &lt;li&gt;A big reason is private commits. &lt;/li&gt;    &lt;li&gt;Git is great for feature work. &lt;/li&gt;    &lt;li&gt;Why suddenly have so many people moved to Git? GitHub. The fact that people have moved to RoR means that they&#39;re alternative thinkers, so they&#39;re already receptive to Git. &lt;/li&gt;    &lt;li&gt;Bazaar. Friendlier to Windows? Bazaar, Mercurial and Git &lt;/li&gt;    &lt;li&gt;You can start using Git by using it just like Svn, then slowly introducing branches. &lt;/li&gt;    &lt;li&gt;Workflows detailed on the Bazaar and Mercurial site. &lt;/li&gt;    &lt;li&gt;Will eventually Msft get there? You can already do TFS shelves (even though they reside on the server). &lt;/li&gt;    &lt;li&gt;If you are in an environment that&#39;s not receptive to these changes, then you have 2 choices (change your environment or live with it). &lt;/li&gt;    &lt;li&gt;There seems to be a real danger of people being afraid to commit because they&#39;re committing publicly. &lt;/li&gt;    &lt;li&gt;Is Git a cargo cult? &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;F#&lt;/h3&gt;  &lt;h4&gt;Ted Neward and Amanda Laucher&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Don Syme did it. Also did generics. Was made syntax compatible with OCaml. &lt;/li&gt;    &lt;li&gt;Official post by Somar saying F# was going to be productized. &lt;/li&gt;    &lt;li&gt;Very sparse designer support for it. &lt;/li&gt;    &lt;li&gt;Might be useful to learn F# because it&#39;s like Erlang? &lt;/li&gt;    &lt;li&gt;Strongly typed, statically-types, but type inferenced. &lt;/li&gt;    &lt;li&gt;&amp;quot;Full benefits of C# or Java without all the high ceremony.&amp;quot; &lt;/li&gt;    &lt;li&gt;Room is packed - lots of people interested in functional programming maybe. &lt;/li&gt;    &lt;li&gt;SETI at home was one of the first large scale exercises in functional computing. &lt;/li&gt;    &lt;li&gt;Functional unit testing is isolated, simpler. &lt;/li&gt;    &lt;li&gt;Has both a compiler and interpreter. &lt;/li&gt;    &lt;li&gt;The &amp;quot;let&amp;quot; F# construct &lt;/li&gt;    &lt;li&gt;This is a silly talk, unfocused, too much quasi-entertainment and fluff. &lt;/li&gt;    &lt;li&gt;People seem very dependent on intellisense, or maybe this is just background compilation they&#39;re relying on. &lt;/li&gt;    &lt;li&gt;Very funky syntax. &lt;/li&gt;    &lt;li&gt;let myfunction x y = (x * x) + y &lt;/li&gt;    &lt;li&gt;Where x and y are parameters to the function. &lt;/li&gt;    &lt;li&gt;The idea of tuples. They combine values into packets. Think of them as a row from a table. Where a row can have columns with different types. &lt;/li&gt;    &lt;li&gt;Because it has to compile to IL, is it a leaky abstraction? &lt;/li&gt;    &lt;li&gt;One of the dangers of an inferred language is that it can be inferred incorrectly. &lt;/li&gt;    &lt;li&gt;There&#39;s the equal operator, then there&#39;s the &amp;lt;- destructive update operator. &lt;/li&gt;    &lt;li&gt;&#39; operator &lt;/li&gt;    &lt;li&gt;This talk is masturbatory. &lt;/li&gt;    &lt;li&gt;The plan is F# will set on top of Parallel LINQ stuff which will interface with VM and OS to scale across processors. &lt;/li&gt;    &lt;li&gt;Was mind blowing to see this bizarre syntax. &lt;/li&gt;    &lt;li&gt;Relation to &amp;quot;yield&amp;quot; keyword in C# (amount other things like delegates and lambdas). &lt;/li&gt; &lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Ruby Hoedown Day 2 Notes</title>
   <link href="http://doingthedishes.com/2008/08/14/ruby-hoedown-day-2-notes.html"/>
   <updated>2008-08-14T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/08/14/ruby-hoedown-day-2-notes</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.rubyhoedown.com&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;175&quot; alt=&quot;image&quot; src=&quot;/images/ruby-hoedown-logo-2008.png&quot; width=&quot;499&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here are the notes I took from day 2 of the Ruby Hoedown conference:&lt;/p&gt;  &lt;h2&gt;Calling Your Code: Gluing Phone Calls to Ruby&lt;/h2&gt; Troy Davis   &lt;ul&gt;   &lt;li&gt;[Troy spoke on how you can use Ruby to write voice applications with phone calls.] &lt;/li&gt;    &lt;li&gt;Asterisk - open source PBX &amp;amp; telephony platform &lt;/li&gt;    &lt;li&gt;Adhearsion - Ruby framework that sits on top of Asterisk. &lt;/li&gt;    &lt;li&gt;Typical flow:&amp;#160; PSTN -&amp;gt; SIP -&amp;gt; Asterisk -&amp;gt; AGI request (Asterisk Gateway Interface) -&amp;gt; Accept call with Adhearsion -&amp;gt; Run call flow &lt;/li&gt;    &lt;li&gt;Instead of administering the PBX manually, can use Asterisk to administer it in Ruby. &lt;/li&gt;    &lt;li&gt;There are various TTS (text to speech) engines (some much better than others). &lt;/li&gt;    &lt;li&gt;[Troy walked through a few live demos using mobile phone. There were problems, but overall it&#39;s impressive.] &lt;/li&gt;    &lt;li&gt;Example apps:      &lt;ul&gt;       &lt;li&gt;Yelpvox - call a #, then get surrounding restaurant information &lt;/li&gt;        &lt;li&gt;SendSign - real estate flyer information service. If flyer box is empty, call the provided # to get information. Can then go to SendSign.com, enter in the phone # that you called from, and see the homes that you looked for. &lt;/li&gt;        &lt;li&gt;Frucall - do online comparison shopping by calling a number and entering in a barcode of a product while you&#39;re in the store. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;What you need to get started:      &lt;ul&gt;       &lt;li&gt;Asterisk or FreeSwitch (available in virtual machine format) &lt;/li&gt;        &lt;li&gt;Text to speech engine &lt;/li&gt;        &lt;li&gt;SIP provider &lt;/li&gt;        &lt;li&gt;DIDs (phone numbers) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Ruleby: The Rule Engine for Ruby&lt;/h2&gt; Joe Kutner   &lt;ul&gt;   &lt;li&gt;We&#39;re used to imperative programming. &lt;/li&gt;    &lt;li&gt;It&#39;s nice, but the programmer should, ideally, understand all of the entire program (which is often impossible with imperative programming). &lt;/li&gt;    &lt;li&gt;Alternative: rules engines, rules-based paradigm &lt;/li&gt;    &lt;li&gt;Write rules declaritively, but don&#39;t specify how code runs. &lt;/li&gt;    &lt;li&gt;Ruleby uses a Ruby domain specific language (DSL) to specify rules &lt;/li&gt;    &lt;li&gt;Uses the Rete algorithm. Good, but exchanges memory for speed (be aware of this). &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;flog &amp;lt;&amp;lt; Test.new&lt;/h2&gt; Rick Bradley   &lt;ul&gt;   &lt;li&gt;Flog - continuous integration for code complexity. &lt;/li&gt;    &lt;li&gt;Evolution of a programmer:      &lt;ol&gt;       &lt;li&gt;Lamer &lt;/li&gt;        &lt;li&gt;Haxor &lt;/li&gt;        &lt;li&gt;Cowboy &lt;/li&gt;        &lt;li&gt;Embryo (start to notice testing) &lt;/li&gt;        &lt;li&gt;Webelo &lt;/li&gt;        &lt;li&gt;Poseur (half-heartedly do testing) &lt;/li&gt;        &lt;li&gt;Human &lt;/li&gt;        &lt;li&gt;Apprentice &lt;/li&gt;        &lt;li&gt;Journeyman &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Test driving code in a greenfield scenario is much more different than testing existing code. &lt;/li&gt;    &lt;li&gt;Technique: don&#39;t change existing code without test covereage. &lt;/li&gt;    &lt;li&gt;Legacy code = code without tests (Michael Feather&#39;s book Working with Legacy Code) &lt;/li&gt;    &lt;li&gt;[Comments from the audience: This may just unnecessarily confuse the terms &amp;quot;untested code&amp;quot; and &amp;quot;legacy code&amp;quot;. What if old code is well tested? Rails 1.0 is well tested, but is still legacy code.] &lt;/li&gt;    &lt;li&gt;So, for an existing app without tests, where do you start? Very basically, on the outside, pealing away layers. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Archaeopteryx: A Ruby Midi Generator&lt;/h2&gt; Giles Bowkett   &lt;ul&gt;   &lt;li&gt;[Presentation starts with live demo of electronic music driven by a Ruby script and edited live in a text editor to change the music&#39;s style.] &lt;/li&gt;    &lt;li&gt;I&#39;m a former DJ. &lt;/li&gt;    &lt;li&gt;A lot of DJs are using laptops now, which should in theory, make computer geeks popular at parties. &lt;/li&gt;    &lt;li&gt;Venture capitalism is like the patronage system for artists and is stifling. &lt;/li&gt;    &lt;li&gt;Programmers are often distracted by shiny toys. &lt;/li&gt;    &lt;li&gt;Be profitable from the start by being small and cheap. &lt;/li&gt;    &lt;li&gt;I&#39;m trying to create my own niche market using Archaeopteryx and MIDI controllers for DJ work. &lt;/li&gt;    &lt;li&gt;This is your brain on music book. &lt;/li&gt;    &lt;li&gt;I&#39;m going to test my program by running it for 7 days at Burning Man. &lt;/li&gt;    &lt;li&gt;Good business is the best art. -Warhol &lt;/li&gt;    &lt;li&gt;[For sure it&#39;s an entertaining presentation, but there are too many rat holes and it comes off to me as scatter-brained.] &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Lightning Talk: What Can We Learn?&lt;/h2&gt; Yahuda Katz   &lt;ul&gt;   &lt;li&gt;Ruby &lt;u&gt;can&lt;/u&gt; be used in the &amp;quot;enterprise&amp;quot;. &lt;/li&gt;    &lt;li&gt;While I don&#39;t want to use Rhino or Hibernate, we can learn a lot from Java&#39;s experiences. &lt;/li&gt;    &lt;li&gt;Whereas Ralis embraces convention whole-heartedly, Merb has good defaults set on a highly configurable backend. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Keynote: Ghosts of Ruby&lt;/h2&gt; David Black   &lt;ul&gt;   &lt;li&gt;The Ruby language did, in fact, exist before Rails. &lt;/li&gt;    &lt;li&gt;Presently, version 1.8.6 has the highest adoption. &lt;/li&gt;    &lt;li&gt;1.8.7 is a strange, present/future 1.8.6 with backported 1.9 features. &lt;/li&gt;    &lt;li&gt;1.9.0 is not in widespread use. &lt;/li&gt;    &lt;li&gt;1.9 features      &lt;ul&gt;       &lt;li&gt;New Enumerable methods. There are lots. &lt;/li&gt;        &lt;li&gt;BasicObject - knows nothing, above Kernel in the class heirarchy. &lt;/li&gt;        &lt;li&gt;New lambda literal constructor          &lt;ul&gt;           &lt;li&gt;&lt;b&gt;-&amp;gt; () { }&lt;/b&gt; &lt;/li&gt;            &lt;li&gt;A way to have blocks with method argument paramter semantics. &lt;/li&gt;            &lt;li&gt;Ex:&lt;b&gt; -&amp;gt; (a, b=1) { b } &lt;/b&gt;is like &lt;b&gt;lambda { |a, b=1| }&lt;/b&gt; except that this is kinda invalid because how can you distinguish b=1 from the bitwise or operator. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;[Points out several things he finds personally peculiary in 1.9] &lt;/li&gt; &lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Ruby Hoedown Day 1 Notes</title>
   <link href="http://doingthedishes.com/2008/08/13/ruby-hoedown-day-1-notes.html"/>
   <updated>2008-08-13T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/08/13/ruby-hoedown-day-1-notes</id>
   <content type="html">&lt;p&gt;Here are the notes that I took from day 1 of the Ruby Hoedown conference. I hope I didn&#39;t misquote anyone too badly, but these are the points that stuck out to me the most.&lt;/p&gt;  &lt;h2&gt;Ruby: A Year of Innovation&lt;/h2&gt;  &lt;p&gt;&lt;i&gt;Jason Seifer and Gregg Pollack&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;a href=&quot;/images/dj-ango.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;282&quot; alt=&quot;DJ Ango&quot; src=&quot;/images/dj-ango.jpg&quot; width=&quot;467&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Above: Jason as &amp;quot;&lt;a href=&quot;http://www.railsenvy.com/2007/9/10/ruby-on-rails-vs-django-commercial-7&quot;&gt;DJ Ango&lt;/a&gt;&amp;quot; (in reference to the Django framework)&lt;/em&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;This talk is not 100% Rails (it&#39;s a Ruby conference, after all) &lt;/li&gt;    &lt;li&gt;We&#39;ll be talking about several cool Ruby libraries: &lt;/li&gt;    &lt;li&gt;Rack      &lt;ul&gt;       &lt;li&gt;Framework A --&amp;gt; Rack --&amp;gt; Web application server &lt;/li&gt;        &lt;li&gt;Serves as an adapter between numerous Ruby frameworks and web servers. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Phusion Passenger      &lt;ul&gt;       &lt;li&gt;I needed a blog for my user group. &lt;/li&gt;        &lt;li&gt;I chose TextDrive for hoster, and it was painful. &lt;/li&gt;        &lt;li&gt;Switched to DreamHost, but it turned out to be HellHost. &lt;/li&gt;        &lt;li&gt;Was too slow, needed something more powerful, but wait - it&#39;s just a freakin&#39; blog! &lt;/li&gt;        &lt;li&gt;Phusion Passenger came out (and it&#39;s compatible with Rack!) so you can use it with any framework (not just Rails). &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Github      &lt;ul&gt;       &lt;li&gt;What do you get when you mix SourceForge with Facebook? [Some people from the audience yell] GitHub! [I think one of said people was Chris Wanstrath, a co-creator of GitHub] &lt;/li&gt;        &lt;li&gt;Features include Hardcore Forking Action! &lt;/li&gt;        &lt;li&gt;GitHub is more than a year old, but it&#39;s adoption has taken off in the past year. &lt;/li&gt;        &lt;li&gt;Many well-known projects, such as Rails itself, are now hosted there. &lt;/li&gt;        &lt;li&gt;[I&#39;ve been hearing so much about Git, it reminds me that I really, really need to get out of my SourceSafe and Subversion habits and try a distributed version control system like Git or Mercurial] &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Ruby EventMachine      &lt;ul&gt;       &lt;li&gt;Event processing library. &lt;/li&gt;        &lt;li&gt;Like Twisted for Python, Apache Mina for Java, and Poe for Perl &lt;/li&gt;        &lt;li&gt;You can do this stuff with threads, but its slow (and potentially deadlock dangerous). &lt;/li&gt;        &lt;li&gt;Evented Mongrel took EventMachine and applied it to Mongrel, but there&#39;s a catch - EventMachine is best for fast requests that aren&#39;t long-running. &lt;/li&gt;        &lt;li&gt;Recently built into Merb. &lt;/li&gt;        &lt;li&gt;Use like so: deferred_requests[&amp;quot;/uploads&amp;quot;, &amp;quot;/long_process&amp;quot;] &lt;/li&gt;        &lt;li&gt;Other alternatives: Thin, Ebb, and Starling. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Redmine      &lt;ul&gt;       &lt;li&gt;For awhile, Trac was the only good project management application. &lt;/li&gt;        &lt;li&gt;Redmine is a project management app written in Rails. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Pool Party      &lt;ul&gt;       &lt;li&gt;Cloud EC2 computing made easy. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;make_resourceful      &lt;ul&gt;       &lt;li&gt;Scaffolds make it easy to generate data access code, but much of the code is duplicated. &lt;/li&gt;        &lt;li&gt;Helps to eliminate duplicate code from scaffolding. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Various screencast series have launched      &lt;ul&gt;       &lt;li&gt;Railscasts &lt;/li&gt;        &lt;li&gt;Peepcode &lt;/li&gt;        &lt;li&gt;Pragmatic Programmers screencasts &lt;/li&gt;        &lt;li&gt;And soon.... EnvyCasts! &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Hpricot      &lt;ul&gt;       &lt;li&gt;doc = Hpricot.open(&amp;quot;www.website.com&amp;quot;) and then work on the doc object. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Juggernaut      &lt;ul&gt;       &lt;li&gt;Server push with Rails (uses Flash) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Praun      &lt;ul&gt;       &lt;li&gt;Ruby PDF generation &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Capistrano      &lt;ul&gt;       &lt;li&gt;Deployments made easy &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Ruby Virtual Machines      &lt;ul&gt;       &lt;li&gt;JRuby for the Java VM &lt;/li&gt;        &lt;li&gt;IronRuby for .Net &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Skynet      &lt;ul&gt;       &lt;li&gt;Clones Google&#39;s map reduce functionality &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;DataFabric      &lt;ul&gt;       &lt;li&gt;Allows DB sharding for scalability &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;merb      &lt;ul&gt;       &lt;li&gt;Everything that Rails isn&#39;t &lt;/li&gt;        &lt;li&gt;Lightweight, JavaScript library agnostic, DB access agnostic, but still with a strong set of defaults &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Sinatra      &lt;ul&gt;       &lt;li&gt;Very lightweight web app development. &lt;/li&gt;        &lt;li&gt;Hello world web app in Sinatra:          &lt;br /&gt;require &amp;quot;sinatra&amp;quot;           &lt;br /&gt;get &amp;quot;/&amp;quot; do           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Hello world           &lt;br /&gt;end &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;The Future is Now: Leveraging the Cloud with Ruby&lt;/h2&gt; Robery Dempsey   &lt;ul&gt;   &lt;li&gt;I&#39;m angry because people say Rails can&#39;t scale. &lt;/li&gt;    &lt;li&gt;What is scalability? The ability to expand gracefully under load. &lt;/li&gt;    &lt;li&gt;What do you need?      &lt;ul&gt;       &lt;li&gt;Servers &lt;/li&gt;        &lt;li&gt;Storage &lt;/li&gt;        &lt;li&gt;Access to other utilities &lt;/li&gt;        &lt;li&gt;Not have to buy everything up front. &lt;/li&gt;        &lt;li&gt;Can you do that with Ruby? Of course! ... that&#39;s the cloud &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Other ways other than using cloud computing.      &lt;ul&gt;       &lt;li&gt;High availability cluster. A set of servers that constantly ping each other. If one goes down, then another takes over. &lt;/li&gt;        &lt;li&gt;Load balancing cluster. A routing mechanism directs traffic to various servers based on load. &lt;/li&gt;        &lt;li&gt;Grid. A loosely coupled group of servers &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;A Gartner study says that by 2011, startup companies will start buying a significant portion of their infrastructure on demand. &lt;/li&gt;    &lt;li&gt;Amazon EC2. Neat, but you need to build reliability in yourself. I&#39;ve had EC2 instances vaporized upon restart. If this is the only copy of your server, you&#39;re screwed. &lt;/li&gt;    &lt;li&gt;There are alternatives to manual Amazon EC2:      &lt;ul&gt;       &lt;li&gt;Morph          &lt;ul&gt;           &lt;li&gt;Uses EC2, but has a custom, rigid deployment mechanism. &lt;/li&gt;            &lt;li&gt;Doesn&#39;t even allow file-level access. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;RightScale          &lt;ul&gt;           &lt;li&gt;Lots of configuration options. &lt;/li&gt;            &lt;li&gt;$2,500 setup, $500/month plus Amazon fees. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Heroku          &lt;ul&gt;           &lt;li&gt;Free (for now!) &lt;/li&gt;            &lt;li&gt;Later, will be charged based on... units of work kinda... (it&#39;s sketchy) &lt;/li&gt;            &lt;li&gt;Everything is done in the browser &lt;/li&gt;            &lt;li&gt;Automatic scaling &lt;/li&gt;            &lt;li&gt;Work locally, then deploy &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;PoolParty          &lt;ul&gt;           &lt;li&gt;Uses an Ubuntu EC2 AMI (Amazon machine image) &lt;/li&gt;            &lt;li&gt;Not production ready &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Scalr &lt;/li&gt;        &lt;li&gt;ElasticRails &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;So, if you go straight with EC2 yourself, a standard EC2 deployment will cost &lt;b&gt;$432&lt;/b&gt; for a good-sized app. &lt;/li&gt;    &lt;li&gt;And you have to do a lot of configuration yourself. &lt;/li&gt;    &lt;li&gt;His suggestion of 3rd party tools (from cheapest to most expensive and scalable):      &lt;ol&gt;       &lt;li&gt;Morph &lt;/li&gt;        &lt;li&gt;Scalr &lt;/li&gt;        &lt;li&gt;RightScale &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;There are Ruby libraries to interact with various Amazon services such EC2, S3, SimpleDB, and SQS. &lt;/li&gt;    &lt;li&gt;[There was a comment from the audience about a problem having mail sent from Amazon serves flagged as spam] &lt;/li&gt;    &lt;li&gt;[There was another comment wishing that IT department would embrace cloud computing more] &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Mock Dialogue: Conversations on Testing and Mocking&lt;/h2&gt; Joe O&#39;Brien &amp;amp; Jim Weirich   &lt;ul&gt;   &lt;li&gt;[Acted a scripted simulation of two developers working through difficult testing and mocking scenarios] &lt;/li&gt;    &lt;li&gt;Concept of a fluent interface. Like in jQuery:      &lt;pre&gt;&lt;code&gt;$(&#39;form#login&#39;)&lt;br /&gt;    // hide all the labels inside the form with the &#39;optional&#39; class&lt;br /&gt;    .find(&#39;label.optional&#39;).hide().end()&lt;br /&gt;    // add a red border to any password fields in the form&lt;br /&gt;    .find(&#39;input:password&#39;).css(&#39;border&#39;, &#39;1px solid red&#39;).end()&lt;br /&gt;    // add a submit handler to the form&lt;br /&gt;    .submit(function(){&lt;br /&gt;        return confirm(&#39;Are you sure you want to submit?&#39;);&lt;br /&gt;    });&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;Mentioned &lt;a href=&quot;http://www.developer.com/design/article.php/3700651&quot;&gt;Psychology of Builds&lt;/a&gt; article. The frequency of build or test runs drop dramatically when builds last longer than 30 seconds. &lt;/li&gt;

  &lt;li&gt;Michael Feathers guidelines for unit tests. &lt;/li&gt;

  &lt;li&gt;[This format of presentation seems to take you along lines of a conversation that I wouldn&#39;t necessarily go, but still, the style is differentl] &lt;/li&gt;

  &lt;li&gt;Difference between stubs and mocks: stubs fake objects that can give you data back, mocks are a little more involved. &lt;/li&gt;

  &lt;li&gt;Flexmock and Mocha mock frameworks for Ruby &lt;/li&gt;

  &lt;li&gt;Mocks still need to be supplemented with system tests that test the whole stack. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ruby Best Practice Patterns&lt;/h2&gt;
Rein Henrichs 

&lt;ul&gt;
  &lt;li&gt;Best practices are a &lt;u&gt;current&lt;/u&gt; understanding, and they do change. &lt;/li&gt;

  &lt;li&gt;Now, for a little introduction / diversion... &lt;/li&gt;

  &lt;li&gt;The Developers Dilemma - job security decreases as code maintainability increases. &lt;/li&gt;

  &lt;li&gt;So, to guard against this... Unfactoring! &lt;/li&gt;

  &lt;li&gt;Taking well-designed code and purposefully making it obscure to insure job security. &lt;/li&gt;

  &lt;li&gt;&amp;quot;Decomposing&amp;quot; methods. Naming methods incorrectly, even using Pig Latin, or other obfuscation techniques. &lt;/li&gt;

  &lt;li&gt;But seriously, on to the real talk... &lt;/li&gt;

  &lt;li&gt;Composed methods - try keeping methods small. &lt;/li&gt;

  &lt;li&gt;Kent Beck - Smalltalk Best Practices &lt;/li&gt;

  &lt;li&gt;Execution around method pattern 
    &lt;ul&gt;
      &lt;li&gt;How can I ensure 2 things happen? (ex: I want to open a file and ensure that it closes) &lt;/li&gt;

      &lt;li&gt;around_filter in Rails &lt;/li&gt;

      &lt;li&gt;Wrap an object in a block to make sure it has been completely initialized and uninitialized. &lt;/li&gt;

      &lt;li&gt;[The &amp;quot;using&amp;quot; keyword in C#] &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Sharing objects with multiple lines in a method. Pass variable into an initializer, initialize other temp variables and have them as shared variables within the class. &lt;/li&gt;

  &lt;li&gt;I urge people to look into Ruby libraries or various open source projects for examples of pattern usage. Ask yourself why the writers did something in a certain way. &lt;/li&gt;

  &lt;li&gt;Be aware when code doesn&#39;t feel right to you. &lt;/li&gt;

  &lt;li&gt;Code should be fun to write and read. &lt;/li&gt;

  &lt;li&gt;[Comment from David Black about the idea of taste and readability. Some things he&#39;s seen that people describe as readable don&#39;t seem readable to him. Rein responds that it&#39;s a valid point; people have different tastes in music, but still humans can generally agree on what harmony is and what scales we use.] &lt;/li&gt;

  &lt;li&gt;[Another commenter stated that it&#39;s important to separate generic patterns from Ruby idioms.] &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Lightning Talks&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;PJ Davis 
    &lt;ul&gt;
      &lt;li&gt;Web interface for God system monitoring tool &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Brian Lyles 
    &lt;ul&gt;
      &lt;li&gt;Test all the fucking time! &lt;/li&gt;

      &lt;li&gt;Become obsessed with testing. &lt;/li&gt;

      &lt;li&gt;I write code to make my specs turn green. &lt;/li&gt;

      &lt;li&gt;Various tools: 
        &lt;ul&gt;
          &lt;li&gt;TestSpec &lt;/li&gt;

          &lt;li&gt;Shoulda &lt;/li&gt;

          &lt;li&gt;Mspec &lt;/li&gt;

          &lt;li&gt;Cucumber &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;

      &lt;li&gt;Do not imitate the old masters, seek what they sought. &lt;/li&gt;

      &lt;li&gt;Is there every a time when you shouldn&#39;t test? Yes, when you&#39;re not coding. If it works without tests, it works by accident. &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Yousseff Mendelsohn 
    &lt;ul&gt;
      &lt;li&gt;&amp;quot;Truthy&amp;quot; gem package for Ruby. Helps to ease confusing true and false evaluations in Ruby. &lt;/li&gt;

      &lt;li&gt;Usage: variable.truthy? &lt;/li&gt;

      &lt;li&gt;Only nil and false are false in Ruby. Really. That&#39;s it. Stop looking. &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;Another guy 
    &lt;ul&gt;
      &lt;li&gt;Making charts with Google Charts &lt;/li&gt;

      &lt;li&gt;gchartruby library &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Keynote&lt;/h2&gt;
Chris Wanstrath 

&lt;ul&gt;
  &lt;li&gt;No slides, I will just read an essay. &lt;/li&gt;

  &lt;li&gt;In the future, Ruby will be more popular. &lt;/li&gt;

  &lt;li&gt;People will wax philosophic about the old days of Smalltalk (when they&#39;ve never actually done Smalltalk). &lt;/li&gt;

  &lt;li&gt;The suits will come down upon us, but hopefully Ruby will stay good. &lt;/li&gt;

  &lt;li&gt;[His talk is well-written, but quoted Wikipedia too much for my taste, and without visual slides and little content, the majority of it fell flat on me.] &lt;/li&gt;

  &lt;li&gt;PHP has a ton of helpful methods (aka a shotgun blast of functions in the global namespace). &lt;/li&gt;

  &lt;li&gt;I haven&#39;t made a ton of money directly from open source software, but I have gotten a lot of work indirectly from it and through my reputation gained from working on open source. &lt;/li&gt;

  &lt;li&gt;You need to work on a side project. &lt;/li&gt;

  &lt;li&gt;But, you say you don&#39;t have the time? 
    &lt;ul&gt;
      &lt;li&gt;Stop reading RSS feeds, and instead rely on aggregation sites or speakers to give you the really important news. &lt;/li&gt;

      &lt;li&gt;Rely on people to filter for you. &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;But what if people don&#39;t like it, it&#39;s already been done, or it&#39;s stupid?? &lt;/li&gt;

  &lt;li&gt;Forget it, just do a side project that you love. &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Ruby Hoedown Impressions</title>
   <link href="http://doingthedishes.com/2008/08/12/ruby-hoedown-impressions.html"/>
   <updated>2008-08-12T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/08/12/ruby-hoedown-impressions</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.rubyhoedown.com&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;178&quot; alt=&quot;banner&quot; src=&quot;/images/ruby-hoedown-logo-2008.png&quot; width=&quot;513&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Last weekend, I attended The Ruby Hoedown conference here in Huntsville. As a mostly .Net developer, it was refreshing going to a conference where material and ideas were presented outside of my normal habits. I&#39;ve been tinkering with Ruby and Ruby on Rails for awhile now, and when I saw the conference advertised and the line-up of speakers having a couple writers and podcasters that I&#39;ve been paying attention to on the fringe lately, I signed up (even though work didn&#39;t buy my excuse that a Ruby conference would contribute to my .Net skills, I still decided to sign up on my own and take a vacation day).&lt;/p&gt;  &lt;p&gt;Overall, the presentations were very exciting from what I&#39;m used to at software conferences or meetings, and were formed from a mix of humorous images (including Chuck Norris and various internet memes), illustrative diagrams, and even screencasts of coding embedded in the presentations. &lt;/p&gt;  &lt;p&gt;The highlight for me was seeing the guys from the Rails Envy podcast deliver the opening keynote. Their presentation seemed to have just the right balance of content, delivery, and even entertainment. As well as the podcast, they have also produced a humorous &lt;a href=&quot;http://www.railsenvy.com/tags/Commercials&quot;&gt;series of parody videos&lt;/a&gt; comparing RoR to other web frameworks. As I&#39;m writing this, I see that they&#39;ve even posted a &lt;a href=&quot;http://www.railsenvy.com/2008/8/12/the-ruby-hoedown-in-10-minutes&quot;&gt;10 minute summary video&lt;/a&gt; of the Hoedown.&lt;/p&gt;  &lt;p&gt;Going sure didn&#39;t help my feelings of &lt;a href=&quot;/post/X-Envy.aspx&quot;&gt;OS X envy&lt;/a&gt; (I&#39;ve never seen so many geeks brandishing mac laptops), and I definitely feel mainstream now having an iPhone. In short, an unusually stylish and hip-geeky group compared to other conferences I&#39;ve been too.&lt;/p&gt;  &lt;p&gt;On the down side, the conference did seem a little unorganized at times, and there were slight problems with communicating the agenda and delays in presentations. Also, towards the end I felt a little fatigue with how witty the presenters were trying to be, and wished that I could see a little less funny Google image search results try to pass for presentation content.&lt;/p&gt;  &lt;p&gt;Also, much of the content wasn&#39;t directly relevant to me, but this wasn&#39;t a negative, as the purpose of going was to see something different. Even if I only understood 50% of some talks, I&#39;m still learning new keywords, practices, and ideas, and just seeing how everyone is using tools makes me reevaluate how I use various dev tools and even web apps.&lt;/p&gt;  &lt;p&gt;These are just some of my general impressions, but I&#39;ve taken notes from many of the presentations, and I&#39;ll be posting those over the next couple of days.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My Current Firefox Extensions</title>
   <link href="http://doingthedishes.com/2008/07/25/my-current-firefox-extensions.html"/>
   <updated>2008-07-25T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/07/25/my-current-firefox-extensions</id>
   <content type="html">&lt;p&gt;I got a new machine at the office towards the beginning of this week, and I&#39;ve spent the last few days installing and tweaking software. A lot of settings can be exported and imported with many programs and operating systems these days, so in a certain way having to reconfigure things seems like a waste of time. But recently I&#39;ve been relying on defaults more and more, and I can also use times like this to re-evaluate what settings and tools I really need.&lt;/p&gt;  &lt;p&gt;Maybe I&#39;m becoming old and curmudgeonly, but I&#39;m finding that I don&#39;t have the stomach anymore to spend tons of time tweaking and optimizing software settings. I was pleased to find that I&#39;ve settled on the following Firefox extensions after a few days of heavy use on the new machine:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/images/firefox-extensions-2008.jpg&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;570&quot; alt=&quot;FirefoxExtensions&quot; src=&quot;/images/firefox-extensions-2008.jpg&quot; width=&quot;454&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(And, actually, I could probably do without FaviconizeTab).&lt;/p&gt;  &lt;p&gt;I might end up adding or taking away a few here and there, but I think this is a good sign that I can get up and running with Firefox 3 quickly and that it provides a lot of functionality by default.&lt;/p&gt;  &lt;p&gt;As a side note, this reminds me of a Coding Horror post on &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001077.html&quot;&gt;The Dark Side of Extensions&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>X Envy</title>
   <link href="http://doingthedishes.com/2008/06/16/x-envy.html"/>
   <updated>2008-06-16T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/06/16/x-envy</id>
   <content type="html">&lt;p&gt;
In &lt;a href=&quot;http://venturebeat.com/2008/06/16/developers-developers-developers-ignoring-ignoring-ignoring-vista-vista-vista/&quot;&gt;this&lt;/a&gt; post from VentureBeat, a survey is cited saying that only 8 percent of developers are writing applications for Vista this year. While these claims don&amp;#39;t seem very substantial (I&amp;#39;m thinking that a more interesting question is how many developers are writing for .Net and not targeting Vista specifically over Windows XP), the following section nevertheless struck me:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	Granted, the 8 percent data is taken from only 380 North American developers surveyed, but over half of them said they were still developing for previous iterations of Windows. Meanwhile, Apple&amp;rsquo;s OS X has seen a 380 percent surge in growth as a targeted development platform. 
	&lt;/p&gt;
&lt;/blockquote&gt;
It seems for the past couple of years I&amp;#39;ve been steadily hearing about Mac OS X apps that make me envious. The other day, Andy Ihnatko mentioned one called &lt;a href=&quot;http://fluidapp.com/&quot;&gt;Fluid&lt;/a&gt; on MacBreak Weekly that allows you to create site specific browser applications. As someone who keeps Google Calendar and Gmail tabs open all day, an app that allows me to cleanly separate key web applications into their own space that is integrated well into the OS seems very appealing.   
&lt;p&gt;
But that&amp;#39;s just one example. Here are several other compelling Mac OS X apps that come to mind at this moment:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://macromates.com/&quot;&gt;Textmate&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://www.apple.com/iwork/keynote/&quot;&gt;Keynote&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://developer.apple.com/iphone/&quot;&gt;Development tools&lt;/a&gt; for the iPhone &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://docs.blacktree.com/quicksilver/what_is_quicksilver&quot;&gt;Quicksilver&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Apps from &lt;a href=&quot;http://www.panic.com/&quot;&gt;Panic&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://www.ambrosiasw.com/utilities/snapzprox/&quot;&gt;SnapzPro&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://www.apple.com/ilife/&quot;&gt;iLife&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://www.parallels.com/en/products/desktop/&quot;&gt;Parallels&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://skitch.com/&quot;&gt;Skitch&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Apps from &lt;a href=&quot;http://www.omnigroup.com/&quot;&gt;The Omni Group&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://iconfactory.com/software/twitterrific&quot;&gt;Twitterific&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href=&quot;http://growl.info/&quot;&gt;Growl&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Firefox* &lt;/li&gt;    
	&lt;li&gt;iTunes* &lt;/li&gt;    
	&lt;li&gt;VLC* &lt;/li&gt;    
	&lt;li&gt;Twhirl* &lt;/li&gt;    
	&lt;li&gt;Lightroom* &lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
&lt;font size=&quot;1&quot;&gt;* Ok, so I cheated a little and these are available for Windows too, but that&amp;#39;s part of the point.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Of course it&amp;#39;s easier to spout off a bunch of trendy apps than to actually derive value from them on an everyday basis, but I still can&amp;#39;t help but feel intrigued by the amount of exciting products coming out for OS X. Looking at the development tools available for the Mac, it doesn&amp;#39;t make me very envious (I&amp;#39;m thinking of you, Cocoa and Xcode), but yet there seems to be a vibrant community of Mac OS X focused developers who seem to be skilled in developing sophisticated and well-designed UIs.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m not sure where this stems from, and maybe it&amp;#39;s just my perspective at the moment, but it still seems like a factor that&amp;#39;s coming to the forefront.
&lt;/p&gt;
&lt;p&gt;
And, of course, there are several key applications for Windows that I just couldn&amp;#39;t do without such as Visual Studio.... and... maybe Microsoft Office... and... oh yeah, this issue tracking software we use at work, but wait... it has a web-based version...
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Maybe Developers Don't Even Know What They Want</title>
   <link href="http://doingthedishes.com/2008/05/12/maybe-developers-dont-even-know-what-they-want.html"/>
   <updated>2008-05-12T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/05/12/maybe-developers-dont-even-know-what-they-want</id>
   <content type="html">&lt;p&gt;While listening to a &lt;a href=&quot;http://www.parleys.com/display/PARLEYS/Home&quot;&gt;new podcast&lt;/a&gt; the other day, I stumbled up on an old presentation from a Java conference (Javapolis 2005) titled &quot;Perspectives on Agility&quot; by &lt;a href=&quot;http://en.wikipedia.org/wiki/Kevlin_Henney&quot;&gt;Kevlin Henny&lt;/a&gt;. While the talk, in general, contained several interesting points concerning agile development, one point peaked my interest in particular. I get the feeling that it&#39;s often said by developers (and I definitely know I&#39;m guilty of this) that &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000356.html&quot;&gt;the customer doesn&#39;t know what they want&lt;/a&gt;. More specifically, they don&#39;t know what they want until they see it, and by that time, a significant amount of effort might have already been devoted to a project and more work will be needed to correct things. This might be true, and even seems reasonable to accept this as a part of human nature (as agile methods commonly do), but what about developers? Do they exhibit the same behavior to some extent?&lt;/p&gt;
&lt;p&gt;In the presentation, Henney suggests that the most capable software engineers that could work on a software project are the ones that have seen it to its completion (or, just as likely, failure). Typical developers are constantly learning about the problem domain and may even significantly adjust their development tools and practices during a project. While the traditional waterfall process is often chided for its naive attitude towards changing requirements (which is ironic considering that in the &lt;a href=&quot;http://www.cs.umd.edu/class/spring2003/cmsc838p/Process/waterfall.pdf&quot;&gt;original paper&lt;/a&gt; describing the process it was never called a &quot;waterfall&quot; and the author even warned against using it), I wonder how many times when software is planned changing developer knowledge or habits are taken into account.&lt;/p&gt;
&lt;p&gt;When confronted once with a client who rejected &quot;agile&quot; software processes (the client having been burned before by a process describing itself as &quot;agile&quot;), Henney describes successfully re-branding his approach as a &quot;sustainable&quot; process. While he might have gotten some inherent acceptance owing to recent popular environmentalist attitudes, I think &quot;sustainable&quot; is a good term to describe a software development approach that accepts both changing customer requirements and perceptions as well as changing developer knowledge and habits.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Podcast Habits</title>
   <link href="http://doingthedishes.com/2008/04/26/podcast-habits.html"/>
   <updated>2008-04-26T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/04/26/podcast-habits</id>
   <content type="html">&lt;p&gt;While listening to the first episode of a new podcast by a pair of my favorite bloggers Jeff Atwood (of &lt;a href=&quot;http://www.codinghorror.com&quot;&gt;Coding Horror&lt;/a&gt; fame) and Joel Spolsky (from &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;JoelOnSoftware.com&lt;/a&gt;), I heard a discussion about their new developer community site &lt;a href=&quot;http://www.stackoverflow.com&quot;&gt;Stack Overflow&lt;/a&gt; and its associated podcast. They described the site, but also gave reasons for doing a podcast. This got me to thinking more about why I like listening to podcasts so much and which ones and what types of shows I have gravitated towards listening to since I started listening to them a few years ago.&lt;/p&gt;
&lt;p&gt;First, a disclaimer: If you don&#39;t like the idea of podcasts/audio books, that&#39;s perfectly fine. Some people tend to have an aversion to them and prefer the printed word. That&#39;s fine, and you&#39;re probably better off for it. Reading&#39;s better for you brain anyway, and you can consume information faster by reading than listening to it anyway, or something like that...&amp;nbsp;&amp;nbsp; So, you can just stop reading now and come back in another 2 months when I write my next post.&lt;/p&gt;
&lt;p&gt;Still with me? Here&#39;s another disclaimer: I am now sure that I have a weird, geeky, anti-social, possibly unhealthy podcast habit. I can&#39;t stop listening to them, all the time. I practically always have my iPhone&#39;s earbuds in: at work basically all day (I work on a project by myself and communicate mainly with my client through email), while I&#39;m at the gym, driving by myself (or, if my passengers are particularly uninteresting), while I&#39;m at home doing chores, basically most of the time. I&#39;m writing this listening to a podcast (&lt;a href=&quot;http://stage.arminvanbuuren.com/?id=38&quot;&gt;Armin Van Buuren&#39;s State of Trance&lt;/a&gt; music podcast). As such, what I&#39;m writing is coming from this perspective of podcastaholism. As soon as it&#39;s possible to get decent earphone implants, I&#39;m in. You need the right equipment to make this practical and seamless (read - an all in one pda/phone/media player). I&#39;m still loving the iPhone, and it look like there are plenty of these devices popping up and it&#39;s the way things are going. It&#39;s truly a geek orgasmic experience to be jogging while listening to a podcast, get a phone call from the Red Cross about setting up a donation, have the audio gently transition from iPod mode to phone mode (as the iPhone so slickly does), make the appointment, then be gently transitioned back to the audio program without skipping a beat.&lt;/p&gt;
&lt;p&gt;Enough disclaimers. Here&#39;s a few reasons why I love audio programs:&lt;/p&gt;
&lt;p&gt;Above all, you can listen to a podcast and still use your eyes. This means you can listen while commuting, while exercising, while working even. For my adult ADHD self, this always multi-tasking behavior is well suited.&lt;/p&gt;
&lt;p&gt;I don&#39;t get angry in traffic (really, never). In fact, if there&#39;s an accident and I&#39;m forced to stand in line an extra 20 or 30 minutes, I&#39;m actually a bit glad for these, what Dale Carnegie called, &quot;gifts of time&quot; and I&#39;m able to listen to more material.&lt;/p&gt;
&lt;p&gt;Podcasts make exercising fun. I love exercising now, both because of the runner&#39;s high thing, and because I get to listen to a (usually) stimulating audio program while I&#39;m at it.&lt;/p&gt;
&lt;p&gt;When I can pair doing chores with listening, it makes them enjoyable. There&#39;s nothing like ironing clothes while learning about &lt;a href=&quot;http://www.lonelyplanet.com/travelstories/podcast/mardigras_sydney_0308/&quot;&gt;Sydney&#39;s Gay and Lesbian Mardis Gras&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;People speak or converse differently than they write. While with good writing you can express a complex thought maybe more elegantly and definitely more concisely than with speech, listening to someone explain something or a group talk about something of interest gives you a better feeling for their personalities and tends to bring out more dynamic, improvised, and somewhat cruder thoughts (like everyday conversation). This can go either way. While there are many delightful, entertaining, and intelligent speakers, I&#39;ve been unpleasantly surprised several times by how people (&lt;a href=&quot;http://dvorak.org/blog&quot;&gt;John Dvorak&lt;/a&gt;, Joel Spolsky, &lt;a href=&quot;http://twit.tv/ww&quot;&gt;Paul Thurrott&lt;/a&gt; come to mind) can be fairly competent writers but stumbled through hours of bad jokes and off topic side conversation that forces me to skip to the next show in my queue.&lt;/p&gt;
&lt;p&gt;I&#39;m able to get a very candid and personal impression of various personalities or micro-celebrities. I&#39;m a motorcycle racing fan, and it&#39;s very entertaining to hear a &lt;a href=&quot;http://www.motoliam.com/&quot;&gt;mechanic and blogger&lt;/a&gt; on one of Ducati&#39;s teams speak about his experiences traveling around the globe on the excellent &lt;a href=&quot;http://www.motogpod.com/&quot;&gt;MotoGPod&lt;/a&gt; podcast.&lt;/p&gt;
&lt;p&gt;I can also hear from professionals closer to my field, such as on the &lt;a href=&quot;http://media.djangonetcasts.com/twid_mp3.xml&quot;&gt;This Week in Django&lt;/a&gt; podcast. To hear insightful talk from core Python developers data access and internationalization problems is fascinating. As a developer dealing with bugs everyday, it&#39;s particularly fun and a little comforting to hear from prominent developers on a major project deal with nuanced issues and committing fixes to a public source control repository (they discuss specific changesets even!).&lt;/p&gt;
&lt;p&gt;I think it can be a good educational tool (if used correctly). Most notably for me, I think it&#39;s helped me as I try to learn Russian. It seems important to be exposed to a lot of spoken language if you&#39;re trying to learn another tongue to get a halfway-decent pronunciation, and I it has helped me listening and repeating the Pimsleur Russian courses and various podcasts aimed at those learning Russian (although Jamila and my Russian-speaking friends might disagree :).&lt;/p&gt;
&lt;p&gt;There are disadvantages I&#39;ve found. It&#39;s anti-social to walk around other people (especially co-workers or your girlfriend) with earbuds in for a very long time while tuning them out. I&#39;ve had to learn how to politely take the earbuds out and pretend like I&#39;m listening. I still can&#39;t decide if it&#39;s dangerous to drive with earphones, but this is probably fine judging by how many crazy drivers I see without earphones in or listening to loud crappy music blaring as they barrel down the interstate. Also, I have to be careful of what material I listen to when. It&#39;s possible to listen to a &lt;a href=&quot;http://www.radio538.nl/web/show/id=96445&quot;&gt;dance podcast&lt;/a&gt; or two while programming, but if there&#39;s a show that is particularly technical or detail oriented, I&#39;d better save that for a jog sometime.&lt;/p&gt;
&lt;p&gt;I&#39;m posted a list of the podcasts I listen to &lt;a href=&quot;/files/podcasts-2008-04-26.txt&quot;&gt;here&lt;/a&gt;. It&#39;s really a .opml (podcast subscription file) but named &quot;podcasts.txt&quot; (because I couldn&#39;t get my web server to serve it correctly), so you can rename it as .opml to use with iTunes, etc or just browse through it in plain text if that&#39;s not your interest.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Queryable Endpoints</title>
   <link href="http://doingthedishes.com/2008/04/04/queryable-endpoints.html"/>
   <updated>2008-04-04T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/04/04/queryable-endpoints</id>
   <content type="html">&lt;p&gt;It&#39;s been several weeks since I went to the Alabama Code Camp that was held here in Huntsville, but there&#39;s been one concept that was mentioned in a session that I think has noticeably changed my development habits. It&#39;s something I heard mentioned in a talk by &lt;a href=&quot;http://adoguy.com/&quot;&gt;Shawn Wildermuth&lt;/a&gt; about Microsoft&#39;s Astoria project: &lt;em&gt;queryable endpoints&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;I think the core idea is that, when structuring a database&#39;s schema or when writing data access code, it helps to keep a data model simple and avoid baking inappropriate aspects into it such as aggregate columns or a default sort order. One&#39;s goal should instead be to create an understandable, clean model that allows its consumers to transform data themselves (via filtering, sorting, summing columns together, etc).&lt;/p&gt; &lt;p&gt;In the talk, Shawn discussed how the Microsoft data access team is trying to build one solution for this with Astoria. The stated goal of Astoria is &quot;to facilitate the creation of flexible data services that are naturally integrated with the web&quot;. In its simplest form, it basically allows you to expose data in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;RESTful&lt;/a&gt; manner via URLs like this:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;http://server/data.svc/Customers&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;which returns a list of Customer entities, or in a more specific way like:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;http://server/data.svc/Customers(’ALFKI’)/Orders?$filter=Active eq true&amp;amp;$orderby=OrderDate&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The caller can request that entities be returned in JSON or ATOM format, and the format can be chosen with a flag in the HTTP request header. It seems Astoria provides the mechanism for such communication, but the back end (how you talk with data sources) can be constructed in a variety of ways using .NET (talking to XML files, various databases using ODBC, even remote web services). &lt;/p&gt; &lt;p&gt;While Astoria sounds very exciting, and I hope I get to play with it sometime, just keeping the concept of queryable endpoints conscious has proven beneficial to me on my current project in the past couple weeks. After the code camp talk, I looked back and saw where me and my team had violated this idea in a few particular ways: we had created many inflexible, overly-specific stored procedures in the database such as &quot;GetUsersByLastLoginTimeDesc&quot; and also ones that retrieved records given a filter which ended up being raw SQL (which is certainly not a very maintable practice). &lt;/p&gt; &lt;p&gt;While these may be very glaring examples, sometimes the decisions can be a little more subtle and easier to slip through. This week as I was creating a new data structure as part of the data access layer component of our application, I found myself throwing in an aggregate field which summed together several others. The data structure was to be used in forming a data grid for a specific page and this would have made things easier for that particular page, but I saw where it could easily be useful elsewhere and wanted to of course make it generic. It was a little more work to therefore customize the data grid on my page to create an aggregate column, but looking back I can easily see where that was the proper place to put that piece of logic.&lt;/p&gt; &lt;p&gt;A lot of this is probably common sense or just a feel for software engineering that I haven&#39;t quite development yet, but I think keeping this idea in mind has helped me to put code in the right place.&lt;/p&gt; &lt;p&gt;Related Links:&lt;br&gt;&lt;a href=&quot;http://astoria.mslivelabs.com/Default.aspx&quot;&gt;ADO.NET Data Services (Formerly Astoria) Page&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://adoguy.com/&quot;&gt;ADO Guy&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.hanselman.com/blog/HanselminutesPodcast97ADONETQuotAstoriaquotDataServicesWithShawnWildermuth.aspx&quot;&gt;Hanselminutes Podcast 97 - ADO.NET &quot;Astoria&quot; Data Services with Shawn Wildermuth&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Last.fm</title>
   <link href="http://doingthedishes.com/2008/03/24/lastfm.html"/>
   <updated>2008-03-24T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/03/24/lastfm</id>
   <content type="html">&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;/images/lastfm-compatibility.png&quot;&gt;&lt;img style=&quot;border-width: 0px&quot; src=&quot;/images/lastfm-compatibility.png&quot; border=&quot;0&quot; alt=&quot;image&quot; width=&quot;182&quot; height=&quot;229&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve been using &lt;a href=&quot;http://www.last.fm&quot;&gt;Last.fm&lt;/a&gt; for awhile now and (after a break) I&amp;#39;ve started using it again and placed a widget on this site for it (see sidebar). Last.fm is a social music sharing site that let&amp;#39;s you &amp;quot;scrobble&amp;quot; songs (when you listen to music, the name of the song is sent to Last.fm and added to your music profile) and based on your listening trends you can discover artists you might like or connect with people who share your tastes. You can scrobble a few ways, including using the Last.fm &lt;a href=&quot;http://www.last.fm/download/&quot;&gt;client&lt;/a&gt; (which logs whatever you&amp;#39;re playing in Winamp, iTunes, etc or let&amp;#39;s you listen to personalized internet radio channels) or you can use a plug in such as &lt;a href=&quot;http://www.last.fm/group/iSproggler&quot;&gt;iSproggler&lt;/a&gt; which logs plays from your iPod whenever you sync (I mostly do the latter). You can even listen to music through the site fairly easily.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.last.fm/user/dmorrison/&quot;&gt;Here&amp;#39;s&lt;/a&gt; my profile page, and &lt;a href=&quot;http://www.last.fm/user/ko4ka/&quot;&gt;here&amp;#39;s&lt;/a&gt; my music obsessed friend Sergey&amp;#39;s. We have a music compatibility rating of &amp;quot;Medium&amp;quot; and, although I can deduce this by common sense, it&amp;#39;s strangely comforting to be reassured by a cold, statistical algorithm. 
&lt;/p&gt;
&lt;p&gt;
After gathering enough data, it&amp;#39;s exciting to look back and see your listening trends (just please ignore my fifth top artist at the time of this writing). 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;UPDATE (Mar 25, 08)&lt;/strong&gt;: I just found the &lt;a href=&quot;http://dev.c99.org/MobileScrobbler/&quot;&gt;MobileScrobbler&lt;/a&gt; app for the iPhone! Unfortunately you must have a jail-broken iPhone to install it until official iPhone apps are ready (this is the first time I&amp;#39;ve wanted to jail-brake my phone). Would be spectular to have whatever you listen to whereever you are be instantly logged (if you&amp;#39;re a heavy iPod type user) or just be able to listen to Last.fm radio on the go. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Plans to Open ASP.NET MVC Source</title>
   <link href="http://doingthedishes.com/2008/02/13/plans-to-open-aspnet-mvc-source.html"/>
   <updated>2008-02-13T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/02/13/plans-to-open-aspnet-mvc-source</id>
   <content type="html">&lt;p&gt;From a developer perspective, I like a lot of the ways that Microsoft is heading, especially concerning web development. Despite the bad press they get for many consumer products (think Vista&#39;s poor adoption rate, XBox 360 hardware failures, and the lackluster Zune), they have a lot of exciting development tools both existing and upcoming. This may be the naive fan-boy in me talking, but I also like the more open and progressive attitude they&#39;re taking on many fronts. Here&#39;s an excerpt from &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2008/02/12/asp-net-mvc-framework-road-map-update.aspx&quot;&gt;a recent post&lt;/a&gt; by &lt;a href=&quot;http://en.wikipedia.org/wiki/Scott_Guthrie&quot;&gt;Scott Guthrie&lt;/a&gt; about the new ASP.NET MVC framework:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Last month I announced that the &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx&quot;&gt;.NET Framework source code can now be downloaded and debugged&lt;/a&gt;.&amp;nbsp; Ultimately once it ships the ASP.NET MVC framework will be available via this mechanism as well (just like the rest of the ASP.NET source code).  &lt;p&gt;Starting with this next preview, we are also going to make the ASP.NET MVC Framework source code downloadable as a buildable VS project solution.&amp;nbsp; This will enable you to easily view and debug the ASP.NET MVC Framework source code.&amp;nbsp; We are also going to include a license that permits you to optionally make patches to the ASP.NET MVC Framework source code in the event that you run into a bug in an application you are developing with it.&amp;nbsp; &lt;p&gt;The license won&#39;t enable you to redistribute your patched version of ASP.NET MVC (we want to avoid having multiple incompatible ASP.NET MVC versions floating around and colliding with each other).&amp;nbsp; But it will enable developers who want to get started building ASP.NET MVC applications immediately to make progress - and not have to worry about getting blocked by an interim bug that they can&#39;t work around.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It&#39;s good to hear that coming from a prominent manager and the co-creator of ASP.NET.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>IE 8 and Version Targeting</title>
   <link href="http://doingthedishes.com/2008/02/08/ie-8-and-version-targeting.html"/>
   <updated>2008-02-08T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/02/08/ie-8-and-version-targeting</id>
   <content type="html">&lt;p&gt;There&#39;s been &lt;a href=&quot;http://www.digital-web.com/news/2008/01/IE8_Version_Targeting_causes_quite_a_stir&quot;&gt;quite a response&lt;/a&gt; to Internet Explorer 8&#39;s proposed system of Version Targeting. If you haven&#39;t heard of this, here&#39;s a quick overview: the IE team is proposing that there be a metadata tag recognizable by IE 8 that will instruct it how to render a page (as IE 6, IE 7, or IE 8). If the tag isn&#39;t present, then the default will be IE 7.&lt;/p&gt;
&lt;p&gt;Why is this needed? Because the IE developers have a huge dilemma: version capability. They have loads and loads of sites designed specifically for IE 6 (for various reasons, some nefarious -won&#39;t go there) and had to make many compromises when designing IE 7 to maintain backwards compatibility while receiving a lot of flack from the web design community that IE 7 didn&#39;t do enough to address standards compliance. IE 8 just having &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2007/12/19/internet-explorer-8-and-acid2-a-milestone.aspx&quot;&gt;passed the Acid2 test&lt;/a&gt;, there will probably be a lot of breaking changes in it that could harm tons of existing sites.&lt;/p&gt;
&lt;p&gt;This seems to me like an elegant solution. They can effectively freeze existing sites to use IE 7 (since they don&#39;t specify the meta tag and will get an IE 8 rendering) while allowing web designers to explicitly take advantage of more advanced features and better standards compliance of IE 8.&lt;/p&gt;
&lt;p&gt;From a developer perspective, this seems natural. I&#39;m used to writing .Net code that&#39;s bound to a specific version of the .Net runtime, just as Java developers are with the JRE, PHP developers with the PHP runtime, etc. Rendering differences of HTML, CSS, and JavaScript across browsers are brutal for developers, and even though practices like &lt;a href=&quot;http://en.wikipedia.org/wiki/Progressive_enhancement&quot;&gt;progressive enhancement&lt;/a&gt; can help, it seems that version targeting (if widely supported) could make developers lives a lot easier. Software engineering is hard enough.&lt;/p&gt;
&lt;p&gt;Instinctively, however, this may give off a bad Microsoft anti-competitive IE-only vibe. It reminds me a little of pages detecting your browser and denying access if you&#39;re not running IE. Browser sniffing has a fairly unreliable history as a technique and browser makers have often been misleading to put it mildly. In the past, Opera has placed &quot;MSIE&quot; in their user agent string, and at one point Safari had the phrase &quot;like Gecko&quot; in theirs (with unintended consequences that you can probably imagine if you&#39;ve ever had to parse a string).&lt;/p&gt;
&lt;p&gt;This is not like browser detection - &lt;strong&gt;it goes the other way&lt;/strong&gt;. The metadata signal allows a web page to establish a contract between the page and the browser.&lt;/p&gt;
&lt;p&gt;From what I&#39;ve read, there seems to be a lot of negative perspectives on this issue, but here are a few voices I&#39;ve run across that seem to have a more practical view of the situation:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://alistapart.com/articles/fromswitchestotargets&quot;&gt;http://alistapart.com/articles/fromswitchestotargets&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.boagworld.com/archives/2008/02/110_the_mighty_meyer.html&quot;&gt;http://www.boagworld.com/archives/2008/02/110_the_mighty_meyer.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.quirksmode.org/blog/archives/2008/01/the_versioning.html&quot;&gt;http://www.quirksmode.org/blog/archives/2008/01/the_versioning.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/ie/archive/2008/01/21/compatibility-and-ie8.aspx&quot;&gt;http://blogs.msdn.com/ie/archive/2008/01/21/compatibility-and-ie8.aspx&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Academic Versus Real World Development</title>
   <link href="http://doingthedishes.com/2008/01/17/academic-versus-real-world-development.html"/>
   <updated>2008-01-17T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/01/17/academic-versus-real-world-development</id>
   <content type="html">&lt;p&gt;I think I&#39;ve decided to take a break from my graduate course work at Auburn. I had a terrible time with the class I took last Fall (Formal Methods for Software Engineering) and this has discouraged me from continuing with school.&lt;/p&gt;  &lt;p&gt;Not that I needed a big push, on the one hand: it&#39;s hard to work a regular job and have the discipline to come home and watch classes during the week, do regular homework and class projects, take exams, etc. And it can seem difficult to try to push yourself to learn seemingly abstract concepts that might not be directly applicable to the current technology you&#39;re using at work. [more]&lt;/p&gt;  &lt;p&gt;However, hopefully I&#39;m not being lazy and whiney. The formal methods class I took was about logically proving programs to be correct. In it, we learned a specification language called &amp;quot;Z&amp;quot; and tried to prove, using logical axiomatic systems, trivial programs that took many hours of thought and many pages of notes to prove. This is an interesting concept, but currently it seems not to be held as a very useful thing in software engineering practice. There are only a handful of mostly specialized examples of applications that I came across while taking the class, and I didn&#39;t really find any modern tools that use this in practice. Given this probably biased description of the class, it&#39;s probably easy to see the friction I felt while doing my course work at night, and trying to solve &amp;quot;real world&amp;quot; software engineering problems in the day at work.&lt;/p&gt;  &lt;p&gt;Coincidentally, I saw several blog entries pop up in my feed reader towards the end of last year that seemed to express this same sentiment. Famed blogger &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel Spolsky&lt;/a&gt;, in a &lt;a href=&quot;http://www.joelonsoftware.com/items/2007/12/03.html&quot;&gt;talk&lt;/a&gt; given to the computer science department at Yale, had this to say about the best course in computer science he ever took:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I worked on that problem for hours and hours. I had her original proof in front of me, going in one direction, which, upon closer examination, turned out to have all kinds of missing steps that were &amp;#8220;trivial,&amp;#8221; but not to me. I read every word about Dynamic Logic that I could find in Becton, and I struggled with the problem late into the night. I was getting absolutely nowhere, and increasingly despairing of theoretical computer science. It occurred to me that when you have a proof that goes on for pages and pages, it&amp;#8217;s far more likely to contain errors in the proof as our own intuition about the trivial statements that it&amp;#8217;s trying to prove, and I decided that this Dynamic Logic stuff was really not a fruitful way of proving things about actual, interesting computer programs, because you&amp;#8217;re more likely to make a mistake in the proof than you are to make a mistake in your own intuition about what the program &amp;#8220;f := not f&amp;#8221; is going to do. So I dropped the course, thank God for shopping period, but not only that, I decided on the spot that graduate school in Computer Science was just not for me, which made this the single most useful course I ever took. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;ASP.NET developer and blogger &lt;a href=&quot;http://haacked.com/&quot;&gt;Phil Haack&lt;/a&gt; related &lt;a href=&quot;http://haacked.com/archive/2007/11/16/what-exactly-are-you-trying-to-prove.aspx&quot;&gt;an experience he had in college&lt;/a&gt; solving math problems with the importance of testing in software practice versus provability:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;...trying to prove the correctness of computer programs is a lot like trying to solve a set of partial differential equations. It works great on small trivial programs, but is incredibly hard and costly on anything resembling a real world software system.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And, most recently, .Net developer &lt;a href=&quot;http://ayende.com/Blog/Default.aspx&quot;&gt;Oren Eini&lt;/a&gt; also commented on &lt;a href=&quot;http://ayende.com/Blog/archive/2008/01/12/Academia-in-Real-World-Development.aspx&quot;&gt;the appropriateness of using academic knowledge in the field&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Finding a path in a graph? Design a compiler? Analyzing an image? Choosing a search algorithm? Selecting appropriate data structure for a task?&lt;/p&gt;    &lt;p&gt;For each of those I would head for the academia, directly. Those are technical issues, and I want the academic proofs and experience there. I want the mathematical foundation for the solution. &lt;/p&gt;    &lt;p&gt;Designing a maintainable system? Building a usable framework? Creating the domain model? &lt;/p&gt;    &lt;p&gt;For those I am going to not going to go to the academia. I am going to go to the real world practitioner. They guys (and gals) that have been burned in the field and learned from their mistakes.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I don&#39;t think the graduate level CS courses are totally useless, by far, and I might even get the urge to continue my degree later, but for now, I&#39;m going to focus on learning more practical technologies and drinking gently from the fire-hose of new languages, frameworks, and tools that are constantly being churned out of the interwebtubes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Scott Hanselman on CodeMash</title>
   <link href="http://doingthedishes.com/2008/01/11/scott-hanselman-on-codemash.html"/>
   <updated>2008-01-11T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/01/11/scott-hanselman-on-codemash</id>
   <content type="html">Scott Hanselman has a short post about CodeMash &lt;a href=&quot;http://www.hanselman.com/blog/CodeMash2008WrapupWhatAreYouWorkingOn.aspx&quot;&gt;here&lt;/a&gt;, and I think he describes the general spirit of openness and collaboration between languages promoted at the conference well.
</content>
 </entry>
 
 <entry>
   <title>CodeMash Report</title>
   <link href="http://doingthedishes.com/2008/01/10/codemash-report.html"/>
   <updated>2008-01-10T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2008/01/10/codemash-report</id>
   <content type="html">&lt;p&gt;
I drove up to Sandusky, OH yesterday, and attended the first of two days of the CodeMash conference today. Here are some of my impressions:
&lt;/p&gt;
&lt;p&gt;
But first, a tangent...
&lt;/p&gt;
&lt;p&gt;
On my way there, I was caught speeding in Kentucky (80 in 55 zone - bummer). Luckily, I got off with a warning, but the copy asked if he could use the drug sniffing dog in the back of his SUV to search my car for drugs (I think he noticed the curious pill box full of vitamins I had sticking out of a bag in the passenger seat). &amp;quot;Sure!&amp;quot;, I said, just happy to not be getting a ticket. So, I got out of the car (in a white t-shirt and comfortable jeans, redneck style), while another cop car arrived (making the total 3, because 2 cars pulled me&amp;nbsp; over). So, I&amp;#39;m standing beside the interstate in my t-shirt with 3 cop vehicles behind me and a very spirited German sheperd sniffing his way around and inside the car, when suddenly the dog signals that my bag has something in it. Great. To shorten things a bit, basically I ended up successfully convincing the cops that somehow the dog must be confused with my vitamins, and eventually they let me go. Whew! So glad they didn&amp;#39;t search in the gas tank, though ;) 
&lt;/p&gt;
&lt;p&gt;
Sorry - back to the conference.
&lt;/p&gt;
&lt;p&gt;
The opening keynote, I think, summed up the current state of software engineering nicely: SE is, at its current state, at the same point that structural engineers building bridges were at when they didn&amp;#39;t understand physics and math enough to be able to successfully specify bridges and ended up building one, rolling a cart across it, and, if it fell, then they knew they needed to improve things and try again. Fortunately, testing in SE is much cheaper that said bridge testing and, for the time being, &lt;strong&gt;testing is the engineering underpinning of software&lt;/strong&gt;. Since software is the stuff of thought, and we don&amp;#39;t have physical laws to rely on (as civil engineers do), test driven development seems to be the way to go (so they say).&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
That being said, there seemed to be common theme of test driven development throughout the session talks. This has another side affect as well - TDD seems to deemphasize slightly the role of compiliers and strongly-typed languages (such as Java, C#, C++, etc), since the compiler error messages shouldn&amp;#39;t be trusted as a measure of code quality as much as unit tests should. Therefore, there seems to be another trend throughout the sessions of meriting various dynamic languages (such as Ruby, Python, Groovy, and JavaScript). Interestingly, people are often choosing to run these languages on top of established runtimes (such as Java&amp;#39;s JVM or .Net&amp;#39;s CLR). So, basically, instead of writing Java code to run on the Java runtime, you can write Ruby code which compiles to Java bytecode and is executed on the established and stable JVM. Someone quoted Martin Fowler in a talk today as saying that Java&amp;#39;s legacy won&amp;#39;t be the Java language itself, but the runtime. One way of thinking about this is that the Java language could be used for more lower level programming on the JVM while you could leverage a more loosely-typed and possibly productive language to write your main application code. Talk about layers of abstraction! 
&lt;/p&gt;
&lt;p&gt;
There is also several sessions being presented about Rich Internet Applications (such as Microsoft Silverlight and Adobe Flex). I was able to see back to back talks today about Silverlight and Flex, and it made for an interesting comparison of the types of developers that are attentive to these two platforms. Enthusiasm for the promise of Silverlight seems to be very high, although it&amp;#39;s still in the fairly early stages. Attendance at the Silverlight talk was high, while that of the Adobe Flex talk not so much (I&amp;#39;m note sure why - maybe it&amp;#39;s just the demographics at this conference or region, or maybe it&amp;#39;s that Microsoft has a stronger developer prescence than Adobe). Silverlight&amp;#39;s strategy certainly seems to be solid, with good developer and design tools, but what can be accomplished with it is still mainly limited to video deliverly or basic rich clients. Adobe Flex, on the other hand, seems to be much more mature in control support and interface mastery (although code is still mainly written in ActionScript, compared with the .Net languages that Silverlight can leverage). I was very impressed with the sophisticated demoes that the Adobe evangelist demonstrated with Flex and also AIR. They really seem to grok UI design. Slick.
&lt;/p&gt;
&lt;p&gt;
Another great presentation was given by one of my favorite podcasters, Scott Hanselman (now working at Microsoft), who gave a very entertaining presentation on IIS 7 called &amp;quot;Mashing it up with IIS 7&amp;quot;. I think his talk partially reflects the more open stance Microsoft is trying to promote now, as he demonstrated how he could integrate PHP and ASP.NET by plugging the PHP Qdig photo gallery library alongside ASP.NET and using functionality from both platforms. Very interesting stuff, IMHO, but he seemed to have a hard time getting the audience into it - looks like it&amp;#39;s hard to convince a general audience that Microsoft is not evil.
&lt;/p&gt;
&lt;p&gt;
Lastly, I saw a sponsored session by several developers from Amazon. What was intersting about it was its lack of interstingness. The audience kept probing for some secret IT processes that they use interally that explains the company&amp;#39;s wild success, but all we got were simple, mundance answers. I&amp;#39;m now convinced that they fuel their fire by hiring super genius developers and maintaining a humongous QA department. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New respect for JavaScript</title>
   <link href="http://doingthedishes.com/2007/12/13/new-respect-for-javascript.html"/>
   <updated>2007-12-13T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/12/13/new-respect-for-javascript</id>
   <content type="html">&lt;p&gt;
I&amp;#39;ve been watching some great videos over at Yahoo&amp;#39;s &lt;a href=&quot;http://developer.yahoo.com/yui/theater/&quot; target=&quot;_blank&quot;&gt;YUI Theater&lt;/a&gt; and have especially enjoyed ones about JavaScript and Ajax by Douglas Crockford (a JavaScript architect at Yahoo). Listening to his talks, I&amp;#39;ve come to respect JavaScript more. As a programming language, it has a very interesting &lt;a href=&quot;http://en.wikipedia.org/wiki/JavaScript#History_and_naming&quot;&gt;history,&lt;/a&gt; and although it has many deficiences, it&amp;#39;s actually a very powerful, expressive, and in many ways innovative language. [more]It supports some interesting programmatic constructs: objects are associate arrays (obj.x = 10 and obj[&amp;quot;x&amp;quot;] = 10 are equivalent, it uses prototypal inheritance (instead of inheriting from classes, objects just inherit from other objects), and functions are first class (meaning functions are objects and can be acted on just as regular objects - a very &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_programming_language&quot; target=&quot;_blank&quot;&gt;Lisp&lt;/a&gt;-like idea - JavaScript is probably the only mainstream language that supports this). JavaScript was partially designed to be lightweight, script version of Java hosted in a web browser (initally Netscape Navigator), and yet today it is better than Java in applications that Java was originally intended for. 
&lt;/p&gt;
&lt;p&gt;
However, JavaScript does have many problems. Weak typing can be a turn-off for programmers familiar with more traditional, strongly-typed languages. JavaScript&amp;#39;s runtime is the web browser, and differences in browsers has caused havoc over the language&amp;#39;s history. Pile on top of that design errors in the language, a poor official standard by ECMA, and inferior development environments, and you can see why many &amp;quot;serious&amp;quot; programmers might be hesitant to work with it. In fact, there has been a lot of effort to insulate developers from JavaScript (take the &lt;a href=&quot;http://code.google.com/webtoolkit/&quot; target=&quot;_blank&quot;&gt;Google Web Toolkit&lt;/a&gt;&amp;#39;s strategy [Java to JavaScript] or Microsoft&amp;#39;s &lt;a href=&quot;http://channel9.msdn.com/ShowPost.aspx?PostID=324060&quot; target=&quot;_blank&quot;&gt;Volta&lt;/a&gt; [.Net to JavaScript] as examples - there are many others as well). I like a comment I heard recently in an interview with Erik Meijer (one of Volta&amp;#39;s principal architects), in which he said something like, &amp;quot;We&amp;#39;re viewing JavaScript as a nice, cross browser, cross platform runtime. It&amp;#39;s a good runtime, but you don&amp;#39;t want to work with JavaScript as a language.&amp;quot; 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Home Theater PC Experiences</title>
   <link href="http://doingthedishes.com/2007/11/28/home-theater-pc-experiences.html"/>
   <updated>2007-11-28T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/11/28/home-theater-pc-experiences</id>
   <content type="html">&lt;p&gt;
I first tried setting up a home theater PC several years ago when I upgraded my then current computer and happen to have a spare machine and TV tuner card laying around. That first install didn&amp;#39;t turn out so well: the machine was an underpowered Pentium III, my wireless network was too slow to stream video well (802.11b was the standard then), and even if I would have run an Ethernet cable across my apartment, the picture was so horrifying on my 27&amp;quot; CRT TV when I hooked my PC to it that it wouldn&amp;#39;t have mattered anyway. It was just too early, and I didn&amp;#39;t have the necessary, then-expensive equpment to make a HTPC (home theater PC) work. [more]&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Fast forward about 4 years, and things have improved. Living rooms are being equipped with bigger and sharper screens, the use of digital music and even video has become more widespread, people are becoming accustomed to more advanced forms of recording and time shifting cable TV with tools such as Tivo, and there are several good options for bringing digital music and movies into the living room, often while enhancing cable TV. Microsoft has been pushing its &lt;a href=&quot;http://www.microsoft.com/windows/products/windowsvista/features/details/mediacenter.mspx&quot;&gt;Media Center&lt;/a&gt; software for awhile now (packaged with select editions of Windows XP and now Vista) as an option for running a PC on your TV, Apple has leveraged their popular iTunes music and video store service to provide a solution ala &lt;a href=&quot;http://www.apple.com/appletv/&quot;&gt;Apple TV&lt;/a&gt;, and there are several other standalone network media players from companies like &lt;a href=&quot;http://www.dlinkshop.com/product.asp?sku=2691086&quot;&gt;D-Link&lt;/a&gt; and &lt;a href=&quot;http://gizmodo.com/gadgets/home-entertainment/linksys-announces-kiss-1600-network-media-player-244539.php&quot;&gt;LinkSys&lt;/a&gt; as well as software packages that can be added to Linux and Windows (MythTV, SageTV, GBPVR, etc). Since I&amp;#39;m a Windows power user and burgeoning Microsoft fanboy, I&amp;#39;ve tended to really only use Windows Media Center software, so this is what I&amp;#39;ll be detailing in this post. 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve been using Windows Media Center for awhile now. Before building my latest machine, I had Windows XP Media Center Edition installed on my 4 year old Athlon machine, with good results. Media Center Edition is just like XP, but includes the Media Center program front end, which gives you easy access to TV (live, recorded, as well as a TV schedule - provided you have a TV tuner card or device) and your media (pics, music, videos). When we had cable, I would often schedule TV shows to record and view them later when more convenient (just like a Tivo - but viewable only on the computer). Things worked fairly well, and I was really happy with usability of the media center software.&amp;nbsp;  
&lt;/p&gt;
&lt;p&gt;
When I built a new main computer, I upgraded some components on my old box (see my upgrade album &lt;a href=&quot;http://www.flickr.com/photos/derekmorrison/sets/72157603323827778/&quot;&gt;here&lt;/a&gt;) and installed Windows Vista Ultimate (they don&amp;#39;t have a Media Center Edition anymore, but instead include the media center portion with the Home Premium and Ultimate editions). The interface has been refined a bit, but still seems very similar to the Windows Media Center 2005 edition. This interface is very polished and usable, with large, easy to read text and icons showing that it&amp;#39;s best viewed at full screen on a TV. The interface can easily be navigated with the directional arrows on a keyboard or (preferably) with some type of media center remote (more on this later). The interface is very intuitive, and after a minimal amount of setup, it&amp;#39;s very easy to start programming in shows and watching various media. For a more refined description of the Media Center interface, you might want to read the Windows Media Center section of this &lt;a href=&quot;http://www.winsupersite.com/reviews/winvista_05g.asp&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;review&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
To the best of my knowledge, it uses Windows Media Player internally to play everything. At first glance, this means that, by default, it will only play files that WMP will play. However, in practice this really hasn&amp;#39;t been an issue, as, after installing a codec pack (like ones &lt;a href=&quot;http://www.cccp-project.net/&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;here&lt;/a&gt; or &lt;a href=&quot;http://www.softpedia.com/get/Multimedia/Video/Codec-Packs-Video-Codecs/Advanced-Vista-Codec-Package.shtml&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;here&lt;/a&gt;), it plays all the common video formats very well.
&lt;/p&gt;
&lt;p&gt;
Media Center scans your computer for media and makes it available without too much fuss, and, as I store my iTunes music library on the same machine, I am able to browse my music collection pretty well from Media Center without having to jump to iTunes. Accessing shared media is easy, also. Currently I have shares on a different computer for TV shows and movies, and you can fairly easily tell media center to monitor these shared folders for content and automatically update.&amp;nbsp; As for TV, I can&amp;#39;t really say much: Jam and I cancelled cable awhile back (although I&amp;#39;m sure it would work fine as a Tivo-like device). One other note: it seems Microsoft has partnered with many news and entertainment companies to develop specialized plugins for Media Center, and these are available in a section of the Media Center interface (one example of note is access to MTV&amp;#39;s Overdrive portal, where you can view many MTV shows and access tons of music videos online for free - very slick).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Although I&amp;#39;m very happy with my current setup, there are several problems I&amp;#39;ve stumbled upon while using Media Center. For one, you need a pretty decent machine with a good graphics card to run Vista very well (after all, you are running a full install of Windows). Although my four year old machine is holding up fairly well, I&amp;#39;ve installed more memory, a faster and more spacious hard drive, and a specialized HTPC case and am in need of another video card (the onboard video I have now is just not cutting it, although it&amp;#39;s usable, and periodically crashes because of a driver issue - not Vista&amp;#39;s fault, but an annoyance nevertheless). Understand this can run you into some money, and it may be cheaper to buy an integrated solution rather than piecing together a custom system (although, if you&amp;#39;re a tinkerer like me, it might not be quite as fun). Also, since, again, you&amp;#39;re running a full install of Windows, the setup can seem more complex than your typical piece of stereo or cable TV equipment (although this can also be viewed as an advantage, because you have more flexibility if you want to run custom software, browse the net sometime, or maybe watch a YouTube or &lt;a href=&quot;http://dynamic.abc.go.com/streaming/landing&quot;&gt;ABC online&lt;/a&gt; clip). Another thing to consider is the screen you&amp;#39;ll be using the Media Center with. I actually bought my TV (a flat panel LCD - basically just an oversized computer monitor) with my HTPC setup in mind. Although the Media Center software can be left open for most of the time, for those times when you&amp;#39;re setting up the system or running regular Windows apps, you probably want to have a clear, readable picture rather than what you might get from a lot of TVs not designed for computer use. Also, there&amp;#39;s the issue of an input device: while I&amp;#39;m currently using a standard wireless keyboard and mouse, this is often cumbersome, and something like a specialized media mouse (like &lt;a href=&quot;http://www.amazon.com/Kensington-SlimBlade-Wireless-Controller-K72282US/dp/B000VE8BKQ&quot;&gt;here&lt;/a&gt; or &lt;a href=&quot;http://www.ecoustics.com/dt/1554&quot;&gt;here&lt;/a&gt;) or an all in one keyboard and trackball (like &lt;a href=&quot;http://www.microsoft.com/hardware/mouseandkeyboard/productdetails.aspx?pid=038&quot;&gt;here&lt;/a&gt;) would be much more usable.  
&lt;/p&gt;
&lt;p&gt;
Hosting media in your living room is probably still in its relative infancy, and it seems there are tons of options out there that have not yet jelled into a clear picture. Windows Media Center is one answer, and although it&amp;#39;s great already, to me it seems Media Center and other hardware and software packages will become even more interesting as media companies keep offering various broadband content.&amp;nbsp;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Huntsville .NET Users Group and a Brief ReSharper Review</title>
   <link href="http://doingthedishes.com/2007/11/27/huntsville-net-users-group-and-a-brief-resharper-review.html"/>
   <updated>2007-11-27T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/11/27/huntsville-net-users-group-and-a-brief-resharper-review</id>
   <content type="html">&lt;p&gt;
We have a good .NET user group here in Huntsville called &lt;a href=&quot;http://www.huntug.org/DesktopDefault.aspx?tabid=1&quot;&gt;HUNTUG&lt;/a&gt; (for Huntsville Users Group). They have a meeting at least once a month and are able to bring in talented speakers from the Southeast and beyond via sponsorship from Microsoft and other supporting companies. They always have lots of free food and technical magazines at the meetings, and often give away door prizes such as books, shirts, or software. I was lucky enough to win a great Visual Studio 2005 add-on called &lt;a href=&quot;http://www.jetbrains.com/resharper/&quot;&gt;ReSharper&lt;/a&gt; at one of the latest meetings, and one of the chairpersons asked me to write a review of it for the software reviews section of the user group&amp;#39;s site.
&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s said review: [more]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
ReSharper for Visual Studio by JetBrains is a Visual Studio add-on that, after using for about a week, I realize I can no longer live without. It has helped me to look at existing code in a new light and has even shown me several good coding tips and tricks. Before using the tool, I was appreciative of the many coding tools included with Visual Studio 2005 (such as code formatting, refactoring, and code snippets support), but after using ReSharper for a substantial amount of time, I realize that I have been missing out on more advanced, helpful, and more productive features that 3rd party tools like this can offer. &lt;br /&gt;
&lt;br /&gt;
ReSharper comes in editions for C#, &lt;a href=&quot;http://vb.net/&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;VB.NET&lt;/a&gt; or both, and is priced at anywhere from free for a classroom license to $350 for a commercial license. The current version that I evaluated is 3.0 for Visual Studio 2005. They also offer a version for Visual Studio .NET 2003, and are tentatively planning a version 4 release for Visual Studio 2008 (including support for C# and &lt;a href=&quot;http://vb.net/&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;VB.NET&lt;/a&gt; 3.5) in January 2008. 
&lt;/p&gt;
&lt;p&gt;
While ReSharper has many features (which are highlighted on the tool&amp;#39;s website), I found several to be particularly useful. The tool gives more detailed error messages and more advanced warnings that Visual Studio does by default and includes the ability to rectify many of these potential problems automatically. ReSharper includes a more advanced &amp;quot;find usages&amp;quot; dialog and list that is more polished than the default feature. Also, the add-on makes navigating to references easier by providing a hyperlink interface on class or method names from anywhere when the control key is depressed (it even does this for declarative, plain-text event handlers in aspx files).
&lt;br /&gt;
&lt;br /&gt;
ReSharper is not without its faults, however. It re-routes many of the standard Visual Studio keyboard shortcuts and, although this can be configured to closely mimick the default behavior, it is still confusing sometimes. Visual Studio takes a performance hit when running ReSharper too (especially when first loading a project or if working on a slow machine). Also, the tool leaves a few meta data files and directories littered about your project folder (which are fairly harmless but can be a little annoying if you&amp;#39;re a neat freak like me).
&lt;/p&gt;
&lt;p&gt;
All in all, highly recommended. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CodeMash Conference</title>
   <link href="http://doingthedishes.com/2007/11/20/codemash-conference.html"/>
   <updated>2007-11-20T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/11/20/codemash-conference</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.codemash.org/&quot;&gt;&lt;img alt=&quot;CodeMash &amp;#8211; I&amp;#39;ll be there!&quot; src=&quot;http://www.codemash.org/images/bloggerbadge2008.gif&quot; class=&quot;float-left&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I was fortunate enough to have my company sponsor me, so it looks like I&#39;m going to the CodeMash conference in Sandusky, Ohio in early January. What is CodeMash? From the site: &lt;/p&gt;  &lt;p&gt;&amp;quot;CodeMash is a unique event that will educate developers on current practices, methodologies, and technology trends in variety of platforms and development languages such as Java, .NET, Ruby and PHP.&amp;quot; &lt;/p&gt;  &lt;p&gt;Although I mostly work with ASP.NET and Microsoft technologies in general, I still like to keep my eyes open to what other tools and perspectives are out there. Really looking forward to being immersed in a diverse environment like this for a few days.&amp;#160; &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Day of .Net in Memphis</title>
   <link href="http://doingthedishes.com/2007/11/14/day-of-net-in-memphis.html"/>
   <updated>2007-11-14T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/11/14/day-of-net-in-memphis</id>
   <content type="html">&lt;p&gt;
Last weekend, I went with &lt;a href=&quot;http://pisatel.livejournal.com/&quot;&gt;Sergey&lt;/a&gt; to the &lt;a href=&quot;http://dayofdotnet.mnug.net/&quot;&gt;Memphis Day of .Net&lt;/a&gt; conference held at the University of Memphis. It consisted of a series of .Net-centric talks given by senior professionals mostly from around the southeast on various topics such as ASP.NET, Visual Studio, &lt;a href=&quot;http://silverlight.net/&quot;&gt;Silverlight&lt;/a&gt;, and Test Driven Development. I had a great time and got a lot of good info from the conference. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/derekmorrison/1992313339/in/set-72157603123578744/&quot;&gt;&lt;img id=&quot;id&quot; style=&quot;border: 0px none &quot; src=&quot;/images/charles-petzold.jpg&quot; border=&quot;0&quot; alt=&quot;Charles Petzold giving the keynote&quot; width=&quot;246&quot; height=&quot;329&quot; /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The keynote presentation was given by &lt;a href=&quot;http://www.charlespetzold.com/&quot;&gt;Charles Petzold&lt;/a&gt; (who&amp;#39;s written a &lt;a href=&quot;http://www.amazon.com/Applications-Code-Markup-Presentation-Foundation/dp/0735619573/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194996061&amp;amp;sr=8-1&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://www.amazon.com/Programming-Windows-Fifth-Charles-Petzold/dp/157231995X/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194996061&amp;amp;sr=8-2&quot;&gt;books&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/Programming-Microsoft-Windows-Forms-Developer/dp/0735621535/ref=pd_bbs_sr_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194996061&amp;amp;sr=8-4&quot;&gt;about&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/3D-Programming-Windows-Pro-Developer/dp/0735623945/ref=pd_bbs_sr_5?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194996061&amp;amp;sr=8-5&quot;&gt;programming&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/Programming-Key-C-Charles-Petzold/dp/0735618003/ref=pd_bbs_sr_8?ie=UTF8&amp;amp;s=books&amp;amp;qid=1194996061&amp;amp;sr=8-8&quot;&gt;windows&lt;/a&gt;) and was well delivered and entertaining. He and the conference room where he presented are shown in the picture above. (Side note: The auditorium is called &amp;quot;The Zone&amp;quot;... and it&amp;#39;s sponsored by AutoZone.... get it?? hilarious! ;) In the lower right side of the pic you can barely see the consoles that were present at each attendee&amp;#39;s seat. These consoles contained a microphone and button that, when pressed, signaled one of the four automated cameras in the front of the auditorium to zoom into the questioning attendee, at which point they would be shown on screen and his or her microphone would become hot. Neato! -- Updated, Nov 15: &lt;a href=&quot;http://www.jeffblankenburg.com/2007/11/memphis-day-of-net.html&quot;&gt;Here&amp;#39;s&lt;/a&gt; a video of the space one of the presenters posted. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/derekmorrison/1992311011/in/set-72157603123578744/&quot;&gt;&lt;img id=&quot;id&quot; style=&quot;border: 0px none &quot; src=&quot;/images/bb-king.jpg&quot; border=&quot;0&quot; alt=&quot;B.B. King playing at his club on Beale St&quot; width=&quot;296&quot; height=&quot;223&quot; /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
While in Memphis, we also managed to catch B.B. King playing at his club on Beale Street. I had never been to Memphis and was hoping to catch a bit of good blues music, but wasn&amp;#39;t prepared for anything like that. Even at 82 years old, B.B. King can still put on a great show. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10,000 Ft View of Work</title>
   <link href="http://doingthedishes.com/2007/10/26/10000-ft-view-of-work.html"/>
   <updated>2007-10-26T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/10/26/10000-ft-view-of-work</id>
   <content type="html">&lt;p&gt;&lt;img height=&quot;332&quot; alt=&quot;&quot; src=&quot;/images/db-dependencies.png&quot; width=&quot;338&quot; /&gt; &lt;/p&gt;  &lt;p&gt;We&#39;ve been testing out an excellent suite of database tools for SQL Server here at work from &lt;a href=&quot;http://www.red-gate.com/&quot;&gt;Red Gate Software&lt;/a&gt;, and I captured this image while using their SQL Dependency Tracker tool. What you&#39;re seeing is a very high-level view of the database for a project I&#39;m working on. Each one of those tiny dots is a database object (table, view, stored procedure, etc), and the lines between them show relationships. The layout is the one automatically generated by default. &lt;/p&gt;  &lt;p&gt;I haven&#39;t used many database or code analysis tools like this, so it was striking to see such a high level (and admittedly pretty, in an abstract art sort of way) view. &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cyborg Dad</title>
   <link href="http://doingthedishes.com/2007/09/27/cyborg-dad.html"/>
   <updated>2007-09-27T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/09/27/cyborg-dad</id>
   <content type="html">&lt;p&gt;
My Dad, who&amp;#39;s been suffering with severe back pain for the past several years, just got a &lt;a href=&quot;http://www.medtronic.com/neuro/paintherapies/pain_treatment_ladder/neurostimulation/neuro_neurostimulation.html&quot;&gt;neurostimulator&lt;/a&gt; implanted along his spinal cord yesterday. For the time being, he has wires sticking out from his back and controls electrical impulses to his back and spine with a wired remote. However, after the initial trial period, he can get a fully internal apparatus which is controlled with a wireless remote (the internal batteries are said to last around 9 years). So far, he says the results are good, and hopefully this will allow him to depend less on pain medication. Dad&amp;#39;s been having a rough time with his back for awhile now, and I really hope this helps in even the slightest way to alleviate his pain. 
&lt;/p&gt;
&lt;p&gt;
I remember hearing about these devices several years ago on the news as an upcoming technology, and I&amp;#39;m amazed that Dad&amp;#39;s doctor was able to get his hands on one this soon. In a way, also, I&amp;#39;m a little jealous - I wsh they would hurry up with the iPhone headset implants (and I&amp;#39;m only half joking). 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iPhone Woes</title>
   <link href="http://doingthedishes.com/2007/09/18/iphone-woes.html"/>
   <updated>2007-09-18T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/09/18/iphone-woes</id>
   <content type="html">&lt;p&gt;
The recent $200 price drop for the iPhone has triggered a lot of anger from early adopters. It&amp;#39;s a &lt;a href=&quot;http://www.news.com/Apples-iPhone-price-cuts-leave-mixed-feelings/2100-1041_3-6206367.html&quot;&gt;nuanced&lt;/a&gt; issue, and there are several ways of looking at it.
&lt;/p&gt;
&lt;p&gt;
Two hundred dollars in ten weeks - what a slap in the face to Apple&amp;#39;s core customers, some of whom waited hours in line for the device and were notoriously broadcast doing so in the news. Tech products do tend to rapidly fall in price (as Apple noted in its &lt;a href=&quot;http://www.apple.com/hotnews/openiphoneletter/&quot;&gt;open letter&lt;/a&gt; to iPhone owners after the price cut was announced), but this seems particularly steep. In the beforementioned letter, Apple sites ramping up sales for the coming holiday season as one of the reasons for the price drop. Holiday season? but it&amp;#39;s September? Looks like Apple is getting caught up in the &lt;a href=&quot;http://www.msnbc.msn.com/id/15403474/&quot;&gt;Christmas creep&lt;/a&gt; too. [more] 
&lt;/p&gt;
&lt;p&gt;
To sweeten the deal, a $100 Apple Store credit (not applicable to iTunes purchases, however) for iPhone owners was announced the day after the price drop (presumably after negative customer feedback). Nice gesture, certainly, but not announcing this at the same time that new iPods and a new iPhone price was announced seems to be a mistake (one of &lt;a href=&quot;http://blog.wired.com/business/2007/09/four-mistakes-a.html&quot;&gt;several&lt;/a&gt;, perhaps). Such a mistake, that Apple stock fell after the announcements at a time when the stock should have risen on the news of re-designed iPods (the iPod Touch and the new &amp;quot;fat&amp;quot; video Nano). Not only did the price drop anger me personally, but peaved Jamilya a little, as I had excitedly told her to buy Apple stock the night before for her mock stock trading exercise in her finance class (I really should just stick to programming).
&lt;/p&gt;
&lt;p&gt;
And what do I hear this morning while listening to one of my favorite podcasts, &lt;a href=&quot;http://www.twit.tv/mb&quot;&gt;MacBreak Weekly&lt;/a&gt;, in an episode entitled &amp;quot;Repeal the Nerd Tax&amp;quot; (taken after a Bill Maher &lt;a href=&quot;http://gizmodo.com/gadgets/iphone/bill-maher-rips-iphone-fanboys-a-new-one-300518.php&quot;&gt;segment&lt;/a&gt;)? Apparently, $200 is not a big deal and was worth it to have the iPhone for an extra two months of nerd bragging rights over people getting it for cheaper. Well then, maybe I&amp;#39;m just a sour puss. But wait... let me think for a minute about the web celebrities I&amp;#39;m listening to:&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s host Leo LaPorte, who talks about getting sent a free iPhone from a fan so he could try various hacks on it while not risking any down time with his main iPhone. Then there&amp;#39;s famous &lt;a href=&quot;http://en.wikipedia.org/wiki/Getting_Things_Done&quot;&gt;GTD&lt;/a&gt;er Merlin Mann, who held out for several weeks after the iPhone was released in seeming defiance of the mainstream only to be given an iPhone by someone just for, ya know, simply being Merlin Mann. Lastly, there&amp;#39;s Scott Bourne, who produces the &lt;a href=&quot;http://applephoneshow.com/&quot;&gt;Apple Phone Show&lt;/a&gt; podcast, brags about giving an iPhone to each member of his staff, and personally owns so many iPhones that he has his own Chuck Norris-like &lt;a href=&quot;http://www.scottbournefacts.com&quot;&gt;facts page&lt;/a&gt;. Maybe there&amp;#39;s a little bias here.
&lt;/p&gt;
&lt;p&gt;
Even still, I still very much love my iPhone. It&amp;#39;s the best smartphone I&amp;#39;ve seen, and I use it so much that I&amp;#39;ve come to think of it as an integrated augmentation to my brain (and I&amp;#39;m only half joking). I also really enjoy MacBreak Weekly as well as several other This Week in Tech &lt;a href=&quot;http://www.twit.tv/&quot;&gt;podcasts&lt;/a&gt;, and I&amp;#39;m very grateful for the free content they deliver.
&lt;/p&gt;
&lt;p&gt;
-----
&lt;/p&gt;
&lt;p&gt;
This post proudly published using Microsoft Windows and ASP.NET
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Frustrated</title>
   <link href="http://doingthedishes.com/2007/09/16/frustrated.html"/>
   <updated>2007-09-16T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/09/16/frustrated</id>
   <content type="html">&lt;div style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;/images/frustrated.jpg&quot; alt=&quot;&quot; width=&quot;362&quot; height=&quot;240&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;
It seems I&amp;#39;ve been punished for making my earlier (and now, seemingly arrogant) comments about building my latest PC without a hickup. For the last week or two, I&amp;#39;ve been struggling with what eventually I found to be a faulty motherboard. Since this piece is so central to the whole computer, and since I wasn&amp;#39;t getting any error code from the board (with its &amp;quot;helpful&amp;quot; on-board LED error indicator) and nothing appeared on screen, I had to patiently troubleshoot various components (CPU, video card, RAM) until I found the culprit. After isolating everything, I finally reduced it down to the mobo. Everything turned out well in the end, as I was able to submit a warranty claim to EVGA (the manufacturer) and, after grudgingly paying for one-way shipping on a replacement board and swapping out boards, I&amp;#39;m now writing this post from my restored machine.
&lt;/p&gt;
&lt;p&gt;
This brings up a few points. [more]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Although I might have saved around a grand making my own PC versus buying a pre-built Dell, I&amp;#39;m sure that a good portion of this &amp;quot;savings&amp;quot; has been eaten by the time I spent dissassembling the system, troubleshooting, then shipping and resintalling the motherboard. Luckily I had a spare PC and I back my data up regularly, so I was quickly able to switch over to another box when the new PC crashed, but still I don&amp;#39;t know if I could call the adjustment totally negligible.
&lt;/p&gt;
&lt;p&gt;
However, luckily I wasn&amp;#39;t totally naive when I started planning the computer build, and, having done this before, I knew there would be problems that arose and didn&amp;#39;t plan on getting away unscathed. Also (masochistic overtones aside), there is a certain pleasure I can take now as I look back and see where the problem arose and how I was able to deduce a solution and produce a remedy. This is probably part of the geekiness in getting your hands dirty building your own computer and having to understand and learn about the various componenets that comprise the system. And hey, even Google&amp;#39;s &lt;a href=&quot;http://nomano.shiwaza.com/tnoma/blog/archives/002379.html&quot;&gt;early servers&lt;/a&gt; were a fairly cobbled together.
&lt;/p&gt;
&lt;p&gt;
Another realization was how valuable online forums and product feedback can be. I noticed when I first ordered my mobo from &lt;a href=&quot;http://www.newegg.com&quot;&gt;NewEgg&lt;/a&gt; (which has a vibrant communicty of shoppers and whose comments are displayed prominently alongside products) that a few people commented on how several heatsinks seemed poorly attached to the motherboard. Apparently, this could lead to improper cooling of several componenets and could cause the board to burn up. This turned out to be useful, as I later referred back to these comments and heeded their recommendations when I applied better quality termal grease to a few heatsinks on the replacement mobo.
&lt;/p&gt;
&lt;p&gt;
So a little nerd drama and I&amp;#39;m back to 100 %. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Building a Quad Core PC with the Experts</title>
   <link href="http://doingthedishes.com/2007/08/23/building-a-quad-core-pc-with-the-experts.html"/>
   <updated>2007-08-23T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/08/23/building-a-quad-core-pc-with-the-experts</id>
   <content type="html">&lt;p&gt;
I had been using the same home PC for over 4 years now, and, having cash in hand from my recent motorcycle sell, it was time for new hardware. Luckily, around this same time, one of my favorite .Net podcasters and bloggers &lt;a href=&quot;http://www.hanselman.com/blog/&quot;&gt;Scott Hanselman&lt;/a&gt;, from the show &lt;a href=&quot;http://www.hanselminutes.com/&quot;&gt;Hanselminutes&lt;/a&gt;, published a &lt;a href=&quot;http://www.hanselminutes.com/default.aspx?showID=86&quot;&gt;show&lt;/a&gt; on building a new PC. He gave a detailed parts &lt;a href=&quot;http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart2.aspx&quot;&gt;list&lt;/a&gt;, and was to have Jeff Atwood, another one of my favorite bloggers from &lt;a href=&quot;http://www.codinghorror.com/blog/&quot;&gt;CodingHorror.com&lt;/a&gt;, assemble the machine and give commentary. I was very fortunate to be able to follow along with Scott and Jeff, taking their advice and experience into consideration as I assembled my own machine. [more]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Not only did I want this new PC to be a powerful update from my old computer, but I also wanted it to be &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000665.html&quot;&gt;quiet&lt;/a&gt;. I was tired of the annoyingly loud fans of my current system and of being amazed at how much quieter the house became whenever the power went out.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Also, I took this as an opportunity to upgrade all 3 Windows machines I have currently (main PC, media center PC in the living room, and file/backup server). I&amp;#39;m currently working on the media center PC next (will have details on it when it&amp;#39;s up and running), and I plan upgrade and my file server and test a beta copy of &lt;a href=&quot;http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx&quot;&gt;Windows Home Server&lt;/a&gt; on it when the media center PC is stable. 
&lt;/p&gt;
&lt;p&gt;
Here is a list of the parts I ended up buying:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16819115017&quot;&gt;Intel Core 2 Quad Q6600 Kentsfield 2.4GHz 2 x 4MB L2 Cache LGA 775 Processor - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $290&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16835185037&quot;&gt;Scythe SCMN-1100 100mm Sleeve CPU Cooler - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $39&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/product/product.asp?item=N82E16813188013&quot;&gt;EVGA 122-CK-NF68-A1 LGA 775 NVIDIA nForce 680i SLI ATX Intel Motherboard - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $200&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16811129025&quot;&gt;Antec P182 Gun Metal Black 0.8mm cold rolled steel ATX Mid Tower Computer Case - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $160&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16817371002&quot;&gt;Antec True Power Trio TP3-550 ATX12V 550W Power Supply with Three 12V Rails 100 - 240 V UL, CUL, FCC, T&amp;Uuml;V, CE, C-tick, CCC, CB - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $120&lt;/li&gt;
	&lt;li&gt;2 x &lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16820220144&quot;&gt;Patriot eXtreme Performance 2GB (2 x 1GB) 240-Pin DDR2 SDRAM DDR2 800 (PC2 6400) Dual Channel Kit Desktop Memory - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $140 (for 2)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/product/product.asp?item=N82E16822136012&quot;&gt;Western Digital Raptor WD1500ADFD 150GB 10,000 RPM 16MB Cache Serial ATA150 Hard Drive - OEM&lt;/a&gt;&lt;br /&gt;
	Price: $180&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16822136131&quot;&gt;Western Digital Caviar SE16 WD7500AAKS 750GB 7200 RPM 16MB Cache SATA 3.0Gb/s Hard Drive - OEM&lt;/a&gt;&lt;br /&gt;
	Price: $200&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16814127284&quot;&gt;MSI NX8600GTS-T2D256E-OC GeForce 8600GTS 256MB 128-bit GDDR3 PCI Express x16 HDCP Ready SLI Supported Video Card - Retail&lt;/a&gt;&lt;br /&gt;
	Price: $150&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16832116215&quot;&gt;Microsoft Windows Vista 64-Bit Ultimate for System Builders Single Pack DVD - OEM&lt;/a&gt;&lt;br /&gt;
	Price: $200 (Yes, I actually &lt;em&gt;bought&lt;/em&gt; Windows ;)&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16827106055&quot;&gt;LITE-ON Black 20X DVD+R 8X DVD+RW 8X DVD+R DL 20X DVD-R 6X DVD-RW 12X DVD-RAM 16X DVD-ROM 48X CD-R 24X CD-RW 48X CD-ROM 2MB Cache E-IDE/ATAPI DVD Burner with LightScribe Technology - OEM&lt;/a&gt;&lt;br /&gt;
	Price: $37&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.newegg.com/Product/Product.asp?Item=N82E16835100007&quot;&gt;Arctic Silver 5 Thermal Compound - OEM&lt;/a&gt;&lt;br /&gt;
	Price: $11&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Total price: &lt;strong&gt;$1,727&lt;/strong&gt; (includes shipping but also includes discounts for mail-in rebates)&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I priced a similar system with Dell at $2,808 - a savings of over $1,000. Of course, this doesn&amp;#39;t include the cost of my time to build the machine (which is not &lt;a href=&quot;http://www.emaxhealth.com/18/5710.html&quot;&gt;trivial&lt;/a&gt;), but as a hobbyist, it&amp;#39;s fun to build my own PC and I like to know exactly what componenets are going into my system.
&lt;/p&gt;
&lt;p&gt;
I decided to go with an Intel quad core processor clocked at 2.4 Ghz. Intel CPUs recently had a substantial price cut, and this processor was formerly around $550 whereas I was able to pick it up for $290. For around the same price, I could have picked up a dual core CPU clocked at 3.0 Ghz, but &lt;a href=&quot;http://www.anandtech.com/cpuchipsets/intel/showdoc.aspx?i=3038&amp;amp;p=8&quot;&gt;decided&lt;/a&gt; against it. The higher clocked CPU might be better for gaming, but I&amp;#39;m not a big gamer, and I think I&amp;#39;ll appreciate the multitasking benefits of more cores and hopefully the future benefits &lt;a href=&quot;http://www.apple.com/macpro/&quot;&gt;more&lt;/a&gt; and more cores start appearing in systems and software is, hopefully, better designed to make use of them.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I also decided to go with 2 hard drives: a fast, smallish one for OS and program files, and a larger one for user data and media. I picked the fast &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16822136012&quot;&gt;Raptor&lt;/a&gt; as my system drive in part due to a good &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000800.html&quot;&gt;write up&lt;/a&gt; at Coding Horror, and I got the 750 GB Western Digital drive as per &lt;a href=&quot;http://www.tomshardware.com/2007/07/06/record-making_hard_disk/&quot;&gt;advice&lt;/a&gt; at Tom&amp;#39;s Hardware. I thought about going for a full &lt;a href=&quot;http://www.tomshardware.com/2007/07/06/record-making_hard_disk/&quot;&gt;terabyte drive&lt;/a&gt;, but the cost seemed a little too prohibitive for the extra amount of storage over 750 GB.
&lt;/p&gt;
&lt;p&gt;
As for my experiences building and using the system so far, they&amp;#39;ve been unexpectedly smooth. The Antec &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16811129025&quot;&gt;case&lt;/a&gt; was a joy to work around, and I didn&amp;#39;t run into any problems getting the machine to boot after everything was assembled (which has never happened with the computers I&amp;#39;ve built in the past). The PC has been outrageously fast so far. The Vista &lt;a href=&quot;http://www.microsoft.com/windows/products/windowsvista/features/experiences/aero.mspx&quot;&gt;Aero&lt;/a&gt; Glass UI runs very smoothly, and I&amp;#39;m even able to run a full screen hi-def video ala Vista &lt;a href=&quot;http://windowsultimate.com/blogs/extras/archive/2007/03/14/windows-dreamscene.aspx&quot;&gt;Dreamscene&lt;/a&gt; (a video of a river running towards me, in my case) as my desktop background with no noticeable slow down. The components that I bought are well suited to overclocking, so I should be able get the processor up to 3.0 Ghz fairly easily, (as Scott Hanselman and Jeff Atwood did), but the box has been running so quickly and smoothly that I haven&amp;#39;t felt the need to. Also, the system is substantially quieter than my old PC.&amp;nbsp;  
&lt;/p&gt;
&lt;p&gt;
I was a little skeptical about switching to a 64 bit OS, but working with Vista 64 has been surprisingly smooth and I&amp;#39;ve had little compatibility problems so far. There is one glaring problem, however: my iPhone doesn&amp;#39;t work with Vista 64. When I plug it in, iTunes prompts me to &amp;quot;Please plug the iPhone into a computer running Windows XP or Vista 32 bit edition&amp;quot;. The iPhone does, though, show up as a drive in Vista and the import photos dialog automatically launches when I plug it in. So, until Apple fixes this problem, I&amp;#39;ve got the iPhone syncing with another PC running XP. A hassle, but not a deal breaker.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve got a set of pictures of the build on Flickr, and I have more detailed descriptions of various components and build steps in the picture descriptions. You can find the set &lt;a href=&quot;http://www.flickr.com/photos/derekmorrison/sets/72157601890033217/&quot;&gt;here&lt;/a&gt;.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Here are several resources I found helpful during the build:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Scott Hanselman - Ultimate Developer Rig: &lt;a href=&quot;http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart1.aspx&quot;&gt;Part 1&lt;/a&gt;, &lt;a href=&quot;http://www.hanselman.com/blog/CommentView.aspx?guid=6ed8d229-2e2a-4b74-a65a-39ee6f7d4e9d&quot;&gt;Part 2&lt;/a&gt;, &lt;a href=&quot;http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart3.aspx&quot;&gt;Part 3&lt;/a&gt;, and &lt;a href=&quot;http://www.hanselman.com/blog/GoneQuadDay0WithTheUltimateDeveloperPC.aspx&quot;&gt;Gone Quad&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Coding Horror - Building a PC: &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000905.html&quot;&gt;Part 1&lt;/a&gt;, &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000907.html&quot;&gt;Part 2&lt;/a&gt;, &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000908.html&quot;&gt;Part 3&lt;/a&gt;, and &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000918.html&quot;&gt;Part 4&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Hanselminutes Podcast: &lt;a href=&quot;http://www.hanselman.com/blog/HanselminutesPodcast69BuildingADeveloperPC.aspx&quot;&gt;Building a Developer PC&lt;/a&gt; and &lt;a href=&quot;http://www.hanselman.com/blog/HanselminutesPodcast74JeffAtwoodOverclocksTheUltimatePC.aspx&quot;&gt;Jeff Atwood Overclocks the Ultimate PC&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.silentpcreview.com/&quot;&gt;Silent PC Review&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.endpcnoise.com/&quot;&gt;End PC Noise&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Intro</title>
   <link href="http://doingthedishes.com/2007/08/17/intro.html"/>
   <updated>2007-08-17T00:00:00+00:00</updated>
   <id>http://doingthedishes.com/2007/08/17/intro</id>
   <content type="html">&lt;p&gt;
I&amp;#39;m trying to get my personal site in order, and I&amp;#39;ve decided to launch this new blog to get things under way. The site&amp;#39;s been neglected for quite awhile now, so now I&amp;#39;m hoping to give it the attention it deserves and have a little fun in the meantime. [more]&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Personal Update&lt;/h4&gt;
&lt;p&gt;
All in all, things have been going very well at home. Jamilya and I still aren&amp;#39;t sure of a wedding date, although we&amp;#39;re tentatively shooting for the first half of next year (need to get on the ball about this one). However, we&amp;#39;re still a very happy couple&amp;nbsp; I&amp;#39;d say (and hopefully she would too), and I think she&amp;#39;s learned to put up with my geeky quirkitudes very well.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I &lt;a href=&quot;http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?ViewItem&amp;amp;ih=017&amp;amp;sspagename=STRK%3AMESO%3AIT&amp;amp;viewitem=&amp;amp;item=270142472393&amp;amp;rd=1&quot;&gt;sold&lt;/a&gt; my motorcycle. It was sad to see her go, and she was a great bike, but I just wasn&amp;#39;t riding enough lately. Riding on the streets became less and less &lt;a href=&quot;http://www.waff.com/Global/story.asp?s=6629355&quot;&gt;appealing&lt;/a&gt;, and although &lt;a href=&quot;http://www.sportbiketracktime.com/&quot;&gt;track days&lt;/a&gt; are great, they can be a little &lt;a href=&quot;http://www.sportbiketracktime.com/cart/shopexd.asp?id=596&quot;&gt;pricey&lt;/a&gt;. Maybe I can manage to get a &lt;a href=&quot;http://cgi.ebay.co.uk/SUZUKI-SV650s-Track-Race-bike_W0QQitemZ260150493832QQihZ016QQcategoryZ9808QQcmdZViewItem&quot;&gt;dedicated track bike&lt;/a&gt; in the future and ride just there (where there are no cars, trees, or fence posts and everyone is going in the same direction).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Having sold my bike, with extra cash in hand, and with an expiring Verizon contract, wasn&amp;#39;t it only natural that I get an &lt;a href=&quot;http://www.apple.com/iphone/&quot;&gt;iPhone&lt;/a&gt;? I won&amp;#39;t bore with too many details (as I think &lt;a href=&quot;http://www.nytimes.com/2007/06/27/technology/circuits/27pogue.html?ex=1340596800&amp;amp;en=98d00bf6e780b2be&amp;amp;ei=5088&quot;&gt;enough&lt;/a&gt;... &lt;a href=&quot;http://online.wsj.com/public/article/SB117168001288511981-euxzmjNFZTZhA_2z8OBtD6GK900_20070224.html?mod=blogs&quot;&gt;has&lt;/a&gt;... &lt;a href=&quot;http://www.pcmag.com/article2/0,1895,2082361,00.asp&quot;&gt;already&lt;/a&gt;... &lt;a href=&quot;http://reviews.cnet.com/smart-phones/apple-iphone-4gb-at/4505-6452_7-32180293.html&quot;&gt;been&lt;/a&gt;... &lt;a href=&quot;http://gizmodo.com/gadgets/apple/no-bs-iphone-review-276116.php&quot;&gt;written&lt;/a&gt; about one of the most highly-anticipated consumer electronics devices in history). It was funny, however, when I called Verizon to cancel my contract and port my phone number -- The operator asked me why I was leaving Verizon and if there was anything they could do for me to make me stay. I simply said &amp;quot;iPhone&amp;quot;, and the lady excitedly asked me how I liked it and told me that, in this case, she totally didn&amp;#39;t blame me for leaving Verizon (true story!). The thing has been great so far, and is a real joy to use.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m still pursuing my masters at Auburn (in software engineering), and I&amp;#39;m slowly but surely fulfilling my 33 required hours (my just-completed summer class made my total 17). I&amp;#39;m taking it at the relaxed pace of one class per semester, and this, with work, gives me ample time to concentrate on each individual class. Even though it&amp;#39;s tiring to come home and watch streaming video courses, then keep up with homework and assignments after a brain sapping day at work, I&amp;#39;m thankful for them, as they keep my neurons firing about exciting areas of software engineering. It&amp;#39;s also been interesting to see how I&amp;#39;ve been able to apply my, albeit limited, work experience to courses in ways that I was too ignorant to do while I was an undergraduate student.
&lt;/p&gt;
&lt;p&gt;
In my last class (on software environments), I was able to experiment with creating a custom plug-in for the &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt; development environment. For this, I created a stripped-down duplicate of &lt;a href=&quot;http://egcs.javaforge.com/&quot;&gt;this&lt;/a&gt; plugin from scratch (with the teacher&amp;#39;s approval of course - the idea was to get an overview of Eclipse&amp;#39;s architecture), which calls the Google Code Search web service to search for relevant source code within the development environment. The Fall semester just started, and I&amp;#39;m taking a class on formal methods for software engineering, where I&amp;#39;ll be learning the &lt;a href=&quot;http://en.wikipedia.org/wiki/Z_notation&quot;&gt;Z specification language&lt;/a&gt;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;m still enjoying my job at &lt;a href=&quot;http://www.asi-hsv.com/&quot;&gt;ASI&lt;/a&gt;, and am still working on back-end web development using ASP.NET. On my current project, we&amp;#39;ve been able to explore several interesting areas of &lt;a href=&quot;http://asp.net/ajax/&quot;&gt;AJAX&lt;/a&gt; development, as well delve into some intersting data acess &lt;a href=&quot;http://aspnet.4guysfromrolla.com/articles/020806-1.aspx&quot;&gt;patterns&lt;/a&gt; using Visual Studio 2005. I&amp;#39;ve been there for a little over a year now, and it&amp;#39;s turned out to be a great environment where I&amp;#39;ve learned a lot.&amp;nbsp; 
&lt;/p&gt;
&lt;h4&gt;Site Technical Background&lt;/h4&gt;
&lt;p&gt;
Since I stopped using Blogger many months ago, I&amp;#39;ve had several ideas for using different blog platforms to create a new blog and personal site. Since I work with Microsoft technologies and ASP.NET, I wanted to stay close to home, so I investigated a few .Net blogging platforms (&lt;a href=&quot;http://www.subtextproject.com/&quot;&gt;SubText &lt;/a&gt;and &lt;a href=&quot;http://www.dasblog.info/&quot;&gt;DasBlog&lt;/a&gt;). In fact, the previous version of the site was made using SubText as a prototype. While these are very established and capable projects, I was looking for something a little more stripped down and easier for me to get my head around.
&lt;/p&gt;
&lt;p&gt;
I also experimented with creating a custom web application that used the web solely for data storage, with a private Blogger account storing my blog entries (as, I think, William Gibson&amp;#39;s &lt;a href=&quot;http://www.williamgibsonbooks.com/blog/blog.asp&quot;&gt;blog&lt;/a&gt; does), and my other bits of information (blogroll, amazon wish lists, videos, music lists) stored somehow online too. I went down this path for awhile, but then an up and coming .Net blog engine called &lt;a href=&quot;http://www.dotnetblogengine.net/&quot;&gt;BlogEngine.Net&lt;/a&gt; caught my eye. It&amp;#39;s aimed towards simplicity, and I delving into the source doesn&amp;#39;t seem, to me at least, as intimidating as other .Net blogging platforms.
&lt;/p&gt;
&lt;h4&gt;Purpose&lt;/h4&gt;
&lt;p&gt;
I have a few major purposes that I hope this site will serve as:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;A place to share my personal info (personal blog entries, pictures, movies and music lists)&lt;/li&gt;
	&lt;li&gt;A place to share professional or technological bits
	&lt;/li&gt;
	&lt;li&gt;A test area for experimenting with new technologies (&lt;a href=&quot;http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx&quot;&gt;VS 2008&lt;/a&gt;, AJAX, BlogEngine.Net customizations, &lt;a href=&quot;http://silverlight.net/&quot;&gt;Silverlight&lt;/a&gt;, etc)&lt;/li&gt;
	&lt;li&gt;A playground for experimenting with web design&lt;/li&gt;
	&lt;li&gt;A way for me to work on writing skills&lt;/li&gt;
	&lt;li&gt;&lt;u&gt;Not&lt;/u&gt; a system that makes me feel pressure to write necessarily lengthy (or even frequent) entries.&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Roadmap&lt;/h4&gt;
&lt;p&gt;
Things I have planned for the immediate future are:&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	Create a custom theme that uses the blog&amp;#39;s standard functionality using &lt;a href=&quot;http://www.oswd.org/design/preview/id/3559&quot;&gt;this&lt;/a&gt; theme (maintaining complete compatibility with BlogEngine .Net&amp;#39;s theming mechanism).&lt;/li&gt;
	&lt;li&gt;Fork development on this custom theme and create a site that I can more heavily customize.&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;Integrate custom parts into the site (such as a Flickr badge, del.icio.us list, and last.fm list).&lt;br /&gt;
	&lt;/li&gt;
&lt;/ul&gt;
That&amp;#39;s all for now. I&amp;#39;m in the middle of a few computer upgrades now, so I&amp;#39;ll have details on this coming in a bit.
</content>
 </entry>
 
 
</feed>