Do Not Google That! (dot com)

Oh, and a fair word of warning to those looking to do additional research: Do not Google “oily sweat wrestling men.” Just don’t do it. Some things can’t be unseen.

The Premise

Late at night a few days ago in imvu.com’s secret lair, #engineering…

<Veep> from an article on an ultimate fighting controversy about a guy
       putting slippery stuff on to gain an unfair advantage:
<Veep> Oh, and a fair word of warning to those looking to do additional
       research: Do not Google "oily sweat wrestling men." 
       Just don't do it. Some things can't be unseen.
<Grue> :D
<Grue> That which does not kill you will make you OH GOD.
<Veep> that would be a good webpage: "things you shouldn't search for on
       google", with http://www.google.com/search?q=  links
<Grue> hm, yeah.
<Grue> simple apps are simple.
<Grue> it's something that you need not even moderate the submission to.
<Veep> No match for "DONOTGOOGLETHAT.COM".
<Grue> This is a compelling application, veep.
<Veep> thanks.
<Grue> you calling dibs?
<Veep> no, my queue of unfinished projects is large. if you want it, you 
       can have it.

The Addiction

I have a problem with domain name purchasing. They’re all so pretty. Most of my domains are empty, so the idea of a fully operational site made within a few hours of coding was very appealing to me.

I haven’t had a simple project since I made my exceptionally puerile knockoff of ipchicken.com (whose sole functionality is to display $_SERVER[‘REMOTE_ADDR’] and $_SERVER[‘HTTP_USER_AGENT’] to the user, and doa ip2latlon lookup to feed to gmaps. Oh: and a gif png of urine.). The idea of completing an “art project” website in less than half a day and throwing some ads on it to potentially make it so it can be cash-neutral for my lifetime as far as domain re-registration costs go is oddly, strangely, irrationally appealing to me. And this felt like that.

So I bought donotgooglethat.com.

And then I bought dontgooglethat.com and made donotgooglethat.com 301 redirect to this one. Because I have a problem with buying domains.

The Implementation

Who needs security or user auth on a site meant to provide terrible, sullied links to the underbelly of the googleverse?

Style decisions

I started out by ripping apart a copy of everyone’s favorite search page. After taking out a bunch of stuff (wow, they use tables!) I was left with a raw googlish-looking site. I replaced the topbar links with a few links to some of my sites, and added the minimalist google ads to the side, with a link to the real google on the right.

My goal is to be googlish but not confusable with the Real McCoy for legal reasons, so I opted not to go with any rainbow text or the google Font (Catull, for you typography nerds).

Even so, I’m wary of using the trademarked term. Worse comes to worse I’m out $14 for reg costs and have a cute story.

Finally I grabbed two icons from the Silk Icon Set over at famfamfam. Even though I’m a competent sprite artist, I was trying to get this done as quickly as possible.

User Experience Decisions

I wanted to keep it damned simple. So I opted for only showing the top ten “worst” searches that were upvoted, without an option for pagination. There are no “about” pages since the links go straight to google searches, so there’s no need for SEO’d urls or concern for “losing valuable index space” by not exposing all of the content. Who cares? Not this site!

Each of the top ten links can be voted up or down. On successful vote (or failure!) you’re notified above the dontGOOGLEthat header. You can add a new search by clicking on the yellow button after entering some (hopefully offensive) text into the search box, or just by searching (done via an async post onClick of the “No Don’t Search” button).

The search results go to an adsense’d google personal search result page, which I chose to keep unbranded. The rationale here was that I want this thing to basically net $7 a year, so the least annoying way to do that would be to tie any possible revenue into the only real thing it does: making searches. Even so, I’m not pleased with the results; Google Safesearch seems to be on by default, and I couldn’t find anything (in the five minutes I scanned for it) in the customized search api to turn it off programatically or via a pref setting in adsense.

I decided to put a minimal amount of discouragement for vote-hammering by putting a session-based lock on votes in. However, anyone with half a brain and an ounce of desire can get around it. Really: I don’t care. Should I start caring, it wouldn’t be that hard to fix it or just disable voting…

