McHacks, My First Canadian Hackathon

The Trip

11:17 am, Friday: Packing and getting pumped to get on the 12-hour bus ride through the night. Pro-tip: Always prepare for the bus not to have internet and power. That means your computer(s), phone, and power pack (I like this one: PowerGen 8400mAh) needs to be fully charged. Also, I also usually bring my phone as a wireless hotspot, but it will cost a fortune in Canada. For this event, I am planning on using a Mashery API to make a fun website (mostly for entertainment value). I have a backup project as well, but we’ll see how that works out. Next update will be on the bus!

11:28 am, Friday: One quick update. One of my friends that goes to McGill told me the bus ride will take 10-12 hours depending on the border. So potentially if the USA beats Canada in hockey today it will be a very long border stop. (Game is at noon)

8:24 pm, Friday: And we are off! Unfortunately the bus doesn’t have power so my updates won’t be as frequent as I had hoped. There’s a few conversations about what our hacks are going to be, but the consensus is that we have a 12-hour bus ride to think of a cool hack.

8:30 pm, Friday: Also, some of us are getting “How to speak Canadian” lessons including words like “Sorry” and“Eh” and the lyrics to the Canadian national anthem.

11:10 pm, Friday: Just finished watching Frozen on the bus (yes, the entire movie). There was a lot of singing along. We are about 1 hour away from Rutgers to pick up the rest of the hackers on our way to Canada! We stopped at around 10pm in Deleware for a 15-minute rest stop. Not long enough to charge the computer unfortunately…

11:13 pm, Friday: Um, are we stopping at a 7-11? We’re already behind schedule…

11:22pm, Friday: Oh, we’re switching drivers. This makes our driver from BoilerMake (who did the entire drive both ways with only 2 stops) look like a boss.

12:40 am, Saturday: Picking up the Rutgers hackers at their student center! One of them (Oz) brought chicken and shared it with all of us, it was delicious.

6:30 am, Saturday: 15 minutes from the Canadian border!

Soda machine in French at the Canadian border

7:00 am, Saturday: The Canadian border was really easy; I was tired as anything though and was thrown off by even the simplest of questions like “Have you ever been to Canada before” and “Do you have anything to declare”.

The Opening Ceremony

9:02 am, Saturday: Off the bus, got some awesome stuff (Palantir bag, Android puzzle, water bottle), some breakfast (Tim Hortons, which is a nice welcome to Canada), and we’re now sitting in the auditorium. Also, McGill has Eduroam!

Well, I’m definitely in Canada

9:32 am, Saturday: We’re having a Google Android lego building competition in the front while we wait for all the teams to get here, house music blaring, and Twitch Plays Pokemon up on the projector. Yeah, I’m at a hackathon.

Not bad internet. To be fair I’m in an auditorium full of people using the same network.

10:01 am, Saturday: Taking a look at the prizes while we wait. Starting to look like my Mashery hack won’t get me much in terms of prizes (besides the fact that I was going to use a Microsoft Azure server). Time to look for another project or edit mine. Also, we’re waiting for New York to get here.

10:07 am, Saturday: Apparently all the prizes top 3 prizes (plus the hacker’s choice prize) get Myos. I had never heard of them, but now I really want one!

10:17 am, Saturday: Everyone was cheering and I couldn’t figure out why. It was because Twitch Plays Pokemon beat Giovanni and got the Master Ball.

10:43 am, Saturday: Lots of sponsor talks (Vungle, AppDirect, HypeJar, Microsoft, etc.) Great time for me to figure out what hack I’m going to do.

10:50 am, Saturday: Ideas include SendGrid + EightySix’s Travel API to have an e-mail based travel reminder, SendGrid + YellowAPI’s Deals API to e-mail you deals that you set alerts for. Have to explore the APIs more. Also, Shopify’s Github has a message at the top that says “Fix extremely dangerous bug”.

11:01 am, Saturday: We can go see them at 1:30pm they’ll hook you up with hardware. They have a bunch of Arduinos, 2 Leap Motions, and other stuff. We can also follow them on Twitter and Facebook for free iPods (hard drives) and Headphones.

11:08 am, Saturday: Digital Ocean is giving everyone 75 dollars of credit! We’re also getting a lifetime subscription to their GoInstant’s highest level of API! Well done McHacks!

