<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title>David Mohundro</title>
  <id>http://mohundro.com/</id>
  <updated>2006-01-03</updated>
  <author>
    <name>David Mohundro</name>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DavidMohundro" /><feedburner:info uri="davidmohundro" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>2011 in Review</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/XQNfOjQXC1w/" />
    <id>http://mohundro.com/blog/2012/01/08/2011-in-review/</id>
    <published>2012-01-08</published>
    <updated>2012-01-08</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;Now that the year of the Mayans is upon us, I wanted to take some time to look
back over 2011. And don&amp;rsquo;t worry, I&amp;rsquo;ll do my best to not mention the Mayans and&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Now that the year of the Mayans is upon us, I wanted to take some time to look
back over 2011. And don&amp;rsquo;t worry, I&amp;rsquo;ll do my best to not mention the Mayans and
2012 anymore this year. I won&amp;rsquo;t guarantee it won&amp;rsquo;t come up again because I
think it is funny, but I&amp;rsquo;ll try.&lt;/p&gt;

&lt;h2&gt;A new job&amp;hellip; sort of&lt;/h2&gt;

&lt;p&gt;Back in June of 2010, I made a major decision and moved my family to Memphis
and took a new job. Little did I know that my employer would change in just
over a year. My prior employer, &lt;a href="http://www.serviceu.com"&gt;ServiceU&lt;/a&gt;, was
&lt;a href="http://www.serviceu.com/acquisition"&gt;acquired by the Active Network&lt;/a&gt;. I&amp;rsquo;m
still at the same location doing mostly the same thing, but it was still
unexpected. I&amp;rsquo;m excited about the change, though, and I&amp;rsquo;m excited that I&amp;rsquo;m
still working for a software company.&lt;/p&gt;

&lt;p&gt;As a part of the acquisition, we&amp;rsquo;ve also fully embraced
&lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt; as our development
methodology. Prior to the acquisition, it wasn&amp;rsquo;t like we were doing Waterfall,
but we didn&amp;rsquo;t really have a formalized process either. You might be able to
call it Lean, but that would probably be stretching it as far as &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;Lean Software
Development&lt;/a&gt; is
concerned. I&amp;rsquo;ve been reading about Scrum and Agile development for years now,
but I discovered that &amp;ldquo;reading&amp;rdquo; is far different than &amp;ldquo;doing.&amp;rdquo; I thought I
understood Agile &amp;ndash; I was wrong. There is a big difference between talking about
iterative releases and &lt;em&gt;actually releasing iteratively&lt;/em&gt;. You&amp;rsquo;ll understand if
you&amp;rsquo;ve ever been there.&lt;/p&gt;

&lt;p&gt;Another interesting thing that happened this past year was I experienced my
first trip to Redmond and the Microsoft Campus. It&amp;rsquo;s big. And this bad Seattle
weather everyone talks about? Lies &amp;ndash; it was sunny and in the 70s the entire
time we were there. One of the results of the trip was that &lt;a href="http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000011506"&gt;our company was
featured in a Microsoft Case Study about SQL Server
2012&lt;/a&gt;.
Over the last year, I&amp;rsquo;ve learned far more about uptime and availability than I
ever thought I would. It&amp;rsquo;s been quite the learning experience to actually get
to help build systems (and maintain them effectively) while keeping the uptime
numbers we&amp;rsquo;re looking for.&lt;/p&gt;

&lt;p&gt;From a speaking and community perspective, I barely did anything&amp;hellip; publicly.
However, we really started a push to have Dev Lunches at work as a means of
continual improvement. Basically, once a month, one of the devs would volunteer
to present a topic to the team over lunch. The atmosphere is great for
presenting because everyone is peers and friends already, and you&amp;rsquo;re pretty
much guaranteed to have in-depth discussions. I&amp;rsquo;d really recommend something
similar as a training opportunity. And it also fits into the self-organizing
side of agile.&lt;/p&gt;

&lt;h2&gt;On the home front&lt;/h2&gt;

&lt;p&gt;Earlier last year, &lt;a href="http://mohundro.com/blog/2011/06/24/introducing-daila-joy/"&gt;my family increased from two to three with the addition of
my daughter Daila&lt;/a&gt;.
Needless to say, I&amp;rsquo;ve been getting my hands dirty. Literally. She&amp;rsquo;s gone from
sleeping most of the time (except at night) to babbling, rolling over, standing
with help, laughing at just about everything, and more. She&amp;rsquo;s not responding to
baby signs just yet, but I&amp;rsquo;m pretty sure she understands what we&amp;rsquo;re saying now.&lt;/p&gt;

&lt;h2&gt;This year?&lt;/h2&gt;

&lt;p&gt;I expect that we&amp;rsquo;ll have our first iOS application released soon. Chances are
good that it won&amp;rsquo;t mean much to you if you&amp;rsquo;re not familiar with our service,
but it is still exciting for us.&lt;/p&gt;

&lt;p&gt;I also recently cancelled my cable &lt;em&gt;finally&lt;/em&gt; and am fully embracing streaming.
It probably isn&amp;rsquo;t even worth mentioning that part, but it&amp;rsquo;s a big deal to me.
I&amp;rsquo;m giddy over how much I&amp;rsquo;ll be saving a month.&lt;/p&gt;

&lt;p&gt;Other than that, well, who knows. Stay tuned.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=XQNfOjQXC1w:ACHpK_8h1S8:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=XQNfOjQXC1w:ACHpK_8h1S8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=XQNfOjQXC1w:ACHpK_8h1S8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/XQNfOjQXC1w" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2012/01/08/2011-in-review/</feedburner:origLink></entry>
  <entry>
    <title>//BUILD/ Windows Conference</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/-oYccHSZhMw/" />
    <id>http://mohundro.com/blog/2011/10/14/build-windows-conference/</id>
    <published>2011-10-14</published>
    <updated>2011-10-14</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;So, a few weeks ago I was able to attend the BUILD Windows conference in
Anaheim. I&amp;rsquo;m guessing you heard something about it. The last time Microsoft
held a conference at the convention center in Anaheim was when it announced&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;So, a few weeks ago I was able to attend the BUILD Windows conference in
Anaheim. I&amp;rsquo;m guessing you heard something about it. The last time Microsoft
held a conference at the convention center in Anaheim was when it announced
Windows 95 - this conference was an attempt to show that Windows was going to
revolutionize things again. I&amp;rsquo;ve got a lot of thoughts that I want to talk
about, so I&amp;rsquo;ll probably have to break this into multiple posts.&lt;/p&gt;

&lt;h2&gt;The conference itself&amp;hellip;&lt;/h2&gt;

&lt;p&gt;Because I have lots to talk about, I am going to go into more detail about
various topics. This post is just going to be a general conference overview
about some of the various sessions I attended. I&amp;rsquo;m planning on digging into
more detail about more specifics like what I think about the Win8 tablet and
more. If you&amp;rsquo;re interested in watching any of the sessions, the full list is
at the &lt;a href="http://www.buildwindows.com/Sessions/Schedule"&gt;buildwindows.com site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, the conference&amp;hellip;&lt;/p&gt;

&lt;h2&gt;Preconference&amp;hellip;? Nerd Dinner!!!&lt;/h2&gt;

&lt;p&gt;If you attended the conference or at least visited the BUILD site, you likely
saw that there was a preconference slot on the calendar. So, my group all got
flights for Sunday so that we would be there for the preconference sessions&amp;hellip;
which were all canceled. So, we just walked around Anaheim all day Monday. It
was a little annoying given that it would have cost a lot of money to change
travel plans and all that, but it turned out alright. We spent most of the day
coding and discussing future development options. We had planned on attempting
to build a Windows Phone 7 application, but it took forever to actually get the
Windows Phone 7 SDK installed. Oh well. We did end up walking around the area
and into Downtown Disney and, later that night, a group of people all went to
the Cheesecake factory for a &lt;a href="http://www.nerddinner.com/5027"&gt;nerddinner&lt;/a&gt;.
You&amp;rsquo;ll note that while only 2 people RSVP&amp;rsquo;d on the site, at least 15-20 people
showed up!&lt;/p&gt;

&lt;h2&gt;Keynotes galore&amp;hellip;&lt;/h2&gt;

&lt;p&gt;So, the conference actually began on Tuesday. Because the entire event was
shrouded in secrecy (even though everyone knew that there would be Win8
tablets being handed out). To give you an idea of the amount of secrecy, the
session lists pretty much just said &amp;ldquo;Sessions: 8 to 5&amp;rdquo; for the entire week.
There was no session planning until after the first keynote. And even then,
the entire first day was just one keynote after another. Even on Wednesday,
the morning was full of keynotes! Thankfully, the keynotes were pretty good&amp;hellip;
far better than the keynotes that I saw at TechEd a few years back.&lt;/p&gt;

&lt;p&gt;So, &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/KEY-0001"&gt;the Windows 8 tablet
reveal&lt;/a&gt;. I&amp;rsquo;ll admit,
it at least demos &lt;em&gt;really&lt;/em&gt; well. I don&amp;rsquo;t think it is stretching anything to
say that people were excited. There were a few people who currently have iPads
that were showing a lot of interest in the Windows 8 tablet. Something
interesting for me was that, at least for the first day, the attendees were
not the primary audience. The BUILD conference keynotes for day 1 really
served as marketing for consumers and tech enthusiasts. My take is that this
is Microsoft trying to take back some of the consumer appeal that Apple has
been able to win over the last few years.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ll put up a separate post about my actual hands-on experience with the
tablets that they&amp;rsquo;ve gave the attendees, but from the perspective of just
watching the keynotes, I was impressed. The promise of being able to dock your
tablet, use it as a real PC and then take it with you as a tablet is quite
nice.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/BPS-1004"&gt;Jensen Harris did give a keynote presentation on the traits of a great Metro
style application&lt;/a&gt;
that was good. My take on the presentation is that it was more of a demo on how
to actually &lt;em&gt;use&lt;/em&gt; Windows 8 from a usability perspective. I believe that is
where the term &amp;ldquo;Charms&amp;rdquo; showed up, which is just an awful name in my opinion.
I&amp;rsquo;m all for getting away from the really technical names for things (think
Control Panel, System Tray, etc.), but &lt;em&gt;Charms&lt;/em&gt;? How many Lucky Charms jokes
are we going to hear? Also, I do have some concerns about the usability of
parts of Windows 8. For example, the app bar can only be shown if you swipe
from the top or bottom. If you&amp;rsquo;re aware of the functionality, then it makes
sense I guess, but if you were to just walk up to one of these devices in a
store, would you know to do that? At least with all of the iDevices out there,
the primary functionality for applications is almost all visible. Sure, there
are often gestures like holding down on icons to move or delete applications,
but this isn&amp;rsquo;t a &lt;em&gt;common action&lt;/em&gt; for users. In Metro Internet Explorer,
browsing &lt;em&gt;is a common action&lt;/em&gt;, but you have to pull up the app bar to type in a
new address.  I&amp;rsquo;m planning on a separate post for Windows 8, so I better stop
:&amp;ndash;)&lt;/p&gt;

