Orientation to the Lab

Before embarking on your first lab assignment, there are some preliminaries you may not yet have learned: lab use policies, how our labs are set up, how to log into the ICS computer network, how our printing system (PayPrint) works, how to have the Engineering Copy center print sections of this Lab Manual for you, how to read and post to news groups from our lab, and (finally!) the basics of entering, compiling and running Java programs.

So, this rather lengthy orientation has been put together to help you master these preliminaries. We’ve put together a series of pseudo-lab exercises that let you practice and apply the material as it is presented. Read all of this orientation section; practice the parts that are new to you, or for which you need review; do the activities needed for the class (e.g., activating your computer accounts) you’ve not yet done.

Pay attention to the details given here, as common computing tools or activities are often somewhat different in lab than, say, on your home computer. For example: Many of you know how to process email. But, since lab machines are shared, we don’t use common tools, such as Netscape or Outlook, to do email; we instead have you connect to your UCInetID account using a tool called SecureCRT, and you do your email from there using a tool called Pine. Such differences can trip you up; hence this orientation.


Reading the Computer Policy and Academic Honesty Documents

You must read a few documents stored on the Web that address ethical use of computing resources and academic honesty issues. (You may also be asked to read some of these documents in the course of activating computer accounts.) We require you to read these documents because, unfortunately, a few students in the past have abused their computer privileges or acted dishonestly and claimed ignorance of the wrongness of their actions. Do note that remaining or enrolling in this course binds you to abiding by these rules.

These documents cover several important policies about academic honesty that apply to you.


Activating your UCInetID and ICS Windows Accounts

As we said in the Course Reference, you need to activate your UCInetID and ICS Windows computer accounts. Follow the instructions there for doing so.


About the ICS Lab Computers and Network

Important Note: It’s possible some particulars of the network will change after this lab manual has been printed. If any of those changes affect the instructions given here, we’ll let you know.

Each first-floor ICS lab room has from 30 to 45 stations or clients forming a local area network (or LAN); Windows XP Professional is the operating system for each station. Each machine is an IBM-PC compatible that has more than enough horsepower for the work we will be doing in this class. There are also shared printers and several shared disk drives (called file servers). Each LAN connects to other LANs thoughout the ICS buildings and, through various mechanisms, to other computer networks and the Internet.

Each machine has a diskette drive that accepts 3-1/2" diskettes in IBM format only, and a CD-ROM drive that can read both “computer” and music CDs. The machine also has a large local hard disk, where we store software for your use and where you can temporarily store your work—once you leave lab, you must remove all your work (and only your work, nothing else!) from the hard drive; more on this below.

Through your station you can also access the class file server and use the shared printers; we’ll talk more about these devices, as needed, below.

A word about rocking out while you compute: Yes, it’s true: You can bring your own music into the lab, on CDs or MP3 players or whatever, and listen to it while you compute—as long as you listen through headphones and otherwise do not disturb your neighbors. (You must supply the headphones.) We’re amazed how loud some of you play music. Loud music can permanently damage your hearing, and can be heard throughout the lab, even if you wear headphones. So, keep the volume down. If you do not, we may forbid you from listening to music (or anything else) in the lab. (See the ICS Instructional Lab Rules for more on this matter.)

The logon state: Unlike some other local area networks, Windows requires you to log on to the network, even if you don’t plan to use network resources.

When you sit down at a lab station, it could be in a number of states:

Logging on: In the Log On to Windows box, at the User name: prompt, enter your user name; at Password:, enter your password; the password will echo as dots, to protect it. (You obtained your user name and passwordwhen you activated your ICS account.) If the Log on to: box does not say UCI-ICS, click on the down-pointing arrow to the right of the box. When the menu appears, click on UCI-ICS. Then click on OK. (If you do not yet have your login and password, use the guest account login name and password for now. But do activate and use your own account as soon as you can.)

If your login and password are correct, you will be asked to wait for some seconds while the computer logs you in. Eventually, you will see a scenic background, a Recycle Bin icon, and a Start button (at the lower left of the screen). That’s it; you’re logged on!

Note: You will want to change your password whenever you think your password has been compromised. To do so, hold down Ctrl and Alt and hit Delete. A dialog box will appear; choose Change Password…, fill in the old password and new password (twice) as prompted, and click on OK to make the change. If your password change is accepted, you’ll get a message to that effect; click on OK to dismiss it. If the password change was not successful, you’ll be told that as well; read the message, dismiss it, and try changing your password again. Keep at it until you enter an accepted password.

