thinking stiff

Bernie can’t win

Posted in Uncategorized by thinkingstiff on 2016/04/19


Posted in Uncategorized by thinkingstiff on 2014/04/14


Everyone is good at something.

CSS transitions with Javascript

Posted in Programming by thinkingstiff on 2013/02/08

Assigning CSS transitions in Javascript can be tricky due to both order of assignment and timing. Stepping though while debugging can give you different results than running live, which makes it difficult to find the problem. In answering CSS transitions do not work when assigned trough JavaScript on Stackoverflow, I came up with the following guidelines.

To make transition work, three things have to happen.

1. the element has to have the property explicitly defined (ex: opacity: 0;)
2. the element must have the transition defined: transition: opacity 2s;
3. the new property must be set: opacity: 1

If you are assigning #1 and #2 dynamically, there needs to be a delay before #3 so the browser can process the request. If you are debugging, it will often appear to work because you are creating this delay by stepping through it, giving the browser time to process. Adding transition to an element is not what triggers the animation, changing the property does.

To create this delay you can either add the first two steps to the HTML at design time, or create the delay in Javascript with .setTimeout().



    <div id="fade1" class="fadeable">fade 1 - works</div>
    <div id="fade2">fade 2 - doesn't work</div>
    <div id="fade3">fade 3 - works</div>


    .fadeable {
        opacity: 0;
    .fade-in {
        opacity: 1;
        transition:             opacity 2s;
            -moz-transition:    opacity 2s;
            -ms-transition:     opacity 2s;
            -o-transition:      opacity 2s;
            -webkit-transition: opacity 2s;


    document.getElementById( 'fade1' ).className += ' fade-in';
    //doesn't work
    document.getElementById( 'fade2' ).className = 'fadeable';
    document.getElementById( 'fade2' ).className += ' fade-in';
    document.getElementById( 'fade3' ).className = 'fadeable';
    window.setTimeout( function() {
        document.getElementById( 'fade3' ).className += ' fade-in';
    }, 100);

The MOME List – Top Movies of the Modern Era

Posted in movies by thinkingstiff on 2013/02/02

All lists of top-grossing movies everywhere are wrong. They are all based on gross totals without adjusting for inflation. Comparing dollar amounts from different years without adjusting for inflation is total nonsense and is not done anywhere else regularly except for movie lists. Reporting based on these numbers is just lying.

Studios love these lists because it makes it seem like every few months they have a new top-grossing movie. Newspapers and movie blogs love it as well because it gives them something to talk about. But when they say things like, “[Skyfall is] only a week away from becoming the highest-grossing Bond film in history”[forbes] and “Django Unchained triumphs as highest grossing Tarantino film in US”[guardian], it is simply not true. The highest-grossing Bond film is “Thunderball” at an inflation-adjusted $581,944,000[boxofficemojo], compared to “Skyfall” at roughly $302,000,000 (at the time of this writing)[boxofficemojo]. “Pulp Fiction” is Tarantino’s highest-grossing film at an inflation-adjusted $197,508,600[boxofficemojo] compared to “Django Unchained” at roughly $151,00,000 (at the time of this writing)[boxofficemojo].

The data-heavy site, Box Office Mojo, is one of the few exceptions in that it allows you to see most charts in an inflation-adjusted version (it is where I get the data for The MOME List). But that is not the default and all the news on its front page is based on unadjusted amounts.

One of the problems with adjusting movies for inflation is figuring out the best way to do it. Box Office Mojo’s method is to take total gross, divide by average movie price for the year the movie was made to get total tickets, and then multiply the ticket count by the average ticket price for the year you want to adjust to. I have played with many different methods, including using actual inflation values of the whole economy based on Consumer Price Index and adjusting ticket price to that (which doesn’t match average ticket price exactly). I am going to incorporate that into The MOME List in the future, but for now it is using ticket price average.

There are other considerations when comparing movies of different eras, and Box Office Mojo’s Adjusting for Ticket Price Inflation covers the basics. I have spent a great deal of time playing with the data testing some different theories. I took into account total population, total movie theaters, economic strength, and total movies released at the time. None of them changed the ranking in any significant way. It seems the average ticket price method is good enough.

A limitation of an inflation-adjusted list is that it can only be based on US grosses. With drastically different release schedules, theater densities, and inflation values, it is impossible to include foreign grosses in an inflation-adjusted list in any meaningful way.

The Box Office Mojo inflation-adjusted list still has some issues (besides the fact that no one, not even Box Office Mojo, uses it for anything) that prevent it from being a useful list for today’s top movies. Take a look.

Box Office Mojo – All Time Box Office Domestic Grosses – Adjusted for ticket price inflation

It is dominated by extremely old movies. This in itself would not be bad if all the movies on the list could be meaningfully compared to each other. I argue they cannot. Take “Gone With The Wind (1939)” and “Titanic (1997)”. When “Gone With The Wind” was released, average ticket price was $0.23, or a CPI-based inflation-adjusted $2.64 in 1997, when Titanic was released. The average ticket price in 1997 was $4.59. So a movie ticket was substantially cheaper in 1939, compared to everything else, than it was in 1997. The other, much more important, difference is that in 1939 the public did not have TVs, cable, VCRs, DVDs, or the internet. There was no other way to consume pre-recorded visual entertainment. Everyone went to the movies; it is all they had. In 1997, going to a theater to see a movie was a completely different social experience, and one of dozens of ways to consume media. It just does not make sense to compare these two movies in the same list.

So what defines the “modern era” of movies? I say it is the point when most active movie goers had access to see movies of their choosing in other formats fairly easily. I am also saying that is 1985. That is the year Blockbuster Video opened and VCR saturation hit 30% of US households.[entmerch] You could argue that as people got more and more ways to consume, like DVD and the internet, and when saturation neared 100% that the “modern era” moved with it. I considered this, but do not think it matters. The format for seeing a movie outside of a theater is irrelevant. It is either at a theater or it is not. And with 30% total household saturation, I estimate 65% of active movie goes had access to VCRs, since movie lovers were the early adopters. Active movie goers are the kind that affect gross in a significant way.

Also, after looking at the results with different years as the cutoff, the 1985 list feels right. In the 27 years the list covers, four of the top 25 movies are from the last five years and four are from the first five years. That is a pretty even distribution, which is what I would expect from a fairly new list comparing meaningfully-comparable items. As the list ages, I think it will become more difficult to get on this list.

So I present: The MOME List.

Movie Year Gross Standard   Adjusted  
1 Titanic 1997 $1,053,991,400 2 +1 5 +4
2 Avatar 2009 $756,646,000 1 -1 14 +12
3 Star Wars I – The Phantom Menace 1999 $702,627,900 5 +2 16 +13
4 The Lion King 1994 $693,559,200 11 +7 17 +13
5 Jurassic Park 1993 $670,681,400 22 +17 20 +15
6 Forrest Gump 1994 $611,084,900 27 +21 24 +18
7 Marvel’s The Avengers 2012 $597,256,700 3 -4 27 +20
8 The Dark Knight 2008 $579,262,700 4 -4 29 +21
9 Shrek 2 2004 $552,776,200 8 -1 32 +23
10 Spider-Man 2002 $540,591,300 14 +4 36 +26
11 Independence Day 1996 $538,911,800 38 +27 37 +26
12 Home Alone 1990 $526,972,100 54 +42 38 +26
13 Pirates of the Caribbean: Dead Man’s Chest 2006 $502,808,700 10 -3 46 +33
14 Batman 1989 $489,786,900 71 +57 50 +36
15 LOTR: The Return of the King 2003 $479,556,900 19 +4 52 +37
16 Finding Nemo 2003 $479,429,400 17 +1 53 +37
17 Spider-Man 2 2004 $468,035,100 20 +3 55 +38
18 The Passion Of The Christ 2004 $464,503,700 21 +3 59 +41
19 Star Wars III – Revenge of the Sith 2005 $461,545,300 18 -1 60 +41
20 Back To The Future 1985 $459,414,100 115 +95 61 +41
21 LOTR: The Two Towers 2002 $449,102,700 24 +3 62 +41
22 The Dark Knight Rises 2012 $448,139,100 7 -15 63 +41
23 The Sixth Sense 1999 $447,965,600 45 +22 64 +41
24 Harry Potter and the Sorcerer’s Stone 2001 $435,003,000 31 +7 69 +45
25 LOTR: The Fellowship of the Ring 2001 $426,338,400 33 +8 77 +52

The Standard column shows the shitty, unadjusted rank that everyone everywhere uses. The Adjusted column is the rank in Box Office Mojo’s adjusted list with all movies. The columns next to those are the change from that rank to the current rank.

Some notable movies that I expect to see atop lists like this, like “Star Wars” and “E.T.”, are missing. And some horrible pieces of crap, like “Home Alone” and “Independence Day”, have crept up the ranks on this list. But this is not a list of great movies, it is a list of movies that a lot of people saw in theaters. One surprise was “Back To The Future”. It is a great movie, but I had no idea it was so popular when it was in theaters.

This list will improve when I add CPI-based inflation into the calculation, but for now this is the best top-grossing movie list that exists.

Tagged with: , , ,

Highlight <table> column on :hover using CSS with no Javascript

Posted in Programming by thinkingstiff on 2012/06/26

While HTML allows the :hover pseudo-class on <tr> elements, unfortunately the same does not hold true for <col> elements. All solutions I’ve seen to highlight columns in tables involve Javascript.

I’ve tried to solve this with CSS a couple of times before with no luck. I recently saw this question on Stackoverflow, cols, colgroups and css :hover psuedoclass, which was looking to highlight both rows and columns at the same time. I gave it a shot and was able to do it using the ::after pseudo-element and no Javascript.

I saw another question looking for just a column solution, html: hover table column, and I simplified the code to what you see below. This works in all modern browsers except Firefox, which requires a little tweak. The function firefoxFix() below takes care of this.



table {
    border-spacing: 0;
    border-collapse: collapse;
    overflow: hidden;
    z-index: 1;

td, th, .ff-fix {
    cursor: pointer;
    padding: 10px;
    position: relative;

.ff-fix:hover::after {
    background-color: #ffa;
    content: '\00a0';
    height: 10000px;
    left: 0;
    position: absolute;
    top: -5000px;
    width: 100%;
    z-index: -1;



Firefox Fix:

function firefoxFix() {

    if ( /firefox/.test( window.navigator.userAgent.toLowerCase() ) ) {

        var tds = document.getElementsByTagName( 'td' );

        for( var index = 0; index < tds.length; index++ ) {
            tds[index].innerHTML = '<div class="ff-fix">' + tds[index].innerHTML + '</div>';                     

        var style = '<style>'
            + 'td { padding: 0 !important; }' 
            + 'td:hover::before, td:hover::after { background-color: transparent !important; }'
            + '</style>';
        document.head.insertAdjacentHTML( 'beforeEnd', style );


Tagged with: , , ,


Posted in Uncategorized by thinkingstiff on 2012/06/07

How to make a contenteditable <div> look like an <input> element or <textarea>

Posted in Programming by thinkingstiff on 2012/01/22

Webkit browsers (Chrome/Safari) have a very old, and still outstanding, bug (#38943) with the ::selection pseudo-element: they totally ignore the background-color property.

In my answer to How to style the selected text in textareas and inputs in Chrome? on Stack Overflow, I outline that it is possible, to get around this issue using the contenteditable attribute because the ::selection background-color property is not ignored on <divs>. The look of both <input> and <textarea> elements can be can be duplicated with a <div>, contenteditable, and some CSS.

I further expanded the code in my answer in How do I make an editable DIV look like a text field?. The resulting <input> and <textarea> clones look nearly identical to their native counterparts on Chrome, Safari and Firefox. Opera and IE9 don’t look the same, but are still decent.



textarea {
    height: 28px;
    width: 400px;

#textarea {
    -moz-appearance: textfield-multiline;
    -webkit-appearance: textarea;
    border: 1px solid gray;
    font: medium -moz-fixed;
    font: -webkit-small-control;
    height: 28px;
    overflow: auto;
    padding: 2px;
    resize: both;
    width: 400px;

input {
    margin-top: 5px;
    width: 400px;

#input {
    -moz-appearance: textfield;
    -webkit-appearance: textfield;
    background-color: white;
    background-color: -moz-field;
    border: 1px solid darkgray;
    box-shadow: 1px 1px 1px 0 lightgray inset;  
    font: -moz-field;
    font: -webkit-small-control;
    margin-top: 5px;
    padding: 2px 3px;
    width: 398px;    


<textarea>I am a textarea</textarea>
<div id="textarea" contenteditable>I look like textarea</div>

<input value="I am an input" />
<div id="input" contenteditable>I look like an input</div>

iPhone Notification Badge in CSS

Posted in Programming by thinkingstiff on 2012/01/21

iPhone Notification Badge - CSS

In answering this question, Vertically and horizontally centering text in circle in CSS, on Stack Overflow, I expanded upon an earlier solution I had to this problem and made them expandable.

These look good in webkit (and great on the iPhone), and pretty decent in -moz, -o, and -ms.



<div class="badge">1</div>


.badge {
background: radial-gradient( center -9px, circle closest-side, white 0, red 26px );
background: -moz-radial-gradient( center -9px, circle closest-side, white 0, red 26px );
background: -ms-radial-gradient( center -9px, circle closest-side, white 0, red 26px );
background: -o-radial-gradient( center -9px, circle closest-side, white 0, red 26px );
background: -webkit-radial-gradient( center -9px, circle closest-side, white 0, red 26px );
background-color: red;
border: 2px solid white;
border-radius: 12px; /* must be 1/2 of ( border-width*2 + width ) */
box-shadow: 1px 1px 1px black;
color: white;
font: bold 17px/15px Helvetica, Verdana, Tahoma;
height: 18px; /* height + padding-top must equal width */
padding-top: 2px; /* height + padding-top must equal width */
text-align: center;
width: 20px;
Tagged with: , , , ,

Open Letter to Reed Hastings & Netflix

Posted in Uncategorized by thinkingstiff on 2011/09/19

Dear Mr. Hastings,

Every so often some genius with a crazy idea comes along and creates a product that is so brilliant it becomes an integral part of the fabric of society. These people usually have a bold and overreaching vision, an intense passion for what they do, a cocky belief that they can change things, and are willing to make the risky, bet-the-company moves that such a dream requires. Throw in a bit of serendipity and they change the world. You, sir, are one of those people, and Netflix is one of those products. You’re a hero.

When a product reaches the status of Netflix, it’s a household name. It becomes the generic term for its entire industry. Your product becomes more than just what you’re selling, your brand is your product. At that point, you practically have to kick your customers in the face to get them to stop giving you money.

Netflix is there. You’ve created a multibillion-dollar company that grows by huge amounts every quarter. You win. You did it. Congratulations! Netflix is invisible and indispensable. I’ve never been able to imagine not having it; it’s like my electric bill. For some time now I’ve viewed Netflix as this untouchable company that would continue to grow and innovate, and slowly take over the dated cable-television empire. No one has come close to being able to compete with you.

I have been a member of Netflix since the summer of of 1999, before subscriptions started, when you paid per movie (twelve years!). I found your service after the frustration of paying $56 in late fees at Blockbuster once for a single movie. I was so furious, that I still get riled up thinking about it. I signed up for your subscription plan in December of 1999 and the first movie I got was Intolerance (1916) (for a film history class). I kept it for a YEAR! At first it was just because it’s a difficult film to sit through. Slowly, the longer I kept it, it became a test of your “no late fees” mantra, almost like I was taking out my $56 late fee on that movie! I kept expecting to get an email from you guys asking where it was. Then finally, and triumphantly, it became an icon for the success of your business model. I was sold. I bragged about Netflix to everyone and would show them my copy of Intolerance (“No, seriously. No late fees, EVER!”).

I’m a very loyal customer and loyalty means a lot to me. In the last several years you’ve made changes that have made the service less useful to me, but the brand always won out. I just couldn’t ditch it. You slowly started dumping all social aspects of Netflix. I used to love logging in and rating all my movies so my friends could see what I was watching and what I like and vice versa. It made my movie watching experience much more enjoyable. While the whole world was becoming more social and connected online, Netflix was becoming an isolated website I rarely logged into. These changes have resulted in me using Netflix less and less. I slowly stopped rating films because there was no one to show them to. Before long I realized the same three DVDs have been on my shelf for six months. But I still kept the brand. I still kept paying.

The industry has changed a lot since you started Netflix. There are now many options for watching content online. I’ve been an Amazon Prime member for awhile now and out of nowhere they started offering free movies. And iTunes’ selection and interface is amazing. Despite all my choices, I still chose Netflix. I just kept thinking, “That’s nice, but I already have Netflix.”

You have obviously made some great decisions at Netflix as the company is wildly successful. You’ve made some decisions that seemed crazy at the time, like dumping your set-top box on the eve of its release, that turned out to be the right ones. And I know you think this change you’re making is one of those decisions. You don’t want to miss the boat on streaming and not be the premier company in that space. You think this is a brilliant and misunderstood move and that time will prove you right. And I really truly hope you’re right, but I think you’re wrong.

Some companies — huge, untouchable, world-changing companies — slowly drift into obscurity (think IBM) and some companies fall almost overnight (think Friendster, then MySpace). What makes companies fall overnight is a shift in the collective mindset. Such a change requires a catalyst, that kick in the face I mentioned earlier. For MySpace users, the kick in the face was Facebook. And once you get kicked in the face it shocks you into seeing things differently. It’s like a spell is broken. And then, without even knowing exactly how it happened, yesterday you thought MySpace was irreplaceable, and today you’ll never log on again. Shifts in collective mindsets topple countries.

For Netflix customers, our kick in the face has been a triple whammy. First, there was a price increase. This was obvious and offensive to many people because it was so huge. This one didn’t really phase me. The second one was much more subtle and took a few weeks for its implications to sink in for me, the splitting of DVDs and streaming. By splitting them out, you created a new way of looking at your product. Before it was just a ridiculously large library of DVDs plus the added bonus of UNLIMITED streaming now and then when one of my shows or movies was available. It was a package that caused me to never think about either. Upon splitting I suddenly realized that they both suck for me. When I was forced to view DVDs separately, I realized I wasn’t watching nearly enough to make the plan worth it. And when forced to view streaming separately, I realized how deficient the library was, especially compared to other options. It wasn’t a viable product on its own. Before viewing them separately I never cared about this.

Yet, still, after all this, and hearing the grumbling all over the internet, I was willing to stay with you. I was going to pay the new price for both plans and go back to not thinking about it. That was until I heard about the third kick in the face, Qwikster. Companies don’t split up when they are successful. They grow and acquire. Companies have to be forced to split up by the government or they split up due to seriously bad financial circumstances. Your shareholders have shown you what they think of Qwikster. The explanation you give, wanting to promote the products separately, doesn’t make any rational sense. Everyone, from four-year-olds to 99-year-olds, knows what Netflix is and what it does. You could use that brand to sell anything even remotely movie-related. And trying to sell the skeletal remains that is left after removing DVDs as “Netflix” seems futile.

Why not use the gigantic cash-cow, that is DVD rentals, to fund the fledgling streaming business until that becomes a viable option? Everyone knows streaming is the future. Everyone wants that future. Eventually DVDs will die out naturally. You can’t force the market.

Please, Reed, make the crazy, rash, hugely disruptive decision to REVERSE your decision to split up Netflix. Give us back our old Netflix. Give us back the one thing that no one else was giving us: unlimited DVDs and unlimited streaming in a single package.

I love Netflix. And for the first time in twelve years I’m actually seriously considering canceling my account. Once my DVDs move to Qwikster, I won’t even have “Member since December 1999” on my account page. And while that seems petty, it means a lot to me.

Thanks for listening,
A Very Loyal Customer
Matt Walton

Share: Digg . . StumbleUpon . Facebook . Twitter

Cursebird Leaderboard

Posted in twitter by thinkingstiff on 2009/02/04

The programmer of Cursebird, @richardhenry, has released a preliminary leaderboard (That would have saved me a lot of time three weeks ago!). One interesting thing I see on the list is that @bollocks gets every one of his tweets counted because of his name. He doesn’t even have to bother cussing.

Leaderboard Problems

Most people have wanted to see a leaderboard, but they haven’t necessarily thought through what that means. As I was working with @ThinkgingStiff, I thought a lot about the problems of creating one. Most people want bots excluded, and that seems easy at first. Bots like @ThinkingStiff and @Fuckbot are obviously there just to get to the top. But since Twitter doesn’t forbid bots, it leaves the job of excluding them up to the programmer. A first pass cleaning of them would be easy enough, but they will keep coming, I imagine, and it will become a daily task.

You also have bots that are reposting articles, scanning websites for keywords, or aggregating data. These are useful outside of the Cursebird universe and many of them are interesting and have many followers. Should they be excluded? After that, would come real people that are cussing their hearts out just to make it to the top. They have real accounts, real friends, and are really cussing. As soon as you have a leaderboard, people are going to compete to get to the top. That is just human nature. So pretty soon, you can be sure, the leaderboard will be all people that are trying to be there. It’s not very easy to determine who is just trying to be on the list and who just cusses a lot.

And once Cusrsebird has a list, with rules about who can be on it, there will inevitably be “good citizens” who want to rid the world of wrongdoers who will be scanning everyone’s tweets looking for “fakes.” They will then email the programmer to complain. Trying to keep the leaderboard clean would not be a job I would want to manually tackle on a daily basis.

Another problem I thought of is the effects of a leaderboard on website performance. Once there is a leaderboard, everyone will be clicking on these people to see who they are. Currently, it displays every swear a tweeter has ever said. For someone like @ThinkingStiff, at over 7000 swears, it takes a long time for the page to load. Only displaying the previous 500 might help with that.

Possible Solutions

It seems like all the manual solutions suck. I thought about a few automated ways to make bots less likely, but all of them depend on processing time on the database, and I don’t know how much time Cursebird has free in a day.

1. Limit the total daily swears to something more human, say 50. Twitter’s limit is 1000, of which about 500 will get counted (explanation). Only counting the first 50 swears would make bots much less useful.

2. Require an account to have at least one tweet over a month old. When someone starts to write a bot, they usually use a new account. If they have to wait a month to see any results, they will probably lose interest.

3. Require an account to have at least 10 followers. Very few people want to follow a bot. They may start, but will quickly stop following them.

4. Exclude duplicate swears. This is a big one and wold eliminate most common bots. A bot is either random words, which people quickly discover, or a finite list of tweets that get repeated.

Suggestion #1 could be done real time or as a batch on everyone. Suggestion #2, #3 and #4 would only need to be done on maybe 100 of the top cussers when building the leaderboard. Of course there are ways around #3, and #4 as a bot writer, but #1 is a big roadblock.


I’ll admit that a bot-free list would be interesting. Tweeters like @mollena are amazing. She just really cusses (and tweets) all the time.

Share: Digg . . StumbleUpon . Facebook . Twitter

I cursebird more than you do.

Posted in twitter by thinkingstiff on 2009/02/02

Discovering Cursebird

If you follow me on Twitter (and you should, I’m fucking awesome: you know that recently my fellow tweeters and I discovered Cursebird is a website that tracks, in real-time, people who are cussing on Twitter. If you tweet, “This has been a long fucking day!,” your tweet will show up on Cursebird’s website for all to see.

The site tracks the following words (and variants): fuck, shit, cunt, dick, cock, twat, bloody, bastard, bollocks. It shows the percentage each word is used and whether its usage is increasing or decreasing. It also shows four pieces of information for an individual tweeter: number of swears, a score out of 100, rank compared to others, and a statement of who you cuss like.

One of the first things people do upon discovering this site is start cussing up a storm on Twitter and posting their rank. It’s fun to watch your rank and score go up. Strangely, most of my friends were in the top 1000, and several were in the top 500. I guess we’re just a filthy bunch.

After playing with it for a bit, I and others had questions about how the scoring worked, how the count worked (tweets or words), and who was number one and how many did they have. While most people gave up and just went back to their regular tweeting behaviors, I created a second twitter account, @ThinkingStiff, and started trying to figure it all out.

Researching Cursebird

The first thing I wanted to figure out was what it was counting: tweets with cussing in them, number of cuss words, or some algorithm to figure out how “well” you cussed. So I started sending one word tweets that just said “fuck.” I quickly learned that Twitter doesn’t allow this. If you send the same tweet as the last one, it doesn’t even bother posting it. Then I switched to fuck, shit, fuck, shit… That got past Twitter’s restriction and I was steadily climbing up the charts on Cursebird. It was obvious at this point that Cursebird just counts the number of tweets with a cuss word in them. It doesn’t care how many cuss words are in it, or what words you used. So, one question was answered.

I then learned that Twitter has a limit on how many tweets you can post. When you hit this limit you get this message:

Wow, that’s a lot of Twittering! You have reached your limit of updates for the hour. Try again later.

After some research I discovered it’s not really an hourly limit, it’s a daily limit of 1000 tweets. They limit you in three hour blocks, so you can send 125 tweets every three hours. Once you’ve sent that many tweets, you have to wait until the three hours is up to send more.

The next question I had was how the score worked. It’s out of 100 so my first guess was that it was a percentile. But I was confused because the same swear count was resulting in different scores. I then saw someone’s score of “Not sure of 100.” This was a clue that maybe the processing of the rank and score was delayed (I’m a database programmer, so this made sense to me). Sure enough, it takes about 15 to 20 minutes for the rank and score to update. So you start out at “Lame of 100” when you have zero swears and move to “Not sure out of 100” on your first swear until it processes your score for the first time. Then it’s a percentile. So a “50 of 100” means you have cussed more than 50 percent of the people tracked on Cursebird. With that, my second question was answered.

Along with the score is a statement of who you swear like. You start at “swears like a Mute” with zero swears and work your way up to “swears like a George Carlin Wannabe.” Both the score and the statement weren’t that interesting to me because once you have over about 50 swears your score is “100 of 100” and your statement stays at “swears like a George Carlin Wannabe.” The programmer ( said that it is possible to get “101 of 100” but I’m pretty sure he was kidding. Unless he just picked some arbitrary large number and if you ever get that high you get the magic score.

Climbing The Ranks

The only remaining questions I had were who was ranked number one and how many swears did they have. I was quickly climbing the ranks and guessed it would take me a couple of nights to take number one. So for a couple of nights, while watching movies, I typed Shit and Fuck over and over. I was careful to space them out to one every few minutes because I wasn’t sure what Twitter’s policy was on things like this. I didn’t want my account closed before I completed my tests. One thing I noticed while doing this was that Cursebird doesn’t pick up all your tweets. It’s more like half of them. So if you cuss ten times, Cursebird may only see five of them. I’ll go into this more later.

Something I didn’t expect, which started on day two, was people complaining. I had no followers, because every time someone tried to follow me I blocked them. I did this specifically so no one would have to see my tweets every few minutes. So the only place to see my tweets was on Cursebird. And the whole point of Cursebird was to track cussing so it didn’t make any sense to me that people would care, but they did. One girl told me I was ruining Twitter. One guy reported me as spam. Another guy called me a “motherfucking cheap bastard asshole.” So apparently I wasn’t cussing “right.”

That’s when I started trying to look like a real cussing tweeter, whatever that is. The simple “fuck” and “shit” tweets turned into more elaborate stream of consciousness type tweets all with the word fuck or shit in them. Each one was unique and was just whatever I was thinking about at the time. It took more concentration to come up with them, so I couldn’t really do anything else while I was doing it. I did this hours at a time while watching the live Cursebird stream of everyone else cussing. After awhile, watching and producing all this banal word vomit was making me feel crazy.

I changed my picture every day so people wouldn’t see too many tweets from the same person. I also searched Twitter ( to make sure no one was complaining about my excessive tweets. It seemed to be working. My new tweets were not offending people (even though many of them were pretty vulgar) and some people even found them interesting.

The Bot

I did this every night for a week and I was up to almost 700 swears, but I still wasn’t in 1st. In fact, I couldn’t seem to get past 3rd. It was taking way longer than I expected and I was getting totally sick of it. I started thinking that maybe the programmer, while doing testing, had accounts with many thousands of swears and I would never be able to pass them. I also thought about writing a bot (a bot, or robot, is a piece of software that automates a task) that could tweet all day long. I was watching the live stream, so I knew there wasn’t any other bots running at the time or I’d see their swears.

The very next day I discovered someone else had written a bot (@fuckbot) and was quickly gaining on me. He was 400 swears behind me and at the rate he was going he would pass me in about four hours. Fuck. So I quickly wrote a bot. It took me about two hours to get it running the way I wanted it. I used the 500 or so tweets that I’d manually written and the bot picked one of the 500 randomly and tweeted it. Because I babysat/tweeked/monitored my bot constantly, it was less like a bot and more like a sentient artificial life form. @Fuckbot was now 200 swears behind me. I knew we were both constrained by the same 1000 tweets a day limit, so I figured that, unless my bot crashed, we’d stay at about the same pace.

And my bot crashed. So I fixed a bug to make sure it wouldn’t happen again and restarted it. He was now 180 behind me. His bot was spewing out random racist crap that looked nothing like real tweets, so I knew that he would be getting complaints about it (because I was and I simply said “fuck” and “shit” over and over). He also had a big red Fuckbot avatar. If Twitter had a problem with cussing bots, I would know soon.

Several days passed with both of us running our bots and Twitter still hadn’t canceled his account. I played with tweaking the time between my tweets to see if I could gain any on him. I started at 60 seconds and slowly progressed up. I was hoping that at some point Cursebird would capture more of my tweets or that I’d get more in synch with Twitter’s maximum and I wouldn’t have the downtime every three hours where Twitter starts limiting it. That failed miserably and I ended up slipping closer to @Fuckbot. He was now 140 swears from me. So I put it back at 60 and haven’t touched it since. That seems to be the best interval, although I haven’t tried going below 60.

I’m #1

Around 1019 swears (that’s when I noticed) I took the number two position. Soon, @Fuckbot took 3rd. And that would be the end of @Fuckbot’s journey. Twitter blocked him from the public timeline so, while he can still tweet, Cursebird can’t see his tweets. His grand total was 1621 swears (

With over 1000 swears and @Fuckbot out of the race, I was much less worried about someone overtaking me. But I was still a little worried that I might suffer the same fate as @Fuckbot. I started adding new tweets to my collection on a daily basis to keep it interesting and less repetitive. A few days later, at 2814 swears and after almost two weeks, I noticed I was in 1st place!

I’ve kept the bot running and as of the time of this writing, I have almost 6300 swears ( Now that I’m not worried about getting my account closed I stopped blocking people and changing my picture. People are talking about @ThinkingStiff a little more frequently (, but less of it is hateful now.

Another bot has come on the scene recently, @shiteatingfuck. He’s 5500 swears behind me, so he probably won’t catch up until I stop mine. He started out using @Fuckbot’s random cuss word method but has since switched to movie quotes so he’ll probably be around for awhile. He’ll take 2nd in less than a week.


Here are my results climbing up the ranks. Your results will be different because there’s been a lot of cussing since I started.

Tweets: Rank

  • 60: 471st
  • 70: 345th
  • 80: 252nd
  • 90: 209th
  • 100: 171st
  • 150: 70th
  • 200: 34th
  • 250: 23rd
  • 300: 13th
  • 350: 9th
  • 400: 8th
  • 450: 4th
  • 500: 3rd
  • 700: 3rd <— wrote bot
  • 1019: 2nd
  • 2814: 1st

Here are the people that I know of that are in the top 10. There is no published top 10 list, so this is just from seeing people come up on the live feed. Many people have asked for a Top 10 list (thoughts on a leaderboard). I wouldn’t mind seeing one either, but after staring at it for hundreds of hours, I’ve learned the most fascinating part of Cursebird is the live feed (like Twistori). It’s amazing how it all just seems to look the same after awhile. Everyone complains in the same way about the same stuff. Just a slice of life.

Top 10 (Feb 2 2009)

  1. @ThinkingStiff
  2. @geofftest <— account closed
  3. @Fuckbot
  4. @shiteatingfuck
  5. @redchinese19 (Thanks @gocards300)
  6. @Mollena

UPDATE (2/4/2009): @richardhenry released a preliminary leaderboard.


I used the TwitterLib from Witty to access the Twitter API (Witty). I randomly pick one of about 500 tweets to post every 60 seconds. I verify that I haven’t posted the same tweet in the last two hours, to help eliminate the appearance of repetition. Cursebird misses tweets, but as far as I can tell it’s Twitter’s fault. Not every tweet shows up in the public timeline or the search API. It doesn’t seem like the API is doing “contains” searching, so it would be nice to add “ass” to the list of tracked words. Or at least “asshole.” If you’re writing your own bot, and want to play with the 60 second interval, remember that you are limited by the 1000 tweets a day (125 every 3 hours) that you can’t get around. So your goal should be to get as many tweets to show up in the Twitter Search.

Share: Digg . . StumbleUpon . Facebook . Twitter

Tagged with: , , , , ,

Get every new post delivered to your Inbox.

%d bloggers like this: