Happy Run Some Old Web Browsers Day!

Happy Run Some Old Web Browsers Day!

In honor of the ten year anniversary of the Mozilla project, home.mcom.com, the Internet Web Site of the Mosaic Communications Corporation, is now back online.

It took some doing. There is comedy.

First, the fun stuff:

  • Until now, home.mcom.com and all URLs under it just redirected to netscape.com, then redirected a dozen more times before taking you to some AOL portal page. The old URLs that were baked into the toolbar buttons of the original web browsers didn't work any more. But now, if you fire up a copy of Mosaic Netscape 0.9, and click on the various toolbar buttons, they will work again! For example, in the old browsers, when you clicked on the "What's New" toolbar button, it went here.
  • home.mcom.com is now a snapshot of that web site from 21-Oct-1994.

  • mosaic.mcom.com is now a snapshot of that web site from July 1994. That's from just after the company was announced, but before the first browser beta was released. I think that by Oct 1994, both mosaic.mcom.com and www.mcom.com were redirects to home.mcom.com, but I can't remember any more.

  • In order to make these web sites work in the old browsers, it was necessary to host them specially. In this modern world, a single server will typically host multiple web sites from a single IP address. This works because modern web browsers send a "Host" header saying which site they're actually looking for. Old web browsers didn't do that: if you wanted to host a dozen sites on a single server, that server had to have a dozen IP addresses, one for each site. So these sites have dedicated addresses!

    The web server also had to be configured to not send a "charset" parameter on the "Content-Type" header, because the old browsers didn't know what to make of that.

  • Trivia Question #1: Do you remember why home1.mcom.com through home32.mcom.com exist?

  • Trivia Question #2: Do you remember the behavioral difference the browsers exhibited when they were talking to a Netscape web server?

  • Trivia Question #3: When was the <HYPE> tag implemented, and what was its origin?

  • I had originally planned on re-hosting these web sites on an SGI Indy running Mosaic Netsite Commerce Server, just for maximal comedic value... and to see how long it took before someone Øwned it, since there must be someone out there who still remembers how to launch an assault on Irix 5.3. Unfortunately, that wasn't possible for political reasons explained below.

Trivia Answers:

  1. home1.mcom.com through home32.mcom.com exist because the early browsers did client-side load-balancing: the browser itself had a special case where if it was loading "home.mcom.com" it would actually pick a random number from 1 to 32 and instead load "homeN.mcom.com"! Those were physically different servers in the Netscape data center.
  2. When loading pages from a Netscape server, the caption next to the URL field in the browser would change from "Location" to "Netsite".

  3. Not telling.

Enough about all that, I want to run some old browsers!

  • My personal collection of old Netscape browsers is here: home.mcom.com/archives/. It's not complete, but it's all that I could find. (It is missing some key releases, such as Netscape 0.4 for Irix, which was the first release to ever leave the building; and the "non-exportable"-crypto versions of almost all of them.)

    If you can publicly mirror these, please do! I know of a few mirrors so far: edlang.org, nothings.org, fauxpaw.com, and moar.jp. Torrents, anyone?

  • Linux users: You can run Mosaic Netscape binaries as old as 0.93 on modern Linux systems! You need to load the "a.out" module in the kernel, and install some really old libraries:

    Since pulling all those files out is kind of a pain, I've put together a tarball: netscape-linux-libs.tar.gz. Unpack it in your root directory. It shouldn't conflict with anything modern. I've tested that on Red Hat 9 and Ubuntu 7.10.

  • Mac users: If you're using a modern Mac, you need to use an emulator.

    • Download BasiliskII and BasiliskIIGUI from Emaculation. Note: there are apparently a number of projects that call themselves "BasiliskII 1.0", but the one linked here seems to be the only one that actually works.
    • Download Quad650.zip and MacStartup.img from Redundant Robot (a Mac ROM and disk image of MacOS 7.5.5).

    • Launch "BasiliskIIGUI". Under "Volumes", add "MacStartup.img", and point "Unix Root" at your desktop or something (so that you can transfer the old Netscape installers into the emulator).

    • Under "Network", set Ethernet to "slirp".

    • Under "Memory", set model to "Quadra", CPU to 68040, and ROM file to the (unzipped) Quadra ROM. Turn on JIT. Set your screen size to something sane.

    • Start the emulator, launch "StuffIt Expander" and unpack the "netscape1_0.sea.hqx" file. (You can't just double-click it.)

    • Launch the "netscape1_0.sea" self-extracting archive. And you're in business!

    • Alternately! Instead of un-StuffIt-ing each browser, you can just download this System 7 disk image that I made: netscape-mac.img.zip (59MB) which contains each of the unpacked Mac executables from 0.9 through 4.04.

    • Note that if you want to run 0.9, you'll have to set your (real) system clock back to 1994 to get around the time-bomb. (0.93 and later don't have a time bomb.)

  • Once you've got those old browsers running, you'll find that they're working fine with the mcom.com web sites, but they fail on just about every other web site in the world (for the "Host" header reason I described above).

    I have a fix for that!

    I wrote a small proxy server that bidirectionally translates the HTTP/1.0 protocol spoken by old web browsers to the HTTP/1.1 protocol spoken on the modern web. Download and run http10proxy.pl. (You may need to install the Net::Server::Fork Perl module first.) Then, go into the preferences on your ancient browser and set "HTTP Proxy" to localhost, port 8228. This will adjust outgoing Host headers as well as incoming Content-Type headers.