To get a small amount of churn, the most recent search shows up at the bottom with a googlish New! next to it, and the option to upvote it there.

Also to promote searching, I did the same very simple trick google did to up their revenue long ago: a

document.getElementById('q').focus();

on page load. This just puts the cursor straight into the search form, so when you load the page and type, the input goes straight there. Such a tiny trick, and it netted them millions and millions more dolars in revenue. And it improved the user experience.

Codey Decisions

MySQL Database: One table. Three fields: id, query, and votes. Trivial.

Two queries per page load: one to get the top ten votes, one to get the most recent post. The votes field has an index (normal), so both queries are optimally cheap.

One of two optional queries per page load: an insert of a new search term or an up/down vote. The insert actually is two queries: one to see if a search already exists, and if it doesn’t: do an insert (and if it does, and you haven’t already voted on it, upvote it!).

No templating. No javascript libraries. A few boilerplate functions (mainly query error reporting stuff I handrolled years ago that’s been very faithful and useful). A few lifted javascript functions (because who needs to include all of jQuery for a single XMLHttpRequest call?). A google analytics tracker just for the hell of it, because analytics are fun!

There is only the main index and the About page, and the about page has no preprocessing logic.

The index weighs in at 12kb, and 297 lines.

A few tests shows that the main index presently renders in 0.008s from a cold start and in 0.001s afterwards. I assume this 8x speedup is just Filesystem or OS or MySQL or Apache level caching, since I sure didn’t put any caching in myself.

The whole operation was 4 hours top to bottom, sans tweaks here and there for the past few days. This is roundtrip from registration, administrative stuff like editing my dns entries, apache conf files, setting up the database user, setting up an adsense and analytics account, and then implementation. The actual coding part was between 60 and 120 minutes, mostly debug stemming from sandbox/server inconsistencies. A lot of time was also wasted talking to the girlfriend on gtalk.

For contrast, this blog post has taken about 90 minutes in a text editor, and currently weighs 8kb. The line count is lower, but the lines are far longer; English is a less concise language than PHP… but even English is more internally consistent than PHP.

And that’s it!

I’d like to see if it gets some use, but I’m not exactly sure who to expose it to to see if anyone cares. I thought about posting it to 4chan, but I don’t think it’s got enough shock value for that, especially since it defaults to safesearch.

Even if it rots in obscurity, though, it’s a tiny completed work, so I’m all good by it.

If anyone has any comments or suggestions: please leave them!

Rockpants, Legend of Lunarnet

It always impressed me how the mysterious countdown captured the imagination, and how willing people were to mindlessly press this big red, but unlabeled, button.

Hotpants, the Lunarnet Bot

For over a year, on the Lunarnet IRC Network, Gayo had a bot running around many channels with a variety of commands.

It would pull a quote from his quotefile if you used !q. It could generate slashfiction on the fly if you used !slash. It would generate gibberish on some commands. It would pull from and if you ever did a ! command that it didn’t recognize, it’d md5 the string and modulus the result to the size of the array of all known commands, so that no matter what, a line starting with an exclamation point would trigger some sort of reaction from the bot, and always the same mapping for the same nonsense command. !penis would always do what !penis did before… unless the list changed.

Server Information


irc.lunarnet.org
Ports 6667/4444/7029 SSL


Eldrasia.lunarnet.org – UK
RPGCafe.lunarnet.org – US
Obsidian.lunarnet.org – CA
Castleheck.lunarnet.org – US

And if you ever did a lone !, it would emit a number.

And if you ever did it again, it would emit another number, exactly one less than the previous one.

Nobody knew of this at first. Gayo kept his trap shut when he re-tooled from a static list of commands to a “everything will do something” structure, and implemented the counter then. The lone !‘s existence went months without anyone noticing it.

And then it was discovered. How curious: it’s counting down.

We’d hit a !, and it’d say 912323. We’d do a !slash and a !q and a !, and then it’d say 912320. It became very clear that it was counting down it’s every use, and we became very interested in what would happen when it ran out.

It always impressed me how the mysterious countdown captured the imagination, and how willing people were to mindlessly press this big red, but unlabeled, button.

