Very heavy requirements

I have been buying sound cards for a loooooong time – my first add-on card was for a 512K Amsdrad PC512 and it produced either MIDI-based sound or replicated sample audio. It was not a cheap purchase at the time – I can’t remember the price any more, but it was quite a bit of savings at the time.

It came with a literal ‘wodge’ of 5.25" driver diskettes. you could use it to steady a table there were so many of them.

Later on, the disks changed to 3.5". This meant that they were thicker than the older disks, and amounted to a pile that simply got progressively larger. By the purchase of my last soundblaster card, I was looking at IIRC 10 disks, only a few of which were usable for drivers for DOS, the remainder were ‘assistant’ programs such as Dr. Sbaitso, which were to purposes useless.

I spent a long time kind-of caring about my sound card. I bought an SB live card for my main desktop and for several years things just worked. About 2 years ago got an SoundBlaster X-Fi card for notebooks for my Dell Insipron M1710. Honestly, the internal card was better than the add-on card. I didn’t really care as I paid for it in Yen, so it didn’t count towards cost.

In the last 6 months I bought a new rig. Reasonable price, and harkening back to my memories, I got an SB X-Fi XtremeGamer card. Not a large outlay (<€80). It no longer comes with a wodge of disks – it downloads software and updates from the internet.

The smallest update for this software seems to be 50MB. The sum total of the latest software update (to fix problems and to increase compatibility on Vista) is 235MB. I am 44MB into the update and I’m being told that there’s another 2.5 hours to go. I’m not on a slow link either. It just seems to be on their side.

Just to put this into perspective – The download for my soundcard is about 1/2 the size of a reasonable Linux distro… and it’s as slow as a wet weekend in June. By the time this update has downloaded I could have watched the entirety of the latest Harry Potter movie and still had time for a pint. It’s damned slow.

This is a sound card. Not the World Management Software Suite®. The update for my graphics card was 90MB and that was Driver + Support Software + PhysX Drivers. And it downloaded in less than 10 minutes.

Now that I recall, all the problems I seemed to have on the older machine could always be traced to limitations or issues with my sound card. A driver that wasn’t playing by the rules. Maybe it thought it was being edgy? I’ve seen too many BSODs to want edgy. I just want something that works…. and doesn’t need a 250MB update (that’s twice the size of OpenOffice)…

Oh, and Windows Live Writer — please convert euro, trademark and em-dash symbols before posting… we’re not all using UCS-16 encoding here. Some of us actually try to use the web in a platform independent manner…

Consistency checking a block device

I’ve been testing the resizing of the drives located on a Dell MD3000, and i’ve seen errors when resizing after the 2TB mark. This is on the new firmware which supports > 2TB logical drives. I wrote a script to write to random locations of a block device. It can then read them back and verify that they’re still the same as what was written. Rather than writing to the entire device I use random sampling, with a few fixed points on the block device. I pretty much get consistent failures. If I put in the failed locations into the next write run they come out again in the subsequent run. Kind of makes resizing a dangerous operation, even though it is stated that resizing is non-destructive.

I realize that the array is nothing more than a rebrand of another device, but it would be great if it was tested in a lab before something this bad got out to the customers.

#! /usr/bin/perl -w

use strict;
use Getopt::Long;
use Digest::MD5 qw(md5_hex);
use File::Basename;

my $fs;
my $readfile;
my $writefile;

my $numpatterns = 2048;
my $seed = undef;
my $size;
my $real_size;
my $help;

my %vars;
my @def_offsets = (0);

sub usage($) {
        print <<EOM;
Usage: $0 –fs=<filesystem> –read=<file>|–write=<file>
        [–num=<number of blocks>] [–offset=<offset to test>]
        [–seed=<random number seed>]
EOM
        exit ($_[0]);
}

my $result = GetOptions( fs=s => \$fs,
        num=i => \$numpatterns,
        seed=i => \$seed,
        read=s => \$readfile,
        offset=i => \@def_offsets,
        write=s => \$writefile,
        h|help => \$help);

