<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title></title>
  <link href="http://k20e.com/atom.xml" rel="self"/>
  <link href="http://k20e.com/"/>
  <updated>2011-12-30T08:55:10-05:00</updated>
  <id>http://k20e.com/</id>
  <author>
    <name>Kris Molendyke</name>
    
  </author>

  
  <entry>
    <title>Top Ten 2011 Albums</title>
    <link href="http://k20e.com/blog/2011/12/28/top-ten-2011-albums/"/>
    <updated>2011-12-28T22:45:00-05:00</updated>
    <id>http://k20e.com/blog/2011/12/28/top-ten-2011-albums</id>
    <content type="html">&lt;p&gt;Anyone who is even a little bit serious about their music listening habits puts together a top &lt;em&gt;whatever&lt;/em&gt; list around this time of the year.  I have been doing this every year since graduating college and passing it around to friends and family.  This year I decided to take vacation between the Christmas and New Year holidays and I have used some of that extra time to put together this article rather than a simple ten line list.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;&lt;em&gt;Disclaimer:&lt;/em&gt; The album names in my list are links to each album's digital download page at Amazon.  This is primarily part of my ploy to get filthy rich via &lt;a href=&quot;https://affiliate-program.amazon.com/?_encoding=UTF8&amp;amp;assoc_ss_ref=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2FB004X0XA82%3Fie%3DUTF8%26ref_%3Dsr_1_1_title_1_mus%26s%3Dmusic%26qid%3D1325170759%26sr%3D1-1&quot;&gt;associate&lt;/a&gt; referral purchase kickbacks.  It also gives you a way listen to all of these records from within your browser (perhaps while you read this article?!).  Most of them weigh in at $5.00 per &lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon_MP3#Reaction&quot;&gt;DRM-free album&lt;/a&gt;, which is really great for your record collection, but not so great for my get rich quick scheme.&lt;/p&gt;

&lt;p&gt;Having said that, you can &lt;a href=&quot;#the-list&quot;&gt;hop straight to my list&lt;/a&gt; or continue reading the minutiae of my album selection process.&lt;/p&gt;

&lt;h2&gt;Empirical Evidence and Subjective Taste&lt;/h2&gt;

&lt;p&gt;As an engineer, an &lt;a href=&quot;http://www.youtube.com/watch?v=eDuEU3IYpis&quot;&gt;album lover&lt;/a&gt;, and an ex-&lt;a href=&quot;http://www.wlvr.org/&quot;&gt;college radio disc jockey&lt;/a&gt;, I approach my list creation process in a specific manner.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Warning: software and music nerd content ahead! You can &lt;a href=&quot;#the-list&quot;&gt;skip ahead to the list&lt;/a&gt; if either makes you itch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The most interesting approach to creating my list is probably using the custom software that I have written to analyze my album listening habits year by year.  When I was in college and using iTunes, it let me rate individual tracks on a &amp;#9733;&amp;#9733;&amp;#9733;&amp;#9733;&amp;#9733; scale.  I developed a bit of track rating OCD, and throughout my years with iTunes I have come to revere my library's XML meta-data file.  Today it is around 56MB of XML data describing more than 2700 albums.&lt;/p&gt;

&lt;p&gt;&lt;span class='has-pullquote' data-pullquote='An album is the unit of creative work that I believe good artists strive to produce. '&gt;
A feature that I have always found lacking in iTunes is the sense of an album as a listening unit.  When I was in college, the burgeoning portable media player market was changing popular culture's listening habits to become even more track-oriented rather than album-oriented.  To this day, I remain an album lover despite the increasingly amazing listening technology that I slip into my pocket each morning.  I collect and actively listen to vinyl.  Similarly, I collect and consume digital media in album-sized chunks.  An album is the unit of creative work that I believe good artists strive to produce.  In my opinion, part of respectfully enjoying an artist's work is listening to an album in its entirety.  &lt;em&gt;Shuffle be damned.&lt;/em&gt; /rant
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Saddened by iTunes' lack of album ratings and album listening statistics, I wrote an application to analyze my iTunes XML meta-data file and report my listening habits in an album-centric manner.  The output of this application is a list of albums by year which can be interactively sorted by the following criteria.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Overall Album Rating&lt;/em&gt; = aggregate track rating / number of tracks&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Real Time Spent Listening To Album&lt;/em&gt; in &lt;code&gt;hours:minutes:seconds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Album Play Count&lt;/em&gt; = aggregate track play count / number of tracks&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I use these different views into my listening habits for the year to form an empirical list of albums that I clearly liked either because I rated them highly or spent a lot of my time listening to them.  In my head I weigh these aspects differently from year to year depending on how many albums were released that I listened to, and how much time I had spent listening to music.&lt;/p&gt;

&lt;p&gt;After forming my initial list of around twenty or so albums in this manner I begin to rank and prune based on subjective and experiential listening criteria like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What season of year was the album released?&lt;/li&gt;
&lt;li&gt;What was the weather like when I first listened to it?&lt;/li&gt;
&lt;li&gt;Where was I when I first listened to it?&lt;/li&gt;
&lt;li&gt;What was I doing?&lt;/li&gt;
&lt;li&gt;What kind of mood was I in?&lt;/li&gt;
&lt;li&gt;How could it affect my current mood?&lt;/li&gt;
&lt;li&gt;Did I see the artist perform this album live?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;... and so forth.  I will try to describe these factors as I describe each album in my final list.&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;the-list&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Kris's Top Ten Albums of 2011&lt;/h1&gt;

&lt;p&gt;&lt;img class='left ' src='/images/top-ten-2011-albums/david-comes-to-life.jpg' width='300' height='300' alt='&quot;David Comes To Life&quot; &quot;David Comes To Life album cover&quot;' title='&quot;David Comes To Life&quot; &quot;David Comes To Life album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;10. &lt;a href=&quot;http://www.amazon.com/gp/product/B004ZJEVUC/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004ZJEVUC&quot;&gt;David Comes To Life&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004ZJEVUC&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Fucked Up&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;A hardcore punk rock opera.  Say that a few times to yourself.  Then take 78 minutes and give it a listen because it's amazing.  In a year when I feel like most records that I liked were on the shorter end of the spectrum (less than 40 minutes long), &lt;em&gt;David Comes To Life&lt;/em&gt; brought it for nearly twice as long.  Extra kudos for writing and performing a rock opera that just doesn't suck.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/top-ten-2011-albums/tell-me.jpg' width='300' height='300' alt='&quot;Tell Me&quot; &quot;Tell Me album cover&quot;' title='&quot;Tell Me&quot; &quot;Tell Me album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;9. &lt;a href=&quot;http://www.amazon.com/gp/product/B004KVM0XK/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004KVM0XK&quot;&gt;Tell Me&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004KVM0XK&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Jessica Lea Mayfield&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;I've liked Jessica Lea Mayfield since her previous full length, &lt;em&gt;With Blasphemy So Heartfelt&lt;/em&gt;.  I saw her perform at &lt;a href=&quot;http://www.johnnybrendas.com/&quot;&gt;Johnny Brenda's&lt;/a&gt; during that tour and I was absolutely blown away with her performance.  &lt;em&gt;Tell Me&lt;/em&gt; is another great record from a young woman (she's 22 now) with a big voice set against a backdrop of loose guitars and some difficult subject matter.  I really love the mood of this album.&lt;/p&gt;

&lt;p&gt;&lt;img class='left ' src='/images/top-ten-2011-albums/moody-standard-and-poor.jpg' width='300' height='300' alt='&quot;Moody, Standard, and Poor&quot; &quot;Moody, Standard, and Poor album cover&quot;' title='&quot;Moody, Standard, and Poor&quot; &quot;Moody, Standard, and Poor album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;8. &lt;a href=&quot;http://www.amazon.com/gp/product/B004SE4F8C/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004SE4F8C&quot;&gt;Moody, Standard And Poor&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004SE4F8C&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Obits&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Rick_Froberg&quot;&gt;Rick Froberg&lt;/a&gt; would have to play the pots and pans for me to question whether or not I dig what he's producing.  &lt;em&gt;Moody, Standand, and Poor&lt;/em&gt; is twelve three-ish minute long tracks of excellent quality rock 'n' roll that stirs an, &quot;I'm an American, and I like rock 'n' roll, damnit!&quot; attitude within me.  Which is a great attitude to have, I believe.  I was lucky enough to share a beer with Rick and &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Reis&quot;&gt;John Reis&lt;/a&gt; at the old Khyber after a Night Marchers show years ago and I can say that they were both really cool rock gods.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/top-ten-2011-albums/bon-iver-bon-iver.jpg' width='300' height='300' alt='&quot;Bon, Iver, Bon, Iver&quot; &quot;Bon, Iver, Bon, Iver album cover&quot;' title='&quot;Bon, Iver, Bon, Iver&quot; &quot;Bon, Iver, Bon, Iver album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;7. &lt;a href=&quot;http://www.amazon.com/gp/product/B005C7MVC6/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005C7MVC6&quot;&gt;Bon Iver, Bon Iver&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B005C7MVC6&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Bon Iver&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Everyone loved this album, right?  I did too.  It is a great example of an album as a work of art and not just a collection of tracks.  I rarely begin listening to this record if I know that I don't have time to finish it in a single sitting.  At just under forty minutes that's not hard to do, which is perhaps another reason I like it.&lt;/p&gt;

&lt;p&gt;&lt;img class='left ' src='/images/top-ten-2011-albums/zonoscope.jpg' width='300' height='300' alt='&quot;Zonoscope&quot; &quot;Zonoscope album cover&quot;' title='&quot;Zonoscope&quot; &quot;Zonoscope album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;6. &lt;a href=&quot;http://www.amazon.com/gp/product/B004LCZQF2/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004LCZQF2&quot;&gt;Zonoscope&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004LCZQF2&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Cut Copy&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;I liked &lt;em&gt;In Ghost Colours&lt;/em&gt; but I didn't think it was a really great album as a whole.  &lt;em&gt;Zonoscope&lt;/em&gt; is a great album.  The collection of longer (4 - 6 minute) tracks culminating in the 15 minute outro works really well.  As a fan of ambient and experimental/electronic noise the last track is a particular treat for me and I got a lot of good work done while listening to this record during the past year.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/top-ten-2011-albums/arabia-mountain.jpg' width='300' height='300' alt='&quot;Arabia Mountain&quot; &quot;Arabia Mountain album cover&quot;' title='&quot;Arabia Mountain&quot; &quot;Arabia Mountain album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;5. &lt;a href=&quot;http://www.amazon.com/gp/product/B005343HRG/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005343HRG&quot;&gt;Arabia Mountain&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B005343HRG&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Black Lips&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;This album is a lot of fun.  If you haven't seen the Black Lips play live some of this album's energy might be lost on you.  They really are fantastic on stage.  &lt;em&gt;Arabia Mountain&lt;/em&gt; brings the familiar southern lo-fi punk sound of the band together with an accessible sense of melody that will be pleasantly bouncing around in your head after the first listen.&lt;/p&gt;

