Monday, February 26, 2007

My name

It looks like Eber Irigoyen might be on to a new meme. I must propagate it by joining them in lamenting the mis-pronunciations of my names:
  • aw li vee eh
  • aw liver
  • dah gue naiz
  • dah gue nah
  • day je naiz
  • day je neh

As a result, I try to go by Oli, but this has proven to be equally as elusive as many people will write down Ali or even Holly! (WTF?)

Tuesday, February 20, 2007

Thanks for ruining it for the rest of us, guys!

Behold the power of stupidity on the internet, as I tried to e-mail a university computer science assignment to my professor:


 

https://mail.google.com

OlivierDagenais-Assignment1.zip contains an executable file. For security reasons, Gmail does not allow you to send this type of file.

I can sort of see how something like this could have come about: logs show users e-mailing executable files of various degrees of maliciousness.  Google reacts by deciding one malicious executable file is one too many and refuses to accept executable files as Gmail attachments.

Some clever user then thinks "My nefarious H@xx0Rz.EXE must be e-mailed to my clueless buddies... I know: I'll just zip it!".  Google notices again and here we are.  Encrypting my ZIP file would probably do nothing as you can list the names of the files without the key and so Google's clever little ZipSecurityPeeker.py only needs to check for the presence of files ending with .exe.

I ended up submitting the assignment using another e-mail account. I bet I could have CCed my GMail account and received the "insecure" attachment no problem.

UPDATE: Whoa! I didn't even have a .exe file in my ZIP archive! I have some .bat, some .cmd and some .pl, as well as one or two shell scripts without an extension. Most of those files, incidentally, shipped as part of Apache Ant, which I included in my assignment's ZIP archive so the professor wouldn't have to go hunt it down, install it, etc.

UPDATE 2: Nope, I can't receive it either because I apparently broke the law:


Your message cannot be delivered to the following recipients:

(...)
Reason: SMTP transmission failure has occurred
Diagnostic code: smtp;552 5.7.0 Illegal Attachment c5si5493294qbc
(...)

Saturday, February 10, 2007

Unit tests can be fun!

Here's a snippet of testing code from a university assignment I did last term where we had to create a model of an alarm clock using finite state machines and then test using the FSM testing techniques we learned in class. This is Java 5 code with some JUnit goodness.

/**
* It's 21:30 and I'm going to bed. I set the alarm time for 06:00 and then
* sleep until the damn thing wakes me up, but I don't want to get up just
* yet and I think 4 more minutes will change my mood today from
* "didn't get enough sleep" to "downright chipper" and so I slam my hand in
* the general direction of the drowse button (it has an 80%, no 70% chance
* of hitting it the first time) and then wake up a new man 4.2 minutes
* later, turning off the alarm functionality until I need it again the
* following night.
*/
@Test
public void SetTickRingDrowseTickRingStop ( ) {
// set clock time from 01:00 to 21:30
super.SwitchTimeSet();
// that is to say add 20 hours
for (int c = 0; c < 20; c++) {
super.HourButtonClick();
}
// and 30 minutes
for (int c = 0; c < 30; c++) {
super.MinuteButtonClick();
}
areEqual(21, 30, super.clockTime);

// set switch to Run
super.SwitchRun();

// set alarm time from 13:00 to 06:00
super.SwitchAlarmSet();
// which is to add 11 + 6 hours
for (int c = 0; c < 11 + 6; c++) {
super.HourButtonClick();
}
areEqual(06, 00, super.alarmTime);

// set switch to Run
super.SwitchRun();
assertTrue(super.IsAlarmOn());

// go to sleep for 8.5 hours
for (int c= 0; c < 8.5 * 60; c++) {
super.TickMinute();
}
areEqual(06, 00, super.clockTime);

// whoa, it's ringing!
assertTrue(super.IsTriggered());
assertTrue(super.IsRinging());
assertFalse(super.IsDrowsing());

// leave me alone for 240 more seconds!
super.DrowseButtonClick();
for ( int c = 0; c < 4; c++ ) {
assertTrue(super.IsTriggered());
assertFalse(super.IsRinging());
assertTrue(super.IsDrowsing());
super.TickMinute();
}
areEqual(06, 04, super.clockTime);

// whoa, it's ringing again!
assertTrue(super.IsTriggered());
assertTrue(super.IsRinging());
assertFalse(super.IsDrowsing());

// that's it, I'm getting up and turning this thing off
super.SwitchAlarmOff();
assertFalse(super.IsAlarmOn());
}

