Start
   Blogaria
   Bored
   bsgen
   c-conf
   Cookies
   cycliclog
   Dialwhatever
   dnspb
   fch
   fe
   fswatch
   HammerServer
   jpeginfo
   kalk
   Lectures
   Microproxy
   msc
   Nasapics
   Off The Grid
   PGPkey
   Posters
   SafeEdit
   Simple listserv
   syscheck
   tcp-fwd
   Wallpapers
   xml tools
Karel as an adult



Blogaria

Just a collection of random rants that I can't really place anywhere else.

2016-07-20 Fswatch 1.09
2016-05-04 Another fswatch update
2016-03-24 fswatch updated
2016-02-22 OTG Price Claimed
2016-02-01 File System Watcher fswatch
2016-01-05 Commandline flag parsing in Go
2015-11-19 Phoning the Dutch Vehicle Registration
2015-11-09 FE 1.05 released
2015-09-28 Bad Horse
2015-09-24 A generic attribute holder class in Python
2015-08-05 Autorotating jpegs according to EXIF tags
2015-04-15 0MQ in Python
2015-04-13 FE update
2015-02-23 Perl Course notes moved
2015-01-13 For my dad
2014-12-11 Peugeot 307 te koop
2014-11-20 Combining tornado.web StaticFileHandler with dynamic handlers
2014-11-05 Pushing scripts to servers using ssh
2014-11-03 Python3 argparse Mini HOWTO
2014-10-30 Handling secure httponly cookies with Python3 and tornado.web
2014-10-29 Overloading libc Calls
2014-10-27 Python Bootcamp Notes
2014-10-06 Custom Squid Proxy Authentication
2014-08-30 CyclicLog
2014-05-02 Playing with Python
2014-04-08 Kalk 1.38
2014-03-18 Closing C++ lecture
2014-02-26 Spring Cleanup
2014-02-26 Gravity error
2014-02-03 More on the knight tour
2014-01-28 The circular knight tour
2014-01-24 A Perl IBAN Checker
2013-10-16 Go2SEPA is live
2013-07-24 AJAXy Fileuploads with JQuery
2013-05-23 The Ticket
2013-04-24 Who is leeching my Facebook
2013-04-15 Time for a compact Coolpix
2013-04-15 Selling my Peavey amp
2013-03-28 encfs Helper Revisited
2013-03-15 c conf 1.17
2013-02-25 Flitsers op de Nederlandse wegen
2013-01-14 OTG Revisited
2013-01-11 Kalk revisited
2012-12-12 God is coming
2012-11-29 Strangely disturbing
2012-11-27 How to sneeze on a motorbike
2012-11-23 Een aanslag uit de toekomst
2012-11-22 More voluntary layoffs
2012-10-17 Browser fingerprint
2012-10-15 Site layout revamped
2012-10-14 Crossroads performing well
2012-10-08 The saddle seat
2012-09-30 Sudo Exploit
2012-09-26 Technomona is live


2012-09-19 A Perl to HTML Prettyprinter

I recently needed a little tool to convert a Perl source to pretty-printed HTML; meaning colorized and entity-escaped. There are some tools out there, but *almost* what I need.. so, here's what I cooked up.

It's called src2html. It can provide line numbering on the output, surround the generated listing with <pre> and </pre>, or surround the generated listing with a full HTML scaffold (for easy viewing). It expands tabs so that the visual layout of e.g. indented comments is preserved. It will quite nicely recognize Perl syntax and follow it, though I didn't implement "here-documents" and POD-surrounded blocks.

Here's the script src2html, for download. Instructions:

  • Click here to download;
  • Save the file somewhere on your system, e.g. in /usr/local/bin;
  • Make the file executable using chmod +x /usr/local/bin/src2html;
  • Use it as e.g.: src2html myfile.pl > output.html;
  • If you want to see "usage" information, just enter src2html for an overview of options;
  • If you want to customize the layout of Perl parts - e.g., if you want to make strings stand out by typesetting them as boldface - then edit the script and change the pre- and post instructions in %tokens at the top of the file.