&lt;p&gt;&lt;img class='left ' src='/images/top-ten-2011-albums/tao-of-the-dead.jpg' width='300' height='300' alt='&quot;Tao Of The Dead&quot; &quot;Tao Of The Dead album cover&quot;' title='&quot;Tao Of The Dead&quot; &quot;Tao Of The Dead album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;4. &lt;a href=&quot;http://www.amazon.com/gp/product/B004KV3PI4/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004KV3PI4&quot;&gt;Tao Of The Dead&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004KV3PI4&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;...And You Will Know Us By The Trail Of Dead&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Just like &lt;em&gt;David Comes To Life&lt;/em&gt; is a rock opera that doesn't suck, &lt;em&gt;Tao Of The Dead&lt;/em&gt; is a concept record that doesn't suck.  The last few albums from Trail of Dead have been advancing Conrad's delivery of &lt;a href=&quot;http://en.wikipedia.org/wiki/Steampunk&quot;&gt;steampunk&lt;/a&gt; artwork and lyrical style, which is either something you dig or do not dig.  I happen to dig it and I think that this record expresses the genre in a compelling and entertaining manner.  It also gets bonus points for being another &lt;em&gt;big&lt;/em&gt; record in a year full of shorter records.  Sixteen movements in D and F, and a solid prog rock revival in line with Yes and Genesis records of the past.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/top-ten-2011-albums/hurry-up-were-dreaming.jpg' width='300' height='300' alt='&quot;Hurry Up, We're Dreaming&quot; &quot;Hurry Up, We're Dreaming album cover&quot;' title='&quot;Hurry Up, We're Dreaming&quot; &quot;Hurry Up, We're Dreaming album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;3. &lt;a href=&quot;http://www.amazon.com/gp/product/B005PMNBNG/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005PMNBNG&quot;&gt;Hurry Up, We're Dreaming&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B005PMNBNG&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;M83&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;For me, this is one of those records released in Autumn that will end up feeling more like a record released the following Spring when I look back at it.  It's a long and upbeat album and doesn't seem to fit the shorter, colder days of Winter.  Despite that feeling, it has very quickly ran up my &quot;time spent listening to&quot; and &quot;album rating&quot; lists.  I loved &lt;em&gt;Saturdays = Youth&lt;/em&gt; and was lucky enough to see M83 perform that album in an intimate setting.  I'm looking forward to seeing them visit the sold out &lt;a href=&quot;http://www.utphilly.com/&quot;&gt;Union Transfer&lt;/a&gt; in May, 2012 and fill that large space with this equally large album.&lt;/p&gt;

&lt;p&gt;&lt;img class='left ' src='/images/top-ten-2011-albums/knife-man.jpg' width='300' height='300' alt='&quot;Knife Man&quot; &quot;Knife Man album cover&quot;' title='&quot;Knife Man&quot; &quot;Knife Man album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;2. &lt;a href=&quot;http://www.amazon.com/gp/product/B005FUA4XS/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005FUA4XS&quot;&gt;Knife Man&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B005FUA4XS&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Andrew Jackson Jihad&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;For years Andrew Jackson Jihad, &lt;a href=&quot;http://en.wikipedia.org/wiki/This_Bike_Is_A_Pipe_Bomb&quot;&gt;This Bike Is A Pipe Bomb&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Ghost_Mice&quot;&gt;Ghost Mice&lt;/a&gt; have defined folk punk for me.  This album is a bit of a departure from their previous works in that there is a good amount of electrified instrumentation and more of a studio production feel to it.  It's closer to &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Body,_the_Blood,_the_Machine&quot;&gt;The Body, The Blood, The Machine&lt;/a&gt; than &lt;a href=&quot;http://en.wikipedia.org/wiki/Can%27t_Maintain&quot;&gt;Can't Maintain&lt;/a&gt; and it totally works.  With track titles like &lt;em&gt;Zombie by the Cranberries by Andrew Jackson Jihad&lt;/em&gt; and lyrics like, &quot;I hate whiny fucking songs like this, but I can't afford a therapist... sorry guys, here's a solo... &lt;em&gt;[queue guitar solo]&lt;/em&gt;&quot; it's hard to not enjoy this album, even if you have never heard of folk punk.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/top-ten-2011-albums/helplessness-blues.jpg' width='300' height='300' alt='&quot;Helplessness Blues&quot; &quot;Helplessness Blues album cover&quot;' title='&quot;Helplessness Blues&quot; &quot;Helplessness Blues album cover&quot;'&gt;&lt;/p&gt;

&lt;h2&gt;1. &lt;a href=&quot;http://www.amazon.com/gp/product/B004X0XA82/ref=as_li_ss_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B004X0XA82&quot;&gt;Helplessness Blues&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=k20e-20&amp;l=as2&amp;o=1&amp;a=B004X0XA82&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;em&gt;Fleet Foxes&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;I didn't enjoy Fleet Foxes self-titled first LP, though it seemed everyone else did.  To be honest, I still don't really love it all that much.  When I first played &lt;em&gt;Helplessness Blues&lt;/em&gt; my opinion of the band immediately changed.  The pervasive feeling of a rich, rural environment instantly appealed to my mind's eye and I can conjure vivid pictures of spaces and situations which Robin Pecknold describes.  The swelling strings and vocal harmonies sweep me away.  This is the kind of record that I will put on, sit down, relax and simply enjoy.  I also had the pleasure of seeing them perform at the &lt;a href=&quot;http://theatreupperdarby.com/&quot;&gt;Tower Theatre&lt;/a&gt; from an excellent seat and it was an awesome experience.  It can be difficult to recreate such an elaborate mood at a live venue but they pulled it off spectacularly thus cementing &lt;em&gt;Helplessness Blues&lt;/em&gt; as my favorite record of 2011.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>TextMate, TextMate 2...</title>
    <link href="http://k20e.com/blog/2011/10/04/textmate-textmate-2/"/>
    <updated>2011-10-04T10:40:00-04:00</updated>
    <id>http://k20e.com/blog/2011/10/04/textmate-textmate-2</id>
    <content type="html">&lt;p&gt;There has been a lot of chatter regarding a promised release of &lt;a href=&quot;http://news.ycombinator.com/item?id=3038247&quot;&gt;TextMate 2 &lt;em&gt;this year&lt;/em&gt;&lt;/a&gt; (2011) or &lt;em&gt;before Christmas&lt;/em&gt; (presumably 2011) and Allan Odgaard's &lt;a href=&quot;http://old.nabble.com/TextMate%202-to28405435.html#a28707277&quot;&gt;questionable promise&lt;/a&gt; that TextMate 2 would be a free upgrade to existing TextMate customers.  The fact remains that if you purchased a license for &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt; and then spent a few hours to get to know it, you probably loved it.  I did, and I do.&lt;/p&gt;

&lt;p&gt;The promise of a TextMate 2 upgrade was nice but after the &lt;a href=&quot;http://wastm2released.com/&quot;&gt;vaporware&lt;/a&gt; &lt;a href=&quot;http://wiki.macromates.com/FAQ/TextMate2&quot;&gt;dramedy&lt;/a&gt; that ensued in the years following the announcement it seemed irrational to expect it to be realized.  Many people complained.  Many people &lt;a href=&quot;http://www.marco.org/2011/09/27/textmate-2-free-upgrade&quot;&gt;remained highly satisfied&lt;/a&gt; with the powerful features and relative stability of TextMate.  Others jumped ship to explore alternative text editors.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;Until very recently I fell into the highly satisfied TextMate user camp. I wasn't too interested in current developments in the text editor world.  To me, TextMate 2 was a shiny thing off in the hazy distance.  It was possibly even a solution looking for a problem.  Its delayed release was a better &lt;a href=&quot;https://twitter.com/wastm2released&quot;&gt;source of laughs&lt;/a&gt; than disappointment.&lt;/p&gt;

&lt;p&gt;TextMate met my needs day and and day out.  The mailing list was helpful, and the sporadic &lt;code&gt;option-click&lt;/code&gt; &lt;em&gt;Check for updates&lt;/em&gt; minor fixes from Allan addressed most issues that I would encounter.  The good parts greatly outweighed the bad parts.&lt;/p&gt;

&lt;p&gt;Then, one day I got bored, and I discovered &lt;a href=&quot;http://www.sublimetext.com/2&quot;&gt;Sublime Text 2&lt;/a&gt;...&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>How to Set the Chrome Console Font</title>
    <link href="http://k20e.com/blog/2011/08/18/how-to-set-the-chrome-console-font/"/>
    <updated>2011-08-18T19:24:00-04:00</updated>
    <id>http://k20e.com/blog/2011/08/18/how-to-set-the-chrome-console-font</id>
    <content type="html">&lt;p&gt;Lately I've become a bigger fan of the &lt;a href=&quot;http://dev.chromium.org/getting-involved/dev-channel&quot;&gt;Google Chrome dev channel&lt;/a&gt;.  The &lt;a href=&quot;http://www.webkit.org/&quot;&gt;WebKit&lt;/a&gt; &lt;a href=&quot;http://trac.webkit.org/wiki/WebInspector&quot;&gt;Web Inspector&lt;/a&gt; hasn't quite stolen my heart but I can no longer claim total fidelity to &lt;a href=&quot;http://getfirebug.com/&quot;&gt;FireBug&lt;/a&gt; and its &lt;a href=&quot;http://getfirebug.com/releases/swarms/Firefox-5.0/&quot;&gt;swarms&lt;/a&gt;.  After spending more and more time in Chrome's &lt;a href=&quot;http://code.google.com/chrome/devtools/docs/console.html&quot;&gt;console&lt;/a&gt; I have developed a mean squint, though.  The default console font is just too small for my liking.  What can I say?  I like big fonts, and I cannot lie.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;&quot;There must be a setting somewhere in Chrome to modify the font in the console,&quot; I thought to myself.  I checked basic settings at &lt;code&gt;chrome://settings&lt;/code&gt;.  Nothing.  I checked advanced settings at &lt;code&gt;chrome://settings/advanced&lt;/code&gt;.  Nope.  I looked through experimental settings at &lt;code&gt;chrome://flags&lt;/code&gt;.  Nada.  After an hour or so of hacking around I discovered a solution that seems to work.&lt;/p&gt;

&lt;h2&gt;Open the Web Inspector&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Right click&lt;/em&gt; in any web page &amp;rarr; &lt;code&gt;Inspect Element&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;Undock the Web Inspector into a separate window&lt;/h2&gt;

&lt;p&gt;&lt;img class='right ' src='/images/how-to-set-the-chrome-console-font/undock.png' width='335' height='34' alt='Web Inspector undock icon' title='Web Inspector undock icon'&gt;&lt;/p&gt;

&lt;p&gt;If the Web Inspector opens as a portion of the main Chrome window, it is &lt;em&gt;docked&lt;/em&gt; and you'll need to undock it.  Click the button at the lower left of the Web Inspector to do this.&lt;/p&gt;

&lt;h2&gt;Inspect the Inspector&lt;/h2&gt;

&lt;p&gt;A little &lt;em&gt;meta-inspection&lt;/em&gt; will help reveal the &lt;a href=&quot;https://developer.mozilla.org/en/CSS_Reference&quot;&gt;CSS&lt;/a&gt; rules that are responsible for styling the console.  The trick at this point is that &lt;em&gt;Right click&lt;/em&gt; &amp;rarr; &lt;code&gt;Inspect Element&lt;/code&gt; is not available to open up the Inspector &lt;em&gt;Inspector&lt;/em&gt;.  With the first Inspector window undocked and focused, use the key binding for opening the Inspector to open a second Inspector window.  On OS X, that key binding is &lt;code&gt;⌥⌘I&lt;/code&gt;.  On Windows and Linux, it is &lt;code&gt;Ctrl-Alt-I&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This Inspector &lt;em&gt;Inspector&lt;/em&gt; can be used to learn more about the structure and styling behind the Inspector itself.  In particular, I was interested in overriding the following CSS rules.&lt;/p&gt;