usage(0) if defined($help);
warn "Need file system to use" if (!defined($fs));
warn "Need either a read or write file" if (!(defined($readfile) || defined($writefile)));

usage (1) if (!defined($fs) || !(defined($readfile) || defined($writefile)));
my $base = basename($fs);

open (IN, "</proc/partitions") || die "Could not load partition tables";
while (<IN>) {
        chomp();
        my ($major, $minor, $blocks, $name) = m/(\w*)\s+(\w*)\s+(\w*)\s+(\w*)$/;
        next if (!defined($major));
        if ($name eq $base) {
                $real_size = $blocks;
                last;
        }
}
close(IN);

die "Could not get size" if (!defined($real_size));

# Write to the offset in blocks
sub write_to_offset($$) {
        my ($offset, $buffer) = @_;
        sysseek(INFS, $offset * 1024, 0);
        my $write = syswrite(INFS, $buffer, 1024);
        if (!defined($write) || $write != 1024) {
                warn "Failed to write: $offset $!\n";
        } else {
                $vars{$offset} = md5_hex($buffer);
        }
}

sub read_from_offset($) {
        my ($offset) = @_;
        my $buffer;
        sysseek(INFS, $offset * 1024, 0);
        my $read = sysread(INFS, $buffer, 1024);
        if (!defined($read) || $read != 1024) {
                warn "Could not read 1024 bytes at $offset $!";
                return (1);
        }
        if (md5_hex($buffer) ne $vars{$offset}) {
                warn "Data at offset $offset was not the same as expected";
                return (1);
        }
        return (0);
}

sub get_buffer {
        my $i = 0;
        my $buffer = "";
        while ($i++ < 256) {
                my $randval = int(rand(255 * 255 * 255 * 255));
                $buffer .= chr($randval >> 24) . chr(($randval >> 16) & 255) .
                        chr(($randval >> 8) & 255) . chr($randval & 255);
        }
        (length($buffer) == 1024) || die "Buffer was " . length($buffer);
        return $buffer;
}

if (defined($readfile)) {
        # reading from previous file
        open (INPUT, "<$readfile") || die "Could not open previous run log";
        while(<INPUT>) {
                chomp();
                my ($key, $value) = m/(.*)=(.*)/;
                if ($key eq "patterncount") {
                        $numpatterns = $value;
                        next;
                }
                if ($key eq "size") {
                        $size = $value;
                        next;
                }
                if ($key eq "seed") {
                        $seed = $value;
                        next;
                }
                $vars{$key} = $value;
        }
        close(INPUT);
} else {
        $seed = time ^ $$ ^ unpack "%L*", `ls -l /proc/ | gzip -f` if (!defined($seed));
        $size = $real_size if (!defined($size));
        open (OUTPUT, ">$writefile") || die "Could not open new run log";
        print OUTPUT "patterncount=$numpatterns\n" .
                "size=$size\n" .
                "seed=$seed\n";
}

print "Size: $real_size [$size] Seed: $seed\n";
srand($seed);

my $mode = "<";
$mode = "+<" if ($writefile);
open(INFS, "$mode$fs") || die "Could not open raw device";

if ($writefile) {
        map { write_to_offset($_, get_buffer()) } @def_offsets;
        write_to_offset($size – 1, get_buffer());
        while($numpatterns > 0) {
                my $offset = int(rand($size));
                print "Writing pattern: $numpatterns           \r";
                next if defined($vars{$offset});
                write_to_offset($offset, get_buffer());
                $numpatterns–;
        }
        map { print OUTPUT "$_=" . $vars{$_} . "\n" } keys(%vars);
        close(OUTPUT);
} else {
        my $failcount = 0;
        my $tocount = scalar(keys(%vars));
        map { $failcount += read_from_offset($_); printf("To Count: %0.7d\r", $tocount–); } sort(keys(%vars));
        print "Count difference: $failcount\n";
}


consistency.pl.txt

Aargh! And it’s less than a week old

