20100128

Shorty Awards Audit Part 2: Exception or The Rule?

After discovering previously that @mercola had 64% valid votes (IMHO) where as @DrRachie had 88% valid votes, I wonder if this is an phenomenon is the same in other categories. In other words: is @mercola's valid vote percentage the exception or the rule?


To answer this question, I ran the audit script for 1st and 2nd placers in the #music category. Here is the breakdown for the current leader, @yelyahwilliams:



  • deleted accounts: 449 (13.98%)
  • accounts with 1 tweet: 21 (0.65%)
  • accounts with 2 tweets: 32 (1.00%)
  • other accounts: 2706 (84.27%)
  • total: 3211


There is a discrepancy of 3, from users BenFreemann, ovan10, and YannickBraun. 


Now for @ivetesangalo:

  • deleted accounts: 431 (9.07%)
  • accounts with 1 tweet: 30 (0.63%)
  • accounts with 2 tweet: 92 (1.94%)
  • other accounts: 4190 (88.21%)
  • total: 4750


There is a discrepancy of 7 from andreiaAMO, Brubruna, buguinhaBrito, Erica_nasciment, julianestephany, KEKELZITA, and pedro_PERWAH.


It would seem that @mercola's 64% is an exception not the rule. Granted, I only sampled 4 leaders. I suspect however that when I run the statistics for the leaders in #celebrity, I would see the same results: that the rule is for percentage of valid votes are 80% or higher.


I will update when the #celebrity audit is done. Note that I am auditing those categories where the leaders have vote counts in the thousands. This should reduce anomalies. 


Cheers,
Steve

20100127

Shorty Awards Audit

After reading the sordid tale of ballot stuffing via twitter over at Bad Astronomy, I wonder if @mercola has the same "problem". Further, I wanted to know if it was also affecting @DrRachie.


To that end I wrote a python script to "audit" shorty award votes. Given a username, the script will scrape shortyawards.com for voters, and hit their twitter.com profile to generate a file containing 2 columns: username and number of updates. Users with deleted accounts will have -1 updates.


I have ran the script for @mercola, and at the time of data collection (UTC 1100) this is the breakdown of where the votes came from:
  • deleted accounts: 348 (12.07%)
  • accounts with 1 tweet: 407 (14.11%)
  • accounts with 2 tweets: 288 (9.98%)
  • other accounts: 1838 (63.71%)
  • total: 2885


The discrepancy of 4 comes from users who somehow managed to have no tweets: I suspect the account was deleted, then recreated. These 4 users were: bugoff48, budsgirl54, tracyaustin, janesperr.


You might wonder why I took an exception to users with 2 tweets. The following screen shots should suffice as an explanation:





I checked at random 10 users with only 2 tweets, and they were all people who created a twitter account for the express purpose of voting in the shorty awards, which is against the rules.


Personally, I would say that only 64% of votes for @mercola are valid. This puts him in the lead still, but only ~300 votes in front.


Feel free to do your own analysis of the data.


I am still running the script for DrRachie, so I will update when that script is done. In case you are wondering why it takes so long, that's because I am been nice and rate limiting my queries :)


Update 1: realised some users were showing up twice. Removed them, recalculated, re-linked data.


Update 2: @DrRachie's data is available! See the following.


OK, here is a break down of where @DrRachie's votes came from:


  • deleted accounts: 113 (6.50%)
  • accounts with 1 tweet: 41 (2.35%)
  • accounts with 2 tweets: 47 (2.70%)
  • other accounts: 1542 (88.42%)
  • total: 1744


Again there is a discrepancy, this time of a single user, Superpositional.


Just as I did for @mercola, I checked random accounts with 2 tweets. They all broke the rule. These accounts contained only tweets voting in the shorty awards.


My personal opinion is that 88% of votes for @DrRachie are valid, a percentage much higher than @mercola's.


Again, the data is available for your own analysis.


What should be done about this, I hear you ask. Personally I am happy if @mercola and @DrRachie both have their vote count adjusted accordingly.


Update 3: I am running the same analysis for 1st and 2nd place for #music, to see if the same pattern holds. Those results will be in a new post.


Update 4: I should point out that I am aware both @mercola and @DrRachie received votes in multiple categories. But seeing as how majority of votes are in #health, I feel it would be Too Much Effort to separate the vote out. Though if enough people complain, I will fix it.


Update 5Part 2 has been posted. It explores the question whether 64% valid votes is the exception or the rule.


Cheers,
Steve



20100110

An Idea for Personal Domains