&lt;p&gt;``` css&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/* Keep .platform-mac to make the rule more specific than the general one above. */
body.platform-mac.platform-mac-snowleopard .monospace,
body.platform-mac.platform-mac-snowleopard .source-code {
    font-size: 11px !important;
    font-family: Menlo, monospace;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Squinting...&lt;/em&gt; &lt;code&gt;11px&lt;/code&gt;, there's the problem!&lt;/p&gt;

&lt;h2&gt;Override the styling in Custom.css&lt;/h2&gt;

&lt;p&gt;It is possible to edit &lt;code&gt;devTools.css&lt;/code&gt; right there in the Inspector &lt;em&gt;Inspector&lt;/em&gt; and that is a great way to test out live styling changes, as it is on any web page.  The problem with this technique is that those changes will not persist.  The solution is to place them in a &lt;code&gt;Custom.css&lt;/code&gt; file located in the &lt;a href=&quot;http://www.chromium.org/user-experience/user-data-directory&quot;&gt;Chrome User Data Directory&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have located your &lt;code&gt;Custom.css&lt;/code&gt; file and you have dropped in all of your custom rules, you're done!  Those changes will persist and every time that you open up the Inspector you will see your custom styles applied!&lt;/p&gt;

&lt;h2&gt;In Summary&lt;/h2&gt;

&lt;p&gt;I have focused on changing the &lt;code&gt;font-family&lt;/code&gt; and &lt;code&gt;font-size&lt;/code&gt; in this article but you can override anything you'd like with the correct CSS selectors.  A good effort could even &lt;a href=&quot;http://ethanschoonover.com/solarized&quot;&gt;solarize&lt;/a&gt; the Web Inspector Console.&lt;/p&gt;

&lt;p&gt;If you are interested, my &lt;code&gt;Custom.css&lt;/code&gt; is &lt;a href=&quot;https://github.com/krismolendyke/Chrome-User-StyleSheets&quot;&gt;available on github&lt;/a&gt;.  I have chosen to bump up the font size to avoid squinting and prefer &lt;a href=&quot;http://www.codinghorror.com/blog/2005/08/consolas-and-cleartype.html&quot;&gt;Consolas&lt;/a&gt; over Menlo for more enjoyable web development.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Decade With Dvorak</title>
    <link href="http://k20e.com/blog/2011/08/05/a-decade-with-dvorak/"/>
    <updated>2011-08-05T18:09:00-04:00</updated>
    <id>http://k20e.com/blog/2011/08/05/a-decade-with-dvorak</id>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;We are committed to [the qwerty keyboard], even though it was designed to satisfy constraints that no longer apply, was based on a style of typing no longer used, and is difficult to learn.&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;Donald A. Norman&lt;/strong&gt;&lt;cite&gt;&lt;a href='http://www.amazon.com/gp/product/0465067107/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399377&amp;creativeASIN=0465067107'&gt;The Design of Everyday Things&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;


&lt;p&gt;I developed an interest in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard&quot;&gt;Dvorak keyboard&lt;/a&gt; something like ten years ago now.  The exact date that I decided to go cold turkey on &lt;a href=&quot;http://en.wikipedia.org/wiki/Qwerty&quot;&gt;qwerty&lt;/a&gt; is fuzzy at this point, but an article entitled, &quot;Roughly Nine Or Ten Years With Dvorak,&quot; just didn't have the same ring to it.  So here I am, &lt;em&gt;ten years later&lt;/em&gt;, still annoying my friends and colleagues when I forget to swap their software key mappings back to qwerty when I'm finished borrowing their computers.&lt;/p&gt;

&lt;p&gt;This article addresses my experience with the Dvorak keyboard over the course of the last ten years.  It does not aim to convince you that one keyboard is &lt;em&gt;better&lt;/em&gt; than another.  This is the story of my journey as qwerty keyboard user toward Dvorak keyboard curiosity, competency, and expertise.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h2&gt;The Curiosity&lt;/h2&gt;

&lt;p&gt;College has the reputation of being a great place to experiment.  New surroundings, new friends, new freedoms, and new software key mappings are all factors in a young co-ed's formative collegiate experience.&lt;/p&gt;

&lt;p&gt;Coincidentally, an assigned reading in a UI class that I was taking at the time was Donald A. Norman's, &lt;a href=&quot;http://www.amazon.com/gp/product/0465067107/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;tag=k20e-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399377&amp;amp;creativeASIN=0465067107&quot;&gt;&lt;em&gt;The Design of Everyday Things&lt;/em&gt;&lt;/a&gt;.  This fascinating book would become pivotal for me as I began to notice and critique elements of design in our world.  I credit it with heightening my awareness of the things surrounding me everyday, and in how I interact with those things.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Design of Everyday Things&lt;/em&gt; also served as my introduction to the Dvorak keyboard.  How did it peak my interest?  Norman's case history made me think about the origin of the keyboard sitting right there in front of me.&lt;/p&gt;

&lt;p&gt;&lt;img class='left ' src='/images/a-decade-with-dvorak/ball-keyboard.png' width='274' height='235' alt='Hansen Writing Ball' title='Hansen Writing Ball'&gt;&lt;/p&gt;

&lt;p&gt;The typewriter has a fascinating history.  As a machine, it is a compelling engineering solution to a problem faced by all societies with written language.  It has evolved from what are now &lt;a href=&quot;http://en.wikipedia.org/wiki/Typewriter#Early_innovations&quot;&gt;nearly unrecognizable mechanical forms&lt;/a&gt; to the familiar skeuomorphic touch screens that many of us walk around with in our pockets every day.&lt;/p&gt;

&lt;p&gt;&lt;span class='has-pullquote' data-pullquote='Why has the typewriter evolved radically as a machine, yet its interface has remained comparatively consistent? '&gt;
The problems that the typewriter set out to solve remain similar to those which modern keyboards face.  No one would consider the computers before us today to be typewriters in the classical sense of the word, but we expect much of the same from each device.  We press keys and characters appear.  Why has the typewriter evolved radically as a machine, yet its interface has remained comparatively consistent?
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Arriving at this question probably had more influence on furthering my investigation of the Dvorak keyboard than did anything else I had come across during my research.&lt;/p&gt;

&lt;h2&gt;Constraints&lt;/h2&gt;

&lt;p&gt;&lt;img class='left ' src='http://upload.wikimedia.org/wikipedia/commons/f/f8/Typebars.jpg' width='226' height='422' alt='Jammed typebars' title='Jammed typebars'&gt;&lt;/p&gt;

&lt;p&gt;Specifically, the constraints that Norman is referring to are the inherent bounds of mechanical typewriters as machines.  Jamming typebars, advancing the printer ribbon, returning the carriage and advancing the line at the end of the current line are all facets of mechanical challenges that typewriters must solve. Computer keyboards need not concern themselves with such things.&lt;/p&gt;

&lt;p&gt;By lifting these mechanical constraints from a keyboard designer's shoulders, what solution would he or she arrive at?  This was one of the questions that the creators of the Dvorak keyboard set out to answer with their research and another question which truly interested me.&lt;/p&gt;

&lt;h2&gt;Typing Style&lt;/h2&gt;

&lt;p&gt;Upon first introduction to a keyboard, most people extend an index finger or two and after scanning the rows of keys in front of them, begin slowly poking away.  &quot;Hunting and pecking&quot; is clearly the most obvious and natural typing &quot;style&quot; for new users.  Chances are good that you may know at least one person who is not new to a keyboard yet still uses or even &lt;em&gt;prefers&lt;/em&gt; this method.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Touch_typing&quot;&gt;Touch typing&lt;/a&gt;, typically performed with all ten digits while not needing to search for keys visually, is much more efficient than hunting and pecking.  It does require that you &lt;em&gt;know that keyboard&lt;/em&gt; through practice, though.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you don't know any keyboard, there is little difference in typing speed among a qwerty keyboard, an alphabetic keyboard, and even a random arrangement of keys.&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;Donald A. Norman&lt;/strong&gt;&lt;cite&gt;&lt;a href='http://www.amazon.com/gp/product/0465067107/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=k20e-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399377&amp;creativeASIN=0465067107'&gt;The Design of Everyday Things&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;


&lt;p&gt;The interesting thing regarding touch typing is that it was conceived of sometime after the invention of the qwerty keyboard.  The qwerty layout was &lt;a href=&quot;http://en.wikipedia.org/wiki/QWERTY#History_and_purposes&quot;&gt;created sometime during the 1870s&lt;/a&gt; by Christopher Latham Sholes.  The following article is from the New York Times and was published on August 2&lt;sup&gt;nd&lt;/sup&gt;, 1888.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='/images/a-decade-with-dvorak/nyt-touch-type.png' width='290' height='244' alt='New York Times, 1888 - Touch Typing' title='New York Times, 1888 - Touch Typing'&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;TYPEWRITERS CONTEST FOR A PRIZE.&lt;/p&gt;

&lt;p&gt;A speed contest for typewriters, open to all operators using any machine having
upper and lower case, under the auspices of the Metropolitan Stenographers'
Association, was held last night at the rooms of the association, 208 West
Twenty-first-street. Of many operators who had entered only four contestants -
two ladies and two gentlemen - appeared. The matter written was dictated by a
reader selected by the association. The time allowed to each writer was five
consecutive minutes, deductions being made for errors.&lt;/p&gt;

&lt;p&gt;The first prize of $25
was won by F. E. McGurrin, who wrote 479 words, Miss May S. Orr following with
476 words, and Miss M. C. Grant with 469 words. At the conclusion of the contest
Mr. McGurrin gave an exhibition of writing blindfolded, making the extraordinary
record of 101 words to the minute.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(Scan and text &lt;a href=&quot;http://www.kanji.zinbun.kyoto-u.ac.jp/~yasuoka/QWERTY&quot;&gt;source&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class='has-pullquote' data-pullquote='It is unlikely that the qwerty keyboard was developed with touch typing in mind. '&gt;
The last sentence in that article is very interesting.  It is the earliest mention of touch typing that I could find.  The apparent air of astonishment lends credibility to it being reported as a then (&lt;em&gt;ca. 1888&lt;/em&gt;) recent phenomenon.  It is unlikely that the qwerty keyboard was developed with touch typing in mind.  Short of &lt;a href=&quot;http://en.wikipedia.org/wiki/Stenotype&quot;&gt;stenotype&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Chorded_keyboard&quot;&gt;chorded keyboard&lt;/a&gt; input styles, touch typing is one of the most efficient styles of keyboard typing.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Does this mean that qwerty can't succeed as a touch typing keyboard?  Probably not.  There are most likely millions of people happily and efficiently touch typing all day long on qwerty keyboards; nevertheless, this question led me to yet another.&lt;/p&gt;

&lt;p&gt;Is a keyboard designed after the invention and widespread adoption of touch typing a better keyboard?&lt;/p&gt;

&lt;h2&gt;My Experiences After Ten Years&lt;/h2&gt;

&lt;p&gt;I've outlined how I originally discovered the Dvorak keyboard, and some of the reasons that it intrigued me.  I can't pretend to be a keyboard efficiency expert, and in this article I'm not attempting to reignite the qwerty vs. Dvorak debate.  There are &lt;a href=&quot;http://mkweb.bcgsc.ca/carpalx/?dvorak&quot;&gt;many resources&lt;/a&gt; which make the claim that the Dvorak keyboard improves typing speed.  Popular &lt;a href=&quot;http://duckduckgo.com/?q=dvorak+vs.+qwerty&quot;&gt;search&lt;/a&gt; &lt;a href=&quot;http://www.google.com/search?hl=en&amp;amp;q=dvorak%20vs.%20qwerty&quot;&gt;engines&lt;/a&gt; return well over 100,000 results for the phrase, &quot;qwerty vs. dvorak&quot;.  It's easy to &lt;a href=&quot;http://news.ycombinator.com/item?id=1071357&quot;&gt;read all about the debate&lt;/a&gt;, if you'd like to.&lt;/p&gt;

&lt;p&gt;Debate aside, I would like to express that after switching to the Dvorak keyboard ten years ago, &lt;em&gt;I still love using it&lt;/em&gt;.  Here's what I've learned.&lt;/p&gt;

&lt;h3&gt;For me, the Dvorak keyboard is more comfortable.&lt;/h3&gt;

&lt;p&gt;&lt;span class='has-pullquote' data-pullquote='since I began using the Dvorak keyboard I have not experienced a single day of wrist or hand pain '&gt;
It's been a long time, but I can remember how sore my wrists would be after a long day in front of the qwerty keyboard.  Ever since I began using the Dvorak keyboard I have not experienced a single day of wrist or hand pain related to keyboard interaction.  For me, that's the most dramatic and resounding cheer that can be made regarding the Dvorak keyboard.  As a professional software engineer I spend a large portion of my day typing.  Freeing myself of chronic or even occasional pain is not about efficiency as much as it is about quality of life.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This is the first response I give to people who want to know why I don't use &quot;their&quot; keyboard.&lt;/p&gt;

&lt;h3&gt;I am more effective typing on a Dvorak keyboard.&lt;/h3&gt;

&lt;p&gt;I did endure qwerty touch typing lessons when I was young and in middle school.  I had had little keyboard experience before then and I was firmly planted in the qwerty hunting and pecking camp of typing style.  It wasn't until college that I began to spend significant amounts of time in front of a keyboard.  Subsequently, I had relatively poor qwerty typing skills and plenty of bad habits.&lt;/p&gt;

&lt;p&gt;Dropping qwerty altogether and focusing on Dvorak allowed me to focus on learning to touch type on an easy to learn keyboard.  The process also instilled in me a satisfactory feeling of &lt;a href=&quot;http://www.codinghorror.com/blog/2008/11/we-are-typists-first-programmers-second.html&quot;&gt;knowing that I was making an investment in myself and my upcoming profession&lt;/a&gt;.  If I could improve my typing efficiency whilst lowering my chances of suffering &lt;a href=&quot;http://en.wikipedia.org/wiki/Repetitive_strain_injury&quot;&gt;repetitive strain injuries&lt;/a&gt; throughout my career then the sooner the better.&lt;/p&gt;

&lt;p&gt;Additionally, I didn't have to unlearn my poor qwerty habits to learn Dvorak.  The slate was clean, and beside the chore of memorizing the new layout, I saw all upside in my Dvorak endeavor.&lt;/p&gt;

&lt;h3&gt;Using a Dvorak keyboard can be inconvenient.&lt;/h3&gt;

&lt;p&gt;As is true often times for folks in the minority, simply being different can be a challenge.  Until only recently &lt;a href=&quot;/blog/2011/08/02/dear-family/&quot;&gt;when I began a new job&lt;/a&gt;, I had never met another colleague who used the Dvorak keyboard.  That meant that if I needed to use someone else's keyboard, I either had to fall back onto my less than mediocre qwerty skills or swap the software key mapping in their OS.  All popular operating systems support the Dvorak keyboard so in practice this is rarely a difficult process, but it can still serve as a point of confusion if I get up and forget to swap their key map back to qwerty.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Very few things are as entertaining to a Dvorak keyboard user than watching a colleague struggle with the mysterious effect of their clearly labeled keyboard producing incorrect characters, save for &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;m&lt;/strong&gt;.  Sadistic, I know.  Satisfying, nonetheless.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;If a friend or colleague needs to borrow my keyboard, they are faced with a similar dilemma.  Personally, I wouldn't trade these inconveniences for the improved comfort and efficiency that I have experienced throughout my years as a Dvorak keyboard user.  It's a great way to keep people off of your machine, too!&lt;/p&gt;

&lt;h3&gt;Typing on the Dvorak keyboard is &lt;em&gt;fun&lt;/em&gt;.&lt;/h3&gt;

&lt;p&gt;This is clearly subjective, but I think that the Dvorak keyboard is just more fun to use.  I find that the fingers of both of my hands naturally settle into a pleasant rhythm.  Each hands' fingers drum comfortably outside-in from pinky to index in an alternating &lt;em&gt;left, right, left, right&lt;/em&gt; pattern.  Rarely do I feel like my fingers stray from the home row, and when they do they are never straining to reach for the desired key.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The Dvorak keyboard makes me feel like I'm playing a musical instrument.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;At first I had to practice, but now I simply play all day long, riffing and jamming effortlessly as I develop software or write prose.&lt;/p&gt;

&lt;h3&gt;The Dvorak keyboard has made me faster at typing.&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I was a &lt;em&gt;lousy&lt;/em&gt; qwerty keyboard user prior to switching to the Dvorak keyboard.&lt;/p&gt;

&lt;p&gt;I experienced a tangible typing speed increase as a direct result of teaching myself to touch type.  This really had very little to do with the Dvorak keyboard and very much to do with focused determination to achieve that goal.  Perhaps some of the claims surrounding the ease of learning the Dvorak keyboard were to thank, I don't know for certain.&lt;/p&gt;

&lt;p&gt;&lt;img class='right ' src='http://s3.amazonaws.com/sebastianpublic/images/monkey-sticker.png' width='250' height='150' alt='Typing is not the bottleneck' title='Typing is not the bottleneck'&gt;&lt;/p&gt;

&lt;p&gt;Additionally, as a software engineer, I find little value in actually being able to &lt;em&gt;type really, really fast&lt;/em&gt;.  As &lt;a href=&quot;http://sebastianlab.com/&quot;&gt;a friend and colleague&lt;/a&gt; once created stickers proclaiming, &lt;a href=&quot;http://sebastianlab.com/post/140303165/typing-is-not-the-bottleneck&quot;&gt;Typing is not the bottleneck&lt;/a&gt;.  I find all of the arguments regarding perceived or actual &lt;a href=&quot;http://en.wikipedia.org/wiki/Wpm&quot;&gt;WPM&lt;/a&gt; increases to be inconsequential.&lt;/p&gt;

&lt;p&gt;The last time I couldn't get code written as quickly as I could dream it up I was, well, &lt;em&gt;dreaming&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;In Summary&lt;/h2&gt;

&lt;p&gt;There is a lot of data out there regarding the qwerty, Dvorak and other keyboards.  The qwerty vs. Dvorak debate gets particular attention in &lt;a href=&quot;http://news.ycombinator.com/item?id=1071357&quot;&gt;nooks of the Internet&lt;/a&gt; &lt;a href=&quot;http://slashdot.org/index2.pl?fhfilter=dvorak+keyboard&quot;&gt;where geeks congregate&lt;/a&gt;.  A majority of the English speaking world is using the qwerty keyboard in styles ranging from slow and ineffective hunting and pecking to fast and efficient touch typing.&lt;/p&gt;

&lt;p&gt;Ten years after deciding to become a part of the minority and learn to use the Dvorak keyboard I am still very happy as an engineer and a keyboard user in general.  My wrists and forearms are comfortable, my accuracy and speed are improved, and I continue to have a lot of fun each time I sit down to type.&lt;/p&gt;

&lt;h2&gt;Reference &amp;amp; Further Reading&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://news.ycombinator.com/item?id=2874484&quot;&gt;Conversation over on HackerNews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.quora.com/Is-the-Qwerty-keyboard-layout-the-most-efficient-one-Or-are-there-better-ones/answer/Don-Norman&quot;&gt;Donald Norman on Dvorak efficiency and qwerty myths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mit.edu/~jcb/Dvorak/&quot;&gt;Another longtime Dvorak user's thoughts and some more history&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dvzine.org/&quot;&gt;A fun Dvorak comic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.kanji.zinbun.kyoto-u.ac.jp/~yasuoka/QWERTY/&quot;&gt;A source of old qwerty publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freakonomics.com/2007/05/30/qwerty-vs-dvorak/&quot;&gt;Freakonomics on the qwerty vs. Dvorak debate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://haacked.com/archive/2007/06/05/dvorak-keyboard-layout-of-champions.aspx&quot;&gt;More qwerty to Dvorak switching experiences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>Dear Family, One Year Later</title>
    <link href="http://k20e.com/blog/2011/08/02/dear-family/"/>
    <updated>2011-08-02T21:20:00-04:00</updated>
    <id>http://k20e.com/blog/2011/08/02/dear-family</id>
    <content type="html">&lt;h3&gt;Recapitulation&lt;/h3&gt;

&lt;p&gt;Nearly one year ago, &lt;a href=&quot;/blog/2010/08/25/dear-family-this-is-what-i-do/&quot;&gt;I addressed my family and friends&lt;/a&gt; regarding a career decision that I was about to make.  A lot of thought went into my decision and the choice to share some underlying details with them publicly.  I put a lot of value in my family and friends' input regarding all big decisions in my life.&lt;/p&gt;

&lt;p&gt;Countless hours were spent then wrestling with point and counterpoint offered both internally and interactively while I tried to reign in emotions and remain objective.  It was a difficult and stressful process.  Naturally, I'm a very analytical thinker and I take pride in making informed, rational decisions.  I challenged my pragmatism a year ago by deciding to jump into the relative unknown to see what kinds of opportunities I could make for myself.&lt;/p&gt;

&lt;p&gt;Today, I revisit that process as I prepare to make another big decision.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;Lessons Learned&lt;/h3&gt;

&lt;h4&gt;Technically&lt;/h4&gt;

&lt;p&gt;Without going into too much detail, for the last year I have spent a good portion of my time and energy as a software craftsman within in a small, &lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/8/8e/Startup_financing_cycle.svg&quot;&gt;seed stage startup&lt;/a&gt;.  I was the fifth employee hired and the third engineer at the time.  As things evolved, we hired a fourth engineer to help fill a &lt;a href=&quot;http://en.wikipedia.org/wiki/DevOps&quot;&gt;devops&lt;/a&gt; role.  The IT operations requirements of that position meant that our company essentially operated with three &lt;a href=&quot;http://mdelaurentis.com/&quot;&gt;excellent&lt;/a&gt; &lt;a href=&quot;http://tekgunk.blogspot.com/&quot;&gt;engineers&lt;/a&gt; creating our application and &lt;a href=&quot;http://chrishunters.com/&quot;&gt;another great engineer&lt;/a&gt; supporting its infrastructure.&lt;/p&gt;

&lt;p&gt;As one-third of a team responsible for software design and implementation of a brand new product, I learned a great amount.  My passion for developing software which delivers an outstanding user experience meant that I naturally settled into the lead role on all of our client side code.  I write &lt;em&gt;naturally settled&lt;/em&gt; but I don't mean to underplay the challenge that this responsibility afforded me.&lt;/p&gt;

&lt;p&gt;It was the first time I had faced such a large undertaking as the sole resource and the de-facto guru.  It was exactly the challenge and opportunity that I had been seeking by making the kind of change that I had made.  Arming myself with &lt;a href=&quot;http://macromates.com/&quot;&gt;new&lt;/a&gt; &lt;a href=&quot;http://www.sublimetext.com/2&quot;&gt;tools&lt;/a&gt;, &lt;a href=&quot;http://compass-style.org/&quot;&gt;new&lt;/a&gt; &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;techniques&lt;/a&gt; and a &lt;a href=&quot;http://javascript.crockford.com/&quot;&gt;new understanding&lt;/a&gt; of what it meant to learn by loving what you do, I believe that I met and exceeded expectations set out by my team, myself and our users.&lt;/p&gt;

&lt;h4&gt;Non-technically&lt;/h4&gt;

&lt;p&gt;When I approached the startup world last year, I didn't know a whole lot about it.  Looking back on it now, it is obvious that I didn't even know what questions to ask of myself or others regarding the opportunity in front of me.  Over the course of the last year I've stumbled into or sought out a lot of those questions by living life on the inside of a seed stage startup.  I feel like I could have prepared myself better for the decision that I had faced then but sometimes the only way to learn what you don't know is through first hand experience.&lt;/p&gt;

&lt;p&gt;What in particular did I learn outside of the technical arena?&lt;/p&gt;

&lt;h5&gt;I need to see and understand a comprehensive business plan.&lt;/h5&gt;

&lt;p&gt;Not seeking out, consuming and believing in this document was probably my biggest &lt;em&gt;and most obvious&lt;/em&gt; startup rookie move.  I totally failed here.&lt;/p&gt;

&lt;h5&gt;I need to be able to clearly express a product vision to others.&lt;/h5&gt;

&lt;p&gt;If I can't explain what it is that I'm so passionately working on to my friends, family and peers clearly and concisely then there's a pretty good chance that it will fail.  I'm sure that there are exceptions to this but I feel like it's a fairly good indicator for me, at least on a &lt;em&gt;gut check&lt;/em&gt; level.  To put it another way, I shouldn't need to be in the &lt;a href=&quot;http://whatcoloristheempirestatebuilding.com/&quot;&gt;Empire State Building&lt;/a&gt; to finish my &lt;a href=&quot;http://www.alumni.hbs.edu/careers/pitch/&quot;&gt;elevator pitch&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Branding matters.&lt;/h5&gt;

&lt;p&gt;Yes, there are probably some examples of successful startups with goofy names, boring colors and lame logos.  To me, branding is about attracting great people to use your product and subsequently establishing trust with those users.  If I'm not attracted to it myself, I find it very difficult to be the kind of advocate that a young product requires to build a trusting user base.&lt;/p&gt;

&lt;h5&gt;Marketing matters.&lt;/h5&gt;

&lt;p&gt;This was a lesson that I expected to learn.  However, I think that I had underestimated the powerful combination of &lt;em&gt;brand&lt;/em&gt; and &lt;em&gt;marketing&lt;/em&gt; in a seed stage startup.  There's a great difference between deciding to wait to market an unfinished, feature incomplete product, and not having a product vision and brand that's actually marketable until that's possible.&lt;/p&gt;

&lt;h5&gt;Compensation matters.&lt;/h5&gt;

&lt;p&gt;Here's another no-brainer, but I had never experienced a situation like this before.  In an inherently volatile environment, when it gets hot and dry in &lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/8/8e/Startup_financing_cycle.svg&quot;&gt;the valley of death&lt;/a&gt;, a mirage isn't going to save you.  Without a meaningful sense of ownership, or market-rate compensation, my motivation plummeted and a sense of rational discontentment skyrocketed within me.&lt;/p&gt;

&lt;p&gt;I attempted to resolve this internally but was rebuffed.  That interaction left me even less committed to a product that I didn't believe in when it really needed fanatical devotion and unwavering confidence in its eventual success &lt;em&gt;to have a chance at succeeding.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;In Summary&lt;/h4&gt;

&lt;p&gt;Technically, I learned a lot.  Non-technically, I learned a lot.  In both areas, I believe that I learned techniques, skills, and lessons that I could not have without this experience.  I've grown a tremendous amount over the course of the last twelve months both professionally and personally and that has been ultimately rewarding.&lt;/p&gt;

&lt;h3&gt;Moving Forward&lt;/h3&gt;

&lt;p&gt;Reflecting on and summarizing lessons learned is always a great exercise.  Exercise is great, but as Kenny Powers &lt;a href=&quot;http://www.youtube.com/watch?v=bgDaVLCaBzQ&amp;amp;t=2m10s&quot;&gt;once said&lt;/a&gt;, &quot;I play real sports... not tryin' to be the best at exercisin'.&quot;  So, what have I done with all this exercise?&lt;/p&gt;

&lt;p&gt;I've taken the last few months to &lt;em&gt;play real sports&lt;/em&gt; on a field covering my personal and professional goals, near and long term, with all of my skills in top form.  A lot of doors have opened for me as a result of that hard work and execution.  At the risk of sounding narcissistic, I was nearly overwhelmed with the many great directions that I could choose to head in.&lt;/p&gt;

&lt;p&gt;If last year I jumped into the unknown, this year I'm &lt;a href=&quot;http://www.youtube.com/watch?v=sn8MkrSO1n0&quot;&gt;strolling confidently&lt;/a&gt; into a situation where fantastically bright folks have already found a tremendous amount of success.  In just a couple of weeks, I'll start my new role as an engineer at &lt;a href=&quot;http://monetate.com/&quot;&gt;Monetate&lt;/a&gt;, and I'm absolutely excited!&lt;/p&gt;

&lt;p&gt;At Monetate I'll have the opportunity to make a big, positive impact on an already &lt;a href=&quot;http://monetate.com/company/jobs/meet-monetate/&quot;&gt;outstanding engineering culture&lt;/a&gt; and reach a &lt;a href=&quot;http://monetate.com/why-monetate/monetate-clients/&quot;&gt;large, diverse customer base&lt;/a&gt; which already &lt;a href=&quot;http://monetate.com/why-monetate/customer-stories/&quot;&gt;trusts the Monetate product and brand&lt;/a&gt;.  I'll be growing along with the company &lt;a href=&quot;http://techcrunch.com/2011/08/04/monetate-raises-15-million-for-simple-ad-testing-and-targeting-platform/&quot;&gt;as it grows&lt;/a&gt; and expands its reach and develops more great solutions for satisfied customers.&lt;/p&gt;

&lt;p&gt;After meeting with the &lt;a href=&quot;http://monetate.com/company/leadership/&quot;&gt;Monetate leadership&lt;/a&gt; I developed a respect for their experiences and qualities as leaders that I can learn from and love working with.  I was able to comprehend the company's &lt;a href=&quot;http://monetate.com/strategic-services/&quot;&gt;vision&lt;/a&gt; and witness first hand a &lt;a href=&quot;http://monetate.com/why-monetate/&quot;&gt;brand&lt;/a&gt;, &lt;a href=&quot;http://monetate.com/features/&quot;&gt;product&lt;/a&gt; and &lt;a href=&quot;http://monetate.com/resources/&quot;&gt;marketing&lt;/a&gt; that established, happy customers trust.  I will be happily compensated and enjoying some important and &lt;a href=&quot;http://monetate.com/company/jobs/top-10-reasons-to-work-at-monetate/&quot;&gt;unique benefits&lt;/a&gt; while taking pride in my work, growing my skills and developing a tangible sense of ownership.  I can't wait to get started!&lt;/p&gt;

&lt;h4&gt;In Summary, Part Deux&lt;/h4&gt;

&lt;p&gt;The last year has been an amazing journey for me in many ways.  I feel like I've experienced great successes and disappointments and grown from both outcomes.  Looking back on myself a year ago, the differences are easy to recognize.  As easily recognized are the similarities; I love my family and friends, and I'm excited for the future I'm making for myself, and the opportunities I hope to create for my family.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Piece of Cakefile</title>
    <link href="http://k20e.com/blog/2011/05/02/a-piece-of-cakefile/"/>
    <updated>2011-05-02T00:00:00-04:00</updated>
    <id>http://k20e.com/blog/2011/05/02/a-piece-of-cakefile</id>
    <content type="html">&lt;h3&gt;Simplifying Large CoffeeScript Project Builds With Cake&lt;/h3&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;In &lt;a href=&quot;/blog/2011/01/04/flavored-coffee/&quot; title=&quot;Flavored Coffee: Test Driving Client-side Development with Jasmine &amp;amp; CoffeeScript&quot;&gt;my last post&lt;/a&gt; I described some methods for test-driving &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot; title=&quot;CoffeeScript&quot;&gt;CoffeeScript&lt;/a&gt; development.  If you caught the buzz, by now you may have a sprawling CoffeeScript codebase that is quickly outgrowing a simple&lt;/p&gt;

&lt;p&gt;``` sh&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;coffee --watch --compile
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;command for production compilation and deployment... you're ready for a slice of &lt;a href=&quot;http://jashkenas.github.com/coffee-script/#cake&quot; title=&quot;CoffeeScript&quot;&gt;Cake&lt;/a&gt;!&lt;/p&gt;