I bought an internet radio for the mother for Christmas – it means that she can listen to BBC Radio 4 without it sounding like complete rubbish over long wave. It worked fine for a few hours in the morning on Christmas day then it malfunctioned – the volume started to act as though the volume up button was jammed down. I can’t reset it – the behaviour makes it completely unworkable. It seems to be some form of short circuit. After I powered it off overnight, it seemed to work again – for about 10 minutes, then I got the same behaviour. With sadness I shall be returning it to the store to get a replacement unit, which, I hope, will work much better.

The issue it that it’s frustrating, I don’t think that it’s a problem endemic with the model as there seem to be a lot of people with the same model, none of whom seem to be complaining about it.

New Memory and a new CPU ordered

The motherboard arrived yesterday and I fitted it last night. No luck; still in the same place. Mind you, with all the components I’ve bought, I should be able to make another computer from the parts I’ve bought to replace the old ones and make someone else a nice computer.
I’ve ordered a new CPU and memory. I’m winding my way around to the opinion that it’s the CPU. It must have overheated from the first 2 weeks of use. Even without a smidge of overclocking. Maybe it has something to do with the 9800GTX cpu sitting immediately below it?
The replacement CPU is a slower, quad-core processor, and if the memory isn’t shot will mean that I’m up to a chunky 8gb of RAM on 64bit vista.
C’est la guerre. It’s only money.

New motherboard ordered…

I went out and bought a half decent set of kit to make a good ‘bang for the buck’ system. It lasted 2 weeks and then came screeching to a halt one evening. Every effort made after that got me to the same hang point ‘detecting USB controllers’. So I go online and look for references to the motherboard. Several people with the same problem who have had various luck resetting the BIOS to get past the issue.
Reset the bios… now I don’t even have text – I have the pretty ‘quiet boot’ screen. Which means I can’t even see any of the failed diagnostics.
I bought a replacement GPU – small, and low powered and it’s given me no love at all. I’m still in the same place. So I’ve decided to buy a new motherboard. The old one had been flakey since the get-go.
I had an ASUS P5KC – with the most insane form of RAID I’ve ever seen in a motherboard. The replacement is an Asus P5Q. Granted the motherboard types are a bit different, but the big thing I get is RAID-1. The other minor thing is that I get a little embedded Linux.
I hope I don’t need to reinstall Vista, as it was a pain in the ass. Mind you I think I screwed up by making the disk a dynamic volume (!!!!!) twit that I am.

The great data recovery ‘challenge’

I have to laugh when I see the great data recovery ‘challenge’. Lets be honest here folks, businesses are in it to make some level of profit from their efforts. To that extent they have facilities in place to recover data from damaged drives due to a variety of problems from simple surface level damage all the way through to failed drive electronics (swapping out logic boards).
The price quoted is generally based on the amount of effort that needs to be gone thorough. Accidental erasure is probably the cheapest. Simple disk-level damage (e.g. a few dodgy sectors) can be resolved using tools like Steve Gibson’s Spinrite; which is pretty much a good example of what these companies would be doing. Drive electronics failures would cost more – for example they may need to disassemble the drive in a protected atmosphere to replace something. Large scale physical damage to the drive may entail extracting it from the original housing and essentially replicating the internals of the drive in order to read the data from it. This would be very expensive, but would succeed in the face of quite significant damage.
The intentional erasure of the data using utilities like dd are pretty much a non-starter. For the first part, you need insanely expensive specialist equipment, the rate of data recovery is slow (we’re probably talking in the order of bits per second) and the chances of actually recovering anything useful on a typical hard drive is nil.
For any typical person trying to wipe their data any of the secure erasure utilities available for purchase or for free are more than adequate to prevent the data being recovered by any agencies.

Parrotry error….

parity error
***Hardware Malfunction

Call your hardware vendor for support

NMi: Parity Check / Memory Parity Error

*** The system has halted ***

Plucking dell battery!

Aargh, I just saved my laptop from exploding/catching fire. Literally minutes/seconds away from a potential disaster (losing my hard drive – time to do a backup today).
A dell laptop, with a battery model of C5447 – one larger than the number listed in the dell battery recall program. The battery was really really hot – I mean pretty much frying-pan hot heat on the battery. I’ve contacted dell support. I wonder what’s going to happen with this