Here's the listing, of course formatted by itself.

    1  #!/usr/bin/env perl
    2  use strict;
    3  use warnings;
    4  use Getopt::Std;
    5  
    6  # Lexical analyzer returns and their colorings.
    7  # IDENTs are identifiers, such as a12_xyzzy;
    8  # KEYWORDs are Perl keywords such as sub and return,
    9  # OTHERs is a catch-all for operators etc,
   10  # LINENO is a pseudo-token for coloring line numbers (flag -l)
   11  # The pre and post values will surround the tokens.
   12  my %tokens = ( 'NEWLINE' => undef,
   13                 'STRING'  => { pre  =>   '<font color="#ff1010"><i>',
   14                                post => '</i></font>' }, 
   15                 'COMMENT' => { pre  => '<font color="#707070">',
   16                                post => '</font>' },
   17                 'SPACE'   => undef,
   18                 'IDENT'   => { pre  => '<font color="#0000fa">',
   19                                post => '</font>' },
   20                 'KEYWORD' => { pre  => '<font color="#0000aa">',
   21                                post => '</font>' },
   22                 'OTHER'   => undef,
   23                 'LINENO'  => { pre  => '<font color="#909090"><i>',
   24                                post => '</i></font>' }
   25               );
   26  
   27  # Parse cmd line flags and provide info.
   28  my %opts;
   29  (getopts('phvl', \%opts) and $#ARGV >= 0)
   30    or die <<"ENDUSAGE";
   31  
   32  Usage: src2html [-phvl] file(s)
   33  Flags:
   34    -p    surrounds output with <pre> and </pre>
   35    -h    writes HTML scaffolding too (implies -p)
   36    -v    verbose mode, shows lexical keywords on stderr (for debugging)
   37    -l    prefixes output with line numbers
   38  File(s):
   39    Files to process, use - to read from stdin
   40  
   41  The input in file(s) is taken as source and colorprinted to stdout in HTML
   42  syntax.
   43  
   44  ENDUSAGE
   45  
   46  # Perl keywords, taken from http://learn.perl.org/docs/keywords.html
   47  use constant KEYWORDS =>
   48    qw(-A END length setpgrp 
   49       -B endgrent link setpriority 
   50       -b endhostent listen setprotoent 
   51       -C endnetent local setpwent 
   52       -c endprotoent localtime setservent 
   53       -d endpwent log setsockopt 
   54       -e endservent lstat shift 
   55       -f eof map shmctl 
   56       -g eval mkdir shmget 
   57       -k exec msgctl shmread 
   58       -l exists msgget shmwrite 
   59       -M exit msgrcv shutdown 
   60       -O fcntl msgsnd sin 
   61       -o fileno my sleep 
   62       -p flock next socket 
   63       -r fork not socketpair 
   64       -R format oct sort 
   65       -S formline open splice 
   66       -s getc opendir split 
   67       -T getgrent ord sprintf 
   68       -t getgrgid our sqrt 
   69       -u getgrnam pack srand 
   70       -w gethostbyaddr pipe stat 
   71       -W gethostbyname pop state 
   72       -X gethostent pos study 
   73       -x getlogin print substr 
   74       -z getnetbyaddr printf symlink 
   75       abs getnetbyname prototype syscall 
   76       accept getnetent push sysopen 
   77       alarm getpeername quotemeta sysread 
   78       atan2 getpgrp rand sysseek 
   79       AUTOLOAD getppid read system 
   80       BEGIN getpriority readdir syswrite 
   81       bind getprotobyname readline tell 
   82       binmode getprotobynumber readlink telldir 
   83       bless getprotoent readpipe tie 
   84       break getpwent recv tied 
   85       caller getpwnam redo time 
   86       chdir getpwuid ref times 
   87       CHECK getservbyname rename truncate 
   88       chmod getservbyport require uc 
   89       chomp getservent reset ucfirst 
   90       chop getsockname return umask 
   91       chown getsockopt reverse undef 
   92       chr glob rewinddir UNITCHECK 
   93       chroot gmtime rindex unlink 
   94       close goto rmdir unpack 
   95       closedir grep say unshift 
   96       connect hex scalar untie 
   97       cos index seek use 
   98       crypt INIT seekdir utime 
   99       dbmclose int select values 
  100       dbmopen ioctl semctl vec 
  101       defined join semget wait 
  102       delete keys semop waitpid 
  103       DESTROY kill send wantarray 
  104       die last setgrent warn 
  105       dump lc sethostent write 
  106       each lcfirst setnetent  
  107  
  108       __DATA__ else lock qw 
  109       __END__ elsif lt qx 
  110       __FILE__ eq m s 
  111       __LINE__ exp ne sub 
  112       __PACKAGE__ for no tr 
  113       and foreach or unless 
  114       cmp ge package until 
  115       continue gt q while 
  116       CORE if qq xor 
  117       do le qr y
  118       
  119       ARGV STDERR STDOUT 
  120       ARGVOUT STDIN  
  121     );
  122  
  123  # Reverse map of the keywords
  124  my %keywordmap;
  125  for my $key (KEYWORDS) {
  126      $keywordmap{$key} = 1;
  127  }
  128  
  129  # Parse all files and send to stdout.
  130  $opts{p}++ if ($opts{h});
  131  print("<html><body>\n") if ($opts{h});
  132  print("<pre>") if ($opts{p});
  133  for my $f (@ARGV) {
  134      open(my $if, $f) or die("Cannot read $f: $!\n");
  135      process($if);                      
  136  }
  137  print("</pre>") if ($opts{p});
  138  print("</body></html>") if ($opts{h});
  139  
  140  # Process a file
  141  sub process {
  142      my $if = shift;
  143      my $at_linestart = 1;
  144      my $lineno = 1;
  145  
  146      while (1) {
  147          my ($token, $semantic) = lex($if);
  148          last unless (defined $token and defined $semantic);
  149          my $pre = '';
  150          my $post = '';
  151          if (defined ($tokens{$token})) {
  152              $pre  = $tokens{$token}->{pre};
  153              $post = $tokens{$token}->{post};
  154          }
  155  
  156          if ($opts{v}) {
  157              print STDERR ("Token: $token");
  158              print STDERR (", semantic: $semantic") if ($token ne 'NEWLINE');
  159              print STDERR (", layout: $pre TEXT $post")
  160                if ($pre ne '' or $post ne '');
  161              print STDERR ("\n");
  162          }
  163  
  164          if ($opts{l} and $at_linestart) {
  165              my $lpre  = '';
  166              my $lpost = '';
  167              if (defined($tokens{LINENO})) {
  168                  $lpre  = $tokens{LINENO}->{pre};
  169                  $lpost = $tokens{LINENO}->{post};
  170              }
  171              printf('%s%5d%s  ', $lpre, $lineno++, $lpost);
  172              $at_linestart = undef;
  173          }
  174  
  175          print($pre);
  176          for my $ch (split('', $semantic)) {
  177              if ($ch eq '<') {
  178                  print("&lt;");
  179              } elsif ($ch eq '>') {
  180                  print("&gt;");
  181              } elsif ($ch eq '&') {
  182                  print("&amp;");
  183              } else {
  184                  print($ch);
  185              }
  186          }
  187          print($post);
  188          
  189          $at_linestart = 1 if ($token eq 'NEWLINE');
  190      }
  191  }
  192  
  193  my $col = 0;            # Column in input, updated by getchar() below
  194  
  195  # Lexical analyzer
  196  sub lex {
  197      my $if  = shift;
  198      my $sem = undef;
  199      my $ch;
  200  
  201      while (1) {
  202          $ch = getchar($if);
  203  
  204          # EOF
  205          return (undef, undef) unless (defined($ch));
  206          
  207          # NEWLINE return
  208          return ('NEWLINE', "\n") if ($ch eq "\n");
  209  
  210          # Start the semantic buffer.
  211          $sem .= $ch;    
  212  
  213          # STRING return
  214          if ($ch eq '"' or $ch eq "\'") {
  215              my $startchar = $ch;
  216              do {
  217                  $ch = getchar($if);
  218                  $sem .= $ch;
  219                  if ($ch eq "\\") {
  220                      $ch = getchar($if);
  221                      $sem .= $ch;
  222                  }
  223              } while ($ch ne $startchar);
  224              return ('STRING', $sem);
  225          }
  226  
  227          # COMMENT return
  228          if ($ch eq '#') {
  229              while (1) {
  230                  my $peek = peekchar($if);
  231                  if ($peek ne "\n") {
  232                      $sem .= getchar($if);
  233                  } else {
  234                      last;
  235                  }
  236              }
  237              return ('COMMENT', $sem);
  238          }
  239  
  240          # SPACE return - plain whitespace
  241          if ($ch eq ' ') {
  242              while (1) {
  243                  my $peek = peekchar($if);
  244                  if ($peek eq ' ') {
  245                      $sem .= getchar($if);
  246                  } else {
  247                      last;
  248                  }
  249              }
  250              return ('SPACE', $sem);
  251          }
  252  
  253          # SPACE return - detabbed \t
  254          if ($ch eq "\t") {
  255              $sem = '';
  256              # ++$col unless ($col % 8);
  257              while ($col % 8) {
  258                  $sem .= ' ';
  259                  ++$col;
  260              }
  261              $sem .= ' ';
  262              return ('SPACE', $sem);
  263          }
  264  
  265          # IDENT return
  266          if ($ch =~ /[_a-z\%\$\&\@]/i) {
  267              while (1) {
  268                  my $peek = peekchar($if);
  269                  if ($peek =~ /[_a-z0-9\%\$\&\@]/i) {
  270                      $sem .= getchar($if);
  271                  } else {
  272                      last;
  273                  }
  274              }
  275              # Identifiers that are keywords become a.. umm keyword
  276              return ('KEYWORD', $sem) if ($keywordmap{$sem});
  277              return ('IDENT', $sem)   if ($sem =~ /^[a-z0-9_]+$/i);
  278              return ('OTHER', $sem);
  279          }
  280  
  281          # OTHER return catch-all
  282          return ('OTHER', $sem);
  283      }
  284  }
  285  
  286  # Get a character from the input stream, with capability of 1 peek-ahead
  287  my $peekchar = undef;
  288  sub peekchar {
  289      my $if = shift;
  290      
  291      $peekchar = undef if (read($if, $peekchar, 1) < 1);
  292      return $peekchar;
  293  }
  294  sub getchar {
  295      my $if = shift;
  296      my $ret;
  297      
  298      if (defined($peekchar)) {
  299          $ret = $peekchar;
  300          $peekchar = undef;
  301      } else {
  302          $ret = undef if (read($if, $ret, 1) < 1);       
  303      }
  304      if (defined($ret) and $ret eq "\n") {
  305          $col = 0;
  306      } else {
  307          ++$col;
  308      }
  309      return $ret;
  310  }

2012-09-17 Playing with Moose
2012-08-22 How do you export photos from Adobe Photoshop Elements
2012-08-21 Security hole at the Empire State Building
2012-07-15 Matrix Sunglasses
2012-07-12 Two Morgans
2012-07-12 Review of the BMW R1200RT Motorbike
2012-06-13 Passwords: maak het hackers moeilijk
2012-06-13 Mijndomein foutje
2012-06-07 YOLNT
2012-06-06 Human Origins
2012-05-23 Me on Facebook
2012-05-16 Voluntary Layoffs
2012-05-07 RBS Bike Tour
2012-04-27 Room with a view
2012-04-23 Browser cookies and Javascript revisited
2012-02-17 Schrodingers Cat
2012-02-14 KPN heeft problemen
2012-01-12 Memebase forever
2012-01-11 Strange squares
2011-12-22 TVV Ondernemingsportaalnl.com zuigt ezel
2011-12-08 Dilbert vs Skype
2011-11-29 The uncanny resilience of bulshytt
2011-11-23 Another silly Trojan attempt
2011-10-29 ACTA is coming our way
2011-10-28 Burgernet in the Netherlands
2011-10-27 Facepalm art
2011-10-26 Do not drag this image
2011-10-22 Off The Grid Challenge
2011-10-12 PI like a boss
2011-10-07 Once upon a time
2011-07-13 Dutch eticket system for trains
2011-07-12 Is Hell exothermic or endothermic
2011-04-27 Optical Illusions
2011-04-19 Odd lyrics
2011-04-16 Band Revival at MON
2011-03-13 Protests in the Middle East and you
2011-03-10 Mac OSX Hotkey for locking your system
2011-02-12 dnspb 0.06 is out
2011-02-08 Would I buy this fridge
2011-02-06 InstaYouth
2011-02-05 The Thinker is back
2011-01-17 Math challenge
2011-01-11 Zero tolerance and zero intelligence
2011-01-05 My interest income in 1991
2011-01-01 Your horoscope by Eddie
2010-12-22 New York City Tours might be half price for you
2010-12-20 Weather Forecast
2010-12-14 World Economy Collapse explained in 3 minutes
2010-12-13 The Salvation Army and its choice of toys
2010-12-08 Elizabeth thinks highly of me
2010-12-06 Should I trust my government with my data
2010-12-05 Announcing dnspb
2010-12-03 Realistic piechart
2010-11-26 Crossroads 2.71 is out
2010-11-24 8 bit Starwars
2010-11-17 Six to eight black men
2010-11-16 Canada wants backdoors and data and everything
2010-11-11 Autumn storm over the Netherlands
2010-10-08 USA wants backdoors to everything
2010-10-05 Sudoku solver in Perl
2010-10-02 Finally wrote up a Syscheck page
2010-09-28 Neon sign fail
2010-09-27 The Renault Eco Team
2010-09-23 Crossroads 2.68 is out
2010-09-20 How to suppress Flash cookies
2010-09-15 Meanwhile on Facebook
2010-09-09 The Yes Men Fix The World
2010-09-07 ed is not dead
2010-08-26 Installing Perl modules in a non root environment
2010-08-22 Magic self leviation
2010-08-20 Google Chrome does not support offline Gmail
2010-08-19 The number 48
2010-08-12 Welsh trout mini HOWTO
2010-08-04 Fooling a NetCache proxy into fetching forbidden files
2010-07-30 The world will end on May 21, 2011
2010-07-28 Hiding or showing a textbox with image animation using JQuery
2010-07-27 Manipulating browser cookies using Javascript
2010-07-25 Survival of the fittest book
2010-07-23 Pastafarians in Spain
2010-07-22 You have two sheep
2010-07-09 Highway bank fire
2010-07-08 Setting up a remote git repository
2010-07-06 Bye bye trusted old Macbook
2010-06-28 John Cleese on Football
2010-06-23 ABN Amro and the Pathetic Customer Service Dept.
2010-06-22 Wally does not like criticism
2010-06-14 Soccermatch Netherlands vs Denmark
2010-06-13 Lazy Cat
2010-06-08 Reading public Buzz using the Google API
2010-06-07 A Personal Letter from Steve Martin
2010-06-05 Sushi Saturday
2010-06-04 Suppressing the Enter key with Javascript
2010-05-31 Temporal spacial anomaly on the Dutch highway
2010-05-23 Greenhost will not log your traffic
2010-05-10 Jarlsberg Webapp Exploits
2010-05-04 A Thought Experiment
2010-05-03 SafeEdit information updated
2010-05-01 Microproxy now supports ftp
2010-04-30 What could get Data angry
2010-04-29 Lego Mindstorm solving the Rubik Cube
2010-04-28 Crossroads 2.65 is out
2010-04-17 Goggomobil in its natural habitat
2010-04-14 Bacon Time
2010-04-11 104 More friends to connect with
2010-04-10 Bacteria infested radio reporter
2010-04-07 The Kubat STAR
2010-03-30 Homework Essay
2010-03-29 C++ mutexes again
2010-03-20 Weird Eyechart
2010-03-15 Microproxy 1.01
2010-03-05 Microproxy
2010-03-03 Sven Kramer and the wrong lane
2010-02-26 Endearing Babe Magnet
2010-02-17 Speed of light measured using chocolate and a microwave
2010-02-17 Never again expires after 65 years
2010-02-16 encfs on the Mac
2010-02-15 Hyves.nl and sexual predators
2010-02-10 Funny textbook
2010-02-09 DNS failing after sleep wake cycle
2010-02-06 Blast from the past
2010-01-28 Simple and straight Perl HTTP::Proxy
2010-01-15 Avatar the Movie
2010-01-08 Slightly NSFW Linux Ad
2010-01-07 WTF
2010-01-05 Stop Software Patents in the EU
2009-12-05 HammerServer 1.02
2009-11-28 Perls Automagical Autoloading
2009-10-07 Office Poster
2009-10-06 The nr 1 Nerdjoke
2009-10-04 WoW Startscript for my Mac
2009-09-27 HammerServer section is online
2009-09-26 The BING HQ
2009-09-26 Digging a WOW Tunnel
2009-06-29 Wee Todd
2009-06-23 The On Off Switch Revisited
2009-06-22 Meatspace
2009-05-30 My old houses
2009-05-11 LOLcats are funny
2009-05-11 Civic Duty WIN
2009-05-10 Vote for the baby, Sky Radio promo FAIL
2009-05-05 My secure data center
2009-02-15 My Valentine is sending me a dot exe
2009-02-05 MacPorts trash: .mp_123456 savefiles cleaning
2009-02-01 Truecrypt 6 on Linux and the ext3 filesystem
2009-01-28 www versus nl.youtube.com
2009-01-27 Songsmith and The Police
2009-01-25 My own Ministery of Silly Walks
2009-01-09 CoolIris Mini HOWTO
2008-11-04 UDP and DNS balancing
2008-11-02 Life in graphs
2008-11-01 Skeined yet?
2008-10-30 New Crossroads on the horizon
2008-10-28 Thread safe or not
2008-10-15 WOW patch 3 on a case sensitive MacOSX filesystem
2008-10-15 Surprising C++ optimizations
2008-10-14 Weird system message
2008-10-08 Data mining against terrorism does not work
2008-09-16 Crossroads at the top of Freshmeat.net
2008-09-09 Stupid spammers at Computable
2008-09-06 Spam prevention with Postfix and Postgrey
2008-09-03 The Gnomish Flying Machine
2008-08-27 Bank customer data on eBay
2008-08-26 Mutexes in C++ Threads
2008-08-22 4M dataloss in the UK last year
2008-08-21 Dropping spam with Postfix and Spamassassin
2008-08-18 Bayes and the War on Photography
2008-08-13 Good marital advice
2008-08-12 Squid proxy for personal usage
2008-08-11 Posix threads in C++
2008-08-09 Crossroads mailing list
2008-08-08 Crossroads 2.00 is out
2008-08-01 Fail Pics
2008-07-14 The Fish Dance
2008-07-01 Big Bother and Massive Data Storage
2008-06-30 MMV One of omitted Unix tools
2008-06-08 Even anonymous breadcrumbs can give you away
2008-05-29 Crossroads in Argentina
2008-05-20 The Party at the Company Outing
2008-05-19 Crossroads 1.80 is out
2008-05-18 Where does technical innovation really come from
2008-05-16 Corporate bs generator
2008-05-15 Even the Vatican has to adapt
2008-05-12 Big Brother is watching your dog
2008-05-09 666 all over the place
2008-04-17 Security and privacy are incompatible
2008-04-16 The Hallmark E Card
2008-04-15 Crosroads Solaris port is out
2008-04-04 Identity theft can cost you dearly
2008-04-03 Crossroads can already do that
2008-03-31 A dagerous safari
2008-03-28 Why some Java J2EE projects are inefficient
2008-03-26 The Hummingbird
2008-03-25 The Easter delusion
2008-03-18 McAfee detects mass hack of 200.000 webpages
2008-03-17 More predictive statistics
2008-03-10 Backwards conclusions even on Slashdot
2008-02-18 A fractal photograph
2008-02-15 Kaprekar revisited
2008-02-14 Kaprekar numbers
2008-02-12 A tale of the criminal ineptitude
2008-02-10 Irritating Selfregistered users in PHPBB
2008-02-08 B2B Spam in the Netherlands
2008-02-06 Surprising iSight Capture
2008-02-05 Breadcrumbs at WickedLasers.com
2008-01-29 iSight Capture Utility
2008-01-28 The Male Brain
2008-01-26 Searching for the next Uri Geller
2008-01-24 Opt in for b2b spam
2008-01-14 Bokito Revisited
2008-01-13 Top Crossroads User
2008-01-12 World of Warcraft Dancing
2008-01-12 Justice dispensed better late than never
2008-01-11 Jeremy Clarkson and Identity Theft
2008-01-10 Terrorism in the Netherlands
2007-12-07 The mind and bodysnatchers are among us
2007-12-05 Bruce Schneier and Hildo
2007-12-04 Bye bye, good Christian soul
2007-12-03 Confusing mail message
2007-11-30 Medion MD 85276 reviewed
2007-11-29 Recent cases of data exposure
2007-11-20 Bayes bites
2007-11-19 Japan starts fingerprinting foreigners
2007-11-14 Privacy, Yahoo and the Strange World
2007-11-14 Privacy, Fall through algorithms, and Securing data
2007-11-07 European airlines to retain data
2007-11-03 BloggEd
2007-10-30 Wilders and Marktplaats.nl
2007-10-28 The goldplated Mac
2007-10-26 More morons
2007-10-26 Dilbert nails it again
2007-10-23 Rough yet funny
2007-10-05 Another silly Trojan mail
2007-10-01 So ugly it is beautiful
2007-09-28 Here is a nickel kid
2007-09-23 Spy Shredder
2007-08-29 Web svn view 1.08
2007-08-24 Caught in THE Process
2007-08-21 Stupid Trojan attack
2007-08-21 Back in 1994
2007-08-20 A girly iPod
2007-08-17 Crossroads for RDP connections
2007-08-15 Firewall art
2007-08-14 jpeginfo
2007-08-13 Good People
2007-08-07 The Real Crossroads
2007-07-30 BBC Documentaries in the Netherlands
2007-07-12 No problems with Crossroads so far
2007-07-11 Politically correct ad nauseam
2007-07-02 Waka Waka Poem
2007-07-02 Voyage of the rubber ducks
2007-06-28 The On Off Switch
2007-06-27 No free lunch
2007-06-25 Crossroads web interface
2007-06-25 Blinkenlights
2007-06-21 There is no silver bullet
2007-06-18 Motto of the week
2007-06-18 Do not feed the troll
2007-06-17 Which programming language are you
2007-06-13 Crossroads support request
2007-06-12 Bokito glasses
2007-06-07 Apache mod_proxy balancer description
2007-06-05 A ticketnumber is not support
2007-06-05 403 Hammertime
2007-06-04 Playground Fun
2007-05-24 Ascii man
2007-05-07 Cannot find the damn server
2007-05-02 The BFG200
2007-04-27 Crossroads Top User
2007-03-30 Crossroads Usage
2007-03-25 The guy with the dark motorhelmet
2007-03-22 The Process and The Result
2007-03-21 Quotes attributed to Jos
2007-03-20 A really nice comment about Crossroads
2007-03-18 Kubat in the air