Tech and talk from Atlanta, USA

Welcome to PeachShake, Ruby on Rails consulting in Atlanta, GA. If you're looking for the best Rails developers in Atlanta for your project or startup, you've come to the right place. Want to get in touch? Drop us a line.

21 August 2011 0 Comments

Data sanitization for Rails / ActiveRecord production database in development

Data ScrubbingI’ve been thinking more lately about the dangers of having a copy of a production database stolen. This can happen in any number of ways, but the one that troubles me most is a stolen development laptop. If my laptop were stolen, I know there would be a 99% chance that the thief would completely ignore any databases on it, but it would still be a major source of worry for me. There could also be an ethical or legal imperative for me to alert my users to the possible disclosure of their identifying info.

To combat this worry, I make sure to sanitize and remove all the user data when I import the production database into my development environment. With a few SQL statements, it’s pretty easy, like so:

update users set email = concat("user", id, "@example.com");
update users set crypted_password = "foo";
update users set salt = "bar";

With those simple statements, I’m able to mask out the sensitive user data that would be a major headache were it to be stolen. Plus, since they bypass ActiveRecord and use raw MySQL, they execute very fast.

Still, this is a bit of a pain to do each time, and it would be nice if there were a gem to automatically handle this. I can imagine defining a YAML file with the fields you want sanitized or obfuscated, then running a rake task to do this for you after a new production import. It’s about time for me to make yet another half-assed gem, so maybe I’ll put some work into this.

If you’re still curious about sanitization techniques, I recommend this paper on data sanitization techniques. It’s very short and gives a good overview of the various approaches.

15 August 2011 3 Comments

When Work and Play Collide – GenCon 2011 Advertising Analysis

In part 1, I discussed the runup to GenCon. In part 2, I discussed actual events at the con. Here I will discuss the outcome of our initiatives. The first two parts were a little touchy-feely, mainly dealing with my feelings of dread leading up to the con. If you don’t care about my GenCon depression and instead want some cold business numbers and analysis, then this post is the right place to be.

Our Bowling Shirts

Nifty, eh?

Bowling Shirts

We bought 3 matching bowling shirts from bowlingshirt.com. They came out to roughly $70/each including shipping, so they definitely weren’t cheap. The thought, however, was that with a big logo on our backs, we would be easy to spot for any of our fans. My hope was to get more people coming up to us so we could chat with members of our community.

Unfortunately, that really only happened twice in the entire con. Both times it was really cool, but the second time was especially nice. Ryan and I were in Subway eating right before the ENnies when we were spotted. We were a little nervous about the awards, so we banked some good karma by buying dinner for the three guys who spotted us. Hopefully they all ran home and immediately signed up for Ascendant memberships, but even if not, doing stuff like that is still my favorite way of spending our Obsidian Portal money.

Ultimately, I’d say the shirts were a bit of a wash. Not the worst spend of our money, but still not a smashing success. The fact that they’re reusable for con after con is a big plus, though. There’s an upfront sunk cost, but as long as I don’t gain too much weight, I can wear the same shirt to the next con.

Badge Stickers

Of course, I had to have one of E's stickers as well

Badge Stickers

We were planning on handing out stickers, but E of GeeksDreamGirl warned us that giving out stickers was against GenCon policy, presumably because people would stick them up everywhere. However, she pointed us toward badge stickers, and I’m very glad she did. For about $80 we picked up 250 badge stickers with our name and logo on them, which works out to roughly $0.35 per-item-price.

The badge stickers were a big hit, with people wanting to grab one even if they didn’t know who we were. Plus, they served as excellent business cards. If someone was curious about the site, I would just hand them a sticker and tell them to check us out later. I knew there was a much better chance they’d remember if they saw it sticking to their badge than if they just pocketed a card or stuffed a flyer in their bag.

Honestly, I’m surprised more people aren’t printing stickers. Mayfair Games gives out dozens, but otherwise pretty much nobody does. I guess I’m glad, because it helps ours stand out more. If you’re one of the five or so people who read this blog, now you’re in on the secret. ;)

Dragon Tokens

$4 worth of tokens...

Plastic Tokens

We also ordered 100 plastic tokens to give away as…well…tokens. They were just a little trinket to hopefully entice people and reward our fans. They can also be used in-game as an action point, fate point, or whatever benny your system provides.

The per-item-price on the tokens was about $1.00, considerably higher than the stickers. Were they a good buy? It’s hard to say, since we really can’t get any kind of direct ROI measure on them. My gut feeling is that they were less enticing than the stickers, and people didn’t really know what to do with the tokens. Maybe they’ll find it when going through their bags at home, but then they’ll probably just toss it.

We really wanted to get some laser etched wooden ones, which looked nicer and were cheaper (about $0.60/each at 100 quantity), but we couldn’t get in touch with the manufacturer so had to switch to plastic at the last minute. I must say I was pleased with the quality of the Dapper Devil plastic tokens, and the service was fast and professional.

