<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

 <title>Lee Jarvis</title>
 
 <link href="http://lee.jarvis.co/" />
 <updated>2011-11-07T18:19:21-08:00</updated>
 <id>http://lee.jarvis.co/</id>
 <author>
   <name>Lee Jarvis</name>
   <email>lee@jarvis.co</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/lee-jarvis" /><feedburner:info uri="lee-jarvis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Slop - A Ruby option parser</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/akhISQpcsaw/slop-a-ruby-option-parser" />
   <updated>2011-03-17T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/slop-a-ruby-option-parser</id>
   <content type="html">&lt;h2&gt;Slop &amp;ndash; A Ruby option parser&lt;/h2&gt;

&lt;p&gt;I recently &lt;strong&gt;re-&lt;/strong&gt;released &lt;a href="http://github.com/injekt/slop"&gt;Slop&lt;/a&gt;. I say re-released because the original release of Slop happened more than &lt;a href="https://github.com/injekt/slop/commit/1c9367b2e765bb6e6f215f4bcc9c9b7bf1456166"&gt;3 months ago&lt;/a&gt;. The reason I had originally started to write Slop was to solve some &lt;em&gt;issues&lt;/em&gt; I had come across in some private projects I&amp;rsquo;m involved in contributing to.&lt;/p&gt;

&lt;p&gt;Unfortunately for Slop, half way through development the topic changed and I lacked the motivation to put effort into something I wouldn&amp;rsquo;t be using much. The outcome? Releasing a half baked turd of a library.&lt;/p&gt;

&lt;p&gt;No, seriously.&lt;/p&gt;

&lt;p&gt;After starting another project which involved a command line interface, I thought&amp;hellip; I know, this is a job for &lt;strong&gt;Slop!&lt;/strong&gt; Boy was I wrong. Issue after issue arose, even the most basic logical functionality didn&amp;rsquo;t work. Blocks weren&amp;rsquo;t executed where or when they should be, return data was painfully random, and the help output string building algorithm was over thought and fatiguing. It was a true disaster.&lt;/p&gt;

&lt;p&gt;This library was featured on Rubyflow, Ruby5, and had around 50 followers on GitHub by this point. Nothing major, but enough publicity to start some smalltalk. I even &lt;a href="http://lee.jarvis.co/sloppy-option-parsing"&gt;blogged about it&lt;/a&gt;. Clearly none of these people &lt;strong&gt;actually used it&lt;/strong&gt;. Otherwise someone would have punched me in the face a long time before I had found these issues out myself.&lt;/p&gt;

&lt;p&gt;So I decided I should rewrite it. I mean rewrite &lt;strong&gt;all&lt;/strong&gt; of it. The first major commit was &lt;a href="https://github.com/injekt/slop/commit/4ffcafec73f2c15f47f9d49fe58cfd0cae63c7c9"&gt;this one&lt;/a&gt; which included 259 deletions (one file). Followed by &lt;a href="https://github.com/injekt/slop/commit/9041450ccc6cc64422268ae75ba64ad2996546db"&gt;this one&lt;/a&gt; which started the foundation. Since then 2 days passed and I had a stable release I was actually happy with.&lt;/p&gt;

&lt;p&gt;From this I realized I should be using my own projects more often, writing 100% test coverage and making sure that my tests define a specification, my code must reach the standards of my testing, not the other way around.&lt;/p&gt;

&lt;p&gt;Tell me what you think of Slop.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/slop-a-ruby-option-parser</feedburner:origLink></entry>
 
 <entry>
   <title>Tell me why I suck</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/U3eaidPCuSw/tell-me-why-i-suck" />
   <updated>2011-02-23T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/tell-me-why-i-suck</id>
   <content type="html">&lt;h2&gt;Tell me why I suck&lt;/h2&gt;

&lt;p&gt;Looking for work can be an extremely tedious and tiresome task. Especially in the last couple of years. Depending on the type of work you&amp;rsquo;re looking for, you may have even sent out hundreds of résumés to potential employers, most of which you&amp;rsquo;ve never heard of.&lt;/p&gt;

&lt;p&gt;You know what bugs me most? It&amp;rsquo;s not being turned down. It&amp;rsquo;s not being told &lt;strong&gt;WHY&lt;/strong&gt; I&amp;rsquo;ve been turned down. If you&amp;rsquo;re fortuitous you might receive a reply. You know, the discursive emails telling you why you&amp;rsquo;re not suitable for a position. They usually go something along the lines of &lt;em&gt;&amp;ldquo;Thank you for applying for position x, unfortunately you have not been successful..&amp;rdquo;&lt;/em&gt;. These type of emails have been known to ruin days.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not saying companies should welcome employees because of this reason (You know, not wanting to ruin their day), but I am saying if you plan on rejecting a candidates application, tell them why you&amp;rsquo;ve rejected it. I guarantee 9 out of 10 people will suck up your response and may even be hit with a &lt;em&gt;Gung ho&lt;/em&gt; effect.&lt;/p&gt;

&lt;p&gt;I realize this wouldn&amp;rsquo;t work with everyone. Unfortunately employers can reject candidates for fatuous, unfathomable reasons. Reasons which probably shouldn&amp;rsquo;t be disclosed. I also realize some candidates might be outrageously out of their league. It happens.&lt;/p&gt;

&lt;p&gt;But if I apply to a position I&amp;rsquo;m confident about (which is usually the only case), I&amp;rsquo;d &lt;strong&gt;love&lt;/strong&gt; to know why I didn&amp;rsquo;t get accepted. Was it my lack of SVN knowledge? Was it because I told the interviewer Haskell rocks and giggled a little? Was it because I had food between my teeth? These might be some absurd questions, but without any answers, you&amp;rsquo;re left questioning &lt;strong&gt;everything&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Large companies may be exempt from this rant, because sending feedback to potentially hundreds of candidates is a massively time consuming task. But small companies? C'mon guys, it doesn&amp;rsquo;t take all day to drop by a brief summary of &lt;em&gt;&amp;ldquo;Thank you for your submission, unfortunately you weren&amp;rsquo;t successful. Here&amp;rsquo;s why:&amp;rdquo;&lt;/em&gt;. I mean, surely companies wouldn&amp;rsquo;t be embarrassed by what followed this statement?&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve never come across a company that does this. Am I just being mindless and susceptible?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: There&amp;rsquo;s some great discussion regarding this on &lt;a href="http://news.ycombinator.com/item?id=2253870"&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/tell-me-why-i-suck</feedburner:origLink></entry>
 
 <entry>
   <title>Why I rarely use my Android device</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/a3TBuhtuC_g/why-i-rarely-use-my-android-device" />
   <updated>2010-12-29T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/why-i-rarely-use-my-android-device</id>
   <content type="html">&lt;h2&gt;Why I rarely use my Android device&lt;/h2&gt;

&lt;p&gt;As an owner of both an Android and iPhone handset, I get asked the same question a lot. Why do you &lt;strong&gt;never&lt;/strong&gt; have your Android device with you? I&amp;rsquo;m a huge Android fan, so you&amp;rsquo;d think this question might be send me into a mind numbing state. Well, it&amp;rsquo;s actually a very simple answer&amp;hellip; Because I prefer using my iPhone. It&amp;rsquo;s really THAT simple.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do I think my iPhone has more features than my Android device? No, I don&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Do I think my iPhone is nicer to use on a daily basis? Yes, I do.&lt;/li&gt;
&lt;li&gt;Do I prefer writing iOS applications over Android applications? No, I much prefer the latter.&lt;/li&gt;
&lt;li&gt;Am I an Apple fanboy? No, I&amp;rsquo;m a Linux fanboy and always have been.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;People rarely notice the fact that Android devices have &lt;strong&gt;many&lt;/strong&gt; more features than the more popular iPhone, so why are they so popular? And why am I choosing to use my iPhone over my Android phone?&lt;/p&gt;

&lt;p&gt;Well.. it has nothing to do with features. It has nothing to do with how the device feels in the palm of my metacarpus. It has nothing to do with the camera, and it has nothing to do with applications (though the Apple app store &lt;strong&gt;is&lt;/strong&gt; second to none). I use my iPhone over my Android phone for one reason, it&amp;rsquo;s &lt;strong&gt;fast and responsive&lt;/strong&gt;. Yep, that&amp;rsquo;s it. There really isn&amp;rsquo;t a better reason. I have played with many Android devices and &lt;strong&gt;none&lt;/strong&gt; of them seem anywhere near as responsive as my iPhone.&lt;/p&gt;

&lt;p&gt;Now, I&amp;rsquo;m not attempting to open a booming mooting match about this subject. Android isn&amp;rsquo;t tailored for specific devices, it runs on a grandiose selection of gadgets, where Apples mobile operating system is tailored specifically for it&amp;rsquo;s hardware, much like all Apple software. I get that, and I&amp;rsquo;m a true believer in that being the reason the iPhone, iPad, and iPod devices are so responsive. But until I pick up an Android device and it&amp;rsquo;s as responsive as my iPhone is, I won&amp;rsquo;t &lt;strong&gt;ever&lt;/strong&gt; use one for anything more that development.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m tired of new Android devices being released and followed by articles containing the words &lt;em&gt;&amp;ldquo;It&amp;rsquo;s a close contender to the iPhone&amp;rdquo;&lt;/em&gt; or &lt;em&gt;&amp;ldquo;it&amp;rsquo;s second only to the iPhone&amp;rdquo;&lt;/em&gt;. I mean, really? Maybe I&amp;rsquo;m missing something here, but I truly believe the Android operating system is more &lt;strong&gt;feature packed&lt;/strong&gt; than iOS, so lets build a device good enough to show it off, I know I&amp;rsquo;d make the leap if this were an option.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/why-i-rarely-use-my-android-device</feedburner:origLink></entry>
 
 <entry>
   <title>Chrome Stole my heart</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/YX9IxNL2nYQ/chrome-stole-my-heart" />
   <updated>2010-12-14T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/chrome-stole-my-heart</id>
   <content type="html">&lt;h2&gt;Chrome Stole my heart&lt;/h2&gt;

&lt;p&gt;Today marks a very important day in my internet browsing experience. I have made the push to start using the &lt;a href="http://www.chromium.org/Home"&gt;Chromium&lt;/a&gt; web browser over its &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;Firefox&lt;/a&gt; counterpart. Why? Well, let me explain..&lt;/p&gt;

&lt;p&gt;Firefox hasn&amp;rsquo;t always been my favourite browser. The fact is, I never really &lt;strong&gt;loved&lt;/strong&gt; any of them. There was always something that bothered me about one of them. Of course, being a web designer, I use all of them extremely often, unfortunately. I used &lt;a href="http://opera.com"&gt;Opera&lt;/a&gt; for quite some time (3+ years), before getting fed up with the slow start times (though it did excel in page loading for a long long time).&lt;/p&gt;

&lt;p&gt;I made the push to Chromium about the same time as the &lt;a href="https://chrome.google.com/webstore"&gt;Chrome Web Store&lt;/a&gt; was released. Lots of great applications, extensions, and themes all in one place.&lt;/p&gt;

&lt;p&gt;There was something else that bothered me with Chrome. It was the way &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; styles their &lt;em&gt;code&lt;/em&gt; font. It just looked extremely ugly in Chrome, though fine in Firefox or Opera. Luckily installing the &lt;a href="https://chrome.google.com/webstore/detail/oiaejidbmkiecgbjeifoejpgmdaleoha"&gt;Stylebot&lt;/a&gt; extension meant I could customize any webpage I wished, and stylebot saved my CSS for the next time I visited the page. Neat, right?&lt;/p&gt;

