September 11 Pager Message Analysis

I wanted to do some basic analysis on the September 11 Pager Message dump from wikileaks. The data is about 2 years old now, and I’m sure it’s already been analysed to death but I wanted to have a play anyway.

First I binned the messages in to 5min chunks and looks for occurrences of the word “plane”. You can see the results in the graph below:

There’s an unexpected blip at around 7am, this is due to messages about a US spy drone which was shot down over Iraq before the WTC planes hit.

A lot of people initially thought it was a bomb, here are the occurrences of “bomb” in text messages:

The peak at 3pm seems to represent reports of a “Car bomb explodes outside State Department, senior law enforceement officials say” mostly from yahoo news alerts.

Next I wanted to look for server issues so I search for any message containing: offline, timeout, error (but not terror) or “not responding”:

Not sure what the peak at 5am is, there are a lot of: ” adhocdb TEXT: adhocdb unix: WARNING: vxvm:vxio: Subdisk disk02-01 block 240384: Uncorrectable write error” and “[email protected]||elgweb8 login content match error on step 2”. It appears to be mostly the later. But you can certainly see the rate of errors pick up from about 8:00 onward. To know how much of this was due to the attacks I’d need more of a baseline. Some of the more interesting ones:

2001-09-11 09:05:20 Arch [0912377] C  ALPHA  8628**Customer reported outage* Internet is unavailable. Impact:User unable to connect to internet.  Multiple users state either extremely slow connection or connection timed out error. Occurred:08:55
2001-09-11 09:05:31 Skytel [003920778] C  ALPHA  SEV1 DesMoines as PICS  H0864464 SLI=Y ETA=Na 7:44  I:Pics is down, unable to access orders - error 202 no records found.  E:PICS Helpdesk  Janie ATCHelpdesk 512-248-4967-ATC Helpdesk
2001-09-11 09:15:46 Skytel [007607560] C  ALPHA  [email protected]||NSSW3/General Tire/T3149925/1-888-212-5447/Continental GT users in Charlotte are unable to connect to IBM IIN. NSCOMSOFT seeing errors. Please call ADVNETO.

Notes

I downloaded the wikileaks 911 pager torrent from: http://file.wikileaks.org/torrent/9-11_all_messages.7z.torrent. The pager messages are broken down by minute but for my analysis I wanted them all in a single file. So I started by concatenating them all.

cat 2001* > all_messages

The file contains lines that look like:

2001-09-11 03:00:00 Metrocall [1060278] B ALPHA 09/12@03:03:50 BETA13:Service (Oracle Web Lsnr 4.0(admin -DEFAULT_HOME,Intranet)) is not responding. Stopped. 1
2001-09-11 03:00:00 Metrocall [1421210] C ALPHA LAKEJob exceeded 4 hours on Lake
2001-09-11 03:00:00 Metrocall [1421210] C ALPHA LAKEJob 378304/VSIOWNER/OMSJRNMGR has MSGW status.
2001-09-11 03:00:00 Metrocall [0007690] C ALPHA THIS IS A TEST PERIODIC PAGE SEQUENTIAL NUMBER 4719
2001-09-11 03:00:01 Arch [0485957] B ALPHA (24)[email protected]|10.134.192.34 VARESAAPP03 is UP at 01:59:12
2001-09-11 03:00:01 Arch [0987275] C ALPHA s0191: 09/11 12:28:34 Reboot NT machine gblnetnt05 in cabinet 311R at 13/1CMP:CRITICAL:Sep 11 12:28:34
2001-09-11 03:00:01 Arch [1425048] C ALPHA 300~MPfetchData:openConnectionToManager:ERROR CONNECTING:192.168.35.97 : www36 connectToServerPort:socket/socket timed out at /home/crdtdrv/creditderivatives/script/MPfetchData.pl line 342, <SOCK_192.168.35.19> chunk 193021.

I then wrote some C++ code to analyse the data, here’s the “bomb” count in 5min bins across the time period:

stringify.h header:

#include <sstream>
#include <iostream>
#include <string>
#include <stdexcept>

#ifndef STRINGIFY_H
#define STRINGIFY_H

class BadConversion : public std::runtime_error {
public:
 BadConversion(const std::string&amp;amp;amp;amp;amp; s)
      : std::runtime_error(s) {}
};

template<class _type>
inline std::string stringify(_type x)
{
  std::ostringstream o;
  if (!(o << std::fixed << x))
    throw BadConversion("stringify()");
  return o.str();
}