The test depends on some @Before method which resets the model (i.e. makes it just like the alarm clock just had batteries put in for the first time) and thus the the initial clock time is 01:00 and the initial alarm time is 13:00.  The model was created from observing the behaviour of an old Westclox travel alarm clock.

Wednesday, February 07, 2007

Backups of Subversion repositories

Here's the scenario: you are running a Subversion server and like all serious geeks, you want it backed up. This here post will show you how I do it for Windows and *nix _simultaneously_. I'm making the following assumptions:

Path typeWindows*nix
the subversion repositories are locatedd:\svnrepo/home/svn
the backup root folderd:\backups/home/backups
the subversion CLI(in the path)(in the path)


The first script performs not only a hotcopy backup of a repository (provided as the first parameter), but also first erases whatever backup might have been there (with a special provision for the very first time around) and creates a "dump" of the repository's contents, along with a final clean-up to save space. The reason we are keeping a dump over the contents of the db folder is that you can then "restore" your backup with a different version of Subversion. (trust me, I've lived through a catastrophic failure of a Subversion server and the dump format stays the same across versions while whatever's in the db folder doesn't necessarily)
Windows*nix
BackupAndDump.bat
@echo off
mkdir d:\backups\Subversion\%1\_backup
rmdir d:\backups\Subversion\%1 /s /q
svnadmin.exe hotcopy d:/SvnRepo/%1/ d:/backups/Subversion/%1/
svnadmin.exe dump d:/backups/Subversion/%1/ > d:/backups/Subversion/%1.svndump
rmdir d:\backups\Subversion\%1\db /s /q
backupanddump
#!/bin/sh
mkdir -p /home/backups/svn/$1/_backup
rm -rf /home/backups/svn/$1
svnadmin hotcopy /home/svn/$1/ /home/backups/svn/$1/
svnadmin dump /home/backups/svn/$1/ > /home/backups/svn/$1.svndump
rm -rf /home/backups/svn/$1/db



The second script iterates through all the repositories in a root folder and calls the first script (which, BTW, is located in the backup root folder) for each one.
Windows*nix
SubversionBackup.bat
@echo off
d:
cd \svnrepo
for /D %%d in (*) do d:\Backups\BackupAndDump %%d
svnbackup
#!/bin/sh
cd /home/svn
for d in *; do /home/backups/backupanddump $d; done


Well, that's enough for tonight. I'm sure all you Linux gurus out there are pointing and laughing at my noob-skills.

Tuesday, February 06, 2007

A new oxymoron: cybersurf reliability

Go head. Google it and, even there, you'll see enough of the following: (emphasis mine)

CIA.com : The Freedom of Choice
Cybersurf's premium Internet service utilizes the fibre backbones of Call-Net and Bell Canada for speed and stability, and the latest CISCO remote access equipment (modems) for state-of-the-art digital access and reliability.

...yet ONE link down, there's the sign-up page (emphasis mine):

Welcome to Cybersurf
Cybersurf, ITS PARTNERS, AFFILIATE PARTNERS AND CARRIERS MAKE NO REPRESENTATIONS ABOUT SUITABILITY, RELIABILITY, AVAILABILITY, TIMELINESS, AND ACCURACY OF THE SERVICES OR ANY UNDERLYING FACILITIES USED IN THE PROVISION OF THE SERVICES FOR ANY PURPOSE.

Err... aside from the "yes reliability, no reliability", they don't even acknowledge that future customers will be able to use the phone or internet to do anything? Legal and marketing need to have lunch together a little more often.


(Yes, yes, I know, standard "bait & switch"... I'm just pointing out it sucks, that's all...)