&lt;p&gt;Once I used Stylebot to change the font to
&lt;a href="http://en.wikipedia.org/wiki/Bitstream_Vera"&gt;Bitstream Vera Sans Mono&lt;/a&gt;,
it looked much &lt;strong&gt;much&lt;/strong&gt; nicer. It may be such a subtle difference to many people, but I spend a lot of time reading code on GitHub, and this really really frustrated me. It&amp;rsquo;s nice to see how easy it can be customized.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve taken some time to read over a few of the hot looking applications on the Chrome web store, and I think it&amp;rsquo;s certainly something to keep an eye on in the future.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/chrome-stole-my-heart</feedburner:origLink></entry>
 
 <entry>
   <title>Sloppy option parsing</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/RiD4HpUBNvc/sloppy-option-parsing" />
   <updated>2010-12-01T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/sloppy-option-parsing</id>
   <content type="html">&lt;h2&gt;Sloppy option parsing&lt;/h2&gt;

&lt;p&gt;It&amp;rsquo;s not what you think! I&amp;rsquo;ve built &lt;a href="https://github.com/injekt/slop"&gt;Slop&lt;/a&gt; to make Option parsing and gathering a lot easier. It&amp;rsquo;s an extremely simple API but incredibly handy for gathering a hash of options out of a string or array. Let&amp;rsquo;s see an example..&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;slop&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Slop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# -n or --name with a required argument&lt;/span&gt;
  &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your country of residence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:optional&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# with an optional argument&lt;/span&gt;
  &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# autoawesome casting&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Now we can access the set of options as a Hash (using -n Lee -a 103)&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; &amp;#39;Lee&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 103&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:country&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;You can also omit the &lt;code&gt;o&lt;/code&gt; assignment and use &lt;code&gt;Slop.options&lt;/code&gt; to access the last set of options parsed. &lt;code&gt;Slop.parse()&lt;/code&gt; is just sugar for &lt;code&gt;Slop.new().parse()&lt;/code&gt; so you can predefine your options and rules before you start throwing strings and arrays into &lt;code&gt;parse()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now you&amp;rsquo;re probably thinking &amp;ldquo;&lt;em&gt;What&amp;rsquo;s wrong OptionParser in stdlib??&lt;/em&gt;&amp;rdquo; Well, nothing. I really like OptionParser. I just find myself writing code like this a lot:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;optparse&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OptionParser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--name NAME&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--age AGE&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:age&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--country [COUNTRY]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Your country of residence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:country&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Which is fine, but it seems like a lot when the above code in Slop is essentially doing exactly the same thing, without all of the blocks.&lt;/p&gt;

&lt;p&gt;Slop is still extremely pre production, hence the &lt;code&gt;v0.1.4&lt;/code&gt; tag. But it&amp;rsquo;s waiting for issues and feedback! Be sure to check out the &lt;a href="https://github.com/injekt/slop#readme"&gt;README&lt;/a&gt; for more information.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/sloppy-option-parsing</feedburner:origLink></entry>
 
 <entry>
   <title>Colourful codez</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/6L3abPuAkVw/colourful-codez" />
   <updated>2010-12-01T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/colourful-codez</id>
   <content type="html">&lt;h2&gt;Colourful codez&lt;/h2&gt;

&lt;p&gt;For those of you who pay any attention to the absurd applesauce I spend countless hours typing into this blog, you may have noticed the design changing yet &lt;strong&gt;again&lt;/strong&gt;. Yep the grey annoyed me. I&amp;rsquo;ve also started using &lt;a href="https://github.com/injekt/albeano"&gt;Albeano&lt;/a&gt; for highlighting code snippets inside of my posts. It&amp;rsquo;s a simple library consisting of a couple of methods but it&amp;rsquo;s an incredibly handy wrapper around &lt;a href="http://github.com/github/albino"&gt;Albino&lt;/a&gt; which is in turn a wrapper around &lt;a href="http://pygments.org"&gt;Pygments&lt;/a&gt;. Pygments is probably one of (if not) the best syntax highlighting libraries around.&lt;/p&gt;

&lt;p&gt;Here, it&amp;rsquo;s easy..&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;gem install albeano
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Albeano&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Yep, it&amp;rsquo;s that simple. You can even return markdown (that&amp;rsquo;s what I&amp;rsquo;m doing!)&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="no"&gt;Albeano&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_markdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Which requires the &lt;a href="https://github.com/rtomayko/rdiscount"&gt;RDiscount&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the CSS I&amp;rsquo;m using to highlight the code:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;border-top&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="k"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;border-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="k"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.c&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#998&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.err&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#a61717&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#e3d2d2&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.k&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.o&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.cm&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#998&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.cp&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.c1&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#998&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.cs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gd&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#fdd&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gd&lt;/span&gt; &lt;span class="nc"&gt;.x&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#faa&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.ge&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gr&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#a00&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gh&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gi&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#dfd&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gi&lt;/span&gt; &lt;span class="nc"&gt;.x&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#afa&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.go&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#888&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gp&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#555&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gu&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#800080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.gt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#a00&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.kc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.kd&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.kp&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.kr&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.kt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#458&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.m&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.s&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.na&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#0086B3&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#458&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.no&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.ni&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#800080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.ne&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#900&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nf&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#900&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nn&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#555&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#000080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.nv&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.ow&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.w&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#bbb&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.mf&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.mh&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.mi&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.mo&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sd&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.s2&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.se&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sh&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.si&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sx&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.sr&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#009926&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.s1&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#d14&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.ss&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#990073&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.bp&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.vc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.vg&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.vi&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#008080&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.highlight&lt;/span&gt; &lt;span class="nc"&gt;.il&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;#099&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;A lot of the span styles are copied from GitHubs &lt;a href="http://gist.github.com"&gt;Gist&lt;/a&gt; tool, because I really like them, so all credit to those guys.&lt;/p&gt;

&lt;p&gt;In other news, there&amp;rsquo;s been a few discussions regarding Refinements in Ruby 2.0. I recommending reading both &lt;a href="http://timeless.judofyr.net/refinements-in-ruby"&gt;this blog post&lt;/a&gt; by Magnus Holm and &lt;a href="http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/"&gt;this one&lt;/a&gt; from Yehuda Katz. Interesting stuff!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/colourful-codez</feedburner:origLink></entry>
 
 <entry>
   <title>Soapy and sterilized</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/94g-jkeEq0s/soapy-and-sterilized" />
   <updated>2010-11-16T00:00:00-08:00</updated>
   <id>http://lee.jarvis.co/soapy-and-sterilized</id>
   <content type="html">&lt;h2&gt;Soapy and sterilized&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve decided to hit &lt;a href="http://injekt.net"&gt;injekt.net&lt;/a&gt; with a fresh design and a complete new backend. This was something I could work on whilst I was migrating my &lt;a href="http://www.linode.com/?r=503054a6eaf39a4dbe1bdec90eba2f3c1cf2bb21"&gt;Linode&lt;/a&gt; VPS. Now I have reinstalled &lt;a href="http://gentoo.org"&gt;Gentoo&lt;/a&gt; everything is running pretty darn smooth, for now at least.&lt;/p&gt;

&lt;p&gt;I have also opted to remove the comment threads. Mainly as they weren&amp;rsquo;t being used but also because I&amp;rsquo;d like anyone who may have a comment or any feedback to send it to me personally whether it&amp;rsquo;s via email or Twitter. This method seems to work well for others, and saves me maintaining a comment thread (albeit an empty one) and any public shenanigans which may occur.&lt;/p&gt;

&lt;p&gt;The new blogging interface is designed for simplicity and is aimed to be more of a miniblog than a journal. I realize I&amp;rsquo;m not one of these people who can maintain a weekly blog, so I&amp;rsquo;ll spend time creating short, simple, concise posts when and as I please. So no pressure!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/soapy-and-sterilized</feedburner:origLink></entry>
 
 <entry>
   <title>Playing with JRuby</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/6nKk3afXejk/playing-with-jruby" />
   <updated>2010-10-05T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/playing-with-jruby</id>
   <content type="html">&lt;h2&gt;Playing with JRuby&lt;/h2&gt;

&lt;p&gt;Over the last couple of days, many Ruby-ist Twitter followers will have noticed the flourishing overgrowth of tweets directed at and around the &lt;a href="http://jrubyconf.com/"&gt;JRubyConf&lt;/a&gt;. Being a huge fan of both Java and Ruby, I was watching with boundless engrossment. Unfortunately I haven&amp;rsquo;t yet seen any of the slides/videos from the speakers but I&amp;rsquo;m hoping some come along soon.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve taken this time to dive into &lt;a href="http://jruby.org/"&gt;JRuby&lt;/a&gt; a little more. And what&amp;rsquo;s the outcome? mind == blown. Whilst I never really take the time out to truly indulge myself in a language enough to build extensions or read through the generally boggling platform source code, I took a shine to JRuby. I&amp;rsquo;ve been shunned back into some Java code this week (Don&amp;rsquo;t worry, that&amp;rsquo;s a good thing) and I&amp;rsquo;ve enjoyed it (no, &lt;strong&gt;seriously&lt;/strong&gt;). JRuby is the tip of the iceberg.&lt;/p&gt;

&lt;p&gt;Here, let&amp;rsquo;s see a quick example of using the &lt;a href="http://www.eclipse.org/swt/"&gt;Standard Widget Toolkit&lt;/a&gt; to extend a JRuby script and implement a simple GUI example.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;java&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;~/downloads/swt/swt&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;SWT&lt;/span&gt;
  &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eclipse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;swt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;widgets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Display&lt;/span&gt;
  &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eclipse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;swt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;widgets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shell&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GUI&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;SWT&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
    &lt;span class="vi"&gt;@shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@display&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run!&lt;/span&gt;
    &lt;span class="vi"&gt;@shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="vi"&gt;@shell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_disposed&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="vi"&gt;@display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_and_dispatch&lt;/span&gt;
        &lt;span class="vi"&gt;@display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;GUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Howdy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The second line is fetching the &lt;code&gt;swt.jar&lt;/code&gt; file from the downloads directory and with JRubys magical &lt;code&gt;java&lt;/code&gt; include, we have our hands on the &lt;code&gt;import&lt;/code&gt; method, which is grabbing the Java classes and throwing them into a Ruby module. Right about now your brain is probably exploding, but it&amp;rsquo;s ok, you&amp;rsquo;ll get used to it.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby"&gt;calling Java from Ruby&lt;/a&gt; wiki article for some more awesome extras that will no doubt entertain you. I&amp;rsquo;m off to play with SWT and JRuby a little more! I&amp;rsquo;ll try and post something later this week with more information.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/playing-with-jruby</feedburner:origLink></entry>
 
 <entry>
   <title>Totally MIA</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/BnLmnveMXuM/totally-mia" />
   <updated>2010-09-28T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/totally-mia</id>
   <content type="html">&lt;h2&gt;Totally MIA&lt;/h2&gt;

&lt;p&gt;I know I know, it&amp;rsquo;s been far too long since I last posted. This blog has come so close to joining the die hard has-beens in the heavily abundant grave yard I have unwillingly created and buried my existing attempts at blogging. So what have I been doing? Well..&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.bungie.net/projects/reach/default.aspx"&gt;Halo: Reach&lt;/a&gt; came out. So my time has been occupied taking down the covenant (getting my ass whoop&amp;rsquo;d) and building an awesome armory (slowly).&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve been messing around with the &lt;a href="http://redcareditor.com/"&gt;Redcar Editor&lt;/a&gt;, it&amp;rsquo;s a very very awesome TextMate like programmers editor based on plug-ins. It&amp;rsquo;s built entirely on jRuby meaning you can easily extend its plugin base with your own Ruby-esque additions. Some may even say it&amp;rsquo;s the free multi platform equivalent of TextMate.&lt;/li&gt;
&lt;li&gt;Being broke. That&amp;rsquo;s right, penny-less! Work &lt;strong&gt;should&lt;/strong&gt; be kicking up a little more this month, though. I&amp;rsquo;ve got some new material to sink my teeth into and I&amp;rsquo;m excited at the prospects.&lt;/li&gt;
&lt;li&gt;Doing &lt;strong&gt;more&lt;/strong&gt; Rails 3 stuff. Yes I am indeed starting to like it, even if pre 3 sucked balls.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I do intend to continue blogging at an increased rate (a post per week, at the very least) so anyone who&amp;rsquo;s actually interested in reading any of the absolute twaddle I write about, feel free to give me a sweet kick up the ass from time to time. I know I need it.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/totally-mia</feedburner:origLink></entry>
 
 <entry>
   <title>Aviating porkers</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/JqczlY1U5-Y/aviating-porkers" />
   <updated>2010-09-04T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/aviating-porkers</id>
   <content type="html">&lt;h2&gt;Aviating porkers&lt;/h2&gt;