&lt;!--more--&gt;


&lt;h2&gt;The Ingredients&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nodejs.org/&quot; title=&quot;node.js&quot;&gt;node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://npmjs.org/&quot; title=&quot;npm - Node Package Manager&quot;&gt;Node Package Manager (npm)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My &lt;a href=&quot;http://goo.gl/LMhGA&quot;&gt;sample project at github&lt;/a&gt;, to play along at home if you'd like&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You'll want to &lt;a href=&quot;https://github.com/joyent/node/wiki/Installation&quot;&gt;build and install node&lt;/a&gt; from its latest at &lt;a href=&quot;https://github.com/joyent/node&quot;&gt;github&lt;/a&gt;.  Then install &lt;code&gt;npm&lt;/code&gt; and CoffeeScript:&lt;/p&gt;

&lt;p&gt;``` sh&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl http://npmjs.org/install.sh | sh
$ npm install coffee-script -g
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Now you're ready to enjoy some Cake with your Coffee!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: npm just turned 1.0 and the &lt;code&gt;-g&lt;/code&gt; flag tells npm to install CoffeeScript globally, so it is available across your projects and system. You can read more about it on the &lt;a href=&quot;http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/&quot; title=&quot;npm 1.0: Global vs Local installation &amp;laquo; node blog&quot;&gt;node blog post&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;A Taste of Cake&lt;/h2&gt;

&lt;p&gt;In addition to being a logical progression of the classic &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;rake&lt;/code&gt; build system names, &lt;code&gt;cake&lt;/code&gt; borrows some familiar concepts from those systems.  A &lt;code&gt;Cakefile&lt;/code&gt; defines tasks that &lt;code&gt;cake&lt;/code&gt; can perform, written in essentially a tiny CoffeeScript &lt;a href=&quot;http://en.wikipedia.org/wiki/Domain-specific_language&quot; title=&quot;Domain-specific language - Wikipedia, the free encyclopedia&quot;&gt;DSL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That means that all of CoffeeScript's &lt;a href=&quot;http://jashkenas.github.com/coffee-script/#language&quot; title=&quot;CoffeeScript&quot;&gt;lovely syntax&lt;/a&gt; is available for use. Additionally, since &lt;code&gt;cake&lt;/code&gt; depends on &lt;code&gt;node&lt;/code&gt;, you have all of the power of &lt;a href=&quot;http://nodejs.org/docs/v0.4.5/api/&quot; title=&quot;Node.js Manual &amp;amp; Documentation&quot;&gt;&lt;code&gt;node&lt;/code&gt;'s API&lt;/a&gt; and libraries at your finger tips.  That's &lt;a href=&quot;http://www.youtube.com/watch?v=Bcech3F-FvI&quot; title=&quot;YouTube - Anchorman - Im kind of a big deal&quot;&gt;kind of a big deal&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Organizing a CoffeeScript Project&lt;/h2&gt;

&lt;p&gt;Since I like &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot; title=&quot;Test-driven development - Wikipedia, the free encyclopedia&quot;&gt;test-driven development&lt;/a&gt;, I have some general project organization patterns that I like to follow.  Here's a simple example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Cakefile
/production
    /coffee-script
        intro.coffee
        MyGreatClass.coffee
        outro.coffee
    /js
/test
    /coffee-script
        MyGreatClassSpec.coffee
    /js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the implied ordering of the production CoffeeScript files.  Logically, the contents of &lt;code&gt;intro.coffee&lt;/code&gt; should precede &lt;code&gt;MyGreatClass.coffee&lt;/code&gt; and &lt;code&gt;outro.coffee&lt;/code&gt; should wrap things up.  My goal is to generate a single production JavaScript file from those three CoffeeScript files, concatenated in that order before compilation.  CoffeeScript's creator, &lt;a href=&quot;https://github.com/jashkenas&quot;&gt;Jeremy Ashkenas&lt;/a&gt;, has a &lt;a href=&quot;https://github.com/jashkenas/coffee-script/wiki/%5BHowTo%5D-Compiling-and-Setting-Up-Build-Tools&quot;&gt;great little example&lt;/a&gt; of how to do this, which I'll expand on.&lt;/p&gt;

&lt;p&gt;CoffeeScript has a &lt;code&gt;-j [FILE]&lt;/code&gt; command line switch that lets you easily concatenate file names in order into a single, &lt;code&gt;FILE.coffee&lt;/code&gt;.  However, if we're &lt;a href=&quot;http://nodejs.org/docs/v0.4.7/api/fs.html#fs.readdir&quot; title=&quot;fs - Node.js Manual &amp;amp; Documentation&quot;&gt;reading a directory asynchronously&lt;/a&gt; in node, even if our &lt;code&gt;*.coffee&lt;/code&gt; files are explicitly named to fall into proper order, there is no guarantee that they will be returned in that order.&lt;/p&gt;

&lt;p&gt;If you notice tasks or file reads occurring in a seemingly random order, this asynchronous behavior is most likely the culprit.  Of course, there are methods to enforce specific ordering of events that I'll discuss below.&lt;/p&gt;

&lt;h2&gt;Cakefile Setup&lt;/h2&gt;

&lt;p&gt;In order to guarantee the proper ordering of our application's component files, we need to establish an array of those file names, iterate over them and concatenate each file's contents.  To give you an idea of how I currently like to set up my Cakefile, here's what I'd call the preamble, the portion before I define any tasks.&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fs     = require 'fs'
{exec} = require 'child_process'
util   = require 'util'

prodSrcCoffeeDir     = 'production/src/coffee-script'
testSrcCoffeeDir     = 'test/src/coffee-script'

prodTargetJsDir      = 'production/src/js'
testTargetJsDir      = 'test/src/js'

prodTargetFileName   = 'app'
prodTargetCoffeeFile = &quot;#{prodSrcCoffeeDir}/#{prodTargetFileName}.coffee&quot;
prodTargetJsFile     = &quot;#{prodTargetJsDir}/#{prodTargetFileName}.js&quot;

prodCoffeeOpts = &quot;--bare --output #{prodTargetJsDir} --compile #{prodTargetCoffeeFile}&quot;
testCoffeeOpts = &quot;--output #{testTargetJsDir}&quot;

prodCoffeeFiles = [
    'intro'
    'core'
    'outro'
]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Like any node application, I require a few modules first.  Then I simply assign a few values for project-specific directory layout, &lt;code&gt;coffee&lt;/code&gt; options for test and production code, and finally the aforementioned array of CoffeeScript files I'd like concatenated in a particular order.  Now let's take a look at a task that concatenates and builds our production CoffeeScript.&lt;/p&gt;

&lt;h2&gt;Cakefile Build Task&lt;/h2&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;task 'build', 'Build a single JavaScript file from prod files', -&amp;gt;
    util.log &quot;Building #{prodTargetJsFile}&quot;
    appContents = new Array remaining = prodCoffeeFiles.length
    util.log &quot;Appending #{prodCoffeeFiles.length} files to #{prodTargetCoffeeFile}&quot;

    for file, index in prodCoffeeFiles then do (file, index) -&amp;gt;
        fs.readFile &quot;#{prodSrcCoffeeDir}/#{file}.coffee&quot;
                  , 'utf8'
                  , (err, fileContents) -&amp;gt;
            util.log err if err

            appContents[index] = fileContents
            util.log &quot;[#{index + 1}] #{file}.coffee&quot;
            process() if --remaining is 0

    process = -&amp;gt;
        fs.writeFile prodTargetCoffeeFile
                   , appContents.join('\n\n')
                   , 'utf8'
                   , (err) -&amp;gt;
            util.log err if err

            exec &quot;coffee #{prodCoffeeOpts}&quot;, (err, stdout, stderr) -&amp;gt;
                util.log err if err
                message = &quot;Compiled #{prodTargetJsFile}&quot;
                util.log message
                fs.unlink prodTargetCoffeeFile, (err) -&amp;gt; util.log err if err
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;I won't step through this code as it's pretty easy to follow.  I shamelessly lifted a few patterns from &lt;a href=&quot;https://github.com/jashkenas/coffee-script/wiki/%5BHowTo%5D-Compiling-and-Setting-Up-Build-Tools&quot;&gt;Jeremy's Wiki&lt;/a&gt; and they have served my projects well.  What you should take away from this &lt;code&gt;task&lt;/code&gt; is that to guarantee small component concatenation order in a large CoffeeScript project, you'll need to specify that ordering in your Cakefile.  It is not sufficient to hand node a directory which will &lt;code&gt;ls&lt;/code&gt; or &lt;code&gt;dir&lt;/code&gt; your project files in the correct order and expect them to be arranged and built that way!&lt;/p&gt;

&lt;p&gt;For ease of development, the last task we'll take a look at is a simple &lt;code&gt;cake watch&lt;/code&gt; task that will look for changes to our individual CoffeeScript files and invoke our &lt;code&gt;cake build&lt;/code&gt; task when it sees them.  This is the task that makes developing your project in CoffeeScript extra pleasant.&lt;/p&gt;

&lt;h2&gt;Cakefile Watch Task&lt;/h2&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;task 'watch', 'Watch prod source files and build changes', -&amp;gt;
    util.log &quot;Watching for changes in #{prodSrcCoffeeDir}&quot;

    for file in prodCoffeeFiles then do (file) -&amp;gt;
        fs.watchFile &quot;#{prodSrcCoffeeDir}/#{file}.coffee&quot;, (curr, prev) -&amp;gt;
            if +curr.mtime isnt +prev.mtime
                util.log &quot;Saw change in #{prodSrcCoffeeDir}/#{file}.coffee&quot;
                invoke 'build'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Again, this is pretty simple CoffeeScript to follow.  We're making use of node's &lt;a href=&quot;http://nodejs.org/docs/v0.4.7/api/fs.html#fs.watchFile&quot; title=&quot;fs - Node.js Manual &amp;amp; Documentation&quot;&gt;watchFile&lt;/a&gt; &lt;code&gt;fs&lt;/code&gt; method to look for changes to all &lt;code&gt;*.coffee&lt;/code&gt; files in our production source directory.  When modification times differ, we are invoking the &lt;code&gt;build&lt;/code&gt; task outlined above.  With this task, you can fire up your command line and execute:&lt;/p&gt;

&lt;p&gt;``` sh&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cake watch
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;in your project's root (where your &lt;code&gt;Cakefile&lt;/code&gt; should be!) and go on your way happily hacking CoffeeScript all day long.&lt;/p&gt;