What Was That About Politics?

    When I heard that AOL was shutting down their Netscape division for good, I mailed a contact there and asked if they'd transfer the mcom.com domain to me, so that I could resurrect these web sites to make the old browsers work right.

    My contact asked around, and much to my surprise, the answer was yes! Wheels were put in motion, AOL's operations folks removed their dependencies on those domains (no idea what those were!) and the domains were about to be transfered... when...

    AOL Chief IP Counsel and Time Warner blocked it.


    Because their lawyers determined that, because mcom.com is ten years old and four letters long, they could make several hundred thousand dollars by simply putting it on the market and selling it to a spammer!

    And so they began the process of doing exactly that.

    Fortunately, my contact (who prefers to remain anonymous) talked them out of this, pointing out that it would be perhaps not the best PR move. But still, they wouldn't transfer it to me. AOL still owns the domains. However, they were willing to host the old Netscape content there, at least for now.

    So, thank you to my anonymous contact for all the help! And thank you to AOL for hosting these historic web pages. And for not (yet?) selling the domain to a spammer.

Tags: , , , , ,

Mozilla ten year anniversary party

A few people have asked me "WTF! Why isn't there a Mozilla party at DNA??" Well, there was going to be. In a nutshell, here's what happened:

I offered them the club rent-free, and offered to do the legwork of booking entertainment, once they told me what their entertainment budget was. I got them several price quotes. Weeks went by, and their budget turned out to be "some spare change we found in the couch." Also, they intentionally didn't publicize it at all, because they decided that they didn't actually want the public showing up. "There are a bunch of reasons for this", they told me. I don't know what those reasons are.

A huge nightclub like DNA Lounge is the wrong place for something like that. So, they're having their low-key insiders-only mixer somewhere else. My understanding is that if you don't already know about it, they don't really want you to know where it is.

Oh well.

Tags: ,


Most disconcerting
of "xeyes" ever.
Tags: ,

mixtape 024

Please enjoy jwz mixtape 024.

Consisting of roughly 50% music that I've discovered within the last month! So very current. You will contemplate. You will discuss. You will recommend. You have your orders. Carry on.

Tags: ,
Current Music: as noted

Invisible Sky Fairy unavailable for comment

Business Owners, Customers, Unicorns Upset Over Controversial Billboard
"When you condemn all religions and say they are a fairytale that is wrong," said Rich Stormes, a nearby business owner.

The billboard went up a week before Easter and business at the restaurant went down. "Easter Sunday is usually a busy good day," said John Russel, an employee at Straub's. "Easter Sunday business was down by two thirds."

MediaNet said it had no idea the sign was there and someone put it up illegally in the middle of the night.

The billboard rents for $1,400 a month. If an anti-religious group paid to rent it legitimately there is no telling how long it would have been up.

Tags: ,

dnalounge update

DNA Lounge update, wherein the daystar is of no use to us.

public space 2

A few months back I wrote about the "public space" zoning regulations. There's now been a new article about it. I don't think there's much new information there that wasn't covered in the links you folks posted in the comments, but there is a pretty slick Google Maps display of all the spaces mentioned in the article.