&lt;p&gt;Those of you who remember the absolutely awesome days of playing &lt;a href="http://en.wikipedia.org/wiki/Duke_Nukem_3D"&gt;Duke Nukem 3D&lt;/a&gt; and co on old ass Windows machines will know that two days ago, pigs flew.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s right, the &lt;a href="http://en.wikipedia.org/wiki/3D_Realms"&gt;3D Realms&lt;/a&gt;  president George Broussard joked that the cigar smoking, babe hunting, beer drinking hit man would be back when pigs flew. Well, take a look at his &lt;a href="http://twitter.com/georgeb3dr/status/22750844938"&gt;Twitter status&lt;/a&gt; from a couple of days ago.&lt;/p&gt;

&lt;p&gt;Indeed, Duke is coming back to the arena. Back home to shrink and step on more aliens than ever before. &lt;a href="http://www.gearboxsoftware.com/"&gt;Gearbox&lt;/a&gt; have taken on the ghastly high profile task of bring back this awesome FPS. Can they do it? We&amp;rsquo;ll find out in 2011. It&amp;rsquo;s going to be a massive project for them, and I&amp;rsquo;m really really hoping they pull it off. I&amp;rsquo;ll certainly be waiting for my copy on the Xbox 360.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/aviating-porkers</feedburner:origLink></entry>
 
 <entry>
   <title>Gradual expiration</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/OZzKKsZzXng/gradual-expiration" />
   <updated>2010-08-31T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/gradual-expiration</id>
   <content type="html">&lt;h2&gt;Gradual expiration&lt;/h2&gt;

&lt;p&gt;So this past week has been more than tough. I&amp;rsquo;ve lost internet, I&amp;rsquo;ve lost some living arrangements, and I&amp;rsquo;ve lost a little bit of my mind. Although the latter is a naturally re-occurring event. Thanks to lianj the server is still alive, without his donation this week I&amp;rsquo;m not sure it would have been around much longer, every little helps a lot! Also, a massive thanks to Kyle who&amp;rsquo;s helping me with some ISP bills. You tha bomb!&lt;/p&gt;

&lt;p&gt;So apart from my enthralling decline this week, what else have I been up to? Well, as we all know, &lt;a href="http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done"&gt;Rails 3 was released&lt;/a&gt;. Which I hate to say, but&amp;hellip; it fixes at least 60% of what I hated about Rails. Which is a pretty damn large percentage. I&amp;rsquo;m even thinking about throwing up some apps for a couple of clients of mine, &lt;strong&gt;shock&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s one thing bugging me though, &lt;a href="http://gembundler.com/"&gt;Bundler&lt;/a&gt;. I just.. don&amp;rsquo;t get it. What&amp;rsquo;s the raving all about? I don&amp;rsquo;t see why it&amp;rsquo;s such a great tool. I&amp;rsquo;m not saying it&amp;rsquo;s bad, but any clarification or examples might help me figure this one out.&lt;/p&gt;

&lt;p&gt;Some cool things to note this week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://github.com/jeremyevans/home_run"&gt;home_run&lt;/a&gt; &amp;ndash; Super fast DateTime classes for Ruby. An awesome library from Jeremy Evans, the author of the second to none ORM &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://github.com/blog/712-pull-requests-2-0"&gt;GitHub Pull Requests 2.0&lt;/a&gt; &amp;ndash; GitHub has added extra pull request functionality. I gotta say, this is awesome. The interface is really really nice, too. Just go read the post.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://css3.mikeplate.com/"&gt;CSS3 Playground&lt;/a&gt; &amp;ndash; A pretty damn epic CSS3 toolbox, test CSS3 code directly in your browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.ruby-lang.org/en/news/2010/08/18/ruby-1-9-2-is-released/"&gt;Ruby 1.9.2&lt;/a&gt; &amp;ndash; That&amp;rsquo;s right, 1.9.2 has been released. I&amp;rsquo;m using it now and although there aren&amp;rsquo;t any major changes other than the current working directory &lt;code&gt;.&lt;/code&gt; being removed from the &lt;code&gt;$LOAD_PATH&lt;/code&gt; it&amp;rsquo;s still pretty neat. If you&amp;rsquo;re using RVM it&amp;rsquo;s as simple as &lt;code&gt;rvm update --head &amp;amp;&amp;amp; rvm install 1.9.2 &amp;amp;&amp;amp; rvm reload&lt;/code&gt;. Simple.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://rubydoc.info/"&gt;Rubydoc&lt;/a&gt; &amp;ndash; Just look. Seriously.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Unfortunately due to the lack of internet and lack of life the last week, I haven&amp;rsquo;t been able to fix some issues with Cinch, namely the lack of specifications. I know I know, I suck. It&amp;rsquo;s on the TODO list though. Dominik has been ploughing away at issues and Cinch is started to get more and more interest both on the IRC channel and the GitHub watch list. Keep &amp;lsquo;em coming!&lt;/p&gt;

&lt;p&gt;After looking at some of the analytics of this blog, I&amp;rsquo;m extremely surprised how popular it seems to be, what with my dysfunctional writing style and abrasive lack of creativeness. I honestly do plan on writing something worth reading at some point, so don&amp;rsquo;t lose hope on me too quickly!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/gradual-expiration</feedburner:origLink></entry>
 
 <entry>
   <title>Database this, Database that</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/GNxynW3repk/database-this-database-that" />
   <updated>2010-08-26T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/database-this-database-that</id>
   <content type="html">&lt;h2&gt;Database this, Database that&lt;/h2&gt;

&lt;p&gt;After taking the time to configure and in-sculpt my new Gentoo installation, I thought I&amp;rsquo;d have a little play with MySQL and PostgreSQL. I&amp;rsquo;ve had a self confined debate about which database engine I should use. I use MySQL a lot for client work, and it&amp;rsquo;s quite a standard amongst mainstream PHP development, a sector I unfortunately inhabit.&lt;/p&gt;

&lt;p&gt;So why am I even thinking of using PostgreSQL? Why don&amp;rsquo;t I just shut up and stick with MySQL? Well..&lt;/p&gt;

&lt;p&gt;Back in the old days (ie a few years ago, for me). There wasn&amp;rsquo;t a choice. At least not in the environment I was working in. MySQL was etched into the walls of the bathroom, it had left burn marks on the hands of the debilitated developers. The inadequate, harrowing error messages became a poetic nuisance easily dealt with and sometimes even foreseen.&lt;/p&gt;

&lt;p&gt;Isn&amp;rsquo;t that terrible? It sure is. Then again so is getting up at 5am, but you just get used to it once you&amp;rsquo;ve done it for a while.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not one of these programmers who bitches about writing raw SQL statements. I&amp;rsquo;ve read many quotes which publicly refute any charm this language contains. Personally for me, writing raw SQL is secluded bliss. I won&amp;rsquo;t lie I do like my ORMs when I&amp;rsquo;m using Ruby, namely &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;, but I don&amp;rsquo;t use the likes of phpMyAdmin and similar tools. Writing SQL is natural if not a little mundane at times. It&amp;rsquo;s something I believe every developer should encounter and it&amp;rsquo;s worth time learning.&lt;/p&gt;

&lt;p&gt;OK so now you&amp;rsquo;re wondering where I&amp;rsquo;m going with this, you&amp;rsquo;re all &amp;ldquo;Look, bro.. you started talking about MySQL and PostgreSQL and haven&amp;rsquo;t mentioned why you&amp;rsquo;d use the latter over the former. Stop drivelling on without a point&amp;rdquo;. OK OK. Let me give you an example of why I made the switch (Note that this is one of many reasons), Here&amp;rsquo;s the first in MySQL:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="sql"&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt; &lt;span class="n"&gt;affected&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt; &lt;span class="mi"&gt;1396&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HY000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;Operation&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Hmm OK, ERROR 1396.. That sounds precarious. Of course these operations only really make sense when they&amp;rsquo;re not executed one after another. Now this may be clear to you.. but c'mon, that&amp;rsquo;s a shit error message, lets be honest. Let&amp;rsquo;s look at the same code in PostgreSQL:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="sql"&gt;&lt;span class="n"&gt;injekt&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt;

&lt;span class="n"&gt;injekt&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;role&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="k"&gt;exists&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Ah yes! The role &amp;ldquo;foo&amp;rdquo; already exists, so it&amp;rsquo;s failed. Awesome! Now I don&amp;rsquo;t have to Google the error or think about remembering a bunch of predefined error codes. That&amp;rsquo;s productive! Moving on..&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="sql"&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;tinyint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt; &lt;span class="n"&gt;affected&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt; &lt;span class="n"&gt;affected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Ok wait.. that worked fine, it shouldn&amp;rsquo;t have worked fine.. but it did. Oh look, 1 warning.. That&amp;rsquo;s useful, so my program runs without errors, and now I have to search around for &amp;lsquo;warnings&amp;rsquo;. Thanks, MySQL!&lt;/p&gt;

&lt;p&gt;I could possibly do this all day, so if you want more examples, perhaps take a look at &lt;a href="http://www.joinfu.com/2010/03/a-follow-up-on-the-sql-puzzle/"&gt;A Follow Up on the SQL puzzle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another bugbear I have is something developers have become akin to, tab completion! I mean c'mon, it&amp;rsquo;s everywhere. Bash (with extensions), Zsh, even Irssi. Oh &lt;strong&gt;AND&lt;/strong&gt; PostgreSQL. So why does the MySQL clients tab completion, or lack of, suck so bad?&lt;/p&gt;

&lt;p&gt;If anyone has any insightful information, perhaps some examples which directly contradict my findings, or better yet examples which prove my point more so, please share. I&amp;rsquo;d love to see many more examples or generally hear peoples thoughts on this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: If you&amp;rsquo;ve just written half a blog post and accidentally close the tab in Firefox, rather than raging for about 10 minutes and wanting to hurt something cute and fluffy. Just hit Control+Shift+T and your tab will magically appear from the depths of the underworld. Thank god.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/database-this-database-that</feedburner:origLink></entry>
 
 <entry>
   <title>Rekindled Love</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/DRyzx-rloMM/rekindled-love" />
   <updated>2010-08-25T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/rekindled-love</id>
   <content type="html">&lt;h2&gt;Rekindled Love&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve spent the last couple of days rekindling my love for Gentoo, by giving my laptop a fresh start and swanky new installation. This process took about 12 hours in total. That includes configuring X and &lt;a href="http://openbox.org/"&gt;Openbox&lt;/a&gt; to a respectable standard, although as it goes with my VM habits I&amp;rsquo;m sure I&amp;rsquo;ll be making modifications, justifications, and perhaps some stupidfications.&lt;/p&gt;

&lt;p&gt;You know, though.. People say modifying and building your Kernel is one of the hardest or at least most laborious tasks involved when configuring a new Linux installation. I disagree. The first time may seem a little daunting, but it&amp;rsquo;s pretty easy to grasp and after a couple of times it&amp;rsquo;s just second nature. One thing which IS a huge annoyance is configuring X. It literally made me burst into a sweat. The thing with X is, even if you know exactly what you&amp;rsquo;re doing, and you&amp;rsquo;ve done it 100 times before. This time always seems to be unique.&lt;/p&gt;

&lt;p&gt;Luckily I managed to get a tight grip on X, spent a little time configuring my Synaptics touchpad because the default policy frankly sucks, and there I was. Staring at a beautiful new Openbox WM (Honestly, I can&amp;rsquo;t find one I like better, or at least one which is so bloat free and easy to extend and configure, even if it is XML). I&amp;rsquo;ll post a few screenshots of it some time later this week (when I rebuild with a png/jpeg USE flag enabled, whoops).&lt;/p&gt;

