This content was initially published on the Phase2 blog.

I was recently asked to help out with a few build steps for a Drupal project using Grunt as its build system. The project’s Gruntfile.js has a drush:make task that utilizes the grunt-drush package to run Drush make. This task in included in a file under the tasks directory in the main repository.


module.exports = function(grunt) {
   * Define "drush" tasks.
   * grunt drush:make
   *   Builds the Drush make file to the build/html directory.
  grunt.config('drush', {
    make: {
      args: ['make', '<%= config.srcPaths.make %>'],
      dest: '<%= config.buildPaths.html %>'

This content was initially published on the Phase2 blog.

This Monday, the CitiBike bike share launched in New York City. The website was beautiful and responsive, and more than 15,000 registrations were processed through it before the launch happened.

But then, a funny thing happened. The website and the mobile apps’ maps started coming up blank, and they stayed blank for more than 12 hours. What follows should not be characterized as a failing of the technical team. Launches are tough, and I don’t mean to pile on what was obviously a tough situation. Instead, I would like to look at a few choices that were made and how the system might have been better architected for scalability.

This content was initially published on the Phase2 blog.

This weekend marked the second annual DrupalCamp New Jersey at beautiful Princeton University.

I was happy to fill in when a presenter dropped out and presented a session called “Testing Drupal with Ghosts and Gherkins”. In this presentation, I talked about how both CasperJS or Behat could be brought to bear to test a Drupal application and gave some demos of each. The slides are embedded below.

<3 ZFS

I’ve recently gotten religion about ZFS, and as a result, I’ve been looking hard at the various systems that offer you the ability to use ZFS and other amazing tools from the Solaris lineage (now being developed freely under the Illumos moniker after Oracle’s unceremonious murder of OpenSolaris.)

My data’s backed up on an 8 TB FreeNAS, but there’s also an amazing trend of Illumos-based distributions on offer that offer KVM virtualization, which was ported to Illumos by Joyent for their SmartOS distribution. Theo Schlossnagle recently gave a talk at the NYC DevOps meetup about their Illumos-based OmniOS distribution. OmniOS is a bit more than a JeOS – it aims to provide just enough packaged software to let you build the Illumos kernel and several other important tools like tmux and screen, and then get out of your way. Like SmartOS, it provides both lightweight zones-based virtualization and KVM for full hardware virtualization, but OmniOS is designed to be permanently installed on a machine, as opposed to SmartOS’s focus on USB or PXE booting and ephemeral global zone configuration.

OmniTI also makes a larger set of packages that their Managed Services team uses at

This content was initially published on the Phase2 blog.

Wouldn’t it be great if there was an easy way to access or other documentation offline or on a plane?

UPDATE: Sadly, as this blog post went to press, two important updates came out that change the usefulness of this blog post. Dash is now ad-supported, and secondly, it ships with a Drupal DocSet available for download, so that’s one fewer step you have to perform to have all the docs that matter to you in Dash.

This content was initially published on the Phase2 blog.

The Drupal community is exploding! I’ve had the pleasure to speak at two nascent Drupal camps (New Jersey and Maryland) in as many weeks.

Today I gave a revamped version of my “Coat Your Website with Varnish” session at DrupalCamp MD. I updated some of the information about Drupal configuration and an overview section going over some of the basics of headers and caching.

The entire presentation is embedded below and is also available on

Apple’s Bonjour service just saved me a lot of hassle.

I took a little time this MLK Day to get some old electronics ready for sale. One of the machines I decided to clean up was an old Mac Pro. I’ve recently replaced it with a Mac mini that positively sips power: 10 – 12 watts at idle instead of the consistent 120 watts that my old Mac Pro would draw. (I’ll write more on cutting my setup’s power consumption in a later blog post.)

I hooked my Mac Pro up to my router with an Ethernet cable but didn’t want to get out a keyboard, mouse, and monitor to do a final set of backups and deauthorize some software. Normally this wouldn’t be a problem since the old Mac Pro was set configured to start Apple Remote Desktop at boot.

I forgot that since switching to the Mac Pro, I had reassigned the Mac Pro’s IP address ( to the Mac mini. The Mac Pro booted, but could not get a proper IP address since the address it was configured to use was in use.

I was about to break out my keyboard, mouse, and monitor when I thought I’d give Bonjour a try.

This content was initially published on the Phase2 blog.

Here at Treehouse Agency, we love IRC, as does the rest of the Drupal community. Still, IRC ports are often blocked, and not everyone is comfortable using IRC. We’ve recently been using HipChat to set up chat rooms for certain new clients.

I already route most of my AIM and GTalk interaction through an IRC gateway using BitlBee, and I wanted to hook HipChat up to an IRC client as well. Here’s a guide on how to do this.

(Note that I was having trouble joining channels in my LimeChat last night as I was writing this up, but I might just be missing something. Try it out!)

This content was initially published on the Phase2 blog.

One of the most useful features of Vagrant is that it has the ability to share files with the VMs it manages, which lets your team work with the tools they’re used to while still getting the benefits of running the full production stack.

It can share those files from the host (the machine running VirtualBox and Vagrant) to the guest (the virtualized Linux machine) via VirtualBox’s built-in file sharing on Mac, Windows, or Linux. When run on Linux or Mac hosts, it can also share files to the guest via NFS. NFS performs much better for sharing large numbers of files on a Linux or Mac host, which is well documented in the excellent Vagrant documentation. In addition, remember that the directory with the Vagrantfile in it will be shared with VirtualBox’s built-in file sharing, so we probably don’t want to put our docroot right in that directory.