John Wilger

Just a bunch of antiterminologicaldisintactitudinarianism

A Change of Seasons

| Comments

Almost four months ago I was on the doorstep of some changes in my life that I didn’t really know if I had the strength to face. It turns out that the changes were not going to be exactly as I thought and that I am a stronger person than I knew.

She made it to Ogden, UT that first night. There was a phone call. Tears. Panic. The realization that leaving her children on the other side of the continent wasn’t something she was really capable of.

“Can I come home?”

“Of course you can.”

What else could I ever have said? Anyone who knows me also knows that “of course you can” is the only answer I would ever be capable of giving. Whatever our relationship was or wasn’t, she’s the mother of my children. We’re family. Rule #1 is: you take care of your family.

So the overwhelming stress of being the only parent within three-thousand miles of our kids was lifted. There may now be a whole new set of complications to work through, but the kids have their mother, and we both have our kids close by; I feel so much better about the whole situation.

But there’s a certain point-of-no-return that we were well past. Coming back to be with her children isn’t the same as us going back to our lives as though the past eight months hadn’t even occurred. I don’t think either of us wants to live that way again. She has a spot on my couch until she can get on her feet, but it’s time for us both to move on.

There was a moment back in June where I made a decision. It was a small decision made without deliberation or hesitation. Just a split second thought. And yet I think that for the rest of my life I will look back on it as possibly the most important decision I’ve ever made. In that one instant the person I have been became the person I am.

I found something out. It doesn’t matter what it is, just that it made me feel sad and angry and hurt all at once. My first instinct was to seek the refuge of companions that had become all too familiar over the last several years: I just wanted to go buy a pack of cigarettes and a case of beer, polish both of them off within a couple of hours time and then go pass out in bed, wallowing in self-pity.

But something inside said “No!”

“No, you are done letting what other people do and say have this control over your life! You are better than this goddammit!”

I’m not sure why I thought of it, but instead of jumping into that hole of self-destruction, I got on my bike and rode it as hard as I could for about seven miles. I pushed every ounce of frustration into each pedal stroke. Although I owned a bike and always intended to ride, this was the hardest riding I’d done in many years. That seven miles took everything my 245-pound, out of shape body had. And when t was done, I felt fantastic. The anger was gone. The frustration subsided. Not forever, but for long enough that I caught a glimpse of what living was maybe supposed to feel like.

That night, I couldn’t sleep. My brain wouldn’t shut off. The frustrations held at arm’s reach in the light of day plagued my thoughts as I tossed and turned the entire night long. As 5:00am rolled around and it started to become light, I did it again. I got on the bike and pounded out those negative feelings into the pavement. And again I caught that glimpse of a life that I could live rather than one I could simply survive.

I did it again the next day. And the next. I started going farther. I started going faster. I started setting goals: be doing 100+ mile weeks by the end of the summer (which I hit in July); start racing in the summer of 2014.

It’s now four months later and I’ve logged over 2,000 miles on my bike since the day I decided to live again. I left about 50 pounds of myself along the way and began to see the cords of lean muscle forming in my legs and arms. My diet has improved out of necessity (get on that bike for a couple of hours and you’ll really regret last night’s fast-food!) While I haven’t sworn off alcohol, I went from having a few beers nearly every day to having had about four beers and a couple of mixed drinks total in the last four months. I’m now in the best shape I have ever been in.

Things aren’t perfect—life never really is, I suppose—but for the first time ever, I neither need nor even want things to be perfect. I’m learning that it’s the overcoming of the imperfections that make life worth it, because those are the experiences that shape us.

The days where I wake up, and it’s 40 degrees and raining, and I force myself to get on the bike and ride 30k anyway, and then get home and feel like I’m made of pure awesome—those days have really driven this lesson home: when you have a choice between doing something easy and doing something hard, the hard way is usually the right way.

Make the hard choice. Push yourself. Be stronger than you knew you could be, and conquer whatever is thrown your way. Once you’ve shed the cloak of fear and self-doubt that—like a parachute—pulls you back from that final step, then you get to meet the person you really are.

Day Zero

| Comments

  1. Remember to Breathe
  2. Feed the kids and the animals
  3. Make it until tomorrow

That’s my checklist for today. The day that she said goodbye. The day that she drove away at 5:30 AM to her new home 3,000 miles away and left me here with the four children we made together. The day that I never thought would happen, yet which I think part of me has known for 16 years would arrive.