&lt;p&gt;The other two presentations of the day were &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/BPS-1005"&gt;Platform for Metro style
apps&lt;/a&gt; and &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/BPS-1006"&gt;Tools for
building Metro style
apps&lt;/a&gt;. I enjoyed
both of these sessions quite a bit, because they got a little more technical.
We were seeing a lot of this for the first time, so it was nice to begin to
get an idea of what building applications for this platform was going to be
like.&lt;/p&gt;

&lt;p&gt;We actually didn&amp;rsquo;t get to pick up our tablets until the end of the day, so
every session after the morning keynote made some mention of them standing
between us and our tablets. Oh, and viva la COM I guess. I&amp;rsquo;ll talk more about
that in a little bit.&lt;/p&gt;

&lt;h2&gt;Sessions&amp;hellip; and some more keynotes&amp;hellip;&lt;/h2&gt;

&lt;p&gt;Wednesday morning was &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/KEY-0002"&gt;all keynote presentations
again&lt;/a&gt;, though it
was more of a stream of shorter presentations. We got to see Visual Studio 11,
ScottGu finally came on stage and we saw a lot more about the developer side
of Windows 8. It was more appropriate for developers than the first day was. I
thought that Steve Ballmer&amp;rsquo;s closing words went over well &amp;ndash; he even gave an
homage to his famous &amp;ldquo;Developers, developers, developers&amp;rdquo; thing from a few
years back.&lt;/p&gt;

&lt;p&gt;With the morning keynote over, the afternoon finally began the traditional
sessions. In the interest of actually getting my post uploaded, I&amp;rsquo;ve decided
to only share my thoughts on the really interesting sessions that I attended.
Obviously check out the &lt;a href="http://www.buildwindows.com/Sessions/Schedule"&gt;full session list
online&lt;/a&gt;, because there were a
ton of WinRT sessions that will be valuable to you if you&amp;rsquo;re interested in
building Metro applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-973F"&gt;Windows Server 8&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This was a good session because it was really sort of a good overview of
everything coming in Server 8. There were parts on Hyper-V enhancements,
new PowerShell features and more. It wasn&amp;rsquo;t a groundbreaking session by
any means, but given that I do spend quite a bit of time working on
Server 2008, I figured it would be good to learn more. Feel free to skip
this one if you only deal with client-side applications, though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-816T"&gt;Future directions for C# and Visual
Basic&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ander&amp;rsquo;s presentation was likely one of my favorite of the entire week.
Obviously, he spent a lot of time talking about the new async features
in C# &amp;ndash; that wasn&amp;rsquo;t particularly exciting, because we&amp;rsquo;ve at least seen
that with preview builds for a while now. In fact, &lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2010/10/28/asynchrony-in-c-5-part-one.aspx"&gt;Eric Lippert did a
great series on the new async features that began almost a year
ago&lt;/a&gt;.
The really exciting announcement from my perspective was Roslyn,
otherwise known as &amp;ldquo;Compiler as a Service&amp;rdquo; for C#. There has been talk
about having the C# compiler as a service &lt;em&gt;forever&lt;/em&gt; so it is nice to
finally have this. The Visual Studio support for it seemed great. At the
time of this writing, it doesn&amp;rsquo;t appear that the Roslyn CTP has released
yet, but I imagine it will soon. I did want to point out that &lt;a href="http://www.mono-project.com/CsharpRepl"&gt;the Mono
team got the C# Compiler as a Service working
first&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-834T"&gt;What&amp;rsquo;s new in .NET Framework 4.5&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As a .NET developer, this talk was obviously of interest to me. The 4.5
version the .NET Framework will be an inplace upgrade, which means it
will be an upgrade to the current CLR version as opposed to a
side-by-side release like .NET 4.0 is to .NET 2.0. So, thus far, still 3
major versions of the CLR (1.1, 2.0 and 4.0 &amp;ndash; remember that 3.0 and 3.5
just run on top of 2.0&amp;hellip; yay for confusing version numbers). If you&amp;rsquo;re
doing any development in .NET, you&amp;rsquo;ll probably be interested in this
session.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-875T"&gt;Windows Runtime internals: understanding &amp;ldquo;Hello World&amp;rdquo;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The WinRT internals session is the only one that possibly rivaled
Ander&amp;rsquo;s session in my mind. It is also the session that showed that COM
is still alive and well! Okay, maybe not COM, but some iteration of COM.
I would say that Metro apps are closer to COM than .NET is. This session
digs into the hosting model for Metro apps, the registry lookup that
occurs for WinRT types, and more. I&amp;rsquo;m sure there are some developers out
there that are quite annoyed that COM is still alive and well, but the
thing is, this stuff has &lt;em&gt;always been there&lt;/em&gt;. Welcome to Windows. .NET
is built on COM. .NET objects all have a GUID&amp;hellip; just like COM objects.
I&amp;rsquo;m actually a big fan of how the WinRT types are exposed as .NET
metadata (winmd files). You can actually open them in ILDASM. &lt;a href="http://tirania.org/blog/archive/2011/Sep-15.html"&gt;Miguel de
Icaza has a really good post that goes into WinRT as well that I&amp;rsquo;d
recommend you check
out.&lt;/a&gt;. If you&amp;rsquo;re
interested in getting even &lt;em&gt;more&lt;/em&gt; deep into how WinRT works, though,
check out Ian Griffiths' posts on WinRT (see &lt;a href="http://www.interact-sw.co.uk/iangblog/2011/09/16/real-native-winrt"&gt;Real Native WinRT
Development&lt;/a&gt;
and &lt;a href="http://www.interact-sw.co.uk/iangblog/2011/09/25/native-winrt-inheritance"&gt;Native WinRT
Inheritance&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Thoughts on the tablet or Windows 8?&lt;/h2&gt;

&lt;p&gt;So, enough about the conference, though&amp;hellip; &lt;em&gt;how&amp;rsquo;s the tablet&lt;/em&gt;? It&amp;rsquo;s hard to
say. The most important thing to remember about Windows 8 is that it is a
developer preview &amp;ndash; &lt;strong&gt;NOT&lt;/strong&gt; a beta. Betas are occasionally buggy. Developer
previews are&amp;hellip; more than occasionally buggy. I let my wife try out the
tablet and she was so annoyed that she stopped using it. My favorite
application so far is OneNote, simply because I&amp;rsquo;m finally getting to try a
stylus and see how the Ink support is&amp;hellip; and that has nothing at all to do
with Windows 8. It&amp;rsquo;s almost too early to say. There aren&amp;rsquo;t any really
substantial applications yet. I think Microsoft really needs to build some
real applications in Metro before most people will be sold.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m planning another post at some point to talk about Windows 8 and Metro in
more detail, but I&amp;rsquo;m still trying to gather my thoughts together. Have you had
a chance to use Windows 8 yet? Any thoughts?&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=-oYccHSZhMw:aeKbAvyP1R4:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=-oYccHSZhMw:aeKbAvyP1R4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=-oYccHSZhMw:aeKbAvyP1R4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/-oYccHSZhMw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2011/10/14/build-windows-conference/</feedburner:origLink></entry>
  <entry>
    <title>WCF and service-side Timeouts</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/Ennw32CSUuc/" />
    <id>http://mohundro.com/blog/2011/08/19/wcf-and-service-side-timeouts/</id>
    <published>2011-08-19</published>
    <updated>2011-08-19</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;Ah, timeouts. At my previous job, I wrote quite a bit of code that dealt with
threading. When dealing with threads, asynchronous operations, and performant&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Ah, timeouts. At my previous job, I wrote quite a bit of code that dealt with
threading. When dealing with threads, asynchronous operations, and performant
UIs, you can&amp;rsquo;t always rely on callbacks to get you the results of some
asynchronous operation. Sometimes you also have to throw in some waits,
particularly if the UI gets to a point before the callback has happened.
Whenever I did have to write any code to wait for something (usually off an
AutoResetEvent or a ManualResetEvent), I &lt;em&gt;never&lt;/em&gt; wanted to actually specify a
timeout. What would my application do if it timed out? Would I retry again?
Would I just show the user an error? Instead of dealing with that question, I
just made the wait last for the default&amp;hellip; which in most cases is INFINITE.&lt;/p&gt;

&lt;p&gt;I guess circumstances change. Today, most of my code is from the web. Not only
that, but a lot of the code that I&amp;rsquo;m writing has dependencies on external
services (SOAP, REST, etc.). The &lt;a href="http://msdn.microsoft.com/en-us/library/e1f13641.aspx"&gt;default timeout for ASP.NET requests is 110
seconds (or 90 seconds in .NET 1.0 and 1.1)&lt;/a&gt;.
That is an eternity when you&amp;rsquo;re talking about a user browsing a web page. What if your
web page is calling a WCF service that is calling a web service? You might
trust your service, but do you trust the web service you&amp;rsquo;re calling?&lt;/p&gt;

&lt;h2&gt;What happens when service calls go CRAZY&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s up the stakes here &amp;ndash; WCF services default to allowing only 10
concurrent calls at a time. See, &lt;code&gt;maxConcurrentSessions&lt;/code&gt;. &lt;a href="http://msdn.microsoft.com/en-us/library/ms731379.aspx"&gt;Here&amp;rsquo;s the details from
MSDN&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A positive integer that specifies the maximum number of concurrent
connections to a single service. The service will accept connections in
excess of the limit, but only the channels below the limit are active
(messages are read from the channel). Setting this value to 0 is equivalent
to setting it to Int32.MaxValue. The default is 10.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I&amp;rsquo;ll point that default of 10 out again. The fact that it is that low is to
help protect against DoS attacks &amp;ndash; this is a good thing. However, it means
that the service can only work on 10 incoming calls at a time. What this means
practically speaking is that performance issues have the potential to pile up
quickly. If one request starts eating resources, it can slow the others down &amp;ndash;
it may not be long before you&amp;rsquo;ve filled up those 10 concurrent sessions.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s assume that the horrible service in question is written with an infinite
loop. Sort of like this:&lt;/p&gt;

