<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>tag:interblah.net,2008-06-01:kind/blog</id>
  <title>interblah.net - blog</title>
  <updated>2010-01-01T16:16:00+00:00</updated>
  <entry>
    <title>thoughtbot-ruby-survey-2009</title>
    <id>tag:interblah.net,Fri:/thoughtbot-ruby-survey-2009</id>
    <updated>2010-01-01T16:16:00+00:00</updated>
    <published>2010-01-01T16:16:00+00:00</published>
    <link href="http://interblah.net/thoughtbot-ruby-survey-2009"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Thoughtbot Ruby Survey 2009&lt;/h1&gt;

&lt;p&gt;I wasn't hugely into the &lt;a href="http://robots.thoughtbot.com/post/308239139/2009-ruby-survey-results"&gt;Thoughtbot 2009 Survey&lt;/a&gt;, because (and as they noted), the questions were very poorly constructed:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;There are questions that are too narrow or too broad. There are questions that are missing options. There are questions that assume too much about an “either/or” scenario, when people really behave differently depending on context. There are questions which insult people’s core beliefs, I guess. Fortunately for all of us, the results of this survey aren’t being used to decide anything too important.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, I'm still not sure they get it:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Maybe most encouragingly, when asked about whether the types of questions in the survey mattered or were a huge waste of time, nearly 90% chose the “I think it’s worth caring about your craft, and these questions are professionally relevant” option.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are the choices people were given in the survey:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I think it's worth caring about your craft, and these questions are professionally relevant.&lt;/li&gt;
&lt;li&gt;This is a huge waste of time, you guys are a bunch of psychos, just get back to coding.&lt;/li&gt;
&lt;li&gt;It sure is, and I'm not capable of or willing to work on a team with anyone who disagrees with my correct answers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obviously people want to agree with&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;I think it's worth caring about your craft&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;but in doing so, we are also saddled with agreement to&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;these questions are professionally relevant&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fact that &lt;a href="https://thoughtbot.wufoo.com/reports/documentation-and-wrapup"&gt;lots of people did choose answer one&lt;/a&gt; unfortunately doesn't support whether or not the questions were a "huge waste of time" or not. Any to be fair, even if the questions &lt;em&gt;are&lt;/em&gt; relevant, the available answers were not. This means that any data derived from this survey is fundamentally worthless. It's a shame, really, but that's the truth of it.&lt;/p&gt;

&lt;p&gt;I'm not taking this seriously - it would be crazy to, naturally, and clearly it's been composed with humour and good intentions. That said I can't help feeling it's a bad omen. Despite it's lack of rigor, we are presented with some conclusions - for example:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;A solid 75% of people always use parentheses on method definition — maybe enough to justify criticizing people who don’t?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is value in consistency, and this does apply to a community's behaviours as well as those of a team, or indeed of an individual, but &lt;strong&gt;consistency is only secondary to consideration&lt;/strong&gt;. Blindly criticising behaviour because it doesn't match a poorly-derived norm feels sufficiently similar to our earlier readiness to &lt;a href="http://rails-engines.org/news/2006/08/30/apparently-engines-are-still-evil"&gt;declare things as evil without much research or understanding&lt;/a&gt; to make me take notice. &lt;/p&gt;

&lt;p&gt;The most important sentence in this whole thing is&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;the results of this survey aren’t being used to decide anything too important.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lets make sure that's true. Trying to define best practices using only the results of the &lt;a href="http://robots.thoughtbot.com/post/308239139/2009-ruby-survey-results"&gt;Thoughtbot 2009 Survey&lt;/a&gt; would be a sad step back in the direction of &lt;a href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;cargo-culting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the Ruby community is trying to more clearly define itself and reach an adulthood of sorts, perhaps we should stop paying attention to these &lt;a href="http://railsmaturitymodels.com/"&gt;effectively-meaningless &lt;em&gt;yes-me-too&lt;/em&gt; manifestos&lt;/a&gt; and start actually changing the way real people experience our work.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>wake-remote-machine-automator-action</title>
    <id>tag:interblah.net,Thu:/wake-remote-machine-automator-action</id>
    <updated>2009-09-10T14:56:07+00:00</updated>
    <published>2009-09-10T13:57:03+00:00</published>
    <link href="http://interblah.net/wake-remote-machine-automator-action"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Wake Remote Machine Automator Action&lt;/h1&gt;

&lt;p&gt;I've whipped up a nice &lt;a href="http://www.apple.com/macosx/what-is-macosx/apps-and-utilities.html#automator"&gt;Automator&lt;/a&gt; action for waking a remote machine, which works great with the new '&lt;a href="http://www.macworld.com/article/142468/2009/08/wake_on_demand.html"&gt;wake over wireless lan&lt;/a&gt;' feature in Snow Leopard. &lt;/p&gt;

&lt;p&gt;While you need an Airport-type router to get the most of the feature, there's nothing stopping you sending the magical 'wake up' signal from any other computer.&lt;/p&gt;

&lt;p&gt;Here's a screenshot of how you might want to try and use it in a workflow:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://interblah.net/assets/wake_machine_workflow.png" alt="One possible workflow"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://public.lazyatom.com/WakeMachine.action.zip"&gt;Download the Wake Machine action here&lt;/a&gt;, and the source is &lt;a href="http://github.com/lazyatom/wake-machine"&gt;on github&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It may only work if you are on the same network, depending on how you are set up, but regardless, it's great to be able to wake up my Mac mini from my laptop, automatically, and whenever I want.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>freeagent-widget-update</title>
    <id>tag:interblah.net,Mon:/freeagent-widget-update</id>
    <updated>2009-09-08T08:41:58+00:00</updated>
    <published>2009-09-07T20:28:29+00:00</published>
    <link href="http://interblah.net/freeagent-widget-update"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;FreeAgent Widget Update&lt;/h1&gt;