&lt;p&gt;Then on to setting up my portage overlay! What&amp;rsquo;s this, you non Gentoo users ask? It&amp;rsquo;s &lt;a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=3&amp;amp;chap=5"&gt;this&lt;/a&gt;. Gentoo has a great user guide for Overlays &lt;a href="http://www.gentoo.org/proj/en/overlays/userguide.xml"&gt;here&lt;/a&gt;. In a nutshell, setting up a portage overlay allows you to inform portage of &lt;a href="http://en.wikipedia.org/wiki/Ebuild"&gt;ebuilds&lt;/a&gt; which may not be available in the official portage tree. A great example of this is the &lt;a href="http://rvm.beginrescueend.com/"&gt;RVM&lt;/a&gt; ebuild maintained by &lt;a href="http://purepistos.net/"&gt;Pistos&lt;/a&gt; and the RVM team. Those ebuilds are available to check out &lt;a href="http://github.com/wayneeseguin/rvm/tree/master/pkg/gentoo"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The actual process of compiling didn&amp;rsquo;t take as long as I originally expected, and the Gentoo configuration was as easy and straight forward as I remember the last time I did it. Luckily the famous &lt;a href="http://www.gentoo.org/doc/en/handbook/"&gt;Gentoo Handbook&lt;/a&gt; is there to help people every step of the way, if need be. Once I had finished compiling and configuring &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;apache2&lt;/code&gt;, &lt;code&gt;php&lt;/code&gt;, &lt;code&gt;perl&lt;/code&gt;, &lt;code&gt;ruby&lt;/code&gt;, &lt;code&gt;postgresql&lt;/code&gt;, and &lt;code&gt;mysql&lt;/code&gt;, amongst a few other packages and a ton of Ruby gems. I was back in the game and ready for development. Not losing as much time as I had originally planned. I even managed to sneak in a few games of &lt;a href="http://www.bungie.net/Stats/Halo3/Default.aspx?player=fyres7orm&amp;amp;sg=0"&gt;Halo&lt;/a&gt;. Huzzah!&lt;/p&gt;

&lt;p&gt;Oh and if anyone has any ideas for conquering insomnia, please let me know. I haven&amp;rsquo;t managed to sleep much at all over the past two weeks, any hints or remedies are much appreciated. I&amp;rsquo;m pretty much at the stage of trying anything, no matter how absurd.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/rekindled-love</feedburner:origLink></entry>
 
 <entry>
   <title>Colossal Simplicity</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/PJodwwqQS2c/colossal-simplicity" />
   <updated>2010-08-20T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/colossal-simplicity</id>
   <content type="html">&lt;h2&gt;Colossal Simplicity&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve just managed to get around to merging the &lt;code&gt;ramaze&lt;/code&gt; branch of this &lt;a href="http://github.com/injekt/blog"&gt;blog&lt;/a&gt; here which has added some aesthetic-al changes. Namely the red button style links at the bottom of the page, and the implementation of post tags. I figured I was actually doing fairly well with building up posts, so why not add a little simplicity in the form of tags. Now each post will contain a set of blue like tag buttons. Yay and such!&lt;/p&gt;

&lt;p&gt;The administration area also has a re-vamp, which of course you can&amp;rsquo;t enjoy, but I can! This does mean I have to wave goodbye to &lt;a href="http://sinatrarb.com/"&gt;Sinatra&lt;/a&gt;, which is a shame because it&amp;rsquo;s a great little framework. I did however want something a little larger as I started adding more functionality. Ramaze fits the mould pretty damn well as it usually does for me.&lt;/p&gt;

&lt;p&gt;If anyone has any cross browser style issues or thinks I should add/remove something, please let me know. Any feedback is much appreciated. I&amp;rsquo;m now going to attempt to get some sleep, as I haven&amp;rsquo;t done so in so many days. I&amp;rsquo;m starting to think I have insomnia, which unfortunately runs in my family. Dammit!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/colossal-simplicity</feedburner:origLink></entry>
 
 <entry>
   <title>Cinch hits version 1.0</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/MG4tLsw7Ixk/cinch-hits-version-10" />
   <updated>2010-08-19T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/cinch-hits-version-10</id>
   <content type="html">&lt;h2&gt;Cinch hits version 1.0&lt;/h2&gt;

&lt;p&gt;That&amp;rsquo;s right, folks. The merge is complete! We (Dominik, more than I) have been hard at work pushing for the 1.0 release. The &lt;a href="http://doc.injekt.net/cinch"&gt;Cinch IRC Bot Building Framework&lt;/a&gt; has officially hit version 1.0. Check out the documentation here for more information or view the changes we&amp;rsquo;ve made &lt;a href="http://github.com/injekt/cinch/commits/master"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This version boasts support for threading and plugins, and we&amp;rsquo;ve packed a bunch of examples to get you going! Check out the examples &lt;a href="http://github.com/injekt/cinch/tree/master/examples/"&gt;here&lt;/a&gt;. Don&amp;rsquo;t forget though guys if you&amp;rsquo;re updating from an existing version of Cinch then you are without doubt going to encounter some backwards incompatible changes. I promise you though that these changes are more than worth your time. You can now convert your block-syntax rules into fully fledged self-contained plugins. How cool is that!&lt;/p&gt;

&lt;p&gt;Over the next few days I&amp;rsquo;ll be creating some documentation to help support you guys on making the transition from existing versions of Cinch. Though this should be a trivial task. Just for good measure, let me give you an example of Cinch&amp;rsquo;s Google plugin.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cinch&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;open-uri&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nokogiri&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cgi&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Google&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Cinch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Plugin&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="sr"&gt; /google (.+)/&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://www.google.com/search?q=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;CGI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Nokogiri&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;h3.r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:href&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./following::div&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
  &lt;span class="k"&gt;rescue&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;No results found&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="no"&gt;CGI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unescape_html&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Cinch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Bot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;irc.freenode.net&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nick&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;MrCinch&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#cinch-bots&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Google&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Run the code and be prepared for awesome-ness! We&amp;rsquo;ll be making improvements to Cinch throughout, so let us know if you have any features or you find any bugs and report them &lt;a href="http://github.com/injekt/cinch/issues"&gt;here&lt;/a&gt;. Have fun with the new Cinch!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/cinch-hits-version-10</feedburner:origLink></entry>
 
 <entry>
   <title>A mad hatter</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/qAqyYrlAO9I/a-mad-hatter" />
   <updated>2010-08-15T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/a-mad-hatter</id>
   <content type="html">&lt;h2&gt;A mad hatter&lt;/h2&gt;

&lt;p&gt;Damn it&amp;rsquo;s been over a week since I last posted, I totally suck at this blogging thing. I hope you all (like, the 3 people who read this blog) forgive me, and accept my dearest apologies and many internet cookies (no pun intended).&lt;/p&gt;

&lt;p&gt;So, remember the triangular present which totally couldn&amp;rsquo;t be a guitar? Well, IT WAS A GUITAR! Woo etc. I&amp;rsquo;ve been hinting about starting to play again for quite some months. I guess my ongoing twaddling doesn&amp;rsquo;t go totally unnoticed. I&amp;rsquo;ll post some pictures some time later this week, it&amp;rsquo;s really pretty looking!&lt;/p&gt;

&lt;p&gt;On another note, Cinch is about to be released as version 1.0.0! Time is almost there, and it&amp;rsquo;s pretty exciting. Once I have gotten around to writing up the specifications a release is on the cards. Although I&amp;rsquo;m thinking that may take some time, so it could be before I finish them (ssh, don&amp;rsquo;t tell anyone). Dominik has done a great job on the examples and twiddling the odds bits of Cinch, it&amp;rsquo;s looking really great.&lt;/p&gt;

&lt;p&gt;So I told you guys I&amp;rsquo;ve started using &lt;a href="http://www.zsh.org/"&gt;zsh&lt;/a&gt;. Yep, that&amp;rsquo;s right! It&amp;rsquo;s super duper delicious-ness makes me all warm inside.  I&amp;rsquo;ve now managed to remove over 300 lines of bash code, and 3 bash completion files! Zsh makes completion it&amp;rsquo;s bitch, it&amp;rsquo;s pretty wonderful. Here&amp;rsquo;s my sparkly new .zshrc:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="c"&gt;#!/bin/zsh&lt;/span&gt;

&lt;span class="c"&gt;# Skip all this for non-interactive shells&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;quot;$PS1&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

&lt;span class="c"&gt;# completion&lt;/span&gt;
autoload -U compinit
compinit

&lt;span class="c"&gt;# ./ssh/config hostname completion&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -s &lt;span class="s2"&gt;&amp;quot;$HOME/.ssh/config&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;hosts&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;hostname&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;grep &lt;span class="s2"&gt;&amp;quot;Host &amp;quot;&lt;/span&gt; ~/.ssh/config | cut -d &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; -f2&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  zstyle &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt; hosts &lt;span class="nv"&gt;$hosts&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# history&lt;/span&gt;
&lt;span class="nv"&gt;HISTSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2000
&lt;span class="nv"&gt;HISTFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$HOME/.histfile&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;SAVEHIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HISTSIZE&lt;/span&gt;

setopt hist_ignore_all_dups &lt;span class="c"&gt;# ignore history duplicates&lt;/span&gt;
setopt autocd &lt;span class="c"&gt;# cd is just 2 many characters, har&lt;/span&gt;
setopt extendedglob &lt;span class="c"&gt;# sex&lt;/span&gt;

