Bundler 1.10.x and Warbler 1.4.7 are NOT friends

On the off chance that you are deploying Ruby apps as Java Servlets using JRuby/Warbler, beware of recent releases of Bundler. Bundler 1.10.0 came out this past Sunday (May 28, it looks like), and it doesn’t play nicely with Warbler. The failure happens when you first use Bundler >= 1.10 to build a dependency tree prior to running warble, whereupon warble blows up with a distinctive error message like ArgumentError: dependency name must be a String, was #<Bundler::StubSpecification:0x1e69dff6. …

Posted on

A Ruby client for the SurveyMonkey REST API

So, if you’ve had an email account for more than a few minutes, you’ve probably at some point been prompted to fill out a survey hosted by SurveyMonkey. They’re a ubiquitous online survey service. As it so happens, they offer a RESTful API enabling customers to access their survey data programmatically. Their API is hosted by Mashery, which is some sort of API service provider; I hadn’t realized that this was a thing, but it makes perfect sense now that I think about it; you get a consistent API style, you get someone else managing your public-facing API endpoints, seems like a fine idea. …

Posted on

Moments of Transition

I had a post I had been meaning to write this evening. I’d been thinking about it since I woke up; essentially, last night an acquaintance posted something on a mailing list (in the course of a discussion of a code of conduct) that really brought home to me that there’s a certain population in my community with whom I simply do not share common values and priorities. Sure, this is not unheard-of, and is not really news to me, but it’s still a bit saddening and alienating to realize it so viscerally, and so I was going to write about that feeling, and then get up on my soapbox and declaim for a while. …

Posted on

Ada Initiative names new Executive Director

Dear friends, let me present to you Crystal Huff, the new executive director of the Ada Initiative. They’re really fortunate to have her :) and I am really looking forward to being able to ride along on this next adventure!

Posted on

I Have Become A Stereotype

So, a regional Comcast outage (and associated interruption of my home broadband connection) has finally completed my transformation into full-blown DevOps Hipster. I have packed my sticker-festooned MacBook and my vintage studio headphones into my messenger bag and strolled off to the local coffee shop (bearing in hand a burnt-out CFL bulb, to be recycled at the hardware store en route), there to finish out the workday stroking my goatee while I contemplate the AWS console and try to write some Java. …

Posted on

GitHub Third-Party Application Access

My buddy Phil recently encountered an interesting example of unintended consequences by starting down the (initially nonthreatening) path of trying to integrate a third-party site with a GitHub organization. It turns out the default access control configuration of a GitHub organization allows any member of the organization to grant third-party apps access to the data in that organization. Go back and read that again. Then read Phil’s writeup for some more details. …

Posted on

Serving index pages from a non-root location via CloudFront

As a change of pace from my last post, I now present you with a wonky AWS issue, created mostly by departing from Amazon’s standard pattern of S3 static site hosting; hopefully this will be useful to someone else in a similar position. So, as you may be aware, you can use AWS S3 to host a static website. Furthermore, once you’ve done so it’s not difficult to use AWS CloudFront (the content distribution network service) to serve out your site; the CloudFront workflow is clearly set up for you to put CloudFront in front of a S3-hosted website (such as this blog!). As long as your site is laid out something like the following, you’ll be in good shape: / /index.html /images/ /images/foo.png /images/bar.png ... However, you can run into odd behavior if your site contains paths like this: ... /some_subdirectory/index.html ... and you want to be able to browse to http://your-site.tld/some_subdirectory/ and have the server automatically serve out the index page. Since S3 doesn’t really have a notion of a directory hierarchy, but rather has a flat structure of keys and values with lots of cleverness that enables it to simulate a hierarchical structure, your request to CloudFront gets converted into “hey S3, give me the object whose key is some_subdirectory/”, to which S3 correctly replies “there is no such object”. When you enable S3’s static website hosting mode, however, some additional transformations are performed on inbound requests; these transformations include the ability to translate requests for a “directory” to requests for the default index page inside that “directory” (which is what you want), and this is the key to the solution. In brief: when setting up your CloudFront distribution, don’t set the origin to the name of the S3 bucket; instead, set the origin to the static website endpoint that corresponds to that S3 bucket. Huh? Ok, here’s an example: …

Posted on

Losing Weight

[Content warning: I’m about to talk about my personal weight loss. I’ll do my best not to repeat the same fatphobic crap you’ve seen before, but at the same time, be warned that I am dissatisfied with my own weight and have been working on changing both the weight and the dissatisfaction.] I’ve always been on the heavy side. I learned the word “percentile” from the pediatric growth charts in my childhood doctor’s office, in the context of discovering that I was always above the 75th percentile in weight for my age (though not always in height). The first time I ever remember being ashamed of my own body was in grade school, sitting on the flat plastic seat of a swingset and noticing how my thighs squashed against each other; from then on I disliked wearing the navy blue uniform shorts my school required in warm weather, even though the navy blue slacks were hot and heavy in the spring and early summer in the muggy Ohio River valley. I remember not being able to run as fast as other kids, or as long, but at the same time I wasn’t prodigiously strong like some of the other oversized kids in my class. As I got older, I got into better shape (thanks first to martial arts, and then to cross-country running; I wasn’t particularly spectacular at either, but I was good enough). Cross-country in particular was the refuge of my overachieving circle of friends during our high school years, when we decided that we should probably do some sort of sport, but needed to find one without an overly onerous time commitment. My undergraduate years, however, were not great for me as far as my weight was concerned. I stopped exercising, and between the dining hall and the late-night house of pizza across the street, my freshman fifteen (ha!) was more like a freshman eighty-three. Eventually I found myself a comically stereotypical systems administrator (beard, ponytail, cargo pants, paunch encased in black t-shirt). The ponytail was the first to go, and the glasses came to replace it, but the paunch stayed throughout the years. So what? …

Posted on

Outrunning the T

So, a couple of weeks ago we challenged the MBTA to a road race. My colleague Matt and I posted on our engineering blog about some of the backend work we did to support this event. I really love this stuff. :)

Posted on

SSL Root Certificate Hashes

Speaking of things about SSL that I am tired of forgetting: Programs that use OpenSSL libraries (including the OpenSSL command-line tools) can sometimes need handholding in order to find their certificate authority root certificates. For example, here’s me trying to verify that a newly deployed certificate is valid: $ openssl s_client -connect ${HOSTNAME}:443 </dev/null CONNECTED(00000003) depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3 verify error:num=20:unable to get local issuer certificate verify return:0 What you say? …

Posted on