&lt;p&gt;&lt;code class="cs"&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class TestServiceImpl : ITestService
{
    public TestResult TestIt(TestArgs args)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();

        // this is a contrived example, but it shows that WCF never stops this thread
        while (true)
        {
            Console.WriteLine("{0}&amp;gt; I'm running forever...", stopwatch.Elapsed);
        }

        return new TestResult {Result = "Args were " + args.Args};
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Will WCF do anything to help you out? Not really, at least from the
service side. You can configure the &lt;code&gt;receiveTimeout&lt;/code&gt;, &lt;code&gt;sendTimeout&lt;/code&gt;,
&lt;code&gt;closeTimeout&lt;/code&gt;, and the &lt;code&gt;openTimeout&lt;/code&gt; but these won&amp;rsquo;t really buy you anything
other than timing out the client. The service just keeps on going and going
and going&amp;hellip; and your user has given up and closed the browser.&lt;/p&gt;

&lt;p&gt;What is strange to me is that WCF doesn&amp;rsquo;t timeout requests while ASP.NET does.
At least ASP.NET will try to prevent that one bad request from eating
resources forever. I actually &lt;a href="http://stackoverflow.com/questions/4974640/why-doesnt-wcf-support-service-side-timeouts"&gt;asked about this on Stackoverflow because I was
baffled&lt;/a&gt;.
We even opened a case with Microsoft because we were running into problems
with this and we didn&amp;rsquo;t have any visibility into where our hang was. For all
we knew, it was an external service that wasn&amp;rsquo;t returning. It was really a
vicious hang cycle from which there was no return. Well, that was overly
dramatic, but you get the point.&lt;/p&gt;

&lt;h2&gt;The solution&amp;hellip; maybe?&lt;/h2&gt;

&lt;p&gt;One of my colleagues decided to take it upon himself to solve this. He
ended up writing his very own timeout monitor&amp;hellip; or what we affectionately
refer to as &amp;ldquo;the Thread Killer.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;The code works by spawning a single monitor thread that has an internal
collection of threads for each of the executing service calls. Each thread is
stored along with a ticket which keeps track of the timeout. Any time there
are any threads being monitored, a timer is ticking (currently every 250
milliseconds) and will abort any threads that have run for longer than
they should be. During the thread abort, the actual &lt;code&gt;ThreadAbortException&lt;/code&gt; is
caught and is reset, so that a true &lt;code&gt;TimeoutException&lt;/code&gt; can be thrown instead.&lt;/p&gt;

&lt;p&gt;Usage looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Run.For(10.Seconds(), () =&amp;gt; DoSomeStuff());
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basically, you pass in how long it should run (we&amp;rsquo;ve made it a little more
readable with some extension methods), and a delegate. When we&amp;rsquo;re working with
WCF, though, we don&amp;rsquo;t want this in our code &amp;ndash; this is an infrastructure
concern.&lt;/p&gt;

&lt;p&gt;WCF has the
&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ioperationinvoker.aspx"&gt;IOperationInvoker&lt;/a&gt;
interface that is used to invoke service operations. It works in conjunction
with an
&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior.aspx"&gt;IOperationBehavior&lt;/a&gt;,
which can be used to decorate service operations on the service contracts.&lt;/p&gt;

&lt;p&gt;So, the invoke method of our custom IOperationInvoker looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public object Invoke(object instance, object[] inputs, out object[] outputs)
{
    object[] inputOutputs = null;
    object returnValue = null;
    Run.For(_timeout, 
        () =&amp;gt;
        {
            returnValue = _decoratedInvoker.Invoke(instance, inputs, out inputOutputs);
        });
    outputs = inputOutputs;
    return returnValue;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If we were to hook up our custom behavior directly to a service contract, it
would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[ServiceContract]
public interface IAmAnAwesomeServiceContract
{
    [OperationContract]
    [OperationTimeoutBehavior(60)]
    OpResults GoFindSomeAwesomeStuff(OpArgs args);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, we would rather it happen for all of our services, so we implemented
a custom ServiceHost and we add our custom behavior in the OnOpening method.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;protected override void OnOpening()
{
    foreach (var op in Description.Endpoints
        .SelectMany(ep =&amp;gt; ep.Contract.Operations)
        .Where(op =&amp;gt; !op.Behaviors.Contains(typeof (OperationTimeoutBehavior))))
    {
        op.Behaviors.Add(new OperationTimeoutBehavior());
    }
    base.OnOpening();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above details could be used to hook in just about any behaviors around WCF
invocation, including pre and post call.&lt;/p&gt;

&lt;h2&gt;So, how does it work?&lt;/h2&gt;

&lt;p&gt;Well, with all of that work, you&amp;rsquo;d think it would fix our problems, right? It
did, indirectly &amp;ndash; it turns out that most of the cases that we were interested
in timing out were external service calls. It also turns out that aborting
threads doesn&amp;rsquo;t actually do anything when you&amp;rsquo;re dealing with external
service calls.&lt;/p&gt;

&lt;p&gt;Some thread abort history &amp;ndash; when you call the Abort method of some thread
instance, you&amp;rsquo;re not just killing the thread in question. What .NET is doing
for you behind the scenes is that it is injecting some IL that will throw the
ThreadAbortException on the thread in question. If your code is waiting on
unmanaged execution (networking calls, SQL calls, etc all go unmanaged at some
point), your thread abort may never be thrown.&lt;/p&gt;

&lt;p&gt;The solution in this case is to set the timeouts at each level &amp;ndash; if you&amp;rsquo;re
working with a SQL call, make sure that the &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx"&gt;&lt;code&gt;CommandTimeout&lt;/code&gt;&lt;/a&gt; is being set. If
you&amp;rsquo;re working with a web service, there is a &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.services.protocols.webclientprotocol.timeout.aspx"&gt;&lt;code&gt;Timeout&lt;/code&gt;&lt;/a&gt; property that can be set
there.&lt;/p&gt;

&lt;p&gt;By ensuring that all of our SQL calls and service calls had appropriate
timeouts on them, we caught 99% of the problem areas.&lt;/p&gt;

&lt;h2&gt;Then&amp;hellip; what about thread abort?&lt;/h2&gt;

&lt;p&gt;By the time we had properly coded timeouts around our problem areas, we had
already coded our thread abort solution. I didn&amp;rsquo;t mention how that went for
the first deployment&amp;hellip; it went pretty badly actually. It turns out that you
can thread abort the dispatcher thread for WCF and, while the service stays
up, it will stop responding to requests. Our only recourse was to kill the
worker process serving the requests.&lt;/p&gt;

&lt;p&gt;Thread aborts are &lt;em&gt;dangerous&lt;/em&gt;. You are playing with fire.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort/1560567#1560567"&gt;Eric Lippert says it &amp;ldquo;should be avoided at all costs&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2010/02/22/should-i-specify-a-timeout.aspx"&gt;Eric Lippert also calls it an axe&amp;hellip; an axe that you should be careful with&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/4974640/why-doesnt-wcf-support-service-side-timeouts/4974721#4974721"&gt;Jeffrey&amp;rsquo;s answer to my question calls it &amp;ldquo;insanely error-prone&amp;rdquo;&amp;hellip; and I
agree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;On the other hand, using them along with our error logging helped point us to
the performance problems in the first place. We might still have been dealing
with performance problems had we not started down the thread abort path. The
thread abort solution &lt;em&gt;would&lt;/em&gt; have helped us catch our horrible infinite loop
example above&amp;hellip; though thankfully we don&amp;rsquo;t have any code like that!&lt;/p&gt;

&lt;h2&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve been trying to think of other things that we could have done to have
prevented this issue.&lt;/p&gt;

&lt;p&gt;One potential solution might have been logging (WCF provides &lt;a href="http://msdn.microsoft.com/en-us/library/ms733025.aspx"&gt;extensive
tracing support&lt;/a&gt;). I&amp;rsquo;m
not convinced this would have helped us though, because the errors we were
actually seeing were relatively sporadic. We didn&amp;rsquo;t know anything strange was
happening &lt;em&gt;until&lt;/em&gt; we started seeing system errors. To effectively have seen
this, we would have had to add system wide logging across the board &amp;ndash; we
didn&amp;rsquo;t have visibility into the problem in order to inform us about where the
problem even was! We&amp;rsquo;ll likely add better logging (see &lt;a href="http://ayende.com/blog/4276/what-kind-of-logging-should-you-do-in-production"&gt;Ayende&amp;rsquo;s
post&lt;/a&gt;)
but it will take time. Another thing about logging is that it can be very difficult
to know what kind of logging is needed before issues occur. In hindsight, well
sure we&amp;rsquo;d have loved to have logged service entry and exit points along with
times along with the parameters that were involved when the slowdown occurred!&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve thought about whether or not the usage of asynchronous service calls
would have helped also. I think it might have prevented as many system hangs
(particularly if I/O Completion Ports are being used for waiting for responses
instead of thread pool threads), but it wouldn&amp;rsquo;t have done anything to inform
us of the actual problems.&lt;/p&gt;

&lt;p&gt;In sharing this post, I want to point out the things we learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WCF doesn&amp;rsquo;t time services out &amp;ndash; at all (certainly not with TCP or named pipe bindings)&lt;/li&gt;
&lt;li&gt;It isn&amp;rsquo;t all that hard to decorate all service calls&lt;/li&gt;
&lt;li&gt;Thread abort is dangerous&lt;/li&gt;
&lt;li&gt;Thread abort is really dangerous&lt;/li&gt;
&lt;li&gt;Thread abort doesn&amp;rsquo;t always abort&lt;/li&gt;
&lt;li&gt;Most components that might run for a long time provide timeout facilities of
their own&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Hope this helps.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=Ennw32CSUuc:G68rUDknz8g:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=Ennw32CSUuc:G68rUDknz8g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=Ennw32CSUuc:G68rUDknz8g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/Ennw32CSUuc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2011/08/19/wcf-and-service-side-timeouts/</feedburner:origLink></entry>
  <entry>
    <title>Introducing Daila Joy!</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/3YPZsNZSekg/" />
    <id>http://mohundro.com/blog/2011/06/24/introducing-daila-joy/</id>
    <published>2011-06-24</published>
    <updated>2011-06-24</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;The Mohundro family has some big news&amp;hellip; our first child was just born a
couple of weeks ago! Both mother and daughter are doing great!&lt;/p&gt;

&lt;p&gt;The past couple of weeks have just been a series of events to help us &amp;ldquo;learn&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;The Mohundro family has some big news&amp;hellip; our first child was just born a
couple of weeks ago! Both mother and daughter are doing great!&lt;/p&gt;

&lt;p&gt;The past couple of weeks have just been a series of events to help us &amp;ldquo;learn
how to be parents.&amp;rdquo; We read quite a few books during the pregnancy
(particularly my wife), but nothing can really prepare you for when the baby
gets here. (don&amp;rsquo;t get me wrong, definitely try to prepare and learn, though &amp;ndash;
we&amp;rsquo;re more prepared than we would&amp;rsquo;ve been!)&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s a photo that I took of her a few days ago:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2011-06-24-daila-joy.jpg" alt="Daila Joy" /&gt;&lt;/p&gt;

&lt;p&gt;Highlights thus far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Experiencing my first &amp;ldquo;is that poop or chocolate&amp;rdquo; moment (it was chocolate)&lt;/li&gt;
&lt;li&gt;Learning how to dress a baby whose arms and legs DO NOT STOP MOVING&lt;/li&gt;
&lt;li&gt;Holding my daughter for the first time&lt;/li&gt;
&lt;li&gt;Having her turn to my voice within minutes of being born!&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=3YPZsNZSekg:9hTH4Cvpa3Q:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=3YPZsNZSekg:9hTH4Cvpa3Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=3YPZsNZSekg:9hTH4Cvpa3Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/3YPZsNZSekg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2011/06/24/introducing-daila-joy/</feedburner:origLink></entry>
  <entry>
    <title>Fun with binary!</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/xeBnhhDWxXw/" />
    <id>http://mohundro.com/blog/2011/05/31/fun-with-binary/</id>
    <published>2011-05-31</published>
    <updated>2011-05-31</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;I know what you&amp;rsquo;re thinking&amp;hellip; &amp;ldquo;did he just say &amp;lsquo;binary data&amp;rsquo;? Like, 1&amp;rsquo;s and
0&amp;rsquo;s?&amp;rdquo; Well, yes, yes I did.  If you&amp;rsquo;re like me, the last time you actively had&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;I know what you&amp;rsquo;re thinking&amp;hellip; &amp;ldquo;did he just say &amp;lsquo;binary data&amp;rsquo;? Like, 1&amp;rsquo;s and
0&amp;rsquo;s?&amp;rdquo; Well, yes, yes I did.  If you&amp;rsquo;re like me, the last time you actively had
to do anything with straight binary data was in college when you were learning
how to convert between binary to hex to decimal and back again. I would imagine
that most of us run into hex somewhat frequently, but that we don&amp;rsquo;t actually
have to deal with binary data as often.&lt;/p&gt;

&lt;h2&gt;Some Background&lt;/h2&gt;

&lt;p&gt;On one of my recent projects, I had to write an API that interfaced with some
hardware, which was something relatively new to me. Most of my work in the
past has been either standard client-side GUI applications or web
applications. I have yet to have written any applications that talk over a
serial port. Even with this new project, I didn&amp;rsquo;t have to talk over ports
because the hardware had a relatively nice .NET SDK for it. The primary
flaw with the SDK was that it still had quite a few methods that only returned
byte arrays. The documentation for those byte arrays was specified in a table
of bits&amp;hellip; in other words, if the second bit in the fourth byte is on, then one
feature is accessible&amp;hellip; you get the idea. In many cases, I had to parse out
these bits to determine what the hardware was actually returning me.&lt;/p&gt;

&lt;p&gt;I can&amp;rsquo;t show you any of the code that I used in this project, but I can
provide a similar example. You know TCP, right? One of the network protocols
that we use every day without even thinking? Here&amp;rsquo;s an image from Wikipedia
that shows the structure for the TCP header (via
&lt;a href="http://en.wikipedia.org/wiki/Transmission_Control_Protocol"&gt;Wikipedia&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2011-05-31-tcp-header.png" alt="TCP Header" /&gt;&lt;/p&gt;

&lt;p&gt;For fun, let&amp;rsquo;s assume that that we&amp;rsquo;ve been provided the below data and we&amp;rsquo;d
like to parse this into a structure that looks more like the table the TCP
spec has.&lt;/p&gt;

&lt;p&gt;First, in hex:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0000   de 39 00 50 d5 99 75 e4 02 50 89 dc 50 18 01 01  .9.P..u..P..P...
0010   cc 87 00 00                                      ....
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, in binary:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0000   11011110 00111001 00000000 01010000 11010101 10011001 01110101 11100100   .9.P..u.
0008   00000010 01010000 10001001 11011100 01010000 00011000 00000001 00000001   .P..P...
0010   11001100 10000111 00000000 00000000                                       ....
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(for those who are curious, I got this data from Wireshark)&lt;/p&gt;

&lt;p&gt;Of course, I wasn&amp;rsquo;t provided my bytes in such a pretty format&amp;hellip; byte arrays
are going to look a lot more like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0xde, 0x39, 0x00, 0x50, 0xd5, 0x99, 0x75, 0xe4, 0x02, 0x50, 0x89, 0xdc, 
0x50, 0x18, 0x01, 0x01, 0xcc, 0x87, 0x00, 0x00
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;The Naive (and horribly non-performant) Way&lt;/h2&gt;

&lt;p&gt;My first step was to see the structure of what I was getting passed. I&amp;rsquo;m not
like those guys in movies &amp;ndash; I don&amp;rsquo;t dream in binary and I sure don&amp;rsquo;t see
structure in ones and zeros. So, I wanted to get the data into a tabular
format. To do so, my first stop was Powershell.&lt;/p&gt;

&lt;p&gt;Given the above byte array, all it took was the below snippet of Powershell
(note that I used the 0x prefix with the hex values&amp;hellip; there isn&amp;rsquo;t any binary
literal notation):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$bytes = [byte[]](0xde, 0x39, 0x00, 0x50, 0xd5, 0x99, 0x75, 0xe4, 0x02,
                  0x50, 0x89, 0xdc, 0x50, 0x18, 0x01, 0x01, 0xcc, 0x87, 
                  0x00, 0x00)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now that we&amp;rsquo;ve got a byte array, we can start to play around with it. I
created the following script that I named Get-ByteTable.ps1:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;param (
  [Parameter(ValueFromPipeline=$true)]
  [byte]
  $bytes,

  [int]
  $rowLength = 8
)

begin {
  $offset = 0
  $bitIndex = 0
  $byteTable = ''

  Set-Variable -name LENGTH_OF_BYTE_IN_BINARY -value 8 -option constant

  function To-Binary {
    param (
      [Parameter(ValueFromPipeline=$true)]
      [int]$num
    )
    [Convert]::ToString($num, 2)
  }

  function outputByteRow {
    if ($byteTable.Length -lt $rowLength) {
      $byteTable = $byteTable.PadLeft($rowLength, '0')
    }

    $hexValue = "0x{0:X$($rowLength / 4)}" -f $([Convert]::ToInt64($byteTable, 2))

    $bitIndex = 0
    $table = New-Object PSObject

    $table |
      Add-Member NoteProperty 'Offset' ($offset - $rowLength) -pass |
      Add-Member NoteProperty 'Hex' $hexValue

    for (; $bitIndex -lt $rowLength; $bitIndex++) {
      $table |
        Add-Member NoteProperty "$bitIndex" $byteTable.Substring($bitIndex, 1)
    }

    $table
  }
}

process {
  if ($byteTable.Length -ge $rowLength) {
    outputByteRow
    $byteTable = ''
  }

  $byteTable = $byteTable + ($bytes | To-Binary).PadLeft(8, '0')

  $offset += $LENGTH_OF_BYTE_IN_BINARY
}

end {}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basically, the usage is just &lt;code&gt;$bytes | Get-ByteTable.ps1&lt;/code&gt;. Now, the issue then
is output formatting&amp;hellip; that just dumps the list of PSObjects out and the
default format is &lt;code&gt;Format-List&lt;/code&gt;. So, let&amp;rsquo;s try, &lt;code&gt;$bytes | Get-ByteTable.ps1 |
Format-Table -AutoSize -Property *&lt;/code&gt;. The &lt;code&gt;AutoSize&lt;/code&gt; flag informs Powershell to
use as little space as possible and the &lt;code&gt;Property *&lt;/code&gt; flag tells Powershell to
output &lt;em&gt;all&lt;/em&gt; properties as columns&amp;hellip; if you don&amp;rsquo;t do this, Powershell will
only output some of the columns. The script also has a parameter if you want
to specify the row length. If you&amp;rsquo;d rather work with the data in something like
Excel, you could pipe the output to &lt;code&gt;Export-Csv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Check out the below sample output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; $bytes | Get-ByteTable.ps1 -rowlength 32 | Format-Table -AutoSize -Property *

Offset Hex        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
------ ---        - - - - - - - - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
     0 0xDE390050 1 1 0 1 1 1 1 0 0 0 1  1  1  0  0  1  0  0  0  0  0  0  0  0  0  1  0  1  0  0  0  0
    32 0xD59975E4 1 1 0 1 0 1 0 1 1 0 0  1  1  0  0  1  0  1  1  1  0  1  0  1  1  1  1  0  0  1  0  0
    64 0x025089DC 0 0 0 0 0 0 1 0 0 1 0  1  0  0  0  0  1  0  0  0  1  0  0  1  1  1  0  1  1  1  0  0
    96 0x50180101 0 1 0 1 0 0 0 0 0 0 0  1  1  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can use this table to line up our values with what we saw from the TCP
header protocol. For example, bits 0-15 make up our source port. In the table
above, those bits come out to be 1101111000111001&amp;hellip; or 56889 in decimal. This
lines up with what we can see in Wireshark, so our script works as expected.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2011-05-31-wireshark-tcp.png" alt="Wireshark's TCP view" /&gt;&lt;/p&gt;

&lt;h2&gt;The Better (and more Programmatic) Way&lt;/h2&gt;

&lt;p&gt;Okay, so that Powershell script was fun. But seriously, it was &lt;em&gt;not&lt;/em&gt; the right
way to deal with binary data. We took bits (i.e. 0&amp;rsquo;s and 1&amp;rsquo;s) and converted
them to hex&amp;hellip; but hex &lt;em&gt;as a string&lt;/em&gt;. And then we &lt;em&gt;parsed&lt;/em&gt; it. Not only was it
non-performant, but it was also an explosion of data.&lt;/p&gt;

&lt;p&gt;A better way to parse binary data is the
&lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx"&gt;System.Collections.BitArray&lt;/a&gt;
class. It takes in a byte array and presents that byte array as an array of
booleans&amp;hellip; true is to 1 as false is to 0. Pretty easy.&lt;/p&gt;

&lt;p&gt;Now, the BitArray class doesn&amp;rsquo;t ship with any means of working with the data
in a tabular format. It isn&amp;rsquo;t a big hurdle, but it was something that I wanted
to be able to do because the specification I was dealing with showed the bits
in a tabular structure, too. Actually treating the one array in a tabular way
is easy (i.e. rowLength * rowIndex + columnIndex = actualIndex) and is best
served via extension methods as shown below:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Note that I've set a constant BYTE_LENGTH below, which effectively
// serves as the row length... it would be easy enough to specify a 
// different row length via another parameter.
internal static class Extensions
{
  private const int BYTE_LENGTH = 8;

  public static IEnumerable&amp;lt;bool&amp;gt; GetRowBits(this BitArray bits, int row)
  {
    var startIndex = BYTE_LENGTH * row;
    var endIndex = startIndex + BYTE_LENGTH;
    for (var i = startIndex; i &amp;lt; endIndex; i++)
    {
      yield return bits[i];
    }
  }

  public static void Set(this BitArray bits, int rowIndex, int columnIndex, bool value)
  {
    var startIndex = BYTE_LENGTH * rowIndex;
    bits.Set(startIndex + columnIndex, value);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Usage then would be:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// assume bytes is an already populated byte array.
var bits = new BitArray(bytes);

// to get the bit at 0,4
var bit = bits.GetRowBits(0).ElementAt(4);

// to set the bit at 5,4 ON
bits.Set(5, 4, true);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I&amp;rsquo;m not particularly happy with the method names and I haven&amp;rsquo;t come up with a
great way to specify the row length&amp;hellip; as it stands now, my extensions are
using the row length of 8 (&lt;code&gt;BYTE_LENGTH&lt;/code&gt;). I would guess the best way to handle
it would be to wrap the BitArray class instead of actually using extension
methods.&lt;/p&gt;

&lt;h2&gt;Who Knew Calc Could Do That?!?&lt;/h2&gt;

&lt;p&gt;The final thing I wanted to share is some calc.exe awesomeness. First, ensure
that you&amp;rsquo;re running calc.exe in &amp;ldquo;Programmer&amp;rdquo; mode.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2011-05-31-calc-programmer-mode.png" alt="Calc in Programmer Mode" /&gt;&lt;/p&gt;

&lt;p&gt;Next, let&amp;rsquo;s start in Dec (decimal) mode and type in 255. Of course, you can
change between decimal, hex, octal or binary and see the resultant numbers.
This didn&amp;rsquo;t surprise me. However, notice the the section beneath the number
display, where it shows the binary for your number.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2011-05-31-calc-binary-display.png" alt="Calc binary display" /&gt;&lt;/p&gt;

&lt;p&gt;Try clicking one of the bits. It&amp;rsquo;s awesome.&lt;/p&gt;

&lt;p&gt;It flips the bit for you! I had no idea calc could do that! One of the things
I really like about some of the &amp;ldquo;programmer&amp;rdquo; features of calc is that you can
now visually see what happens when you right or left shift bits (Lsh and Rsh
respectively). Turns out it is a really good tool for visually observing bit
operations. Not only that, but it is also good at helping explain things like
&lt;a href="http://en.wikipedia.org/wiki/Two's_complement"&gt;&amp;ldquo;Two&amp;rsquo;s complement&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=xeBnhhDWxXw:CXIzR7S5QjE:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=xeBnhhDWxXw:CXIzR7S5QjE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=xeBnhhDWxXw:CXIzR7S5QjE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/xeBnhhDWxXw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2011/05/31/fun-with-binary/</feedburner:origLink></entry>
  <entry>
    <title>A custom switch statement in C#</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/-MpUqwD0mR8/" />
    <id>http://mohundro.com/blog/2011/01/10/a-custom-switch-statement-in-c/</id>
    <published>2011-01-10</published>
    <updated>2011-01-10</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;I don&amp;rsquo;t usually do blog requests, but then again, I don&amp;rsquo;t usually get blog
requests. I&amp;rsquo;ve got a few friends that I email back and forth with regarding&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;I don&amp;rsquo;t usually do blog requests, but then again, I don&amp;rsquo;t usually get blog
requests. I&amp;rsquo;ve got a few friends that I email back and forth with regarding
technology, programming languages or whatever else piques our interests.&lt;/p&gt;

&lt;p&gt;This particular time, my friend was complaining about the switch statement in
C# versus VB.NET.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s true, actually. VB&amp;rsquo;s &lt;code&gt;Select&lt;/code&gt; statement is more powerful than the
&lt;code&gt;switch&lt;/code&gt; statement in C#. In VB.NET, you can do things like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Select Case num
  Case 1 to 10
    'do something
  Case 11 to 20
    'do another thing
  Case Else
    'do the default
End Select
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Whereas, this isn&amp;rsquo;t possible in C# with the switch statement. However, that
doesn&amp;rsquo;t really bother me much.&lt;/p&gt;

&lt;p&gt;Besides, I initially responded with the whole &amp;ldquo;prefer polymorphism over
conditionals&amp;rdquo; thing anyway. You know.&lt;/p&gt;

&lt;p&gt;We went back and forth a little bit and he mentioned that he&amp;rsquo;d rather see a
switch statement that accepted lambdas or delegates to choose the action to
take. This reminded me of switch statements in both Ruby and PowerShell.&lt;/p&gt;

&lt;p&gt;In Ruby, you&amp;rsquo;ve got the case statement:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;case some_var
  when nil
    # executes if some_var is null
  when String
    # executes if some_var is a string
  when 42
    # executes if some_var equals 42
  when /regex/
    # executes if some_var matches the regex
  when 1..10
    # executes when some_var is between 1 and 10
  else
    # the catch all
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, the case statement in Ruby is &lt;em&gt;very&lt;/em&gt; powerful.&lt;/p&gt;

&lt;p&gt;PowerShell&amp;rsquo;s switch statement can take arguments (i.e. -wildcard, -regex,
etc.) to let it match on different things. Like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;switch -regex ($a) { 
    "[a-d]" {"$a matches the first group."} 
    "[e-g]" {"$a matches the second group."} 
    "[h-k]" {"$a matches the third group."} 
    default {"$a didn't match any of the cases."}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, when looking at all of these other switch statements, C#&amp;rsquo;s version does
look sort of weak. But hey, we&amp;rsquo;re programmers. Surely we can solve this
ourselves, right?&lt;/p&gt;

&lt;p&gt;The first step I took was to write out the code I was interested in. My
friend had sent an initial snippet that included a non-existent keyword called
&amp;ldquo;swatch&amp;rdquo; that did allow for much more powerful checks &amp;ndash; primarily by
delegating off to lambdas. His proof of concept snippet looked like
this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// this is *pseudocode* - it won't compile!
swatch (myObject)
{
  case myObj =&amp;gt; return myObj == null:
    Console.Writeline("the object is null");
    break;
  case myObj =&amp;gt; return myObj.property1 == 3:
    Console.Writeline("the object's property1 value is three");
    break;
  case myObj =&amp;gt; return myObj.myCollection.Contains(4):
    Console.Writeline("the object's collection contains the 4 value");
    break;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, I&amp;rsquo;ve got something to start with. How can I tweak this into valid C#? I
began with writing the code that I wanted first. In other words, I&amp;rsquo;m designing
the API of the class from the outside, not from the inside. This is one of the
best benefits of writing tests first &amp;ndash; you get to build the API as a consumer
of the class first.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s what I initially came up with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var accts = new List&amp;lt;Account&amp;gt;
                {
                  new Account 
                  {
                    Name = "Amazon", 
                    IsPreferred = true, 
                    Moolah = 123456789.01m
                  },
                  new Account 
                  {
                    Name = "Bob's Store", 
                    IsPreferred = false, 
                    Moolah = 15.78m
                  }
                };

var swatch = new Switcher&amp;lt;Account&amp;gt;();

foreach (var acct in accts)
{
  swatch.Switch(acct,
    swatch.Case(x =&amp;gt; x == null,
      x =&amp;gt; Console.WriteLine("the object is null")),

    swatch.Case(x =&amp;gt; x.Moolah &amp;gt; 10000.00m,
      x =&amp;gt; Console.WriteLine("Whoa, these guys (" + x.Name + ") got some money")),

    swatch.Default(
      x =&amp;gt; Console.WriteLine("wha?!?"))
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above syntax &lt;em&gt;can&lt;/em&gt; work. We just need to implement the Switcher&amp;lt;T&amp;gt; class.&lt;/p&gt;

&lt;p&gt;Here it is, in its entirety:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Switcher&amp;lt;T&amp;gt;
{
  public Decision Case(Predicate&amp;lt;T&amp;gt; condition, Action&amp;lt;T&amp;gt; branch)
  {
    return new Decision {Condition = condition, Branch = branch};
  }

  public Decision Default(Action&amp;lt;T&amp;gt; branch)
  {
    return new Decision {Condition = x =&amp;gt; true, Branch = branch};
  }

  public void Switch(T instance, params Decision[] cases)
  {
    foreach (var @case in cases)
    {
      if (@case.Condition(instance))
      {
        @case.Branch(instance);
        break;
      }
    }
  }

  public class Decision
  {
    public Predicate&amp;lt;T&amp;gt; Condition { get; set; }
    public Action&amp;lt;T&amp;gt; Branch { get; set; }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The code isn&amp;rsquo;t complete &amp;ndash; it doesn&amp;rsquo;t do any checks to ensure that only one
Default case is passed in. It also doesn&amp;rsquo;t do anything to ensure that the
Default case is the last one to be checked. We can leave that as an exercise
to the reader perhaps. Other types of case methods could be added such as
TypeOf that evaluates the action if the instance is of the type specified
(i.e. &lt;code&gt;swatch.TypeOf&amp;lt;Foo&amp;gt;()&lt;/code&gt;). It would also be pretty easy to add in a
RegEx case method, too (i.e.  &lt;code&gt;swatch.RegEx("[a-z]")&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;After responding to the email, I considered that it would also be possible to
implement this in a fluent interface style of API. It might be interesting to
try that, too.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=-MpUqwD0mR8:kdXTCzh4M5s:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=-MpUqwD0mR8:kdXTCzh4M5s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=-MpUqwD0mR8:kdXTCzh4M5s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/-MpUqwD0mR8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2011/01/10/a-custom-switch-statement-in-c/</feedburner:origLink></entry>
  <entry>
    <title>Chrome OS Cr-48 Review</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/K7hDnGvi-Zs/" />
    <id>http://mohundro.com/blog/2010/12/30/chrome-os-cr-48-review/</id>
    <published>2010-12-30</published>
    <updated>2010-12-30</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;Surely you&amp;rsquo;ve heard of the &lt;a href="http://www.google.com/chromeos/"&gt;Chrome OS&lt;/a&gt; by
now? If not, well, Chrome OS is a new operating system from Google that
&amp;ldquo;provides a fast, simple, and more secure computing experience for people who&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Surely you&amp;rsquo;ve heard of the &lt;a href="http://www.google.com/chromeos/"&gt;Chrome OS&lt;/a&gt; by
now? If not, well, Chrome OS is a new operating system from Google that
&amp;ldquo;provides a fast, simple, and more secure computing experience for people who
spend most of their time on the web.&amp;rdquo; (from the &lt;a href="http://www.chromium.org/chromium-os"&gt;Chromium OS project
page&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The big news around Chrome OS lately is that &lt;a href="http://www.google.com/chromeos/pilot-program.html"&gt;Google is running a pilot
program&lt;/a&gt; where volunteers
can sign up in the program to receive a notebook from Google that is running
Chrome OS. Basically, it&amp;rsquo;s a beta test for Chrome OS that includes a laptop.&lt;/p&gt;

&lt;p&gt;Of course, I signed up.&lt;/p&gt;

&lt;h2&gt;What&amp;rsquo;s in the box?&lt;/h2&gt;

&lt;p&gt;I didn&amp;rsquo;t expect to hear anything out of it, but hey, I like playing around
with technology. One morning, after my wife had already left for work, I
walked into the dining room and, lo and behold, a box was sitting on the
table. It was clearly something that had been shipped to us, but that&amp;rsquo;s all I
knew. I hadn&amp;rsquo;t ordered anything recently so I gave her a call &amp;ndash; she didn&amp;rsquo;t
know what it was either, except that it had been sitting on our front door
step.&lt;/p&gt;

&lt;p&gt;So what did I do? I opened it of course. Here&amp;rsquo;s what I found in the box:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-Box.jpg" alt="The Cr-48 laptops come in the best boxes ever!" /&gt;&lt;/p&gt;

&lt;p&gt;I knew it was either a Cr-48 laptop or a small, hamster-powered spaceship.
Considering that I had already read reviews from others who had received the
laptop, I knew it &lt;em&gt;wasn&amp;rsquo;t&lt;/em&gt; the hamster-powered spaceship.&lt;/p&gt;

&lt;h2&gt;Opening it and using it&lt;/h2&gt;

&lt;p&gt;I ended up taking the whole box with me to work that day because I knew all of
my co-workers would be interested in seeing it. When I got there, I took out
and got it hooked up.&lt;/p&gt;

&lt;p&gt;Out of the box, it&amp;rsquo;s a pretty standard black notebook. It&amp;rsquo;s pretty small and
light, at least compared to my 15 inch laptop, which I like.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-just-the-laptop.jpg" alt="The laptop" /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, there aren&amp;rsquo;t any logos on top or anything. The laptop has an
interesting finish &amp;ndash; it almost feels like soft plastic or something. I don&amp;rsquo;t
know how to describe it.&lt;/p&gt;

&lt;p&gt;Upon opening it, it starts immediately &amp;ndash; yeah, no pressing a button, just
instant on. I like that aspect &amp;ndash; especially considering it starts quickly. It
might be annoying if it turned on immediately but that meant a 60 second boot.
Instead, you see the Chrome OS logo and, very soon after, the welcome screen.&lt;/p&gt;

&lt;p&gt;Set up involves logging in with your Google ID and getting your picture taken
by the built-in webcam &amp;ndash; pretty easy. If you&amp;rsquo;ve got any Chrome syncing set up,
your Chrome extensions, bookmarks and whatever else is set up to be synced
will be pulled in.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-webcam.jpg" alt="It even has a webcam on it!" /&gt;&lt;/p&gt;

&lt;p&gt;It found our wireless at work without any problems so I was online quickly. As
an aside, the pilot laptops come with a free 100 MB plan with Verizon if a
wireless access point isn&amp;rsquo;t available.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-open-to-my-website.jpg" alt="The first site I visited was mine, of course" /&gt;&lt;/p&gt;

&lt;p&gt;The browsing experience is pretty much just like using the Chrome browser. The
biggest difference is you can&amp;rsquo;t switch to a different application. You&amp;rsquo;ve got
Chrome&amp;hellip; full-screen. That&amp;rsquo;s it. You can have multiple Chrome windows open,
sure, but it feels more like separate tab groups to me.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-setup-menu.jpg" alt="The preferences/setup/toolbar menu" /&gt;&lt;/p&gt;

&lt;p&gt;OS related settings can all be found under the wrench toolbar button &amp;ndash; which
is almost identical to what the Chrome browser has. In fact, I see two
differences: 1) &amp;ldquo;About Google Chrome&amp;rdquo; is called &amp;ldquo;About Chrome OS&amp;rdquo; instead and
2) &amp;ldquo;Exit&amp;rdquo; is &amp;ldquo;Sign out&amp;rdquo;. That&amp;rsquo;s it.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/mohundro/blog/2010-12-30-Cr48-settings.jpg" alt="The settings in Chrome OS" /&gt;&lt;/p&gt;

&lt;p&gt;The actual settings in Chrome OS open up in a separate tab and include a few
more settings than the browser does, but mostly they&amp;rsquo;re related to the
operating system (things like time zone and account settings).&lt;/p&gt;

&lt;h2&gt;So, do I like it?&lt;/h2&gt;

&lt;p&gt;Well&amp;hellip; yes. And no. I mean, it depends.&lt;/p&gt;

&lt;p&gt;I completely respect Google for taking the steps they are here. A laptop that
can &lt;em&gt;only&lt;/em&gt; browse the internet &amp;ndash; I mean, a few years ago, I would never have
dreamed of dropping Outlook in favor of a webmail based email. But I use Gmail
now and I find that I miss features of it in Outlook. So yeah, things are
moving to the web. But can I do everything there? I personally can&amp;rsquo;t, but the
steps that Google is taking will make it more of a reality faster than
anything else I can think of.&lt;/p&gt;

&lt;p&gt;So, what do I like?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Browsing on it is fine. My preferred browser is Chrome when I&amp;rsquo;m on my other
computers so I like it on Chrome OS, too. Basically everything you like
about Chrome you&amp;rsquo;ll like in Chrome OS. If you can&amp;rsquo;t stand browsing in
Chrome, chances are good you won&amp;rsquo;t like browsing in Chrome OS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I like the form factor &amp;ndash; the notebook is small. It&amp;rsquo;d be awesome to travel
with this notebook.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The suspend and resume actions are flawless and ridiculously fast. I&amp;rsquo;m not
running on any SSDs so I can&amp;rsquo;t compare, but it wakes up faster than any of
my other devices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What do I dislike?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The trackpad. I can&amp;rsquo;t stand the trackpad. It seems like they tried to make
the trackpad like the trackpads that come on MacBooks. MacBook trackpads are
awesome. This one feels cheap. When I&amp;rsquo;m typing, I consistently brush up
against and make the mouse jump. It does support tap to click, which lets me
avoid the click. It does have gestures to support scrolling &amp;ndash; again, like
the MacBooks. So, two-finger swipes make it scroll up or down. It all sounds
great in theory except that it isn&amp;rsquo;t very precise. At one point, it scrolls
slowly and then, all of sudden, I&amp;rsquo;m at the bottom of the page. I don&amp;rsquo;t know,
maybe I&amp;rsquo;m just not used to trackpads, but I&amp;rsquo;ve heard from others that they
feel that the trackpad isn&amp;rsquo;t very good.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The keyboard. Okay, the keyboard isn&amp;rsquo;t terrible. I typed a longish email
last night and it worked well for the most part. I just hate the &amp;ldquo;1&amp;rdquo; key on
the keyboard. It gets stuck. Stuck to the point where I have to lift my
hands off the keyboard to put some weight behind it before it presses with
an audible click. It completely messes up my rhythm while typing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The speed. Browsing is fine, but the hardware isn&amp;rsquo;t the fastest in the
world. It&amp;rsquo;s clear that it can&amp;rsquo;t always keep up with the data being pulled in
on the screen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What&amp;rsquo;s just plain strange?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I find it strange that some settings are global to the operating system. For
example, tap to click on the trackpad. Say I like tap to click but my wife
doesn&amp;rsquo;t. We&amp;rsquo;d have to change it each time one of us got on. Maybe that&amp;rsquo;s
standard, but it does seem a little odd.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the notebook hasn&amp;rsquo;t been turned on in a while, the entire screen gets a
lot of lines across the top &amp;ndash; sort of like old tube TVs do. I actually
thought I got a bad notebook at first, but it always clears up after a few
seconds.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Overall&lt;/h2&gt;

&lt;p&gt;Overall, I like it. The majority of my complaints are based on the hardware. I
honestly hope that a lot of this is because it is commodity hardware that is
being used for the actual test driving. I wouldn&amp;rsquo;t want to pay for some of this
hardware. I&amp;rsquo;m hopeful these things will get worked out before they go on sale.&lt;/p&gt;

&lt;p&gt;This can&amp;rsquo;t replace my other computers. I know they have some cloud editors for
code, but those aren&amp;rsquo;t going to cut it for me. I&amp;rsquo;ll at least need a CloudVim
first :) I was planning on taking the notebook with me over the holidays, but
I needed to be able to VPN in to work, so I had to leave it at home &amp;ndash; my wife
wouldn&amp;rsquo;t let me take two laptops!  I also miss my command line (whether it is
PowerShell, bash or zsh, I don&amp;rsquo;t care &amp;ndash; I just want some kind of command
line).&lt;/p&gt;

&lt;p&gt;Now, interestingly enough, you can get to a command prompt, but you&amp;rsquo;ve got to
&lt;a href="http://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information"&gt;put the notebook into &amp;ldquo;Developer
Mode&amp;rdquo;&lt;/a&gt;.
If you follow that link, you&amp;rsquo;ll find that this involves removing the battery,
peeling back some protective tape, and flipping a magic switch. Once you&amp;rsquo;ve
done this, you can get into a &amp;ldquo;chrosh&amp;rdquo; shell &amp;ndash; it isn&amp;rsquo;t bash, its chrosh. I
haven&amp;rsquo;t done this myself yet, but I&amp;rsquo;m planning on it at some point.&lt;/p&gt;

&lt;p&gt;A few people online have been able to get Ubuntu on their notebooks as well,
but I certainly haven&amp;rsquo;t tried that yet. We&amp;rsquo;ll get developer mode working
first, eh?&lt;/p&gt;

&lt;p&gt;Chris Benard received one of the notebooks earlier in the month and he&amp;rsquo;s got a
&lt;a href="http://chrisbenard.net/2010/12/11/first-impressions-with-google%E2%80%99s-cr-48-chrome-os-netbook/"&gt;good post with his first impressions of the
Cr-48&lt;/a&gt;,
too. Oddly, Chris mentions that he couldn&amp;rsquo;t get a Google Apps account to log
in; however, my Google Apps account works great with the Chrome OS.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=K7hDnGvi-Zs:eg_UdS3ms68:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=K7hDnGvi-Zs:eg_UdS3ms68:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=K7hDnGvi-Zs:eg_UdS3ms68:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/K7hDnGvi-Zs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2010/12/30/chrome-os-cr-48-review/</feedburner:origLink></entry>
  <entry>
    <title>The new blog is live!</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/u-Jf3SB2WqU/" />
    <id>http://mohundro.com/blog/2010/12/23/the-new-blog-is-live/</id>
    <published>2010-12-23</published>
    <updated>2010-12-23</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;So, my blog looks different now&amp;hellip; and it isn&amp;rsquo;t just a new theme. It&amp;rsquo;s
new blog engine, new web host, new look and feel, new everything!&lt;/p&gt;

&lt;h2&gt;The back story..&amp;hellip;&lt;/h2&gt;
</summary>
    <content type="html">&lt;p&gt;So, my blog looks different now&amp;hellip; and it isn&amp;rsquo;t just a new theme. It&amp;rsquo;s
new blog engine, new web host, new look and feel, new everything!&lt;/p&gt;

&lt;h2&gt;The back story&amp;hellip;&lt;/h2&gt;

&lt;p&gt;So, I started my blog back in January of 2006. At the time, dasBlog was
one of the most prevalent .NET blog engines around on .NET. So, I
decided to roll my blog on dasBlog. I chose a recommended web host that
had great pricing and also supported ASP.NET. All was great. At the
time, I was posting every single thought that came to mind which
resulted in a good 20 to 30 posts every month. Slowly, though, over the
years, I started to find my blogging groove.&lt;/p&gt;

&lt;p&gt;Fast forward to this year. dasBlog doesn&amp;rsquo;t hold the high place it once
had as top .NET blogging engine. Worse still, my web host had seriously
gone down the tubes. &lt;a href="http://www.leeholmes.com/blog/2010/09/08/and-the-winner-is-arvixe/"&gt;Lee Holmes posted that his uptime was averaging
60%&lt;/a&gt;.
If you&amp;rsquo;re not familiar with uptime percentages, that means that my
visitors had a 60% chance for my site to be up.&lt;/p&gt;

&lt;p&gt;The last straw for me was seeing a link to the Google cache for my site
mentioned on a response to an MSDN forum question because it was down.
It was time to move.&lt;/p&gt;

&lt;h2&gt;The new platform!&lt;/h2&gt;

&lt;p&gt;The short version: the new blog is running on
&lt;a href="https://github.com/cloudhead/toto"&gt;toto&lt;/a&gt;, a Ruby-powered blogging
engine. I&amp;rsquo;m hosting it on &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The longer version: lately (err, the last couple of years), I&amp;rsquo;ve become
much more interested in learning and writing Ruby code. I had already
written two fairly small sites in Ruby (one in Sinatra and one in Rails)
and both were hosted on Heroku. The process for those sites had been
great. The deployment story was amazing &amp;ndash; it was literally &lt;code&gt;git push
heroku master&lt;/code&gt;. You couldn&amp;rsquo;t get any better as far as I was concerned.&lt;/p&gt;

&lt;p&gt;So, I knew I was interested in moving platforms; however, there were
some problems with this. First off, I had to convert my posts. Second, I
wanted 301 redirects in place. Third, I needed a theme.&lt;/p&gt;

&lt;h2&gt;Converting my posts&lt;/h2&gt;

&lt;p&gt;Thankfully, dasBlog stores its posts in a fairly straightforward way &amp;ndash;
there is an XML file for each day that can contain one or more posts. On
the other hand, toto stores its posts as straight text files formatted
as &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; (if you&amp;rsquo;ve
used StackOverflow, you&amp;rsquo;ve used Markdown &amp;ndash; it&amp;rsquo;s what they use for their
questions and answers).&lt;/p&gt;

&lt;p&gt;So, how best to convert? I ended up writing a smallish Ruby script to
convert that made use of Nokogiri to parse the XML. The main script
turned out to be just under 60 lines. Writing the script turned out to
be the best thing I could do, because it let me re-run the conversion
process. I could add small tweaks to try to strip out invalid HTML and
try out my changes. Since I had everything in source control, I could
just run a diff against the converted posts to see if everything still
looked good.&lt;/p&gt;

&lt;h2&gt;Redirecting old URLs&lt;/h2&gt;

&lt;p&gt;Redirecting my old URLs to the new URL format turned out to be easy for
80% of my posts and time consuming for the rest. I used a Ruby gem
called rack-rewrite.&lt;/p&gt;

&lt;p&gt;The below code snippet accounted for the easy 80%.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;r301 %r{/blog/
  (\d{4})/  # year
  (\d{2})/  # month
  (\d{2})/  # day
  (\w+?)    # slug
  \.aspx$}x, lambda { |match, rack_env|

  helper = RedirectHelper.new

  year, month, day, slug = match[1], match[2], match[3], helper.convert_legacy_slug(match[4])
  "/blog/#{year}/#{month}/#{day}/#{slug}/"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I just used a fairly simple regex to parse the old format out and move
it over to the new format. I did end up building a RedirectHelper class
that contained most of the logic for handling the remaining 20%.
Overall, though, it seems to be working well, though I&amp;rsquo;m sure I probably
missed a few posts. If you are browsing around and run into any 404s,
feel free to let me know.&lt;/p&gt;

&lt;h2&gt;The new theme&lt;/h2&gt;

&lt;p&gt;My starting point for the blog theme was the &lt;a href="https://github.com/cloudhead/dorothy"&gt;dorothy toto
theme&lt;/a&gt;. It provided a nice HTML5
basic structure that I was able to build upon. Since it was already
using HTML5, I decided to stick with that. Chances are, the site looks
like junk on Internet Explorer 6 and 7. It honestly doesn&amp;rsquo;t look great
on IE 8 even, though the IE 9 beta renders it just fine.&lt;/p&gt;

&lt;p&gt;The fun things for me in the conversion were getting to use the Google
WebFont API &amp;ndash; that&amp;rsquo;s how the cool fonts are getting loaded in.
Everything else was just some minor CSS changes.&lt;/p&gt;

&lt;p&gt;I did elect to use Disqus for my comments, because Toto doesn&amp;rsquo;t provide
a commenting solution out of the box. This actually has a couple of
ramifications for me. First, I lost all of my old comments. That wasn&amp;rsquo;t
a huge deal, because I never really had a boatload of them. Second, it&amp;rsquo;s
an external service that I&amp;rsquo;m not in control of. Mostly, this doesn&amp;rsquo;t
bother, but I do think some of my former coworkers back in the Fort
Smith area might not be able to comment because I think Disqus is
blocked by their firewall. At least it was when I was still working
there.&lt;/p&gt;

&lt;h2&gt;Wrapping this post up&lt;/h2&gt;

&lt;p&gt;So, anyway, there you go, my new blog. Actually, I&amp;rsquo;d like your input
now. I want to post the code for the blog up on &lt;a href="https://github.com/drmohundro"&gt;my GitHub
account&lt;/a&gt;, but I have some questions about
the best way to do this. First off, I don&amp;rsquo;t want my blog content
duplicated. It isn&amp;rsquo;t a huge deal, but I don&amp;rsquo;t want Google returning
search results to the GitHub hosted markdown files over my posts. It
probably won&amp;rsquo;t, because there won&amp;rsquo;t be returned as the main HTML like it
would be when served from my blog, but it is still a concern I&amp;rsquo;ve got.&lt;/p&gt;

&lt;p&gt;And I guess that&amp;rsquo;s it actually. Try out the comments if you want. Let me
know if you like the look or if you notice any broken links or broken
functionality.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=u-Jf3SB2WqU:AjDA6gRmep4:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=u-Jf3SB2WqU:AjDA6gRmep4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=u-Jf3SB2WqU:AjDA6gRmep4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/u-Jf3SB2WqU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2010/12/23/the-new-blog-is-live/</feedburner:origLink></entry>
  <entry>
    <title>DevLink 2010 Recap</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/0NweOcmAFjg/" />
    <id>http://mohundro.com/blog/2010/08/23/devlink-2010-recap/</id>
    <published>2010-08-23</published>
    <updated>2010-08-23</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;This year, I was fortunate enough to attend DevLink for the fourth year in a
row. I&amp;rsquo;m pretty sure 90% of my Conferences posts are recapping prior trips to&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;This year, I was fortunate enough to attend DevLink for the fourth year in a
row. I&amp;rsquo;m pretty sure 90% of my Conferences posts are recapping prior trips to
DevLink. Well, here goes number four, though I&amp;rsquo;ll try to keep it more succinct
than last year.&lt;/p&gt;

&lt;h2&gt;Sessions&lt;/h2&gt;

&lt;p&gt;The first session I attended was on Test Driven Development with T-SQL by
&lt;a href="http://www.skimedic.com/blog/"&gt;Philip Japiske&lt;/a&gt;. If you just did a double take
at that last sentence, then you know how I felt when I first saw it on the
session list. I had never heard Philip speak before, but I was honestly worried
that a session on TDD with T-SQL would be a trainwreck. I&amp;rsquo;m happy to say that
it was &lt;em&gt;not&lt;/em&gt;, in fact, a trainwreck &amp;ndash; it was actually a really good session.
Philip showed us &lt;a href="http://tst.codeplex.com/"&gt;T.S.T. (the T-SQL Test Tool)&lt;/a&gt; which
is basically a set of stored procedures that provide the basic assertion
libraries you&amp;rsquo;d expect to see in a unit testing framework. The real gems were
assertion calls like Assert.TableEquals. It can still use some work, but if
you&amp;rsquo;ve got any sort of T-SQL sitting around, wrapping some of that in tests
could be very useful.&lt;/p&gt;

&lt;p&gt;Another session I really enjoyed was on HTML5 with &lt;a href="http://telerikwatch.com"&gt;Todd
Anglin&lt;/a&gt;. Most of the noise regarding HTML5 that I&amp;rsquo;ve
seen has revolved around mobile development, the canvas tag and how it will
replace Flash/Silverlight/etc. Todd did a great job of showing us the other
parts of HTML5. I had no idea that there were new input tags that were coming
(are here? sort of?) like tel, email, etc. Really, that&amp;rsquo;s all it takes for
mobile browsers like Safari to give the different input types (i.e. if an input
element with type email gets focus, you&amp;rsquo;ll get the email input display on the
iPhone).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.thinqlinq.com/"&gt;Jim Wooley&lt;/a&gt; did a great job showing off the
&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework
(Rx)&lt;/a&gt;. We spoke a little
bit last year when I attempted an Open Space session on Event Driven
Architecture and he had pointed out Rx then, but I never really had a chance to
dig in since then. Honestly, once people really start grokking Rx and applying
it in their frameworks, I&amp;rsquo;ll think we&amp;rsquo;ll start seeing some big jumps in the way
we write code, particularly on the client side. I&amp;rsquo;m still trying to think of
good applications of it on the server side, though &lt;a href="http://blog.phatboyg.com/"&gt;Chris
Patterson&lt;/a&gt; did mention that
&lt;a href="http://github.com/phatboyg/MassTransit"&gt;MassTransit&lt;/a&gt; was looking into adding
&lt;a href="http://github.com/phatboyg/MassTransit/tree/master/src/MassTransit.Reactive/"&gt;IObservable
capabilities&lt;/a&gt;&amp;hellip;&lt;/p&gt;

&lt;p&gt;There was a session on &lt;a href="http://caliburn.codeplex.com/"&gt;Caliburn&lt;/a&gt; by &lt;a href="http://www.codeswamp.com/"&gt;Bryan
Hunter&lt;/a&gt; on the first day, but the room was packed so
I wasn&amp;rsquo;t able to hear it. I did get to make it to his part 2 talk on the last
day, though, and I really enjoyed it. I still love the way Caliburn uses
iterators (with yield) to implement
&lt;a href="http://en.wikipedia.org/wiki/Coroutine"&gt;coroutines&lt;/a&gt;. If you&amp;rsquo;d like to get a
good feel for Caliburn and what it provides, check out &lt;a href="http://live.visitmix.com/MIX10/Sessions/EX15"&gt;Rob Eisenberg&amp;rsquo;s MiX
session&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The last session I attended on Saturday was on IronRuby and Rails with &lt;a href="http://www.ironshay.com/"&gt;Shay
Friedman&lt;/a&gt;. I have already been doing some Rails work
on the side, so I was familiar with most of it, but I still wanted to support
IronRuby, especially considering &lt;a href="http://blog.jimmy.schementi.com/2010/08/start-spreading-news-future-of-jimmy.html"&gt;Jimmy Schementi&amp;rsquo;s post regarding IronRuby&amp;rsquo;s
future&lt;/a&gt;
went up the day before Shay&amp;rsquo;s session. (side note, lest you think IronRuby is
dead, &lt;a href="http://github.com/ironruby/ironruby/commits/master"&gt;it is having almost daily commits to
it&lt;/a&gt; and it has the
potential to flourish even more in the community&amp;rsquo;s hands)&lt;/p&gt;

&lt;h2&gt;Open Spaces&lt;/h2&gt;

&lt;p&gt;I sat in on a open spaces session led up by &lt;a href="http://sharplearningcurve.com/blog/"&gt;Alex
Robson&lt;/a&gt; on
&lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;. RabbitMQ is a &amp;ldquo;highly reliable enterprise
messaging system&amp;rdquo; that is written in Erlang. Think MassTransit or nServiceBus
in the .NET community. It was interesting to hear how other messaging
frameworks are structured and to also talk about how messaging and event driven
architecture change the way applications are built. It was a very fun
discussion.&lt;/p&gt;

&lt;p&gt;After my relative success last year leading an open spaces discussion on event
driven architecture, I decided to talk about something else I&amp;rsquo;m passionate
about: VIM. I entitled the session, &amp;ldquo;VIM and other Ye Olde Text Editors&amp;rdquo;
(tongue firmly in cheek). I hoped my poor attempt at title humor would draw
people to my session. If by people, I can count 2 individuals, then I can say
that, yes, it did draw people to my session :&amp;ndash;). &lt;a href="http://www.sullivansoftdev.com/blog/"&gt;Brian
Sullivan&lt;/a&gt; and &lt;a href="http://github.com/markhaskamp"&gt;Mark
Haskamp&lt;/a&gt; both swung by and we had a good time
talking about Vim and Emacs both. My hope in coordinating the session was in
sharing the awesomeness of Vim and getting ideas from other Vim users on how
they customize and use Vim to the fullest. I didn&amp;rsquo;t get a lot of tips in that
regard, but I did get to show a few people the very well known &lt;a href="http://blog.extracheese.org/2010/01/string-calculator-kata-in-python.html"&gt;String
Calculator Kata in
Python&lt;/a&gt;,
which should instead be titled String Calculator in Python in Vim. It&amp;rsquo;s as much
of a kata on Vim as it is on Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.userinexperience.com/"&gt;Brandon Satrom&lt;/a&gt; kicked off a talk on &amp;ldquo;What&amp;rsquo;s
good in MVC, what&amp;rsquo;s missing in MVC.&amp;rdquo; I really enjoyed this session &amp;ndash; there was
a lot of push to improve what we&amp;rsquo;ve got with MVC. We realized that the finished
list (which probably could have continued) leaned heavily on the ways to
improve MVC, but I commented that I think this is because we&amp;rsquo;re really enjoying
using it and we want it to succeed and move forward.&lt;/p&gt;

&lt;p&gt;I sat in on another of Alex Robson&amp;rsquo;s open space sessions on NoSQL on Saturday.
We talked a lot about CouchDB and Cassandra, neither of which I know a lot
about. I&amp;rsquo;ve read up on Mongo quite a bit more, but I&amp;rsquo;m finding that the
document database (and other NoSQL variants of databases) very intriguing. I&amp;rsquo;m
planning on using one of them for some of my Rails projects at some point.&lt;/p&gt;

&lt;h2&gt;In closing&lt;/h2&gt;

&lt;p&gt;All in all, I had a great time at the conference. I really enjoyed getting to
see a lot of friends, particularly some of those from the Fort Smith area. I
used to get to see most of those guys at least at every FSDNUG meeting, but
since moving to Memphis, it had been a couple of months since I had seen them.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s to another DevLink next year!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=0NweOcmAFjg:XtMuKGZ42Sc:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=0NweOcmAFjg:XtMuKGZ42Sc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=0NweOcmAFjg:XtMuKGZ42Sc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/0NweOcmAFjg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2010/08/23/devlink-2010-recap/</feedburner:origLink></entry>
  <entry>
    <title>New stuff</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/DavidMohundro/~3/ddo9iDJ4jRI/" />
    <id>http://mohundro.com/blog/2010/06/29/new-stuff/</id>
    <published>2010-06-29</published>
    <updated>2010-06-29</updated>
    <author>
      <name>David Mohundro</name>
    </author>
    <summary type="html">&lt;p&gt;First off, apologies for not posting anything in 2 (wait, has it been 3?!?) months &amp;ndash; that&amp;rsquo;s the longest I&amp;rsquo;ve ever gone without posting anything. Second, apologies for talking about not posting. That&amp;rsquo;s a no no. Third, apologies for apologizing for&amp;hellip; oh, right&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;First off, apologies for not posting anything in 2 (wait, has it been 3?!?) months &amp;ndash; that&amp;rsquo;s the longest I&amp;rsquo;ve ever gone without posting anything. Second, apologies for talking about not posting. That&amp;rsquo;s a no no. Third, apologies for apologizing for&amp;hellip; oh, right.&lt;/p&gt;

&lt;p&gt;So, what have I been up to.&lt;/p&gt;

&lt;p&gt;Long story.&lt;/p&gt;

&lt;p&gt;Well, my wife and I are now residents in the Memphis area. Obviously a big change. I had been living and working in Fort Smith, AR for the past 7 years. I&amp;rsquo;d even been at the same company that whole period. We had always talked about whether or not we would stay there or move and all that, but if you had asked me at the beginning of the year if I thought we&amp;rsquo;d end up moving, I probably would&amp;rsquo;ve said no. Well, guess I would&amp;rsquo;ve been wrong!&lt;/p&gt;

&lt;p&gt;I took a job with &lt;a href="http://www.serviceu.com/"&gt;ServiceU Corporation&lt;/a&gt; and I&amp;rsquo;m just finishing up my first week with them. Other than the obvious location change, the job is also quite a bit different from what I&amp;rsquo;ve been used to. First off, it&amp;rsquo;s a much smaller company. Second, technology adoption is pretty serious here. Third and likely most important for me, it&amp;rsquo;s a software company. You know, the end product we provide is &lt;em&gt;software&lt;/em&gt;. Well, okay, technically it&amp;rsquo;s a service. But you know, that service is fulfilled by software. It&amp;rsquo;s pretty much summed up by &lt;a href="http://www.codinghorror.com/blog/2007/10/remember-this-stuff-is-supposed-to-be-fun.html"&gt;Jeff Atwood&amp;rsquo;s 2007 article entitled, &amp;ldquo;remember, this stuff is supposed to be fun.&amp;rdquo;&lt;/a&gt; That&amp;rsquo;s the main reason.&lt;/p&gt;

&lt;p&gt;So, what will I be doing? Well, for one, I&amp;rsquo;ll get to work with ASP.NET MVC 2. I&amp;rsquo;ve been playing around with it, but I haven&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; worked with web stuff extensively since classic ASP. I&amp;rsquo;ve delved into Rails a little on my own, but nothing major. It will be interesting to compare what I&amp;rsquo;ve learned with Rails to ASP.NET MVC. I&amp;rsquo;m really excited! I&amp;rsquo;m also planning on getting the rest of my team interested in PowerShell. So don&amp;rsquo;t worry, the PowerShell posts will continue!&lt;/p&gt;

&lt;p&gt;On the DNUG side of things, I&amp;rsquo;m obviously no longer the FSDNUG president. Jeremy Sloan is the new president and he&amp;rsquo;s got lots of other great guys helping him out. Over here, I&amp;rsquo;m planning on getting active with Memphis DNUG. I&amp;rsquo;m hoping to get to see some of the FSDNUG guys at &lt;a href="http://devlink.net"&gt;DevLink&lt;/a&gt;. That was a hint, by the way.&lt;/p&gt;

&lt;p&gt;On the personal side of things, I hate not seeing all of my Fort Smith area friends as often as we were able to before. Thankfully, Fort Smith and Memphis aren&amp;rsquo;t &lt;em&gt;that&lt;/em&gt; far away from each other. I imagine we&amp;rsquo;ll be on I-40 quite a bit more than we have in the past.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=ddo9iDJ4jRI:qbKc7QtyVwQ:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DavidMohundro?a=ddo9iDJ4jRI:qbKc7QtyVwQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DavidMohundro?i=ddo9iDJ4jRI:qbKc7QtyVwQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DavidMohundro/~4/ddo9iDJ4jRI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://mohundro.com/blog/2010/06/29/new-stuff/</feedburner:origLink></entry>
</feed>