Remember your password! No one can look up your password–it’s encrypted. So, if you forget your password, you will have to send electronic mail to support@ics.uci.edu to request that it be set to a new one (that you’ve given in the message), wait a day or two for the change to occur, and then log in and change your password so that (again) no one knows what it is.

When you are done using the computer:


Printing

We do not require print outs of any kind in this class, but you may find you wish to print some of the course materials, such as all or part of the Lab Manual, for easier reference. (After all, you don’t need to have a computer handy to read printed materials.)

ICS or NACS computer labs use the PayPrint system to provide printing services. Instuctions for using PayPrint in ICS labs is at Using PayPrint; the PayPrint system in NACS labs works the same way. Note you have to purchase a PayPrint card to use this facility.

Since the PayPrint system provides you access to printers in labs across campus, be sure to print to the station you intend, so that your output will go where you expect. (Otherwise, you might be taking a very long walk to get your output!) It’s usually best to send your print out to a station in the room you’re in.

If you prefer, the Engineering Copy Center will provide you hard copy of any ICS 80J class web site: just go to the ECC and provide them the Web address of the material you want printed. The ECC charges five cents a page, half the cost of printing in the labs!


Additional Lab Pointers, Tips and Cautions


News Groups

One feature of the Internet is its electronic news groups. There are thousands of them. Each is a repository of related information of interest to a group of people. Since each has an Internet address, one can post messages to a news group by sending email to it (although there are easier ways). Reading a news group requires the use of a news reader, which lets you read news groups, write messages to them, make a copy of postings to your printer or disk, and follow threads, messages that are linked because they are responses to the same initial message.

Accessing news groups

Fortunately, IE has a news reader as well as a Web browser; get to it by going to the IE Tools menu, selecting Mail and News and then selecting Read News. (You might be asked if you want to make Outlook your default mail handler; say no.) To learn to use the newsgroup tool, click on Help (in the Microsfot Outlook Newsreader window) and select Contents and Index. In the left window you will see an entry for Viewing and Posting to Newsgroups. All you need to know to read and post to newsgroups should be there.

Of course, there are other ways to access news groups and you can access news groups using any tool you like. But whatever tool you use, be sure you know at minimum how to read newsgroups; it is a basic internet skill.

Etiquette

There are several conventions and etiquette to using the Net, especially when sending messages, be they to news groups or people (so much of the etiquette also applies to email messages).

The most famous news group etiquette document is Usenet Organization and Etiquette, part of a manual for an old news reader called NewsWatcher. (“Usenet” is a name for the news group area of the Internet.) Read the organization section to get a good feel for how news groups are organized and for their history and traditions. Then, read the etiquette section; following its suggestions will make your news group experience much more pleasant.


Revision history for all sections to this point:

Written for ICS 80 by Norman Jacobson, December 1996
Revised for ICS 1A by Norman Jacobson, September 1997
Minor revisions for ICS 1P by Norman Jacobson, December 1997
Minor revisions for ICS 1A by Norman Jacobson, April 1998 and August 1999
Minor revisions for ICS 21 by Norman Jacobson, September 1999, December 1999, March 2000, June 2000 & September 2000
Revised for ICS 10A by Norman Jacobson, December 2000
Minor revisions for ICS21 by Norman Jacobson, September 2001
Revised by Norman Jacobson to reflect the change to Windows 2000, December 2001
Revised and reorganized by Norman Jacobson to reflect the introduction of the ICS Lab Primer booklet, August 2002
Slightly revised for ICS80J by Norman Jacobson, September 2002
Revised to reflect use of IE instead of Netscape by Norman Jacobson, September 2003

Remote Computing and Email

Doing work on one computer by connecting to it via another computer is called remote computing. In lab, there is a remote computing tool called SecureCRT; we use it to enable you connect to your UCInetID account from the lab, so you can use a tool called Pine to access your electronic mail.

You can also connect to the UCInetID machines from any of the NACS labs on campus, and from any off-campus computer with the appropriate communications hardware and software. Here, we tell you how to access the UCInetID machines from our lab; you’re own your own to learn what you need to do to access those machines from other locations.