&lt;h2&gt;A Piece of...&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cake&lt;/code&gt;, even with the simplest Cakefile tasks, can help you organize and streamline your CoffeeScript workflow.  I have tried to illustrate how &lt;code&gt;cake&lt;/code&gt; can help bring order to your growing CoffeeScript project in a sensible and lightweight manner.  A half hour spent writing a &lt;code&gt;Cakefile&lt;/code&gt; and tweaking your project structure can mean a big return on time and effort as your project matures.&lt;/p&gt;

&lt;p&gt;There isn't a whole lot of documentation available detailing writing even simple Cakefile tasks at the moment and I hope I've helped to fill that gap a bit with this post.  If you'd like to explore more in-depth examples I'd suggest cruising github for &lt;a href=&quot;https://github.com/languages/CoffeeScript&quot;&gt;successful CoffeeScript projects&lt;/a&gt; and studying their Cakefiles.  There's also the brief &lt;a href=&quot;http://jashkenas.github.com/coffee-script/documentation/docs/cake.html&quot; title=&quot;cake.coffee&quot;&gt;annotated &lt;code&gt;cake&lt;/code&gt; source&lt;/a&gt; that can help shed some light onto this build system.&lt;/p&gt;

&lt;p&gt;With the power of node's API and the clarity of CoffeeScript's syntax, you've got another great excuse to love &lt;code&gt;cake&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Sample Skeleton CoffeeScript &amp;amp; Cake Project&lt;/h2&gt;