Increasingly over months in various rooms of lunarnet, groups of people would spam the bot in idle hours. Speculation grew high. Some imagined it’d do nothing, by intent or programming flaw. Others speculated that it’d just keep counting into the negatives. But most of us were hoping for something… awesome.

Gayo says that when the feature was installed, it was set to 1000000. It took over a year to hit the end. When we got into the 500,000’s, people started passing around a large text file consisting only of exclamation points and newlines and using mIRC’s /play command on it overnight to help run down the counter.

Then, one night, after months of the lunarnet community speculating and joining into the count-diminishing effort, the end was finally in sight:

The Final Countdown


<Zack> ALRIGHTY THEN
<Lucca> Here we go!
<Zack> !
<Hotpants> 8
<ketsugi> !7
<Hotpants> Qrngu Ung: gur Ung gung Znxrf Lbh Qvr
<ketsugi> !6
<Hotpants> Qrrc-Sevrq Cresbeznapr bs gur Gurgna!
<Shastao> !
<Hotpants> 5
<ketsugi> !5
<Hotpants> Ø_ø
<Zack> !
<Hotpants> 3
<Random> !
<Hotpants> 2
<Zack> !
<Hotpants> 1
<Random> !
<Hotpants> 0
<ketsugi> !
<Zack> ...
<ketsugi> ...
<Random> :D :D :D :D :D :D
* ketsugi laughs
<Zack> HA
<Lucca> ...WHAT A GREAT PAYOFF ;D
<Etir> What, it says 0.
<Zack> Bravo, Gayo
<Hotpants> It's been a long road, getting from there to here...
<ketsugi> !
<Zack> ...
<ketsugi> !
<Lucca> ...no look!
<ketsugi> !
<Etir> :o
<ketsugi> hm
<Zack> STOP
<Lucca> It's talking! :o
<Shastao> stop you twits
<Hotpants> It's been a long time, but my time is finally near!
<ketsugi> no more?
<ketsugi> ah
<ketsugi> ...
<Zack> Mr. Roboto!
<Hotpants> For I will see my dream come alive at last...I will touch the sky!
<ketsugi> Gayo needs a headcheck
<Hotpants> No, they're not gonna hold me down no more; no, they're not 
           gonna change my mind!
<Etir> Well duh
<Hotpants> 'Cause I've got faaaith of the heaaart, and I'm going where my heart
           will take me!
