Shauna Gordon

Code Is My Art

Lodging With AirBnb

| Comments

Last week, I had the pleasure of going to New York City for Laracon US. It was a phenomenal experience, but there was one problem — New York City is bloody expensive. At $250 a night for the group rate, the hotel was no exception, and the disadvantage of being a female in a male-dominated industry is that finding a roommate to share a room with is damn near impossible. So, I was on my own for finding a way to save a little money on lodging. Unfortunately, the traditional booking agencies didn’t really have anything that were much of a savings and near to the conference venue.

Enter AirBnb

Some of the guys who were involved with last year’s Laracon EU introduced me to AirBnb. It’s an interesting concept — people rent out a room in their home for a given price per night. Generally, this results in a cost savings for the guest, and helps defray the host’s cost of their home. AirBnb works like a booking agency, helping guests find and book places to stay; an escrow service, holding the money in the event a refund is needed and ensuring the host gets paid for services rendered; and housekeeping, making sure the room is ready for the guest and in good shape between guests.

I decided to check it out to see what I could find, and I lucked into an opening just a couple of blocks away, for about a third of the cost of a stay at the hotel. So, I put in a booking request (hosts can approve or refuse booking requests), and a short while later, my request was approved.


A few days before I was to be in NYC, both AirBnb, and my host, sent a couple of emails that included pertinent information, including how to get to the apartment, how to get into the building, which bedroom to use, and how to open the murphy bed in guest room, as well as a general reminder of the trip itself. To help maintain privacy, details like the exact address are left out until after the booking is confirmed, hence the emails.


Getting to the apartment was pretty easy. It had been a while, but I’ve had some experience with NYC’s mass transit system (the Metro Transit Authority, or MTA), so the first thing I did was find an MTA kiosk and pick up a card, then made a beeline to the bus station from LaGuardia Airport (LGA). From there, it was an easy train ride down to Soho, and a short walk to the apartment. It took about an hour to get there, which is, from what I can tell, a pretty average time between LGA and Manhattan.

When I got there, I followed the instructions to get in, and got into the building pretty easily…to find that his wasn’t the only apartment, and it turned out to be a multi-story walk-up. No problem (on review of the description, that was noted, but it seems that the listing changed since I booked, so either I missed it, or it wasn’t there before). Not an uncommon occurrence in Manhattan buildings. It’s definitely an older building, with narrow, steep stairs indicative of 19th century (or so) architecture. As a young, decently fit adult, I didn’t mind, but it is something to consider/ask about if one has any kind of issues that would make such a setup an issue.

The apartment itself was a pleasant contrast to the stairwell. It was still small and narrow, but it had been recently updated, making it a fairly attractive place to stay. I was told that the guest bedroom (which was teal in color) was “to the left.” Well, technically, it was more like “around the corner,” but it’s not like a 500sqft apartment is easy to get lost in, and the one other bedroom was very much not teal.

So, I go over to the other door and…it’s locked. Odd, but it’s one of those locks that’s unlocked by a coin. I find one and go in to find stuff in it. It looks like someone else is staying there. Again, this seems odd. There was never any mention made that I wasn’t the only guest (I was under the impression that the host was renting out his spare room, and therefore would be occupying his bedroom). So, I pinged him via email, stashed my stuff, and went on my way as I was meeting with others.

A short while later, he emailed me that yes, indeed, there was another guest there, and I was to actually have the not-teal bedroom. As it turned out, the host wasn’t in town at all and was renting out both rooms that week. That would have been nice to know, but really, it’s my only real complaint, and it was straightened out with a couple of emails. Besides, it worked out largely in my favor, because I got a real bed, and not a murphy bed. Since I was using the place solely as a crash pad, and would be spending my waking hours elsewhere, the fact that I was sharing the common areas with someone else was a non-issue, and the bed was the most important feature for me.

From what I could tell, the murphy bed in the teal bedroom was a full bed, with a small couch for extra sleeping if needed. Not a ton of space, but enough to sleep a couple of people pretty comfortably, with some space for luggage. The other bedroom was large enough to fit a queen bed and some typical bedroom furniture, which noticeably more walking space, making it the roomier of the two rooms. A couple of large windows allow quite a bit of natural light in — which is great except for the part where it wakes the light sleeper early in the morning (actually, not a terrible thing, as it served as a great alarm clock for me to be up in time to have a leisurely breakfast with my friends before the conference started for the day; I’ll take it over a blaring alarm clock). They did also let sound in pretty easily, and since it’s in the middle of downtown Manhattan, that means the usual city sounds. Those who are used to rural areas may have a hard time sleeping, but coming from a not-so-quiet city, myself, along with long days on the town and walking everywhere made it a non-issue for me.