Connecting remotely to the UCInetID computer: To use your UCInetID from the lab, open the Start menu and select All Progams then SecureCRT 4.0, then (on the submenu that appears) SecureCRT 4.0 (again). A window will appear; in front of that window will appear the Connect window, which lists the computers accessible from the lab will come forward; select Ea.uci.edu and click on Connect.

Now a New Host Key warning may appear. If it does, click on Accept & Save. Now a dialog box will come up asking you for your user name; enter it. Do not check the Remember my username box! Then a dialog box asking for your password will come up; enter your password. Do not check the Remember my password box! (If you check these boxes, the next user at this machine could have access to your UCInetID account.) The dialog box will disappear, and the screen behind it will announce that you are connected to the UCInetID computer. You are now logged in to the UCI system, and ready to use email. When you’re done, type logout to leave the system, then select Exit from the File menu to leave SecureCRT.

(SecureCRT also has several other features; feel free to explore. You can find help with SecureCRT by clicking on SecureCRT ‘s Help menu.)

Using email. The manner in which you connect to the UCI machines is irrelevant to using email itself. You could use a computer in CS 364 or in the Engineering Gateway building, for instance, to connect to your UCInetID account. The reason: Pine resides on the UCInetID machine, not your local computer, so the tool works the same way no matter how you “got to it.”

Everything You Need to Know to Get Started in PINE has instructions for using Pine. You can also ask your TA for assistance.


Revision history for this section:

Written by Norman Jacobson, Winter 1995
Revised for ICS21 by Norman Jacobson, September 1995
Revised for ICS 1A by Norman Jacobson, December 1995
Rewritten for ICS 1P by Norman Jacobson, December 1996. Thanks to David Kay for some passages.
Rewritten for the new ICS 1A lab (NT network) and to combine this Web lab with a previously separate email exercise, by Norman Jacobson, September 1997
Minor revisions by Norman Jacobson, December 1997 and April 1998
Revised by Norman Jacobson to reflect the new printing system & other changes in the NT labs, September 1998
Revised by Norman Jacobson to reflect updated software and web pages, August 1999
Revised and integrated into the Orientation to Lab section by Norman Jacobson for ICS 21, September 1999
Revised to reflect new versions of Netscape and SecureCRT by Norman Jacobson for ICS21, April, 2000
Information moved to other sections to accommodate account creation changes, by Norman Jacobson, September 2000
Minor revisions by Norman Jacobson, December 2000
Revised for the Web by Norman Jacobson, August 2002
Minor revisions to relfect using SecureCRT 4.0 and Windows XP by Norman Jacobson, September 2003

Getting Acquainted with TextPad and Java

This section helps you become familiar with the tools provided in lab to enter, compile and run Java programs.

First, you enter a run a very simple Java program. Next, you run an incorrect program–one in which we have deliberately inserted errors–and fix it so that you have a correctly running program. Third, you type in a program yourself and fix any errors you introduced in the typing until it runs correctly.

We tell you the basic steps you need to know to complete this exercise, but we leave other things for you to figure out for yourself– experimentation and some trial and error are probably the most effective way to learn and remember what works and what doesn’t. But don’t waste a lot of time: it can sometimes be difficult to spot an error or figure out the exact command or syntax to use, so ask your TA for assistance if you get stuck.

Preparation: Bring diskettes with you (or use the H: drive) to save your work. Remember to back up your work!

About programming environments and command line interfaces: These days, there are two major “machine contexts” in which one develops programs. The newer approach is to use a programming environment. One creates a project, which keeps track of everything a program needs to have in order to compile and run. For simple programs, it typically will keep track of the files containing source code, source and object libraries (and where they are stored) and various editing, compiling and linking options. (For complicated programs, much more information will be present.) Environments provide powerful tools and features to help programmers write complex code for large commercial programs, but they can be quite confusing to newcomers. Setting up projects can be complicated and tricky, even for seasoned programmers. A couple of Java environments are provided on the lab machines (check out the Java folder on the All Programs menu).