11:37 am, Saturday: Twilio is excited about Canadian phone numbers because they can send pictures!

Twilio explains how to filter by source country using Twiml (Twilio XML)

The Hack

12:22 pm, Saturday: So, we’ve decided on our hack. We’re going to use Digital Ocean for the hosting, and create a service with Twilio where you text in a phrase and it translates it into Doge-speak for you. Then if we have time we’re going to make it show all of the translations on a website. We can expand as we have time!

12:44 pm, Saturday: Got free domains from namecheap (and a shirt) and a Palantir shot glass (not sure what for). It is HOT in this room, didn’t think I’d be having that problem. Also, I got a text from my credit card company flagging Twilio’s verification charge, so that was fun.

1:00 pm, Saturday: Trying to find a domain on namecheap. Learned that,, etc. are taken, but I can get and

1:15 pm, Saturday: Just thought this was funny, our randomly generated password for our Digital Ocean server has an inappropriate word in it.

Chris is very creative with host names (yes I know I’m logged in as root)

1:26 pm, Saturday: We got as well because it seems like a much better name for the service. (Thanks namecheap!)

1:31 pm, Saturday: Just posted on Reddit to get some feature requests to build this out when we inevitably finish early (feel free to comment).

2:11 pm, Saturday: TIL Domain Names take forever to propagate (up to 24 hours, after this hack is over) and Digital Ocean servers restart faster than I could open a new putty window.

2:44 pm, Saturday: Split up the work, Chris on Twilio, Me on the website (uh oh, don’t expect too much), and Julia on the translation script.

Shopify has some weird marketing, but I guess that’s the fun of a start-up

2:59 pm, Saturday: It’s getting really hot in this room. Might be because of >100 computers and direct sunlight coming into the room. Almost done my crappy website script (maybe I’ll add some UI, I’ve always wanted to learn twitter’s bootstrap). Also, our server’s IP will be shared shortly if DNS doesn’t decide to work propagate soon.

3:09 pm, Saturday: Hello World on the website populated by Ruby! Time for the difficult stuff.

4:06 pm, Saturday: Okay ruby is really messing with my head because apparently I forgot all of it.

4:08 pm, Saturday: So I forgot how to do if statements. The “end” command was really messing with me.

4:16 pm, Saturday: Our Digital Ocean server keeps disconnecting us, we think it might be a RAM issue since we only allocated 512MB to the machine. We’re going to upgrade it and see what happens. Oh, and apparently I can’t do logic anymore either (messed up an iterator because I forgot to apply the regular expression that I wrote).

4:20 pm, Saturday: It was announced that Poutine was on the way. The crowd of hungry hackers cheered in approval.

4:24 pm, Saturday: Provisioned 2GB of RAM for our Digital Ocean VM, let’s see if it fixes the problems. Also, the 2GB RAM machine is 20 dollars a month, the same machine more expensive on other services. There is a lot less disk space on the Digital Ocean machine and many less features, but if you want something simple it seems like the way to go.

5:22 pm, Saturday: Definitely fixed the problem by provisioning 2GB of RAM. Still coding my website script which has gone from “easy 6 lines of code” to at least 25 because I want to left and right justify every other line to make it look like iPhone or Android chat. We just had an afternoon snack (scheduled for 4pm) of poutine and red bull. I didn’t realize it, but I like poutine. Probably because it’s all fries, gravy, and cheese.

Poutine and Red Bull. Perfect!

6:01 pm, Saturday: Finished my web stuff (to the extent we wanted it finished). Working with Chris now on the Twilio listener. Something weird is happening on the server where Sinatra, Twilio’s web library, is not displaying the correct information on port 4567 (its default display port). We’re thinking this is either a problem with Digital Ocean where they are port filtering, twilio’s sample, or our logic/placement of the file.

7:20 pm, Saturday: An update for those of you reading this. So we figured out that Sinatra does not include any sort of HTTP daemon and is just for localhost (woo!). So we ended up following this tutorial linked straight from twilio’s tutorial here. It was all going well when we got a Digital Ocean specific problem that was answered here. Let’s see if it works! *crosses fingers*

7:39 pm, Saturday: So it worked in the sense that nginx ran without any errors, but it didn’t work in the sense that something should show up when I visit the web page. Also our domain name,, has finally propagated (on Google DNS, not McGill DNS). More debugging!