Like the apartment as a whole, the bathroom was really small. Now, I’m used to small bathrooms. The combined floor space of my three bathrooms is all of 80 square feet (I can floor the largest one with a single box of flooring). But this one made even mine look large. If you’re a large person, expect to have to step into the tub to be able to close the door, because it opens inward, and there’s only enough floor space for the door to clear the toilet and sink, and for one’s knees when sitting on the toilet. It’s a tight fit, to say the least. Works for me, though, because it leaves more space for more important rooms — in this case, bedrooms. I do kind of feel bad for the other guest, as the teal bedroom was right next to the bathroom, so I doubt my early morning showers were all that welcome. At least the front door was away from that bedroom, so they weren’t as likely to be disturbed by my coming in at all hours of the night. No doubt they wondered whether I got any amount of sleep at all, or if I was just a suitcase that showed up randomly and disappeared just as randomly.

Overall Thoughts

All in all, it was a good experience, and largely went as expected — I rented a bedroom in which I could crash for a couple of hours a night for a few nights. The host was great and readily responded to my questions. The location was about as perfect as I could get for my needs. The bed was comfortable and the apartment was clean. If you’re looking to stay in New York City, I definitely recommend checking out AirBnb in general, and this Soho apartment, specifically.

(P.S. — If you want to use AirBnb, either for booking or for hosting, have a referral link for a $25USD credit toward your next reservation on AirBnb.)

Project - Raze West Virginia

| Comments

The Client, and a Little History

While working at Fahlgren Mortine, I had the opportunity to work with the West Virginia Department of Health and Human Resources (DHHR) on the new website for their teen anti-tobacco campaign, Raze West Virgina.

I’m already familiar with teen anti-tobacco campaigns, having been involved in Pennsylvania’s for a time when I was a teen, myself, but I found out that what makes West Virginia’s somewhat unique – and very important – is that West Virginia ranks as the highest, or second highest (in some subcategories), of tobacco users nearly across the board, from adults, to pregnant women, to teens. When nearly a third of everyone around you, no matter the demographic, uses tobacco, that’s a lot of peer pressure.

Enter Raze

Raze is one of several youth anti-tobacco campaigns in West Virginia. It’s a little different from many others, because it’s not just conferences. Rather, it’s groups of teens at the school and community levels (“crews”), sponsored by an adult, that help create a grassroots anti-tobacco movement. They do this by organizing what they call “commotions,” or micro-events to help raise awareness and “tear down tobacco lies.” These commotions can be as simple as handing out fliers, or as large as holding an assembly.

As an added incentive, organizing commotions earns the crew a certain number of points. At various thresholds, the crew then earns gear, ranging from pens to backpacks, emblazoned with the Raze logo.

Our Role

As West Virginia DHHR’s advertising campaign provider, Fahlgren Mortine was provided a number of tasks in an effort to rebrand the Raze campaign. Among them, was redoing the website and crew management system.

The Challenge

Raze had an existing crew management system and public-facing website, but it was getting old, and had become unweildly to maintain and use. They needed something more modern, more robust, and easier to use and manage. They needed something tailored to their needs, instead of an off-the-shelf solution that needed to be hacked around and have dozens of add-ons tacked on.

The Solution

Instead of going with another off-the-shelf solution, we decided to build a custom system from the ground up. This would allow us to provide them with only what they need, and provide it when they need it.

The Tech

In order to keep the codebase maintainable, we used the MVC framework, Laravel, as the backbone of the application. Combined with the PHP package management system, Composer, this allows us to swap out certain parts (particularly third-party libraries) nearly at will, without much consequence to the application as a whole.

Stylized tooltips to add that application feel

To make development of the interface faster and easier, the dashboard interface was built with the help of Bootstrap. This allowed us to spend less time on building interface components and making them look good, and more time putting them together into a user-friendly interface. It also allowed us to add small garnishes, such as stylized tooltips, for browsers that support the extra features.

Even with the help of Bootstrap and Laravel, we still found ourselves using quite a bit of JavaScript, as well as a fair amount of CSS customization. To help keep these maintainable, and to allow us to generate minimized JavaScript and CSS files, we used the CSS preprocessor, Sass, and the Node.js-based task runner, Grunt.

The Logic