&lt;p&gt;I've updated my earlier skeleton project for beginning JasmineBDD and CoffeeScript with some of the &lt;code&gt;cake&lt;/code&gt; tasks and ideas described in this post.  Feel free to take a look, clone/fork/etc., try it out and enjoy!  My project is &lt;a href=&quot;http://goo.gl/LMhGA&quot;&gt;available on github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;P.S. - Other Cakefile Task Ideas&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Integrate task success/failure messages with a local notification system (i.e. &lt;a href=&quot;http://search.npmjs.org/#/growl&quot; title=&quot;npm registry&quot;&gt;Growl&lt;/a&gt;).  My example project illustrates this.&lt;/li&gt;
&lt;li&gt;Create a task to minify/obfuscate your production JavaScript output.  I use &lt;a href=&quot;https://github.com/mishoo/UglifyJS&quot;&gt;uglify.js&lt;/a&gt; in my example.&lt;/li&gt;
&lt;li&gt;Roll your &lt;a href=&quot;http://goo.gl/aeCV5&quot; title=&quot;Flavored Coffee: Test Driving Client-side Development with Jasmine &amp;amp; CoffeeScript | Visibiz&quot;&gt;favorite JavaScript test framework&lt;/a&gt; into a task that executes as part of your &lt;code&gt;watch&lt;/code&gt; task for a mini-CIT loop while you work.&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>Flavored Coffee</title>
    <link href="http://k20e.com/blog/2011/01/04/flavored-coffee/"/>
    <updated>2011-01-04T00:00:00-05:00</updated>
    <id>http://k20e.com/blog/2011/01/04/flavored-coffee</id>
    <content type="html">&lt;h3&gt;Test Driving Client-side Development with Jasmine &amp;amp; CoffeeScript&lt;/h3&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;As the development of our new &lt;a href=&quot;http://visibiz.com/blog/fred-stluka/fred-stlukas-ieee-talk-cloud-computing&quot; title=&quot;Fred Stluka&amp;#039;s IEEE talk on Cloud Computing... | Visibiz&quot;&gt;cloud based&lt;/a&gt; &lt;a href=&quot;http://visibiz.com/blog/ami-assayag/social-future-crm-not-current-social-crm&quot; title=&quot;Social Is The Future of CRM, But Not Like Current Social CRM | Visibiz&quot;&gt;Social CRM&lt;/a&gt; system has progressed we have watched the amount of JavaScript in our repository grow.  Much of this code is &lt;a href=&quot;http://jquery.com/&quot; title=&quot;jQuery: The Write Less, Do More, JavaScript Library&quot;&gt;jQuery&lt;/a&gt; or &lt;a href=&quot;http://jqueryui.com/&quot; title=&quot;jQuery UI - Home&quot;&gt;jQueryUI&lt;/a&gt; and is entirely related to the presentation layer.  There are various &lt;a href=&quot;http://www.grails.org/plugin/functional-test&quot; title=&quot;Grails Plugin - Grails Functional Testing&quot;&gt;methods&lt;/a&gt; and &lt;a href=&quot;http://seleniumhq.org/&quot; title=&quot;Selenium web application testing system&quot;&gt;tools&lt;/a&gt; for automated user-interface testing available to modern web application developers but they can feel very heavyweight.&lt;/p&gt;

&lt;p&gt;For logic in our JavaScript code we wanted a fast and lightweight framework that can make our client-side testing as painless and enjoyable as possible.  That's a tall order, and one that required a couple ingredients to achieve.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h2&gt;The Ingredients: &lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot; title=&quot;CoffeeScript&quot;&gt;CoffeeScript&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://pivotal.github.com/jasmine/&quot; title=&quot;Jasmine: BDD for Javascript | Jasmine&quot;&gt;Jasmine&lt;/a&gt;&lt;/h2&gt;

&lt;h3&gt;CoffeeScript: &quot;It's just JavaScript&quot;&lt;/h3&gt;

&lt;p&gt;CoffeeScript's golden rule should be reason enough for skeptics to give it a shot.  After a few minutes hacking some CoffeeScript and a short compilation later you'll have nicely formatted, easily debuggable, pure JavaScript.  You can even throw a &lt;code&gt;--watch&lt;/code&gt; switch on the &lt;code&gt;coffee&lt;/code&gt; compiler so that your &lt;code&gt;.coffee&lt;/code&gt; files are compiled into &lt;code&gt;.js&lt;/code&gt; files as you save them, automatically.&lt;/p&gt;