8:03 pm, Saturday: I had previously tweeted at Jon Gottfried about our issues with his Twilio code (he was out to dinner). He fixed it in 3 seconds. Apparently I did not need to use the nginx or unicorn frameworks, but just needed to enter the lines

set :bind, ‘'
set :port, ‘8080'

And everything would have been set with the basic Sinatra framework. At least it’s working now and we got a Hello World to respond to a text message.

8:13 pm, Saturday: After a few more tweaks, everything seems to be working correctly. Now to get it to work with my website code and a fake translator since the translator is still being worked on (Julia is translating all the javascript to ruby). She’s fixing errors, so who knows if it will actually eventually work.

8:15 pm, Saturday: Oh, almost forgot, the server is still very upset and likes disconnecting me a lot.

8:28 pm, Saturday: WE GOT IT TO WORK! And by “it” I mean appending an exclamation mark to what was texted in. We also did it by “sending” it to a translation file. All we have to do now is get our translator working, and the project is finished. Well, we also have to get the listener to send data to the website, but that (hopefully) will be pretty easy compared to the former task.

8:46 pm, Saturday: So a Ruby-fluent student here from McGill came over to help us with Julia’s portion of the project. Did you know there’s a project called TheRubyRacer that just runs javascript code without a sweat and that it can even run it from files? Did you know that that renders Julia’s portion useless and we can just do that? We had a few pity laughs.

Poor Julia

9:02 pm, Saturday: So we just got fortune cookies with our meal. They were in French.

9:03 pm, Saturday: I’m currently trying to figure out how to prepend text to a file in Ruby. Using this stackoverflow. This way only the 10 most recent texts will show up on the website. I also need to remember to censor the phone numbers.

9:34 pm, Saturday: Okay, things are working now! After some failed copy/pasting from stack overflow, we have the program writing the “translations” (I put it in quotes because currently it just appends an exclamation mark) into the log file in the correct format. Now I just have to censor the phone numbers and we’re good.

9:42 pm, Saturday: Things are working even better! The program is still writing the translations and putting it into the log file in the correct format, but instead of censoring the phone numbers I put in which state they’re from. Now to post those results on the website…

10:03 pm, Saturday: Wow a lot has happened in 20 minutes. We fixed a bunch of stuff, checked things into git (which ended up breaking everything) and now I’m fixing things that it broke.

10:10 pm, Saturday: Oops, figured out what was wrong. Nginx was still on the machine from when we were trying to get twilio to work. When we restarted the machine to get TheRubyRacer to finish installing, nginx ran because it was in init.d. apt-get remove nginx, apt-get purge nginx, apt-get autoremove (which removes programs that don’t have dependencies anymore)

10:41 pm, Saturday: Besides the translator, the program that does the overlay of the words over the doge, the piece of code that sends an MMS to the Canadian users, and the piece of code that puts the images on the website, we are finished. Nearing completion (within the next 3 hours potentially) with 9 hours to spare. Tweet at me if you have any extension ideas!

One of the beta versions of our code as of 10:52 pm on Saturday

10:53 pm, Saturday: If you’re interested, you can check out for the text messages that we’re currently translating. It’s simply appending an exclamation on the end, but we might be finished with the translation soon? Our guru ruby guy just came to check in on us ☺

11:18 pm, Saturday: Oh look, the DNS finally went through. Still working on making Canadians get pictures of doges.

11:55 pm, Saturday: I was missing an end for the longest time in the myApps.rb program. Walked away for 5 minutes and found it instantly. Sometimes the best debugging method is to walk away for a moment.

12:32 am, Sunday: All of my stuff is working, just waiting on the translation code which Chris and Julia are hard at work on. Just confirmed that I can send shibe pictures to Canadians. I am going to take a nap (even though there’s a little bit more that I can do). Hacking for 12 hours straight really kills all productivity. I left everything running on the server to do a little bit of a stress test (assuming being idle will break something). Good night!

5:28 am, Sunday: I’m awake! According to Facebook, we got the picture overlays working at 3:02 AM. They even remembered to push everything to git! Also, my alarm for 3am didn’t go off (oh, darn) and someone stole my pillow because I grabbed a few when the room was empty(that one I’m actually a little upset about, I have to sleep on that on the way home). I couldn’t find the pillow when I woke up…figure I’ll check once I get the project finished (positive reinforcement?). Sorry this is rambling a little, it is 5:30 am.