The goodbye lasted for weeks, and yet it came and went so suddenly that I’m still not entirely sure it happened. She was here and then she wasn’t. We were and then we weren’t.

I have an extra space in my garage, an extra set of house keys on the counter, and the best wedding ring I could afford at the age of 19 was left in a box on the dresser that used to hold her clothes.

I could go on at length about our story, about all the things that a foolish teenager thought were certain, because dammit we were meant to be together and nothing was ever going to change that. I could talk for days about all the ways we hurt each other until there was nothing left of that dream except for a compulsion to keep walking down a road simply because we happened to already be on it. I could relate the same tale that my closest friends have heard, and with which they have helped me come to terms.

But I won’t.

Today is the day I put those memories in a box labelled “Lessons Learned the Hard Way” and put them up in the attic. Sometimes, when I’m looking for something else, I’ll run across this box and pull it out for a look. At first that’ll be really hard.

Maybe someday it won’t.

I don’t know when I’ll be able to look at these things without losing my breath, but I know that today I need to put it all away for a while and come to terms with the way my life will be from this point forward. I’m scared. I’m terrified that I can’t take on everything that I need to do in order to provide and care for my children.

It’s overwhelming.

I am overwhelmed.

So I fall back on what I know to deal with it. Break it down. Make a list. What’s the bare minimum I need to do today. If I can handle that, then I’ve earned another day. As Martha Kent said to a young Clark in the newest Superman movie: I need to “make the world smaller.”

Today I need to make it until tomorrow. Today I need to make sure my kids make it until tomorrow.

Today I need to breathe.

Kookaburra 0.24.0 Released; Exorcised ActiveSupport

| Comments

I just released version 0.24.0 of Kookaburra to Rubygems.org. While there were no changes to Kookaburra’s API with this release, it is a minor release rather than a patch release, because I removed ActiveSupport from Kookaburra’s dependencies. Previously, Kookaburra depended on ActiveSupport >= 3.0, and this prevented it from working smoothly with Rails 2.x applications (at least in the same Bundler bundle.) Since Kookaburra only used a small fraction of ActiveSupport, it seemed easiest just to break the dependency, so that your application can use whatever version of ActiveSupport it needs.

Because of the fact that ActiveSupport makes a number of modifications to core Ruby classes, if your application does not otherwise explicitly require ActiveSupport, some of these core classes may now behave differently. Specifically, Hash and String core extensions were being used, as well as ActiveSupport::CoreExt::Module::Delegation.

Also, where Kookaburra::JsonApiDriver used ActiveSupport::JSON for encoding and decoding of JSON data, it now uses ::JSON as provided by either the json or the json_pure gems. The tests on Kookaburra itself pass just by swapping out ActiveSupport JSON library for the new one, but these tests do not comprehensively test JSON usage, and there may be differences that impact your application.

Kookaburra declares its dependency on the json_pure gem (a pure-ruby version) in order to ensure that it works cross-platform. However, both json and json_pure are written in such a way that, when you require 'json', it will detect if both libraries are installed and prefer the natively compiled json gem’s version of the library.

Tmux and the OSX Clipboard

| Comments

I started using tmux recently after a) I was informed that GNU screen is basically an outdated POS, and b) an excellent book on the subject was published. I’m glad to have made the switch, as tmux is a wonderful improvement over screen. However, on OSX, I found that the pbcopy and pbpaste commands (among other things) would no longer work from within a tmux session.

After a bit of searching, I found this post that explains how to make things right again.

TL;DR:

run this
1
brew install reattach-to-user-namespace
add this to ~/.tmux.conf
1
2
# Reattach to user namespace so that clipboard integration with OSX works again
set-option -g default-command "reattach-to-user-namespace -l zsh"

Obviously, replace zsh above with whatever you use for your shell.

Kookaburra Rewrite for 0.15.1

| Comments

After getting some good feedback on Kookaburra since the original release announcement as well as using it in a few more projects, Sam and I decided to treat all of the versions prior to 0.15.0 as a spike and rewrite the framework from the ground up. Although we certainly learned a lot about the approach with the pre-0.15 versions, the problems with continuing to grow Kookaburra from that seed became apparent as we tried to use it in more applications.

Because the original code was extracted from another project, the Kookaburra framework itself was not well tested. It had been indirectly tested due to its position within that other project’s tests, but as a seperate library it lacked tests that would help bot document the project and ensure newcomers can work on it with a good safety net. Additionally, there were a number of design decisions made in the earlier versions of Kookaburra that were…questionable. Not only would these decisions probably have been made differently if the development of the framework itself had been driven with unit tests, these decisions in many cases made it difficult to go back and add tests after the fact.