Given that we can have purely numeric domains, i.e. 131500.info, why not have domains that map to our mobile phone numbers for personal use?

What's the point? For one, you can give out your public mobile number instead of your website, since it is much easier to communicate numbers than domain names. This can be used to communicate other information that is difficult to convey by voice, e.g. emails, skype names, etc. A simple website at $your_mobile.mob would overcome all these.

This obviously has privacy implications, and as such should be entirely opt-in.

Any such system would need to be regulated, ideally controlled by carriers. A custom TLD like .mob would probably be a good idea too. One must also keep in mind however that such easily predictable domain names will be targeted by spammers.

Cheers,
Steve

20100105

Introducing GeoNote AR (2.0)

Some of you might know I have been working on a little iPhone app called GeoNote (iTunes link). Its basic goal is to allow you to annotate the real world by allowing you to leave little messages (notes) which are "pinned" to real world locations. These little messages are visible to anyone running GeoNote.

Initially GeoNote had a rather unflattering interface: just a List View of notes. However as the iPhone SDK and the iPhone itself evolved, GeoNote also evolved. First it gained Map view, which was much more intuitive and useful, then with the iPhone 3GS and a bit of time on my hands, GeoNote gained Augmented Reality view:


Cool isn't it :D It is available in GeoNote 2.0, but only for people with iPhone 3GS. GeoNote will run on iPod touch and iPhone 3G, but AR will not be available.

The Augmented Reality View is activated by holding the phone up like you would to take a landscape picture, with the home button on the right. The colour scheme is customisable, since I haven't found a nice set of colours. It looks rather retro'ish with the default green colour scheme:


There are a lot of things that cane be done better, like a nice way to select notes, and more customisation for things like limiting distance, etc. But as they say, release early, release often :-)

For more on the app, visit: http://gtd.pictorii.com. It is rather nasty right now, I will work on that :)

Cheers,
Steve

20091231

Reality Blows: Strange LCD Problem and Strange Solution.

I spent the better part of two hours struggling with your average HD44780 driven 16x2 character LCD, even though I was using the LiquidCrystal library that comes with the arduino environment. My problem was the text I was printing out looks like this:


I tried a lot of things, like adding in delays here and there, even going so far as to use a subclass of LiquidCrystal which inserts a 2ms delay after each write to no avail. Then by a process of elimination, I found that if I reverse the order in which the lines were printed, i.e. print line 1 then line 0, the problem goes away:


Whiskey Tango Foxtrot.

Cheers,
Steve

Order Matters With XCode's Build Phrases

I use a custom script to insert the current git commit into GeoNote, so when I get bug reports I have a better idea of which version the user is running. The script is as below:

import os
from Foundation import NSMutableDictionary

version = os.popen4("/sw/bin/git rev-parse --short HEAD")[1].read()
info = os.environ['INFOPLIST_FILE']
print info
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info)
print plist
plist['revision'] = version[:-1]
plist.writeToFile_atomically_(info, 1)

This was added as a Run Script Build Phrase. The problem I noticed was that the commit short hash inserted into Info.plist was always one commit behind. After some head scratching, I realised this was because by default the new build phrase is inserted last, and the order matters! It isn't actually possible to reorder build phrases by drag and dropping the children nodes around. You have to do a head-insert by dragging a child to the parent, which inserts it at the top.


Voila, problem solved.

Cheers,
Steve

20091222

Don't Worry About the Pirates.

So you are an indie musician, and you are worried about pirates – those naughty people who are allegedly stealing food off your table and from the mouth of your children.

Well I am here to tell you there is no need to worry – pirates may just be the best thing to ever happen to you.

First, let me tell you something that you probably don't want to hear – you are nobody. You are nobody in the sense that 99.9999% of the people on this planet has never heard of you. The only way to change this is to get your music into the ears of as many people as possible

Big artists do this – they have TV spots, radio spots, newspaper reviews. These are all ways to reach listeners without them paying anything.

This is also what you need to do, and pirates do this very well. If a single pirate distributed your music to two other pirates, and they in turn distribute to two more pirates and so forth, in a very short time you would have reached all of western civilisation.

Now I can see you getting puffed up, about to yell at me how this doesn't make you a dime. Just give me a second, will you?

The second thing I am going to tell you is that to a first approximation, you make money only from your fans. Remember that the word "fan" comes from fanatic – they are people who bought the Fellowship of the Ring when it first came out on DVD, then bought the Director's Cut, then bought the Special Limited Collector's Tin Box Edition , and then the Super Mega Ultra Edition that came with a Gandalf bust, then they did it again for the Two Towers, Return of the King, then for the whole damn series. These are people who have 12 versions of each Lord of The Rings trilogy, and will purchase the anniversary edition when it comes out in 2012 anyway.

