How an hour of trolling helped me get over 3,000 users

Over 2,000 3,000 people have downloaded a chrome extension I built in less than an hour. I do it for the lulz.

I'm both a little upset and super happy about this right meow. A little upset because usually after putting a lot more effort in coming up with an ambitious idea and a lot more time into building it, I get either similar or worse results. Super happy, because I'm incredibly delighted at how many people I've made smile with my Facebook Me-Gusta Chrome Extension!

It all started with my love for /r/f7u12. And one afternoon, I searched 'Me gusta' on Facebook just for the heck of it and came up with this Facebook page: Change the "like" button to "Me Gusta" for a day.

As soon as I saw this, I LOFLMAO'd (lulzd on the floor laughing my arse off). I immediately pictured what it would be like and lulz'd again. 

And then... I realized... Wait. I can make this happen. And that's when pigs began to fly.

I used what I learned from building a really basic chrome extension to make my dreams into reality. A little over an hour later, a star was born.

Anyone who downloaded my chrome extension, could now navigate to Facebook and see all the "Like" buttons turn into a Me Gusta face with the text "Me Gusta" next to it!! TROLOLOL. :).

I really only built it for my own amusement (and believe me, I was amused) and shared it with just some friends on Facebook. I let it just simmer for about a month and then I checked in on my extension and WOAH.


The WOAH in the analytics

That big spike you see is a result of someone posting a screenshot on /r/funny and someone noticed their "Like" button actually said "Me Gusta." The author of the post (thanks NotANoveltyUser) was asked how s/he did it and they posted the url to my extension!! That spike in users also got my extension featured on the "Fun" Chrome extension section (though not above the fold).

 

The reddit post, and subsequent comment

And the rest is history :). So basically it turns out that if you build something for fun or personal fulfillment, you sometimes end up with a really cool result. And the moral of the story is, if you do it for the lulz, people will lulz with you.

Writing my first Python/Django app - already proved I'm fallible

Sorry guys (the one or two of you, or just me, that still reads my blog) for being incognito these past couple weeks. Finals hit then got home and enjoyed myself a bit with friends and my girl. I've been working on getting up to speed on learning a python web framework for a while and I chose Django because I heard there was a lot of support out there and it seems to be taking the lead because it is both high-level enough to do cool things easily and editable enough that it gives you low-level access (unlike Ruby?). So I've been stuck on this hiccup for setting up the Django environment which (I later found out, thanks to my Dad) involved Cygwin using a unix file system and my Python still only recognizing Windows file system stuff. I finally figured it out after slaving hours and hours scouring the web for answers and asking my dad for help (he actually ended up patching it up temporarily). I was so happy that I could move on to the actual learning of Django vs the set up. Then I left it, got home after a bit, and started using my home desktop (I had set up Django on my laptop previously). I was about to write a tutorial for setting up Django on Windows when I got curious about... could I just have set it up super easily, and avoiding that whole filesystem incompatibility nonsense if I just used the Windows command prompt to set up Django... So I started just using Windows command prompt and it worked (so far)! WOW. Wasted time slaving over trying to figure it out using Cygwin on my laptop...lesson learned though. Avoid tunnel vision. I will continue my Django tutorial on both my laptop and my desktop (I figure it will be helpful anyways to do it twice...and engrain it into my mind) and if both work out fine then I will simply write my tutorial on how to set up Django with windows using Windows command prompt and avoiding the mess I fought with!! Unless someone requests for me to write the version for using Cygwin as well...would be more than happy to. Anyways...goodluck to me on getting this all working. And as soon as I figure out if both work/not I will write that tutorial!

More Work and Late Nights

Alright another late night, though I can't complain. 4:30AM is relatively early to sleep nowadays... Just finished doing some work and adding some features to The Grim Tweeper. Now, we store more data so that you won't see the same person twice even if you refresh (unless you cycle through all your followers), and also we keep track of your score so we can set up a leader board and make it more competitive! We shall polish some of these features tomorrow and aim for a re-launch and hope to get picked up by some more big media sites. Though that mention from Time was nice... Another feature I actually helped add last night was something I regret not thinking of earlier... after every 10 kills, a tweet window would pop-up that would essentially say something like 'I just slayed 10 followers via @thetweeper!' I checked this morning and found a lot more tweets about The Grim Tweeper and a vast majority of them were the 'just slayed 10' tweet. So it turned out that was a good way to convert users, to viral tweeters. On a side note, Ajay pointed out to me this article on people who live on no sleep from the Wall Street Journal: The Sleepless Elite Immediately, my egotistical self though OH thats me! I mean, I do really get minimal sleep and have to go to Track and Sprint Football practice. Not that easy. But upon further reading, I realized I am not necessarily among the elite, but just somewhat abnormal.  Either way, good read.