Starting with 0.15.1, which I just released a few moments ago, Kookaburra has been rewritten using a proper TDD approach. In some ways, 0.15.1 is possibly less functional than its 0.14.x cousins, but it is almost certainly easier to understand and contribute to the project from this point on. Please have a look at the new codebase, try it out in your projects, and send me a pull request with updates to the library. Also, if you have any problems getting it running, please don’t hesitate to let me know.

Using Jeweler for Private Gems

| Comments

I really like using Jeweler to create and manage gems, but its default behavior is to publish your gem to rubygems.org whenever you run rake release. This is great for generally useful libraries that you want to open-source, but not as great when you want to use gems as shared libraries for internal use only (whether because the code contains business secrets or just because it’s not something that would be useful to the community at large.)

After a bit of poking around, I figured out how to use Jeweler to manage your versioning, gemspec and git tagging without pushing the result to rubygems.org when running the release task. It turns out to be both obvious and trivial. Just add the following line to the end of your gem project’s Rakefile:

Rakefile
1
Rake::Task[:release].prerequisites.delete('gemcutter:release')

Acceptance and Integration Testing With Kookaburra

| Comments

UPDATE (2012-01-22): I realized this morning that the credit I gave to Sam Livingston-Gray below may not have adequately shown how instrumental he was in getting this project off the ground; especially since much of his work was done in the private repository from which this was extracted. So, thanks, Sam. This might not have gone anywhere if you hadn’t worked to put the idea in practice in our application and helped everyone on our team learn how to use the approach. I made a few minor changes below to reflect this a bit better.

We’ve been using Cucumber for acceptance testing at Renewable Funding since back when it was still part of the RSpec project (indeed, since before we were even Renewable Funding). While we’ve always liked the ability to have plain-language feature documentation that we could automatically test against, after years of adding to and maintaining a fairly large set of Cucumber scenarios, the cost of that maintenance was starting to really slow us down. The test suite began to grow fragile, and it seemed like every time one of our UX designers changed anything about the application’s interface, the development team would spend a bunch of time just babysitting Cucumber tests to get them passing again.

Last year, as I was reading Jez Humble’s excellent Continuous Delivery book, I was inspired when I came across the section titled “The Application Driver Layer” (p. 198). This section describes an approach to acceptance testing where the specification and the test implementation are isolated from the details of the application’s user interface by inserting a layer between the two that uses good old OOP to abstract the user interface components. Martin Fowler describes it as the Window Driver pattern on his website.

I started a proof-of-concept implementation of this pattern last summer, then my coworker, Sam Livingston-Gray and I started pulling it into a new project at work. After Sam and the rest of the Renewable Funding team helped improve on my original attempt while putting it to use for the last six or so months, we extracted a library to make it easier for other Ruby developers to implement this pattern in their testing. I’m happy to introduce Kookaburra to the world.

RPG Character Tokens

| Comments

I recently started playing Dungeons & Dragons again (after not playing since I was in high school). I’m DM-ing a game for my son, Jacob, and a few other folks. We’re playing 4th Edition, which relies heavily on a battle grid and character tokens to represent combat encounters. In order to save money and hassle, I wanted an alternative to searching for and buying the correct miniatures for each encounter.

OMFG

| Comments

An image of a man covering his face with his hand and wearing a shirt with the acronym OMFG on it.

I wish this photo was a bit sharper, but it still sums up my feeling pretty well about… well… a lot of things. :–)

Switched to Octopress

| Comments

Sometimes it seems the only time I post to my website anymore is when I decide to switch out the software that’s used to publish years-old articles. :–(

At any rate, I’m switching over to Octopress to run this site, because a) it’s the new awesome, and b) maybe I’ll spend more time writing articles if I’m not trying to tweak my home-grown blogging engine while I do it. I chose Octopress because it has the parts I like about jekyll (I get to write my posts in vim and eaisly manage the content with git), but it has more of the rough edges smoothed out (again, so I can spend my time writing articles instead of working on the engine.)

As part of this, I’m also moving the site from Heroku to Github Pages. Nothing at all wrong with Heroku; it’s just one fewer thing for me to deal with.

I’m now going to port over old articles (a much easier task than last time, since the last version of this site was also using markdown-formatted text files.) The comment system was already on Disqus before, so hopefully I can figure out how to get the old comments associated with the new URLs.