&lt;h4&gt;A few things to enjoy about CoffeeScript&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.secnetix.de/~olli/Python/block_indentation.hawk&quot;&gt;Significant whitespace&lt;/a&gt; means less &lt;code&gt;{}&lt;/code&gt;, optional &lt;code&gt;;&lt;/code&gt;, improved readability and help fending off other &lt;a href=&quot;http://www.codinghorror.com/blog/2006/05/code-smells.html&quot;&gt;code smells&lt;/a&gt;.  It also means that you can clearly define more complex objects.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;e.g.,&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;myObject =
    property: 'value'
    nestedObject:
        anotherProperty: 'anotherValue'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operators which help eliminate typical JavaScript &lt;a href=&quot;http://stackoverflow.com/questions/3904083/confusion-about-typeof&quot;&gt;operator confusion&lt;/a&gt; like &lt;code&gt;is&lt;/code&gt;, &lt;code&gt;isnt&lt;/code&gt; and &lt;code&gt;of&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New Operators like &lt;code&gt;?:&lt;/code&gt; (&lt;a href=&quot;http://groovy.codehaus.org/Operators#Operators-ElvisOperator%28%3F%3A%29&quot;&gt;Elvis!&lt;/a&gt;) and &lt;code&gt;in&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/List_comprehensions&quot;&gt;List comprehensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Default values for function arguments&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Simple&lt;/em&gt; class definitions- never type &quot;&lt;a href=&quot;http://eloquentjavascript.net/chapter8.html&quot;&gt;prototype&lt;/a&gt;&quot; again, unless you're into that kind of thing&lt;/li&gt;
&lt;li&gt;String &lt;a href=&quot;http://en.wikipedia.org/wiki/String_literal#Variable_interpolation&quot;&gt;variable interpolation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support for a &lt;a href=&quot;http://en.wikipedia.org/wiki/REPL&quot;&gt;REPL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.javascriptlint.com/&quot;&gt;JavaScript Lint&lt;/a&gt; compliant generated code&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It is also worth noting that CoffeeScript is never required to be packaged, deployed or run on the client-side, however.  There is never any run-time interpretation of CoffeeScript.&lt;/p&gt;

&lt;h4&gt;The expense of CoffeeScript&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;An extra installation step&lt;/li&gt;
&lt;li&gt;An extra compilation step&lt;/li&gt;
&lt;li&gt;If you choose to version compiled JavaScript, redundant files in your code repository&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;CoffeeScript: &quot;It's just JavaScript.&quot;&lt;/h3&gt;

&lt;p&gt;This bears repeating because it really is the &lt;strong&gt;most&lt;/strong&gt; important aspect of CoffeeScript!  It means that it can be used with &lt;em&gt;any&lt;/em&gt; existing JavaScript library.  We've chosen a &lt;a href=&quot;http://en.wikipedia.org/wiki/Behavior_Driven_Development&quot;&gt;behavior-driven development&lt;/a&gt; (BDD) framework like Jasmine to make our lives easier in this case.&lt;/p&gt;

&lt;p&gt;As a general rule, wherever you can write JavaScript, you can (more) easily write CoffeeScript!&lt;/p&gt;

&lt;h3&gt;Jasmine&lt;/h3&gt;

&lt;p&gt;Jasmine is a JavaScript testing framework that lifts great features from some other well-known and established frameworks like &lt;a href=&quot;https://github.com/nkallen/screw-unit&quot;&gt;ScrewUnit&lt;/a&gt; and &lt;a href=&quot;http://rspec.info/&quot; title=&quot;RSpec.info: Home&quot;&gt;RSpec&lt;/a&gt;.  It's lightweight and can be run headless in your favorite &lt;a href=&quot;http://hudson-ci.org/&quot; title=&quot;Hudson CI&quot;&gt;continuous integration server&lt;/a&gt;.  Jasmine supports testing asyncronous code and has &lt;a href=&quot;https://github.com/larrymyers/jasmine-reporters&quot;&gt;extensible reporters&lt;/a&gt; for custom test reports to fit your needs.&lt;/p&gt;

&lt;p&gt;The syntax Jasmine offers is relatively simple and readable, too.  But like many other robust JavaScript frameworks, multiple and nested function callbacks are the rule, not the exception.  If you begin to test-drive some jQuery code you'll soon find yourself neck deep in &lt;code&gt;)};&lt;/code&gt; anonymous function callback hell.&lt;/p&gt;

&lt;p&gt;Mixing in CoffeeScript's pleasant syntactical and semantic improvements can help pull us out of it.&lt;/p&gt;

&lt;h2&gt;CoffeeScript &amp;amp; Jasmine Taste Great Together!&lt;/h2&gt;

&lt;p&gt;First, let's take a look at a simple and small Jasmine spec written in CoffeeScript.&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;it 'should perform some basic arithmetic and logical operations', -&amp;gt;
    expect(2 + 2).toEqual 4
    expect(2 / 2).not.toEqual 4
    expect(true).toBeTruthy()
    expect([0, 1, 2]).toContain 1
    expect(['a', 'b', 'c']).not.toContain 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;That is very readable but it's mostly Jasmine that's responsible for that fact in this simple case, not CoffeeScript.  Next we will take a look at a slightly more involved Jasmine suite aimed at testing some jQuery code to see the power CoffeeScript adds to our recipe.&lt;/p&gt;

&lt;p&gt;Let's test-drive a bit of jQuery that updates the background color of a &lt;code&gt;div&lt;/code&gt; on a &lt;code&gt;click&lt;/code&gt; event.  Our Jasmine suite with a single spec might look like this:&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe 'my-div', -&amp;gt;
    it 'should have a red background color when clicked', -&amp;gt;
        red = 'rgb(255, 0, 0)'
        myDiv = $('&amp;lt;div&amp;gt;').attr('id', 'my-div')
        $('body').append myDiv
        expect(myDiv.css('background-color')).not.toEqual red
        myDiv.click()
        expect(myDiv.css('background-color')).toEqual red
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Against which we might write this passing jQuery CoffeeScript code:&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(document).ready -&amp;gt; $('#my-div').live 'click', -&amp;gt; $(this).css('background-color', 'red')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;Note&lt;/em&gt;: we're binding with the &lt;a href=&quot;http://api.jquery.com/live/&quot; title=&quot;.live() &amp;#8211; jQuery API&quot;&gt;live&lt;/a&gt; event handler attachment in this short example because we're appending the &lt;code&gt;div&lt;/code&gt; in our spec- &lt;em&gt;after&lt;/em&gt; &lt;code&gt;document.ready()&lt;/code&gt; has fired.)&lt;/p&gt;

&lt;p&gt;Without CoffeeScript our jQuery code would look something like this:&lt;/p&gt;

&lt;p&gt;``` javascript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(document).ready(function() {
    $('#my-div').live('click', function() {
        return $(this).css('background-color', 'red');
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Not bad, but it certainly lacks the elegance and readability that our CoffeeScript one-liner has!&lt;/p&gt;

&lt;p&gt;Now let's say we'd like to add a form with a named set of radio button inputs which update a &lt;code&gt;span&lt;/code&gt; with the value of the selection to our &lt;code&gt;div&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our test code now becomes:&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe 'my-div', -&amp;gt;
    myDiv = $('&amp;lt;div&amp;gt;').attr('id', 'my-div')

    beforeEach -&amp;gt; $('body').append myDiv
    afterEach -&amp;gt; myDiv.remove()

    it 'should have a red background color when clicked', -&amp;gt;
        red = 'rgb(255, 0, 0)'
        expect(myDiv.css('background-color')).not.toEqual red

        myDiv.click()
        expect(myDiv.css('background-color')).toEqual red

    describe 'my-form', -&amp;gt;
        it 'should update selected size on radio button click', -&amp;gt;
            selectedSize = $('&amp;lt;span&amp;gt;').attr('id', 'selected-size')

            myDiv.append $('&amp;lt;form&amp;gt;')
                .attr('id', 'my-form')
                .append($('&amp;lt;input&amp;gt;')
                    .attr('id', 'small')
                    .attr('name', 'size')
                    .attr('type', 'radio')
                    .val('small'))
                .append($('&amp;lt;input&amp;gt;')
                    .attr('id', 'large')
                    .attr('name', 'size')
                    .attr('type', 'radio')
                    .val('large'))
                .append selectedSize

            expect($('#selected-size').text()).toEqual ''

            $('#small').click()
            expect(selectedSize.text()).toEqual 'small'

            $('#large').click()
            expect(selectedSize.text()).toEqual 'large'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;We've refactored our DOM manipulations to &lt;code&gt;beforeEach&lt;/code&gt; and &lt;code&gt;afterEach&lt;/code&gt; blocks and wrapped a spec regarding &lt;code&gt;#my-form&lt;/code&gt; only in its own nested suite.  This might seem like overkill for a single spec, and it probably is, but when you start writing many specs it really cleans up the test report readability.  Clean test reports make it easier to recognize and fix broken tests faster and easier, which is what test-driving is all about.&lt;/p&gt;

&lt;p&gt;Finally, our production code under test bloats to the following:&lt;/p&gt;

&lt;p&gt;``` coffeescript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(document).ready -&amp;gt;
    $('#my-div').live 'click', -&amp;gt; $(this).css 'background-color', 'red'

    $('input[name=&quot;size&quot;]', '#my-div').live 'click', -&amp;gt;
        $('#selected-size').text $(this).val()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;Not bad!  This was a very simple example, but I hope it clearly illustrates the potential that the combination of CoffeeScript and Jasmine have for reducing client-side testing overhead.&lt;/p&gt;

&lt;h2&gt;Enjoy!&lt;/h2&gt;

&lt;p&gt;CoffeeScript brings to the table an improved, clear syntax and some powerful semantic features over JavaScript all while remaining, &quot;just JavaScript.&quot;  Jasmine offers an elegant behavior-driven development &lt;a href=&quot;http://en.wikipedia.org/wiki/Domain-specific_language&quot; title=&quot;Domain-specific language - Wikipedia, the free encyclopedia&quot;&gt;domain-specific language&lt;/a&gt; for testing and the extensibility to support your working environment.  Adding one to the other is very easy, and the result is just too good to deny!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Dear Family, This Is What I Do</title>
    <link href="http://k20e.com/blog/2010/08/25/dear-family-this-is-what-i-do/"/>
    <updated>2010-08-25T10:36:00-04:00</updated>
    <id>http://k20e.com/blog/2010/08/25/dear-family-this-is-what-i-do</id>
    <content type="html">&lt;p&gt;This post is for my mom, dad, &amp;amp; &lt;a href=&quot;http://jacquimolendyke.com&quot;&gt;sister&lt;/a&gt;, and any other family or friends that find their way here. I have recently changed jobs, and my immediate family have all asked me, &lt;strong&gt;&quot;why?&quot;&lt;/strong&gt; as well as, &lt;strong&gt;&quot;what are you going to be doing?&quot;&lt;/strong&gt;  In this short post, I will answer those questions.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;What do you do?&lt;/h3&gt;