New App - The Grim Tweeper, easy way to clean up followers on Twitter

So the night I spent learning the Twitter API bore fruit! After getting some familiar help from Tess Rinearson (legendary still-in-high-school designer), Dan Shipper, Ajay and I finished another app - The Grim Tweeper. This app was a very simple concept that Ajay Mehta had dreamed up a couple weeks ago, we got busy with other stuff, and finally decided to code up and ship now. We haven't posted to hacker news yet (will do when/if I wake up in the morning) but we believe this has some pretty cool viral potential. The only thing we are thinking might be an issue is the Twitter API rate limit. Each person has about a 350 requests/hr limit, and we make about 3 calls per a person you cycle through in this app which adds up to about 117 people each person will get to play around with until the app will throw an error. We believe people may not get to that mark, but if they do we handled the error and put up a nice error message letting you know what happened and apologizing. Will keep you guys updated if this app takes off, which I (believe and) hope it will.

Working with the Twitter API (until 7AM)

After working with Facebook API extensively, the other night I decided it was finally to learn how to connect via Twitter API (little did I know it would keep my up until 7AM). Just a few words on my overall experience that night: it was pretty difficult to understand at first and there was a huge learning curve for me in the beginning, but as soon as I 'got it' it was pretty easy. The biggest reason why I got it was because of Jaisen Mathai. So I started off going straight to Twitter's Dev site and looked right through their tutorial. I thought immediately after reading that it might be a little over my head. They talked a lot about Oauth tokens and the flow between client/server/Twitter authentication and I will admit I was a little lost and discouraged... but I realized Google exists! So next thing I did was Google through 'how to php Twitter API' and opened the first couple results into tabs on Chrome. I skimmed over them all and noticed they all used a little Twitter php class package put together by Jaisen Mathai. I thought, okay seems pretty standard let me download that. I immediately downloaded it from a web site that was NOT Jaisen's because I thought the instructions were a little more clear (sort of a mistake, I will explain), I uploaded onto a server, and started looking at the code. I read through the tutorial and looked through the code and found it was pretty straightforward. As soon as I started playing with it though and customizing it for a simple app I wanted to make, I kept running into issues.
<?php
$twitterObj = new EpiTwitter($consumer_key,$consumer_secret);
$url = $twitterObj->getAuthorizationUrl();
?>
That should have given me a $url with the proper oauth token to go back to Twitter and log a user in to my specific website. However it kept returning a url with the proper url minus the oauth token... I dug into the code and first thing I noticed was in the EpiTwitter class some of the urls were out of date. I tried to change the class variables into the correct ones, then I ran the code again and same issue.. The next thing I did was try to ask @jmathai and hoped that he'd get back to me. He actually responded really quickly saying to email him the question. So I did and while I waited for a response I kept looking online to see if the answer was there. All my search results basically linked back to his page so I decided...you know maybe it was wise to look at what he had to say about his own stuff. I didn't notice anything different until I stumbled upon his Github link to the project. I finally realized that, woops, here was my mistake. His Github contained the most updated code and so I downloaded from there and re-uploaded the library. Boom, baby. It worked. I had gotten a very basic version of logging-in via Twitter up on the server and now it was time to play. Of course also I tweeted back at Jaisen and let him know it was just my mistake of getting old files and he was kind about it. The next thing I did was read through all the documentation of the new classes and learn how it worked. It took a couple tries and it wasn't easy at first. But as soon as I learned the structure of the GET and POST requests it became simply a matter of knowing what Twitter methods were available via the API and how to call them. By the time I became familiar everything it was probably 4AM, so I spent the remainder of the night just coding a basic functioning version of the app I wanted to make (details will be released with the app later this weekend, hopefully tonight). It was a great experience and now I know how to deal with the Twitter API! If anyone has any questions about this or needs help getting started, let me know. I feel like I have learned enough to be helpful enough at this point.

General update and such