&lt;p&gt;(another update: fixed some broken timer resetting behaviour, please &lt;a href="http://public.lazyatom.com/FreeAgent-1.3.1.zip"&gt;grab 1.3.1&lt;/a&gt; if you haven't already)&lt;/p&gt;

&lt;p&gt;Just a quick note to say that I've updated the widget to 1.3.1 - &lt;a href="http://public.lazyatom.com/FreeAgent-1.3.1.zip"&gt;download it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/lazyatom/freeagent-widget"&gt;&lt;img src="http://interblah.net/assets/freeagent-widget-1.2.png" alt="FreeAgent Timesheets Widget"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most notable new feature is that it will preserve unposted time across restarts (or crashes), so if you restart while working, you won't lose track of how long you've been working for. Honestly, this has bitten me so many times.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="http://interblah.net/freeagent-widget"&gt;original announcement&lt;/a&gt; for more details, and the source is always available on &lt;a href="http://github.com/lazyatom/freeagent-widget"&gt;github&lt;/a&gt;. As before, if you have any problems, get in touch via &lt;a href="http://github.com/lazyatom/freeagent-widget/issues"&gt;github issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also please note that you'll need API access turned on; for more details see the &lt;a href="http://www.freeagentcentral.com/central/changes-to-api-access"&gt;recent post on FreeAgent Central&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>thank-you-why</title>
    <id>tag:interblah.net,Fri:/thank-you-why</id>
    <updated>2009-11-30T21:42:29+00:00</updated>
    <published>2009-08-21T14:20:20+00:00</published>
    <link href="http://interblah.net/thank-you-why"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Gratitude&lt;/h1&gt;

&lt;p&gt;&lt;img src="http://farm1.static.flickr.com/55/128536540_1ca32fc483.jpg" alt="A slide from the first Ruby conference I spoke at. I had emailed Why to ask permission to use his Foxes, which he graciously did."/&gt;&lt;/p&gt;

&lt;p&gt;My only actual connection with &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;Why&lt;/a&gt; was through this slide, from my Canada on Rails presentation many years ago. I had emailed him to ask permission to use the Foxes, and he naturally obliged.&lt;/p&gt;

&lt;p&gt;I got to meet &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;Why&lt;/a&gt; briefly in Chicago, where I said thanks in person for letting me use the image, and that his (poignant) guide to Ruby had been the &lt;a href="http://en.wikipedia.org/wiki/Redpill"&gt;red pill&lt;/a&gt; that got me hooked on Ruby. I can remember reading it, whilst learning to use Ruby in my PhD research, and allowing his contagious enthusiasm soak my mind, often spilling over, on which occasions I'd be compelled to email my friends to rave about how &lt;em&gt;sweet&lt;/em&gt; being able to write code like&lt;/p&gt;

&lt;p&gt;&lt;pre class="code ruby"&gt;&lt;code&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Ruby is much bigger now, of course, than then. We can pay the bills with it, and quite seriously talk about 'productivity gains' and 'test first' and so on. But it's easy to forget that simpler time, when really everything was on &lt;a href="http://blade.nagaokaut.ac.jp/ruby/ruby-talk/index.shtml"&gt;ruby-talk&lt;/a&gt;, and people were really just exploring the delights, the quirks, and the elegance of this great language that we'd all stumbled across in the wilds of &lt;code&gt;comp.lang&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I finished my PhD not knowing if I'd be able to get a job using Ruby, but knowing that I really didn't want to program in anything else, after the &lt;em&gt;delight&lt;/em&gt; that I'd found. And I'm glad that I stuck by that.&lt;/p&gt;

&lt;p&gt;I owe &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;Why&lt;/a&gt; a beer. No, many beers.&lt;/p&gt;

&lt;p&gt;&lt;pre class="code ruby"&gt;&lt;code&gt;&lt;span class="number"&gt;10000&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;me&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;buy_beer_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Why&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>rip-gem-dependencies</title>
    <id>tag:interblah.net,Thu:/rip-gem-dependencies</id>
    <updated>2009-08-20T08:20:54+00:00</updated>
    <published>2009-08-13T13:51:18+00:00</published>
    <link href="http://interblah.net/rip-gem-dependencies"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Rip &amp;amp; Gem Dependencies&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; my changes have been merged into rip by &lt;a href="http://ozmm.org"&gt;Chris&lt;/a&gt;. Nice!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The good stuff is &lt;a href="http://github.com/lazyatom/rip/"&gt;here&lt;/a&gt;, my ADD-addled friends&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've just spent a bit of time kicking the tyres of &lt;a href="http://hellorip.com"&gt;Rip&lt;/a&gt;, an alternative package manager by &lt;a href="http://ozmm.org"&gt;Chris Wanstrath&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you've done any Rails development recently, and tried to keep a vendor directory of gems in order, you'll know the pain that almost certainly inspired the &lt;a href="http://hellorip.com"&gt;Rip&lt;/a&gt; project. &lt;/p&gt;

&lt;p&gt;While there are already some alternatives (&lt;a href="http://github.com/wycats/bundler/tree/master"&gt;bundler&lt;/a&gt;, &lt;a href="http://rubyforge.org/projects/dependencies"&gt;dependencies&lt;/a&gt;), I like the elegant and lo-fi approach that &lt;a href="http://hellorip.com"&gt;Rip&lt;/a&gt; takes.&lt;/p&gt;

&lt;h3&gt;Environments&lt;/h3&gt;

&lt;p&gt;Rip lets you partition the dependencies you install into seperate 'environments'. When an environment is active, the installed versions are the &lt;em&gt;only&lt;/em&gt; ones that running code will be able to load. So, if you have one project that needs a specific version of &lt;a href="http://interblah.net/soup"&gt;soup&lt;/a&gt;, for example, you can install that version in an environment for that project. &lt;/p&gt;

&lt;p&gt;In your default environment, you can continue to upgrade/downgrade/play about with the gems and libraries that are installed, but as long as you activate the other, known-good environment when you are working with &lt;a href="http://interblah.net/soup"&gt;soup&lt;/a&gt;, you can be sure that none of the new versions will interfere. Each environment is like a sandbox.&lt;/p&gt;

&lt;p&gt;Unsurprisingly, it's a lot like the &lt;a href="http://whygitisbetterthanx.com/#cheap-local-branching"&gt;cheap branching that git brings&lt;/a&gt; - you can play around as much as you like, but always get your environment back to working state just by typing &lt;code&gt;rip use &amp;lt;environment&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;The elegance of Rip&lt;/h3&gt;

&lt;p&gt;I said above that I thought Rip was elegant, and that's because these environments are just subdirectories which are added to the &lt;code&gt;$RUBYLIB&lt;/code&gt; environment variable. This becomes part of the &lt;code&gt;$LOAD_PATH&lt;/code&gt; for your Ruby process. Regular &lt;code&gt;require&lt;/code&gt; statements will work as expected, and you don't even need to &lt;code&gt;require "rubygems"&lt;/code&gt; (which, it seems, &lt;a href="http://gist.github.com/54177"&gt;we shouldn't be doing anyway&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;All Rip really does is try to ensure that the 'active' environment is injected into the &lt;code&gt;$RUBYLIB&lt;/code&gt;; switching environments is really just moving a symlink; and the rest of the code deals with nuts and bolts of actually downloading libraries of code from various sources. Very simple, as most good things are.&lt;/p&gt;

&lt;p&gt;All in all, when it works it's a very pleasant development tool to use, and you could do worse than to spend a few minutes &lt;a href="http://hellorip.com"&gt;checking it out&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Gem dependencies&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://hellorip.com"&gt;Rip&lt;/a&gt; works with git repositories, directories on the local filesystem, or over HTTP, and has rudimentary support for install rubygems too. &lt;/p&gt;

&lt;p&gt;However, the current version (0.0.3) doesn't install any gem dependencies. So, if I want to play about with &lt;a href="http://monkrb.com"&gt;monk&lt;/a&gt;, which I did want to do today, Rip is only going to download the &lt;code&gt;monk&lt;/code&gt; gem itself, and not any of its dependencies. It's actually going to be a bit of a pain to even find out what the dependencies are.&lt;/p&gt;

&lt;p&gt;If I'm going really start putting Rip through its paces, I need to be able to quickly and reliably install the same libraries that I can install using normal Rubygems, including their dependencies.&lt;/p&gt;

&lt;h3&gt;Time to stop whining&lt;/h3&gt;

&lt;p&gt;So, today I rolled up my sleeves and taught Rip &lt;a href="http://github.com/lazyatom/rip/"&gt;how to download gem dependencies too&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It wasn't quite as easy as I hoped - it took me a bit of head-scratching to really figure out the relationship between Packages, the PackageManager, the Installer and the two GemPackages, but thanks to a bit of help from &lt;a href="http://github.com/cldwalker/rip/commit/625d2bddc6ba909e603e490bd7444e62add78fc5"&gt;Gabriel Horner's previous work&lt;/a&gt;, I have it working in a reasonably stable way.&lt;/p&gt;

&lt;p&gt;Here's &lt;a href="http://github.com/lazyatom/rip/"&gt;my fork of rip&lt;/a&gt; installing Rails:&lt;/p&gt;

&lt;p&gt;&lt;pre class="code shell"&gt;&lt;code&gt;➜  $ rip install rails&#13;
Searching gems.github.com for rails...&#13;
ERROR:  Could not find rails in any repository&#13;
Searching gems.rubyforge.org for rails...&#13;
Searching gems.github.com for rake...&#13;
ERROR:  Could not find rake in any repository&#13;
Searching gems.rubyforge.org for rake...&#13;
Searching gems.github.com for activesupport...&#13;
ERROR:  Could not find activesupport in any repository&#13;
Searching gems.rubyforge.org for activesupport...&#13;
Searching gems.github.com for activerecord...&#13;
ERROR:  Could not find activerecord in any repository&#13;
Searching gems.rubyforge.org for activerecord...&#13;
Searching gems.github.com for actionpack...&#13;
ERROR:  Could not find actionpack in any repository&#13;
Searching gems.rubyforge.org for actionpack...&#13;
Searching gems.github.com for actionmailer...&#13;
ERROR:  Could not find actionmailer in any repository&#13;
Searching gems.rubyforge.org for actionmailer...&#13;
Searching gems.github.com for activeresource...&#13;
ERROR:  Could not find activeresource in any repository&#13;
Searching gems.rubyforge.org for activeresource...&#13;
Successfully installed rake (0.8.7)&#13;
Successfully installed activesupport (2.3.3)&#13;
Successfully installed activerecord (2.3.3)&#13;
Searching gems.github.com for rack...&#13;
ERROR:  Could not find rack in any repository&#13;
Searching gems.rubyforge.org for rack...&#13;
Successfully installed rack (1.0.0)&#13;
Successfully installed actionpack (2.3.3)&#13;
Successfully installed actionmailer (2.3.3)&#13;
Successfully installed activeresource (2.3.3)&#13;
Successfully installed rails (2.3.3)&#13;
➜  $ &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;h2&gt;Next steps&lt;/h2&gt;

&lt;p&gt;I'm sure my approach could be improved. &lt;a href="http://github.com/defunkt/rip/issues#issue/1"&gt;Here's the issue&lt;/a&gt; on github, if you've got any feedback, or would like to see efforts here continue.&lt;/p&gt;

&lt;p&gt;I'd also quite like to have Rip respect the sources (and their ordering) as defined in &lt;code&gt;.gemrc&lt;/code&gt;, but that's just my preference.&lt;/p&gt;

&lt;p&gt;Now, to finally start playing with &lt;a href="http://monkrb.com"&gt;monk&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;(oh, btw, here's rip installing monk; I don't know why the dependencies gem needs wycats-thor...)&lt;/p&gt;

&lt;p&gt;&lt;pre class="code shell"&gt;&lt;code&gt;➜  $ rip install monk&#13;
Searching gems.github.com for monk...&#13;
ERROR:  Could not find monk in any repository&#13;
Searching gems.rubyforge.org for monk...&#13;
Searching gems.github.com for thor...&#13;
ERROR:  Could not find thor in any repository&#13;
Searching gems.rubyforge.org for thor...&#13;
Searching gems.github.com for dependencies...&#13;
ERROR:  Could not find dependencies in any repository&#13;
Searching gems.rubyforge.org for dependencies...&#13;
Successfully installed thor (0.11.5)&#13;
Searching gems.github.com for wycats-thor...&#13;
Successfully installed wycats-thor (0.11.5)&#13;
Successfully installed dependencies (0.0.6)&#13;
Successfully installed monk (0.0.5)&#13;
➜  $ &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;h2&gt;Another update, a few days later&lt;/h2&gt;

&lt;p&gt;You can see the gem dependency changes in the &lt;a href="http://hellorip.com"&gt;rip&lt;/a&gt; source now. It now delegates as much as it can to the &lt;code&gt;gem&lt;/code&gt; binary, which means it will respect the gem sources you already have installed (rubyforge, github, gemcutter and anything else).&lt;/p&gt;

&lt;h3&gt;Older versions of gems now install properly too&lt;/h3&gt;

&lt;p&gt;I had a bit of fun figuring out some kinks in the dependency identification for specific versions of rubygems. Normally, you can find out the dependencies of a gem, without installing it, by running&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem dependency &amp;lt;gem&amp;gt; --remote
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, this doesn't seem to work for many gems, particularly ones that aren't the most recent. For example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem dependency rails --remote
Gem rails-2.3.3
  rake (&amp;gt;= 0.8.3, runtime)
  activesupport (= 2.3.3, runtime)
  activerecord (= 2.3.3, runtime)
  actionpack (= 2.3.3, runtime)
  actionmailer (= 2.3.3, runtime)
  activeresource (= 2.3.3, runtime)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But when I try requesting the dependencies for a specific version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem dependency rails --version="2.2.2" --remote
No gems found matching rails (= 2.2.2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No dice. The simple solution we've adopted is to download the gem at the specific version requested, and then read the dependencies from the gem itself, using &lt;code&gt;gem specification&lt;/code&gt; to produce a YAML version of its &lt;code&gt;gemspec&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem fetch rails --version="2.2.2"
Downloaded rails-2.2.2
$ gem specification rails-2.2.2.gem 
--- !ruby/object:Gem::Specification 
name: rails
version: !ruby/object:Gem::Version 
  version: 2.2.2
platform: ruby
authors: 
- David Heinemeier Hansson
autorequire: 
bindir: bin
cert_chain: []

date: 2008-11-20 23:00:00 +00:00
default_executable: rails
dependencies: 
- !ruby/object:Gem::Dependency 
  name: rake
  type: :runtime
  version_requirement: 
  version_requirements: !ruby/object:Gem::Requirement 
    requirements: 
    - - "&amp;gt;="
      - !ruby/object:Gem::Version 
        version: 0.8.3
    version: 
(etc)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;File conflicts&lt;/h3&gt;

&lt;p&gt;One of the selling points of &lt;a href="http://hellorip.com"&gt;rip&lt;/a&gt; is that dependency issues are resolved when you are building the environment, and not when your application actually runs. As part of this, rip will now [warn you when one library is trying to overwrite a file that was already installed by another package][fil-conflicts]. This means that two packages can't both try to install a file called &lt;code&gt;node.rb&lt;/code&gt; (although they can install &lt;code&gt;package_a/node.rb&lt;/code&gt; and &lt;code&gt;package_b\node.rb&lt;/code&gt;, so nicely namespaced code will work just fine).&lt;/p&gt;

&lt;p&gt;However, this means that my &lt;code&gt;monkrb&lt;/code&gt; example doesn't work anymore, because of the &lt;code&gt;wycats-thor&lt;/code&gt; dependency:&lt;/p&gt;

&lt;p&gt;&lt;pre class="code shell"&gt;&lt;code&gt;➜  $ rip install monk&#13;
Successfully installed thor (0.11.5)&#13;
Some files from wycats-thor (0.11.5) conflict with those already installed by thor:&#13;
	lib/thor/actions/create_file.rb&#13;
	lib/thor/actions/directory.rb&#13;
	lib/thor/actions/empty_directory.rb&#13;
	lib/thor/actions/file_manipulation.rb&#13;
	lib/thor/actions/inject_into_file.rb&#13;
	lib/thor/actions.rb&#13;
	lib/thor/base.rb&#13;
	lib/thor/core_ext/hash_with_indifferent_access.rb&#13;
	lib/thor/core_ext/ordered_hash.rb&#13;
	lib/thor/error.rb&#13;
	lib/thor/group.rb&#13;
	lib/thor/invocation.rb&#13;
	lib/thor/parser/argument.rb&#13;
	lib/thor/parser/arguments.rb&#13;
	lib/thor/parser/option.rb&#13;
	lib/thor/parser/options.rb&#13;
	lib/thor/parser.rb&#13;
	lib/thor/rake_compat.rb&#13;
	lib/thor/runner.rb&#13;
	lib/thor/shell/basic.rb&#13;
	lib/thor/shell/color.rb&#13;
	lib/thor/shell.rb&#13;
	lib/thor/task.rb&#13;
	lib/thor/util.rb&#13;
	lib/thor.rb&#13;
	bin/rake2thor&#13;
	bin/thor&#13;
rip: installation failed&#13;
➜  $&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;The solution here isn't really clear. I think that the &lt;code&gt;dependencies&lt;/code&gt; gem shouldn't really depend on a user-specific version of &lt;code&gt;thor&lt;/code&gt;, and there's some kind of irony there. One way to proceed might be to add a new flag to &lt;code&gt;rip install&lt;/code&gt;, something like &lt;code&gt;rip install --no-dependencies&lt;/code&gt; which only installs the package in question and ignores its dependencies.&lt;/p&gt;

&lt;p&gt;Anyway, please do kick the tires around, join the &lt;a href="groups.google.com/group/rip-rb"&gt;mailing list&lt;/a&gt; and contribute!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>gem-this-0-2-1</title>
    <id>tag:interblah.net,Thu:/gem-this-0-2-1</id>
    <updated>2009-08-13T14:38:14+00:00</updated>
    <published>2009-07-23T11:59:47+00:00</published>
    <link href="http://interblah.net/gem-this-0-2-1"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Gem This, now a Gem Command&lt;/h1&gt;

&lt;p&gt;With the latest release of my vanity gem creation tool, I've made it a tiny bit simpler to turn an existing project into a gem, by valthropomorphosizing &lt;a href="http://interblah.net/gem-this"&gt;gem-this&lt;/a&gt; into a gem command. BEHOLD:&lt;/p&gt;

&lt;p&gt;&lt;pre class="code shell"&gt;&lt;code&gt;$ mkdir my_lib
$ cd my_lib
$ mate sweet_codez.rb
# .... hack away
$ gem this&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Note the lack of hyphen! That's right, it's as if &lt;a href="http://interblah.net/gem-this"&gt;gem-this&lt;/a&gt; was built directly into rubygems itself. Take that!&lt;/p&gt;

&lt;p&gt;To find out more about &lt;a href="http://interblah.net/gem-this"&gt;gem-this&lt;/a&gt;, click on the links.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>regarding-plus-ones</title>
    <id>tag:interblah.net,Thu:/regarding-plus-ones</id>
    <updated>2009-07-16T16:46:25+00:00</updated>
    <published>2009-07-16T12:30:16+00:00</published>
    <link href="http://interblah.net/regarding-plus-ones"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Regarding +1&lt;/h1&gt;

&lt;p&gt;There's been a little bit of &lt;a href="https://twitter.com/rarepleasures/status/2668900394"&gt;debate&lt;/a&gt; over Twitter and on the LRUG mailing list about the validity of "+/-1" as a response. I'm not a huge fan for a few reasons, and I thought it was worth trying to write them down, for my own clarification more than anything else&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's an oversimplification.&lt;/li&gt;
&lt;li&gt;It doesn't provide any context.&lt;/li&gt;
&lt;li&gt;It's faddish.&lt;/li&gt;
&lt;li&gt;It's lazy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, unless I'm asking a clear yes-or-no question, and I've explicitly said that I don't want to entertain discussion, I think I would prefer to not hear from anyone who only responds with '+1'.&lt;/p&gt;

&lt;h2&gt;Disclaimer&lt;/h2&gt;

&lt;p&gt;Bear in mind that these are just my cranky opinions, the internet is for the young and I am so old now. So very, very old. So please don't be offended if you disagree, and/or you love +1-ing things left, right and centre. It could well be that I'm wrong.&lt;/p&gt;

&lt;p&gt;Except I'm not.&lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;h2&gt;It's an oversimplication&lt;/h2&gt;

&lt;p&gt;Let's imagine that you and I are good friends. I write you an email one day:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Hey, come round to my place and lets have some dinner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You respond&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;+1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This example is trite, but most of the &lt;em&gt;real&lt;/em&gt; uses of this behaviour are so dull and specific as to not bear writing about. I have to keep this interesting to me so that I can make it to the end of my rant, hence the silly example, but all my points still hold true in reality. For me, anyway (see above: I'm a crank). Anyway.&lt;/p&gt;

&lt;p&gt;Apart from sounding a bit like a weird robot (and we'll get to that later), all I can infer from that is... some sort of positive response. The conversation hasn't really progressed, other than I know that you're happy to come round and eat my food. Beyond that, I don't really know any more about what you think about dinner. To be honest, you're sounding pretty ungrateful, but we're buddies and so I'll forgive you.&lt;/p&gt;

&lt;h2&gt;It doesn't provide any context&lt;/h2&gt;

&lt;p&gt;So you're coming round for dinner, and I'm cooking up some delicious Steak Tartare. Or not cooking in this case, because that's raw beef mince with raw egg and a little bit of seasoning. Drooling yet?&lt;/p&gt;

&lt;p&gt;In your '+1' response, you basically gave up your opportunity to provide any context about what you might like. You could've told me what sort of food you like, or any ingredients that you've recently become allergic to (you are a bit of a hypochondriac, but we'll save that for a proper intervention, this is just dinner). You could've said something like&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Sounds good. I feel like Mexican, what do you think? How about I bring the nachos and some tequila?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But no, all I get is a +5V on pin 1 of the conversation. Do you even have thoughts or feelings? Do you know what it means to cry, but it's something you can never do? YOU ROBOT.&lt;/p&gt;

&lt;h2&gt;It's faddish&lt;/h2&gt;

&lt;p&gt;We know each other, and so you know that we both love technology more than life itself. Except, well... I am also a person too. And I like conversation, and language. If all I interested in was sounding like a computer to my computery friends, why would I bother leaving my sweet DSL connection to come round for food? I could just dial up Pizza Hut and say "aaaaaaaaffirmative" when they asked me if I wanted my Meatsplosion Special on their new wrapped-entirely-in-cheese-then-deep-fried base.&lt;/p&gt;

&lt;p&gt;But I'm not like that; I'm literate, and I like talking to other people because that's more interesting. If our dinner conversation is going to be along the lines of  "Hey, did you like the BSG finale?", &lt;em&gt;&amp;laquo;(robot voice) MINUS ONE&amp;raquo;&lt;/em&gt; then I'm probably not going to invite you back for a while.&lt;/p&gt;

&lt;p&gt;Yes, it seems to be all the rage now in our computery circles, and everyone's doing it, but that doesn't mean that it's &lt;em&gt;cool&lt;/em&gt;. I'd rather know a bit more about what you're thinking. Hence:&lt;/p&gt;

&lt;h2&gt;It's lazy&lt;/h2&gt;

&lt;p&gt;Yep. Twitter and text messages have taught us the value of brevity, but at what price? Now everything seems to be either &lt;em&gt;awesome&lt;/em&gt; or &lt;em&gt;MADE. OF. FAIL.&lt;/em&gt; and so on, without any kind of context or reasoning. &lt;/p&gt;

&lt;p&gt;Your '+1' doesn't tell me anything about why you are in favour of something; it's simply the fewest characters you could type to increase the likelyhood of something happening in a way you just to be positive for yourself. Is it really so much more expensive for you to saying something along the lines of "Sounds good, great suggestion", that you can't take the extra time to do it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use your words, my friend. Use your words.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ARGARGAGARAHGRAHGARAHRGHARHFAHARGHarghahrahgrahgrhahahaaaaaaaaaargargarghahrag
ahahaharhaghrahgrajraHGEHRGARHGEHRHAERGHAERGHAERGHAEHGRAEIAEIADFSADPSAFPAPERPJO
AERJPGAEP EGRAOPAPOERAJUAPIJGAE?IGAHAEHAGERHERIAHPIFIAPWIEFAPWJR(A£F)J(J£$FW@JF(WFJ£F
JC(£$JVAJVM£JA£$)(G£GCJ A£GJ ok I'm fine now. Please continue with your emailing and stuff.&lt;/p&gt;

&lt;h2&gt;Let me know what you think&lt;/h2&gt;

&lt;p&gt;&lt;button onclick="alert('ARE YOU KIDDING?!')"&gt;+1&lt;/button&gt;
&lt;button onclick="alert('ARE YOU KIDDING?!')"&gt;-1&lt;/button&gt;&lt;/p&gt;

&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;

&lt;h2&gt;Update&lt;/h2&gt;

&lt;p&gt;Chris Wanstrath &lt;a href="https://twitter.com/defunkt/status/2672683657"&gt;makes the point&lt;/a&gt; that a more typical use of '+1' is where two parties are in conversation and a third party wants to support one side or statement over another, and I think he's right to identify that as a typical scenario. My own example was and is fairly trite. &lt;/p&gt;

&lt;p&gt;Now that I have my rage contained, I can calmly blame the medium of communication, since there's no way to 'nod your head' in email - you have to use an envelope of the same significance as the rest of the conversation (an 'email', in this case, but it could be a tweet, or a comment). &lt;/p&gt;

&lt;p&gt;Is this more reasonable? Maybe. But.&lt;/p&gt;

&lt;p&gt;I would still prefer it, in my cranky little hermit-world, if people produced more constructive responses, and engaged in the discussion properly, rather than staying on the sidelines and nodding. It's easy to nod. It doesn't even require any understanding. There's no way for me to evaluate, upon receipt of your '+1', that you have any clue about what I'm talking about. It's still lazy, I'm afraid.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>accessing-rdoc-fast-using-quicksilver</title>
    <id>tag:interblah.net,Wed:/accessing-rdoc-fast-using-quicksilver</id>
    <updated>2009-06-15T10:32:50+00:00</updated>
    <published>2009-06-10T09:32:38+00:00</published>
    <link href="http://interblah.net/accessing-rdoc-fast-using-quicksilver"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Accessing RDoc fast using Quicksilver&lt;/h1&gt;

&lt;p&gt;Inspired by &lt;a href="http://mocra.com/2009/04/24/accessing-rails-documentation-fast/"&gt;this&lt;/a&gt;, but prefering &lt;a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver"&gt;Quicksilver&lt;/a&gt; to &lt;a href="http://www.obdev.at/products/launchbar/index.html"&gt;LaunchBar&lt;/a&gt;, I hacked up a neat little way to browse the excellent &lt;a href="http://railsapi.com/"&gt;RailsApi&lt;/a&gt; docs using a Quicksilver trigger. It's pretty simple to setup, and most of the credit goes to the &lt;a href="http://mocra.com/2009/04/24/accessing-rails-documentation-fast/"&gt;original post&lt;/a&gt; and &lt;a href="http://coelomic.wordpress.com/2006/01/02/quicksilver-tips/"&gt;this trigger tutorial&lt;/a&gt;. Here's how to do it:&lt;/p&gt;

&lt;p&gt;As a bonus, you can also &lt;a href="#action"&gt;install this as an action&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Download the docs&lt;/h2&gt;

&lt;p&gt;Download the appropriate RDoc zip from &lt;a href="http://railsapi.com/"&gt;RailsApi&lt;/a&gt;. Here's what the interface looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/railsapi.png" alt="Selecting the rdoc to include in the downloaded RailsApi bundle"/&gt;&lt;/p&gt;

&lt;p&gt;I chose basically everything, and I've unzip mine into &lt;code&gt;~/Sites/rdoc&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Create a virtual host&lt;/h2&gt;

&lt;p&gt;Next, we need some way of accessing the documentation. You can, of course, just double click the &lt;code&gt;index.html&lt;/code&gt; file in the unzipped directory, but some of the later steps don't seem to like &lt;code&gt;file://&lt;/code&gt; urls, so I've set up a really simple apache virtual host, using a tool I stole from &lt;a href="http://chrisroos.co.uk"&gt;Chris Roos&lt;/a&gt; called &lt;a href="http://github.com/lazyatom/hostess"&gt;hostess&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install hostess
sudo hostess create rdoc.local /Users/james/Sites/rdoc
chmod -R a+r /Users/james/Sites/rdoc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will create a new virtual host for our RDoc, so we can access it using http://rdoc.local. Note that you must ensure that Apache can actually serve those files by making them readable by everyone.&lt;/p&gt;

&lt;p&gt;It's worth visiting the new virtual host now (http://rdoc.local) to make sure that it's all working.&lt;/p&gt;

&lt;h2&gt;Add the Quicksilver trigger&lt;/h2&gt;

&lt;p&gt;Following the instructions &lt;a href="http://coelomic.wordpress.com/2006/01/02/quicksilver-tips/"&gt;here&lt;/a&gt;, it's pretty simple to setup a custom keystroke trigger. First, copy this url:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://rdoc.local/?q=***
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then open Quicksilver preferences (activate Quicksilver via whatever trigger you've set up, then type cmd+,), and choose the triggers tab&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/triggers.png" alt="The Quicksilver triggers interface"/&gt;&lt;/p&gt;

&lt;p&gt;Click on the + at the bottom to add a new hotkey&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/hotkey.png" alt="Adding a hotkey"/&gt;&lt;/p&gt;

&lt;p&gt;Double click on the new entry, and you'll see this window drop down:&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/new_trigger.png" alt="Setting the trigger"/&gt;&lt;/p&gt;

&lt;p&gt;Now, &lt;em&gt;paste&lt;/em&gt; in the url from above. You should see it populate the fields of the new trigger panel (though yours probably won't say 'ruby method' at the bottom, it's important that there is some text in there):&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/paste_in.png" alt="Pasting in the trigger url"/&gt;&lt;/p&gt;

&lt;p&gt;Finally, you'll want to set a hotkey for the trigger. I've chosen cmd+alt+ctrl+R, but you can choose whatever you like. Double click on your trigger under the 'Trigger' column, and you'll see this panel:&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/key.png" alt="Setting the hotkey"/&gt;&lt;/p&gt;

&lt;p&gt;Click on the 'edit' button, and then press all the keys for your trigger keystroke.&lt;/p&gt;

&lt;p&gt;Now you're good to go. Hit your trigger, then type the method name (or partial match), and hit enter.&lt;/p&gt;

&lt;p&gt;&lt;img src="/assets/rdoc_quicksilver/quicksilver.png" alt="Using the trigger"/&gt;&lt;/p&gt;

&lt;p&gt;Boom - your local Ruby documentation will be opened, with the search performed.&lt;/p&gt;

&lt;h2 id="action"&gt;Installing as a Quicksilver action&lt;/h2&gt;

&lt;p&gt;Another way of doing is is using Quicksilver actions. This lets you type some text, then hit tab and type 'rdoc', and then hit enter to perform your search. As you can see, the flow is flipped around a bit, but some people might prefer it this way. Open Script Editor, and paste in this script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using terms from application "Quicksilver"
  on process text query
    set rdoc_url to "http://rdoc.local/?q=" &amp;amp; query
      tell application "Finder"
      open location rdoc_url
    end tell
  end process text
end using terms from
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save this script as 'RDoc' in &lt;code&gt;~/Library/Application Support/Quicksilver/Actions&lt;/code&gt;, and restart Quicksilver. Double Boom.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>freeagent-widget</title>
    <id>tag:interblah.net,Wed:/freeagent-widget</id>
    <updated>2009-09-08T08:42:17+00:00</updated>
    <published>2009-04-22T07:33:04+00:00</published>
    <link href="http://interblah.net/freeagent-widget"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;FreeAgent Widget for Mac Dashboard&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://lazyatom.com"&gt;Going freelance&lt;/a&gt; has introduced me to a whole bunch of new chores and challenges, two of which are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;figuring out how to deal with the legal and financial side of being a company, and&lt;/li&gt;
&lt;li&gt;keeping track of how I spend my time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully, there's a tool which seems to hit the spot in terms of power and simplicity - &lt;a href="http://www.freeagentcentral.com?referrer=31h0wcs9"&gt;FreeAgent&lt;/a&gt;. It seems to strike a great balance between gather all the information about expenses, payroll, taxes, invoices, timesheets and bills, whilst not requiring me to study accountancy to make progress.&lt;/p&gt;

&lt;p&gt;Anyway, on my latest project (working with &lt;a href="http://newleaders.com"&gt;New Leaders&lt;/a&gt; via &lt;a href="http://gofreerange.com"&gt;Free Range&lt;/a&gt;), I'm tracking my time in a relatively detailed way, and I thought it would be good to make use of the &lt;a href="http://www.freeagentcentral.com/tour/time-tracking?referrer=31h0wcs9"&gt;timesheet functionality&lt;/a&gt; that I'm already paying for. But, it's a pain to go to the website every time I need to track a task. So:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/lazyatom/freeagent-widget"&gt;&lt;img src="http://interblah.net/assets/freeagent-widget-1.2.png" alt="FreeAgent Timesheets Widget"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://public.lazyatom.com/FreeAgent-1.3.1.zip"&gt;Download FreeAgent Widget 1.3 here&lt;/a&gt;. This is a Mac Dashboard widget, and so only works on Mac OS X.&lt;/p&gt;

&lt;p&gt;It's fairly simple, functionally, but covers everything I need. Once you fill in your &lt;a href="http://www.freeagentcentral.com?referrer=31h0wcs9"&gt;FreeAgent&lt;/a&gt; details, it will load your projects, and choosing a project will load the available tasks for that project. Hit the big middle button to start/pause timing, and then clicking "Post" will post that time to your account. I've added a few neat little tricks - try double-clicking the time and typing "1h30", for example.&lt;/p&gt;

&lt;p&gt;It's not hugely sophisticated - you can't manage your existing timesheets, or add a timesheet for another day - but clicking the 'timeslips' text will take you straight to your timesheets on the site should you need that.&lt;/p&gt;

&lt;p&gt;I hope it's useful for some people, and of course, since it's &lt;a href="http://github.com/lazyatom/freeagent-widget"&gt;on GitHub&lt;/a&gt; you're free to fork and improve it. I'm also keen to try the new &lt;a href="http://github.com/lazyatom/freeagent-widget/issues"&gt;github issues&lt;/a&gt; feature if you're having any problems.&lt;/p&gt;

&lt;p&gt;&lt;a name="updates"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Updates&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;v1.3 - now stores any unposted time between restarts&lt;/li&gt;
&lt;li&gt;v1.2 - now lets you add a comment to your timeslip, to help keep track of the specifics of what you're working on&lt;/li&gt;
&lt;li&gt;v1.1.1 - now only shows 'Active' projects. Great suggestion, folks. &lt;a href="http://github.com/lazyatom/freeagent-widget/issues"&gt;Keep 'em coming!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thanks for the &lt;a href="http://freeagentcentral.com/central/free-time-tracking-widget"&gt;mention on the FreeAgent blog&lt;/a&gt; :)&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>gem-this</title>
    <id>tag:interblah.net,Mon:/gem-this</id>
    <updated>2009-04-06T11:26:20+00:00</updated>
    <published>2009-04-06T11:14:18+00:00</published>
    <link href="http://interblah.net/gem-this"/>
    <author>
      <name>james</name>
    </author>
    <content type="html">&lt;h1&gt;Gem This&lt;/h1&gt;

&lt;p&gt;Most of the time, I don’t set out to write a gem.&lt;/p&gt;

&lt;p&gt;But, sometimes, after a bit of time (which could be days, weeks or months) spent working on some code, I might decide that I have something worth making a gem.&lt;/p&gt;

&lt;p&gt;It seems like many (if not all) of the existing gem-tools do some things that don't really thrill me. Either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They add themselves as a dependency, meaning that when someone installs my gem, they must install the gem-tool&lt;/li&gt;
&lt;li&gt;They expect to be used at the very start of development, creating a directory structure and imposing opinions left, right and centre&lt;/li&gt;
&lt;li&gt;Despite the "bonus functionality" of automatically uploading a website and blogging for me, the obscure what's actually going on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This doesn't suit the way I work, at all. I don't want to force anyone to download anything other than the code that is useful to them, and I already have my project set up the way I like. I just want to turn this library into a gem!&lt;/p&gt;

&lt;h2&gt;What I Want&lt;/h2&gt;

&lt;p&gt;My code is already there; it's in an appropriate set of folders, and probably has existing Rake tasks. All that I'm missing is the ability to build the gem, maybe push it to RubyForge, and build the RDoc. Perhaps I'm storing the code on github, so producing a &lt;code&gt;.gemspec&lt;/code&gt; file is good too. And, most importantly, I want to be able to hack it to suit each project, without any further interference or opinionation.&lt;/p&gt;

&lt;p&gt;It's simple enough to achieve this; all you really need is a few standard tasks in your &lt;code&gt;Rakefile&lt;/code&gt;. So, I wrote a little tool to spit some fairly standard and easy-to-understand code into an existing &lt;code&gt;Rakefile&lt;/code&gt; on my behalf. If I already have tests (or specs), it will produce a simple task to run those, and if there's a &lt;code&gt;bin&lt;/code&gt; directory it will hook that up too, but that's pretty much it.&lt;/p&gt;

&lt;p&gt;It's called &lt;a href="http://github.com/lazyatom/gem-this"&gt;gem-this&lt;/a&gt;; fork at will.&lt;/p&gt;

&lt;p&gt;It's definitely not for everybody - I'm sure plenty of people get lots of mileage out of the existing tools and having a generated, standard structure for their gem code. I just don't find it very useful, personally.&lt;/p&gt;</content>
  </entry>
</feed>