&lt;p&gt;I will begin with what I &lt;em&gt;am&lt;/em&gt;. I am a &lt;a href=&quot;http://manifesto.softwarecraftsmanship.org&quot;&gt;software craftsman&lt;/a&gt;. You could call me a software engineer, a computer scientist, a developer or a coder. But I prefer software craftsman. It sounds funny, but it expresses my passion and my respect for my chosen industry and my fellow craftsmen. After all, engineers are obsessed with accuracy and &lt;a href=&quot;/how-engineer-designs-logo&quot;&gt;attention to detail&lt;/a&gt;. Feel free to call me whatever you'd like to your friends and our extended family. Not being nerdy engineers, you are absolved of nerdy semantic obligations. What is it that I do, then?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All&lt;/em&gt; computers, and some humans, understand at least one programming language. &lt;em&gt;Most&lt;/em&gt; computers, and some humans, understand multiple programming languages. There are &lt;a href=&quot;http://www.99-bottles-of-beer.net&quot;&gt;many, many programming languages&lt;/a&gt;. If a computer and a human understand the same language they can speak to each other and do great things (aside from singing &lt;a href=&quot;http://en.wikipedia.org/wiki/99_bottles_of_beer&quot;&gt;99 Bottles of Beer&lt;/a&gt;). I intend to &lt;em&gt;do&lt;/em&gt; great things! Previously, I have worked to do great things in the public and private sectors and in the defense and healthcare industries.&lt;/p&gt;

&lt;h3&gt;Why are you making a change?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://zenhabits.net/elements-of-change&quot;&gt;Change is good&lt;/a&gt;. I will grow from this change. I'm moving to a &lt;a href=&quot;http://www.computerworld.com/s/article/346619/Beyond_CRM_SaaS_Slips_Into_Mainstream&quot;&gt;new industry&lt;/a&gt;, finding a &lt;a href=&quot;http://www.apple.com/macosx&quot;&gt;new way of working&lt;/a&gt;, and discovering a lot of &lt;a href=&quot;http://www.grails.org&quot;&gt;new technology&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I'm &lt;a href=&quot;http://www.fastcompany.com/node/44778/print&quot;&gt;hungry for some risk&lt;/a&gt;, and I'm in a good position to take one. Professionally, personally, and financially I believe I'm making the correct decision for me, right now.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;What are you going to be doing?&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;As I mentioned earlier, great things! I will continue to write software but now I will be focused on providing solutions in the world of &lt;a href=&quot;http://en.wikipedia.org/wiki/Customer_relationship_management&quot;&gt;customer relationship management&lt;/a&gt; (CRM) and &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_as_a_service&quot;&gt;software as a service&lt;/a&gt; (SaaS).&lt;/li&gt;
&lt;li&gt;Learning about the world of software start up companies and &lt;a href=&quot;http://en.wikipedia.org/wiki/Venture_capital&quot;&gt;venture capital&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Finding out more about myself by defining a new way to work, in a new environment, with &lt;a href=&quot;http://groovy.codehaus.org&quot;&gt;new technology&lt;/a&gt; and new people.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That's it! Well, there's plenty more to it of course, but these are essentially my CliffsNotes edition. If you click through the links I've posted throughout this synopsis you can dig deeper and get more technical details on what I'll be doing on my new adventure!&lt;/p&gt;

&lt;p&gt;Thank you, and I love you!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>How An Engineer Designs a Logo</title>
    <link href="http://k20e.com/blog/2010/07/25/how-an-engineer-designs-a-logo/"/>
    <updated>2010-07-25T20:36:00-04:00</updated>
    <id>http://k20e.com/blog/2010/07/25/how-an-engineer-designs-a-logo</id>
    <content type="html">&lt;p&gt;Let me start by saying that I don't have a formal design background.  I have a couple of degrees from &lt;a href=&quot;http://www.cse.lehigh.edu/&quot;&gt;an engineering university&lt;/a&gt; and I think I can generally recognize good design.&lt;/p&gt;&lt;p&gt;My sister, &lt;a href=&quot;http://jacquimolendyke.com&quot;&gt;Jacqui&lt;/a&gt;, does have a formal design background and recently graduated from &lt;a href=&quot;http://www.newschool.edu/parsons/&quot;&gt;Parsons The New School for Design&lt;/a&gt; (with Top Honors!).  I attended her graduation ceremony in May and she now has a job on Madison Avenue in NYC.  My grandfather worked on Madison Avenue for many years as a graphic artist as well.  I, however, have never worked on Madison Avenue or earned a design degree.  I'm hoping I have the &lt;a href=&quot;http://www.wired.com/wiredscience/2009/05/3d-dna/&quot;&gt;art gene&lt;/a&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;That should be enough of a disclaimer.  The bottom line?  I've got this website, and it needed a logo... &lt;a href=&quot;http://improveverywhere.com/2010/05/18/who-you-gonna-call/&quot;&gt;Who you gonna call?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;OK, so I didn't call the Ghostbusters, that's absurd.  What I did do was think about some aspects of software engineering that I love.  And then I called my sister and a few other capable, trained, and experienced design &lt;a href=&quot;http://mattionicreative.com/&quot;&gt;friends&lt;/a&gt; for help critiquing my own designs.&lt;/p&gt;&lt;p&gt;A critical part of being a great software engineer, or a great engineer in any discipline, is attention to detail.  Following the spirit of &lt;a href=&quot;http://manifesto.softwarecraftsmanship.org/&quot;&gt;software craftsmanship&lt;/a&gt;, I was in search of a professional design which expressed my attention to detail and passion for quality.  After considering many details surrounding the writing of software (&lt;a href=&quot;http://www.python.org/dev/peps/pep-0008/&quot;&gt;significant whitespace syntax&lt;/a&gt;, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Model_M_keyboard&quot;&gt;Model M keyboard&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Recursive_acronym&quot;&gt;recursive acronyms&lt;/a&gt;, etc.) I settled on perhaps an even more minute detail: &lt;a href=&quot;http://www.codinghorror.com/blog/2005/08/consolas-and-cleartype.html&quot;&gt;font porn&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;I've been happily developing using &lt;a href=&quot;http://en.wikipedia.org/wiki/Consolas&quot;&gt;Consolas&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Inconsolata&quot;&gt;Inconsolata&lt;/a&gt; and nothing else for many years now.  In fact, installing either font is one of the first things I do on a new machine that I will be doing &lt;em&gt;any&lt;/em&gt; amount of coding on.  Monospaced font porn, along with the &lt;a href=&quot;/about&quot;&gt;numeronym&lt;/a&gt; which served as the basis of my thinking while naming my site, would prove to be my design inspirations.&lt;/p&gt;&lt;p&gt;If you've read this far and haven't determined it for yourself yet- yes, I am a &lt;a href=&quot;http://en.wikipedia.org/wiki/Nerd#Nerd_pride&quot;&gt;genuine nerd&lt;/a&gt;.  OK, let's design a logo!&lt;/p&gt;&lt;p&gt;First things first.  I needed some tools.  From some recent experience designing a couple of &lt;a href=&quot;http://www.phillymtb.org/iphone&quot;&gt;iPhone apps&lt;/a&gt;, I knew that I wanted to work with vector art so my design could be scaled to fit any size requirements I may have in the future.  A &lt;a href=&quot;http://sebastianlab.com/&quot;&gt;colleague of mine&lt;/a&gt; had been talking up &lt;a href=&quot;http://www.inkscape.org/&quot;&gt;Inkscape&lt;/a&gt; so I decide to give it a shot.  I ended up really digging it after spending around an hour or so familiarizing myself with its UI and pen tool.&lt;/p&gt;&lt;p&gt;Next, I wanted to decide on a color scheme so I could experiment with color while assembling my ideas.  A little poking around on the web turned up &lt;a href=&quot;http://colorschemedesigner.com/#2.51DK-hWpBpB&quot;&gt;Color Scheme Designer&lt;/a&gt; which I found to be both fun and intuitive.  I settled on an analogous green scheme, mostly because two of &lt;a href=&quot;http://ewrbikes.com/owb29er_specs&quot;&gt;my&lt;/a&gt; &lt;a href=&quot;http://surlybikes.com/frames/cross_check_frame/&quot;&gt;bicycles&lt;/a&gt; are shades of green.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/images/colorscheme.png&quot; alt=&quot;k20e's color scheme palette&quot; title=&quot;Color Scheme&quot;&gt;&lt;/p&gt;&lt;p&gt;Colors picked out, I was ready to launch Inkscape and iterate on some ideas.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/images/logoscratch.png&quot; alt=&quot;Logo scratch ideas&quot; title=&quot;Logo Scratch&quot;&gt;My first concept centered around explaining my site name explicitly.  I liked the concept, but its realization was not something that I was happy with.  Certainly a design that was so much more wide than tall wouldn't work well in many situations.  Thinking of &lt;a href=&quot;http://developer.apple.com/safari/library/documentation/internetweb/conceptual/iPhoneWebAppHIG/MetricsLayout/MetricsLayout.html&quot;&gt;iPhone app icons&lt;/a&gt;, favicons, and other little badges that now litter the web from &lt;a href=&quot;http://about.digg.com/badges&quot;&gt;Digg&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/goodies/widgets&quot;&gt;Twitter&lt;/a&gt;, etc., I set off in pursuit of a more square layout.&lt;/p&gt;&lt;p&gt;The second idea, where I introduced the brackets, was driven by a desire to express the numeronym idea in a more compact manner.  It succeeded in doing so but would not scale down well at all.  Liking this new concept a bit, I decided to produce some more iterations in Inkscape.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;v0&quot;&gt;&lt;/a&gt;&lt;img src=&quot;/images/k20e-v0.png&quot; alt=&quot;Logo Design v0&quot; title=&quot;v0&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;strong&gt;v0&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In &lt;strong&gt;v0&lt;/strong&gt;, I took a very symmetric and mathematical approach and made the &lt;em&gt;K &lt;/em&gt;and the &lt;em&gt;E&lt;/em&gt; exactly the same width.  Visually, that ended up looking a bit strange, so I slowly progressed toward &lt;strong&gt;column 3&lt;/strong&gt; where both characters became more slender, although they were both still the same width, exactly.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Rows b &amp;amp; c&lt;/strong&gt; were never really candidates, in my opinion, but I extrapolated the design in &lt;strong&gt;row a&lt;/strong&gt; just to make sure something cool didn't pop out at me while I was refining that concept.  If I had a larger format, I really liked &lt;strong&gt;row b&lt;/strong&gt;.  But on a web site with smaller, low resolution graphics, it just wasn't promising.&lt;/p&gt;&lt;p&gt;After getting some feedback from folks with real &lt;a href=&quot;http://jacquimolendyke.com/limonata&quot;&gt;design&lt;/a&gt; &lt;a href=&quot;http://mattionicreative.com/portfolio.html&quot;&gt;chops&lt;/a&gt;, I picked &lt;strong&gt;v0a1&lt;/strong&gt; and &lt;strong&gt;v0a2&lt;/strong&gt; to move forward with.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;v1&quot;&gt;&lt;/a&gt;&lt;img src=&quot;/images/k20e-v1.png&quot; alt=&quot;Logo Design v1&quot; title=&quot;v1&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;strong&gt;v1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;v1&lt;/strong&gt; sheet started to look very refined and I was happy with where my earlier direction had taken me.  Using Consolas, a numeronym, and a couple of common programming syntax characters  &lt;code&gt;{} []&lt;/code&gt; led me to &lt;strong&gt;v1b2&lt;/strong&gt;.  I felt like this particular version was visually well-balanced and clean.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a name=&quot;v2&quot;&gt;&lt;/a&gt;&lt;img src=&quot;/images/k20e-v2.png&quot; alt=&quot;Logo design v2&quot; title=&quot;Logo Design v2&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;strong&gt;v2&lt;/strong&gt; - final&lt;/p&gt;&lt;p&gt;Tweaking the spacing and alignment while working with Inkscape's pen tool at a very high zoom level produced &lt;strong&gt;v2&lt;/strong&gt;, in which I also played around with some simple color options.  Once I was happy with the balance of positive and negative space in the black and white version, I decided on &lt;strong&gt;v2a1&lt;/strong&gt; as my final revision.&lt;/p&gt;&lt;p&gt;The end result is that I now have a distinctive logo that I'm very pleased with.  It expresses my attention to detail and passion for technology in a stylishly cryptic manner.  With any luck, it is also the result of my pursuit of good design.&lt;/p&gt;
</content>
  </entry>
  
</feed>