I have been on somewhat of a posting hiatus for the past week so I decided I should give a general update before getting back on the horse: Spring break wasn't as productive, from a development standpoint, as hoped but we got a lot of things done that were unexpected but outstanding nonetheless. From a programming standpoint: - Started two impromptu exciting projects but reprioritized and decided not to ship - Familiarized myself with MongoDB a bit (unfortunately not so much with Rails) - Finished reading Don't Make Me Think by Steve Krug. I think we made the right decision not to ship and refocus on a different direction, am disappointed with the amount I learned about rails, and am very excited with the new perspective Don't Make Me Think has given me in terms of creating the best possible user experience. So mixed reviews. On the other hand, programming aside I did: - Get to meet with some VERY awesome and generous mentors and people - Had several fantastic opportunities present themselves (will talk more about them later if we make them happen) - Got featured on King 5 Local 5 o'clock news!!! - And spent a lot of time with my beautiful girlfriend Overall, I'd say the status of Spring Break was: #winning (Woops overused joke alert). And to make up for the mixed bag development status, as soon as I got back on campus Sunday night at 12AM I met up with Dan to work all night to finish a very basic product of what we hope to be a future business. We accomplished that and spent tonight polishing up a little. If you would like a taste of the alpha product send me an email or comment. Oh and Dan and I are going to be in the Daily Pennsylvanian this week (our school newspaper)!! So things are looking good and great opportunities are popping up left and right and I'm excited to keep steam rolling ahead. Will keep you posted on any updates.

WhereMyFriends.Be up and running! Finally, I can sleep

Let's make this post quick, since I would like to get some real sleep... WhereMyFriends.Be is finally up and running for good (at least so it seems...)!!!! Thanks VERY VERY VERY much to a Paul from Rackspace who helped me figure it out after several support staff members over the past 72 hours have just thrown me in several directions. Paul, you're a boss. Fortunate for me, he had just finished creating data structures for a very similar purpose dealing with the Facebook API and had a lot to offer. Basically he told me:
  • Facebook/MySQL likes short bursty queries over long ones
  • Ints are greater than strings
