I was thinking more about avoiding drive spin-up. I am not so impatient for "my OS to boot" and more concerned about lengthening the drive lifespan by having it be (e.g. STAY) spun-down for longer. If you had a two-gig SD card and could get the ext3 journal flush time to be "forever if the drive is stopped and there is at least 10% of the log space left" [and if you have enough main memory that you don't need to page/swap] then you could run the laptop virtually all day with the drive spun down if you weren't doing huge downloads.
That may seem counter-intuitive, but really, if you started your word processor and your browser, and your email (or whatever) you would end up with a fairly stable working set. Save that important document several times that day and do moderate browsing (or use only memory cache etc), you end up with a _very_ stable working set. Your modules are loaded and your shared libraries are mapped and paged in.
The memory management might need to be tweaked a bit (which is why I haven't started the project "for real") but it should be really doable.
I'd like to see linux have support for (and have hardware makers create) what SUN used to call NFS Accelerators. Basically add-on NV (or battery backed) memory sufficent to transparently cache write information. On my laptop I'd put it in my ExpressCard(tm) slot.
Then again I have been considering using an SD type card to contain the journal for my ext3 file system.
Actually, that combination; an ext3 file system in full data write-back journal mode, a solid-state flash device for that journal, and a "large" flush interval (more than the default five seconds) could accomplish essentially the same thing.
I wonder what the flash wear rate would be...? Do they make NAND SD cards?
So let me get this straight... Microsoft is accusing the EU of treating Microsoft the way Microsoft traditionally treats it's "partners" and competetors.
Let's do the list:
- Dealing from a position of ounfair advantage... [check] - Failing to disclose requirements... [check] - Revising requirements without notice or explination... [check] - Failure to document anything... [check] - Using non-disclosure to keep control of the weaker party... [check] - Being generally "unfair"... [check] - Persisting and iterating the above until it does substantial business harm to the weaker party... [check...?]
Gee, if this is true, I wonder if anybody at Microsoft will appreciate the delicious combination of irony and justice.
It _should_ be legal to treat companies the way they treat others. A kind of law-of-parity.
It is, however possible that the answer is simpler. It is likely that the EU said "document everything publicly" and Microsoft kept comming back with "if we do _this_ will it be enough?" and the EU said "if that's everything and it's public then yes." and every time it wasn't "public" or it wasn't "everything" then the EU just said "we said 'everything' and 'public'"; in which the real problem is that Microsoft cannot understand simple directives.
It doesn't take much in the way of formal language to communicate "document everything publicly".
I tend to distrust Microsoft, what with their documented history and all, so Occam says that the later explination is probably the most correct.
Microsoft clearly wanted a hit-list of minimum disclosure requirements that they could hedge to the limit, and each time they tried to hedge, limit, and lie, the EU said "no" and pointed to the published requirement.
I have written a lot of code with very stringent uptime requirements, and I have some advice that is going to be backwards compared to the advice of others. But you have to take _all_ this advice as one truth for it to work for you.
1: Use the heap. A lot. The heap is your friend. Virtually every overrun exploit and crash involves the stack. It's not that you "can not" overrun something and bone yourself on the heap, it's jsut that you tend not to. Really. See number two below
2: AUTOMATE your heap. I use reference counted handles to target objects. Not "auto_ptr", but real live, honest to goodness, refrence counting. I spend/spent the time to come up with a bullet-proof Handle class TEMPLATE and then I _use_ it.
3: Virtual Distructors. I'll say it again, VIRTUAL DISTRUCTORS. If it has the word class, it has "virtual ~" in it somewhere. Every class, every time. Not inline either. The cost is miniscule, most implementations will be helped by this either in the vtable or the heap management or the code generation, and if you are following rule 1 and 2 and you are doing _anything_ right in your design (e.g. encapsulation and inheretance) this will lead to natural solutions to the +/-2% problems of final integration.
4: THREADING. Use it. It is easier to write N small programs that block on their inputs than it is to balance or maintain an N-way poll/select environment. If you don't use threads you will end up with a hell-a-painful switch-case statement somewhere in the core of everything, and that way lies pain and madness.
5: Recursive Mutexes. The standard pthread_mutex et-al is not recursive, but a simple class wrapper which checks ownership and increments counts can make it so. With recursive mutexes, and an agressive locking policy you will find that you will not make mistakes.
6: The "automatic Lock_Object". The Mutex class should only be takeable/lockable by a companion LockObject class, and _these_ should always be automatic (stack based). The (recursive mutex) lock is taken in the constructor and returned in the (virtual) destructor. It's the law. It will make your life better.
7: _Use_ EXCEPTIONS. People spout all sorts of garbage about when "NOT TO" use exceptions. They are full of "it", and then never tell you when _TO_ use them. The simple answer is.... this: Make a directed graph of your code _state_ dependencies [for each thread] in (aproximate) call/execution order. Weight the dependencies and restructure the graph so that the most necessary paths form a strict tree. Now the "edge and corner cases" will appear on this tangled-tree as cycles (loops). These loops should be cut open with exceptions. Start with a "class Fault" and then make sub-classes for each kind of fault (locking, logical, semantic, external [q.v. dropped connections]) and then *ALWAYS* use these exceptions for (and _ONLY_ for) backing up the central dependency tree.
The net result is a "process space" (memory image, whatever) of shared state, composed of a set of self-sufficent threads.
[ASIDE: the short version is "don't be afraid of your language, leverage it.]
This is not the advice some others would give you. It does, however, work quite well.
I have used this approach on several mission-critical projects and produced programs that were both "sufficently fast" _and_ maintained continuous heavy-load runtimes in the multiple-months-without-stopping quality of service range.
Well, I am a tad disapointed at the SATA interface, but there are a few possibilities.
This would make an outstanding "external journal device" for a journaled file system or four.
Now nothing is good for an NTFS journal even if you could do it to an external device, but for a real journaled file system it would do quite nicely. The device becomes a fast write cache in front of a potentially slow aggregate (software RAID etc). Put a database on the raid and do full data journaling. You would be able to pull off a highly reliable system with excelent performance.
My idea has been to send up a large mylar bag (don't laugh 8-) which would then be inflated with a foam that would set up (sort of like poly-styrine [sp?] or the foam insulation you can have injected into the walls of your house). This would create a large solid-but-permiable object where debris could agregate. The foam would tend to absorb debris and their energy.
The planned orbit of this semi-solid object would be set up to intersect a lot of the smaller bits. This would damage the "bag" but once the foam was set the "tatterd" bag would still help keep the object in one chunk.
Many impacts would puncture the bag of course, which would result in a "catch" of the object.
Many other objects would bounce off the object, which would rob the offending debris of a lot of kenetic energy, causing them to deorbit.
The object itself would have a whole lot of surface area compared to its mass, so it would deorbit in a matter of days (if not hours).
This would be especially effective if the object were actually in a retrograde orbit.
So anyway, we end up with a big blob of foam with a bunch of wrenches and screws and metal tidbits embedded in it burning up on reentry all at once, instead of individual objects in excentric decaying orbits...
In the Linux kernel you don't need to do the empty send(). Turning Nagle off causes an imediate flush so it is enough to strobe nagle off and then back on.
At one point I submitted a patch that would add a TCP_FLUSH "option" that saved the TCP_CORK and TCP_NDELAY flag values, called the low-level flush routine, and then reestablished the flags.
It was rejected. (But I still use it from time to time on my own, love that Open Source. 8-)
Meanwhile, just drop and restore Nagle as fast as you can, it will save you a needless syscall for the send().
I have found that I also get this pattern and it has a lot to do with overloading the transmit feed on my cable modem. The cable modem works as a strict time division multiplexer. So to get maximum throughput you want to keep the transmit buffer full, but ir you over-fill it the packets are silently discarded. As your number of connections goes up the likelyhood of overrunning your modem buffer aproaches regular certianty.
I run a Linux firewall, so I put in a six layer quality-of-service set. I put "very small" TCP packets in the highest priority, then ssh traffic, then games, then regular services, then bulk services. The absolute throttle is then set to just a hair larger (~5%) than the theoretical maximum output.
[Don't bother with any receive rate throttling, there is no point.]
So this greatly increases the period of the overflow, if the period becomes longer than the Bittorrent segment size, you get essentially uniform performance.
In Azureus I also cap the upload speed to about 90% of the cable upload speed to get (both) uniform utilization [which is all you _really_ have to do] and still keep the interactive web experience at "no apparent delay".
I didn't tune just for Azureus, I can also game (Unreal Tournament 2004) while my rommates use the net, and sufer virtually no lag.
Actually, If you establish the DarkNet in the right way, once you are connected to a trusted node you could connect to any other node by passing authentication and encryption keys the long way. This would allow for dynamic (re)routing.
Think of an IRC style web. Basically, a properly designed network would allow one party to inform another that it wanted to make a connection. Then it would make that connection. By pre-passing the keys and proof of identity, you would be able to make arbitrary connections within a "closed surface" of the net.
===
What I have been waiting to see make a comeback is the good old fashioned POTS modem. With all the internet wire-tap laws being generally weaker than the phone tapping laws, it would _really_ make sense to transfer authentications (etc) through a old-fashioned BBS style "drop sites" that were not really on the net.
So you downloaded some particular binary splash. To turn it into the song or whatever you would have to go get the key/completion-tidbit. Heck, the actual directores could be encoded so you _couldn't_ know what you were passing unless you were also in on the sideband/drop-site.
The Linux magnet is magnet:?xt=urn:btih:SD36UE42IMPAKVUXAXRF3FQH4QYM23 FS
The Windows magnet is magnet:?xt=urn:btih:DD3CA4757LNNLEMGSQIN5JMPK23B62 NB
For whatever reason, the SlashDot system _adds_ a space before the last two letters. Take that out when you pase the links. (e.g. it isn't "23FB", it's "23FB").
To use this, start Azureus and then File->Open->Location (or ctrl+L) and paste the magnet string into the dialog box.
The Linux magnet is magnet:?xt=urn:btih:SD36UE42IMPAKVUXAXRF3FQH4QYM23 FS The Windows magnet is magnet:?xt=urn:btih:DD3CA4757LNNLEMGSQIN5JMPK23B62 NB
For whatever reason, the SlashDot system _adds_ a space before the last two letters. Take that out when you pase the links. (e.g. it isn't "23FB", it's "23FB").
To use this, start Azureus and then File->Open->Location (or ctrl+L) and paste the magnet string into the dialog box.
Depth is, for any non-trivial, non-binary tree, less than breadth. Therefore a strict breadth-first ordering in a FIFO involves FAR MORE data movement (copying) and function calling (enqueue+CTOR and DeQueue+assign etc) than the recursive solution.
So the recursive function is _more_ efficent and is _more_ elegant and robust and involves less memory (and so less vm interraction and higher degree of locality and probably less cache contention on modern hardware) because you don't have to look-aside from your active data to do queue management and your active dataset is constrained by your depth parameter.
For instance, at any given time, your complete active dataset is the current path from root to current node. So lets say this routine was traversing a slow-stroage tree (e.g. a database) or shared data structure, the total number of records that would have to be read-locked to acheive a consistent (safe) pass is CURRENT_DEPTH (a scalar quantity from 1 to X) while doing a breadth-first traversal with consistent (safe) read using a FIFO would require locking the current node plus all nodes who's depth is less than the depth of the current node. Not terribly elegent nor efficent.
To block out the lower portions of the tree in my sample code you only need to add the target depth to the test (and so the argument list, but everything costs something 8-).
In practice, in an advanced language, the traversal agent really ought to be a functor with the constraints and target node operations as members. But I digress.
In short, a FIFO (breadth first) traversal of a tree can never be more efficent than a recursive traversal in terms of temporary storage, copy operations, and at-risk (lock-worthy etc) nodes. That is why tree traversal is "naturally recursive."
Look it up.
For "a constrained operation on a tree" where the nature and order of the tree are unknown (e.g. as a generic operation) queue-based operations are "always" inferrior.
And as for graph traversals, if there are "cycles" then you don't have "a tree" you have "a graph" which is a completely different problem set. If the tree is immutable (constant or logically constant, or expensive to mark, or subject to multiple concurrent traversals) then you need to be able to construct a coresident data structure (typically a visitation set) to act as a dynamic boundary case and to prevent a traversal that looks artificially "leggy" you would want to use a FIFO.
But again, that's a GRAPH and not a TREE.
Look that up too
Now if you _know_ youre data set is likely to produce a leggy tree, or degenerate into a linked list or something, you would want a FIFO; just as if you know your tree is artificially broad (say that each node can have hundreds of direct children) you would want to avoid the FIFO as if your life depended on it.
Being "Completely Breadth First" in no way equates to "More Elegant" unless you are only interested in the breadth-first-i-ness for its own sake.
[BEGIN OLD GEEZER ASIDE]
When I was in my B.S.C.S. program back in 1982 I took this course called "The calculus of computer programming"; the course was terribly boring but the lab sessions were outstanding. We had a pascal compiler that would reject every data type but character and file-of-character (that's right, no integers etc), it ran on a mainframe and every compile was a compile-and-run; you were allowed 60 CPU seconds and 100-sheets of fan-fold paper from any run before the run was forcably ejected from the run-queue. And we were given "reasonably real" tasks like paginate the input file into two parallel running columns. [Not to "up-hill both ways" you, but you had to walk across campus to from the math building or student union to the CS building to pick up the printout too. 8-)]
I bring this up because having to implement things in such a (deliberately) broken environment led to either abject frustration or a zen-like fusion of patience and efficency. [Not to mention a disli
All other things being equal, all tree traversals run in linear time unless you try to break them on purpose.
The interviewer was wrong about his arguments because all the local variables need to be saved for any function call (recursive or not) so calling FIFO.put(x) is just as hard on the register-resident transients as anything else. It is even harder still on things if FIFO.put(x) needs to call new/malloc or a constructor.
Given the basic binary tree, and the nth-depth output requirement, it is hard to beat: (in C)
void Traverse(node *root, int target_depth) {
if (root) {
Traverse(root->left,target_depth - 1);
if (!target_depth) { do_output(*root); }
Traverse (root->right, target_depth - 1);
} }
Since 100% of the "transients" are in the argument list there is strict linear cost to the single write-to-storage, you are really down to basic operations.
The C++/C-pound implementation passes references or pointers and so shouldn't incur any of the stupid member-copy operations.
And if you are going to complain about function overhead in general then you are _worse_ off with a queue because of the overhead cost of invoking the queue operations and copy/CTOR operations increases the "function calls per node visited" by some linear scaling factor N where N > 2. (call-left, call-right, vs enqueue which must copy/save, dequue which must assign).
If you don't beleive me, do the exercise both ways with similar optimizations and then profile the results.
Let's face it, tree traversal is prime amongst the _classic_ naturally recursive agorithms. The fact that it "can" be done by a queue is far from the idea that it "should" be done via a queue.
To give one coutner tweak, not to refute your post's valid points, but to point out something of the scientifically valid but largely lost, "ought not" position.
There is a ["strongly suspected"] link between consumption of cow milk and late onset adult diabities (sp?). The mother-to-child antibody/antigen process now understood to be implicit in mamal milk seems to produce an immune response in humans that is nearly identical to the autoimmune response that has been linked with the distruction of the insulin producing cells in the pancreas.
So there is some basis to believe that consuming a lot of cow milk over the course of a lifetime may increase your risk of developing adult-onset diabiates.
So while I agree that milk consumption has made the survival of various clutures possible, and it is probably one of those double-edged things. If you _can_ avoid it, or at least moderate it, you probably _should_.
As for the rest, I am not so much concerned, as an adult, with the presence of hormones or antibiotics in my food as I am about what the antibiotics are doing "out in the field". In particular the continuous sheding into the soil of the antibiotics and partially resistent intestinal flora/fauna via cow dung provides the ideal low continuous dossage exposure necessary to produce an optimal yiled of resistent bacteria. Since they now know that bacteria can directly communicate that resistence to other unrelated bacteria. The dairy farm (and actually probably the pig and chicken farms as well) has become probable wellspring of harmless but highly resistent bacteria that may then be capable of turning very harmful, but not previously exposed, bacteria into super-pathogens.
The mis-management of antibotics world-wide in the twentith century is probably the greatest slient crime against humanity of that (this) era.
There are all kinds of stupid magical tricks that can be used to tell if you are or are not blocking ads. There are also fairly basic ways to deal with this.
For instance, I have used Tools->Add Block->Preferences to select "hide ads" instead of "remove ads" to combat this very problem.
Once you understand the tools, you can combat the problems.
Examples:
The Microsoft Outlook preview pane (pain) opens all your email even if you don't mean to. When you right-click-and-delete a message Outlook opens it. The spammers can then "know" your email address is valid and a good spam target because when outlook opens the email it will fetch the images (at least the frist one) so that fetch (http get) tells them you are there.
This is germaine to this conversation of web sites because web sites cna do the same thing with cookies or, if you have cookies blocked, by adding arguments to the URLs of the sub-parts of the page.
So a URL of the format "http colon slash-slash my-site slash this-advert.jpg question-mark some-session-unique-tag" will cause the same this-advert.jpg to be delilivered to everybody and the server can harvest all the unique session tages to see who is or isn't getting the ads.
It is not uncommon for the intro page to have a web-bug (a one-by-one pixel graphic that is used to seed cookies or validate browser functions). That one tiny bit of dynamic html (etc) on just the one page can be quite effective at knowing what your guts do.
So, for instance, if you have the bandwidth (e.g. cable modem etc) you can "hide" the ads, but the computer still fetches them, so the sites cannot tell the difference.
I think hiding the ads I don't like (c.f. doubleclick and the similarly animated ads) costs doubleclick money for my "page view" and cannot possibly lead to a sale since not only won't I click on the ad, I won't even be tempted to, nor will I be infected with any "product awareness". Depriving someone (doubleclick) that does something that stupid (bouncy intrusive ads) of revenue while still contributing to their overhead is my civic duty... 8-)
And remember to use wildcards in your ad blocking, "http://*.doubleclick.net/*" is a completely unstopable way to banish a whole annoying domain from my life.
But still they pay the sites for my "page view" and they pay their bandwidth. I'm just doing my part to rid us all of their spamming, self-entitled leach-like business. _They_ after all, are free-riding on the bandwidth _I_ pay for.
For me, the sad part is that I was just considering going out to get a high-end Apple G5. It was going to make sense for several reasons, not the least of which was because it is a better platform for running Linux, and indeed for corss-compiling things for the embedded box my company uses.
Now there is this apocoliptic (sp?) horizion on such a purchase...
There are two statements missing from the "it's not for software" position. If these were added with appropriate legaleese, then things would be fine.
1) No patent, patent claim, or part thereof shall be held to govern the expression of an algorithm, process or procedure as a body of computer code.
2) No program, body of software, or part thereof which is or _can_ _be_ implemented for use on a general purpose computing device shall be held to infringe on _any_ patent.
These two declaratives prevent backdoor patents from being generalized from hardware into software.
The RIAA moves on the provider of illegal material and captures their server logs. There is proof-of-transfer of spesific content between parties who are not agents of the RIAA.
If they got those logs by any reasonably legal means (including legal arm-twisting and threatening) then they have evidence.
Find the server, compromise the server, find the client. Sue, threaten or extort the client. Profit!
The partial flaw of your analysis is that the memory "allocated" to the loaded shared object (in linux) is only virtually allocated, you are right. But, to page granularity, if you don't use the code paths then they arn't actually loaded anywhere and don't really take up any meaningful space.
In point of fact, the shared object mechanisim isn't broken in general, it fails "in detail".
I have several (Linux) systems with distinct and conflicting versions of the libc.so working just fine on a daily basis. [Yes, this is by common logic quite dumb, but it is necessary for reasons I will not go into here.] If you build the overall system "right" this is very easy to do.
By setting up/alt/(compiler_version)/{bin lib etc} trees I can have disctinct runtime inferance trees. Executing the programs is then a matter of point-and-shoot with LD_LIBRARY_PATH or the configuration of ld.so. It doesn't practically matter that I have an/alt/(version)/etc/ld.so.{config cache} as long as the executables know which one they are supposed to use.
It "doesn't matter" to the system because the virtual file system in Linux will efficently deal with the multiple mappings of the same text images even if they come from separate loaders. That's what it is for.
Similarly, targeted dependencies via the definition of "versioned symbols" isn't rocket science either. It's all there to use, and the kernel does this very thing for its modules if you want it to, but the developers have to use the techniques.
"The system" cannot be relied uppon to make these issues go away.
Consider "nice portable Java", given or take deprecated interfaces and JINI, this system suffers from many of the things its designers tried to design away.
Even statically linking everything isn't a solution because the underlying hardware, and therefor the executing OS, simply _must_ evolve. And evolution isn't 100% backwards compatable.
So if people work on forwards compatability (new versions being supersets of old versions etc) you can do "pretty well" if you make sure not to install old stuff on top of new.
And that is an administration task that is only somewhat automatable.
At some point, people have to stop being dumb or suffer the consequences of their own ignorance.
The requirement for fraud is, well, intent to defraud. IANAL, but my father was and one of his favorite bits of legal trivia was thus:
I can sign your name if you tell me I can, so there is no fraud if I sign your name without fraudlent intent.
Your signature doesn't have to be related to your name in any way; as long as it is something you use as your signature its valid. This goes back to illiterate persons "making their mark" to sign documents. You don't even have "a signature" you have as many signatures as you want to. For instance I have an added glyph I use on some kinds of documents, it cannot be represented in any current character set and it will botch any OCR scan. It has its uses... but it only shows up on some things.
The "signature card" on a bank account and the place to sign on the back of a credit card exist solely to act as arbiters; they exist only to define what your signature is on that account. In this respect the signatures involved are simple, anonymous key matching operations.
I can sign my name to where yours should be, but if I do so with the intent to pass-off and say that what I wrote is supposed to be your signature, it doesn't matter that the letters spell out my name, by presenting the document as something signed by you (the authorized party etc) I am engaged in fraud.
For all your dancing, you _write_ software; actually it is fairly obvious that _you_ don't write software, but software is "written".
Copyright says you cannot steal my written work.
Pretty much a perfect fit there.
Have you ever bought a "bad" piece of software? Have you then gone out and replaced it with a "good" pice that does the job better?
Software patents prevent this replacement because the "bad" piece owns the applicaton space. They own the idea. So there can only be one piece of tax prepration software. There can only be one piece of web server software. and so on. So there is no reason for the "owner" of "prepairing anual income tax returns using a computer" to _have_ _to_ improve his POC software because there is no better alternative to his POC.
Software patents are the oposite of capitalisim.
Software patents are imperialist. Various entities create fifes and kingdoms of "features" and "methods" and share wealth amongst the peerage while giving the serfs no access beyond their megar largess.
Software patents are soviet. The issuing soviet (USPTO here) grants exclusive domain over an idea to a collective (corporation) or comrade (individual) and leaves them wholy responsible for the implementation of that idea. As the responsible collective is given no other leverage for their position than to apply to another soviet (the legal system).
Etc.
People regularly patent common sense and existing process by tacking on "with a computer" or "on the web" and businesses to date don't seem to understand why that is bad.
But they will.
The fact is simple, there is no idea in computing that isn't so dependent on previously expressed programs that it _deserves_ more than copyright protection.
If you do "negative analysis", that is if you subtract everything that you have seen before from a patent, and everything that you may not patent separately from a patent; in software patents you end up with nothing but "a purpose." That is, the processes behind a "business process patent" aren't innovative.
This isn't a "broadcast flag" its a "prior restraint flag."
Make it a selling point. "Now you crooks can't steal(*) from us innocent corporations!" and "Now with less confusing features!" "No more Blinking VCR clock!".
Have a big splashy logo with "Prior Restraint -- Now we are all Safe" emblazoned on its paraphry and handcufs bound by antena wire in the center (all nicely designed by a good marketing firm).
As long as each television set and "protected" broadcast has to have the big "Prior Restraint Flag" logo splashed on it, go ahead. See how it sells _then_.
That would, after all, be required under the truth-in-advertising and disclosure laws.
Let's see, the sect of Christianity least likely to lose its members is Satinism. Would you be offended if your child, while not having to say the prayer, were forced to stand or sit and listen to an invocation of Satan once a week?
After all, your children _aren't_ being forced to say the invocation, they can sit it out just fine, as long as they listen respectfully and don't offer a disrespect to the beliefs of others.
How about a quick chicken-blood splash of Vodun?
Five minutes of Scientology "Confront Technology" (e.g. getting yelled and at and threatened, and then getting punished if you react in the slightest)? Even if they "only" have to watch it happening to other students?
Hindus outnumber Jews and Christians combined, so how about this schedule: Genesh on Mondays, Wicca on tuesdays, Yaweh (Jewish) on Wednsday, Kali on Thursdays, Yaweh (Christian) on Fridays, and Satan on special event Saturdays, Allah Field Trips and pre-game prayers; and a reading from Dianetics the first day back from summer vacation each year. Nobody has to join in, but they can all have to sit respectfully quiet while it is going on.
After all, but spreading it out
===
It's like second hand smoke and getting shot. "Rights" exist in competition, and the right "not to" do/participate ALWAYS trumps the right to do something.
e.g.
-- I have the right to smoke. You have the right not to be forced to breathe my leftovers.
-- I have the right to keep and bare (and so shoot) arms. You have the right not to be gunned down at the Circle-K.
-- I have the right to preach that (your ethnic/spritiual group) is sinful or sub-human and deserves (some negative end). You have the right to demand that I not force your child to listen to my crap; and your child has the right to make that demand even if you wont; either of which means that I am not allowed to do it in your childs school.
The "they don't have to participate as long as the sit there and take it" isn't a reasonable position once my shoe is on your foot.
===
"Freedom of religion" means freedom _FROM_ religion.
Imagine the hue and cry that would result if someone were to buy a mountain top and erect a giant pentagram-on-a-stick or Goat-Head or Horned-God to stare down beautifically on your township. There is no dogma provided, and nobody is being forced to even look at the thing. But it is there, and someone will be botherd by it, I garantee. And someone who probably woudn't know the first thing about the variant meanings of the symbols because both the message sent and the message perceived count.
===
But I agree the separation of church and state should extend to our money and our documents. That "natural god" and "all men are endowed by their creator" are historical legacies, but the "under god" that was revised into the pledge (and which breaks the scansion) and the "in god we trust" should be expunged from the money too.
Wednsday May 19, 2004 I tried to post the progenetor of this to slashdot and got rejected. In particular I bought a top-of-the-line wide-screen HP (7130 ?) laptop with Media Center et al. It kept blue-screening so after two complete re-installs of windows I went to the HP site and got the BIOS update.
After installing the new bios the box complained that my the build-in wireless board was not kosher ("authorized" is, I beleive, the correct word) and that I would have to remove the wireless board if I wanted the laptop to boot.
I was thinking more about avoiding drive spin-up. I am not so impatient for "my OS to boot" and more concerned about lengthening the drive lifespan by having it be (e.g. STAY) spun-down for longer. If you had a two-gig SD card and could get the ext3 journal flush time to be "forever if the drive is stopped and there is at least 10% of the log space left" [and if you have enough main memory that you don't need to page/swap] then you could run the laptop virtually all day with the drive spun down if you weren't doing huge downloads.
That may seem counter-intuitive, but really, if you started your word processor and your browser, and your email (or whatever) you would end up with a fairly stable working set. Save that important document several times that day and do moderate browsing (or use only memory cache etc), you end up with a _very_ stable working set. Your modules are loaded and your shared libraries are mapped and paged in.
The memory management might need to be tweaked a bit (which is why I haven't started the project "for real") but it should be really doable.
I'd like to see linux have support for (and have hardware makers create) what SUN used to call NFS Accelerators. Basically add-on NV (or battery backed) memory sufficent to transparently cache write information. On my laptop I'd put it in my ExpressCard(tm) slot.
Then again I have been considering using an SD type card to contain the journal for my ext3 file system.
Actually, that combination; an ext3 file system in full data write-back journal mode, a solid-state flash device for that journal, and a "large" flush interval (more than the default five seconds) could accomplish essentially the same thing.
I wonder what the flash wear rate would be...? Do they make NAND SD cards?
(etc. od nausium. ahmen.)
So let me get this straight... Microsoft is accusing the EU of treating Microsoft the way Microsoft traditionally treats it's "partners" and competetors.
Let's do the list:
- Dealing from a position of ounfair advantage... [check]
- Failing to disclose requirements... [check]
- Revising requirements without notice or explination... [check]
- Failure to document anything... [check]
- Using non-disclosure to keep control of the weaker party... [check]
- Being generally "unfair"... [check]
- Persisting and iterating the above until it does substantial business harm to the weaker party... [check...?]
Gee, if this is true, I wonder if anybody at Microsoft will appreciate the delicious combination of irony and justice.
It _should_ be legal to treat companies the way they treat others. A kind of law-of-parity.
It is, however possible that the answer is simpler. It is likely that the EU said "document everything publicly" and Microsoft kept comming back with "if we do _this_ will it be enough?" and the EU said "if that's everything and it's public then yes." and every time it wasn't "public" or it wasn't "everything" then the EU just said "we said 'everything' and 'public'"; in which the real problem is that Microsoft cannot understand simple directives.
It doesn't take much in the way of formal language to communicate "document everything publicly".
I tend to distrust Microsoft, what with their documented history and all, so Occam says that the later explination is probably the most correct.
Microsoft clearly wanted a hit-list of minimum disclosure requirements that they could hedge to the limit, and each time they tried to hedge, limit, and lie, the EU said "no" and pointed to the published requirement.
This fits the facts as presented.
I have written a lot of code with very stringent uptime requirements, and I have some advice that is going to be backwards compared to the advice of others. But you have to take _all_ this advice as one truth for it to work for you.
1: Use the heap. A lot. The heap is your friend. Virtually every overrun exploit and crash involves the stack. It's not that you "can not" overrun something and bone yourself on the heap, it's jsut that you tend not to. Really. See number two below
2: AUTOMATE your heap. I use reference counted handles to target objects. Not "auto_ptr", but real live, honest to goodness, refrence counting. I spend/spent the time to come up with a bullet-proof Handle class TEMPLATE and then I _use_ it.
3: Virtual Distructors. I'll say it again, VIRTUAL DISTRUCTORS. If it has the word class, it has "virtual ~" in it somewhere. Every class, every time. Not inline either. The cost is miniscule, most implementations will be helped by this either in the vtable or the heap management or the code generation, and if you are following rule 1 and 2 and you are doing _anything_ right in your design (e.g. encapsulation and inheretance) this will lead to natural solutions to the +/-2% problems of final integration.
4: THREADING. Use it. It is easier to write N small programs that block on their inputs than it is to balance or maintain an N-way poll/select environment. If you don't use threads you will end up with a hell-a-painful switch-case statement somewhere in the core of everything, and that way lies pain and madness.
5: Recursive Mutexes. The standard pthread_mutex et-al is not recursive, but a simple class wrapper which checks ownership and increments counts can make it so. With recursive mutexes, and an agressive locking policy you will find that you will not make mistakes.
6: The "automatic Lock_Object". The Mutex class should only be takeable/lockable by a companion LockObject class, and _these_ should always be automatic (stack based). The (recursive mutex) lock is taken in the constructor and returned in the (virtual) destructor. It's the law. It will make your life better.
7: _Use_ EXCEPTIONS. People spout all sorts of garbage about when "NOT TO" use exceptions. They are full of "it", and then never tell you when _TO_ use them. The simple answer is.... this: Make a directed graph of your code _state_ dependencies [for each thread] in (aproximate) call/execution order. Weight the dependencies and restructure the graph so that the most necessary paths form a strict tree. Now the "edge and corner cases" will appear on this tangled-tree as cycles (loops). These loops should be cut open with exceptions. Start with a "class Fault" and then make sub-classes for each kind of fault (locking, logical, semantic, external [q.v. dropped connections]) and then *ALWAYS* use these exceptions for (and _ONLY_ for) backing up the central dependency tree.
The net result is a "process space" (memory image, whatever) of shared state, composed of a set of self-sufficent threads.
[ASIDE: the short version is "don't be afraid of your language, leverage it.]
This is not the advice some others would give you. It does, however, work quite well.
I have used this approach on several mission-critical projects and produced programs that were both "sufficently fast" _and_ maintained continuous heavy-load runtimes in the multiple-months-without-stopping quality of service range.
Well, I am a tad disapointed at the SATA interface, but there are a few possibilities.
This would make an outstanding "external journal device" for a journaled file system or four.
Now nothing is good for an NTFS journal even if you could do it to an external device, but for a real journaled file system it would do quite nicely. The device becomes a fast write cache in front of a potentially slow aggregate (software RAID etc). Put a database on the raid and do full data journaling. You would be able to pull off a highly reliable system with excelent performance.
You know? 8-)
My idea has been to send up a large mylar bag (don't laugh 8-) which would then be inflated with a foam that would set up (sort of like poly-styrine [sp?] or the foam insulation you can have injected into the walls of your house). This would create a large solid-but-permiable object where debris could agregate. The foam would tend to absorb debris and their energy.
The planned orbit of this semi-solid object would be set up to intersect a lot of the smaller bits. This would damage the "bag" but once the foam was set the "tatterd" bag would still help keep the object in one chunk.
Many impacts would puncture the bag of course, which would result in a "catch" of the object.
Many other objects would bounce off the object, which would rob the offending debris of a lot of kenetic energy, causing them to deorbit.
The object itself would have a whole lot of surface area compared to its mass, so it would deorbit in a matter of days (if not hours).
This would be especially effective if the object were actually in a retrograde orbit.
So anyway, we end up with a big blob of foam with a bunch of wrenches and screws and metal tidbits embedded in it burning up on reentry all at once, instead of individual objects in excentric decaying orbits...
"Sky Clearance" anyone? (Thankyou Max Headroom).
In the Linux kernel you don't need to do the empty send(). Turning Nagle off causes an imediate flush so it is enough to strobe nagle off and then back on.
At one point I submitted a patch that would add a TCP_FLUSH "option" that saved the TCP_CORK and TCP_NDELAY flag values, called the low-level flush routine, and then reestablished the flags.
It was rejected. (But I still use it from time to time on my own, love that Open Source. 8-)
Meanwhile, just drop and restore Nagle as fast as you can, it will save you a needless syscall for the send().
I have found that I also get this pattern and it has a lot to do with overloading the transmit feed on my cable modem. The cable modem works as a strict time division multiplexer. So to get maximum throughput you want to keep the transmit buffer full, but ir you over-fill it the packets are silently discarded. As your number of connections goes up the likelyhood of overrunning your modem buffer aproaches regular certianty.
I run a Linux firewall, so I put in a six layer quality-of-service set. I put "very small" TCP packets in the highest priority, then ssh traffic, then games, then regular services, then bulk services. The absolute throttle is then set to just a hair larger (~5%) than the theoretical maximum output.
[Don't bother with any receive rate throttling, there is no point.]
So this greatly increases the period of the overflow, if the period becomes longer than the Bittorrent segment size, you get essentially uniform performance.
In Azureus I also cap the upload speed to about 90% of the cable upload speed to get (both) uniform utilization [which is all you _really_ have to do] and still keep the interactive web experience at "no apparent delay".
I didn't tune just for Azureus, I can also game (Unreal Tournament 2004) while my rommates use the net, and sufer virtually no lag.
Actually, If you establish the DarkNet in the right way, once you are connected to a trusted node you could connect to any other node by passing authentication and encryption keys the long way. This would allow for dynamic (re)routing.
Think of an IRC style web. Basically, a properly designed network would allow one party to inform another that it wanted to make a connection. Then it would make that connection. By pre-passing the keys and proof of identity, you would be able to make arbitrary connections within a "closed surface" of the net.
===
What I have been waiting to see make a comeback is the good old fashioned POTS modem. With all the internet wire-tap laws being generally weaker than the phone tapping laws, it would _really_ make sense to transfer authentications (etc) through a old-fashioned BBS style "drop sites" that were not really on the net.
So you downloaded some particular binary splash. To turn it into the song or whatever you would have to go get the key/completion-tidbit. Heck, the actual directores could be encoded so you _couldn't_ know what you were passing unless you were also in on the sideband/drop-site.
CoralCache Link To P2P Downloads
CoralCache Link to regular downloads
For Azureus Users:
The Linux magnet is magnet:?xt=urn:btih:SD36UE42IMPAKVUXAXRF3FQH4QYM23 FS
The Windows magnet is magnet:?xt=urn:btih:DD3CA4757LNNLEMGSQIN5JMPK23B62 NB
For whatever reason, the SlashDot system _adds_ a space before the last two letters. Take that out when you pase the links. (e.g. it isn't "23FB", it's "23FB").
To use this, start Azureus and then File->Open->Location (or ctrl+L) and paste the magnet string into the dialog box.
Howdy,
3 FS2 NB
The Linux magnet is magnet:?xt=urn:btih:SD36UE42IMPAKVUXAXRF3FQH4QYM2
The Windows magnet is magnet:?xt=urn:btih:DD3CA4757LNNLEMGSQIN5JMPK23B6
For whatever reason, the SlashDot system _adds_ a space before the last two letters. Take that out when you pase the links. (e.g. it isn't "23FB", it's "23FB").
To use this, start Azureus and then File->Open->Location (or ctrl+L) and paste the magnet string into the dialog box.
But I was having login problems at work...
/sigh
ah, technology...
Depth is, for any non-trivial, non-binary tree, less than breadth. Therefore a strict breadth-first ordering in a FIFO involves FAR MORE data movement (copying) and function calling (enqueue+CTOR and DeQueue+assign etc) than the recursive solution.
So the recursive function is _more_ efficent and is _more_ elegant and robust and involves less memory (and so less vm interraction and higher degree of locality and probably less cache contention on modern hardware) because you don't have to look-aside from your active data to do queue management and your active dataset is constrained by your depth parameter.
For instance, at any given time, your complete active dataset is the current path from root to current node. So lets say this routine was traversing a slow-stroage tree (e.g. a database) or shared data structure, the total number of records that would have to be read-locked to acheive a consistent (safe) pass is CURRENT_DEPTH (a scalar quantity from 1 to X) while doing a breadth-first traversal with consistent (safe) read using a FIFO would require locking the current node plus all nodes who's depth is less than the depth of the current node. Not terribly elegent nor efficent.
To block out the lower portions of the tree in my sample code you only need to add the target depth to the test (and so the argument list, but everything costs something 8-).
In practice, in an advanced language, the traversal agent really ought to be a functor with the constraints and target node operations as members. But I digress.
In short, a FIFO (breadth first) traversal of a tree can never be more efficent than a recursive traversal in terms of temporary storage, copy operations, and at-risk (lock-worthy etc) nodes. That is why tree traversal is "naturally recursive."
Look it up.
For "a constrained operation on a tree" where the nature and order of the tree are unknown (e.g. as a generic operation) queue-based operations are "always" inferrior.
And as for graph traversals, if there are "cycles" then you don't have "a tree" you have "a graph" which is a completely different problem set. If the tree is immutable (constant or logically constant, or expensive to mark, or subject to multiple concurrent traversals) then you need to be able to construct a coresident data structure (typically a visitation set) to act as a dynamic boundary case and to prevent a traversal that looks artificially "leggy" you would want to use a FIFO.
But again, that's a GRAPH and not a TREE.
Look that up too
Now if you _know_ youre data set is likely to produce a leggy tree, or degenerate into a linked list or something, you would want a FIFO; just as if you know your tree is artificially broad (say that each node can have hundreds of direct children) you would want to avoid the FIFO as if your life depended on it.
Being "Completely Breadth First" in no way equates to "More Elegant" unless you are only interested in the breadth-first-i-ness for its own sake.
[BEGIN OLD GEEZER ASIDE]
When I was in my B.S.C.S. program back in 1982 I took this course called "The calculus of computer programming"; the course was terribly boring but the lab sessions were outstanding. We had a pascal compiler that would reject every data type but character and file-of-character (that's right, no integers etc), it ran on a mainframe and every compile was a compile-and-run; you were allowed 60 CPU seconds and 100-sheets of fan-fold paper from any run before the run was forcably ejected from the run-queue. And we were given "reasonably real" tasks like paginate the input file into two parallel running columns. [Not to "up-hill both ways" you, but you had to walk across campus to from the math building or student union to the CS building to pick up the printout too. 8-)]
I bring this up because having to implement things in such a (deliberately) broken environment led to either abject frustration or a zen-like fusion of patience and efficency. [Not to mention a disli
All other things being equal, all tree traversals run in linear time unless you try to break them on purpose.
The interviewer was wrong about his arguments because all the local variables need to be saved for any function call (recursive or not) so calling FIFO.put(x) is just as hard on the register-resident transients as anything else. It is even harder still on things if FIFO.put(x) needs to call new/malloc or a constructor.
Given the basic binary tree, and the nth-depth output requirement, it is hard to beat: (in C)
void Traverse(node *root, int target_depth) {
if (root) {
Traverse(root->left,target_depth - 1);
if (!target_depth) { do_output(*root); }
Traverse (root->right, target_depth - 1);
}
}
Since 100% of the "transients" are in the argument list there is strict linear cost to the single write-to-storage, you are really down to basic operations.
The C++/C-pound implementation passes references or pointers and so shouldn't incur any of the stupid member-copy operations.
And if you are going to complain about function overhead in general then you are _worse_ off with a queue because of the overhead cost of invoking the queue operations and copy/CTOR operations increases the "function calls per node visited" by some linear scaling factor N where N > 2. (call-left, call-right, vs enqueue which must copy/save, dequue which must assign).
If you don't beleive me, do the exercise both ways with similar optimizations and then profile the results.
Let's face it, tree traversal is prime amongst the _classic_ naturally recursive agorithms. The fact that it "can" be done by a queue is far from the idea that it "should" be done via a queue.
To give one coutner tweak, not to refute your post's valid points, but to point out something of the scientifically valid but largely lost, "ought not" position.
There is a ["strongly suspected"] link between consumption of cow milk and late onset adult diabities (sp?). The mother-to-child antibody/antigen process now understood to be implicit in mamal milk seems to produce an immune response in humans that is nearly identical to the autoimmune response that has been linked with the distruction of the insulin producing cells in the pancreas.
So there is some basis to believe that consuming a lot of cow milk over the course of a lifetime may increase your risk of developing adult-onset diabiates.
So while I agree that milk consumption has made the survival of various clutures possible, and it is probably one of those double-edged things. If you _can_ avoid it, or at least moderate it, you probably _should_.
As for the rest, I am not so much concerned, as an adult, with the presence of hormones or antibiotics in my food as I am about what the antibiotics are doing "out in the field". In particular the continuous sheding into the soil of the antibiotics and partially resistent intestinal flora/fauna via cow dung provides the ideal low continuous dossage exposure necessary to produce an optimal yiled of resistent bacteria. Since they now know that bacteria can directly communicate that resistence to other unrelated bacteria. The dairy farm (and actually probably the pig and chicken farms as well) has become probable wellspring of harmless but highly resistent bacteria that may then be capable of turning very harmful, but not previously exposed, bacteria into super-pathogens.
The mis-management of antibotics world-wide in the twentith century is probably the greatest slient crime against humanity of that (this) era.
There are all kinds of stupid magical tricks that can be used to tell if you are or are not blocking ads. There are also fairly basic ways to deal with this.
For instance, I have used Tools->Add Block->Preferences to select "hide ads" instead of "remove ads" to combat this very problem.
Once you understand the tools, you can combat the problems.
Examples:
The Microsoft Outlook preview pane (pain) opens all your email even if you don't mean to. When you right-click-and-delete a message Outlook opens it. The spammers can then "know" your email address is valid and a good spam target because when outlook opens the email it will fetch the images (at least the frist one) so that fetch (http get) tells them you are there.
This is germaine to this conversation of web sites because web sites cna do the same thing with cookies or, if you have cookies blocked, by adding arguments to the URLs of the sub-parts of the page.
So a URL of the format "http colon slash-slash my-site slash this-advert.jpg question-mark some-session-unique-tag" will cause the same this-advert.jpg to be delilivered to everybody and the server can harvest all the unique session tages to see who is or isn't getting the ads.
It is not uncommon for the intro page to have a web-bug (a one-by-one pixel graphic that is used to seed cookies or validate browser functions). That one tiny bit of dynamic html (etc) on just the one page can be quite effective at knowing what your guts do.
So, for instance, if you have the bandwidth (e.g. cable modem etc) you can "hide" the ads, but the computer still fetches them, so the sites cannot tell the difference.
I think hiding the ads I don't like (c.f. doubleclick and the similarly animated ads) costs doubleclick money for my "page view" and cannot possibly lead to a sale since not only won't I click on the ad, I won't even be tempted to, nor will I be infected with any "product awareness". Depriving someone (doubleclick) that does something that stupid (bouncy intrusive ads) of revenue while still contributing to their overhead is my civic duty... 8-)
And remember to use wildcards in your ad blocking, "http://*.doubleclick.net/*" is a completely unstopable way to banish a whole annoying domain from my life.
But still they pay the sites for my "page view" and they pay their bandwidth. I'm just doing my part to rid us all of their spamming, self-entitled leach-like business. _They_ after all, are free-riding on the bandwidth _I_ pay for.
For me, the sad part is that I was just considering going out to get a high-end Apple G5. It was going to make sense for several reasons, not the least of which was because it is a better platform for running Linux, and indeed for corss-compiling things for the embedded box my company uses.
Now there is this apocoliptic (sp?) horizion on such a purchase...
Sad to go the way of the cheap just to lose...
So who's distinctiveness was to be added to whom?
8-/
There are two statements missing from the "it's not for software" position. If these were added with appropriate legaleese, then things would be fine.
1) No patent, patent claim, or part thereof shall be held to govern the expression of an algorithm, process or procedure as a body of computer code.
2) No program, body of software, or part thereof which is or _can_ _be_ implemented for use on a general purpose computing device shall be held to infringe on _any_ patent.
These two declaratives prevent backdoor patents from being generalized from hardware into software.
The RIAA moves on the provider of illegal material and captures their server logs. There is proof-of-transfer of spesific content between parties who are not agents of the RIAA.
If they got those logs by any reasonably legal means (including legal arm-twisting and threatening) then they have evidence.
Find the server, compromise the server, find the client. Sue, threaten or extort the client. Profit!
The partial flaw of your analysis is that the memory "allocated" to the loaded shared object (in linux) is only virtually allocated, you are right. But, to page granularity, if you don't use the code paths then they arn't actually loaded anywhere and don't really take up any meaningful space.
/alt/(compiler_version)/{bin lib etc} trees I can have disctinct runtime inferance trees. Executing the programs is then a matter of point-and-shoot with LD_LIBRARY_PATH or the configuration of ld.so. It doesn't practically matter that I have an /alt/(version)/etc/ld.so.{config cache} as long as the executables know which one they are supposed to use.
In point of fact, the shared object mechanisim isn't broken in general, it fails "in detail".
I have several (Linux) systems with distinct and conflicting versions of the libc.so working just fine on a daily basis. [Yes, this is by common logic quite dumb, but it is necessary for reasons I will not go into here.] If you build the overall system "right" this is very easy to do.
By setting up
It "doesn't matter" to the system because the virtual file system in Linux will efficently deal with the multiple mappings of the same text images even if they come from separate loaders. That's what it is for.
Similarly, targeted dependencies via the definition of "versioned symbols" isn't rocket science either. It's all there to use, and the kernel does this very thing for its modules if you want it to, but the developers have to use the techniques.
"The system" cannot be relied uppon to make these issues go away.
Consider "nice portable Java", given or take deprecated interfaces and JINI, this system suffers from many of the things its designers tried to design away.
Even statically linking everything isn't a solution because the underlying hardware, and therefor the executing OS, simply _must_ evolve. And evolution isn't 100% backwards compatable.
So if people work on forwards compatability (new versions being supersets of old versions etc) you can do "pretty well" if you make sure not to install old stuff on top of new.
And that is an administration task that is only somewhat automatable.
At some point, people have to stop being dumb or suffer the consequences of their own ignorance.
Life sucks. 8-)
The requirement for fraud is, well, intent to defraud. IANAL, but my father was and one of his favorite bits of legal trivia was thus:
I can sign your name if you tell me I can, so there is no fraud if I sign your name without fraudlent intent.
Your signature doesn't have to be related to your name in any way; as long as it is something you use as your signature its valid. This goes back to illiterate persons "making their mark" to sign documents. You don't even have "a signature" you have as many signatures as you want to. For instance I have an added glyph I use on some kinds of documents, it cannot be represented in any current character set and it will botch any OCR scan. It has its uses... but it only shows up on some things.
The "signature card" on a bank account and the place to sign on the back of a credit card exist solely to act as arbiters; they exist only to define what your signature is on that account. In this respect the signatures involved are simple, anonymous key matching operations.
I can sign my name to where yours should be, but if I do so with the intent to pass-off and say that what I wrote is supposed to be your signature, it doesn't matter that the letters spell out my name, by presenting the document as something signed by you (the authorized party etc) I am engaged in fraud.
If you mean to defraud it is fraud.
For all your dancing, you _write_ software; actually it is fairly obvious that _you_ don't write software, but software is "written".
Copyright says you cannot steal my written work.
Pretty much a perfect fit there.
Have you ever bought a "bad" piece of software? Have you then gone out and replaced it with a "good" pice that does the job better?
Software patents prevent this replacement because the "bad" piece owns the applicaton space. They own the idea. So there can only be one piece of tax prepration software. There can only be one piece of web server software. and so on. So there is no reason for the "owner" of "prepairing anual income tax returns using a computer" to _have_ _to_ improve his POC software because there is no better alternative to his POC.
Software patents are the oposite of capitalisim.
Software patents are imperialist. Various entities create fifes and kingdoms of "features" and "methods" and share wealth amongst the peerage while giving the serfs no access beyond their megar largess.
Software patents are soviet. The issuing soviet (USPTO here) grants exclusive domain over an idea to a collective (corporation) or comrade (individual) and leaves them wholy responsible for the implementation of that idea. As the responsible collective is given no other leverage for their position than to apply to another soviet (the legal system).
Etc.
People regularly patent common sense and existing process by tacking on "with a computer" or "on the web" and businesses to date don't seem to understand why that is bad.
But they will.
The fact is simple, there is no idea in computing that isn't so dependent on previously expressed programs that it _deserves_ more than copyright protection.
If you do "negative analysis", that is if you subtract everything that you have seen before from a patent, and everything that you may not patent separately from a patent; in software patents you end up with nothing but "a purpose." That is, the processes behind a "business process patent" aren't innovative.
This isn't a "broadcast flag" its a "prior restraint flag."
Make it a selling point. "Now you crooks can't steal(*) from us innocent corporations!" and "Now with less confusing features!" "No more Blinking VCR clock!".
Have a big splashy logo with "Prior Restraint -- Now we are all Safe" emblazoned on its paraphry and handcufs bound by antena wire in the center (all nicely designed by a good marketing firm).
As long as each television set and "protected" broadcast has to have the big "Prior Restraint Flag" logo splashed on it, go ahead. See how it sells _then_.
That would, after all, be required under the truth-in-advertising and disclosure laws.
8-)
Let's see, the sect of Christianity least likely to lose its members is Satinism. Would you be offended if your child, while not having to say the prayer, were forced to stand or sit and listen to an invocation of Satan once a week?
After all, your children _aren't_ being forced to say the invocation, they can sit it out just fine, as long as they listen respectfully and don't offer a disrespect to the beliefs of others.
How about a quick chicken-blood splash of Vodun?
Five minutes of Scientology "Confront Technology" (e.g. getting yelled and at and threatened, and then getting punished if you react in the slightest)? Even if they "only" have to watch it happening to other students?
Hindus outnumber Jews and Christians combined, so how about this schedule: Genesh on Mondays, Wicca on tuesdays, Yaweh (Jewish) on Wednsday, Kali on Thursdays, Yaweh (Christian) on Fridays, and Satan on special event Saturdays, Allah Field Trips and pre-game prayers; and a reading from Dianetics the first day back from summer vacation each year. Nobody has to join in, but they can all have to sit respectfully quiet while it is going on.
After all, but spreading it out
===
It's like second hand smoke and getting shot. "Rights" exist in competition, and the right "not to" do/participate ALWAYS trumps the right to do something.
e.g.
-- I have the right to smoke. You have the right not to be forced to breathe my leftovers.
-- I have the right to keep and bare (and so shoot) arms. You have the right not to be gunned down at the Circle-K.
-- I have the right to preach that (your ethnic/spritiual group) is sinful or sub-human and deserves (some negative end). You have the right to demand that I not force your child to listen to my crap; and your child has the right to make that demand even if you wont; either of which means that I am not allowed to do it in your childs school.
The "they don't have to participate as long as the sit there and take it" isn't a reasonable position once my shoe is on your foot.
===
"Freedom of religion" means freedom _FROM_ religion.
Imagine the hue and cry that would result if someone were to buy a mountain top and erect a giant pentagram-on-a-stick or Goat-Head or Horned-God to stare down beautifically on your township. There is no dogma provided, and nobody is being forced to even look at the thing. But it is there, and someone will be botherd by it, I garantee. And someone who probably woudn't know the first thing about the variant meanings of the symbols because both the message sent and the message perceived count.
===
But I agree the separation of church and state should extend to our money and our documents. That "natural god" and "all men are endowed by their creator" are historical legacies, but the "under god" that was revised into the pledge (and which breaks the scansion) and the "in god we trust" should be expunged from the money too.
Wednsday May 19, 2004 I tried to post the progenetor of this to slashdot and got rejected. In particular I bought a top-of-the-line wide-screen HP (7130 ?) laptop with Media Center et al. It kept blue-screening so after two complete re-installs of windows I went to the HP site and got the BIOS update.
After installing the new bios the box complained that my the build-in wireless board was not kosher ("authorized" is, I beleive, the correct word) and that I would have to remove the wireless board if I wanted the laptop to boot.
I elected not to play...
I returned it to Frye's for a complete refund.