Sorry, this bill would be too ridiculous for any politician to promote. It wouldn't get a single vote. You could get some votes for a bill written by a large corporation who wanted five cents per email. But the post office?
Here's something that Tom Christiansen posted
sometime back.
eval 'exec perl -p -S `echo $0 | sed "s/.*\///" ` ${1+"$@"}'
if 0;
#
# code2html - convert code to html for posting to slashdot
#
# tchrist@perl.com
# Sunday, December 19th, 1999
BEGIN { print "<TT>\n" }# and the spirit of awk...
# first kill all the tabs
1 while s{ \t + }
{ " " x (length($&)*8 - length($`)%8) }ex;
# then the four standard naughty bits
s/&/&/g;&a mp;a mp;a mp;a mp;nbsp;# must remember to do this one first!
s/</</g;& ; ; ;;nbsp;# this is the most important one
s/>/>/g;& ; ; ;;nbsp;# don't close too early
s/"/"/g; # only in embedded tags, i guess
# make lines break where they should
s/^\s*$/<P>/ || s/$/<BR>/;
# make sure spaces aren't squishticated so we
# can do indentation and properly align comments
s/( {2,})/' ' x length($1)/ge;
END { print "</TT>\n" } #...shall be with us always
Would you rather wait until corporate consumers clamor for price controls on Microsoft software? Virtually all government regulations on business are written by corporate lawyers and sponsored by their client congressmen.
Ironically, monopolies cause other businesses to clamor for regulation (e.g. public utilities, phone and cable companies). True competition reduces the need for regulation. Stopping abuses of monopoly power is by far the easiest way for the government to minimize its involvement in the economy. Currently Microsoft has a monopoly in the PC operating system market, and Microsoft abuses that power.
Painful years of C++ refactoring forced me
to come up with some rigid personal rules for
managing the ownership of C++ objects.
For example, class members should always be pointers. Method arguments and return values should always be references. Avoid using null pointers as flags. When ownership of an object is passed to another, add a flag that that makes it optional. This sort of non-stop distraction is the reason I now write most everything in Java.
The core Java language has changed very little. The last major new feature was inner classes when 1.1 came out years ago. New packages appear, but that seems like a requirement for a popular language. Do you not think that C# API's will proliferate? Do you not expect that some methods in C# API's will be deprecated (at least a fast as any other MS API)? The number of methods deprecated in Java packages seems rather small, considering the size. I find Java much more stable, as a language, than C++ compilers compared on different platforms. When will C++ template instantiation stabilize? When will we have a reliable consistent way to use strings in C++ across different platforms?
For pure object-oriented design, I like "Design Patterns" by Gamma et al (Addison Wesley), and "Object-Oriented Design Heuristics" by Riel (Addison Wesley). Gamma et al (known as The Gang of Four) make a definitive inventory of patterns that EVERYONE must know. Riel's book does a better job of explaining where the patterns came from.
For UML, I prefer the UML Modeling Language User Guide by Booch, Rumbaugh, and Jacobson (Addison Wesley). More than other references, this book stresses constructs that you are likely to use most often.
The ideas in "Refactoring" by Fowler (Addison Wesley) seem almost entirely self-evident. Nevertheless, by reading this book, I improved my coding habits immediately. This book shows how to evolve a design as you code.
Here is a quicksort in Haskell from http://www.haskell.org/aboutHaskell.html: qsort []= [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x= [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x]
Functional languages work recursively, but they make your mind work inductively . If you can handle going from n to n+1, then you can handle any depth of recursion.
Native code should be able to change or be recompiled without using a different Java compiler or Java VM. I use native code on three different platforms (NT, Solaris, and Linux), but I never have to change the Java or recompile the byte code: only the native code changes. MS would have forced me to write multiple versions of the Java as well. MS introduced new keywords into the language. They abused javadoc comments to introduce compiler directives that load native code. Here's a quote from the preliminary injunction explaining how they broke the byte code as well.
The Java Virtual Machine Specification indicates that the runtime interpreter should ignore any attribute which it does not recognize. JVMSpec. at 106, 107. However, with respect to the "@dll" and "@com" compiler directives, the proper functioning of a software application requires recognition of a new attribute which contains necessary additional information, rather than mere descriptive information which a virtual machine can safely ignore. Accordingly, the binary file which results from use of Microsoft's compiler directives violates the Java Virtual Machine Specification since it contains a new attribute that affects program behavior.[7]
If only the Foo class cares about Animals, then I actually prefer to see Foo.Animal.PIG. The extra scoping improves clarity. Someone who doesn't care about Foo can immediately ignore Animals. If a Bar class also cares about Animals, then I make Animal a top-level class. You have just Animal.PIG, and you see that they might be used anywhere.
Similarly, I like to have Exceptions and Interfaces become nested classes in Foo when only Foo cares about them. Rather pretty I think.
The "About USWest" link says "USWest is now Qwest" and points to the Qwest page. The Qwest page reads like a lame corporate brochure for shareholders. No useful information at all. Not too impressive for an internet company.
I've used PacBell, SouthWestern Bell, and now USWest, and by far, USWest is the USWorst. Everyone at my office has a story to tell about attempting for months to get either ISDN or DSL installed. The installers set date after date, and never show up. Billing screws up over and over, and orders disconnections. Most everyone has at least one experience of having their fast line abruptly disconnected for weeks, for no obvious reason. (Happened to me five times in three years.) Others never get any service.
I wonder. Does Flourinert destroy the ozone layer like Freon? If it contains flourine, then I bet it does. That's probably why they don't sell it to just anyone. If so, it should never be exposed to the open air as in this experiment.
The US has truth-in-lending laws that require lenders to show clearly the true cost of a loan, in a standard format. If "free" PC's are financed, then it seems reasonable to require them also to show the true cost, with equal clarity.
It's not hard to distribute a JRE with your product. That's what the JRE is for, and you don't need special permission. Just consider the JRE a part of your application. Or write a slightly fancier installer that looks for a new enough JRE first. Or use a Java to native code compiler. Is this harder than checking that the system has up-to-date DLL's, and trying to update them safely? I'd say the JRE is way easier.
What happened to Java's inner classes in C#? I suppose they made Delegates seem redundant. Unfortunately , Delegates (i.e. function pointers) cannot be so easily upgraded to a full class with state. Inner classes come in three handy flavors: anonymous, static, and non-static. The anonymous kind are perfect for callbacks and listeners, the main use of Delegates. The static kind are perfect for scoping public Exceptions and Interfaces with the one outer class that uses them. The non-static kind are great for hiding the private implementation of interfaces exported by the outer class. All this and more, without having to introduce the idea of function pointers. Unfortunately, to Microsoft "language independence" means "has the same compiled representation of an array of function pointers," i.e. C++ vtables, i.e. COM.
I expected a few more differences from Java actually. Changing keywords like "final" to "readonly" seems to be straining to be different.
The new "get" and "set" methods on member variables was the most novel to me and looked very attractive for a few minutes. It seemed superior to naming conventions like "setX(X)" and "X getX()" for methods in beans. But... what if you decide to eliminate X as a member and calculate X's value from other members, or delegate to another class? How do you change the implementation of a "get" attached to a variable X? This style discourages refactoring. Anyway, get and set methods are usually a sign of poor encapsulation. Why encourage making every variable public?
Delegates are a greater "innovation," but have been well dissected since they appeared in J++. Anonymous inner classes accomplish the same task just as concisely and are more easily upgraded to full classes. Delegates are a language feature unto themselves, but inner classes are just classes. The COM legacy seems to make it impossible for MS to live without function pointers. (That's their definition of "language independence": i.e. all languages should understand arrays of function pointers.) Eventually the simplest function seems to need some state, and then, surprise, you wish you had a class instead of a function pointer.
I must congratulate MS on finally surrendering macros and the preprocessor. Yay! This is real progress.
An experienced Java programmer could probably learn this language in the same amount of time that it takes to learn J++. The hardest change would be the capitalization scheme. So far, I can't see a single feature that would make me more productive.
File locking just doesn't scale well to a larger number of developers. Even five developers can be too many if they work on the same files. Too often someone will preemptively lock a file or forget to check it back in. With good merging functionality, you can keep updating your modified copy with changes that others are checking in. You can see that someone else is working on a file without requiring them to lock the file.
VSS is great evaluation-ware (better than demo-ware). After using it for half an hour, you'll be convinced that it does everything you need. After you've made the commitment, you'll discover otherwise.
VSS uses an extremely chatty protocol (good old DCOM), so I find VSS unusable offsite. Latency is terrible. Over ISDN, it takes five minutes to navigate to the proper subfolder, check out a file, and check back in a modified version. Many at my office buy the third-party Source Offsite: their proxy translates into a more sensible protocol for their own client.
You'll also need a third-party client if you want to build your code on anything but Windows(TM). We must build on NT, Linux, and Solaris, so all our Unix synchronization was scripted by hand, to selectively update from Samba mounted drives. In effect, we've build our own source-control system alongside VSS.
We've found that the only safe way to synchronize a working copy of a VSS directory is to delete the entire branch of the tree and get a fresh copy. Otherwise, you'll never notice what files others have deleted or what new files you've forgotten to add to the tree. We've had the build break five days in a row for this very reason. When I check out files, I make a mirror copy of the directory under RCS, then use scripts to update VSS. My VSS tree is constantly deleted and refreshed to ensure real synchronization with the rest of the team.
The problem would be alleviated by changing "working folders" except that working folders do not work in any rational way. You'd like to switch between your polluted copy of a tree and a clean copy to check that your changes are compatible with others' more recent changes. You find that when you switch the working folder at the root of a tree, some sub-folders (sub-directories) remain with the old tree if files are checked out. You then discover that, by default, the same file will check out into one working folder and check in from another working folder. Yet time stamps and diffs make you think you checked in from the folder you put the file into and modified. Only when you delete and get a fresh copy of the tree, do you discover that you checked in the wrong version. To undo the damage, you must visit and reset every directory in the tree. You'll never try to change working folders again. (Everyone on the team tried it once and regretted it.)
As soon as we reach our next major milestone in August, we plan to switch to CVS. I used Clearcase for years and would also prefer it to VSS.
George Bush Jr visited Redmond and said he "prefers innovation over litigation." Microsoft understands those code words perfectly. The IBM case was dropped in 1981 by Reagan's new assistant attorney general for antitrust. A delay could work out very well for Microsoft.
Sorry, this bill would be too ridiculous for any politician to promote. It wouldn't get a single vote. You could get some votes for a bill written by a large corporation who wanted five cents per email. But the post office?
eval 'exec perl -p -S `echo $0 | sed "s/.*\///" ` ${1+"$@"}'
if 0;
#
# code2html - convert code to html for posting to slashdot
#
# tchrist@perl.com
# Sunday, December 19th, 1999
BEGIN { print "<TT>\n" }# and the spirit of awk...
# first kill all the tabs
1 while s{ \t + }
{ " " x (length($&)*8 - length($`)%8) }ex;
# then the four standard naughty bits ;nbsp;# this is the most important one ;nbsp;# don't close too early
s/&/&/g;&a mp;a mp;a mp;a mp;nbsp;# must remember to do this one first!
s/</</g;& ; ; ;
s/>/>/g;& ; ; ;
s/"/"/g; # only in embedded tags, i guess
# make lines break where they should
s/^\s*$/<P>/ || s/$/<BR>/;
# make sure spaces aren't squishticated so we
# can do indentation and properly align comments
s/( {2,})/' ' x length($1)/ge;
END { print "</TT>\n" }  ;# ...shall be with us always
Would you rather wait until corporate consumers clamor for price controls on Microsoft software? Virtually all government regulations on business are written by corporate lawyers and sponsored by their client congressmen.
Ironically, monopolies cause other businesses to clamor for regulation (e.g. public utilities, phone and cable companies). True competition reduces the need for regulation. Stopping abuses of monopoly power is by far the easiest way for the government to minimize its involvement in the economy. Currently Microsoft has a monopoly in the PC operating system market, and Microsoft abuses that power.
Painful years of C++ refactoring forced me to come up with some rigid personal rules for managing the ownership of C++ objects. For example, class members should always be pointers. Method arguments and return values should always be references. Avoid using null pointers as flags. When ownership of an object is passed to another, add a flag that that makes it optional. This sort of non-stop distraction is the reason I now write most everything in Java.
The core Java language has changed very little. The last major new feature was inner classes when 1.1 came out years ago. New packages appear, but that seems like a requirement for a popular language. Do you not think that C# API's will proliferate? Do you not expect that some methods in C# API's will be deprecated (at least a fast as any other MS API)? The number of methods deprecated in Java packages seems rather small, considering the size. I find Java much more stable, as a language, than C++ compilers compared on different platforms. When will C++ template instantiation stabilize? When will we have a reliable consistent way to use strings in C++ across different platforms?
How many companies could justify the license fees of so many W2K servers?
For UML, I prefer the UML Modeling Language User Guide by Booch, Rumbaugh, and Jacobson (Addison Wesley). More than other references, this book stresses constructs that you are likely to use most often.
The ideas in "Refactoring" by Fowler (Addison Wesley) seem almost entirely self-evident. Nevertheless, by reading this book, I improved my coding habits immediately. This book shows how to evolve a design as you code.
Verbification of the noun verb can be renouned by nounification.
Good troll, anyway. You pushed all the right buttons.
Here is a quicksort in Haskell from http://www.haskell.org/aboutHaskell.html:
qsort []= []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x= [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
Functional languages work recursively, but they make your mind work inductively . If you can handle going from n to n+1, then you can handle any depth of recursion.
Similarly, I like to have Exceptions and Interfaces become nested classes in Foo when only Foo cares about them. Rather pretty I think.
Thanks. I copied my linux /etc/hosts file to C:\WINNT\SYSTEM32\drivers\etc\HOSTS and immediately doubleclick.net went away forever.
I've used PacBell, SouthWestern Bell, and now USWest, and by far, USWest is the USWorst. Everyone at my office has a story to tell about attempting for months to get either ISDN or DSL installed. The installers set date after date, and never show up. Billing screws up over and over, and orders disconnections. Most everyone has at least one experience of having their fast line abruptly disconnected for weeks, for no obvious reason. (Happened to me five times in three years.) Others never get any service.
Windows NT has no c:\windows\hosts file. What would the equivalent be?
I wonder. Does Flourinert destroy the ozone layer like Freon? If it contains flourine, then I bet it does. That's probably why they don't sell it to just anyone. If so, it should never be exposed to the open air as in this experiment.
The US has truth-in-lending laws that require lenders to show clearly the true cost of a loan, in a standard format. If "free" PC's are financed, then it seems reasonable to require them also to show the true cost, with equal clarity.
It's not hard to distribute a JRE with your product. That's what the JRE is for, and you don't need special permission. Just consider the JRE a part of your application. Or write a slightly fancier installer that looks for a new enough JRE first. Or use a Java to native code compiler. Is this harder than checking that the system has up-to-date DLL's, and trying to update them safely? I'd say the JRE is way easier.
public final static class Animal {
public final static Animal
PIG = new Animal(),
COW = new Animal(),
HORSE = new Animal();
private Animal () {}
}
What happened to Java's inner classes in C#? I suppose they made Delegates seem redundant. Unfortunately , Delegates (i.e. function pointers) cannot be so easily upgraded to a full class with state. Inner classes come in three handy flavors: anonymous, static, and non-static. The anonymous kind are perfect for callbacks and listeners, the main use of Delegates. The static kind are perfect for scoping public Exceptions and Interfaces with the one outer class that uses them. The non-static kind are great for hiding the private implementation of interfaces exported by the outer class. All this and more, without having to introduce the idea of function pointers. Unfortunately, to Microsoft "language independence" means "has the same compiled representation of an array of function pointers," i.e. C++ vtables, i.e. COM.
The new "get" and "set" methods on member variables was the most novel to me and looked very attractive for a few minutes. It seemed superior to naming conventions like "setX(X)" and "X getX()" for methods in beans. But... what if you decide to eliminate X as a member and calculate X's value from other members, or delegate to another class? How do you change the implementation of a "get" attached to a variable X? This style discourages refactoring. Anyway, get and set methods are usually a sign of poor encapsulation. Why encourage making every variable public?
Delegates are a greater "innovation," but have been well dissected since they appeared in J++. Anonymous inner classes accomplish the same task just as concisely and are more easily upgraded to full classes. Delegates are a language feature unto themselves, but inner classes are just classes. The COM legacy seems to make it impossible for MS to live without function pointers. (That's their definition of "language independence": i.e. all languages should understand arrays of function pointers.) Eventually the simplest function seems to need some state, and then, surprise, you wish you had a class instead of a function pointer.
I must congratulate MS on finally surrendering macros and the preprocessor. Yay! This is real progress.
An experienced Java programmer could probably learn this language in the same amount of time that it takes to learn J++. The hardest change would be the capitalization scheme. So far, I can't see a single feature that would make me more productive.
File locking just doesn't scale well to a larger number of developers. Even five developers can be too many if they work on the same files. Too often someone will preemptively lock a file or forget to check it back in. With good merging functionality, you can keep updating your modified copy with changes that others are checking in. You can see that someone else is working on a file without requiring them to lock the file.
VSS is great evaluation-ware (better than demo-ware). After using it for half an hour, you'll be convinced that it does everything you need. After you've made the commitment, you'll discover otherwise.
VSS uses an extremely chatty protocol (good old DCOM), so I find VSS unusable offsite. Latency is terrible. Over ISDN, it takes five minutes to navigate to the proper subfolder, check out a file, and check back in a modified version. Many at my office buy the third-party Source Offsite: their proxy translates into a more sensible protocol for their own client.
You'll also need a third-party client if you want to build your code on anything but Windows(TM). We must build on NT, Linux, and Solaris, so all our Unix synchronization was scripted by hand, to selectively update from Samba mounted drives. In effect, we've build our own source-control system alongside VSS.
We've found that the only safe way to synchronize a working copy of a VSS directory is to delete the entire branch of the tree and get a fresh copy. Otherwise, you'll never notice what files others have deleted or what new files you've forgotten to add to the tree. We've had the build break five days in a row for this very reason. When I check out files, I make a mirror copy of the directory under RCS, then use scripts to update VSS. My VSS tree is constantly deleted and refreshed to ensure real synchronization with the rest of the team.
The problem would be alleviated by changing "working folders" except that working folders do not work in any rational way. You'd like to switch between your polluted copy of a tree and a clean copy to check that your changes are compatible with others' more recent changes. You find that when you switch the working folder at the root of a tree, some sub-folders (sub-directories) remain with the old tree if files are checked out. You then discover that, by default, the same file will check out into one working folder and check in from another working folder. Yet time stamps and diffs make you think you checked in from the folder you put the file into and modified. Only when you delete and get a fresh copy of the tree, do you discover that you checked in the wrong version. To undo the damage, you must visit and reset every directory in the tree. You'll never try to change working folders again. (Everyone on the team tried it once and regretted it.)
As soon as we reach our next major milestone in August, we plan to switch to CVS. I used Clearcase for years and would also prefer it to VSS.
I see no sign of plagiarism. They simply observed the same wonderful world of music exploitation. And Courtney's speech/essay is better written.
George Bush Jr visited Redmond and said he "prefers innovation over litigation." Microsoft understands those code words perfectly. The IBM case was dropped in 1981 by Reagan's new assistant attorney general for antitrust. A delay could work out very well for Microsoft.