While we also redid the public facing site (, the dashboard interface at is where the bulk of the work, and the heavy lifting, are done.

The Raze Dashboard

At its core, it’s a user and event management system. Adults and students sign up and join their crews. Adult advisors and crew leaders can schedule commotions based on pretermined choices, and can register for region and organization-wide events (such as Regional Raze Kickoff Events). When the commotions are completed and logged, the system tallies up the crew’s total points, and standing compared to other crews, based on the point values of the commotions they performed.

Site Administrators can also generate reports for various statistics, in addition to taking suggestions for, and adding, new commotions, scheduling events, and sending announcements.

Final Thoughts

This was one of our first built-from-scratch content management systems, so one of the biggest lessons was that such systems are quite a bit larger than they appear.

It was a fun project, though, and really allowed us to stretch our legs when it came to Laravel. It also allowed us to start incorporating some of the automation capabilities of Grunt, which will prove to be invaluable in future projects.

Vagrant - Initial Thoughts

| Comments

So, I finally did it. I finally started playing with Vagrant. I have to say, I quite like it.

At the moment, I just have a generic Ubuntu box that I downloaded from Vagrentboxes and then used a script to download the dependencies needed to run Octopress and my blog. Add a little port-forwarding magic, and I no longer have to deal with RVM, Ruby versions, and what-have-you on my MacBook Pro (this is a very good thing, as I’ve found OSX to be surprisingly hostile to developers in its attempt to be “helpful”). This is great, but quite cumbersome, because it involves updating apt-get, installing a bunch of things that have a laundry list of dependencies out of apt-get, then installing the Ruby gems needed, then, finally, running rake preview. Once it’s up and running, it’s great, but that process takes somewhere between 5 and 10 minutes.

Come on now, we can do better than that.

So, now, my next project with Vagrant will be to create a box that already has the necessary prerequisites for Octopress. Then, at some point, I think I’ll make one for other development projects, too. I suspect it will save me – and some of my coworkers – quite a bit of headache when it comes to dealing with different development environments (I know at least one coworker who has to support legacy 5.3 applications, and help with our new Laravel apps that require 5.4+ due to our heavy usage of array literal notation).

Box-sizing: Border-box and Changes in How We Use the Box Model

| Comments

Back in the days when Internet Explorer 6 reigned supreme, when Firefox was just getting its foothold and taking shares from IE, and Chrome was barely a Googler’s pet project, the browsers followed different box models.

Firefox (as well as the then little-known browsers Opera and Safari) followed the W3C standard box model, what is now known as “content-box”. Internet Explorer, on the other hand, followed its own box model, what we now call “border-box”. As Firefox began to rise and threatened IE’s market share, Web developers were singing the praises of the content-box style box model (which was one of the many W3C standards that IE ignored, and Firefox implemented), to the point that when Microsoft finally released Internet Explorer 7, it implemented the standard box model.

Project: Octopress Theme Toytown

| Comments

As part of yet another redesign and blog migration, I needed to create a theme that wasn’t so stock. I migrated my site to Octopress, a blogging platform that runs on GitHub’s Jekyll static site generator. It’s a great platform, as anyone who follows my Twitter or Google+ accounts is aware, but the vast majority of sites that run on Octopress use the default theme, or some slight variation thereof. As good and nice as the default theme is, it’s become very generic. I needed something different.

Anatomy of an Octopress Theme

| Comments

As you can probably see, I’ve updated my theme to something a little less Octopress. I still have a few changes to make, such as getting a background image that fits a larger viewport. It probably also needs some polishing for things that I haven’t run across yet, and deal with IE8 and below’s lack of support for RGBA and media queries, and I might toy around with how it responds to different sizes (oh yeah, and tweak how lists in the content are laid out), but other than that, it’s pretty much done.

I’m by no means a designer, so I doubt anyone but me will really like it, and if my history has anything to say, I probably won’t like it myself in six months, but for the time being, at least, it’s not the very generic, default theme. It also adds a base theme to the (currently insanely small) pool of Octopress themes.

Yes, Yes, I Know

| Comments

I know, I need to put a new theme on this thing. It’s funny how you start seeing something everywhere once you find out about it for the first time.

I’m not totally sure when, but I fully plan on building a new theme. I’d like to play around with responsive design, so this should be interesting.

I’ll also be looking into a sort of “tag cloud” for the sidebar, and a way to list the “tags” (or, as Octopress calls them, “categories”). I find it hard to believe that you can put categories into your posts and not be able to make use of them.

Oh, and your tip for the day – I never remember to use “rake” for doing Octopress tasks. I always want to run “octopress [task]”, so I added to my ~/.bashrc the line:

alias octopress="rake"

To use it right away, just run source ~/.bashrc. :)

Yet Another New Home for the Blog!

| Comments

Yes, I know. It seems like I’ve changed blog platforms on an annual basis. With a little luck, this will be the last time.

What Happened?

In short, I became disillusioned with Blogger. It seemed like a nice platform, at first, but I soon came to find the cracks in the foundation. So, after some thought about what I really want/need in a blog platform, I decided to go a different direction.

Use Pidgin and Google Apps to Chat

| Comments

Who doesn’t use instant messenger of some form these days? Those of us from the days when there were as many chat programs as people probably have half a dozen accounts or more, or at least did at one point (who didn’t have ICQ, MSN, AIM, and Yahoo?). Thank goodness for unifying applications like Pidgin/Adium, Trillian, and others.

Now that some of us old chatters have grown up and created businesses (or at least business names) of our own, we may need to add our Google Apps accounts to the mix. This is a little trickier than just adding a Gmail, or other established provider, account, but thankfully, it’s not that difficult. I found, though, that start-to-finish instructions for getting set up on Pidgin were lacking, so we’ll cover them here. These instructions will work for Pidgin, and should work for Adium (the Mac port of Pidgin), though one may find the settings in slightly different places, due to convention differences across the platforms. The basic information should also work for other clients, such as Tillian, though, obviously, you’re on your own for finding were to enter everything.

Fun With Python!

I’m terrible about coming up with projects to do to learn a new language. As such, I generally pick them up as jobs require them. This makes it difficult to find a good reason to pick up a new language for me. So, when I made the decision earlier this week to learn Python, I decided to go a slightly different route - Gedit plugin development!