Very bar, such foo. Wow

6:21 am, Sunday: Google is a boss at DNS apparently because McGill’s DNS provider doesn’t seem to realize that we own Oh well. In other news, I seem to have broken our translation script which does all the cool stuff, so Chris and Julia are trying to figure out what I did/what went wrong (it’s starting to seem to be not my fault, which is good)

6:54 am, Sunday: So, apparently ruby 1.8.7 does not support rand(). Also, we got it working for canadian MMS! They are now getting the pictures. Next step is to display the pictures on the website.

Google DNS, thank you for recognizing our website!

7:05 am, Sunday: Put the phone numbers up on the website. Feel free to text them, but it might not always be up since we’re still working on it (standard message rates apply). Also, please don’t break it. It’s a demo.

7:48 am, Sunday: The images now show on the website! Everything is working together quite smoothly (as long as there’s no shell injection). I really want to try and secure this thing so I can send it out on /r/dogecoin because I’m worried that someone will try and attack it. It is a virtual machine, so I don’t care if they attack it later as long as we save all of our code (there’s no personal data). The only reason why I haven’t secured it yet is because I don’t understand how and because these hacks aren’t really graded on security.

Beta version of the website as of 7:52am

7:54 am, Sunday: Besides security and design, our hack is basically finished. You can’t imagine how good it feels being finished with your hack 4.5 hours early when we had so many problems implementing what seemed like a simple concept. Any suggestions for features? I’m going to work on security now.

7:58 am, Sunday: Oh, also git isn’t working when we push. I’m going to try and fix that first.

8:02 am, Sunday: Well that was fast, Julia and I fixed the git problem by, well, learning git. git status, git add, git rm, git commit (must add a message), git push -u (enter user/pass)