An older but much simpler way to compile and run programs is through a command line interface. The steps vary somewhat depending on the programming language; with Java, there are typically three steps:

  1. Type the Java code for the program components into the computer. To enter a component, one uses a text editor. (It’s like a word processor, but designed to handle text that’s to be used as a program, or as data to be processed, rather than as a document to be published).

  2. Compile each component. To do this, one types in a compile command followed by the name of the program component to be compiled, typically the name of a file. The compiler them reports any errors and (tries to) create an object file. If there are error messages, one uses the text editor to correct the errors and then recompiles the component–and keeps doing this until there are no reported errors.

  3. Execute the program. In Java, one issues a command and the name of the “main” component. Because of the rules Java uses for naming components, giving the main one is sufficient for Java to find and execute the rest.

The advantage to the command-line approach is that it simple to master, but it does not have the rich and powerful features of an environment.

Since programs for this class are not very complex (compared to commercial software, anyway) we’ve found it best to use a command line interface. However, either a command line or environment approach will produce an executing program. So, if you prefer to use an environment instead of command lines, feel free to do so…but we will only address the command line approach in this manual.

To enter a program, you may use any text editor you like—you can even use Word and save your file as Text Only With Line Breaks. But we strongly recommend you use TextPad, a text editor we provide that is easy to use and has features to help you enter neatly formatted Java code. You can also download your own copy from www.textpad.com. It is free to evaluate and only a nominal fee to license—and you should license it if you decide to keep a copy. In this manual, we will focus on TextPad.

In this introduction, we don’t expect you to understand completely how each program works. Our purpose is to familiarize you with the “look” of Java code and have you become comfortable using the basic features of TextPad and the commands for compiling and executing Java programs.

Executing a very simple program: We begin your introduction to Java and TextPad by having you enter, compile and run a traditional first program, one that causes the computer to print out “Hello, world!” on the screen.

•  Open TextPad: Go to Start, then All Programs, then TextPad.

•  Save the file as Hello.java in C:\Temp.

Yes, the file is empty, but saving the file with a .java extension tells TextPad that you are entering a Java program. TextPad will now apply Java formatting to your work. For instance, symbols and words will be color-coded and lines of Java code will be formatted using a standard style.

•  Enter the following program:

// Hello, world!
public class Hello
{
  public static void main(String[] args)
  {
    System.out.println("Hello world!");
  }
}

• Save it. Leave TextPad open, though.

• Call up a Command Prompt window by selecting Start, then All Programs, then Accessories, then Command Prompt. This gives us the interface to Windows XP we need to use command lines to compile and run Java programs. You'll see a blinking cursor next to the command line prompt. The prompt tells you the interface is ready to receive your commands. It also tells you “where you are” within the computer’s directory (folder) structure; this is known as the “directory path,” or just “path,” for short. For instance, the window usually shows C:\>Temp as the prompt. This means you are “in” the C drive, inside the Temp folder. When you issue commands, they will affect the files in the current directory (unless the command specifically states otherwise).

• If the command line shows you are at a drive other than C:\>Temp, change to the C drive by typing in C: (and then the Return or Enter key) then enter cd \Temp (and then Return or Enter).

• Now that we are in the same directory as the Java program, we can easily compile it: type javac Hello.java (followed by Return or Enter). javac is the command that invokes the Java compiler; Hello.java is the name of the file to compile.

The name of the “public class” inside the Java file must be the same as the name of the file itself—and that name is case sensitive; for instance, typing in javac hello.java will cause an error message. (You’ll either get the message hello is an invalid option or argument or hello.java:5: Public class Hello must be defined in a file called "Hello.java".).

• If you do get an error, go back into TextPad (the program is still active, in the open window) and look it over. Fix any differences from the example given here, save the file, go back to the Command Prompt window and compile the program again. It’s critical that you save the file: javac works off of the disk copy of the file, not the copy in memory. Making the change to the copy in TextPad is not good enough; those changes also must be saved onto disk.

javac error messages that refer to errors in a program start with the name of the file and the line number on which the error was found. In addition to the message, it often prints the offending line and has an arrow pointing to the place where Java caught the error. A hint: In TextPad, you can get to a line of your Java program quickly by using the Go To… command (in the Search menu).

When Hello.java compiles without error, you will get no messages from Java, just another command line prompt.

• Run the (successfully) compiled program by entering java Hello. Note you enter java to run the program, javac to compile it. If you try to run a program before it is compiled, or enter Hello misspelled or in the wrong case, you get an error message (Exception in thread "main" java.lang.NoClassDefFoundError: Hello).

