Adam Tuttle

The $10 Gadget I Never Leave Home Without

I'm writing this from a sitting area at my local mall, because my town and several surrounding towns are all without power. As it turns out, that's the one thing I have no backup plan for when it comes to working from home. If my home internet goes out, I can just tether on my phone (as long as my cell service isn't disrupted). But I don't have a generator, and I can't really get any work done without electricity.

Fortunately, I keep this bad boy in my laptop bag at all times:

Monster MP OTG400 BK Outlets To Go 4 Outlet Travel Power Strip (Black)

I don't travel all year long, but if I did this piece of kit would be even more valuable. The two or three times per year that I find myself with hours to kill in an airport, this thing makes me pretty popular. And today, it makes me popular at the mall, where it would seem that public outlets are even more scarce than at airports. Other mallgoers are stopping by to charge their phones and tablets.

You'd be hard pressed to find a better value than something like this, and that's why I never travel without it.

Published 2014-02-05 @ 11:21 in Off Topic

Git Submodules Tip

I am not a heavy user of git submodules, but I do occasionally use them to include projects like Taffy or MXUnit in a way that allows us to upgrade frameworks in a project-independent manner. I've spent many days combined frustration dealing with headaches caused by submodules, and I think I've finally found a solution.

Typically, the problem is that SSH keys aren't properly configured or permissions are different from computer to computer. And unfortunately, once you've gone down the route of submodules via SSH, it's really, really hard to rip it out. If at all possible, use the git repo's HTTP url from the outset. I've found that doing so greatly reduces headaches, and the vast majority of the time you don't need to worry about security at all because it's a read-only scenario. If the submodule'd project needs to be updated, it can be updated separately.

Unfortunately I don't have any direct advice if you've already included your submodules via SSH. I could make some guesses, but I don't think it's an easy thing to do.

Published 2014-02-03 @ 09:22 in Git

My First Experience on

Last night I completed my first mentoring session on, so I thought I'd write a quick review of the service [As well as let you know that I'm available... :)]

The basic idea is simple

Connect someone that has a problem or some questions with someone else that has expertise and free time. Give them the tools to communicate and work through the questions and issues, and call it a day.

The mentor sets their rate (in 15 minute blocks -- mine is $25/15m, which is $100/hour) and payouts are made "around every 14 days"; which I assume is their business model: They'll just leech off the interest of holding onto my earnings for a couple of weeks. I'm ok with that! It means I get my full rate, I just have to be patient -- and CodeMentor will (hopefully) still be profitable. Win/win!

So how was my experience?

tl;dr: I'll continue to participate.

This was my first experience mentoring through the site, and overall it was positive. We spent a good 10-15 minutes sorting out what software we would use to share screens back and forth. CodeMentor does provide voice and video chat, as well as a text block to collaboratively code in a webpage, but we didn't use the text block at all. We were talking about an existing application so it made more sense just to share screens and look at his code in the context of his application, where I could see the directory structure, etc.

CodeMentor recommends ScreenHero for screen sharing, and this was my second attempt at using it. Out of two attempts, it has not worked at all. Ever.

Then we tried (no go -- we couldn't see each other's video) and TeamViewer (no go -- too laggy/froze often). Finally, the guy I was helping realized it was probably his wifi network causing problems, switched to an alternate network, and we tried, which worked well for us.

There were a few things about the CodeMentor interface that were unclear. Because we were having network-induced video issues at first, I decided to hit the "hang up" button and call him back. Bad idea! That ended our mentoring session and he had to create a new request so that we could reconnect. It didn't take long and we were right back into it, but I think the button needs to be more clearly explained.

I also have some nits to pick about the availability scheduling functionality (too simple, no recurring availability functionality -- so I have to constantly update my availability manually), but again, nothing that would keep me from coming back and continuing to use the service.

At the end of the day, for sitting down and helping someone else for a few hours I made enough money to cover buying a memory upgrade for my laptop that I've been considering for ages.

Want my help with something?

Here's my CodeMentor profile. My rate is $100/hour charged in 15 minute increments.

Officially doesn't offer CFML as a category, but I don't see why we can't shim it in...

Making a CodeMentor request

In addition to what's listed on my CodeMentor profile, I'm happy to help people with CFML and Taffy stuff too. Just write it in like I've done in the screenshot above.

Published 2014-01-28 @ 09:00 in Meta

Auto-reload Grunt config when you change your Gruntfile

I've been converting most of my recent apps from my old automation process using ANT to use Grunt, primarily because there are almost limitless options available via NodeJS modules -- something that can't quite be said about ANT.

One of my favorite Grunt tasks is the watch task, which can be configured to watch various sets of files for changes and run specific tasks when they do change. The way this works is that as you start working on the project you open up a tab in your terminal and start the watch task: grunt watch. This runs continuously until you kill it with ^C.

Today I found myself wishing Grunt would reload changes to my Gruntfile automatically so that if I change the path of a file or add a new fileset to be watched I don't have to restart it manually. Of course a quick google found the answer. Simply add this section to your Gruntfile:

watch: {
    grunt: {
        files: ['Gruntfile.js']

...And that will take care of it. Of course, you probably already have other watch tasks running which is why you want this addition in the first place. Here's what mine looks like right now, all combined:

,watch: {
    templates: {
        files: ['common/handlebars/*.handlebars']
        ,tasks: ['handlebars:compile']
    ,styles: {
        files: ['common/less/*.*']
        ,tasks: ['less:css']
    ,grunt: {
        files: ['Gruntfile.js']

Published 2014-01-22 @ 09:00 in JavaScript