The point is: your fans love you, they will buy your music, your merchandise, and go to your concerts even if they can get it for free – that is just how fans are.

Now the only way to get fans is to have people listen to your music, and as long as you have a non-zero conversion rate of joe-listener-to-fan, you come out on top. The more people you reach, the more fans you get, and the more money you make.

Just in case you don't get it yet, here it is in point form:

  • no one has heard of you
  • if no one has heard of you, you have no fans
  • you make money from fans
  • people become fans from listening to your music
  • pirates distribute your music to millions, even billions of people
  • this increases your fanbase
  • a larger fanbase means more money
  • a large enough fanbase means you have Made It Big

Got it?

Cheers,
Steve

Latching Power Supply With Electronic Turn Off

This circuit has (as far as I can tell), 0 off current, and 17mA on current. It is latched by the momentary push button, and can be turned off by applying >0.7V at the input as shown. It is intended for use with embedded interactive installation (e.g. an arduino) where the user pushes the button to turn the device on, and the device will turn itself off after some time to conserve battery.

It is a modified version of this circuit.

Cheers,
Steve

20091217

Nice Work Australia Computer Society

You came to me during my first year in university, and sold yourself as the paragon of virtue and integrity - the kind organisation I would be foolish not to be associated with if I want to get anywhere in Australia doing software, or "Information Technology" as they call it now days.

I didn't join then, because I didn't have the money. I didn't join later because my career focus shifted away from software. I won't join now ever, because you have sold out.

I am referring to the honorary membership you awarded to none other than one Stephen Conroy, Internet Villain of the Year, 2009.

You had such nice things to say about him too:

“We are very pleased to honour Senator Conroy’s contribution and support of the significance of ICT to the economy and the key role of ICT professionals in Australia’s future,” said Mr Wells.

If I am so inclined as to read between the lines, I can't help but get the feeling you are thanking Mr. Conroy for pushing the Internet filter scheme, and in the process provided jobs for the programmers and technicians involved in the various trials and consultations.

“Senator Conroy has always encouraged the ACS in its role as the independent voice of the ICT profession, welcoming our input to various enquiries and working groups, and regularly attending key ACS events. We are grateful for his on-going support,” Mr Wells said.

I don't think Mr. Conroy is listening to your input, or learning from your events - he continues to believe filtering the Internet is doable, and not a waste of time and resources.

I reject you, Australia Computer Society, as "voice of the ICT profession". Your actions are deplorable and shows a lack of integrity. If I was a member, I would be ashamed.

Cheers,
Steve

20091216

Yet Another Arduino Float Print Function

Note: in arduino-0017, floating point printing is supported by default. The function below is not necessary.

void floatPrint(float f, int places=6)
{
        int _d;
        if (f < 0)
        {
                Serial.print("-");
                f*=-1;
        }

        _d = (int)f;
        
        if (!places)
        {
                return;
        }

        Serial.print(_d, DEC);
        Serial.print('.');

        while(places--)
        {
                f-=_d;
                f*=10;
                _d = (int)f;
                Serial.print(_d, DEC);
        }
}

void floatPrintln(double f, int places=6)
{
        floatPrint(f, places);
        Serial.println();
}
Why another float print function? The ones I found wasn't too nice, one of which required long integers. Yuck. It was also fun, and now I know where to look for one in the future :P
Cheers,
Steve

20091207

A subtle source of linker errors under XCode

If one source file is sourcecode.c.objc and another is sourcecode.cpp.objcpp, you will have problems if you try to call function defined in one file from the other. The resolve this either make them the same source type, or follow this guide.

This drove me nutty because the template I was working off has code set to sourcecode.cpp.objcpp, but XCode adds new classes as sourcecode.c.objc! To check the file type, use "Get Info" in the source file's context menu.

Cheers,
Steve

20091011

qrbackup

I generated a gpg keypair for myself today, and I was looking for a fairly safe way to back it up. I don't particularly trust DVD/CDs, and keeping it on flash is even more worrying. I wanted a means of backup I can see and touch.

Paperbak would be great if it was ported to something not windows. Since it wasn't, I settled on QR Code.

Thus qrbackup was born. It will base32 encode a file, then encode it into QR codes using google chart service.

I have tested it from backup to restoration, and it works. YMMV, more instructions available after the jump.

Cheers,
Steve

P.S. Pardon my python.