template<class _type>
inline _type convertTo(const std::string&amp;amp;amp;amp;amp; s)
{
  std::istringstream i(s);
  _type x;
  if (!(i >> x))
    throw BadConversion("convertTo(\"" + s + "\")");
  return x;
}

#endif

Analysis code:

#include
#include
#include
#include
#include “stringify.h”
#include
#include

using namespace std;

// Example line: 2001-09-11 03:00:00 Metrocall [1060278] B ALPHA 09/12@03:03:50 BETA13:Service (Oracle Web Lsnr 4.0(admin -DEFAULT_HOME,Intranet)) is not responding. Stopped. 1

int time_to_int(string date,string time) {

int seconds_per_day = 86400;
int seconds_per_hour = 3600;
int seconds_per_min = 60;

int day = convertTo(date.substr(8,2));
int hour = convertTo(time.substr(0,2));
int min = convertTo(time.substr(3,2));
int sec = convertTo(time.substr(6,2));

int itime = 0;
if(day == 12) itime += seconds_per_day;
itime += hour * seconds_per_hour;
itime += min * seconds_per_min;
itime += sec;

return itime;
}

int main() {

vector > message_bins;

int bin_size = 5; // mins

ifstream data_file(“all_messages”);

int start_time;
int next_time;

bool first=true;
vector current_bin;
for(;!data_file.eof();) {
char in_line[10000];
data_file.getline(in_line,10000);

if(data_file.eof()) break;

string line(in_line);

istringstream ss(line);

string date;
string time;
ss >> date;
ss >> time;

int i_time = time_to_int(date,time);

if(first) { start_time = i_time; next_time = start_time + 60*bin_size; first=false;}

if(i_time >= next_time) {
message_bins.push_back(current_bin);
current_bin.clear();
next_time += 60*bin_size;
}

std::transform(line.begin(), line.end(), line.begin(), ::tolower);
current_bin.push_back(line);
}

for(size_t n=0;n

The Distribution of Bitcoin users

I wanted to get an idea of the distribution of bitcoin clients throughout the world. While bitcoin is a distributed network clients current connect to a central IRC channel to find initial peers. I connected an IRC client to the channel and monitored connections for a couple of days. I then ran the results through a geoip lookup tool.

The 10 countries with the most bitcoin clients are:

Position Count Country
1 2769 US, United States
2 868 DE, Germany
3 518 RU, Russian Federation
4 478 GB, United Kingdom
5 368 CA, Canada
6 332 PL, Poland
7 227 CN, China
8 227 AU, Australia
9 179 SE, Sweden
10 171 UA, Ukraine

I was slightly surprised to see that the US was so far ahead to everyone else. Also to find that Japan was so far down the list, considering the technology is said to have originated there, and that the largest bitcoin exchange is hosted there.

Notes

The irc log file contains lines which look like this:

10:25 -!- u4qBM3jsFJbVbpo [[email protected]] has quit [Ping timeout: 600 seconds]
10:25 -!- u5R1WUESwqDJAH4 [[email protected]] has quit [Ping timeout: 600 seconds]
10:25 -!- uCj5PhnxQtuXvRE [[email protected]] has quit [Ping timeout: 600 seconds]
10:25 -!- u5vMMajjqPPNxqT [[email protected]] has joined #bitcoin
10:25 -!- uDEdr5uhnbT2e4f [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- uAiz7fBo8XnZZ1i [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- u5jSfdNqpwjJ9eV [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- u7LamexRgFDoHdu [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- u69NdViycJWVKYm [[email protected]] has joined #bitcoin
10:26 -!- u4W2ih7yRg7TH72 [[email protected]] has joined #bitcoin
10:26 -!- uB2dfUQ2HC94KkT [[email protected]] has joined #bitcoin
10:26 -!- u6NXdjDMZoatVNi [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- uBrRc777VmroaKp [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- u7yETCjt7iCtDL1 [[email protected]] has joined #bitcoin
10:26 -!- u6M6WhB6r7ucQTM [[email protected]] has quit [Ping timeout: 600 seconds]
10:26 -!- u6DPECS8Ti8uSkD [[email protected]] has joined #bitcoin
10:26 -!- u5Dp18HMdzYBwjs [[email protected]] has quit [Ping timeout: 600 seconds]

I used the following procedure to extract the lines containing the joins and perform the geoip lookups and counts. I only used unique addresses. The GeoIP database was from MaxMind and the database was updated on the 9th of September.

grep join irc.log > bitcoin.joins
... I then lazily replaced all the ]s with @s in the file bitcoin.joins
awk 'BEGIN{FS="@";}{print $2}' bitcoin.join > bitcoin.addrs
awk '{print "geoiplookup " $0}' bitcoin.addrs | sort | uniq | sh > bitcoin.countries.1
cat bitcoin.countries.1 | awk 'BEGIN{FS=":"}{print $2}' | sort | uniq -c | sort -k 1 -n -r > bitcoin.cntcount

The full breakdown of countries is as follows:

   2769  US, United States
    868  DE, Germany
    518  RU, Russian Federation
    478  GB, United Kingdom
    368  CA, Canada
    332  PL, Poland
    227  CN, China
    227  AU, Australia
    179  SE, Sweden
    171  UA, Ukraine
    160  NL, Netherlands
    143  FR, France
    109  IT, Italy
     95  DK, Denmark
     95  AR, Argentina
     90  FI, Finland
     85  BR, Brazil
     82  RO, Romania
     72  ES, Spain
     72  AT, Austria
     71  CH, Switzerland
     64  ZA, South Africa
     59  MX, Mexico
     56  --, N/A
     48  IE, Ireland
     48  CZ, Czech Republic
     45  IL, Israel
     44  BE, Belgium
     43  NZ, New Zealand
     42  CO, Colombia
     41  NO, Norway
     35  IN, India
     27  SG, Singapore
     27  RS, Serbia
     27  BG, Bulgaria
     26  BY, Belarus
     24  TW, Taiwan
     20  TH, Thailand
     20  CL, Chile
     18  SI, Slovenia
     17  KZ, Kazakhstan
     17  JP, Japan
     17  HU, Hungary
     16  PT, Portugal
     16  GR, Greece
     15  PH, Philippines
     14  SK, Slovakia
     14  LT, Lithuania
     13  LV, Latvia
     12  MD, Moldova, Republic of
     12  HK, Hong Kong
     11  SA, Saudi Arabia
     11  MY, Malaysia
     10  MA, Morocco
     10  BA, Bosnia and Herzegovina
      9  HR, Croatia
      8  VN, Vietnam
      8  DO, Dominican Republic
      7  PE, Peru
      7  KR, Korea, Republic of
      7  A1, Anonymous Proxy
      6  VE, Venezuela
      6  IS, Iceland
      6  ID, Indonesia
      6  EC, Ecuador
      6  AE, United Arab Emirates
      5  PG, Papua New Guinea
      5  IR, Iran, Islamic Republic of
      4  TT, Trinidad and Tobago
      4  LK, Sri Lanka
      4  HN, Honduras
      4  EG, Egypt
      4  EE, Estonia
      4  BS, Bahamas
      3  UY, Uruguay
      3  TR, Turkey
      3  PA, Panama
      3  MK, Macedonia
      3  LU, Luxembourg
      3  JM, Jamaica
      3  JE, Jersey
      3  CR, Costa Rica
      3  BO, Bolivia
      2  ZM, Zambia
      2  TN, Tunisia
      2  MT, Malta
      2  LB, Lebanon
      2  ET, Ethiopia
      2  DZ, Algeria
      1  TZ, Tanzania, United Republic of
      1  SY, Syrian Arab Republic
      1  QA, Qatar
      1  PY, Paraguay
      1  PR, Puerto Rico
      1  PK, Pakistan
      1  OM, Oman
      1  MN, Mongolia
      1  KE, Kenya
      1  JO, Jordan
      1  GY, Guyana
      1  GU, Guam
      1  GT, Guatemala
      1  GI, Gibraltar
      1  CI, Cote D'Ivoire
      1  BN, Brunei Darussalam
      1  BB, Barbados
      1  AZ, Azerbaijan
      1  AL, Albania
      1  AG, Antigua and Barbuda

Split fasta file into files with one contig per file

csplit does this quite neatly:

csplit -z myfile.fas '/>/' '{*}'

Default output filename is xxNN (where NN is a integer). you can use something other than xx by specifying a prefix with –prefix=PREFIX.

Note, this command assumes that the contig title don’t contain a > except for at the start of the line. You can probably do something like ‘\n>’ or ‘^>’ to insure it must occur at the start of the line.

ö (O with umlaut) on Mac OS X

Amuse and amaze your friends with the ability to type accented characters on a standard UK mac keyboard!

Simply press alt+U followed by the letter of your choice, for example O ööööööööööö see how much that rocks? Of course you do.