Oh, and that one on 2nd Street that I made fun of? "Enclosed empty concrete lobby as public park"? The article says, "Though passers-by must pass through doors to use the chairs and black granite benches, the space feels like an urban piazza."

Suuuure it does.

Tags: , ,

And now, giant squid.

I'm sorry if that last post was a little nerdy. Here, have some giant squid homo tentacle rape.

Although mating has never been observed in giant squid, it is thought that what happens is that the male injects his sperm packages into the female's arms. The process is likely to be a fairly violent affair as the female is probably not that keen on being injected. This is a problem for the amorous male as females are normally a third bigger than they are.

But males get round their inferior size by being endowed with a particularly long penis, which means they can inject the female without having to get too close to her chomping beak. The male's sexual organ is actually a bit like a high-pressure fire hose and is normally nearly as long as his body - excluding legs and head.

But having such a big penis does have one drawback: it seems that co-ordinating eight legs, two feeding tentacles and a huge penis, whilst fending off an irate female, is a bit too much to ask, and one of the two males stranded on the Spanish coast had accidentally injected himself with sperm packages in the legs and body. And this does not seem to have been an isolated incident since two of the eight males that had stranded in the north-east Atlantic before had also accidentally inseminated themselves.

It is also possible that the sperm packages had come from other males that they had 'bumped' into, in the dark depths of the ocean. However, the sperm packages ended up in the squid - it is just another part of the mysterious lives of these creatures of the deep sea.

Also, spiders.

Many spiders exhibit sexual dimorphism as well, typically with the female much larger than the male. In spiders of the genus Tidarren, this trend is carried to an extreme, with males that may be 1% of the female's size. Here's a photo of one of these little guys clinging to his girlfriend's underside, copulating frantically (there is cause for hurry, since she might decide to eat him). [...]

Shortly after the adult molt, male T. sisyphoides trap one in a bit of spider silk and twist it off. Voluntarily. A kind of willing hemipenectomy. One has to cringe at the thought, but I suppose I can sympathize -- if I had a pair of penises the size of volleyballs and weighing 10 pounds each attached to my cheeks, I might want to get rid of one, too.

Tags: , ,


Hey kids, here's a story from the Unfrozen Caveman Files!

I was telling someone about about this the other day, and it's time that Google said something other than "Your search - most-positive-bignum - did not match any documents" so here it is.


In Common Lisp, there are two types of integers: small ones, which are what you expect; and "bignums", which the specification says should have no upper limit on their range. Fixnums are immediate values (not objects) and bignums are compound (allocated) objects. All the math functions work on either, promoting results to bignums as needed.

So, there is a constant called MOST-POSITIVE-FIXNUM, which is the largest representable "immediate" integer. C calls this MAXINT, and in a C world, it's generally 2^31-1. Because of the type bits on every word, in Lisp it's typically smaller than that. On TI Explorer Lisp Machines it was 2^24-1 (32 bit word, 7 bits of tag).

Here Comes the Dumb:

Well, I was poking around in the system's basement one day, and realized that their implementation of bignums did have an upper limit! A bignum was implemented as an array, with no facility to tack on a second array, so the limit was related to the size of the length field in the array header (instead of being limited by available memory).

So I went and consed up MOST-POSITIVE-BIGNUM.

I did this by carving out a chunk of memory of the proper size for the underlying array, filling it with the right pattern of ones, and slapping an appropriate type tag on the front so that the system would recognize it.

(These sorts of tricks are exactly the sort of things that Java goes out of its way to prevent you from doing, and that's part of why it's impossible to write efficient programs in Java. Whereas the whole Lisp Machine operating system was written in Lisp.)

