I am intolerant of some things, not of others. That does not make me any more or less tolerant than anyone else. I am very proud of the fact that I don't tolerate some things, like lying, or being blamed for someone else's inability to communicate.
But that feature is only useful in situations where it *shouldn't be useful*. A typing tutor shouldn't need anything other than generic user privileges. That it needs more is a design bug in the typing tutor, pure and simple. A unix program like that would never catch on. It would be considered broken by the general user public. Sudo isn't for running user programs. It's for running admin things, like printer admin tools, or webserver restarts, where you might want some user to have privlege to do something admin-like, but only that one thing. That sort of need is accomplished in Windows by using the different levels of privilege.
The need to run a user program, like a typing tutor, as admin, is a need that neither unix nor windows should have.
I have no tolerance for people who expect me to have ESP. Stop blaming me for assuming you meant what you wrote. YOU SAID we all agree with you. Then you backpedalled on it. That's fine, mistakes are often made in writing, and maybe you didn't mean what you wrote. But it *IS* what you wrote, so don't blame me for correctly reading what you incorrectly wrote.
Then that's the program's fault, not the OS. I could just as easily write a UNIX program that only runs if you are root because it tries to, say, open a TCP/IP port number below 1024.
Just because you find it hard to believe doesn't mean it isn't true. There are plenty of very high level languages (e.g. O'Caml) that have no more overhead in manipulating data structures than C does. O'Caml does (verifiably) have performance comparable to C.
Provide a link to this proof.
Ah, but what if there's a bug in the library? In C, you depend not only on the correctness of your own memory management code, but also on that of any library which you use.
True. But since this is also true of every other language, this isn't relevant to your point. (If you think high-level languages never end up dropping down to doing things in a low-level C way inside their libraries, you are kidding yourself. Eventually every program talks to the OS at some point, even if it's just in the libraries, and that's going to mean the libraries will have C calls in them.)
In other words "if you're a good programmer, you will never make trivial mistakes". Bullshit.
I agree that that statement is bullshit. Your claim that it is a summary of what I said, however, is also bullshit.
Of course there's such a thing as fast enough. My email client and web browser have been running fast enough for years.
If that's all you want to use your computer for, then don't waste your money on a faster computer. For those who do want more speed, stop dictating that they must waste it on needs which are already served by cheaper hardware.
And your reason for coming to that conclusion is what again? (Other than a desire to invent facts to support a point).
I liked it, and still like it after about four viewings. I am not a member of that "all" that you are referring to (which means it was a lie to say "we all".)
claiming that "safe" languages have a performance hit of more than 15% is just wrong!
I repeatedly hear claims of this, but it doesn't seem like it in practice. I find it really hard to believe. In an optimized test that doesn't excercise the problem areas much, I could see a hit of only 15%, but that would have to be a program that just prints out strings, and maybe does some math. But in practice a real program is going to contain lots of data structure manipulations, and that's where the performance hit is (and that's the main point of using a 'safer' language, too.)
and being able to make 5 or more errors through minor typos for such a trivial thing as string copying is not really acceptable (for most applications).
But I am of the opinion that a programmer that makes those errors that often should not be writing my operating system's core programs (e-mail server, web server, etc). I *want* a programmer for whom bit-twiddling and memory tricks is second nature. If you can't keep strncpy() straight, then I don't want you writing TCP/IP socket code, or writing programs that fork() and have to avoid zombies or any of that sort of thing. These programs aren't entirely OS, and aren't entirely application. They sit at the bridge between them.
Now, that being said, I *would* be in favor of writing the code in a stratified approach, where the OS interaction is in C, but the higher-level stuff is in something else. (For example, a web server should have the TCP/IP, and threading, and resource management engine stuff in C, but the HTTP syntax parser can be written in something more high-level.)
you often get char pointer from elsewhere and have no idea whether the "string" you just got is actually null-terminated or not!
Then you are using an undocumented call, just as much as if the documentation had forgotten to tell you the return type, or forgotten to tell you if a variable was pass-by-value or pass-by-reference. Not once have I encountered this problem with the stuff in stdlib. The manpage documentation for every function call that deals with strings is very explicit about null termination.
with our multi-GHz machines shouldn't we focus more on robust software that is developed more painlessly
No. Not at all. When I pay Intel a pile of cash to buy a faster chip, I want that cash to buy me faster programs. There is no such thing as "fast enough". For example, if the computer gets fast enough to render a realtime 3d animation at 30 fps, and still have plenty of cycles to space, then great - that means there's now an opportunity to use that extra clock time to add more details to the scene, or perhaps render more than one scene at a time.
There is no limit beyond which the speed no longer matters. It always matters.
I can't believe I'm defending windows here, but the need for a sudo to give partial admin-like privileges without giving ALL admin privileges is something Windows doesn't *need* because it has the concept of different levels of admin-ness. Unix tends to be all-or-nothing, root or normal user with nothing in-between. So, largely Sudo is adding functionality to Unix that was sort of already there in Windows. (This is just like, from the other side, when I first heard windows advocates claiming Windows is so much better than unix because it has PC-Anwywhere for administration, and I sat there looking at my fvwm window manager in X, running seven programs on three different hosts and just laughed at their ignorance.)
is it really good to use a low-level language that was written with operating systems in mind for highly abstract software that doesn't need the 5/10/15 percent gain of performance??
When the real world starts having examples of languages that solve these problems with only an additional overhead of 10-15% in memory and runtime versus C, your comment will start making some sense.
(However, it is true that for many user-level applications, the extra wasted resources aren't worth worrying about. But for the kinds of code being talked about here, that are part of the OS, I want all the efficiency I can have. I want as much of the resources going to the userland programs, and as little going to the OS, as is possible.)
The simple solution is to use C but then use a string library for the user-input. There's no reason you can't use a C++ basic_string from the STL for reading user input, and then drop it down to a C null-terminated string for processing.
YOU ARE SUCH A JOKER!!! how exactly are you going to find the last character if the string isn't null-terminated.
I'm not the one you replied to, but here's your answer anyway:
// assuming "str" is a string of unknown length, // and "buf2" is declared like so: buf = calloc( N, sizeof(char) );
// Then strncpy str into buf like so: strncpy( buf, str, N-1 ); buf[N-1] = '\0';
That is what the poster was talking about. If your fixed-size string holds N chars, you're not SUPPOSED to be reading N characters into it. You're supposed to read N-1 characters into it and null-terminate the last character.
(But better yet, just use strdup() which allocs and copies the string as one operation, and you don't need to bother with pre-allocating the size. Oh, that's right. You don't think easy solutions like that exist in C.)
If you're going to make a point, try doing it like an adult.
I'm not a hard drive architect either, but that is a terrible, terrible idea. For efficiency you want the surface spinning already before you start reading the next chunk of bits for the file. If you had to start and stop the disk each time you read a different file it would be horrendously slow. Therefore it makes sense for the sphere to always be spinning, and always spinning around the same axis. To turn it a new direction you have to fight against angular momentum. To keep it spinning the same direction, you just have to trickle in a teeny amount of force to counter friction.
So that's one place your idea is bad - it makes you have to fight angular momentum, and basically start and stop the sphere every time you change direction. There's more...
Think in terms of simple geometry - a tiny area of the disk holds one bit, right? Okay, but there is no point in accessing those bits in random order, since 99.99999% of the time you want to read more than just one bit off the disk. You want an entire string of bits sequentially. Even when reading a file in a "random access" kind of way, you still want to read the chunks of bits in a fixed order within each record (read this string of 2000 sequential bits, then zip over to this part of the file and read that string of 2000 sequential bits.) Because of this, you shouldn't be thinking of the storage as a bunch of random bits, but as a series of lengths of bits you don't want to break up. Okay, so now you have a bunch of areas of the surface of the sphere that are oblongs one bit "wide" and thousands of bits "long". Now, what is the most dense way to pack those oblong sections? All lined up the same direction, of course.
So there is your second reason you should spin the ball on one axis and one axis only - it packs the strings of bits efficiently. To do otherwise is really, really silly.
So, given that you should want the ball to always spin the same direction, then what do you win by making it a ball with read heads at different axes? Nothing. You might as well make it a cylnder. (in fact, in the olden days that's just what they did.)
The next time you happen to be frustrated with a terribly long piece of legal writing, as in a contract or a bill before Congress, remember to thank yourself and others like you who enjoy placing flowery writing above logic in precedence. It is because of rules like this (a double-negative sometimes does, and sometimes does NOT cancel out, depending on what was in the mind of the writer), that legal writing is so horrible to read. It isn't possible to make a statement in a natural language like English that maps to one meaning and one meaning only unless you really WORK at it. And so if lawyers don't want to deal with uncertain laws, then they have to write verbose laws.
(Just to clarify for you, "don't want to deal with uncertain laws" does NOT MEAN "wants to deal with uncertain laws". I shouldn't have to explain that, but you do show a penchant for wanting to ignore the second negative in a double-negative, so I had to be clear.)
So, "Not unpleasant" means "unpleasant", then? (Perhaps that's not a good example because the concept is trinary rather than binary (something can be both not unpleasant and not pleasant if it is in the middle.))
Note that "double negative is a positive" still is true, however, in the case of binary terms like "pregnant" (you can't be half-pregnant). "Not not pregnant" does in fact mean "pregnant".)
This concept does NOT belong in a grave, and is nothing like ending a sentence with a preposition. Ending a sentence with a prepopsition does not lead to a logical ambiguity, and is therefore not a problem. Logical ambiguities (like sometimes interpreting double-negatives as positives and other times not doing so) ARE a problem if your goal is to communicate with people. (And if that's not your goal. there's no point in using language at all.)
But since there are so many people who insist on adding unnecessary confusion just because they think it makes the language flowery and cute, I always responid in such situations with a complete sentence so that there's no question which way I interpreted the double-negative, as in:
Other person: "Aren't you going to the store?" Me: "Yes, I am not going to the store."
As Einstein said, everything should be made as simple as possible but no simpler. The problem is that the media is trying to make technical issues simpler than is possible, and that practice results in either lying or unwitting falsehoods. If you are a reporter being told you have 3 minutes of airtime to cover a complex tech topic, then no matter how hard you try, and even if you know the truth, you're going to have to end up lying to make the material fit in that short a time, if you know you are explaining it to the general public.
The FBI and CIA collectively knew there was a terrorist cell in the US planning to attack the world trade centers, but wasn't able to put the pieces together.
That's not true. They did know that much, and had put the pieces together. It's just that it's a big jump to go from "some terrorist cell is in the country and it will attack this exact building at some time, eventually, in some way" directly to "And it will happen on this exact date, and it will be done using this exact method." You can't defend a building for years against a "something-or-other" unknown threat. They *did* have a lot of heightened security in that building after the attempt at a truck-bomb in the parking garage. But the kind of attack that came was the kind where that just didn't matter.
It's not sarcasm. It's just proof that the person writing that statement leans to the right. (People tend to often falsely think of themselves as more moderate than they actually are, and as a result they notice bias against their side more than bias for their side.)
Yes, absolutely. Why don't people understand that even if an anomoly wasn't large enough to change the outcome THIS time, that this isn't a good enough reason to ignore it? When votes are counted wrongly, the system needs fixing NOW - before the next time it gets used. You think we'd have learned from last year's Florida result, that a margin of error in the system of 0.02% is STILL TOO HIGH! This constant practice of throwing up our collective hands and saying, "Oh, well, the problems didn't matter this time, let's ignore it for four more years" is precisely what led up to the 2000 fiasco. None of the problems of that election were new. None of them were unknown. It just wasn't a narrow enough margin to have mattered.
The time to fix e-voting is BEFORE it fouls an election. If you wait until afterward, you won't have the proof that it happened. The election must not be hinged upon trusting a single entity's claim that it won't cheat when counting. That's a basic obvious fact every country except the US seems to understand. Why are we being so stupid?
Is Florida a state that requires registration to vote in a party's primary, or one that automatically registers you for whichever party you vote for in the primary? If either of those is true, then one possible explanation could be that people registered Democrat so they could vote in the primary that mattered. (In an election where the incumbant has only had one term so far, and is thus eligible for a second, the party of that incumbant always has a pointless primary with a foregone conclusion - they'll run the incumbant.) Therefore voting in their primary is rather pointless. Thus I could easily imagine a lot of people on the fence choosing to claim to be Democrats because their primary is the one in which the outcome is actually in contention. A lot of them might do this even if they aren't certain yet that they will vote Democrat in the final election. A lot might be thinking, "I'm leaning toward voting for Bush, but as long as I can, I might as well have a say in who my second choice might be."
This is why I am opposed to the practice of allowing non-party members to vote in primaries. Parties are private clubs. If you want to have a say in who THEY spend THEIR money on promoting, then join the party and become a member. Otherwise you're interferring, and possibly in an advisarial manner. In the case of an election year with a president trying to renew his seat for a second term like this one, a lot of the incumbant's supporters can safely cross party lines and vote to spoil the opposition party's primary, to try to skew their results and get them to field a weaker candidate.
This is why, despite living in a state where anyone can vote in any primary (you don't even have to register), I wholeheartedly refuse to do so (I do turn in a ballot, since there are often refferenda on them as well as party primaries, but I leave the party primaries's choices blank and ONLY vote on the refferenda.)
I am intolerant of some things, not of others. That does not make me any more or less tolerant than anyone else. I am very proud of the fact that I don't tolerate some things, like lying, or being blamed for someone else's inability to communicate.
But that feature is only useful in situations where it *shouldn't be useful*. A typing tutor shouldn't need anything other than generic user privileges. That it needs more is a design bug in the typing tutor, pure and simple. A unix program like that would never catch on. It would be considered broken by the general user public. Sudo isn't for running user programs. It's for running admin things, like printer admin tools, or webserver restarts, where you might want some user to have privlege to do something admin-like, but only that one thing. That sort of need is accomplished in Windows by using the different levels of privilege.
The need to run a user program, like a typing tutor, as admin, is a need that neither unix nor windows should have.
I have no tolerance for people who expect me to have ESP. Stop blaming me for assuming you meant what you wrote. YOU SAID we all agree with you. Then you backpedalled on it. That's fine, mistakes are often made in writing, and maybe you didn't mean what you wrote. But it *IS* what you wrote, so don't blame me for correctly reading what you incorrectly wrote.
Then that's the program's fault, not the OS. I could just as easily write a UNIX program that only runs if you are root because it tries to, say, open a TCP/IP port number below 1024.
Just because you find it hard to believe doesn't mean it isn't true. There are plenty of very high level languages (e.g. O'Caml) that have no more overhead in manipulating data structures than C does. O'Caml does (verifiably) have performance comparable to C.
Provide a link to this proof.
Ah, but what if there's a bug in the library? In C, you depend not only on the correctness of your own memory management code, but also on that of any library which you use.
True. But since this is also true of every other language, this isn't relevant to your point. (If you think high-level languages never end up dropping down to doing things in a low-level C way inside their libraries, you are kidding yourself. Eventually every program talks to the OS at some point, even if it's just in the libraries, and that's going to mean the libraries will have C calls in them.)
In other words "if you're a good programmer, you will never make trivial mistakes". Bullshit.
I agree that that statement is bullshit. Your claim that it is a summary of what I said, however, is also bullshit.
Of course there's such a thing as fast enough. My email client and web browser have been running fast enough for years.
If that's all you want to use your computer for, then don't waste your money on a faster computer. For those who do want more speed, stop dictating that they must waste it on needs which are already served by cheaper hardware.
(notice I said I and not we all)
Since you're memory is so short, here's your exact words to remind you again:
Yeah, I said it, but we're all thinking it!
A person is entitled to his own opinion. He is not entitled to dictate the opinions of others.
Some are people who are just dicks about it
I do not apologise for demanding honesty.
but we're all thinking it!
And your reason for coming to that conclusion is what again? (Other than a desire to invent facts to support a point).
I liked it, and still like it after about four viewings. I am not a member of that "all" that you are referring to (which means it was a lie to say "we all".)
claiming that "safe" languages have a performance hit of more than 15% is just wrong!
I repeatedly hear claims of this, but it doesn't seem like it in practice. I find it really hard to believe. In an optimized test that doesn't excercise the problem areas much, I could see a hit of only 15%, but that would have to be a program that just prints out strings, and maybe does some math. But in practice a real program is going to contain lots of data structure manipulations, and that's where the performance hit is (and that's the main point of using a 'safer' language, too.)
and being able to make 5 or more errors through minor typos for such a trivial thing as string copying is not really acceptable (for most applications).
But I am of the opinion that a programmer that makes those errors that often should not be writing my operating system's core programs (e-mail server, web server, etc). I *want* a programmer for whom bit-twiddling and memory tricks is second nature. If you can't keep strncpy() straight, then I don't want you writing TCP/IP socket code, or writing programs that fork() and have to avoid zombies or any of that sort of thing. These programs aren't entirely OS, and aren't entirely application. They sit at the bridge between them.
Now, that being said, I *would* be in favor of writing the code in a stratified approach, where the OS interaction is in C, but the higher-level stuff is in something else. (For example, a web server should have the TCP/IP, and threading, and resource management engine stuff in C, but the HTTP syntax parser can be written in something more high-level.)
you often get char pointer from elsewhere and have no idea whether the "string" you just got is actually null-terminated or not!
Then you are using an undocumented call, just as much as if the documentation had forgotten to tell you the return type, or forgotten to tell you if a variable was pass-by-value or pass-by-reference. Not once have I encountered this problem with the stuff in stdlib. The manpage documentation for every function call that deals with strings is very explicit about null termination.
with our multi-GHz machines shouldn't we focus more on robust software that is developed more painlessly
No. Not at all. When I pay Intel a pile of cash to buy a faster chip, I want that cash to buy me faster programs. There is no such thing as "fast enough". For example, if the computer gets fast enough to render a realtime 3d animation at 30 fps, and still have plenty of cycles to space, then great - that means there's now an opportunity to use that extra clock time to add more details to the scene, or perhaps render more than one scene at a time.
There is no limit beyond which the speed no longer matters. It always matters.
I've never used that program. Explain the relevant problem.
It's not the same thing. An interface can be text-only and yet not be a command-line. For example, Midnight Commander.
I can't believe I'm defending windows here, but the need for a sudo to give partial admin-like privileges without giving ALL admin privileges is something Windows doesn't *need* because it has the concept of different levels of admin-ness. Unix tends to be all-or-nothing, root or normal user with nothing in-between. So, largely Sudo is adding functionality to Unix that was sort of already there in Windows. (This is just like, from the other side, when I first heard windows advocates claiming Windows is so much better than unix because it has PC-Anwywhere for administration, and I sat there looking at my fvwm window manager in X, running seven programs on three different hosts and just laughed at their ignorance.)
A good workman blames his tools when he has no choice but to use the wrong ones (see, pointy-haired-boss).
is it really good to use a low-level language that was written with operating systems in mind for highly abstract software that doesn't need the 5/10/15 percent gain of performance??
When the real world starts having examples of languages that solve these problems with only an additional overhead of 10-15% in memory and runtime versus C, your comment will start making some sense.
(However, it is true that for many user-level applications, the extra wasted resources aren't worth worrying about. But for the kinds of code being talked about here, that are part of the OS, I want all the efficiency I can have. I want as much of the resources going to the userland programs, and as little going to the OS, as is possible.)
The simple solution is to use C but then use a string library for the user-input. There's no reason you can't use a C++ basic_string from the STL for reading user input, and then drop it down to a C null-terminated string for processing.
YOU ARE SUCH A JOKER!!! how exactly are you going to find the last character if the string isn't null-terminated.
I'm not the one you replied to, but here's your answer anyway:That is what the poster was talking about. If your fixed-size string holds N chars, you're not SUPPOSED to be reading N characters into it. You're supposed to read N-1 characters into it and null-terminate the last character.
(But better yet, just use strdup() which allocs and copies the string as one operation, and you don't need to bother with pre-allocating the size. Oh, that's right. You don't think easy solutions like that exist in C.)
If you're going to make a point, try doing it like an adult.
I'm not a hard drive architect either, but that is a terrible, terrible idea. For efficiency you want the surface spinning already before you start reading the next chunk of bits for the file. If you had to start and stop the disk each time you read a different file it would be horrendously slow. Therefore it makes sense for the sphere to always be spinning, and always spinning around the same axis. To turn it a new direction you have to fight against angular momentum. To keep it spinning the same direction, you just have to trickle in a teeny amount of force to counter friction.
So that's one place your idea is bad - it makes you have to fight angular momentum, and basically start and stop the sphere every time you change direction. There's more...
Think in terms of simple geometry - a tiny area of the disk holds one bit, right? Okay, but there is no point in accessing those bits in random order, since 99.99999% of the time you want to read more than just one bit off the disk. You want an entire string of bits sequentially. Even when reading a file in a "random access" kind of way, you still want to read the chunks of bits in a fixed order within each record (read this string of 2000 sequential bits, then zip over to this part of the file and read that string of 2000 sequential bits.) Because of this, you shouldn't be thinking of the storage as a bunch of random bits, but as a series of lengths of bits you don't want to break up. Okay, so now you have a bunch of areas of the surface of the sphere that are oblongs one bit "wide" and thousands of bits "long". Now, what is the most dense way to pack those oblong sections? All lined up the same direction, of course.
So there is your second reason you should spin the ball on one axis and one axis only - it packs the strings of bits efficiently. To do otherwise is really, really silly.
So, given that you should want the ball to always spin the same direction, then what do you win by making it a ball with read heads at different axes? Nothing. You might as well make it a cylnder. (in fact, in the olden days that's just what they did.)
Even the president jumps on the bandwagon with statements like, "You're either with us or you're with the terrorists."
He's not just jumping on the bandwagon. He built the bandwagon and is up in front driving it.
The next time you happen to be frustrated with a terribly long piece of legal writing, as in a contract or a bill before Congress, remember to thank yourself and others like you who enjoy placing flowery writing above logic in precedence. It is because of rules like this (a double-negative sometimes does, and sometimes does NOT cancel out, depending on what was in the mind of the writer), that legal writing is so horrible to read. It isn't possible to make a statement in a natural language like English that maps to one meaning and one meaning only unless you really WORK at it. And so if lawyers don't want to deal with uncertain laws, then they have to write verbose laws.
(Just to clarify for you, "don't want to deal with uncertain laws" does NOT MEAN "wants to deal with uncertain laws". I shouldn't have to explain that, but you do show a penchant for wanting to ignore the second negative in a double-negative, so I had to be clear.)
So, "Not unpleasant" means "unpleasant", then? (Perhaps that's not a good example because the concept is trinary rather than binary (something can be both not unpleasant and not pleasant if it is in the middle.))
Note that "double negative is a positive" still is true, however, in the case of binary terms like "pregnant" (you can't be half-pregnant). "Not not pregnant" does in fact mean "pregnant".)
This concept does NOT belong in a grave, and is nothing like ending a sentence with a preposition. Ending a sentence with a prepopsition does not lead to a logical ambiguity, and is therefore not a problem. Logical ambiguities (like sometimes interpreting double-negatives as positives and other times not doing so) ARE a problem if your goal is to communicate with people. (And if that's not your goal. there's no point in using language at all.)
But since there are so many people who insist on adding unnecessary confusion just because they think it makes the language flowery and cute, I always responid in such situations with a complete sentence so that there's no question which way I interpreted the double-negative, as in:
Other person: "Aren't you going to the store?"
Me: "Yes, I am not going to the store."
As Einstein said, everything should be made as simple as possible but no simpler. The problem is that the media is trying to make technical issues simpler than is possible, and that practice results in either lying or unwitting falsehoods. If you are a reporter being told you have 3 minutes of airtime to cover a complex tech topic, then no matter how hard you try, and even if you know the truth, you're going to have to end up lying to make the material fit in that short a time, if you know you are explaining it to the general public.
Blogs don't get in trouble if they post false facts. Reporters do. So, no, blogs aren't reporting either. Nobody is.
The FBI and CIA collectively knew there was a terrorist cell in the US planning to attack the world trade centers, but wasn't able to put the pieces together.
That's not true. They did know that much, and had put the pieces together. It's just that it's a big jump to go from "some terrorist cell is in the country and it will attack this exact building at some time, eventually, in some way" directly to "And it will happen on this exact date, and it will be done using this exact method." You can't defend a building for years against a "something-or-other" unknown threat. They *did* have a lot of heightened security in that building after the attempt at a truck-bomb in the parking garage. But the kind of attack that came was the kind where that just didn't matter.
It's not sarcasm. It's just proof that the person writing that statement leans to the right. (People tend to often falsely think of themselves as more moderate than they actually are, and as a result they notice bias against their side more than bias for their side.)
And after a statement like that I'm supposed to trust this guy's opinion? I stopped reading at that point.
Yes, absolutely. Why don't people understand that even if an anomoly wasn't large enough to change the outcome THIS time, that this isn't a good enough reason to ignore it? When votes are counted wrongly, the system needs fixing NOW - before the next time it gets used. You think we'd have learned from last year's Florida result, that a margin of error in the system of 0.02% is STILL TOO HIGH! This constant practice of throwing up our collective hands and saying, "Oh, well, the problems didn't matter this time, let's ignore it for four more years" is precisely what led up to the 2000 fiasco. None of the problems of that election were new. None of them were unknown. It just wasn't a narrow enough margin to have mattered.
The time to fix e-voting is BEFORE it fouls an election. If you wait until afterward, you won't have the proof that it happened. The election must not be hinged upon trusting a single entity's claim that it won't cheat when counting. That's a basic obvious fact every country except the US seems to understand. Why are we being so stupid?
Is Florida a state that requires registration to vote in a party's primary, or one that automatically registers you for whichever party you vote for in the primary? If either of those is true, then one possible explanation could be that people registered Democrat so they could vote in the primary that mattered. (In an election where the incumbant has only had one term so far, and is thus eligible for a second, the party of that incumbant always has a pointless primary with a foregone conclusion - they'll run the incumbant.) Therefore voting in their primary is rather pointless. Thus I could easily imagine a lot of people on the fence choosing to claim to be Democrats because their primary is the one in which the outcome is actually in contention. A lot of them might do this even if they aren't certain yet that they will vote Democrat in the final election. A lot might be thinking, "I'm leaning toward voting for Bush, but as long as I can, I might as well have a say in who my second choice might be."
This is why I am opposed to the practice of allowing non-party members to vote in primaries. Parties are private clubs. If you want to have a say in who THEY spend THEIR money on promoting, then join the party and become a member. Otherwise you're interferring, and possibly in an advisarial manner. In the case of an election year with a president trying to renew his seat for a second term like this one, a lot of the incumbant's supporters can safely cross party lines and vote to spoil the opposition party's primary, to try to skew their results and get them to field a weaker candidate.
This is why, despite living in a state where anyone can vote in any primary (you don't even have to register), I wholeheartedly refuse to do so (I do turn in a ballot, since there are often refferenda on them as well as party primaries, but I leave the party primaries's choices blank and ONLY vote on the refferenda.)