&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls --color&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;grep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grep --color&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mkdir -p&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;gt;/dev/null gvim --servername vroom --remote-tab&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;# Set PS1 with colour dependant on hostname&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;red&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%{&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;$&amp;#39;[1;31m&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%}&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;green&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%{&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;$&amp;#39;[1;32m&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%}&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;yellow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%{&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;$&amp;#39;[1;33m&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%}&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;none&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%{&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;$&amp;#39;[0m&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%}&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;colour
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;hostname&lt;span class="sb"&gt;`&lt;/span&gt; in
  &lt;span class="s2"&gt;&amp;quot;bebop&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$yellow&lt;/span&gt; ;;
&lt;span class="s2"&gt;&amp;quot;bernard&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$green&lt;/span&gt; ;;
        *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;colour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$red&lt;/span&gt; ;;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;[${colour}%~${none}] %% &amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;# Add our ~/bin directory to the PATH&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; -d &lt;span class="s2"&gt;&amp;quot;$HOME/bin&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$HOME/bin:$PATH&amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;# rvm baybee&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; -s &lt;span class="s2"&gt;&amp;quot;/usr/local/rvm/scripts/rvm&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/rvm/scripts/rvm&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; -s &lt;span class="s2"&gt;&amp;quot;$HOME/.rvm/scripts/rvm&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$HOME/.rvm/scripts/rvm&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;If anyone has any neat tips/tricks they know of, please let me know. I&amp;rsquo;m still pretty new to it. I&amp;rsquo;ve also revised my &lt;code&gt;.vimrc&lt;/code&gt; too! It looks a little like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="s2"&gt;&amp;quot; bad vi!&lt;/span&gt;
&lt;span class="s2"&gt;set nocompatible&lt;/span&gt;

&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; continuous indentation
&lt;span class="nb"&gt;set &lt;/span&gt;autoindent
&lt;span class="nb"&gt;set &lt;/span&gt;smartindent

&lt;span class="s2"&gt;&amp;quot; match corresponding brace/parenthesis&lt;/span&gt;
&lt;span class="s2"&gt;set showmatch&lt;/span&gt;

&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; allow backspacing over everything in insert mode
&lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;backspace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;indent,eol,start

&lt;span class="nb"&gt;set &lt;/span&gt;nobackup            &lt;span class="s2"&gt;&amp;quot; dont keep backup files&lt;/span&gt;
&lt;span class="s2"&gt;set noswapfile          &amp;quot;&lt;/span&gt; ugh
&lt;span class="nb"&gt;set history&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;300         &lt;span class="s2"&gt;&amp;quot; history buffer&lt;/span&gt;
&lt;span class="s2"&gt;set ruler       &amp;quot;&lt;/span&gt; show the cursor position all the &lt;span class="nb"&gt;time&lt;/span&gt;
&lt;span class="nb"&gt;set &lt;/span&gt;showcmd     &lt;span class="s2"&gt;&amp;quot; display incomplete commands&lt;/span&gt;
&lt;span class="s2"&gt;set incsearch       &amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;incremental searching
&lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;shiftwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2        &lt;span class="s2"&gt;&amp;quot; 2 is enough&lt;/span&gt;
&lt;span class="s2"&gt;set tabstop=2&lt;/span&gt;
&lt;span class="s2"&gt;set smarttab            &amp;quot;&lt;/span&gt; &amp;lt;3 smart tabbing
&lt;span class="nb"&gt;set &lt;/span&gt;expandtab           &lt;span class="s2"&gt;&amp;quot; correct spaces&lt;/span&gt;
&lt;span class="s2"&gt;set autoread            &amp;quot;&lt;/span&gt; auto &lt;span class="nb"&gt;read &lt;/span&gt;file when it&lt;span class="s1"&gt;&amp;#39;s changed/updated&lt;/span&gt;
&lt;span class="s1"&gt;set title               &amp;quot; allow vim to change the title&lt;/span&gt;
&lt;span class="s1"&gt;set number              &amp;quot; we like line numbers&lt;/span&gt;
&lt;span class="s1"&gt;set nohlsearch          &amp;quot; dont hilight search words&lt;/span&gt;
&lt;span class="s1"&gt;set ignorecase          &amp;quot; ignore case when searching&lt;/span&gt;
&lt;span class="s1"&gt;tab all&lt;/span&gt;

&lt;span class="s1"&gt;&amp;quot; Control+W to close a tab&lt;/span&gt;
&lt;span class="s1"&gt;map &amp;lt;C-w&amp;gt; :tabclose&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="s1"&gt;&amp;quot; Control+T to open a new tab&lt;/span&gt;
&lt;span class="s1"&gt;map &amp;lt;C-t&amp;gt; :tabnew&amp;lt;CR&amp;gt;&lt;/span&gt;

&lt;span class="s1"&gt;&amp;quot; Alt + left/right key for switching tabs&lt;/span&gt;
&lt;span class="s1"&gt;map &amp;lt;a-left&amp;gt; :tabp&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="s1"&gt;map &amp;lt;a-right&amp;gt; :tabn&amp;lt;CR&amp;gt;&lt;/span&gt;

&lt;span class="s1"&gt;&amp;quot; if we&amp;#39;&lt;/span&gt;re using gvim
&lt;span class="k"&gt;if &lt;/span&gt;has&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gui_running&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;set &lt;/span&gt;guioptions-&lt;span class="o"&gt;=&lt;/span&gt;T   &lt;span class="s2"&gt;&amp;quot; remove gvim toolbar&lt;/span&gt;
&lt;span class="s2"&gt;  set lines=40&lt;/span&gt;
&lt;span class="s2"&gt;  set columns=100&lt;/span&gt;
&lt;span class="s2"&gt;  winpos 600 30       &amp;quot;&lt;/span&gt; window geometry

  colorscheme desert

  &lt;span class="s2"&gt;&amp;quot; Control + S for saving&lt;/span&gt;
&lt;span class="s2"&gt;  noremap &amp;lt;C-S&amp;gt; :update&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;  vnoremap &amp;lt;C-S&amp;gt; &amp;lt;C-C&amp;gt;:update&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;  inoremap &amp;lt;C-S&amp;gt; &amp;lt;C-O&amp;gt;:update&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;endif&lt;/span&gt;

&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; In many terminal emulators the mouse works just fine, thus &lt;span class="nb"&gt;enable &lt;/span&gt;it.
&lt;span class="k"&gt;if &lt;/span&gt;has&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mouse&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;mouse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a
endif

&lt;span class="s2"&gt;&amp;quot; make sure we switch syntax highlighting on if&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; we have colours! yadaboi
&lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;t_Co &amp;gt; 2
  syntax on
endif

&lt;span class="s2"&gt;&amp;quot; Only do this part when compiled with support for autocommands.&lt;/span&gt;
&lt;span class="s2"&gt;if has(&amp;quot;&lt;/span&gt;autocmd&lt;span class="s2"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="s2"&gt;  &amp;quot;&lt;/span&gt; Enable file &lt;span class="nb"&gt;type &lt;/span&gt;detection.
  &lt;span class="err"&gt;&amp;quot;&lt;/span&gt; Also load indent files, to automatically &lt;span class="k"&gt;do &lt;/span&gt;language-dependent indenting
  filetype plugin indent on
endif
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Again if anyone has any super awesome tricks, let me know! I&amp;rsquo;ve been using vim for quite some time now, but I still find myself hanging onto the handbooks every word so often.&lt;/p&gt;

&lt;p&gt;On an unrelated note, I&amp;rsquo;ve been re-learning &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; the past couple of weeks. I really really recommend the &lt;strong&gt;Learn you a Haskell for Great Good!&lt;/strong&gt; book, it&amp;rsquo;s pretty darn awesome. Check it out &lt;a href="http://learnyouahaskell.com/"&gt;here&lt;/a&gt;. It can be a little scary for object oriented programmers but you&amp;rsquo;ll get the hang of it quickly and realize how powerful it can be, if not a little bonkers.&lt;/p&gt;

&lt;p&gt;I promise to update this blog a little more!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/a-mad-hatter</feedburner:origLink></entry>
 
 <entry>
   <title>Ghetto Superstar</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/PU7XCESp_Wk/ghetto-superstar" />
   <updated>2010-08-06T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/ghetto-superstar</id>
   <content type="html">&lt;h2&gt;Ghetto Superstar&lt;/h2&gt;

&lt;p&gt;So I&amp;rsquo;m hoping by the time I complete this blog post, I&amp;rsquo;ll be a year older than I was when I started it. Yes my birthday is in 30 minutes from now. But what happened.. I don&amp;rsquo;t get excited like I did when I was 10. It sucks!&lt;/p&gt;

&lt;p&gt;My girlfriend has dropped off my presents so whilst she&amp;rsquo;s at work in the morning, I can spend a good hour indulging in my goods. I&amp;rsquo;m looking forward to it! There&amp;rsquo;s been one thing bugging me though.. One of the presents is a strange triangular shape, quite large. Almost looks like it could be a guitar or something of that shape, but I know it&amp;rsquo;s not that. If anyone can guess it before tomorrow evening, I&amp;rsquo;ll send you some love!&lt;/p&gt;

&lt;p&gt;I don&amp;rsquo;t really have much time to write, so let me bullet point some stuff I have started doing and I&amp;rsquo;ll hopefully follow these up with some blog posts soon.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Started using &lt;a href="http://www.zsh.org/"&gt;zsh&lt;/a&gt; &amp;ndash; gone are the days of bash (And I&amp;rsquo;m so happy with it!)&lt;/li&gt;
&lt;li&gt;Jailbroke my iPhone (yes I know everyone has) &amp;mdash; got some cool/interesting hacks to share&lt;/li&gt;
&lt;li&gt;Wrote some (my first) &lt;a href="http://vim.org/"&gt;VIM&lt;/a&gt; scripts. I love them&lt;/li&gt;
&lt;li&gt;Wrote some Haskell code for a client &amp;mdash; Well worth knowing&lt;/li&gt;
&lt;li&gt;Bitched about Perl 6 a little (bitched = cried in pain)&lt;/li&gt;
&lt;li&gt;Laughed at Google wave being discontinued&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Ok I really have to go. Happy Birthday to me! etc&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/ghetto-superstar</feedburner:origLink></entry>
 
 <entry>
   <title>Cinch and Newton join forces!</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/jIaWWcctIis/cinch-and-newton-join-forces" />
   <updated>2010-08-02T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/cinch-and-newton-join-forces</id>
   <content type="html">&lt;h2&gt;Cinch and Newton join forces!&lt;/h2&gt;

&lt;p&gt;That&amp;rsquo;s right, &lt;a href="http://doc.injekt.net/cinch"&gt;Cinch&lt;/a&gt; and Newton are indeed combining libraries and making sweet sweet IRC love. This does mean that we will be bringing some incompatible changes, but according to &lt;a href="http://semver.org/"&gt;Semantic Versioning&lt;/a&gt;, you can&amp;rsquo;t bitch at me because Cinch is only at version 0.3! :&amp;ndash;)&lt;/p&gt;

&lt;p&gt;Luckily these changes are for the better! &lt;a href="http://fork-bomb.org/"&gt;Dominik Honnef&lt;/a&gt; is the author of the Newton library and has put in a lot of work into Newton, and we plan on implementing some extremely awesome features! Including the ability to use named parameter support, which was a huge hit in the original version of Cinch.&lt;/p&gt;

&lt;p&gt;The next couple of weeks is likely to be crucial in Cinch development. We plan on implementing a plugin system allowing users to create self contained plugins to be executed when a rule is matched. We also have a little sneaky surprise for users who&amp;rsquo;re interested in creating and deploying plugins, but that&amp;rsquo;s at a very early age right now.&lt;/p&gt;

&lt;p&gt;Want to keep updated on changes? Check out the merge branch of Cinch over &lt;a href="http://github.com/injekt/cinch/tree/merge"&gt;here&lt;/a&gt;. I&amp;rsquo;ll keep everyone updated on major feature changes. Also feel free to join #cinch on &lt;a href="irc://irc.freenode.org/cinch"&gt;irc.freenode.org&lt;/a&gt; to bitch at me about the incompatible changes and send praise for the better features which you&amp;rsquo;ll soon have access to.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/cinch-and-newton-join-forces</feedburner:origLink></entry>
 
 <entry>
   <title>Pick your poison, Percy</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/kcnsETXdOUU/pick-your-poison-percy" />
   <updated>2010-07-29T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/pick-your-poison-percy</id>
   <content type="html">&lt;h2&gt;Pick your poison, Percy&lt;/h2&gt;

&lt;p&gt;First things first. I have no idea who Percy is but it&amp;rsquo;s a &lt;strike&gt;funny&lt;/strike&gt; totally cool name, and I don&amp;rsquo;t know.. just came out.&lt;/p&gt;

&lt;p&gt;I was having a discussion today with a fellow developer and close comrade. This discussion turned into a language debate, which ultimately led to mass bloodshed (as these debates usually do). He&amp;rsquo;s recovering though, don&amp;rsquo;t worry.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve been asked to explain my typical pros and cons for the languages I have used many times (as I&amp;rsquo;m sure a lot of you have), and this time was no exception. He asked me what languages I have taken the time out to learn, why I spent time learning those languages, why I did so in such an order, and to list my pros and cons for each language. I hesitated for a while, in the hope to avoid repeating myself and having to step into the ring of fire. A place where my comments would be barraged, razed, and hog tied before being thrown into the burning pits of predictability.&lt;/p&gt;

&lt;p&gt;This time was different though. Steve wanted an explicit amount of pros and cons per language, three to be precise. At first I thought this was inconsequential, until I sat down and thought about it. Have I really answered this question over a hundred times without having a specific amount of pros and cons I had to adhere to? Yes, yes I had. Now you may be thinking, ugh.. what&amp;rsquo;s the difference? It&amp;rsquo;s still the same question and he&amp;rsquo;s still laying breadcrumbs in the form of &lt;a href="http://en.wikipedia.org/wiki/Jaffa_Cakes"&gt;jaffa cakes&lt;/a&gt; leading you to the firey pits of foreseeable faeces. Sounds elegant, eh?&lt;/p&gt;

&lt;p&gt;I explained to Steve that learning a language was irrelevant and that the work I have spent developing my programming skills has not been spent learning new languages, but improving my comprehensive understanding of computer programming and the operating system in general.&lt;/p&gt;

&lt;p&gt;All that aside though, attempting to figure out three pros for programming language, usually weeding down from a lot more than three, would certainly be interesting. As would it for pros per language, I&amp;rsquo;d probably have trouble trying to find three major pros out of a possible ten or more for a programming language I really enjoy. I may write a complete article on this some time.&lt;/p&gt;

&lt;p&gt;Steve also asked me if I think programmers should learn more than one language, at which point I directed him towards a small post on Stack Overflow which pretty much sums up my feelings about this, it&amp;rsquo;s over &lt;a href="http://stackoverflow.com/questions/3328500/learn-a-new-language-or-continue-with-java/3328525#3328525"&gt;here&lt;/a&gt;. What do you guys think about this?&lt;/p&gt;

&lt;p&gt;PS: If you enjoy blog rants and bashing Java programmers, see &lt;a href="http://steve-yegge.blogspot.com/2010/07/wikileaks-to-leak-5000-open-source-java.html"&gt;here&lt;/a&gt;. (And no I am not bashing Java programmers, I am a Java programmer, just don&amp;rsquo;t tell anyone)&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/pick-your-poison-percy</feedburner:origLink></entry>
 
 <entry>
   <title>How to interact on IRC</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/K-hEXpbDeWE/how-to-interact-on-irc" />
   <updated>2010-07-23T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/how-to-interact-on-irc</id>
   <content type="html">&lt;h2&gt;How to interact on IRC&lt;/h2&gt;

&lt;p&gt;First off, for those of you who are asking what IRC is, go &lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;get educated&lt;/a&gt;. Though I&amp;rsquo;m sure that&amp;rsquo;s only for the hot babes reading this (har har).&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve spent a good few years on IRC. From administering and maintaining channels, to noobing around in high-tech awesome sauce places that do nothing but confuse me. If you think making a scene for yourself when you&amp;rsquo;re in an awkward or uncontrolled, inadequate situation would be fun, read on.&lt;/p&gt;

&lt;p&gt;One thing I&amp;rsquo;ve noticed, especially from idling on somewhere like &lt;a href="http://freenode.org/"&gt;freenode&lt;/a&gt;, is that a lot of people are arrogant, obtuse, and are basically self certified prudent poop filled fuck muffins. If you&amp;rsquo;ll excuse both the language and poor grammar.&lt;/p&gt;

&lt;p&gt;I mean, when there&amp;rsquo;s a serious conversation taking place, I totally agree that some etiquette should be upheld. But when did everything get so serious?&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s your typical conversation on your typical freenode IRC channel:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;phil&amp;gt; Hello guys. How are your afternoons going? It&amp;#39;s mighty sunny outside.
bernard&amp;gt; Why you&amp;#39;re right, Phil. I have just pulled back my curtains to reveal the
        most immense of sun rays. It almost hurt my oculus.
sebastian&amp;gt; My gosh Phil, you guys are having tremendous weather there it seems. Ours
        it not so good. It seems there is a hint of perspiration in the air.
phil&amp;gt; Uh oh, that&amp;#39;s not good. Get ready to pull out the good &amp;#39;ol umbrella! hehe.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Ok so I exaggerate, but c'mon, this is the direction this blog post was always going to head.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s how people &lt;strong&gt;should&lt;/strong&gt; interact:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;phil&amp;gt; Yo what up guys, DANG ITS SO HOOOTTTTTTT outside
berny&amp;gt; true true, i&amp;#39;ve just got my ass outta bed, that shit is melting my eye balls :( :( :(
sebastian&amp;gt; well screw you both, it&amp;#39;s fucking raining here!?!?!?! :@ Ang3r!!!1!!1!three&amp;quot;1!
phil&amp;gt; hahahaha pwned
berny&amp;gt; LOL DONGS
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;So only now you realize I&amp;rsquo;m just blog trolling. But seriously&amp;hellip;..&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/how-to-interact-on-irc</feedburner:origLink></entry>
 
 <entry>
   <title>C++ A grandiose abomination</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/d93Mp4bCEyk/c-a-grandiose-abomination" />
   <updated>2010-07-21T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/c-a-grandiose-abomination</id>
   <content type="html">&lt;h2&gt;C++ A grandiose abomination&lt;/h2&gt;

&lt;p&gt;What? All the cool kids are saying it.&lt;/p&gt;

&lt;p&gt;Yes this of course is the news that C++ totally wtfsucks. If you&amp;rsquo;re a geek like me and hang around on places like /r/programming, or perhaps StubleUpon.. hell if you&amp;rsquo;ve lived under a rock for the last 2 weeks; I&amp;rsquo;m sure you would have seen numerous attacks against the free-form programming language, and of course those who oppose these nasty outbreaks and hit back with senseless hogwash in an attempt to nourish the thoughts of their chosen language. Ehm.&lt;/p&gt;

&lt;p&gt;This all started when Mr. Zed Shaw wrote this post on a mailing list, archiving his thoughts on the language. For those of you who don&amp;rsquo;t know Zed, he&amp;rsquo;s known for his rants. Specifically one entitled Rails is a Ghetto, a rant I can honestly say I agree with to a large extent, but I&amp;rsquo;m digressing..&lt;/p&gt;

&lt;p&gt;Is it just me or can anyone else see that his ranting comments aren&amp;rsquo;t actually excruciatingly scandalous like everyone seems to be making out? I mean, he likes C and thinks it&amp;rsquo;s much more suited to Mongrel2, the Bruce to the Thomas that was Mongrel. (If you don&amp;rsquo;t understand that, go watch some movies). He could have been a lot worse. I know I would/could have been. Even Linus made Zeds comments look weak compared to his thoughts.&lt;/p&gt;

&lt;p&gt;Well you know what happens when someone says something sucks, everyone comes out of their hiding places to start blogging and ranting, I MEAN COME ON GUYS STOP BLOGGING ABOUT THIS ALREADY. Yeah yeah, touche.&lt;/p&gt;

&lt;p&gt;Oh look, another post popped up on r/programming entitled: In the heat of the moment, it&amp;rsquo;s easy to lose sight of just how much of C++ is absolutely senseless wankery. But unfortunately the website was down.. how convenient.&lt;/p&gt;

&lt;p&gt;Without causing a mass exodus or something, I&amp;rsquo;d like to know what you guys think of C++, just something small in the comments will do.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/c-a-grandiose-abomination</feedburner:origLink></entry>
 
 <entry>
   <title>All up in your Epoxy</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/WcUY2E_EJOU/all-up-in-your-epoxy" />
   <updated>2010-07-13T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/all-up-in-your-epoxy</id>
   <content type="html">&lt;h2&gt;All up in your Epoxy&lt;/h2&gt;

&lt;p&gt;Epoxy is a binding API for querying databases. It handles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;?name for named binds&lt;/li&gt;
&lt;li&gt;? for numbered binds&lt;/li&gt;
&lt;li&gt;?? for a real question mark&lt;/li&gt;
&lt;li&gt;&amp;lsquo;?&amp;rsquo; for a real question mark&lt;/li&gt;
&lt;li&gt;Comments, weird quoting styles&lt;/li&gt;
&lt;li&gt;It won&amp;rsquo;t tell you how to quote your data. This solution works for any query language and any database.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Want an example? Sure thing..&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;# numbered binds&lt;/span&gt;
&lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Epoxy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;select * from foo where bar=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;binds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%W[foo]&lt;/span&gt;
&lt;span class="n"&gt;bound_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;select * from foo where bar=&amp;#39;foo&amp;#39;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# named binds&lt;/span&gt;
&lt;span class="n"&gt;binds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Lee&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;132&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Epoxy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;select * from people where name=?name and age=?age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bound_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;select * from people where name=&amp;#39;Lee&amp;#39; and age=&amp;#39;132&amp;#39;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# mix them!&lt;/span&gt;
&lt;span class="n"&gt;binds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Lee&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Epoxy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;select * from people where name=?name and age=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bound_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;select * from people where name=&amp;#39;Lee&amp;#39; and age=&amp;#39;Age&amp;#39;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Neat, right? here&amp;rsquo;s a real demo using the PG RubyGem:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;epoxy&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pg&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ap&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;PGconn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:dbname&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rdbi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rdbi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DROP TABLE IF EXISTS users&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR, pass VARCHAR )&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Lee&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:pass&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;foo bar&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;injekt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:pass&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bar baz&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;steve&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:pass&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lorem e&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map!&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Epoxy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;INSERT INTO users ( name, pass ) values ( ?name, md5(?pass) )&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;ap&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Which provides the following output:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;INSERT INTO users ( name, pass ) values ( &amp;#39;Lee&amp;#39;, md5(&amp;#39;foo bar&amp;#39;) )&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;INSERT INTO users ( name, pass ) values ( &amp;#39;injekt&amp;#39;, md5(&amp;#39;bar baz&amp;#39;) )&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;INSERT INTO users ( name, pass ) values ( &amp;#39;steve&amp;#39;, md5(&amp;#39;lorem e&amp;#39;) )&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Epoxy is the latest release from the RDBI team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Epoxy&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ul&gt;

</content>
 <feedburner:origLink>http://lee.jarvis.co/all-up-in-your-epoxy</feedburner:origLink></entry>
 
 <entry>
   <title>I'll lay you on a bed of roses, Google</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/tDBcCUyTqDI/ill-lay-you-on-a-bed-of-roses-google" />
   <updated>2010-07-07T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/ill-lay-you-on-a-bed-of-roses-google</id>
   <content type="html">&lt;h2&gt;I&amp;rsquo;ll lay you on a bed of roses, Google&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve had the pleasure of having to implement a lot of Google services for organizational and business use over the last couple of days. After being put off of many Google products since Buzz, I decided to give them another go. This includes configuring a Google apps account with support for mail, and collaborative work on documents.&lt;/p&gt;

&lt;p&gt;I challenged Google, and Google has responded with majestic awesomeness. Not that Google cares, but it&amp;rsquo;s certainly earned infinity kudos from me. Even if YouTube is filled with lulz. So yes, I&amp;rsquo;m celebrating because it&amp;rsquo;s made my life about 138 times easier this week.&lt;/p&gt;

&lt;p&gt;I last used Google docs a couple of years ago. It&amp;rsquo;s was.. mediocre. I think the idea is awesome, but it was filled with bugs and just sprouted immense deficiency.&lt;/p&gt;

&lt;p&gt;But hay, how it&amp;rsquo;s hella awesome.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m even thinking about using docs for my invoice work, too. Business collaboration is easy and a cinch to configure. Mail is as you&amp;rsquo;d expect, sweet.&lt;/p&gt;

&lt;p&gt;Now I&amp;rsquo;ve completed tasks about 4 hours earlier than expected.. This means I have time to party. AND WHAT DO WE BRING TO PARTIES LADIES AND GENTLEMEN?!&lt;/p&gt;

&lt;p&gt;Yes sir.&lt;/p&gt;

&lt;p&gt;PS: Uh oh Google&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/ill-lay-you-on-a-bed-of-roses-google</feedburner:origLink></entry>
 
 <entry>
   <title>YouTube, XSS, and a sprinkle of LOLWAT</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/E9uVjc8O1RQ/youtube-xss-and-a-sprinkle-of-lolwat" />
   <updated>2010-07-05T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/youtube-xss-and-a-sprinkle-of-lolwat</id>
   <content type="html">&lt;h2&gt;YouTube, XSS, and a sprinkle of LOLWAT&lt;/h2&gt;

&lt;p&gt;YouTube have had a Cross Site Scripting (XSS) vulnerability in their video viewing pages.&lt;/p&gt;

&lt;p&gt;Yes, that&amp;rsquo;s right ladies and gentlemen. Google has officially made the interwebs chuckle until bunnies fall out of its ears. You heard it here first last.  This of course is the news that YouTube has a flaw which allows an attacker to embed malicious code into the comment stream which is then executed when a user views the video of a fat lady pole dancing. Srsly.. click it.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the BBC Article.&lt;/p&gt;

&lt;p&gt;&amp;ldquo;We took swift action to fix a cross-site scripting (XSS) vulnerability on youtube.com,&amp;rdquo; a spokesperson said.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;d like to hear feedback on this. I mean, should a company as large as Google really make such little mistakes like this?&lt;/p&gt;

&lt;p&gt;Now my head hurts. I&amp;rsquo;ll be sure to post a better entry later tonight or tomorrow.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/youtube-xss-and-a-sprinkle-of-lolwat</feedburner:origLink></entry>
 
 <entry>
   <title>RVM plays nice on production</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/T835_htE7cI/rvm-plays-nice-on-production" />
   <updated>2010-06-23T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/rvm-plays-nice-on-production</id>
   <content type="html">&lt;h2&gt;RVM plays nice on production&lt;/h2&gt;

&lt;p&gt;Some of you may have read my earlier entry regarding RVM entitled Where for art thou RVM (those of you who have not should go read it now before anything drastic happens, such as my website punching you in the face for not doing so). Only kidding, my website loves you!&lt;/p&gt;

&lt;p&gt;Anyway, I was speaking to some guys the other day regarding RVM and its super duper serious awesomeness and stuff. Here&amp;rsquo;s basically how the conversation went:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;injekt&amp;gt; Woop rvm ftw!
dave&amp;gt; Yeah rvm is awesome
alan&amp;gt; agreed
alan&amp;gt; love it for development. What do you guys use for production servers though?
dave&amp;gt; I have ruby 1.9.1 here
injekt&amp;gt; ... rvm
alan&amp;gt; huh?
injekt&amp;gt; Why don&amp;#39;t you use rvm for production? I do
alan&amp;gt; isn&amp;#39;t it for development
injekt&amp;gt; it&amp;#39;s for managing multiple Ruby installs + much more
injekt&amp;gt; Who said it was just for development?
injekt&amp;gt; I use it for production on 3 servers, 2 of which are public shell servers
alan&amp;gt; Oh, I thought...
injekt&amp;gt; YOU THOUGHT WRONG
injekt&amp;gt; RVM SHALL DISMISS YOUR EXISTENCE AND CURSE YOU WITH TERRIBLE RUBIES
alan&amp;gt; ugh..
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Yeah, I got a little excited at the end. I apologise for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; Before continuing please note that the regular installation script found
&lt;a href="http://rvm.beginrescueend.com/rvm/install/"&gt;here&lt;/a&gt; will work as expected when ran as the
root user. This will install RVM and create shared access across all users.&lt;/p&gt;

&lt;p&gt;When I first started playing with RVM I wanted to come up with a way of allowing users to share rubies and install system wide gems, allowing them to have a free and open development environment which in turn increasingly nudges their dev habitat up the awesome scale. Win win.&lt;/p&gt;

&lt;p&gt;The setup I have basically mimics that of the one found &lt;a href="http://greg.nokes.name/2010/03/26/rooting-with-rvm/"&gt;here&lt;/a&gt;, an awesome post for users who want to install RVM as the root user. These are basically the steps I took (and continue to take) on my development servers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch to root user: &lt;code&gt;su root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Grab the latest RVM code from github: &lt;code&gt;git clone git://github.com/wayneeseguin/rvm.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd rvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Watch the pleasures of RVM christening your system with its awesome juicy curvaceous..ness&lt;/li&gt;
&lt;li&gt;Remove the rvm folder: &lt;code&gt;rm -rf rvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add rvm group: &lt;code&gt;groupadd rvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add yourself to said group: &lt;code&gt;usermod -aG rvm injekt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;rvm_path&lt;/code&gt; to &lt;code&gt;/etc/rvmrc&lt;/code&gt;: &lt;code&gt;echo "export rvm_path=/usr/local/rvm" &amp;gt; /etc/rvmrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open up &lt;code&gt;/etc/profile&lt;/code&gt; and add &lt;a href="https://gist.github.com/886070"&gt;these&lt;/a&gt; lines&lt;/li&gt;
&lt;li&gt;Give the rvm group ownership to it&amp;rsquo;s rightful rubies: &lt;code&gt;chown -R root:rvm /usr/local/rvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Give write access to all members of the rvm group: &lt;code&gt;chmod -R g+w /usr/local/rvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Switch back to non-root: &lt;code&gt;exit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dance a little bit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rvm install &amp;lt;ruby version&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Eat sammich&lt;/li&gt;
&lt;li&gt;Set default Ruby version: &lt;code&gt;rvm use &amp;lt;ruby version&amp;gt; --default&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Before you ask; yes this does mean all users of the &lt;code&gt;rvm&lt;/code&gt; group have access to rubies and gems. This isn&amp;rsquo;t meant to tell you the best method of configuring rvm for cross user server use, but rather the method I use.&lt;/p&gt;

&lt;p&gt;Official installation notes are &lt;a href="http://rvm.beginrescueend.com/rvm/install"&gt;here&lt;/a&gt;&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/rvm-plays-nice-on-production</feedburner:origLink></entry>
 
 <entry>
   <title>iOS4 doesn't like my Gmail contacts</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/jky-fUJ_rW0/ios4-doesnt-like-my-gmail-contacts" />
   <updated>2010-06-22T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/ios4-doesnt-like-my-gmail-contacts</id>
   <content type="html">&lt;h2&gt;iOS4 doesn&amp;rsquo;t like my Gmail contacts&lt;/h2&gt;

&lt;p&gt;Once upon a day there was a guy, a simple guy. A technology loving, athletic, admirable, majestic, smart guy. This guy owned an iPhone. Pretty, it was. Then &lt;a href="http://www.apple.com/quicktime/qtv/wwdc10/index.html"&gt;this&lt;/a&gt; happened. Steve Jobs introduced the new features of the new highly anticipated iOS4, Apples new mobile operating system.&lt;/p&gt;

&lt;p&gt;Of course, I was excited.. er, he was excited. If he was a puppy someone would have been cleaning the unfortunate secretion he would have created on the new lounge carpet. He felt like a kid with a new toy, or at least a release day for a new toy.&lt;/p&gt;

&lt;p&gt;So then came along yesterday. The release of the new magical operating system which turns your iPhone into a multi-tasking sensation. If you were one of the sad sad people who were watching &lt;a href="http://www.google.com/search?q=%23ios4+site:twitter.com&amp;amp;source=lnms&amp;amp;tbs=mbl:1"&gt;this feed&lt;/a&gt; I salute you for your patience, and smack you for your geeky sadness (You can smack me back, I did the same).&lt;/p&gt;

&lt;p&gt;The new system works as expected. Though the are many people &lt;a href="http://www.boygeniusreport.com/2010/06/21/ios-4-smooth-as-sick-or-buggy-as-hell/"&gt;reporting issues&lt;/a&gt;, fortunately I&amp;rsquo;ve just had one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The worst most annoying one!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I use the &lt;a href="http://www.google.com/support/mobile/bin/answer.py?answer=138740&amp;amp;topic=14252"&gt;Exchange syncing service&lt;/a&gt; with Google. Which worked flawlessly.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;

&lt;p&gt;I have this many contacts in my address book: 0&lt;/p&gt;

&lt;p&gt;My calender has managed to Sync, yet my emails have not. I receive an error about connecting to the Google mail servers when I try to sync.&lt;/p&gt;

&lt;p&gt;As I can see, the issue has been discussed &lt;a href="http://discussions.apple.com/thread.jspa?messageID=11718615&amp;amp;tstart=0"&gt;here&lt;/a&gt;, &lt;a href="http://www.google.com/support/forum/p/gmail/thread?tid=0aea7857b25a174f&amp;amp;hl=en"&gt;here&lt;/a&gt;, oh and &lt;a href="http://www.google.com/support/forum/p/Google%20Mobile/thread?tid=3660e3e8f0d5154f&amp;amp;hl=en"&gt;here again&lt;/a&gt; which was linked back to &lt;a href="http://www.google.com/support/forum/p/Google+Mobile/thread?tid=2aba4d3a3908b354&amp;amp;hl=en"&gt;here&lt;/a&gt;. So are there actually any solutions?&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s been over 24 hours now, I still have no contacts. I&amp;rsquo;m about to kill Google.&lt;/p&gt;

&lt;p&gt;Any readers have the same issues, and any possible fixes? I don&amp;rsquo;t want to result in having to use iTunes to sync my damn contacts.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/ios4-doesnt-like-my-gmail-contacts</feedburner:origLink></entry>
 
 <entry>
   <title>Don't be scared of a little Gem</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/FhDESRpP39c/dont-be-scared-of-a-little-gem" />
   <updated>2010-06-22T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/dont-be-scared-of-a-little-gem</id>
   <content type="html">&lt;h2&gt;Don&amp;rsquo;t be scared of a little Gem&lt;/h2&gt;

&lt;p&gt;So I had a conversation with a guy on IRC the other day regarding a task he wanted to achieve using Ruby. Without boring you with the details, here&amp;rsquo;s how it went:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;matt&amp;gt; Hi I&amp;#39;m looking for help with a script. I&amp;#39;m attempting to send multiple HTTP requests in a single
           session whilst collecting and securing cookie information, session based too.
injekt&amp;gt; matt: Check out the Mechanize library: http://mechanize.rubyforge.org/mechanize/
matt&amp;gt; injekt: what is that?
injekt&amp;gt; matt: Read it and find out? :)
matt&amp;gt; injekt: I don&amp;#39;t want to install a gem for this
injekt&amp;gt; matt: Why not? All the hard work is done for you
matt&amp;gt; because it&amp;#39;s more libraries the user has to install, i want to write it myself
injekt&amp;gt; matt: If the user is using your library aren&amp;#39;t they already using a gem?
matt&amp;gt; no
injekt&amp;gt; matt: How so?
matt&amp;gt; im not using gems
injekt&amp;gt; matt: Why not?
matt&amp;gt; I dont want to install gems, it means more for user to do
matt&amp;gt; forget it jesus christ everyone keeps telling me to use rubygems
* matt has quit (Quit: dumb shit)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Well matt, there is a reason for that. This day in age people need to be less scared of using package managers and contributed libraries. Try it, if it sucks, try another one. Once you&amp;rsquo;ve exhausted all possibilities and you&amp;rsquo;re still not happy, then build it yourself. Once you&amp;rsquo;ve done that, release it and tell people why it&amp;rsquo;s better than the others. It&amp;rsquo;s a process still so many people are benighted to. A process so simple I could explain it to my Nan over tea and biscuits.&lt;/p&gt;

&lt;p&gt;The same has been said many times before in the Perl community (one I used to inhabit). Countless times on Dev Shed has someone asked how to parse some ill formatted markup, only to be told they should be using a library like HTML::TokeParser, and rightfully so. What&amp;rsquo;s wrong with using third party libraries and relying on a packaging system like CPan or RubyGems?&lt;/p&gt;

&lt;p&gt;Nothing. That&amp;rsquo;s what.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/dont-be-scared-of-a-little-gem</feedburner:origLink></entry>
 
 <entry>
   <title>SSH Host Completion</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/5QexJgQ0vZc/ssh-host-completion" />
   <updated>2010-06-17T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/ssh-host-completion</id>
   <content type="html">&lt;h2&gt;SSH Host Completion&lt;/h2&gt;

&lt;p&gt;If you&amp;rsquo;re like me and enjoy bash-completion so much you want every application to take advantage of it, or perhaps you numerous hosts you send/receive data to and from via SSH, read on..&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re not, you can also read on if you&amp;rsquo;d like. I may provide some pretty pictures or a treat at the end of this entry just for you guys. I&amp;rsquo;m nice like that.&lt;/p&gt;

&lt;p&gt;Are you like me and take advantage of the &lt;code&gt;.ssh/config&lt;/code&gt; file?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No, that sounds interesting though&amp;hellip;&lt;/li&gt;
&lt;li&gt;Yes, I &amp;lt;3 &lt;code&gt;.ssh/config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No, I don&amp;rsquo;t like it, go away, I&amp;rsquo;m navigating away from your graceful yet fruitless blog right now&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;If you answered 1, see &lt;a href="http://linux.die.net/man/5/ssh_config"&gt;here&lt;/a&gt;. It&amp;rsquo;s awesome!&lt;/li&gt;
&lt;li&gt;If you answered 2, read on&lt;/li&gt;
&lt;li&gt;If you answered 3&amp;hellip;. :&amp;ndash;(&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So.. Here&amp;rsquo;s a quick example of what my &lt;code&gt;.ssh/config&lt;/code&gt; file looks like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;Host phillip
    HostName foobar.net
    Port 8927
    User lee
    IdentityFile ~/.ssh/id_rsa.pub

Host injekt
    HostName injekt.net
    Port 2322
    User injekt
    IdentityFile ~/.ssh/id_rsa.pub

Host scooby
    HostName scooby.doo
    Port 2211
    User daphne
    IdentityFile ~/.ssh/id_rsa.pub

Host flamingo
    HostName 11.234.21.234
    User fred
    IdentityFile ~/.ssh_id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now of course, this isn&amp;rsquo;t what my &lt;code&gt;.ssh/config&lt;/code&gt; file looks like at all. Though I&amp;rsquo;m sure the employers I work for would not appreciate their SSH login credentials spread across my blog, so I have replaced the entries with clearly meaningful duplicates.&lt;/p&gt;

&lt;p&gt;Ok so now all we have to do to login to foobar.net is this: &lt;code&gt;ssh phillip&lt;/code&gt; Great, isn&amp;rsquo;t it? This even works with SCP, and of course Git over SSH.&lt;/p&gt;

&lt;p&gt;Now have you ever tried to do this: ssh ph[tab] ? Because.. I have.. many times.&lt;/p&gt;

&lt;p&gt;Throw the following code into a file named .ssh-completion or directly into your &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;_complete_ssh_hosts &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=()&lt;/span&gt;
  &lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${COMP_WORDS[COMP_CWORD]}&amp;quot;&lt;/span&gt;
  &lt;span class="nv"&gt;comp_ssh_hosts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f ~/.ssh/config &lt;span class="o"&gt;]&lt;/span&gt;; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;      &lt;/span&gt;cat ~/.ssh/config |       grep &lt;span class="s2"&gt;&amp;quot;^Host &amp;quot;&lt;/span&gt; |       awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
  &lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;compgen&lt;/span&gt; -W &lt;span class="s2"&gt;&amp;quot;${comp_ssh_hosts}&amp;quot;&lt;/span&gt; -- &lt;span class="nv"&gt;$cur&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;0
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;complete&lt;/span&gt; -F _complete_ssh_hosts ssh
 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;If you put this into a file named &lt;code&gt;.ssh-completion&lt;/code&gt; make sure you add &lt;code&gt;source ~/.ssh-completion&lt;/code&gt; to your &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Reload your terminal, and walla! It just works..&lt;/p&gt;

&lt;p&gt;PS: if it doesn&amp;rsquo;t, it&amp;rsquo;s not my fault&lt;/p&gt;

&lt;p&gt;Oh and for those of you who have waited all this time just for the treat or pretty picture, don&amp;rsquo;t worry I haven&amp;rsquo;t forgotten&amp;hellip;&lt;/p&gt;

&lt;p&gt;PS: I would quote the original source of the SSH completion script but I have no idea what it was, it was a while ago. If anyone has an idea please let me know and I shall update this entry accordingly.&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/ssh-host-completion</feedburner:origLink></entry>
 
 <entry>
   <title>Firefox's pesky link borders!</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/tqSQsS2Aw04/firefoxs-pesky-link-borders" />
   <updated>2010-06-16T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/firefoxs-pesky-link-borders</id>
   <content type="html">&lt;h2&gt;Firefox&amp;rsquo;s pesky link borders!&lt;/h2&gt;

&lt;p&gt;If you&amp;rsquo;re a &lt;a href="http://mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; user you may find from time to time that when visiting a website and carrying out the rather intelligible task of focusing on an image link, you&amp;rsquo;re confronted with a rather obtuse border. Now from a web developers point of view, this matters.&lt;/p&gt;

&lt;p&gt;You may not have noticed this mystifying feature before, but it&amp;rsquo;s there, I promise. You can in fact go ahead and see for yourself at popular websites such as Google and Amazon (of course if you are not a Firefox user please do not send me complaint letters because you cannot see this border). Here&amp;rsquo;s an example..&lt;/p&gt;

&lt;p&gt;Wanna fix it?&lt;/p&gt;

&lt;p&gt;Try adding the following to your CSS:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;none&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;or if you want to be fancy and direct:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;none&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This will remove all outlines on your focused image links. Neat, right?&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/firefoxs-pesky-link-borders</feedburner:origLink></entry>
 
 <entry>
   <title>Unseasoned additives</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/y1mb9wVq-NU/unseasoned-additives" />
   <updated>2010-06-15T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/unseasoned-additives</id>
   <content type="html">&lt;h2&gt;Unseasoned additives&lt;/h2&gt;

&lt;p&gt;Don&amp;rsquo;t ask..&lt;/p&gt;

&lt;p&gt;So I decided building a solid, secure, pretty commenting system for this blog wasn&amp;rsquo;t worth the time and effort it would take (even if it wouldn&amp;rsquo;t actually take &lt;strong&gt;that&lt;/strong&gt; long). After all, It&amp;rsquo;s not like many comments populate the realms of this establishment anyway, right.&lt;/p&gt;

&lt;p&gt;Anywho&amp;hellip; I&amp;rsquo;ve opted for &lt;a href="http://disqus.com/"&gt;DISQUS&lt;/a&gt;, for two reasons.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I&amp;rsquo;ve started seeing it &lt;strong&gt;everywhere&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It means I don&amp;rsquo;t have to build one&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Yippee!&lt;/p&gt;

&lt;p&gt;Now if you&amp;rsquo;re thinking, aww I think I&amp;rsquo;ll comment on his post just to make him feel better, don&amp;rsquo;t you dare! (please do) I don&amp;rsquo;t need your comments (I do really) and they mean nothing to be (they&amp;rsquo;re actually much appreciated).&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/unseasoned-additives</feedburner:origLink></entry>
 
 <entry>
   <title>Where for art thou RVM?</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/nAmrs8pNBAI/where-for-art-thou-rvm" />
   <updated>2010-06-14T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/where-for-art-thou-rvm</id>
   <content type="html">&lt;h2&gt;Where for art thou RVM?&lt;/h2&gt;

&lt;p&gt;So after my spending a couple of days recompiling both of my laptops (yes, &lt;strong&gt;both&lt;/strong&gt;) because they just happened to give up on life and wanted the pleasure of hearing me scream like a &lt;a href="http://www.google.com/images?q=howler+monkey"&gt;howler monkey&lt;/a&gt;, I&amp;rsquo;ve soon come to the realization that installing Ruby is one of the easiest, and most beautiful experiences I&amp;rsquo;ve had the pleasure of taking part in.&lt;/p&gt;

&lt;p&gt;No, I&amp;rsquo;m serious.&lt;/p&gt;

&lt;p&gt;I spend a lot of time reconfiguring my systems (both desktop and server environments) from easy Ubuntu to the usual excitingly sticky Gentoo (ftw). Whilst moaning about my constant issues with running multiple versions of Ruby across multiple platforms, the same thing kept popping up over the IRC channels; rvm.&lt;/p&gt;

&lt;p&gt;&amp;ldquo;What&amp;rsquo;s that?&amp;rdquo; I said
&amp;ldquo;Ruby Version Manager&amp;rdquo; they said
&amp;ldquo;Pfft, no thanks&amp;rdquo; I responded&lt;/p&gt;

&lt;p&gt;Well, I have retreated with my tail between my legs, the egg is indeed smeared across my face. &lt;a href="http://rvm.beginrescueend.com/"&gt;RVM&lt;/a&gt; is one of the best surprises of the last couple of months for me. &lt;a href="http://beginrescueend.com/"&gt;Wayne E. Seguin&lt;/a&gt; has done a simply amazing job with the Ruby Version Manager. I&amp;rsquo;ve spent time disregarding its beauty, time I cannot replace. Judging by the way RVM has treated me though, it&amp;rsquo;s certainly forgiven me for my sins.&lt;/p&gt;

&lt;p&gt;RVM isn&amp;rsquo;t just for the people who are looking for multiple versions of Ruby on the same system. RVM is all you need. Gone are the days of using package managers to install old versions of Ruby, or grabbing the source yourself and compiling. Lay back, let RVM do all that stuff for you, whilst managing the many versions it supports.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="http://rvm.beginrescueend.com"&gt;RVM&lt;/a&gt;, I promise you it&amp;rsquo;s the best move you&amp;rsquo;ve made since clicking the link to this entry.&lt;/p&gt;

&lt;p&gt;Oh and just to finish it off, aside from being an awesome product; RVM has an unforgettable website banner.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20090904-fyqnyu8pcr36ahe91er9x28bhi.png" alt="RVM rawks!" /&gt;&lt;/p&gt;

&lt;p&gt;Check that!&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/where-for-art-thou-rvm</feedburner:origLink></entry>
 
 <entry>
   <title>Hello, World!</title>
   <link href="http://feedproxy.google.com/~r/lee-jarvis/~3/WqYBQHLZQDM/hello-world" />
   <updated>2010-06-13T00:00:00-07:00</updated>
   <id>http://lee.jarvis.co/hello-world</id>
   <content type="html">&lt;h2&gt;Hello, World!&lt;/h2&gt;

&lt;p&gt;Howdy. Welcome to my third attempt at creating a blog. I&amp;rsquo;ve been using &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; for some time now, and I&amp;rsquo;ve decided it&amp;rsquo;s time to move on.&lt;/p&gt;

&lt;p&gt;Don&amp;rsquo;t get me wrong, Wordpress is a great and powerful blog management system. It&amp;rsquo;s just&amp;hellip; too much. Wordpress offers too many options, too much functionality. I&amp;rsquo;d rarely use even half of it. Wordpress is like Daphne, she&amp;rsquo;s hot and offers everything you could want, but sometimes I just need to stick with Scooby. He&amp;rsquo;s always been there for me, and he&amp;rsquo;s simple, not complicated like Daphne.&lt;/p&gt;

&lt;p&gt;This blog is powered by the high quality Ruby libraries &lt;a href="http://sinatrarb.com/"&gt;Sinatra&lt;/a&gt;, &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt; and &lt;a href="http://github.com/rtomayko/rdiscount"&gt;RDiscount&lt;/a&gt;. Now I know what some of you are thinking; wait, you&amp;rsquo;re using Sinatra?! What happened to &lt;a href="http://ramaze.net"&gt;Ramaze&lt;/a&gt;? Well, nothing. I love Ramaze, I just wanted to try Sinatra for this. You don&amp;rsquo;t hate me, do you?&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the ditty:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sinatra throws up a pretty hot XHTML page for your viewing pleasure&lt;/li&gt;
&lt;li&gt;You request an entry&lt;/li&gt;
&lt;li&gt;Sinatra throws the ball to Sequel&lt;/li&gt;
&lt;li&gt;Sequel does some tricks, querying the database and such (&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;)
Sequel asks RDiscount for some markdown&lt;/li&gt;
&lt;li&gt;RDiscount is all &lt;em&gt;yeah, sure bro!&lt;/em&gt;, and cooks up a markdown sammich&lt;/li&gt;
&lt;li&gt;Sequel passes the yummy lunch time snack back to Sinatra&lt;/li&gt;
&lt;li&gt;Sinatra uses &lt;a href="http://haml-lang.com/"&gt;HAML&lt;/a&gt; to ensure prettiness of markdown&lt;/li&gt;
&lt;li&gt;Ka boom&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Pretty neat, huh?&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;d like to see what the original markdown looks like before RDiscount works its magic, just throw on a .txt extension to the end of an entry url. Something like &lt;a href="http://blog.injekt.net/1/hello-world.txt"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On that note,
Props to Scooby&lt;/p&gt;
</content>
 <feedburner:origLink>http://lee.jarvis.co/hello-world</feedburner:origLink></entry>
 

</feed>