<Hotpants> I've got faith to believe I can do anything.
<Zeke> HA HA HA HA HA
<Hotpants> I've got streeeength of the soooul, nothing's gonna bend or break me!
* Lucca stares. O_o
<Hotpants> I can reeeeeeach any staaaaaaar....
<Zack> ...
* Zeke awards Gayo a purple heart.
<Hotpants> I've got faith!
* Etir snickers
<Hotpants> (I've got faith.)
<Hotpants> (I've got faith.)
<Hotpants> Faith of the heeearrt.
<Hotpants> THANK YOU, THANK YOU ALL
<Hotpants> IT WAS A LONG, STRANGE TRIP, BUT IN THE END, WE MADE IT, AND I THINK
           WE ALL LEARNED SOMETHING ALONG THE WAY
<Hotpants> I COULDN'T HAVE MADE IT WITHOUT MY MANAGER GAYO, AND BAHAMUT, AND 
           EVERYONE BACK HOME WHO SUPPORTED ME
<Lucca> Gaaah! ;D
<Zack> HEH.
<Hotpants> THANKS YOU GUYS, THIS IS FOR YOU AS MUCH AS FOR ME
<Random> Is someone logging this?
<Hotpants> I TELL YOU
<Shastao> duh
<ketsugi> My client at home is, if no one else
<Hotpants> I BEEN A LOT OF PLACES ON THIS TOUR, BUT I GOTTA SAY, NO PEOPLE OUT THERE 
           KNOW HOW TO PARTY LIKE #RPGCAFE PEOPLE
<Lucca> Damn right!
<Zack> Huzzah.
<Hotpants> CMON YEAH GIVE IT UP
<Shastao> and Rand hit the 0 :P
<Hotpants> YEAH, YEAH, YEAH!!!
<Zack> There's your claim to fame, Rand.
 * Hotpants is now known as Rockpants
<Etir> Forever known as "that guy who hit 0"
<Random> Whoo!
<ketsugi> ...
<Zack> ...
<Lucca> OH GOD!
<Etir> ...haha
<Zack> Bwahahah
<Rockpants> ONE TWO THREE FOUR
* Mune` has quit IRC (Ping timeout)
<ketsugi> o_O
<Rockpants> STOP!
<Zack> o_o
<Rockpants> IN THE NAAAAME OF LOVE
* Shastao thuds
* Mune` has joined #rpgcafe
<Lucca> Yeah! ;D
<Etir> lol!
* Lucca swoons for rockpants
<Zack> Bwahaha.
<Rockpants> BEFORE YOU BREAK MY HEART
<Rockpants> BABY, BABY
<Rockpants> I'M AWARE OF WHERE YOU GO
<Rockpants> EACH TIME YOU LEAVE MY DOOR
<Shastao> how long is this?
<Rockpants> I WATCH YOU WALK DOWN THE STREET
<Zack> No clue
<Rockpants> KNOWING THE OTHER LOVE YOU'LL MEET
<Rockpants> BUT THIS TIME BEFORE YOU RUN TO HER
<Lucca> brb
<Rockpants> LEAVING ME ALONE AND HURT
<Rockpants> THINK IT OVER
<Rockpants> AFTER I'VE BEEN GOOD TO YOU?
<Rockpants> THINK IT OVER
<Rockpants> AFTER I'VE BEEN SWEET TO YOU?
<Rockpants> STOP!!!
<Etir> This would be perfect if it reset to 1,000,000 again for round 2 at the end. ;)
<Zack> Oh god. :P
<Rockpants> IN THE NAAME OF LOVE
<Rockpants> BEFORE YOU BREAK MY HEART
<Rockpants> (clasps hands over heart)
<Rockpants> STOP! IN THE NAME OF LOVE
<Rockpants> BEFORE YOU BREEEAK MY HEART
<Rockpants> THINK IT OOOVER
<Rockpants> THINK IT OOOVER
<Rockpants> YEAH YEAH
<Rockpants> ETC ETC
<Rockpants> I WILL NOW RECITE FROM "THE WRECK OF THE HESPERUS," BY LONGFELLOW
<Rockpants> COLDER AND LOUDER BLEW THE WIND
<Rockpants> A GALE FROM THE NORTHWEST
<Rockpants> THE SNOW FELL HISSING IN THE BRINE
<Rockpants> AND THE BILLOWS FROTHED LIKE YEAST
* Shastao is now known as Shas-zzz
<Rockpants> DOWN CAME THE STORM AND SMOTE AMAIN
<ketsugi> amain?
<Rockpants> THE VESSEL IN ITS STRENGTH
<Rockpants> SHE SHUDDERED AND PAUSED LIKE A FRIGHTED STEED
<Katt> o_o
<Rockpants> THEN LEAPT HER CABLE'S LENGTH
<Zack> Ooookaaay..
<Random> ...He's had how many months to work on this?
<Rockpants> HLAGHLAGHLGHAHGH BALLS HONK
<Zack> Not sure.
<Rockpants> BONG BONG BONG BONG
<Zack> Anywhere from 2 to 6, maybe. I dunno
<Rockpants> LORD JESUS COME CARRY ME HOME
* Rockpants has left #rpgcafe (SPORK)
<Zack> ...
<Ashton> ...
<DooM_GazE> ...
<Zack> Ladies and gentlemen, Rockpants has left the channel.
<Etir> hahahahaha

Coda

Rockpants has been mentioned for years after as a fond network memory, but neither Hotpants nor Rockpants rejoined after it auto-left. It always impressed me how the mysterious countdown captured the imagination, and how willing people were to mindlessly press this big red, but unlabeled, button. Gayo later would replace Hotpants with Knickerbockers, who was shortened to KB for ease of readability, but to this day KB’s never responded to !.