The latter really saved the day. The biggest change he helped me make was changing the oauth ids to bigints rather than the current text in SQL and also indexing this. This made everything load at SUCH a faster speed. 100X better than originally, and at least 1000X better than the slow crappy times! K maybe exaggerating a bit. But yeah. I believe this is our solution to keeping up a stable site for thousands of concurrent users. I will wake up in about 14 hours (longer if I'm lucky) and hope to see things going just as smoothly as I left them.

Blood, sweat, and tears - Mashable certainly tested our resolve

[caption id="attachment_101" align="aligncenter" width="745" caption="source: my heart and soul"] [/caption] Boy was it a rough couple night... but a great one which I will remember forever. Feb 24 12:15AM - On my way to start doing my homework. As soon as I sit down in the study room, Dan Shipper calls me "We're on Mashable!" I'm stunned, don't know what to say and he tells me to come back to the dorms so we can work. I run over as fast as I can. 12:30AM - I'm back in the quad done dancing around in glee with Dan. We realize, we need to get cracking. Our servers at GoDaddy are getting hit hard. We thought it would handle it, but clearly the virtual dedicatd server was not enough. Dan called up Rackspace, got a Cloud Site squared away, and we began to migrate. 1:00AM - We decide it's worth it to take down the page rather than letting it load poorly for people. So we put up a landing page, and let the migration begin. We finally got a hold of Ajay (where the hell was he?). Ajay helps us wit PR. 1:30AM ish - Our cloud site was up and running! Dan and I were so happy! This was one of our emotional highs. Everything was working smoothly, we were getting hit with traffic at unimaginable loads, but we were handling. We though smooth sailing. So we just thought we could spruce things up a bit, fix a bug here and there, calm down the fire of people that had seen the site down and go to bed. We were wrong. 1:30AM - 4:30AM - Happily responding to tweets, facebook comments, Mashable comments while watching our traffic and user base grow. Through th night we saw user benchmarks hit 1K, then 2K, then 3K, 4K, and by the end of the night (er early morning) we see 5K! Also, Dan and I are busy fixing bugs and making features more robust for users. 5:30AM - Ajay heads to bed. As soon as this happens, Dan and I sort of realize, something is wrong. Things are slowing down significantly for loading the profile page. We expect that it must be something to do with our database because the code was basically unchanged through the night and traffic was consistently high so that was not the big difference. The only thing we could think of was something going on with more and more data being logged into our database. I mean, this was good, but it also hurt our speed - so we though. 6:30AM - We continue to look through our code to see if there are any MySQL calls that are just looping or something extremely inefficient. We catch a couple small things but don't see anything that could really make that much of a difference. We see some calls taking as long as 30s from the webpage, when earlier that evening it took only 2-3s...what is going ON??? 7:00AM - We decide to try logging the times it takes to go through each function that was called to see if it really was our SQL database. 8:00AM - Call Rackspace again, finally they discover it is not a CPU or RAM deficiency from our Cloud Site server but is instead long queues to our database because our site is data-call heavy. We continue to look through our scripts because they claim there is nothing we can do but to wait and let the queues clear out. 9:00AM - We have to head to class and so we need to make a choice: keep WhereMyFriends.Be up, or take a down. We had to choose whether we wanted to leave a sub-par, slow product up that would probably still pick up traffic, or take it down and possibly close off this window of opportunity for virality from Mashable. We eventually chose to take it down. To me, the choice was simple because you never release a product you know not to be the highest of quality. We didn't need artificial growth/hits, but instead wanted to make sure people knew we only produce great stuff. So we ended up using MailChimp to put up a nice apology letter, with a chance for them to sign up and see the product when it was up and running again. Then I had to start the day...In between classes and such I was running around checking to make sure our landing page didn't crash (I figured it wouldn't but...who knows sometimes) and seeing what I could do to make the SQL queries faster. I immediately got some great advice, thought of how to implement it, and started doing some of the coding while sitting around waiting for class to begin. I also made sure to help cool the fire online with all the hits going to our site, but nowhere to go from there.  Then at about 12PM Dan tells me we got on CNN! We were down at the time but it was still exciting! But now there were more angry/confused comments to respond to and quel. After finishing some homework that was due the next morning, I met up with Dan again to start coding. I was introduced to a new method of parsing the friends. Before we were sending off 20 friends at a time to get back 20 (or however many revealed their location) locations. I would figure out if those friends were in our database or not, then I would send them on different paths there. In my new implementation, after getting some advice, I parsed the friend list immediately into what-is-in-our-sql-tables, and what-do-I-need-from-FB. That made a big difference in terms of time, and along with other tweeks we thought our code was solid. We were just waiting on Rackspace to migrate us over from Cloud Sites to more powerful and scalable, Cloud Servers. After we did that, migrated over, things seemed to work fine. Mind you it was around 4AM at this point. We had run into several issues along the way, such as DNS mis-pointing, private/public IP misdirecting, SQL fails, and every other migrating issue you can think of. Surprisingly though, the new untested code that parsed the friends data in a different way and sent them on unique tracks worked with almost no hiccups! I was pretty proud. At 5:30AM, we figured everything was pretty much in the clear. We did more cleaning up, some more bug testing and phew. Up and running. Sleep. Wake up, things are good. Go to class, get out of class. Boom. Down again. I had a meeting to go to, and Dan said he was taking care of it so I trusted him to get it fixed. Rackspace told us, there really wasn't much they could do, so we put up the landing page again. FAIL. Jeeze I was mad... So now for the past several hours, Dan and I have been implementing memcache and seeing what else we can do to make things more robust and lightweight. I think we're pretty much done, and just have a few small things we need to tweak. But we should be ready to release tonight. By the way, Dan is in NYC tonight at a concert so if sh** hits the wall...I'm all alone. This project has probably taken up literally half of my life this week. But it's been worth it. Through all the good, and bad, and worse, and better, and best, and etc etc, I've learned a lot and know a lot about what to look out for and do next time I strike gold again (which hopefully is very soon).

Early Morning Crisis Averted

Alright. Here's basically what happened. We finished the product at around 6:30am. At about 7am I headed to bed. At 7:30am I got a frantic call from Dan telling me that nothing was working. It turned out that somehow Facebook had deleted our app from the Developers thing and we had lost the ability to use the API key and secret. We had to quickly create a new app as fast as possible and rewrite some configuration files on the site to make it all work. It was up and running again by 7:45 and so it was fine. We ended up getting 8 upvotes fr Hacker News and got as high as 20th position on the first page! We also got a couple hits from StumbleUpon and some upvotes on Reedit. Things are going well but not as good as hoped. The issues in the launch, I feel, were a big inhibitor in maintaining first page position on hacker news which would have been golden. Instead bugs caused chaos again. Every time we tighten up security and bug control but there's always something that slips by. So we'll just keep getting better with experience. Or release it at a time when we'll be awake to make changes during crucial moments...

Where My Friends Be??? Late night/early morning success

So... it's finally done! With no more than 3 hours to spare for some sleep. The wakey-wakey, class, practice, and homework! Yay for another long week. Hopefully though it's worth it. Where My Friends Be is a mashup of Google Maps and Facebook where you can see a map of all your friends around the world. This project was a fairly simple concept, no hard coding problems, but we (Dan, Ajay, and myself) think it has some potential. To the little users we've shown so far they've all loved it. Let us know what you think!