Another hint: You may have to recompile and re-run a program several times before it is correct, which means you need to execute the same javac and java commands over and over. However, when in the command prompt mode, you can hit the up arrow and down arrow keys to scroll though already-issued commands. When you find the one you want, you just hit return or Enter to execute that command. So after you have entered the javac and java commands for your (current) program, just use the arrows to go back to them. This is much faster (and less boring!) than retyping them.

Only the compiling and running of the Java programs is done from the command line prompt; all other work (such as editing the program) is typically done using the usual window-based interface.

Fixing a small, bug-ridden program: For our lab assignments and exams, we provide you with a starting (set of) Java files you access via links from the Lab Manual web pages. To obtain practice in modifying programs we provide, and to become more familiar with how Java programs and its error messages look, we have provided an error-ridden program called BuggyNetBill for you to fix and run.

• Download BuggyNetBill.java. Store it in its own folder in the Temp directory.

(The easiest way to do this is to first create an empty folder with an appropriate name (we’ll call it JavaPractice) in the Temp directory. Then download the file by right-clicking on its link and choosing Save Target As... or Save Target To... or Download Link To Disk—the exact phrase will depend upon the browser you are using. A file save dialog box will appear; save the file in JavaPractice.)

Always place the file or files that make up a lab into the same folder. That way, Java can find all the pieces that make up the program.

• In the command prompt window, go to C: (if needed), then cd \Temp (if needed), then to the BuggyNetBill folder (by entering cd xxx at the prompt, where xxx is the name of the folder containing BuggyNetBill.java).

• Compile BuggyNetBill.java; you’ll note lots of errors.

• Open BuggyNetBill.java in TextPad. (An easy way to do this is to right click on BuggyNetBill.java and then select TextPad from the menu that appears. Of course, you can also open it with TextPad’s Open command.)

• Download NetBill.java; put it in its own folder in the \Temp directory. Open that file in Textpad.

 TextPad can have more than one file open at once; click on a file’s name in the upper left corner window to view and edit that file. Or, you can see both files at once by tiling the windows; experiment with the choices under the Window menu to find the tiling option you prefer.

• Fix BuggyNetBill.java by looking the error messages and NetBill.java. (You could, of course, just cut and paste NetBill code into BuggyNetBill, but that would defeat the purpose of learning the kinds of messages various errors cause.)

• As you fix errors, save BuggyNetBill.java and recompile it; continue in this way until there are no compile errors.

• Run the code and compare the output to running NetBill. The idea is to check that your fixed program actually does what is supposed to be done. Just because a program compiles does not mean it is correct! In fact, we’ve put some errors in BuggyNetBill that the compiler will probably not catch—but if they are left there, you will not get a running program, or one printing the correct results.

Writing a more complicated program:

Enter, compile and run the following program. It takes an object-oriented approach and comes near to the complexity of the first lab assignment. Again, work to understand what this program is doing; it will help you understand Java and programming more generally.

Remember to make a folder in C:\Temp to hold the program and to change drives and directories in the command window as needed to be in that folder. If you are not “in” that directory, then javac and java will not find your program.

// Written by: Norman Jacobson on April 5, 1996
// Rewritten:  by Norman Jacobson, Sept. 2001
// Purpose:    To print a calendar for one month

import java.io.*;      // make input/output functions available
import java.text.*;    // make text formattting functions available

  
public class Calendar
{
  private String month;
  private String year;
  private int firstDay;
  private int numOfDays;
  private BufferedReader console;

  public static void main(String[] args)
  {
    Calendar myCalendar = new Calendar(); // make a calendar
     myCalendar.printCalendar();          // and print it!
  }


