typedef struct {
char *name;/* name of girl */
size_t waist;/* diameter of waist */
size_t chest;/* diameter of chest at most interesting offset */
size_t hips;/* measure are the hips, don't get distracted, you naughty tailor */
colour_t hair;/* it's good to hold on to! */
colour_t eyes;/* if they can't see it, they can't suck it */ } girl_t;
There. Everything you need. A single return value, a dynamic sized array of structs. And girls.
Of course, I didn't test it. But if you really need girls that bad, let me know and I'll make sure it builds.
Now, this is just some text to avoid the lameness filter. Doo dah. Tobacco use during pregnancy increases the risk of preterm birth. abies born preterm are at an increased risk of infant death, illness and disability. Health Canada.
L'usage du tabac pendant la grossesse accroit le risque d'un accouchement premature. Les bebes prematures font face a des risques plus grands de mort infantile, de maladies et d'incapacites. Sante Canada.
Okay. Maybe I'll de-indent my code. Stupid piece of shit.Meta-control-Q should fix that.. Oh great! Now I need more characters per line. Comments, here I come...
It has bugs! Just like my Pontiac SunBird, it has a bug, too. It's only two wheel drive and has two doors! My neighbour's Subaru has AWD and four doors!
Caged nuts are usually sold with 10-32 screws in the 'states; UNF, I think. M6 nuts are nice for heavier equipment (A5200, E450..) and the cage holes will be the same size.
Pick up a surplus terminal server like a WTI CMS-16 or Computer PowerRack off eBay. They are almost free these days. Then configure all your equipement to use serial consoles (particularly easy if you are using Sun or DEC Alpha, equipment, not too bad for LILO-loading systems either).
Just remember to enable the alternate break sequence if you are running Sun hardware and using the Computone product (or any other concentrator which isn't "break safe"). I think it's in/etc/default/kbd.conf or somethng like that under Solaris.
...remember that all the holes aren't evenly spaced! Measure before you tap the holes (unless you're screwing into wood, in which case you're golden).
Here's a good way to build a rack cheap. Rent a van and go to the local computer surplus place, and find an old Sun Sparc Storage array (e.g. SSA-100) enclosure. These are 3/4 height cabinets with pull-out fronts.
Next, remove all the disks (1 GB SCA) and sell them on eBay for a buck a piece of whatever you can get. The SSA will probably come with about a hundred disks. Now you've recouped a good hunk of your investment.
Now, if you don't have 220 service in your building, you'll want to rip out all the power shit. No sweat. Take one of the thin covers from the back which is 19" long and vertically mounted. Mounted it horizontally at the back of the enclosure, and zip tie a power bar to it.
Next, got a 110->220 step-up transformer for cheap at the hardware store. Wire the fans up to that (the fans are great). If they are noisy, try bending them a bit.
Now, you'll all done. It'll hold any rackmount equipment you could possible want, and will look decent. As the front comes off in sections (instead of a door) you can easily pull them and paint them at your leisure.
Those relay rack are complete crap when it comes to housing anything that weighs more than a pound or two. My boss once ordered these thinking they were a great way to save money. So we have two full height relay racks housing a 2U power bar, terminal concentrator (4U), some modems (2U) and a switch (1U) while friggin' servers sit on the floor. Yeah, good move.
These things are good for telco and telco-type infrastructure. Other than that, they are garbage. Garbage!
And they use a different sized screw than everything else we have (10-32). It may be because they're Hubble, who knows.
The last time I was in a Church Choir, we used to sing "Morning has Broken" by Cat Stevens.
I'll bet you a case of beer our church never paid SOCAN a damn dime.
Oh, I so wish SOCAN or the RIAA would sue churches. Now *that* would have the people marching in the streets. I wonder if they would be allowed to sign "Onward Christian Soliders"? Perry Como recorded that once.
Say what you will, but I would rather have a blatantly biased media than one which *claims* to be "Fair and Balanced" but which is anything but.
If a story is really important, I will watch it on CBC, CNBC, FOX, CNN, CTV Newsnet and the BBC. Average all of them together, and you will arrive at something resembling the truth.
Unless, of course, an Iraqi Blogger is contradicting all of them.
At least not according to the doorknobs who decide what "Canadian Content" is, even though he was born about a mile from my office.
Apparently, "Canadian Content" has nothing to do with "Music by Canadians", it has to do with where the album was engineered. Go figure. The CC rule is *supposed* to protect our culture, but in reality, it is just protecting the pocketbooks of SCAMP.
The "no" comes when you have extra information which is required to give the printout context as a "standalone". One example might be a mail reader which has the From/Subject/Date in one frame, and the message body in another.
Of course, generating a whole separate page is generally a waste of time, IMNSHO. What I like to do is diddle the HTML of the frame during the print operation. I haven't found a great general solution for Moz yet, but trapping onbeforeprint/onafterprint in IE and relying on the window.print method (which even gets called with right-click->print) works marvy. onbeforeprint=diddle the HTML to include extra info; onafterprint=put it back the way it was. The screen won't even flicker if you have a reasonably fast box or you set that property which controls when the screen is redrawn (can't think of it at the moment).
Of course, you use CSS to make sure the layout will look right on the printer.
> I'm surprised this is the first time a reviewer noticed that, > say, the 250 cc motorcycle he was reviewing looked suspiciously like a 600.
Oh, I'm sure that would get caught... the real question is, would he notice the port'n'polish job on the head, the blueprinted motor, carb tuning or EFI mapping (throwing it out of EPA spec), degreed cams (ditto), etc, etc?
Of course, the manufacturer would have to be careful not to do anything to the motor which increased its octane requirement, or the reviewer might notice in two or three hundred miles...
Um, yes, they didn't copy disks that way by default, but it wasn't because during file transfer the machine was too busy positioning the heads, etc -- it was because the damn machine only had 64K of ram and 170K disks! Also, you're talking about a single drive configuration, in a dual disk configuration you didn't need to switch disks, unless you had a retarded copying program.
Which kind of makes my point, you needed a copying program, the machine didn't copy disks natively, it didn't know *anything* about disk drives; just serial I/O. Hmm, I think the CBM 4040/8050/8250 might've had a way to copy from disk 0 to 1, I forget now.
Again, to reiterate, the C64 did not busy itself with head positioning, disk rotation, GDR decoding, etc., that was the drive's job. The fact that to copy a disk you needed to tell it to access each sector is completely irrelevant. You could do the same thing (with a non-copy protected disk) by traversing the directory and opening each file one by one.
> on the Apple ][ and C-64 this sort work was done, but IDE has never been anything like this.
I don't know about the Apple, but the C64's floppy drive has an onboard computer for doing all of this shit. A 6502 CPU, a bunch of ROM, a bunch of RAM and a serial interface. The drives were so smart you could download software into them, plug the drives together, and turn off the computer and have them do work. One such program was Fast Hack'em, a "back up" program which turned two 1541s into a fast disk duplicating machine without the need for a computer. Eliminating the computer made things much faster, too, as the serial time was cut in half.
If you're talking harddrives -- well, Commodore never made one for the '64, and the peecee does do head positioning, blah blah in the computer for the floppy drive.
I guess maybe you're thinking of using an IEEE-488 interface card with the C64 and a CBM PET harddrive, but again, those disks had a CPU, RAM and ROM for doing the dirty work; the same protocol is used as on the C64's serial bus for communicating with the disk, only it was over a parallel connection.
> Apparently MS built in a crappy Windows emulator for Office 6
That's also exactly what they did for Internet Explorer 4 and 5 for Solaris (and, presumably, HPUX).
I used to run Office 4.3/Word 6 (that's what you meant, right?) on a Sparc 5 with WABI. Worked great, was much faster than my 600 MHz PIII is now with Office 2000. I would switch back, but most of my business contacts use Word 97 or better.
At least the number my memory pulled wasn't a total fabrication. It's funny how after not using them for 10+ years, your recall of kernel jump vectors can get a little jumpy.
Funny, though, I could've sworn that was right. Of course, I *know* it's wrong given the decimal equivalent. I can't count how many times I typed "SYS 64738"
FFD2 rings a bell, too, and it *is* CHROUT I'm thinking of.
> and even the cursor-control routines didn't work: if you moved the cursor > during an ON blink, it would leave a ghost of itself, so I had to write my > own cursor handler.
The trick is, either use the kernel for screen handling; none of this halfway-crap. To move the cursor up, something like this will work just fine:
LDA #$13 JSR $FCE2
FCE2 being the kernel vector for printing a character, and 0x13 the value for cursor up (IIRC).
> you couldn't stack one atop the other lest they both overheat and pop errors
You know, I ran a BBS for several *years* 24/7 on CBM 8-bit hardware. Upgrade the stock POS power supply, put paint can lids under the bottom drive and a muffin fan (pulled from some kind of mainframe) on the top drive, and you wer good to go.
> The video output was so cheap you were restricted to a very narrow > range of color combinations, lest the characters wash one another out.
Welcome to NTSC. And you actually think the Apple was any better? Hell, that damn thing couldn't print white characters in graphics mode, they pink and cyan due to the colour bleed.
> Editing and assembling code on the C64 was pretty much out > of the question;
That's why I kept my SuperPET 9000. 80 columns of glory and a great(ish) keyboard. The Europeans called it the MMF9000.
Hey, thanks, I appreciate that. Are you also the guy who wrote the book? Logo was my first non-BASIC programming language, I was about 12 then. Now I'm a UNIX Systems Programmer. Ack.
> We used to be carefree about taking CAR and CDR of NIL internally..
> addresses may not be exact, major geek points for correcting me
How about affirming you? 49152, or $C000 was the start of the largest block of memory available above the BASIC program space (which started at 2048) and was not shadowing ROM. 57344 is exactly 8K more, so maybe you actually meant 57343 as the top address. (57344, I think, would be the first byte of ROM).
As for your geography program, another option would've been to just copy and slightly modify the kernel's printing routine; it had to take character values from screen memory and whip 'em at the VIC-II in graphics format anyhow. The jump table address for that puppy is at $FCE2 IIRC, and the character is passed in the accumulator.
,8,1 -- only works for programs written for the C64. The,1 forces it to load at the address indicated by the first two bytes of the binary. If you were loading a BASIC program for, say, a PET or a VIC, you omit the,1 to get it to load in at address 2049.
> open #15,8,15(N0:new disk,84)
Close.. this is closer: open 15,8,15 print#15, "N0:label"
(but it's not right).,15 opens the control channel. N0:, of course, is the CBM DOS command for formatting.
> used to run a BBS on one, and had a 1.2 Meg drive,
An SFD-1001. I ran a BBS with two SFD-1001s, three CBM 4040s and an 8250. Hooked up to a Batteries Included IEEE-488 interface card, running a highly modified EBBS-64 with source code license.
Wow, that brings back memories. I even installed LEDs on my 1670 modem.
> I can't help but wonder if a well used virtual desktop system can't > rival a multimonitor setup.
Absolutely not. I have run multiple-desktops under FVWM 1.24 (that's right, 1.24) since early 1997. My desktop changes are lightning fast and I have shortcuts (ALT-F1 through F8) for switching desktops. And my desktop switching is FAST, about 1/10th of a second for a complete redraw (no KDE/GNOME/CDE bloat with FVWM 1.24!)
I have also run multiple monitors since 2000. There simply is no comparison. While the multiple desktops on the primary (center) monitor get used quite heavily, there are certain tasks which are vastly superior with a three-monitor setup. The primary example? Code in the middle, run on the left, logs on the right. I can check my program's log messages as I watch its output, and ponder the code all at the same time.
So, this is only a one-person study, but putting multiple monitors on my employees' desks has also boosted their productive.. at least in an informal evaluation. And I've certainly put my dues in with both configurations. But everybody else runs CDE, so they probably don't get as effecient multiple-desktop usage as they could.
> I think it'd be much nicer if the language could handle Perl-style returning of arrays.
/* waif, indeed! */ /* no jogging allowed */ /* guiness record */ /* doorway limitation */
/* name of girl */ /* diameter of waist */ /* diameter of chest at most interesting offset */ /* measure are the hips, don't get distracted, you naughty tailor */ /* it's good to hold on to! */ /* if they can't see it, they can't suck it */
The guy who posted above you 8 minutes earlier already understood the solution: return a damned pointer!
Why, oh why, is this so hard to understand? Here, I will provide a contrived, stupid example.
#define MIN_CHEST 25
#define MAX_CHEST 55
#define MIN_WAIST 19
#define MAX_WAIST 65
typedef enum { brown, blue, red, blonde, blue, cmax } colour_t;
typedef struct
{
char *name;
size_t waist;
size_t chest;
size_t hips;
colour_t hair;
colour_t eyes;
} girl_t;
typedef struct
{
size_t count;
girl_t *girls;
} girl_array_t;
void mempanic()
{
write(STDOUT_FILENO, "oh oh\n", 6);
_exit(1);
}
girl_t *createAllGirls()
{
girl_array_t *girlArr = calloc(sizeof(*girlArr), 1);
char name[64];
size_t waist, chest, hips;
colour_t hair, eyes;
if (!girlArr)
mempanic();
for (waist = MIN_WAIST; waist girls = realloc(girlArr->girls, sizeof(*(girlArr->girls)) * (girlArr->count + 1));
if (!girlArr->girls)
mempanic();
sprintf(name, "chick #%i", girlArr->count + 1);
girlArr->girls[girlArr->count].waist = waist;
girlArr->girls[girlArr->count].chest = chest;
girlArr->girls[girlArr->count].hips = hips;
girlArr->girls[girlArr->count].eyes = eyes;
girlArr->girls[girlArr->count].hair = hair;
girlArray->count++
}
return girlArray;
}
There. Everything you need. A single return value, a dynamic sized array of structs. And girls.
Of course, I didn't test it. But if you really need girls that bad, let me know and I'll make sure it builds.
Now, this is just some text to avoid the lameness filter. Doo dah. Tobacco use during pregnancy increases the risk of preterm birth. abies born preterm are at an increased risk of infant death, illness and disability. Health Canada.
L'usage du tabac pendant la grossesse accroit le risque d'un accouchement premature. Les bebes prematures font face a des risques plus grands de mort infantile, de maladies et d'incapacites. Sante Canada.
Okay. Maybe I'll de-indent my code. Stupid piece of shit.Meta-control-Q should fix that.. Oh great! Now I need more characters per line. Comments, here I come...
Yeah!
It has bugs! Just like my Pontiac SunBird, it has a bug, too. It's only two wheel drive and has two doors! My neighbour's Subaru has AWD and four doors!
Those Pontiac cars sure are buggy!
Caged nuts are usually sold with 10-32 screws in the 'states; UNF, I think. M6 nuts are nice for heavier equipment (A5200, E450..) and the cage holes will be the same size.
I hate those damned things, too.
/etc/default/kbd.conf or somethng like that under Solaris.
Pick up a surplus terminal server like a WTI CMS-16 or Computer PowerRack off eBay. They are almost free these days. Then configure all your equipement to use serial consoles (particularly easy if you are using Sun or DEC Alpha, equipment, not too bad for LILO-loading systems either).
Just remember to enable the alternate break sequence if you are running Sun hardware and using the Computone product (or any other concentrator which isn't "break safe"). I think it's in
...remember that all the holes aren't evenly spaced! Measure before you tap the holes (unless you're screwing into wood, in which case you're golden).
Here's a good way to build a rack cheap. Rent a van and go to the local computer surplus place, and find an old Sun Sparc Storage array (e.g. SSA-100) enclosure. These are 3/4 height cabinets with pull-out fronts.
Next, remove all the disks (1 GB SCA) and sell them on eBay for a buck a piece of whatever you can get. The SSA will probably come with about a hundred disks. Now you've recouped a good hunk of your investment.
Now, if you don't have 220 service in your building, you'll want to rip out all the power shit. No sweat. Take one of the thin covers from the back which is 19" long and vertically mounted. Mounted it horizontally at the back of the enclosure, and zip tie a power bar to it.
Next, got a 110->220 step-up transformer for cheap at the hardware store. Wire the fans up to that (the fans are great). If they are noisy, try bending them a bit.
Now, you'll all done. It'll hold any rackmount equipment you could possible want, and will look decent. As the front comes off in sections (instead of a door) you can easily pull them and paint them at your leisure.
Cheers,
Wes
Those relay rack are complete crap when it comes to housing anything that weighs more than a pound or two. My boss once ordered these thinking they were a great way to save money. So we have two full height relay racks housing a 2U power bar, terminal concentrator (4U), some modems (2U) and a switch (1U) while friggin' servers sit on the floor. Yeah, good move.
These things are good for telco and telco-type infrastructure. Other than that, they are garbage. Garbage!
And they use a different sized screw than everything else we have (10-32). It may be because they're Hubble, who knows.
The last time I was in a Church Choir, we used to sing "Morning has Broken" by Cat Stevens.
I'll bet you a case of beer our church never paid SOCAN a damn dime.
Oh, I so wish SOCAN or the RIAA would sue churches. Now *that* would have the people marching in the streets. I wonder if they would be allowed to sign "Onward Christian Soliders"? Perry Como recorded that once.
Say what you will, but I would rather have a blatantly biased media than one which *claims* to be "Fair and Balanced" but which is anything but.
If a story is really important, I will watch it on CBC, CNBC, FOX, CNN, CTV Newsnet and the BBC. Average all of them together, and you will arrive at something resembling the truth.
Unless, of course, an Iraqi Blogger is contradicting all of them.
> why are their national courts making law
> rather than deciding a case based on law?
'cause the politicians are too lazy to make 'em.
Personally, I would rather have a panel of judges making the law than politicians, anyhow. At least the laws are more likely to make sense.
Our legal system is directly derived from the British Common Law system (outside of Quebec, anyhow, which used French Codified law as its basis).
At least not according to the doorknobs who decide what "Canadian Content" is, even though he was born about a mile from my office.
Apparently, "Canadian Content" has nothing to do with "Music by Canadians", it has to do with where the album was engineered. Go figure. The CC rule is *supposed* to protect our culture, but in reality, it is just protecting the pocketbooks of SCAMP.
The "no" comes when you have extra information which is required to give the printout context as a "standalone". One example might be a mail reader which has the From/Subject/Date in one frame, and the message body in another.
Of course, generating a whole separate page is generally a waste of time, IMNSHO. What I like to do is diddle the HTML of the frame during the print operation. I haven't found a great general solution for Moz yet, but trapping onbeforeprint/onafterprint in IE and relying on the window.print method (which even gets called with right-click->print) works marvy. onbeforeprint=diddle the HTML to include extra info; onafterprint=put it back the way it was. The screen won't even flicker if you have a reasonably fast box or you set that property which controls when the screen is redrawn (can't think of it at the moment).
Of course, you use CSS to make sure the layout will look right on the printer.
Yes, of course. You can't subtract a scalar from a vector. Or vice versa.
> what's his /. username please?
pclminion?
> I'm surprised this is the first time a reviewer noticed that,
> say, the 250 cc motorcycle he was reviewing looked suspiciously like a 600.
Oh, I'm sure that would get caught... the real question is, would he notice the port'n'polish job on the head, the blueprinted motor, carb tuning or EFI mapping (throwing it out of EPA spec), degreed cams (ditto), etc, etc?
Of course, the manufacturer would have to be careful not to do anything to the motor which increased its octane requirement, or the reviewer might notice in two or three hundred miles...
-- 'cept thanks. I would've never thought to think about that.
Um, yes, they didn't copy disks that way by default, but it wasn't because during file transfer the machine was too busy positioning the heads, etc -- it was because the damn machine only had 64K of ram and 170K disks! Also, you're talking about a single drive configuration, in a dual disk configuration you didn't need to switch disks, unless you had a retarded copying program.
Which kind of makes my point, you needed a copying program, the machine didn't copy disks natively, it didn't know *anything* about disk drives; just serial I/O. Hmm, I think the CBM 4040/8050/8250 might've had a way to copy from disk 0 to 1, I forget now.
Again, to reiterate, the C64 did not busy itself with head positioning, disk rotation, GDR decoding, etc., that was the drive's job. The fact that to copy a disk you needed to tell it to access each sector is completely irrelevant. You could do the same thing (with a non-copy protected disk) by traversing the directory and opening each file one by one.
> on the Apple ][ and C-64 this sort work was done, but IDE has never been anything like this.
I don't know about the Apple, but the C64's floppy drive has an onboard computer for doing all of this shit. A 6502 CPU, a bunch of ROM, a bunch of RAM and a serial interface. The drives were so smart you could download software into them, plug the drives together, and turn off the computer and have them do work. One such program was Fast Hack'em, a "back up" program which turned two 1541s into a fast disk duplicating machine without the need for a computer. Eliminating the computer made things much faster, too, as the serial time was cut in half.
If you're talking harddrives -- well, Commodore never made one for the '64, and the peecee does do head positioning, blah blah in the computer for the floppy drive.
I guess maybe you're thinking of using an IEEE-488 interface card with the C64 and a CBM PET harddrive, but again, those disks had a CPU, RAM and ROM for doing the dirty work; the same protocol is used as on the C64's serial bus for communicating with the disk, only it was over a parallel connection.
> Apparently MS built in a crappy Windows emulator for Office 6
That's also exactly what they did for Internet Explorer 4 and 5 for Solaris (and, presumably, HPUX).
I used to run Office 4.3/Word 6 (that's what you meant, right?) on a Sparc 5 with WABI. Worked great, was much faster than my 600 MHz PIII is now with Office 2000. I would switch back, but most of my business contacts use Word 97 or better.
At least the number my memory pulled wasn't a total fabrication. It's funny how after not using them for 10+ years, your recall of kernel jump vectors can get a little jumpy.
Funny, though, I could've sworn that was right. Of course, I *know* it's wrong given the decimal equivalent. I can't count how many times I typed "SYS 64738"
FFD2 rings a bell, too, and it *is* CHROUT I'm thinking of.
> and even the cursor-control routines didn't work: if you moved the cursor
> during an ON blink, it would leave a ghost of itself, so I had to write my
> own cursor handler.
The trick is, either use the kernel for screen handling; none of this halfway-crap. To move the cursor up, something like this will work just fine:
LDA #$13
JSR $FCE2
FCE2 being the kernel vector for printing a character, and 0x13 the value for cursor up (IIRC).
> you couldn't stack one atop the other lest they both overheat and pop errors
You know, I ran a BBS for several *years* 24/7 on CBM 8-bit hardware. Upgrade the stock POS power supply, put paint can lids under the bottom drive and a muffin fan (pulled from some kind of mainframe) on the top drive, and you wer good to go.
> The video output was so cheap you were restricted to a very narrow
> range of color combinations, lest the characters wash one another out.
Welcome to NTSC. And you actually think the Apple was any better? Hell, that damn thing couldn't print white characters in graphics mode, they pink and cyan due to the colour bleed.
> Editing and assembling code on the C64 was pretty much out
> of the question;
That's why I kept my SuperPET 9000. 80 columns of glory and a great(ish) keyboard. The Europeans called it the MMF9000.
Was Pirate's Cove a Scott Adam's title?
> I wrote Logo for the Commodore-64
Hey, thanks, I appreciate that. Are you also the guy who wrote the book? Logo was my first non-BASIC programming language, I was about 12 then. Now I'm a UNIX Systems Programmer. Ack.
> We used to be carefree about taking CAR and CDR of NIL internally..
Waitaminit, Logo was written in LISP???
> For x = 49152 to 57344:poke x, peek(x):next X
> addresses may not be exact, major geek points for correcting me
How about affirming you? 49152, or $C000 was the start of the largest block of memory available above the BASIC program space (which started at 2048) and was not shadowing ROM. 57344 is exactly 8K more, so maybe you actually meant 57343 as the top address. (57344, I think, would be the first byte of ROM).
As for your geography program, another option would've been to just copy and slightly modify the kernel's printing routine; it had to take character values from screen memory and whip 'em at the VIC-II in graphics format anyhow. The jump table address for that puppy is at $FCE2 IIRC, and the character is passed in the accumulator.
C= Run-Stop was not Fast-Load specific. All Fast-Load did was switch the device number from 1 (tape) to 8 (first disk)
,8,1 -- only works for programs written for the C64. The ,1 forces it to load at the address indicated by the first two bytes of the binary. If you were loading a BASIC program for, say, a PET or a VIC, you omit the ,1 to get it to load in at address 2049.
,15 opens the control channel. N0:, of course, is the CBM DOS command for formatting.
> open #15,8,15(N0:new disk,84)
Close.. this is closer:
open 15,8,15
print#15, "N0:label"
(but it's not right).
> used to run a BBS on one, and had a 1.2 Meg drive,
An SFD-1001. I ran a BBS with two SFD-1001s, three CBM 4040s and an 8250. Hooked up to a Batteries Included IEEE-488 interface card, running a highly modified EBBS-64 with source code license.
Wow, that brings back memories. I even installed LEDs on my 1670 modem.
> I can't help but wonder if a well used virtual desktop system can't
> rival a multimonitor setup.
Absolutely not. I have run multiple-desktops under FVWM 1.24 (that's right, 1.24) since early 1997. My desktop changes are lightning fast and I have shortcuts (ALT-F1 through F8) for switching desktops. And my desktop switching is FAST, about 1/10th of a second for a complete redraw (no KDE/GNOME/CDE bloat with FVWM 1.24!)
I have also run multiple monitors since 2000. There simply is no comparison. While the multiple desktops on the primary (center) monitor get used quite heavily, there are certain tasks which are vastly superior with a three-monitor setup. The primary example? Code in the middle, run on the left, logs on the right. I can check my program's log messages as I watch its output, and ponder the code all at the same time.
So, this is only a one-person study, but putting multiple monitors on my employees' desks has also boosted their productive.. at least in an informal evaluation. And I've certainly put my dues in with both configurations. But everybody else runs CDE, so they probably don't get as effecient multiple-desktop usage as they could.