If you absolutely need something to hand out, the tokens are a decent buy, but they’re pretty expensive and hard to really explain what they’re for. This is the part of schwag giving that makes no sense to me, like the rubber squeeze thingys that you get at a career fair. Does having a rubber squeezy from Microsoft really make me more likely to go work for them? Is it worth the $3 per-item-price? Others seem to think so, but I’m skeptical.

Tech in RPG Panel

The future is coming!

The Panels

Organizing and running the panels was pretty much free, which puts it right in the space of advertising I like. We didn’t collect tickets, so I’m not sure how well attended each one was, but I’d guess there were 30 or so at the Wiki panel and perhaps 40 or 50 at the Tech in RPG one.

Of all our promotional activities, I’d say this was our biggest success, especially the Tech panel. It didn’t occur to me before, but there were 2 real benefits here: a) We got to meet several tech insiders, like Mat Morton of d20 Pro and Brad Talton of Level 99 Games. Plus, b) We got to hear where these people think the future is. It was somewhat surprising to hear Mat echoing our thoughts on purchasable/downloadable content. Apparently, we’re not the only ones who are exploring this route. After the talk, he and I had a quick chat and I feel like I made a successful contact “on the inside.” Considering that “networking” was one of my goals, I was pleased to have succeeded in some small way.

My current plan is to host the Tech in RPG panel next year, and possibly each year to come. We can examine where we’ve gotten in the past year, plus discuss what has changed about our visions. The greedy business side of me says that if we can grow the panel each year, it might become a fairly prestigious event, with people really begging to be on the panel. Then again, maybe it will just be a fun and easy way to meet other cool tech people. That would be fine too.

Our Flyer

Gorgeous, but that didn't seem to matter

Print Advertising

As I mentioned in part 1, there were some red flags with our print advertising attempts. In order to get a positive return, we were going to need some stellar results. As is always the case, when you believe in yourself, ignore the feelings of self-doubt, and shoot for the stars…you fall short. Often, waaaay short.

We spent probably around $3k on print advertising, between the flyer and the coupon, both in the official schwag bag. But, we didn’t walk in blind. I set up several metrics, starting with a special landing page URL to help us track how many people visited via the ads. As of August 14th, the landing page had roughly 425 pageviews. Perhaps I’m abusing terminology a bit, but to me a pageview is roughly equivalent to a click-through on an online ad. $3,000 for 425 “clicks” comes out to about a $7.05 cost-per-click (CPC). Wow, that’s really f-ing expensive.

In addition, both the flyer and the coupon had a promo code to be used on signup, which in turn helps us track the conversion rate. As of August 14th, the promo code had been used 73 times. So, our cost-per-acquisition (CPA) comes out to right around $40. Again, that’s brutally expensive for us. Of those 73 signups, exactly zero have become Ascendant so far. That means we’ve made $0.00 on a $3,000 spend.

Also, we included a QR code in both ads to hopefully make it easier for people to engage with the ads. I was really, really hoping that the QR code plus a beautiful ad would result in a big success. According to our analytics, the QR code got us about 300 visits. Out of 30,000 flyers, we had 300 hits, or a 1% “engagement” rate, or whatever the measurement is. According to our signup stats, mobile visitors converted at a 10% rate, so the QR code possibly accounted for 30 of our 70+ signups. Final analysis: A QR code doesn’t change the fundamental fact that people didn’t really care about our flyer. A neat gimmick, but no panacea.

I think we can safely say that our paid advertisements were an abysmal failure. PLEASE! Let this be a cautionary tale to you: Advertising successfully is very tough, and don’t think you have to do it because everyone else is. Buying ads is a very seductive and easy way to throw your money away. Avoid the “spend money to make money” mentality. Instead, buy a new big screen TV or motorcycle or blow it all on drugs. Buy something that will make you happy, even for a moment. It’s so much more fulfilling than the black hole of advertising.

The Numbers

We decided to base our final analysis on a few factors: total signups, Twitter followers, and Facebook fans. Our thought was that even if we couldn’t get people to signup, perhaps we could catch them on Twitter or Facebook. To help with that, we include some prominent links to Facebook and Twitter on our landing page, along with some text saying something to the effect of, “If you think we’re full of shit, come check us out.”

Analytics Breakdown
2011-08-03 2011-08-14 Delta
Users (secret) (still secret) Not a lot…
Twitter Followers 2413 2480 +67
Facebook Fans 3581 3718 +137*
Landing page pageviews N/A 425 N/A
GenCon promo code uses N/A 72 N/A