8:25 am, Sunday: So we decided that, given it escapes parenthesis, ` (ticks), and some other special characters, we should be somewhat secure. Also, since everything backed up to github correctly, we can always repair the server should we have a problem. We posted the website on (link) and almost instantly got a text message from Ohio!

8:27 am, Sunday: We got one from IN! (looks like someone was trying to break it, but it stood strong!)

8:47 am, Sunday: Thanks @bitcmp twitter! We’re trying to do some formatting stuff on the website (like actually make it show what we’re trying to make it show).

8:48 am, Sunday: We’re down to 116 dollars on Twilio. Cost us more money! We’re also trying to fix the dogespeak translator because it breaks if you do something (not telling) and it doesn’t offer much variety in its messages.

9:20 am, Sunday: MAJOR DISASTER. We’re not using comic sans on website! Also, I found my pillow. It was all the way across the room…

9:24 am, Sunday: Someone suggested we added a link to download the picture in the US text messages because we can’t send MMS to them with Twilio. Working on it now while Julia and Chris try and figure out the Comic Sans MS problem.

“cannot load such file” wow, very error, much problem

9:36 am, Sunday: Even errors can be funny. Such file

9:40 am, Sunday: So apparently when Chris updated the ruby version to 2.1.0, none of the gems were transferred. That’s why such file could not load. Re-installing all the gems… (server is down now by the way)

9:53 am, Sunday: Future note, always update and install new versions of all of your packages before you start development, everything we fix is now breaking the next thing. We did an apt-get update/upgrade, but that didn’t cover new versions of ruby.

10:12 am, Sunday: Wow, I fixed it. Such hacks. So Ruby 2 does not believe that my current directory is usually . (current directory). Therefore I have to tell it every time to go to ./{file_name}. Thank you Ruby.

10:52 am, Sunday: Finally fixed all the errors. The only problem right now is that we can’t get comic sans installed. This has been quite a long project.

Can’t tell if this was someone from /r/dogecoin or someone else. Either way it was a Canadian!

11:09 am, Sunday: Desperately trying to find a Canadian so we can put better screenshots on ChallengePost. Even tried singing “Oh Canada”.

Okay, now this is fun

11:46 am, Sunday: All packed up, hacking is over and we’re in an auditorium. As I was typing this, we figured out that our last minute problem (dealing with the Comic Sans fonts) had magically been fixed. A few minutes before we needed to clear out, the myapps.rb file (the main one that is the listener for Twilio) started throwing errors and stopped sending text messages back in response. After some debugging, we traced it back to Julia’s attempts to make the Comic Sans font work, so she simply changed the font-weight back to bold and renamed the file. Magically, it worked. And that’s how it goes I guess.

12:17 pm, Sunday: Food time! Our server is getting killed and we’re so happy about it! It’s not CPU or RAM problems either, DigitalOcean seems to have network issues.

We love you too Canada!

12:36 pm, Sunday: Still food time? Also, we have a troll using the service, that’s when you know you’ve made it I guess.

So much umcp

12:52 pm, Sunday: Love looking at all these submission to the twilio! Apparently we don’t get lunch until after the expo…

The Expo

Expo withChris Watts and Julia Eng, my partners in hacking

3:55 pm, Sunday: Expo is over, time for the closing ceremony!

Lots of traffic on our server during the expo. Graphs are awesome! [From Digital Ocean]

4:00 pm, Sunday: I’m really lucky that I found a Red Bull at the event, I would be completely asleep right now otherwise. Everyone really liked our project at the Expo, though. Also, apparently we are on the dogecoin instagram here.

Instagram thinks we’re pretty cool!

The Closing Ceremony

4:08 pm, Sunday: Well, since we didn’t get asked to present, I guess we didn’t get top ten.

4:11 pm, Sunday: So the first one uses NextBus on top of Google Maps. Wow I feel lucky to go to University of Maryland. We’ve had this for 4 years and a fantastic app for 2 years (shoutout to 512 Industries). This does has one thing better than ours by showing places near the bus stops.

4:32 pm, Sunday: Press Play is probably going to win (if I got to choose, it would). It really seems like they have the most realistic and usable project.

4:37 pm, Sunday: I take that back, is pretty cool too!

4:44 pm, Sunday: “We have a really really awesome surprise for you guys”. It’s the McHacks Unicorn, we’re going to smash him. How much I wish I had one of those unicorn masks so I could just stare them down as they destroy it.

5:03 pm, Sunday: The winners are:
1. Ocean Map(my guess was press play or everyone plays everything)
2. Cloudy Beats
3. Git Achievements
They get medals! #Sochi

5:06 pm, Sunday: There’s a bunch of stuff to give away that they totally forgot about. So they started throwing them out into the crowd.

5:30 pm, Sunday: On our way out! Samosas for everyone!

Extra samosas for everyone!

The Way Home

Beautiful building across from where we were hacking the entire weekend

7:15 pm, Sunday: We’re currently sitting at the border waiting for who knows what. We have been here for about 30 minutes and someone comes down the asile asking if we’re US Citizens. Maybe I won’t have to get of the bus?

8:00 pm, Sunday: We had to get off the bus. Oh well. Homework and sleeping until we get home. I think I’ll end the live-blog here until I get home. Thank you so much to everyone who was reading along as I wrote this. It was a great way to show this great thing called a hackathon to people through my eyes. I’ve only been to two hackathons now and they have been some of the best experiences in my college career. Not only was it great to show you the hackathon, but it was a great stress reliever (and debugging tool) for me. In software engineering, we’re taught to keep an engineering log when working on a big project to keep track of decisions made and why we made those decisions. I constatly found myself looking back to the blog and saying “oh, I remember we had this problem before, let me check the blog”. Thank you again for reading, I will give one more update when I get home. I highly encourage all students reading this to sign up for Bitcamp (an amazing hackathon at University of Maryland) and all sponsors to support Maryland’s first Major League Hackathon.

6:00 am, Sunday: And we’re back, I’m going to go crash now.




@UofMaryland Alum, @Microsoft Employee, Sports and Tech Enthusiast. Tweets are my own and don’t represent Microsoft.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Joshua Berenhaus

Joshua Berenhaus

@UofMaryland Alum, @Microsoft Employee, Sports and Tech Enthusiast. Tweets are my own and don’t represent Microsoft.

More from Medium

Real or Fake Job- posting Prediction

“C’est la vie”, or how I feel about my first job.

How Sexual Purity Affects Young Women in Lebanon

The Tightrope Shuffle of Parenting a Neurodiverse Child