Glad You're Ready. Let's Get Started!

Let us know how we can contact you.

Thank you!

We'll respond shortly.

Phil Goodwin

Posts By

Retrofit REST client for Android


I recently started a beach project from scratch and wanted to get a quick jump on connecting to the RESTful backend we’d already started developing for the project. On past Android projects I’ve always pulled the ApiGateway code out …

Read more

Read More

"expect errors"

Helps "expect errors" when compiling Ruby with clang

Compiled Ruby with clang and the compile output contained a warning to "expect errors". Has anyone experienced these alleged errors?

One member or our audience said that they had compiled the same …

Read more

Read More

Standup 5/3/2012 Time, time and more time


"How do I avoid timing problems while doing integration tests on single page apps?"

  • Use a wait_until block with a selector which has not been cached.
  • Use a wait_until block with a piece of javascript using evaluate_script which you expect to return when your page is finished loading.
  • Use a wait_until block which waits for all AJAX to stop using $.ajaxStop().


  • Time.parse(invalid) will throw an exception, but will return nil. Because Time.parse is part of the Ruby library while is part of Rails.
  • parallel_tests really does speed up your tests. It munges all the output together into an ugly mess though.

Read More

Standup 5/2/2012 A hack a day…


  • is not aware of the local timezone, but Date.yesterday is. Use Date.current or instead.
  • Hackathon May 12-13 for mobile game development. More info

Read More

Standup 5/1/2012 Coping with external APIs


"How do I not use VCR with Webmock in a spec?"

Use VCR.eject_cassette, see: docs

"Facebook now expires all tokens after 60 days. If you schedule a task with Facebook in the future it may use the expired token. Any solutions?"

Sadly there is nothing you can do. Send the user an email to re-auth.

"Good way to get replies on Twitter?"

Nope. Crawl thorough all your mentions, to get to your replies.

Read More

Standup 4/30/2012 Facebook and Unicorns


"How do I prevent Facebook from kicking out my "demo" user when all the devs are logging into that account multiple times a day?"

Some people have had luck with creating that kind of account dynamically on a per use basis.

"How do you make sure unicorn restarts when running under runit?"

A project is running Unicorn under runit, and finding it doesn't always restart when it's told to. It seems Unicorn just isn't responding to the signal. No one had seen anything similar.

"Can heroku_san automate the managing of my addons?"

Update to the newest version! See the github pull request

Read More

Standup 8/30/2011 Cruisin' for trouble


*Why is Cruise Control green when my tests are failing?

Probably because the rake task running the tests returns zero. Cruise Control relies on the exit code of the processes it runs to determine whether to report success or failure. This seems like a common Cruise Control pitfall. It's good practice to run a failing test through Cruise Control during initial set up in order to avoid this problem

Read More

Standup 5/27/2011 Hack For Change, Guiderails goes public, Jenkins & Jasmine jems


*Is there a way to change the URL that CCRB pulls from when it builds?

"Use Jenkins" (we will be standardizing on Jenkins in the near future anyway)

Apparently the answer has been found successfully in the past by grepping through the Ruby portion of the CCRB source.


  • Hack For Change, sponsored by is inviting engineers and designers to spend 24 hours to build a web or mobile app that can help advance positive change. Top-rated hacks will be awarded a total of $10,000 to ensure their continued success and will gain recognition through widespread media coverage and promotion.

  • Guiderails: Pivotal's Rails 3 Templates, has been made publicly available on GitHub.

  • While there is not consensus on how hash tags in URLs that are being redirected should be handled, Safari stands apart from most other modern browsers by throwing them away entirely.

  • When configuring a new project for Jenkins, remember to specify the branch to build, otherwise Jenkins will try to pull and build all branches from the repo.

  • Jasmine has a bug in its "runs and waits for" construct that causes it to ignore changes to the defaults for the timer and message on the "waits for" block.

Read More

Standup 5/25/2011 Cloudfront logs, terrible YAML, and RubyMine can CanCan


*Is there a way to log in and download log files from Cloudfront, preferably programmatically? They can be obtained from the management console but access is needed from the command line.


  • In Ruby 1.9.2 the delayed_job facility uses the Psych parser to serialize and Syck to deserialize the delayed job, with unpleasant results. One way to solve the problem is to go into the Ruby installation and "if false" away the Psych source code, it's an admittedly terrible approach, but it has the appeal of actually working.

  • Ruby Mine does not behave well with CanCan out of the box. The problems can be fixed by editing the CanCan Ruby file and commenting out the line that sets rspec equal to spec unless rspec is already defined.

Read More

Standup 12/17/2010 Comparing indexed date columns, git subtrees, Headless Selenium for CI


Is there a way to get MySql indexing to speed up queries involving greater and less than operators on date columns?

Postgres handles these operators a little bit better than MySql, but may not actually solve this problem.

Using millis instead of dates would give the DB the best chance of handling this scenario.

We are using Git's subtree merge facility instead of submodules to stay synced to a different repository for part of our project. How do we push changes back to that repo?

See Tim Connor's blog post "Git sub-tree merging back to the subtree for pushing to an upstream". Early in that post is a pointer to an article describing the the subtree merge operation. Tim goes on to explain how to push your changes back through the chain.


  • Some cloud environments leave the names of temp files visible even when their contents are not accessible. Be sure to use obfuscated names for your temporary files!

  • The "Headless" gem allows you to easily set up an alternate "display" that allows programs to execute in a headless environment. See this blog post about how to use Headless to run Selenium tests on a CI box:

  • Ccrb will bog down to painfully slow levels if more than a couple of CC Tray clients are pinging it repeatedly during a build.

  • Cron will not honor your .rvmrc file unless you do some work to set up the environment. If you set up your cron job like this:

0 6 * * * /bin/bash -l -c 'echo /home/someuser/.rvm/bin/rvm rvmrc trust ... && cd ... 

the -l & -c parameters cause bash to load your environment as if your were logging in before running the specified commands. Someone also mentioned that rvm-shell can be used as a solution to this problem.

Read More