Note that the Facebook numbers are more than a little misleading, as we ran a Facebook sponsored story ad during GenCon. We spent $250 on this, and it got us 114 fans. So the total organic fans we got from GenCon would be around 25. :(

Cost Breakdown
Item Cost
Flyers and Coupon $3,000
Bowling Shirts $210
Badge Stickers $80
Facebook Ads $250
Total ~ $3,550

The Future

Now is the part where I say, “Hey, it didn’t work, but at least we learned something”, but I call that the Learning Experience Coward’s Way Out. Sometimes you fuck up, and I think that’s what we did here. We should have known better based on our experience with other advertising experiments we’ve run. I wanted to believe that we could be successful this time, even if every other time was a failure. I thought that a gorgeous ad + QR code + a sexy landing page would be the secret sauce. I should know by now that there is no secret sauce. Some things just aren’t going to work.

My only hope is that we actually can learn something from this. We keep putting our hand into the advertising fire, and we keep getting burned. More and more, I’m of the opinion that any money we spend on advertising will just be a loss.

For the future, I’m going to do my best to ignore traditional advertising channels. If all it takes is a credit card, then it’s probably going to be a loss for us. Instead, I need to pursue more difficult, creative outlets. Cross-promotion, giveaways, and social media outreach have all been successful for us, and most of the time it costs us nothing. I need to look more at these less-traditional advertising avenues and see if there’s a way to spend money to enhance them, rather than just dumping cash into a black hole.

If you know of any other creative and cheap advertising outlets, please leave a comment. If I’ve learned one thing in all this it’s that I really don’t know what I’m doing in advertising, so there’s a good chance you know more about this than I do. But for now, it’s back to making a kickass website. At least that’s something I’m pretty good at!

10 August 2011 1 Comment

When work and play collide – GenCon 2011

Gen ConIn part 1, I discussed the funk that I fell into while preparing for GenCon 2011. By the time August 4th rolled around, I was really dreading it. I showed up at the con in a bit of a foul mood, and I was afraid the whole time would be awful. I hit a particularly low point when my phone dinged to remind me that Thursday was my game night. I could have been playing Dark Heresy with my great group, but instead I was trying to figure out if there were any industry insiders I should be wooing…and also trying to figure out how wooing is done.

Luckily, things got better and the more time I spent with friends, the better things got. The following is a list of some of the things we did during the con. The final post to follow will be the post-mortem about what worked and what didn’t.

2011 Gold ENnie

The ENnies

Obviously, the ENnie awards were a big highlight of the con. Being nominated is the big part, but I’ll still take winning over not. This year it was extra nice to share the stage with Jerry and Ryan. I just wish I had a sweet costume like last year.

We’ve won Best Website 3 years running now, and I don’t feel bad saying that I think we deserve it. Every year we continue to innovate, add new features, listen to user feedback, and make Obsidian Portal better than it was the year before. For the future, I’m confident that we will continue to give a strong showing as long as the judges keep nominating us. However, I would like to compete in some of the other categories, however, as Best Website is simply too broad in my opinion. It focuses on the medium, not the content. I think Obsidian Portal is a better fit for the Best Gaming Aid or Accessory category, but I guess that’s all up to the judges.

A special congratulations to the guys at Critical Hits. They’ve been nominated for several years, and I’m glad they got to take the stage for the gold. They were super pumped, and it was pretty electrifying to be there when they won. The gnomes have taken silver two years now, so they’re due for a gold, although I think they should get a gold for Masks for Best Gaming Accessory. That book is badass. But, since this is a business blog, I wish them fewer awards and more sales. Fortune over fame!

Thanks again to the judges for nominating us, and thanks to the fans for voting. Without the fans we’d be nowhere.

Expeditious Interviews

Once we arrived at the con, doing podcast interviews was pretty tough. It was difficult to coordinate with people and meet up to do the interviews. A 3 minute interview would take 30-60 minutes to arrange, since we would have to spend a lot of time looking for people, then waiting for them to be available. Plus, since we try to be a little professional, I would take the videos back to the hotel and do a little post-production on them in iMovie. Video editing always takes me longer than it should, and this was just an added irritant.

Our Expeditious Interview with Daniel Solis

Finally, I quickly realized that the “What we saw today” GenCon podcast with Jerry and me would never work. We were too far removed from the actual con. No panels, no games, no demos, nothing. Our report on GenCon would be stories about prepping for panels, trying to schedule interviews, and lots of running back and forth. It would be like listening to a review of someone’s workday.

If we were only a podcast and that was our main thing, it would have been doable. As a sideline thing, it was simply too much work. I got a few interviews, and they were fun to do, but in the future I’ll leave the recording and podcasting to the truly dedicated.

The Panels

Tech in RPG Panel

Our Tech in RPG Panel

The panels we participated in were probably my favorite part of the whole con. Jerry’s Friday panel on using a wiki was very well done, as was my panel on the future of technology in RPGs. Both panels were well attended, and the audience was involved. Follow the links if you want to see the videos.

I especially appreciated Eddy Webb‘s brutal honesty. He came out swinging, explaining the trouble that publishers are having with new technologies. No corporate filters, no spin, just raw honesty. Dealing with him has always been a pleasure.

The downside to the panels was that they torpedoed my entire afternoon on both Friday and Saturday. The setup was pretty involved, and to be safe I arrived about an hour before. We had a banner to hang, and that meant finding hangers and dealing with that. Ryan made a run to a hardware store to buy a variety of hanging tools, but it was really a hassle. In addition, we were recording with the camera and mic, both of which required setup. Then, once finished, we had to lug everything back to the hotel. In all, a one hour panel ate up roughly a four hour time slot, right in the middle of the day.

Still, even with the hassle, running the tech panel was a real highlight for me. I met Mat Morton of d20Pro and Brad Talton of Level 99 Games. The audience was great, and I was able to explain how I have so many ideas but no time to do them. I hope they’re a little more sympathetic now when I say, “Cool idea. No, we won’t be doing it.”

DM Roundtable panel

An even nicer surprise was the Dungeon Masters Roundtable panel, also on Saturday. We were “official sponsors”, meaning we were supposed to bring food and also record the panel. We failed on both accounts, but Thadeous and the DM panelists were very, very nice to us. They mentioned us as sponsors several times, and gave us a chance to give a short speech to the (packed) audience about how Obsidian Portal works. It was a perfect audience for us, and I can’t thank the panelists enough for giving us the chance to speak.

On that note, meeting Thadeous was a real treat. I thought I had met him last year and had a negative first impression. However, it turns out I met someone else and the real Thadeous is a very nice guy who’s fun to be around and great to talk to. I hope to add him to my list of yearly GenCon buddies to meet up with. I also hope to find out who it was that I thought was him, so I can properly direct my dislike.

Gaming

Dragon Slayers

A hella fun game!

I really, really wanted to do some gaming while I was here, but things didn’t look good. My days were taken with panel prep, and my nights were packed with networking events. I had a slot in a game with Keith Baker, but I had to back out since it coincided with the blogger meet-and-greet on Saturday night. I had brought my Dark Heresy book, but my days were so busy and I was so exhausted at night that I never had the energy to pull a game together.

Finally, on Saturday night, my last free time at the con, the Critical Hits crew invited me to a game of Fiasco. Having read the book I was a little uncomfortable, since it always seemed to devolve into weird sexual situations and that’s not really my style. Danny talked me into it, though, and I’m really glad he did. We had a blast playing a fantasy Fiasco setting that was a horrible mockery of standard fantasy D&D, and no weird sex stuff. It was a great way to end the con.

Sometimes I spend so much time stressing about the business side that I forget the fact that I love gaming. A big thanks to Danny for helping me get some fun time in for gaming.

Less business, more pleasure

Ultimately, when I relaxed, I had fun. Being at the con with friendly faces was an awesome experience. I still felt rushed, and there was that feeling of “I should be networking harder!”, but as long as I was surrounded by friends, I could ignore that feeling and enjoy myself.

Part 3 will be less about feelings and more about numbers, so stay tuned if you’re curious about the business side of things.

9 August 2011 2 Comments

When work and play collide – preparing for GenCon

GenCon LogoThe runup to GenCon was very stressful for me. Unlike the majority of attendees, my primary goal was not to have fun. I’m going to promote and advance Obsidian Portal at the leading RPG industry conference. That means I have to approach my con prep not from the “Will this be fun?” angle, but from the “Will this make money somehow?” angle.

By the time August 4th came, I was thoroughly exhausted and I had very little desire to actually go to the convention. Sounds pretty crazy, eh? Some people anticipate this weekend for their whole year, and I’m dreading it. Read on to see why…

Note: To prevent this post from becoming a massive TL;DR, I’m going to break it up a bit. This first one will be about the prep, the next one will be about the con itself, and the last one will be a post-mortem examining what worked and what didn’t.

Our Flyer

Our flyer...pretty sweet, eh?

Advertising

We’ve eschewed any sort of GenCon advertising in the past, but this year we decided to take a plunge with a flyer and coupon in the official schwag bag. I was very uncomfortable with this, as it just seemed impossible to get anything other than a god-awful ROI. We were looking at an outlay of $2500 – $3000. At $40/year for an Ascendant subscriber, this means we would need 60-75 Ascendant subscriptions to make this a successful advertising campaign in terms of direct ROI. Based on our conversion rate from free to paid, that would be an extremely difficult number to hit. In other words, the red flags were there, but we pushed ahead anyway.

Besides the monetary outlay, there was a lot of work to do to get our landing pages in order and ready to greet any visitors. We wanted a professional, clean landing page that would invite users to watch a video to learn more and then sign up. Plus, since we were using a QR code on the ads, we expected a significant amount of mobile traffic. So, we needed both a regular landing page, plus a mobile-friendly one.

Creating and styling the landing pages was a lot of work, and the mobile one was especially frustrating. There are always more tweaks to do, and eventually I was exhausted, but still thinking that more should be done. Considering my hesitation for running the ads in the first place, I got angry and frustrated working on the landing pages. I wanted to just skip the whole thing, but we had already spent the money on the ads, so I was trapped. Either keep working or consider the money lost.

Podcast interviews

We’ve been having a lot of fun running Haste, and we wanted to do some special GenCon podcasting. My idea was to get short, 2-3 minute interviews with people and compile them into a nightly podcast show, along with a “Here’s what I saw today” report from Jerry and me.

Unfortunately, the scheduling turned out to be much more work than I expected. I tried to set up several interviews beforehand, but like us, most of our interviewees were pretty much winging it, so actually coordinating a time to meet was tough. Like much of the other con prep, I spent a lot of time worrying about how to coordinate things, and that worry-time didn’t really help anybody. It would have been better spent playing video games. The whole podcasting-at-the-con thing really didn’t work out well at all, but I’ll cover that in the next post.

Panel Prep

This year we organized two panels, one about wikis for campaign management, and the other a broad overview of technology in RPGs. The planning and prep for the panels was actually a bright spot in the GenCon runup, as it was pretty easy. I managed to line up panelists without too much trouble, even though I procrastinated until the last minute in finalizing everything. I wasn’t too surprised at the ease, though, as I would be happy to do any panel at any time at a moment’s notice. Free press is tough to turn down.

In addition, Jerry did an excellent job of organizing and managing his panel on wikis. I am still getting used to delegating tasks, and I’m always nervous things will collapse without my direct input, but that didn’t happen this time. In fact, Jerry was ready with all his panel prep long before I was.

The dark side of the panel prep related to my attempts to get a panelist from a particular company that I won’t name. One of the nice things about the RPG industry is that you’re almost always dealing with someone on the inner circle of a particular company or organization, even when you hit the “Contact Us” link on the website. However, when attempting to get this particular panelist, we were shuffled off to a PR / marketing department who told us that maybe they could provide someone for the panel, but even if we were so lucky, certain topics would not be discussed. In the end we offered that panel spot to Mat Morton of d20Pro, and he was a great fit. No corporate runaround, no censored topics, just a guy who was excited to talk about RPGs and technology.

Vague “networking”

I always feel like I should be networking and schmoozing more, but I really don’t know how. I hate interrupting conversations, and giving a sales pitch makes me feel kind of scummy. But, Obsidian Portal is a business, and GenCon is where everyone in the industry comes together, so I owe it to my business to do my best.

This led to a prevalent “I have homework due” feeling that plagued me the whole month of July. I constantly felt that I should be doing more to set up meetings and networking opportunities, but I would sit at the keyboard drawing a blank on how to proceed. I sent out a handful of emails to industry people asking if they’d like to meet up and grab a drink. I got a few polite responses, mostly to the tune of “Sure, if I can work it into my schedule.” Overall, no one seemed very excited to meet with me. I wasn’t really sure how to take it from there, or even if meeting with publishers would be a good use of both our time.

By the time August rolled around, I was disheartened at the lackluster effort on my part, plus the lackluster response from the people I had contacted. I was really not looking forward to more of this in person at the con. I just wanted it to be over so I could move on.

Ready to go

With most of the planning out of the way, and my lackluster networking attempts bearing little fruit, the time had finally come to hop the plane to Indiana. I must admit that I was dreading the trip. I read all the tweets of people getting excited for the con, and all I could think of was the money we had spent and the “networking” I should be doing but didn’t know how. I kept wondering, “Will this make me any money at all?” Why try all this promotion, advertising, and networking if it wasn’t going to pan out financially? All I wanted was to go to GenCon, play some games, and goof off with friends I hadn’t seen in a while. I wanted a vacation-vacation, not a work-vacation. But I’m trying to run a business, so I tried to act like it.

In the next post, I’ll discuss how things actually went at the con. Spoiler alert: Having good friends around can really help pull you out of a funk.

20 July 2011 12 Comments

Entrepreneurship – Stumbling My Way Through

This is a presentation that I gave to the Atlanta Ruby Meetup on running my own business. If you’ve ever thought about striking out on your own and working for yourself, then this applies to you.

I apologize for the video quality, as the lighting was terrible and I’m no professional video editor. The slides are a little tough to read due to video compression, but don’t worry. The slides and video are mainly there to just give some eye candy during the presentation. Finally, it’s a little tough to hear the questions, but they’re pretty good so I’d suggest turning up the volume a bit.

You must comment!

If you watch the video, or even just a part, please leave a comment. It was a nontrivial effort to record, edit, and publish the video. If nobody watches it I’ll know not to worry in the future.

The missing stats

I censored out our raw statistics from the video, as I’m just not comfortable giving that information out over the Internet. But, since I want to establish a little legitimacy, let me give some idea of where we are. If both founders were fresh out of college willing to live frugally, we would probably be just a hair under ramen profitable. Assuming our growth rate continues (which I don’t assume…), I could probably start pulling out an entry-level developer’s salary in 2-3 years. I can’t quit my job to run Obsidian Portal, but I would feel comfortable quitting my job tomorrow, knowing that Obsidian Portal would cushion my fall while I searched for another job. That feeling of comfort is amazingly good. Sorry, but that’s about as specific as I want to get.

Entrepreneurship: Stumbling My Way Through

11 June 2011 2 Comments

Should I buy stickers?

Our StickersIn my previous post about t-shirts, I tried to convince you that buying t-shirts is a dubious decision at best. It’s expensive, you’ll run out of sizes at different rates, and you’ll have boxes and boxes of them in the garage gathering dust. But, you still want some schwag to show off your project/site/whatever. If not t-shirts, then what?

The second item on the schwag list is often stickers. Unlike t-shirts, I’m a pretty big fan of stickers. They make great giveaways, and here’s why.

They’re cheap

We got stickers from Sticker Giant, and the per-item price was around $0.15 each. That means we get 40 stickers for the price of a single t-shirt. We ordered 1000 stickers about six months ago and we still have hundreds. Even if we work hard to give them away we’ll have plenty for another six months. $150 for a year’s worth of stickers is a pretty small marketing cost.

They’re small and easy to handle

Our 1000 stickers came in a small box and were divided into 4 compact rolls of 250 stickers. The entire shipment takes up about 1% of the space of the boxes and boxes of t-shirts we have.

Plus, they’re so much easier to carry and ship. I can toss a handful into an envelope and send them to a fan for the price of a postage stamp. I also keep 10 or 20 in my computer bag, in case I run into a fan in my regular travels.

People love them

Many of our fans love to put the stickers on their Game Master notebooks and binders. That’s a little ironic, since the mission of Obsidian Portal is to replace the GM notebook. In any case, they put the stickers on their gaming gear then take it to their game, to meetups, and to conventions. The hope is that perhaps someone will glance at it and say, “Hey, I’ve heard of that Obsidian thingy. What is it again?”

Where to buy

We got our stickers from Sticker Giant, and I’ve been very pleased. The quality was great, as was the packing and shipping. I’ve also heard good things about StickerMule. Pick whichever one you’re comfortable with.

One final warning

Before you rush out and order a batch of stickers, make sure to request a sample pack. The sample pack will include a handful of different stickers with different stock, adhesive, and cut. I read about the different adhesives on the website and was convinced I wanted one thing, but when I got the samples I quickly changed my mind and went with a different one that I liked better and was cheaper. Nothing beats having an actual sticker in hand that you can play with.

If you’ve got $100 burning a hole in your pocket and you can’t think of a better way to spend it, it’s hard to go wrong with a box of stickers. Soon enough, you’ll see your project pasted on the laptops of all your friends and fans. I don’t know how well it works in terms of advertising, but it’s a nice ego boost, and that’s worth something.

2 June 2011 4 Comments

Should I buy t-shirts?

You'll make millions

It seems like all of us small-time entrepreneurs eventually encounter The T-Shirt Question. For some reason, it enters our heads that we need to get some t-shirts printed and somehow we will make millions. Now that I’ve been there and back, I thought I would pass along some of my experience.

I’ll sell them and make big bank!

If this is your plan…just stop. Unless your core business is selling t-shirts, then forget about this. The only people who make money on t-shirts are the people who print them, and I’m not even convinced they do all that well. If you’re 100% convinced that you can sell them, Zazzle or Cafepress is the way to go, but don’t be too disappointed when you only clear $1 or $2 on each shirt sold.

But wait! By skipping the middleman, you could get a whole bunch printed for like $5 each, sell for $20, and pocket $15 for each sold, right? Shipping costs, dealing with returns, and all the crappy parts of running a mail order business will destroy any profits here. Not to mention your attic will be filled with boxes of shirts. Believe me, I’ve been there.

Finally, you need to be realistic about the demand. Spend like five minutes running some numbers and I think you’ll find that the t-shirt business is really awful. If you have a fairly popular site, how many can you really expect to buy a t-shirt? A good starting point is your number of Twitter or Facebook followers. For Obsidian Portal, we have about 2000 followers on Twitter and 3000 fans on Facebook. This is the number of people who went so far as to click a button saying “Like.” Now cut this by about 99% and that’s probably the ceiling on how many you’ll sell. In our case, I’d be surprised if we sold more than 50, and we have some pretty awesomely supportive fans.

Your hours of work setting up the store will probably net you a nice clean $10 after all your friends buy a shirt. Go buy yourself a coffee.

They make great schwag!

If you’re not planning on selling them and getting rich, the picture gets a little murkier. True, t-shirts make great promotional items, but they’re pretty expensive, and a hassle to boot. The ones we got printed cost us $6 apiece, and that’s when we ordered 250 of them. It’s very easy to fall into the “buy more, save more” trap and order way too many. Otherwise you’re spending $8 or $10 per item and you feel like you’re getting hosed.

We bought a ton, so I gave one to all my friends. Erick tore off the sleeves and uses it as a painting shirt. He understands what giveaway t-shirts are for.

Another problem we ran into was getting the wrong sizes. Ryan and I bought mostly mediums and larges. It turns out that a sizable portion of our userbase is…well…sizable. We didn’t have any XXXLs and people were asking for them. So, we had to do a re-print and spend another $500 on more shirts. Overall, you can’t just “buy shirts.” Instead, you need to get a distribution of sizes, meaning you’ll run out of some but not others, and you may end up promising someone a shirt only to find that you don’t have the right size.

Finally, there’s the issue of design. In hindsight, I think we went in the wrong direction. Drew Nolte of Fifth Street Creative made an awesome looking shirt, but it’s not really a great advertisement. Then again, that’s what we asked for, an awesome shirt that people would want to wear. Looking back now, I’m not sure why we didn’t just get a simple shirt with our logo and name on it. I suppose if we do a re-print we could get our logo and name on the back, but that will increase the per-item price. Oh well.

(Note: If you want a creative, imaginative t-shirt design, definitely talk to Drew. He makes some awesome stuff.)

A great shirt, not a great advertisement

Simple, but it gets the point across.

Schwag: Yea or Nay?

If you’ve got your heart set on t-shirts and there’s no way I can stop you, then please just remember this: Start Small! Instead of dropping $1500 and printing dozens, spend $200 and print a handful. Scarcity will make them more valuable, both to you (not just giving them out willy-nilly to your friends) and to your community (getting one is a big deal). Sure, you’ll pay $10 or more per shirt instead of $6, but consider it insurance against spending a lot more on what is probably a bad idea. If they fly off the shelves, go ahead and print a ton. If not, well at least you have a small box of painting clothes, not a giant one.

Update: Better still, spend $100 and get some stickers. I wrote a comparison of t-shirts vs stickers and stickers are the clear winner.

13 May 2011 2 Comments

First thoughts on Node.js

With the birth of OilyApe, I now officially have a Node.js feather in my cap. Erick and I wrote some horrendous code, but we learned a lot too. I thought I’d collect my thoughts on Node just in case you haven’t read any of the other thousands of Node first impression blog posts.

Crazy easy to get started

Lucky for us, I was able to recruit Drew Nolte of Fifth Street Creative to do the design for OilyApe. This meant that we could actually have a nice looking app instead of the feces-on-screen that we usually excrete.

Even better, I was able to walk Drew through getting Node.js setup in about 20 minutes over instant messenger. He was new to the Unix command line and git, so that’s what took most of the time. Actually installing MongoDB and Node was pretty much a snap. The hardest part was compiling Node, which requires XCode.

Overall, it was vastly easier to get someone up and running with Node/MongoDB than any other setup I’ve ever used.

Project structure is hard

Perhaps it’s because Node can be used for a lot of things besides raw web apps, but it’s a little intimidating to not have a good default structure from the start. Express helps a little, but we botched that from the start by not running the Express app generator.

Rails’s forced structure has helped me forget how difficult and frustrating it is to try and find a place for your files. Plus, my lack of experience with the CommonJS require function also made things difficult. Suffice to say, OilyApe’s internal structure is pretty crappy. Most of our code is in server.js with a smattering thrown into other files willy-nilly.

CommonJS is like jQuery on the server side

Before I found jQuery, I thought Javascript was pretty much unusable. jQuery opened up a whole new world of possibilities and I started getting ambitious about what I could accomplish. I don’t think I’m alone here.

Likewise, I feel that CommonJS has the possibility to put Javascript up there as a “real” language for server side development. CommonJS enhances Javascript with all the libraries and tools that a language needs in order to be productive. Stuff like file i/o and accessing low-level sockets never made sense for Javascript in the browser, but it’s an absolute necessity for any real language. CommonJS brings that to the table and makes me a lot more excited about Javascript’s future.

Raw Mongo isn’t enough

Getting started with raw MongoDB is great, but it didn’t take long before we wanted even a thin abstraction between our application and the persistence layer. The interaction with Mongo is via anonymous objects. This is vastly superior to building SQL strings, but there is still something to be said for calling methods on objects instead of manipulating raw values.

I had hoped that using Mongo and its native JSON support would remove the need for an ORM (or would it be ODM?), but sadly that doesn’t seem to be the case. That being said, I’m sure someone with a good understanding of prototypal inheritance will be able to create a very small but useful ORM/ODM in a fraction of the time it would take to create one for SQL. (Note: There is one already, called Mongoose, but we decided to skip it just for the sake of learning something new).

I still love programming

Sometimes I get so run down by the day-to-day that I forget the joy of what I do. One-off projects like Fakewhale and OilyApe have a great refreshing affect on me. I need to make sure to set aside time for these kinds of projects in the future. I’ve got a million ideas, and many of them could be done in just a couple days.

Well, that’s it. OilyApe has been a huge success in my book, and I can’t wait to see what great apes people make with it. My dream is that it will live on for many years, irritating and embarrassing random people, just like Fakewhale has.

30 April 2011 0 Comments

Do you really need the Cloud?

Cloudy DayAt work we’ve been considering moving away from Engine Yard for our hosting due to the inflexibility of the AppCloud platform, and the need to constantly terminate your entire environment just to change simple settings. When considering where to move to, raw Amazon EC2 hosting seems like a good idea, but we would need to rewrite all our custom EY Chef recipes to work with a generalized Chef server. We could also bypass Chef altogether and just do it by hand, but what if we accidentally nuke our EC2 instance and it needs to be rebuilt quickly? That’s when Erick said something that has been bugging me ever since:

Chef addresses the problem of the inherent volatility in cloud/EC2 hosting, but that’s a problem I never had before. I never had this kind of volatility on a plain old VPS.

New solution for….what again?

None of the applications I’ve ever worked on has been truly dynamic with respect to servers. By this I mean we’ve never needed to programmatically spin up and down servers and other resources. It’s always a manual, human decision, and it almost always is one-way. Database is slow? Then add RAM, and never remove it. Want to add MongoDB to the mix on its own server? Then allocate a server manually, install all the packages, and add it to your cluster. Sure, it’s a bit of a pain, but you only do it once in a blue moon.

VPS providers have been offering this for years. On Slicehost, I can add RAM to my slices at any time at the click of a button. I can downgrade too, if I want, but I rarely do. I can also spin up a new slice and create a MongoDB server in an hour’s manual work. In any case, I never need to blow away a single server and rebuild it from scratch via chef or anything else. Remind me again how cloud hosting is better than that?

Engine Yard AppCloud vs Amazon

It could also be that I’m conflating Engine Yard too much with Amazon. I cannot really recommend AppCloud hosting to anyone at this point. The need to constantly terminate your entire environment just to make a changes like moving from mongrel to passenger is simply unacceptable. Yes, that’s a significant change. No, it should not involve terminating your database, mongo, and utility servers and rebuilding everything.

Perhaps raw EC2 is more stable than this. I know that I’ve had some EC2 nodes that stay up for months at a time with no problem and I end up treating them like a regular VPS. However, I’m always afraid that some day I’m going to hit the wrong button and my EC2 nodes will evaporate like they were never there. Yes, there are all kinds of ways to prepare for this, like using EBS, rebundling your AMI periodically, or make it easy to rebuild via chef. No, I don’t have to do anything at all with traditional VPS hosting. It’s just not something I worry about at all with a vanilla VPS.

Clouds moving away, getting sunnier

Looking back over the past few years, I’m afraid that I may have gotten caught up in cloud mania just like everyone else. If you don’t need the true dynamism that cloud hosting provides, then you could be saddling yourself with all sorts of extra volatility for nothing. Just ask yourself: What am I getting here that I can’t get with a traditional host?

For myself, I’m going to re-evaluate boring old vanilla VPS hosting and put that back at the top of my list. I’ll keep the cloud as an option, but only when it makes sense.

7 April 2011 8 Comments

Naming a rhetorical tactic

There’s a particular rhetorical tactic that comes up again and again, often in technical discussions, and I really would like to know the name of it.

Facets of the tactic

  • It’s usually a response to a real world story regarding some kind of problem or catastrophe. Perhaps the story included a request for advice, but perhaps it was just a story.
  • The response given has almost no practical advice. Instead it’s just an absolute statement of a well known principle.
  • To argue against the response would entail arguing against an obvious (or at least well accepted) best practice.

Contrived Example: Testing

Me: We didn’t really think about internationalization, so when people started putting in Chinese characters, it brought the whole app down.


Response: You should always test with a variety of inputs, even ones you don’t expect.

Contrived Example: Data loss

Me: It really sucked. We backed up the database nightly, but we forgot that we had some of our data stored in files uploaded by the users. When the hard disk crashed we lost all those files and didn’t have any backups.


Response: There’s no excuse for data loss. You should rigorously and regularly test all your backups and make sure they cover all your data.

Helpful, eh?

You’ll notice in my contrived examples that the response is really tough to argue against. Am I going to say that you shouldn’t test with a variety of inputs or verify your backups? Of course not. Those are good principles. However, you’ll also notice that there’s really no practical advice in there either. It’s the equivalent of telling a person with a weight problem that they should eat less. Yeah, they already know that.

So what’s the name of this tactic? I’d like to know so I can throw that back in someone’s face when they scold me with obvious advice.

Tags: