<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!--Generated by Site Server v6.0.0 (http://www.squarespace.com) on Mon, 29 Apr 2013 06:26:32 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Tim Riley</title><link>http://openmonkey.com/</link><lastBuildDate>Tue, 16 Apr 2013 07:13:05 +0000</lastBuildDate><language>en-US</language><generator>Site Server v6.0.0 (http://www.squarespace.com)</generator><description /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlahBlahWoofWoof" /><feedburner:info uri="blahblahwoofwoof" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>A Manageable Multi-Database Redis Development Setup</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 16 Apr 2013 01:32:39 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/7DqHrQvF2ZE/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:516caa42e4b0bb1f91d309cc</guid><description>&lt;p&gt;&lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; has quickly become the companion to Postgres in most of our Rails apps. This creates a problem for development, since a Redis server only uses numbered databases. That's 1-16 by default. Hardly memorable, unless your app is called "5", in which case you're golden. On a single machine alone, it's easy enough to lose track of them once you have a few apps connecting to redis for both development and testing databases. Once you have multiple developers and designers working on an app, it's even worse. The solution I've found is to run a separate Redis server for each app, listening via a named socket.&lt;/p&gt;

&lt;p&gt;This is easy to set up. First, take your standard Redis config file (mine is &lt;code&gt;/usr/local/etc/redis.conf&lt;/code&gt;, thanks to &lt;a href="http://mxcl.github.io/homebrew/"&gt;Homebrew&lt;/a&gt;) and copy it  to &lt;code&gt;redis-common.conf&lt;/code&gt;. Edit this new file and change its &lt;code&gt;port&lt;/code&gt; to &lt;code&gt;port 0&lt;/code&gt;, ensuring it doesn't listen over TCP.&lt;/p&gt;

&lt;p&gt;Then, create a separate config file for each app you want to use Redis. I call them &lt;code&gt;/usr/local/etc/redis-server-&amp;lt;app_name&amp;gt;.conf&lt;/code&gt;. These files are nice and short:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;include /usr/local/etc/redis-common.conf
pidfile /usr/local/var/run/redis-app_name.pid
unixsocket /tmp/redis-app_name.sock
dbfilename dump-app_name.rdb
vm-swap-file /tmp/redis-app_name.swap
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These per-app config files are enough to run an entire Redis instance: they load the common config, followed by the app-specific paths that allow the server to run in isolation from other apps.&lt;/p&gt;

&lt;p&gt;You can then start the Redis server like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;redis-server /usr/local/etc/redis-server-app_name.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Currently, I have 5 different app-specific configs like this. This makes bringing Redis up and down a bit of a chore. I simplified the process with a couple of shell functions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function redstart {
  redstop
  for file in `ls /usr/local/etc/redis-server-*.conf`; do
    redis-server $file
  done
}

function redstop {
  for file in `ls /usr/local/etc/redis-server-*.conf`; do
    pidfile=`grep pidfile $file | awk '{print $2}'`
    if [ -f $pidfile ]; then
      kill `cat $pidfile`
    fi
  done
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Easy. Redis up and Redis down in one hit.&lt;/p&gt;

&lt;p&gt;There's another benefit to running Redis like this: loading production data onto your development machine. Most cloud-hosted Redis providers give you backups in Redis' &lt;code&gt;.rdb&lt;/code&gt; format, which is the data file for the &lt;em&gt;whole server.&lt;/em&gt; You can't load this for a single numbered database. Splitting your local Redis servers by app means you can just replace the file specified in &lt;code&gt;dbfilename&lt;/code&gt; with this backup file and now your app has the latest production data without interfering with any other app's Redis data.&lt;/p&gt;

&lt;h2&gt;Bonus: Redis config management functions&lt;/h2&gt;

&lt;p&gt;Want an easier way to build and manage those per-app config files? Here you go:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function redls {
  ls /usr/local/etc/redis-server-*.conf
}

function redgen {
  if [ -z "$1" ]; then
    echo "You need to specify an app name, eg. redgen decafsucks"
    return 1
  fi

  app=$1
  config="/usr/local/etc/redis-server-${app}.conf"

  redstop

  echo "include /usr/local/etc/redis-common.conf"     &amp;gt; $config
  echo "pidfile /usr/local/var/run/redis-${app}.pid"  &amp;gt;&amp;gt; $config
  echo "unixsocket /tmp/redis-${app}.sock"            &amp;gt;&amp;gt; $config
  echo "dbfilename dump-${app}.rdb"                   &amp;gt;&amp;gt; $config
  echo "vm-swap-file /tmp/redis-${app}.swap"          &amp;gt;&amp;gt; $config

  redstart
}

function redrm {
  if [ -z "$1" ]; then
    echo "You need to specify an app name, eg. redrm decafsucks"
    return 1
  fi

  redstop
  rm -f "/usr/local/etc/redis-server-${app}.conf"
  redstart
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Bonus: Rails redis initializer&lt;/h2&gt;

&lt;p&gt;Here is the do-it-all Redis initializer I use in my Rails apps:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require "redis"

if (redis_url = ENV["REDIS_URL"] || ENV["REDISTOGO_URL"]).present?
  uri = URI.parse(redis_url)
  REDIS = Redis.new(
    host: uri.host,
    port: uri.port,
    password: uri.password)
else
  redis_socket = "/tmp/redis-myappname.sock"
  if File.exist?(redis_socket)
    REDIS = Redis.new(
      path: redis_socket,
      db: !Rails.env.test? ? 0 : 1)
  else
    REDIS = Redis.new(
      host: "localhost",
      port: 6379,
      db: !Rails.env.test? ? 0 : 1)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This looks for Redis URL &lt;code&gt;ENV&lt;/code&gt; vars first, which are used on Heroku to specify the Redis location. If they're not found, we must be in development, so it looks for the named Redis socket for the app (change &lt;code&gt;redis_socket&lt;/code&gt; to make it your own). If that's there, it uses database 0 for Rails development and production modes, and database 1 for test. Finally, we don't want to fail completely if someone hasn't yet starting using the named redis sockets, so we fall back to the standard Redis TCP port.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2013/4/16/a-manageable-multi-database-redis-development-setup"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/7DqHrQvF2ZE" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/a-manageable-multi-database-redis-development-setup/</feedburner:origLink></item><item><title>There is No Lab</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 12 Mar 2013 21:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/W89cLqiJ08Y/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:5157f748e4b0fc0d946a9ae8</guid><description>&lt;p&gt;Much has been said about remote work lately. Yahoo! brought it to the fore when CEO Marissa Mayer &lt;a href="http://allthingsd.com/20130222/physically-together-heres-the-internal-yahoo-no-work-from-home-memo-which-extends-beyond-remote-workers/"&gt;completely cancelled their remote work policy&lt;/a&gt; a few weeks ago. It made &lt;a href="http://www.economist.com/news/leaders/21572767-forcing-workers-come-office-symptom-yahoos-problems-not-solution"&gt;mainstream press&lt;/a&gt; and quickly &lt;a href="http://37signals.com/svn/posts/3453-no-more-remote-work-at-yahoo"&gt;raised the ire&lt;/a&gt; of David Heinemeier Hansson, whose beliefs about remote work have shaped his life: half of his 37signals co-workers are remote and he too spends half his year working abroad.&lt;/p&gt;

&lt;p&gt;At &lt;a href="http://icelab.com.au/"&gt;Icelab&lt;/a&gt; we don't have so much a formal policy about remote work (or about anything, really), but instead some simple guiding principles: work with good people to make good things, and as long as we can keep the business running, do whatever we can to help those people lead the lives they want.&lt;/p&gt;

&lt;p&gt;I try to embody these principles: I spent the bulk of last year working from the Philippines and Hong Kong — and just this afternoon, I’ll fly off to Tokyo, the first leg in a trip that will see me working from five countries across three continents over the course of this year. It's allowing me to see the world in a way never before possible. Hugh's done some of this too, also checking in from Tokyo for a month at the start of last year. And in a couple of weeks, David's heading to Europe for a holiday and can extend it a little while by doing some work over there too.&lt;/p&gt;

&lt;p&gt;Having people work from overseas has been no problem at all. In fact, 2012 was &lt;a href="http://icelab.com.au/articles/icelab-in-2012/"&gt;our biggest, most productive year yet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remote work isn't all about extending a holiday or seeing the world. It can also be about finding the right space for productivity in everyday life. Even Yahoo! recognised that you can't be chained to the office, that "occasionally [you] have to stay home for the cable guy," but this is more a sign of their failure to recognise the intrinsic value in a change of environment. As The Economist &lt;a href="http://www.economist.com/news/leaders/21572767-forcing-workers-come-office-symptom-yahoos-problems-not-solution"&gt;argued&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Plenty of evidence suggests that letting employees work from home is good for productivity. It allows them to use their time more efficiently and to spend more time with their families and less fuming in traffic jams or squashed on trains… You can shackle a Yahoo to his desk, but you can't make him feel the buzz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We make our offices as comfortable and conducive to productivity as possible, but good work doesn't always happen from the same place. Good people, on the other hand, are good people &lt;em&gt;everyday&lt;/em&gt;, regardless of their location.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2013/3/13/there-is-no-lab"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/W89cLqiJ08Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/there-is-no-lab/</feedburner:origLink></item><item><title>Click to Edit with AngularJS</title><dc:creator>Tim Riley</dc:creator><pubDate>Fri, 11 Jan 2013 02:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/-8qiQwZp4hU/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:5157f6d5e4b052be7734c808</guid><description>&lt;p&gt;Every time I use &lt;a href="http://angularjs.org/"&gt;AngularJS&lt;/a&gt; I love it a little more. One of my favourite things about it is how greatly it reduces &lt;em&gt;ceremony&lt;/em&gt; and &lt;em&gt;separation.&lt;/em&gt; When I'm writing front-end interactions, the last thing I want to be doing is jumping between files and maintaining state in two different places, especially for simple things like "click to edit" behaviour. That's what I'll show you now, done powerfully and directly in Angular:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-app&amp;gt;
  &amp;lt;div ng-controller="ClickToEditCtrl"&amp;gt;
    &amp;lt;div ng-hide="editorEnabled"&amp;gt;
      {{title}}
      &amp;lt;a href="#" ng-click="editorEnabled=!editorEnabled"&amp;gt;Edit title&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div ng-show="editorEnabled"&amp;gt;
      &amp;lt;input ng-model="title"&amp;gt;
      &amp;lt;a href="#" ng-click="editorEnabled=!editorEnabled"&amp;gt;Done editing?&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://jsfiddle.net/timriley/5DMjt/"&gt;Try this jsfiddle to see it in action&lt;/a&gt;. What we're doing is showing some text (an article's title in this example) and then revealing a field to edit it upon clicking an "Edit" link.&lt;/p&gt;

&lt;p&gt;To achieve this, we use an Angular &lt;code&gt;editorEnabled&lt;/code&gt; model (really just a flag here) that we check with &lt;code&gt;ng-show&lt;/code&gt; and &lt;code&gt;ng-hide&lt;/code&gt; directives to hide and show the various parts of the interface. We change this value using an &lt;code&gt;ng-click&lt;/code&gt; directive on the hide and show links. Angular's data binding keeps everything in sync. As soon as &lt;code&gt;editorEnabled&lt;/code&gt; flips between true and false, the interface reacts accordingly. And the best thing? Everything you need can be written directly in the markup.&lt;/p&gt;

&lt;p&gt;The only bit of JavaScript is just the most basic setup for the Angular &lt;a href="http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller"&gt;controller&lt;/a&gt;, providing an initial value for the title:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function ClickToEditCtrl($scope) {
  $scope.title = "Welcome to this demo!";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For some more sophisticated behaviour, you can put some more code in the controller. Let's change the interface to show  "save" and "cancel" links when editing the title, and only update the title if the "save" link is pressed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-app&amp;gt;
  &amp;lt;div ng-controller="ClickToEditCtrl"&amp;gt;
    &amp;lt;div ng-hide="editorEnabled"&amp;gt;
      {{title}}
      &amp;lt;a href="#" ng-click="enableEditor()"&amp;gt;Edit title&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div ng-show="editorEnabled"&amp;gt;
      &amp;lt;input ng-model="editableTitle" ng-show="editorEnabled"&amp;gt;
      &amp;lt;a href="#" ng-click="save()"&amp;gt;Save&amp;lt;/a&amp;gt;
      or
      &amp;lt;a href="#" ng-click="disableEditor()"&amp;gt;cancel&amp;lt;/a&amp;gt;.
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://jsfiddle.net/timriley/GVCP2/"&gt;See it in this jsfiddle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code in the corresponding controller doesn't need to worry about the interface at all, it just operates on the scope, and the interface updates itself accordingly.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function ClickToEditCtrl($scope) {
  $scope.title = "Welcome to this demo!";
  $scope.editorEnabled = false;

  $scope.enableEditor = function() {
    $scope.editorEnabled = true;
    $scope.editableTitle = $scope.title;
  };

  $scope.disableEditor = function() {
    $scope.editorEnabled = false;
  };

  $scope.save = function() {
    $scope.title = $scope.editableTitle;
    $scope.disableEditor();
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you wanted to extend this even further and make it a reusable component for different parts of your interface, you would make it a &lt;a href="http://docs.angularjs.org/guide/directive"&gt;custom directive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the other great things about AngularJS is that you can use it as much or as little as you like. We've used it for the entirety of &lt;a href="http://thethousands.com.au/"&gt;The Thousands'&lt;/a&gt; admin interface, so adding bits of behaviour like this is no problem. But even if you're not already using it, you can just as easily attach an &lt;code&gt;ng-app&lt;/code&gt; to any one of your HTML elements and get started.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2013/1/11/click-to-edit-with-angularjs"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/-8qiQwZp4hU" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/click-to-edit-with-angularjs/</feedburner:origLink></item><item><title>Announcing Decaf Sucks 1.1</title><category>Announcements</category><dc:creator>Tim Riley</dc:creator><pubDate>Thu, 10 Jan 2013 08:00:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/6SfLm0AL79s/announcing-decaf-sucks-11</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50efc6bde4b06fe5ad282b8e</guid><description>&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50efc700e4b04835411495ff/1357891329513/ds-1.1-promo.png?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;It's &lt;a href="http://icelab.com.au/articles/decaf-sucks-launch-countdown-a-restrospective/"&gt;been a while&lt;/a&gt; since we've talked about &lt;a href="http://decafsucks.com/"&gt;Decaf Sucks&lt;/a&gt; on the iPhone. Our first release has run smoothly for a year and a half, helping many thousands of iPhone owners find better coffee. Thanks to our well caffeinated contributors, nearly half of our reviews are now submitted from the app.&lt;/p&gt;

&lt;p&gt;On this note, we're very excited to announce the release of Decaf Sucks version 1.1 &lt;a href="https://itunes.apple.com/au/app/decaf-sucks/id458958884?mt=8"&gt;in the App Store&lt;/a&gt;. This release makes it even easier to contribute reviews with the addition of Facebook login support (now available wherever Decaf Sucks exists).&lt;/p&gt;

&lt;p&gt;We've also added support for the iOS 6 and the larger iPhone 5 display, as well as giving the app some extra polish all around. In particular, our overseas friends can rest easy, because the distance to your favourite cafes is now reported in miles or kilometres based on the device's region format setting.&lt;/p&gt;

&lt;p&gt;Decaf Sucks 1.1 is &lt;em&gt;still free&lt;/em&gt; and &lt;a href="https://itunes.apple.com/au/app/decaf-sucks/id458958884?mt=8"&gt;waiting for you in the App Store&lt;/a&gt;. Get it now and find some great coffee near you!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Read on for a full list of all the things we've changed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login with Facebook to write reviews&lt;/li&gt;
&lt;li&gt;Support for the larger iPhone 5 display&lt;/li&gt;
&lt;li&gt;Distance units are localised into miles or kilometres based on the device's settings&lt;/li&gt;
&lt;li&gt;iOS 6 compatibility updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Other improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When setting a cafe's location, show a callout above the map pin to make it clear that it can be dragged around.&lt;/li&gt;
&lt;li&gt;When setting a cafe's location, ensure that the pin is actually draggable on the first tap.&lt;/li&gt;
&lt;li&gt;When setting a cafe's location, always show a proper full address after dragging the pin around.&lt;/li&gt;
&lt;li&gt;Show a proper non-retina image for the back button's pressed state.&lt;/li&gt;
&lt;li&gt;Fix a bug that sometimes caused the map view to start very zoomed out.&lt;/li&gt;
&lt;li&gt;When a review is completely empty, make sure the "Post" button stays disabled.&lt;/li&gt;
&lt;li&gt;Ensure the map for a single cafe encompasses the current location, if it is nearby.&lt;/li&gt;
&lt;li&gt;Fix a bug that led to some reviews being set to Hyderabad, India. &lt;em&gt;Yes, this was really weird.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://itunes.apple.com/au/app/decaf-sucks/id458958884?mt=8"&gt;Decaf Sucks 1.1 is available in the App Store now&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/6SfLm0AL79s" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2013/01/11/announcing-decaf-sucks-11</feedburner:origLink></item><item><title>My Boring Adventure</title><dc:creator>Tim Riley</dc:creator><pubDate>Sun, 06 Jan 2013 03:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/JVk_OhCcBIE/my-boring-adventure</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f2622ee4b08d03393bc703</guid><description>&lt;p&gt;Austin Kleon's &lt;a href="http://www.austinkleon.com/steal/"&gt;Steal Like An Artist&lt;/a&gt;, his manifesto for creativity in the digital age, is full of useful tips, with one that stands out for me:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Be boring. (It's the only way to get work done.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While an inspired spark may be source of creative work, it's the drudgery of thorough execution that's necessary to bring it to completion. Even the smallest projects are an accumulation of many tiny details, each requiring time to get right. To do this, you need to show up and work, day after day. Being boring enables this.&lt;/p&gt;

&lt;p&gt;But you can be boring &lt;em&gt;and&lt;/em&gt; have adventure too. The way I've done this is to combine work and travel. Not the frenetic "I've got to squeeze as much as possible into my annual leave" kind of travel, but months at a time in a new place. This allows you the time to develop the routine needed for consistent, productive work, alongside many opportunities to explore your new home at a comfortable pace. Every lunch break affords you a chance to see something new, every outing for coffee the chance to become a regular in a new neighbourhood. Andy Warwick puts it excellently in this &lt;a href="http://www.quora.com/Living-Abroad/What-is-it-like-to-be-an-expat"&gt;Quora thread&lt;/a&gt;: "the mundane becomes an adventure when you live in a foreign land."&lt;/p&gt;

&lt;p&gt;And when you wrap up your work for the night or for the week, there are hours and days ahead of you for adventure and discovery, which can inform and fuel your otherwise perfectly boring working life.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written from Adelaide, Australia, where I'm living for two months.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/JVk_OhCcBIE" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2013/01/06/my-boring-adventure</feedburner:origLink></item><item><title>2012 in Review</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 01 Jan 2013 05:20:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/fCfino2F9J4/2012-in-review</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f2627ce4b08d03393bc862</guid><description>&lt;h2&gt;A life abroad&lt;/h2&gt;

&lt;p&gt;This was a year marked by two new worlds: &lt;a href="http://subtletransition.com/"&gt;Garmisch&lt;/a&gt; and I spent six months &lt;a href="http://openmonkey.com/blog/2011/11/03/moving-to-the-philippines/"&gt;living in the Philippines&lt;/a&gt; and two &lt;a href="http://openmonkey.com/blog/2012/08/17/moved-to-hong-kong/"&gt;in Hong Kong&lt;/a&gt;. We experienced the full stretch of the urban spectrum; from the wide blue skies, leisurely pace (and mild chaos) of a provincial tropical island, through to Hong Kong's unending bustle and its dense, concrete verticality.&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/5157f9c1e4b0ec1768d84879/1364720068233/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;It was our first considerable stretch of time overseas. Living in the relative isolation did bring some challenges, but we overcame them, and in doing so we became a closer couple and hardier humans. And we've left the experience with &lt;a href="http://openmonkey.com/blog/2012/03/23/a-feeling-of-lightness/"&gt;a new perspective&lt;/a&gt; on what's important, and on how we run our lives from here (Hint: there's still a little more exploring to do!).&lt;/p&gt;

&lt;p&gt;This wasn't the year's only travel, either. The long stretches abroad were punctuated by visits elsewhere: Wellington in February for the magnificent &lt;a href="http://webstock.org.nz/"&gt;Webstock&lt;/a&gt;, Australia in April for a group hug with my workmates, Singapore in May for &lt;a href="http://reddotrubyconf.com/"&gt;RedDotRubyConf&lt;/a&gt;, and Tasmania in November for &lt;a href="http://railscamps.com/#portsorell_nov_2012"&gt;Railscamp 12&lt;/a&gt;. And outside all of this, with our own place rented out, we spent some quality time staying with our parents, firstly in Canberra and now in Adelaide.&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/5157f989e4b0ec1768d8484f/1364720015106/?format=500w" /&gt;&lt;br/&gt;&lt;h2&gt;A bigger, better Icelab&lt;/h2&gt;

&lt;p&gt;It was a big year for &lt;a href="http://icelab.com.au/"&gt;Icelab&lt;/a&gt;. In January, we had five people: our Canberra office and Max on his own in Melbourne. In March, we &lt;a href="http://icelab.com.au/articles/icelab-gets-inventive-quadruples-melbourne-team/"&gt;merged with Inventive Labs&lt;/a&gt;, welcomed Narinda, Toby and Ally to the team, and assumed their office space in The Ironmongers on Brunswick Street. In August, &lt;a href="http://icelab.com.au/articles/melissa-kaulfuss-joins-icelab/"&gt;Melissa joined us&lt;/a&gt; in Melbourne as a project manager. In September, &lt;a href="http://icelab.com.au/articles/david-porter-joins-icelab/"&gt;David joined us&lt;/a&gt; in Canberra as a developer. In December, we moved out of our (then very crowded) office in Canberra into a bigger, much more comfortable space just a few blocks away. We finished the year with &lt;a href="http://icelab.com.au/about"&gt;nine amazing people&lt;/a&gt; and permanent offices in both Canberra and Melbourne. And all of this while I was mostly overseas. A distributed team can really work.&lt;/p&gt;

&lt;p&gt;The larger team meant we put out more work than ever. Plenty to be proud of, and plenty I &lt;em&gt;wish&lt;/em&gt; I could have been more involved in. That said, I did get to ship a few large projects this year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF e-ticket support for &lt;a href="http://cornerhotel.com/"&gt;Ticketscout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thethousands.com.au/"&gt;The Thousands&lt;/a&gt;, with Max Wheeler &amp;amp; Anthony Kolber&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youcamp.com/"&gt;Youcamp&lt;/a&gt;, with Toby Allder and Michael Honey, along with contributions from almost everyone in the lab&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/5157fa46e4b0e1be8847bb44/1364720202665/?format=500w" /&gt;&lt;br/&gt;&lt;h2&gt;Some other work endeavours&lt;/h2&gt;

&lt;p&gt;I had less time than usual this year to work on side-projects, but I did manage to ship &lt;a href="http://gentlyremind.me/"&gt;gentlyremind.me&lt;/a&gt; in February. It sends you a daily email  of your recently favourited tweets. I use it everyday and it's nice to see my friends do the same.&lt;/p&gt;

&lt;p&gt;I also found a little time to take a look into &lt;a href="http://www.rubymotion.com/"&gt;RubyMotion&lt;/a&gt; for building iOS apps. I put together &lt;a href="http://icelab.com.au/articles/rubymotion-and-rails-responders-at-the-canberra-ruby-crew/"&gt;an introductory talk&lt;/a&gt; and presented at a Canberra Ruby meeting and at Railscamp 12, where I also ported the bulk of the &lt;a href="http://decafsucks.com/"&gt;Decaf Sucks&lt;/a&gt; iOS app to RubyMotion in just a day or so. I expect I'll spend a lot more time with this in the future.&lt;/p&gt;

&lt;h2&gt;Some new apps&lt;/h2&gt;

&lt;p&gt;A notable trend that emerged this year was my increased use of activity-tracking apps. Films I watched went in the lovely &lt;a href="http://letterboxd.com/"&gt;Letterboxd&lt;/a&gt;. My &lt;a href="http://decafsucks.com/people/1-timriley"&gt;Decaf Sucks&lt;/a&gt; page continued to grow as I explored new cities café-by-café. In Hong Kong, I started using &lt;a href="http://foursquare.com/timriley"&gt;Foursquare&lt;/a&gt; so I could record the eateries and other interesting places I visited, and it's stuck with me since then. I tried to take note of my general activities using &lt;a href="http://dayoneapp.com/"&gt;Day One&lt;/a&gt; on both the Mac and iOS. It hasn't quite become habitual yet, but anything I record there is a bonus. Finally, &lt;a href="http://www.rdio.com/people/tim_riley/"&gt;Rdio&lt;/a&gt; has become a daily source of musical wonder; my iTunes library is long since deleted.&lt;/p&gt;

&lt;h2&gt;Getting to the point&lt;/h2&gt;

&lt;p&gt;One of the freshest, foremost things in my mind about this year is a hard slog in the last six months; Icelab was growing, and there were was just a big backlog of work that &lt;em&gt;had to be done.&lt;/em&gt; To help, I bore down and worked harder and longer than ever before. We got past it, but it came at some personal cost. I lost opportunities for spending time with my wife, for exercise, exploring my new locations, and my own creative work.&lt;/p&gt;

&lt;p&gt;After all of that, though, I feel we've arrived in a good position to create a more sustainable workload in the future, and I haven't lost any of my passion for creating things. If I still feel like this now, I know it won't change, and I know that I'll continue to put lots of time into it. What I &lt;em&gt;have&lt;/em&gt; learnt is how it feels to do it out of some kind of obligation, and I'll do my best to ensure I don't fall into that position again.&lt;/p&gt;&lt;p&gt;But the biggest story, and the story worth remembering, is that I could do all of this — the hard work included — while still sharing wildly new experiences and building a stronger relationship with Garmisch. I couldn't think of a better friend and travel companion, and I'm ever thankful for her company and support.&lt;/p&gt;

&lt;p&gt;I've finished the year with a stronger sense than ever of empowerment and direction. 2013 will be big!&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/5157fa78e4b0e1be8847bb5d/1364720254469/?format=500w" /&gt;&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/fCfino2F9J4" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2013/01/01/2012-in-review</feedburner:origLink></item><item><title>Out My Window</title><dc:creator>Tim Riley</dc:creator><pubDate>Sun, 16 Sep 2012 00:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/CRJwGvVNBSI/out-my-window</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f29342e4b0d70ab5fe3468</guid><description>&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50f29345e4b07e77c466a35f/1358074704452/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;The view out the window in my previous and current overseas offices: Talisay City (Negros Occidental, Philippines) and Sheung Wan (Hong Kong).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/CRJwGvVNBSI" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2012/09/16/out-my-window</feedburner:origLink></item><item><title>From a Good Idea and Persistence Came Sneakers</title><dc:creator>Tim Riley</dc:creator><pubDate>Mon, 10 Sep 2012 21:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/2VGY8GCwU9s/robert_redford_sidney_poitier_ben_kingsley_dan_aykroyd_what_it_was_like_shooting_the_movie_sneakers_.html</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f26f52e4b09d40370d7466</guid><description>&lt;p&gt;Stephen Tobolowsky shares some &lt;a href="http://www.slate.com/articles/arts/culturebox/2012/09/robert_redford_sidney_poitier_ben_kingsley_dan_aykroyd_what_it_was_like_shooting_the_movie_sneakers_.html"&gt;behind the scenes memories&lt;/a&gt; of &lt;em&gt;Sneakers&lt;/em&gt;, an all-time favourite film of mine, and finishes with his thoughts on scriptwriter Phil Alden Robinson:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Years later I ran into Phil at the symphony. I asked him I how he was able to come up with such a great script. He blushed and said he had worked on it for nine years. I know spending a long time writing something doesn’t guarantee success. But not giving up on a good idea almost always does.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/09/11/from-a-good-idea-and-persistence-came-sneakers"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/2VGY8GCwU9s" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.slate.com/articles/arts/culturebox/2012/09/robert_redford_sidney_poitier_ben_kingsley_dan_aykroyd_what_it_was_like_shooting_the_movie_sneakers_.html</feedburner:origLink></item><item><title>Lost Cities for iOS</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 28 Aug 2012 21:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/2SLCkxaWhNI/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f277fbe4b0ceb75bcb4620</guid><description>&lt;p&gt;Lost Cities is one of my favourite card games, and over the weekend I was surprised to learn about the release of a &lt;a href="http://lostcitiesapp.com/"&gt;version for iOS&lt;/a&gt;. The app was released by &lt;a href="http://www.codingmonkeys.de/"&gt;TheCodingMonkeys&lt;/a&gt;, who previously built the &lt;a href="http://carcassonneapp.com/"&gt;Carcassonne app&lt;/a&gt;. I'm happy to report that Lost Cities is adapted just as delightfully for the iPhone.&lt;/p&gt;

&lt;p&gt;Lost Cities a two-player game, and while the mechanics don't allow for the pass-and-play experience that Carcassonne offers, it's still fun and responsive to play against friends, whether they're in the same room or across the internet. The move to iOS also enhances the core experience of the game: that the scorekeeping and card counting is done for you allows you to focus solely on your tactics and execution. The single player challenges also encourage you to try different techniques and gameplay styles. This is a digital adaptation done right.&lt;/p&gt;

&lt;p&gt;The graphical polish on the app is amazing, and the music is &lt;em&gt;exquisite.&lt;/em&gt; Together, they really do create a feeling of daring and adventure, which is quite remarkable for a game that otherwise consists of stacks of cards. You want to try this game, if only to see how a card or board game &lt;em&gt;should&lt;/em&gt; be done on iOS.&lt;/p&gt;

&lt;p&gt;I was also interested to learn that TheCodingMonkeys were also the developers behind &lt;a href="http://www.codingmonkeys.de/subethaedit/"&gt;SubEthaEdit&lt;/a&gt;, the comparatively nerdy and (and definitely less game-like) networked collaborative text editor. Nice to see a company take their experience from one area of software development and use it to find success with some completely different products.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/08/29/lost-cities-for-ios"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/2SLCkxaWhNI" height="1" width="1"/&gt;</description><feedburner:origLink>http://lostcitiesapp.com/</feedburner:origLink></item><item><title>Fast Downscaling of Retina OS X Screenshots</title><dc:creator>Tim Riley</dc:creator><pubDate>Wed, 22 Aug 2012 21:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/CiF_yNfr258/fast-downscaling-of-retina-os-x-screenshots</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f2785ce4b07e77c4668edf</guid><description>&lt;p&gt;Screenshots from the retina MacBook Pro look comically large when I share them with my &lt;em&gt;@1x&lt;/em&gt; teammates. This kind of fidelity is especially unnecessary when casually sharing annotated snapshots back and forth during the app development process.&lt;/p&gt;

&lt;p&gt;Automator makes it easy to build an app that will halve the dimensions of the images. Open Automator, choose to build a new &lt;em&gt;Application&lt;/em&gt;, then add these steps:&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50f27894e4b09d40370d7e61/1358067863341/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;Save it to &lt;code&gt;/Applications&lt;/code&gt; and you're done. Then, dragging an image onto the app's icon will immediately copy it to your desktop and rescale it. Put it in your Dock for even easy access, or if you use &lt;a href="http://www.obdev.at/products/launchbar/index.html"&gt;LaunchBar&lt;/a&gt;, you can do it even faster with &lt;a href="http://www.obdev.at/resources/launchbar/help/index.php?chapter=InstantSend"&gt;InstantSend&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/CiF_yNfr258" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2012/08/23/fast-downscaling-of-retina-os-x-screenshots</feedburner:origLink></item><item><title>Saying Goodbye, Keeping Your Team</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 21 Aug 2012 12:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/m-XY8rDHqfI/goodbye-san-francisco</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f2793ce4b08d03393bd7df</guid><description>&lt;p&gt;Noah Stokes &lt;a href="http://esbueno.noahstokes.com/post/29560226776/goodbye-san-francisco"&gt;shares his decision&lt;/a&gt; to leave San Francisco, and demonstrates that you can both move and take your colleagues with you:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Bold now shares a virtual office. Garrett is still in San Francisco, while Sam has moved to Austin, Texas and Charlie remains in Raleigh, North Carolina. It’s bittersweet to be virtual, but at the same time we all work to live, not live to work. So why not love where you live.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've spent 9 of the past 12 months working remotely with my team at &lt;a href="http://icelab.com.au/"&gt;Icelab&lt;/a&gt;, and in this time, my wife and I have experienced life and adventures together in some &lt;a href="http://openmonkey.com/blog/2012/08/17/moved-to-hong-kong/"&gt;amazing&lt;/a&gt; and &lt;a href="http://openmonkey.com/blog/2011/11/03/moving-to-the-philippines/"&gt;personally significant&lt;/a&gt; parts of the world. It's been a unique and precious period in our lives, and my work's been a critical enabler for it.&lt;/p&gt;

&lt;p&gt;And when I &lt;em&gt;am&lt;/em&gt; at work, we've been as productive as ever. The time collaborating remotely has actually strengthened my understanding of my teammates. It takes a certain degree of thoroughness to explain yourself in text and over Skype. You can't take shortcuts in your communication. It's true that this has led to frustration at times, but it's ultimately led to a more acute knowledge of their workings and motivations.&lt;/p&gt;

&lt;p&gt;Anyone who builds things knows that worthwhile creations take time to mature. One of the most worthwhile things you can work on is your team. If you've found a good one, do your best to keep it, no matter where you live.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/08/21/saying-goodbye-keeping-your-team"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/m-XY8rDHqfI" height="1" width="1"/&gt;</description><feedburner:origLink>http://esbueno.noahstokes.com/post/29560226776/goodbye-san-francisco</feedburner:origLink></item><item><title>Moved to Hong Kong</title><dc:creator>Tim Riley</dc:creator><pubDate>Fri, 17 Aug 2012 08:15:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/WOXr8Y7Vq_g/moved-to-hong-kong</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f2799ce4b02b3b221aac71</guid><description>&lt;p&gt;As I write this, I look over Hollywood Road and watch the antique stores close down for the day. A stream of red-topped taxis buzz by. There's still a waft of incense in the air from the nearby Man Mo temple. In a sweep of the eye, I can see hundreds of tightly packed residences stacked above each other. That's right, I'm in Hong Kong!&lt;/p&gt;

&lt;p&gt;Time has really flown by since my wife and I &lt;a href="http://openmonkey.com/blog/2011/11/03/moving-to-the-philippines/"&gt;finished in the Philippines&lt;/a&gt; and came back to chilly Australia at the end of June. We spent a whirlwind seven weeks catching up with friends and work, and now we've already started the next chapter of our overseas adventures: two months in Hong Kong.&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50f279d4e4b0ceb75bcb46fb/1358068183677/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;Why Hong Kong? We've visited a couple of times and have really enjoyed it here, and after eight months in the provincial Philippines, it would be fun to experience the opposite end of the urban spectrum. Working remotely for &lt;a href="http://icelab.com.au/"&gt;Icelab&lt;/a&gt; has been no trouble, so we can go where our fancies take us.&lt;/p&gt;

&lt;p&gt;We're staying in Sheung Wan, a fantastic neighbourhood. It's an older area and still largely residential, so it's quiet and charming, but just 10 minutes by foot to the bustle of Central. There are antique shops, galleries, boutiques and &lt;a href="http://decafsucks.com/search?q=sheung+wan"&gt;a bunch of decent cafés&lt;/a&gt;. Monocle has a &lt;a href="http://www.monocle.com/sections/affairs/Web-Articles/Neighbourhood-Sheung-Wan/"&gt;great video introduction&lt;/a&gt; to the neighbourhood.&lt;/p&gt;

&lt;h2&gt;Smarter the second time&lt;/h2&gt;

&lt;p&gt;Compared to the initial effort of preparing for the Philippines, moving here has been a breeze. All our affairs were already in order, so getting out again was merely a shuffling of what was in the suitcases. If you've made the effort to relocate for a significant period of time, you almost owe it to yourself to back it up with another trip.&lt;/p&gt;

&lt;p&gt;We've learnt from our first experience and have done a few things differently this time. Firstly, we're staying in an apartment we found via &lt;a href="http://airbnb.com"&gt;Airbnb&lt;/a&gt;. The place is very comfortable and already well set up. Within a day of arriving, I was able to put in a productive day at work. For a shorter stay, it's great not to worry about finding and establishing a new place to live.&lt;/p&gt;

&lt;p&gt;We also packed &lt;em&gt;far lighter&lt;/em&gt;. Here's my packing list for 2 months:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Essentials&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 t-shirts&lt;/li&gt;
&lt;li&gt;1 pair of shorts&lt;/li&gt;
&lt;li&gt;1 pair of jeans&lt;/li&gt;
&lt;li&gt;1 pair of shoes (My trusty New Balance 574's)&lt;/li&gt;
&lt;li&gt;1 pair of thongs&lt;/li&gt;
&lt;li&gt;Assorted underwear and socks (&lt;em&gt;much&lt;/em&gt; less than the Philippines)&lt;/li&gt;
&lt;li&gt;Toiletries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Gear&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MacBook Pro&lt;/li&gt;
&lt;li&gt;iPad (mostly for reading)&lt;/li&gt;
&lt;li&gt;Jawbone Jambox&lt;/li&gt;
&lt;li&gt;4 external HDDs (2 x backup, 2 x media)&lt;/li&gt;
&lt;li&gt;Camera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All up, 13kg in one still quite empty suitcase.&lt;/p&gt;

&lt;h2&gt;Say hello&lt;/h2&gt;

&lt;p&gt;We've a little over 6 weeks left here in Hong Kong. I'm hoping to make it out to a couple of tech meet-ups, but would love to meet anyone for lunch of coffee. &lt;a href="http://openmonkey.com/contact"&gt;Say hello!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/WOXr8Y7Vq_g" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2012/08/17/moved-to-hong-kong</feedburner:origLink></item><item><title>Icelab in Offscreen Magazine</title><dc:creator>Tim Riley</dc:creator><pubDate>Fri, 13 Jul 2012 01:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/8UHSr9IVk9U/icelab-in-offscreen-magazine</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27a94e4b0d70ab5fe2627</guid><description>&lt;p&gt;Have you seen &lt;a href="http://www.offscreenmag.com/"&gt;Offscreen Magazine&lt;/a&gt; yet? It's an insightful, inspiring read about the work and motivations of digital creators all around the world. It's been months since the inaugural issue and I'm still thinking about some of the things I read there.&lt;/p&gt;

&lt;p&gt;I was able to contribute to the second issue, with the view from my office in the Philippines.&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50f27ac7e4b0d70ab5fe264b/1358068425222/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;It's nice to see that little slice of my life preserved in print, and a privilege to be in such good company. &lt;a href="http://www.brizk.com/"&gt;Kai Brach&lt;/a&gt; has done an excellent job putting together a beautiful, collectible magazine, something that will stand the test of time. You can &lt;a href="http://www.offscreenmag.com/buy/"&gt;buy the first two issues now&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/8UHSr9IVk9U" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2012/07/13/icelab-in-offscreen-magazine</feedburner:origLink></item><item><title>Asset Pipeline Tips</title><dc:creator>Tim Riley</dc:creator><pubDate>Fri, 22 Jun 2012 08:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/kFYKjyNkdv4/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27b4de4b02b3b221aaf5c</guid><description>&lt;p&gt;How we're handling the Rails asset pipeline at Icelab. For me, this is a great example of the benefits of working in a team: its collective capacity for learning is huge. I never had a chance to really grok the ins and outs of the asset pipeline, but here Hugh has done it and laid it all out for me. &lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/06/22/asset-pipeline-tips"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/kFYKjyNkdv4" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/asset-pipeline-tips/</feedburner:origLink></item><item><title>RubyMotion &amp; Rails Responders at the Canberra Ruby Crew</title><dc:creator>Tim Riley</dc:creator><pubDate>Wed, 20 Jun 2012 19:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/fgSiRabqgaI/rubymotion-rails-responders-at-the-canberra-ruby-crew</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27bd5e4b022c54496de2a</guid><description>&lt;p&gt;This week the &lt;a href="http://canberraruby.com/"&gt;Canberra Ruby Crew&lt;/a&gt; meetings kicked off again after a long hiatus. Both Hugh and I gave presentations. Hugh spoke about our use of Rails responders for tidily offering layout-less content intended for display in modal popup windows. You won't see his slides online just yet, but his use of &lt;a href="http://bartaz.github.com/impress.js"&gt;Impress.js&lt;/a&gt; with the demos embedded in iframes was &lt;em&gt;ingenious.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://static.squarespace.com/static/50e1507de4b00220dc7e8a6b/t/50f27c38e4b022c54496de74/1358068796253/?format=500w" /&gt;&lt;br/&gt;&lt;p&gt;I gave an introduction to &lt;a href="http://www.rubymotion.com/"&gt;RubyMotion&lt;/a&gt;, the impressive new Ruby implementation for developing iOS apps:&lt;/p&gt;

&lt;script src="http://speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;p&gt;I've played with all the other half-arsed attempts at bridging different languages or web tech with native iOS deployment, and none of them has left me convinced. RubyMotion is different. It feels &lt;em&gt;first-class,&lt;/em&gt; and in its brief couple of months since release, so many libraries have sprung up that look to make iOS development much more pleasant. I'm convinced enough that I'll be porting &lt;a href="http://decafsucks.com/"&gt;Decaf Sucks&lt;/a&gt; across. I'll let you know how it goes.&lt;/p&gt;

&lt;p&gt;If you're interested in learning RubyMotion, here are some resources worth checking out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pragmaticstudio.com/screencasts/rubymotion"&gt;Free screencast&lt;/a&gt; from The Pragmatic Studio&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/HipByte/rubyMotionSamples"&gt;repository of example apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The examples from iOS Programming Big Nerd Ranch 3rd ed, &lt;a href="https://github.com/jaimeiniesta/rubymotion-nerd"&gt;ported to RubyMotion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A long list of &lt;a href="https://github.com/railsfactory/rubymotion-cookbook/blob/master/projects/projects.list"&gt;open source RubyMotion projects&lt;/a&gt; (and &lt;a href="http://rubymotionapps.com/"&gt;another here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many thanks to Hugh and Matthew for organising this month's meet. If you're interested in coming along next time, &lt;a href="http://groups.google.com/group/canberra-ruby"&gt;join the mailing list&lt;/a&gt; and &lt;a href="http://twitter.com/rubyaustralia"&gt;follow @rubyaustralia on Twitter&lt;/a&gt;. See you then!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/fgSiRabqgaI" height="1" width="1"/&gt;</description><feedburner:origLink>http://openmonkey.com/blog/2013/01/13/rubymotion-rails-responders-at-the-canberra-ruby-crew</feedburner:origLink></item><item><title>Keith Pitty's List of Ruby Resources</title><dc:creator>Tim Riley</dc:creator><pubDate>Wed, 06 Jun 2012 00:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/XiGpar5rqEE/2012-06-06-ruby-resources-on-my-radar</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27ca7e4b09d40370d810e</guid><description>&lt;p&gt;Keith provides an excellent list of websites, books and podcasts that will help make you a better Ruby programmer. We'd all do well to put aside a couple of hours each week to spend some time with any of these.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/06/06/keith-pittys-list-of-ruby-resources"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/XiGpar5rqEE" height="1" width="1"/&gt;</description><feedburner:origLink>http://keithpitty.com/blog/archives/2012-06-06-ruby-resources-on-my-radar</feedburner:origLink></item><item><title>Icelab Singapore and RedDotRubyConf 2012</title><dc:creator>Tim Riley</dc:creator><pubDate>Sun, 03 Jun 2012 22:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/hYooxJTFzaQ/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27d12e4b0ceb75bcb4bc6</guid><description>&lt;p&gt;In May, Hugh and I took off to Singapore for a week of work capped off by the second &lt;a href="http://reddotrubyconf.com/"&gt;RedDotRubyConf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I recommend that you take a break from your usual work patterns and environment and do your job somewhere else. It needn't be somewhere exotic, but if you can manage it, all the better! For me, the week in Singapore was especially rewarding because it was a great chance to compare notes with Hugh about what we've been building lately and some of the techniques we're employing (not to mention a great chance to sample some coffee too).&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;hello from Singapore, happy friday! &lt;a href="https://twitter.com/search/%2523fridayhug"&gt;#fridayhug&lt;/a&gt; at @&lt;a href="https://twitter.com/reddotrubyconf"&gt;reddotrubyconf&lt;/a&gt; during @&lt;a href="https://twitter.com/schneems"&gt;schneems&lt;/a&gt; talk. &lt;a href="http://t.co/OOMXYSK5"&gt;twitter.com/hone02/status/…&lt;/a&gt;&lt;/p&gt;&amp;#8212; Terence Lee (@hone02) &lt;a href="https://twitter.com/hone02/status/203399397495676928"&gt;May 18, 2012&lt;/a&gt;&lt;/blockquote&gt;

&lt;script src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;

&lt;p&gt;RedDotRubyConf took place over the Friday and Saturday, and it was a great event. For me, a lot of the value in attending a conference is how I feel when it ends, and how that translates into actions that change my life and work. After a conference like &lt;a href="http://www.webstock.org.nz/"&gt;Webstock&lt;/a&gt;, which &lt;a href="http://icelab.com.au/articles/a-webstock-2012-recap/"&gt;I attended earlier this year&lt;/a&gt;, I was compelled to think about the longevity of my work and how I wanted to help shape Icelab. After Red Dot, I was motivated simply to become a better Ruby developer. For something I do everyday, this is a useful thing.&lt;/p&gt;

&lt;p&gt;This was the first single-track conference I've attended, and I liked the structure a lot: no difficult choices and a single shared experience for everyone.&lt;/p&gt;

&lt;p&gt;Some of the standout talks for me were, from Day 1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ilya Grigorik's &lt;a href="http://www.igvita.com/slides/2012/reddot-building-faster-web/"&gt;&lt;em&gt;Building a faster web&lt;/em&gt;&lt;/a&gt;: This was jam-packed with useful suggestions, and building for speed is something we should always keep in mind. Incidentally, I'd seen his slides online earlier, but picked up so much more seeing him speak. A good reason to come to conferences.&lt;/li&gt;
&lt;li&gt;Danish Khan's &lt;a href="https://speakerdeck.com/u/danishkhan/p/ruby-community"&gt;&lt;em&gt;The Ruby Community&lt;/em&gt;&lt;/a&gt;: A nice reminder about being good project maintainers and open-source citizens.&lt;/li&gt;
&lt;li&gt;Sau Sheong Chang's &lt;a href="http://www.slideshare.net/sausheong/ruby-rock-roll"&gt;&lt;em&gt;Ruby, Rock &amp;amp; Roll&lt;/em&gt;&lt;/a&gt;: I love just-for-the-sake-of-it out there tech talks like this. We were treated to a walkthrough of the process of building a Ruby music synthesizer and DSL.&lt;/li&gt;
&lt;li&gt;Wei Lu's &lt;a href="http://weilu.github.com/reddot2012/"&gt;&lt;em&gt;A Journey into Pair Programming&lt;/em&gt;&lt;/a&gt;: An intro to pairing from one of the {new context} engineers. I'm still not convinced that pair programming is necessarily the best option for small studios with many concurrent projects, but it's still important to critically consider your working methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And on Day 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obie Fernandez's &lt;a href="http://blog.obiefernandez.com/content/2012/05/redis-on-rails-reddotrubyconf-2012.html"&gt;&lt;em&gt;Redis on Ruby&lt;/em&gt;&lt;/a&gt;: I've used Redis before, but not as extensively as Obie. A great eye-opener, showing a huge number of potential uses for the database. I predict more of this in my future.&lt;/li&gt;
&lt;li&gt;Carl Coryell-Martin's &lt;em&gt;Computer Scientist, Developer, or Engineer?&lt;/em&gt;: A reminder that we should measure our work against real human needs.&lt;/li&gt;
&lt;li&gt;Darcy Laycock's &lt;a href="http://blog.ninjahideout.com/posts/api-driven-applications-with-rails"&gt;&lt;em&gt;API Driven Development&lt;/em&gt;&lt;/a&gt;: Nearly everything I build these days has an API, and there's a lot of new tools about to help make them easier to build.&lt;/li&gt;
&lt;li&gt;Koz's &lt;a href="https://speakerdeck.com/u/nzkoz/p/lessons-from-the-other-side-effectively-contributing-to-open-source"&gt;&lt;em&gt;Lessons From the Other Side: Effectively Contributing to Open Source&lt;/em&gt;&lt;/a&gt;: An interesting and &lt;em&gt;funny&lt;/em&gt; insight into Koz's life as a Rails maintainer, along with some advice about contributing effectively. In particular: your contributions to Rails (or OSS in general) should be a &lt;em&gt;by-product&lt;/em&gt; of your work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a &lt;a href="http://andycroll.com/2012/05/22/reddotrubyconf-2012-wrap-up/"&gt;complete list of talks and slides&lt;/a&gt; available.&lt;/p&gt;

&lt;p&gt;For just a couple of days, there's a lot of good learning and inspiration. &lt;a href="http://andycroll.com/"&gt;Andy Croll&lt;/a&gt; has put together a remarkable event and deserves many thanks. I'm looking forward to heading back next year.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/06/04/icelab-singapore-and-reddotrubyconf-2012"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/hYooxJTFzaQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/icelab-singapore-and-reddotrubyconf-2012/</feedburner:origLink></item><item><title>Wrapping Rack Middleware to Exclude Certain URLs (For Rails Streaming Responses)</title><dc:creator>Tim Riley</dc:creator><pubDate>Mon, 21 May 2012 02:35:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/hPsFBDtMUL0/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27d88e4b07e77c466922d</guid><description>&lt;p&gt;Another one of the tweaks I had to make &lt;a href="http://icelab.com.au/articles/money-stress-and-the-cloud/"&gt;to accomodate Rails streaming responses&lt;/a&gt; was ensuring that the &lt;code&gt;Rack::Deflater&lt;/code&gt; middleware didn't run on my app's streaming actions.&lt;/p&gt;

&lt;p&gt;The Deflater middleware gzips your responses before delivering them to the client. This is useful to run on the Heroku Cedar stack because this facility is otherwise not provided. There's a big gotcha, though: the middleware breaks Rails HTTP streaming responses. There's &lt;a href="http://stackoverflow.com/a/10596123/308563"&gt;a good explanation of this on StackOverflow&lt;/a&gt;, as well as a monkey patch to &lt;code&gt;ActionController::Streaming&lt;/code&gt; that corrects the behaviour.&lt;/p&gt;

&lt;p&gt;I took an alternative, simpler approach. I extended the middleware with support for excluding a URL pattern. This way, I can just disable it on the few actions where I know I am streaming responses. Here's how it looks:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Rack
  class DeflaterWithExclusions &amp;lt; Deflater
    def initialize(app, options = {})
      @app = app

      @exclude = options[:exclude]
    end

    def call(env)
      if @exclude &amp;amp;&amp;amp; @exclude.call(env)
        @app.call(env)
      else
        super(env)
      end
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And here's how the extended middleware is included, in &lt;code&gt;config.ru&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use Rack::DeflaterWithExclusions, :exclude =&amp;gt; proc { |env|
  env['PATH_INFO'] == '/order/purchase'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using an executable proc for the &lt;code&gt;:exclude&lt;/code&gt; argument is useful because it then allows for far more sophisticated URL matching than simple string equality (in production, I actually check against a couple of regular expressions).&lt;/p&gt;

&lt;p&gt;Wrapping the middleware in this way has worked well. We get to keep it for the bulk of the app, where it's useful, without it interfering with the parts that are more touchy. It would be nice to see this kind of &lt;code&gt;:exclude&lt;/code&gt; option handling become more common among Rack middlewares.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/05/21/wrapping-rack-middleware-to-exclude-certain-urls-for-rails-streaming-responses"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/hPsFBDtMUL0" height="1" width="1"/&gt;</description><feedburner:origLink>http://icelab.com.au/articles/wrapping-rack-middleware-to-exclude-certain-urls-for-rails-streaming-responses/</feedburner:origLink></item><item><title>The Plight of Pinocchio: JavaScript's quest to become a real language</title><dc:creator>Tim Riley</dc:creator><pubDate>Wed, 16 May 2012 22:30:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/RKLxJ2nUUfM/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27e16e4b0ceb75bcb4da6</guid><description>&lt;p&gt;Brandon Keepers at JSDay:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;JavaScript is no longer a toy language. Many of our applications can’t function without it. If we are going to use JavaScript to do real things, we need to treat it like a real language, adopting the same practices we use with real languages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'll admit that I still write a lot of JavaScript in toy-like style. Brandon's presentation is both motivating and informative for anyone wanting to improve their use of JavaScript.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/05/17/the-plight-of-pinocchio-javascripts-quest-to-become-a-real-language"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/RKLxJ2nUUfM" height="1" width="1"/&gt;</description><feedburner:origLink>http://opensoul.org/blog/archives/2012/05/16/the-plight-of-pinocchio/</feedburner:origLink></item><item><title>Heroku's new $50 per month production database</title><dc:creator>Tim Riley</dc:creator><pubDate>Tue, 08 May 2012 23:55:00 +0000</pubDate><link>http://feedproxy.google.com/~r/BlahBlahWoofWoof/~3/jC0er8fXttQ/</link><guid isPermaLink="false">50e1507de4b00220dc7e8a6b:50e1507de4b00220dc7e8a70:50f27e7be4b0a42e43ecfc05</guid><description>&lt;p&gt;With a $150 per month reduction in the minimum dedicated database price, Heroku suddenly becomes viable for many more of our apps.&lt;/p&gt;&lt;p&gt;&lt;a href="http://openmonkey.com/blog/2012/05/09/herokus-new-50-per-month-production-database"&gt;Permalink&lt;/a&gt;&lt;p&gt;&lt;img src="http://feeds.feedburner.com/~r/BlahBlahWoofWoof/~4/jC0er8fXttQ" height="1" width="1"/&gt;</description><feedburner:origLink>https://postgres.heroku.com/blog/past/2012/5/3/crane_the_new_50_per_month_production_database_/</feedburner:origLink></item></channel></rss>