  // The constructor allocates memory and gathers the data necessary
  // to make a calendar.
  public Calendar()
  {
    // make a string-handling input-from-keyboard object
    console = makeInputConsole();
    // get the month, year, day of week month starts,
    // number of days in month
    System.out.print("Enter the month (e.g., September) ");
    month = getString();

    System.out.print("Enter the year (e.g., 2001) ");
    year = getString();

    System.out.println("On which day of the week does " +
             month + ", " + year + " start?");

    System.out.print("Enter 1 for Sunday, 2 for Monday, etc.: ");
    firstDay = getInt();

    System.out.print("And how many days are in this month? ");
    numOfDays = getInt();
  }

  
  // printCalendar() prints out the calendar page.
  public void printCalendar()
  {
    // print heading
    System.out.println();
    System.out.println("Calendar for " + month + ", " + year);
    System.out.println(" S M T W T F S");
    System.out.println();

    // position first day under correct day of week
    for (int pos = 1; pos < firstDay; pos++)
    {
      System.out.print(" ");  // print 3 spaces as leaders
    }

    // write out the days of the month
    int day = firstDay;
    for (int date = 1; date <= numOfDays; date++) //for each date...
    {
      if (date <= 9)
        System.out.print(" " + date);       // write out dates
      else                                  // right justified
        System.out.print(" " + date);

      if (day == 7)                // if end of week,
      {
        System.out.println();      // start a new line
        day = 1;                   // and new week
      }
      else                         // otherwise
      {
                         day++;    // move to next day (same line)
      }
    }

    System.out.println();    //finish off last line
  }

  
  // makeInputConsole() creates an input-from-keyboard object that
  // accepts strings.
  private BufferedReader makeInputConsole()
  {
    InputStreamReader reader = new InputStreamReader(System.in);
    BufferedReader inputConsole = new BufferedReader(reader);
    return inputConsole;
  }

  // getString() gets a string from the keyboard.
  private String getString()
  {
    String userInput = "";    // entered string

    // read in what is typed
    try
    {
      userInput = console.readLine();
    }
    catch (IOException ioe)
    {
      // should not ever have a problem here
    }
    return userInput;
  }

  // getInt() gets an integer from the keyboard.
  private int getInt()
  {
    String userInput = "";    // entered string
     int enteredInt = 0;      // if a double, the entered value

    // read in what is typed
    try
    {
      userInput = console.readLine();
    }
    catch (IOException ioe)
    {
      // should not ever have a problem here
    }

    // convert to int; if can't, we’ve a NumberFormatException
    try
    {
      enteredInt = Integer.parseInt(userInput);
    }
    catch (NumberFormatException nfe)
    {
      // error in the number's format - print error message and exit
      System.out.println("You need to input a number!");
      System.exit(1);
    }

    // all is well; return the int
    return enteredInt;
  }
}

• Save your program.

You will probably have to edit, compile and run your program several times before it is entirely correct. There should be no error messages of any sort.

The output your program produces should look like the calendar shown below if you supplied input data for January 1994, which started on a Saturday and had 31 days:

Calendar for January, 1994

 S  M  T  W  T  F  S
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

• When you (think you) have this program running correctly, try various months, years and starting dates to be sure you know it is working properly.

• Now experiment—not with correct input, but with incorrect or unexpected-but-legal input. Especially note what happens with the input and output when you enter text where integers are expected.

• Back up your work.

Important note: When you compile or execute your program, several additional files are created in your folder. Do not try to back up all the files to a diskette (together, they are sometimes too large to fit). All you need are the .java files and any data files that we provided or you created. Leave the other files behind: You can quickly recreate them simply by compiling and executing your program.


Revision history for this section:

The calendar program is from Programming for People/Pascal, by David G. Kay (Mayfield, 1985), originally adapted for use in ICS 21 by David G. Kay (September 1990)
Minor revisions by Norman Jacobson, Fall 1991
Revised for THINK Pascal by Norman Jacobson, in consultation with David G. Kay, Winter 1992
Minor revisions by Norman Jacobson, Fall 1992, Fall 1994, September 1995, December 1995
The NetBill programs were inspired by Structured Programming Using THINK Pascal on the Macintosh, by Crawley, McArthur, and Jacobson (Prentice Hall, 1992), and were incorporated into CodeWarrior version of this exercise by Norman Jacobson, April 1996
Revised for Windows NT, VS, Visual C++, and to reflect the ICS NT lab, by Norman Jacobson, December 1996
Revised for new versions of Windows NT and Visual C++ by Norman Jacobson, September 1997
Revised for VC++ 6.0 and ICS21 by Norman Jacobson, September 1999
Minor revisions by Norman Jacobson, December 1999, March 2000, September 2000, February 2001 and March 2001
Rewritten for the Fall 2001 offering of ICS21 to reflect Java and TextPad by Norman Jacobson, September 2001
Minor revisions to reflect Windows 2000 by Norman Jacobson, December 2001
Minor revisions to make the exercise a Web document and to clarify some passages, by Norman Jacobson, August 2002
Minor revisions to reflect use of Windows XP and IE, September 2003.