Fun facts:

  • It is 1,223,146 decimal digits (that's 1.0e1223146).
  • The object representing it consumes 524 KB of RAM.
  • The largest known prime passed it in 1999.
  • If you add one to it, e.g.: (1+ MOST-POSITIVE-BIGNUM) you get zero. But it's a zero that consumes 524 KB, and is not = to 0.
  • If you ever tried to print it (for example, by having it be the return value in the debugger...) a TI Explorer would lock up in a tight loop in microcode, from which only a warm boot would recover. That microcode loop was trying to grind the number into decimal. That process took more than three days.
  • Printing it as a roman numeral took pretty much the same amount of time.

And finally, here's some code that doesn't run on any computer that has been manufactured in two decades.

(Coincidentally, it looks like I wrote this code eighteen years and four days ago. I guess I should have posted this on Friday.)

<lj-cut text=" --More--(49%) ">

;;; -*- Mode:Lisp; Syntax: Common-Lisp; Package:USER; Base:10 -*-

;;; 21 Mar 90   Jamie Zawinski   Created.

;;; When you load this file, the constants MOST-POSITIVE-BIGNUM and
;;; MOST-NEGATIVE-BIGNUM will be defined.
;;; These are the absolute largest and smallest numbers which can be
;;; represented in the TI Explorer's memory architecture.
;;; WARNING: if you try to print these numbers, the microcode will
;;; hang.  They are totally useless quantities, and dangerous to
;;; have around.  You can examine them with 
;;; (sys:dump-memory most-positive-bignum :bignum-is-dump-object t)
;;; and perform normal arithmetic operations on them.  But the same
;;; dangers apply to any numbers this large.

(defun make-most-positive-bignum (&optional minusp)
  (let* ((header-word 0)
         (nwords (1- (expt 2 17)))
    ;; Construct a bignum header word.
    ;; 31       29           24        22              18     17           0
    ;; +-------------------------------------------------------------------+
    ;; |CDRcode | DTPheader | unused | hdr-type-bignum | sign | datalength |
    ;; +-------------------------------------------------------------------+
    (setq header-word (dpb sys:%header-type-bignum (byte 3 19) 0))
    (setq header-word (dpb (if minusp 1 0)         (byte 1 18) header-word))
    (setq header-word (dpb nwords                  (byte 17 0) header-word))
      ;; Allocate a chunk of memory, with the header word at the front
      ;; and a pointer to NIL in every other location.
      (setq new (sys:%allocate-and-initialize
                 sys:DTP-EXTENDED-NUMBER        ; pointer dtp to return
                 sys:DTP-HEADER                 ; object dtp to store
                 header-word                    ; "pointer" field contents
                 nil                            ; word n+1
                 sys:DEFAULT-CONS-AREA          ; area
                 (+ 2 nwords)                   ; total data length
      ;; Stomp on the first word after the header to be a lit-up bignum data
      ;; chunk.  All bits are on except bit 31 (the msb).  Since fixnums are
      ;; only 25 bits, we do this in two steps.
      (sys:%p-dpb-offset #b0111111 (byte 7 25) (sys:%pointer new) 1)
      (sys:%p-dpb-offset -1        (byte 25 0) (sys:%pointer new) 1)
      ;; Now replicate the N+1 byte to addresses N+2 to N+length.
      (sys:%blt (sys:%pointer-plus (sys:follow-structure-forwarding new) 1)
                (sys:%pointer-plus (sys:follow-structure-forwarding new) 2)
                nwords 1))

;; #, to eval at load-time so that the binary isn't monstrously huge...

(defconstant MOST-POSITIVE-BIGNUM '#,(make-most-positive-bignum))
(defconstant MOST-NEGATIVE-BIGNUM '#,(make-most-positive-bignum t))

;;; If you want to play with these, this might help.  Prevents huge bignums 
;;; from being printed.

(sys:advise sys:print-bignum :around safe-biggestnums nil
  (cond ((eql (car sys:arglist) most-positive-bignum)
         (write-string "#.MOST-POSITIVE-BIGNUM" (second sys:arglist)))
        ((eql (car sys:arglist) most-negative-bignum)
         (write-string "#.MOST-NEGATIVE-BIGNUM" (second sys:arglist)))
        ((> (integer-length (car sys:arglist)) 10000)
         (write-string (if (minusp (car sys:arglist))
                       (second sys:arglist)))
        (t :DO-IT)))
Tags: , , ,

Your tax dollars at work. No, really!

The stretch of Brannan between 9th and Division is between me and many of my destinations, and for at least six years, it's had a very nasty collection of potholes: less potholes than long, thin chasms on the gap between the asphalt and the concrete. I've lost at least two bike tires to them over the years.

So, on Feb 27, I thought "what the hell", and emailed potholes@sfdpw.org saying, basically, "hey, how about patching those."

On or about Mar 15... THEY DID.

Maybe this is just a coincidence, but, damn. I almost wiped out from the shock of it alone!

Tags: , ,