
           Linux Gazette... making Linux just a little more fun!
                                      
         Copyright © 1996-97 Specialized Systems Consultants, Inc.
     _________________________________________________________________
   
                       Welcome to Linux Gazette! (tm)
     _________________________________________________________________
   
                                 Published by:
                                       
                               Linux Journal
     _________________________________________________________________
   
                                 Sponsored by:
                                       
                                   InfoMagic
                                       
                                   S.u.S.E.
                                       
                                    Red Hat
                                       
   Our sponsors make financial contributions toward the costs of
   publishing Linux Gazette. If you would like to become a sponsor of LG,
   e-mail us at sponsor@ssc.com.
     _________________________________________________________________
   
                             Table of Contents
                           October 1997 Issue #22
     _________________________________________________________________
   
     * The Front Page
     * The MailBag
          + Help Wanted -- Article Ideas
          + General Mail
     * More 2 Cent Tips
          + Netscape and Seyon questions
          + Keeping track of tips
          + Displaying File Tree
          + Making Changing X video modes easier
          + Tree Program
          + Finding what you want with find
          + Minicom kermit help
          + Postscript printing
          + Realaudio without X-windows
          + Connecting to dynamic IP via ethernet
          + Running commands from X w/out XTerm
          + Ascii problems with FTP
          + Red Hat Questions
     * News Bytes
          + News in General
          + Software Announcements
     * The Answer Guy, by James T. Dennis
          + Faxing and Dialing-Out on the Same Line
          + Linux and the 286
          + Accessing ext2fs from Windows 95
          + chattr +i
          + Linux sendmail problem
          + POP3 vs. /etc/passwd
          + Problem with make
          + Swap partition and Modems
          + Redhat 4.2/Motif
          + E-mail adjustment needed
          + REALBIOS?
          + X-Windows Libraries
          + PC Emulation
          + Visual Basic for Linux
          + Linux 4.2 software and Hardware compatablity problems
          + Moving /usr subdirectory to another drive..
          + C++ Integrated Programming Enviroment for X...
          + LYNX-DEV new to LYNX
     * Graphics Muse, by Michael J. Hammel
     * Linux Benchmarking: Part 1 -- Concepts, The first article in a
       series, by André D. Balsa
     * New Release Reviews, by Larry Ayers
          + Word Processing vs. Text Processing?
          + A New GNU Version of Emacs
          + Notes-Mode for Emacs
     * Using m4 To Write HTML, by Bob Hepple
     * An Introduction to The Connecticut Free Unix Group, by Lou Rinaldi
     * Review: The Unix-Hater's Handbook, by Andrew Kuchling
     * The Back Page
          + About This Month's Authors
          + Not Linux
       
   The Answer Guy
   The Weekend Mechanic will be back next month
     _________________________________________________________________
   
   The Whole Damn Thing 1 (text)
   The Whole Damn Thing 2 (HTML)
   are files containing the entire issue: one in text format, one in
   HTML. They are provided strictly as a way to save the contents as one
   file for later printing in the format of your choice; there is no
   guarantee of working links in the HTML version.
     _________________________________________________________________
   
   Got any great ideas for improvements! Send your comments, criticisms,
   suggestions and ideas.
     _________________________________________________________________
   
   This page written and maintained by the Editor of Linux Gazette,
   gazette@ssc.com
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                                The Mailbag!
                                      
                    Write the Gazette at gazette@ssc.com
                                      
                                 Contents:
                                      
     * Help Wanted -- Article Ideas
     * General Mail
     _________________________________________________________________
   
                        Help Wanted -- Article Ideas
     _________________________________________________________________
   
   Date: Mon, 25 Aug 1997 15:02:14 -0700
   From: cooldude cooldude@digitalcave.com
   Subject: how do
   
   how do i setup a linux server from scratch?
   my freind has the t1 connection and im gonna admin it with his
   ermission need ta know A. S.A.P.
   =)
   thanks
     _________________________________________________________________
   
   Date: Mon, 1 Sep 97 18:59:51 UT
   From: Richard Wang rzlw1@classic.msn.com
   Hi,
   I have just set up a system for RedHat Linux, but I am finding getting
   real support for this system is very difficult. In fact, I cannot even
   setup my webpage via SLIP from the manuals I have. Redhat seems to go
   against it'scompetitor Caldera, and I am finding it hard to find the
   right manuals and guides for this system.
   Do you have an online help person, who I can log to ?
   Looking forward to your reply,
   
   Richard Wang
   Cambridge
   United Kingdom
     _________________________________________________________________
   
   Date: Wed, 17 Sep 1997 19:49:55 -0700
   From: Garry Jackson gjackson@home.com
   Subject: Linux Problem.
   
   I'm a linux newbie and I'm having major problems. I have a monitor
   that is kapible of 800X600 and I don't know anything else about it. I
   Also have a Trio 32/64. I cannot get Xwindows to go so what should I
   do.
   
   Also I'm have a problem with my SB16 PNP and I can't get that to work
   and I can't get a Supra 28.9 PnP and a SN-3200 witch is a NE-200 clone
   if you could give me any tips on getting this stuff work It would be
   thanked.
   
   Garry Jackson
     _________________________________________________________________
   
   Date: Wed, 3 Sep 1997 19:28:20 -0400
   From: Prow Prowlyr@mindspring.com
   Subject: Just some really basic help please.
   
   I want to learn about unix but really dont know where to start. Can I
   get a free version somewhere to get me started? Do you know of a good
   Unix for dummies site that might help? Would greatly appreciate any
   reply via e-mail. Thanx in advance.
     _________________________________________________________________
   
   Date: Tue, 09 Sep 1997 00:49:50 +0200
   From: Michael Stumpf ms@astat.de
   Subject: Linux Kernel
   
   I'm searching information about the status of the current kernel
   (release and/or developer). Do you have a web-address from an
   up-to-date site ? I used to look at "http://www.linuxhq.com" for this,
   but it seems that it is forever down.
   
   tia
   
   Michael
     _________________________________________________________________
   
   Date: Sat, 27 Sep 1997 11:02:04 -0400
   From: Dave Runnels drunnels@panix.com
   Subject: 3com509b problems
   
   I recently added a 3com509b Ethernet card to my Win95/Linux machine. I
   run the machine in PnP mode and the RedHat 4.2 install process won't
   recognize the card. RedHat's solution was to disable PnP for the
   machine. While this might be fine for Linux, I am forced to use Win95
   for a number of things and turning off PnP (which works great for me
   on Win95) will be a real pain in the ass.
   
   Is there a way I might have my cake and eat it too? I do know which
   IRQ the card is being assigned to.
   
   Thanks, Dave
     _________________________________________________________________
   
   Date: Mon, 22 Sep 1997 10:06:04 +0200
   From: Erwin Penders ependers@cobweb.nl 
   Subject: email only
   
   Hi,
   
   My name is Erwin Penders an i'm working for a local ISP in the
   Netherlands. I don't know if i send this mail to the right place, but
   i have a question about a Linux problem. I want to know how to set up
   an email-only account (so you can call the ISP, make a connection and
   send/receive email) without the possiblity for WWW, Telnet etc. The
   main problem is that i don't know how to set up the connection (the
   normal accounts get a /etc/ppp/ppplogin).... . .
   
   Can anybody help me with this problem !?
   
   Thanks,
   
   Erwin Penders
   (CobWeb)
     _________________________________________________________________
   
   Date: Sat, 20 Sep 1997 22:00:38 +0200
   From: Richard Torkar richard.torkar@goteborg.mail.telia.com
   Subject: Software for IDE cd-r?
   
   First of all Thanks for a great e-zine!
   
   And then to my question... (You didn't really think that I wrote to
   you just to be friendly did you? ;-)
   
   Is there any software written for IDE cd-r for example Mitsumi
   CR2600TE?
   
   I found two programs; Xcdroast and CDRecord for Linux, but
   unfortunately they don't support IDE cd-r :-(
   
   I haven't found anything regarding this problem and I've used darned
   near all search tools on the net... Any answer would be appreciated.
   If the answer is no, can I solve this problem somehow?
   
   Regards,
   Richard Torkar from the lovely land of ice beers .. ;-)
     _________________________________________________________________
   
   Date: Thu, 18 Sep 1997 16:03:04 -0400 (EDT)
   From: Eric Maude sabre2@mindspring.com
   Subject: Redhat Linux 4.3 Installation Help
   
   I am trying to install Redhat Linux 4.3 on a Windows 95 (not OSR 2)
   machine. I do want to set this machine up as dual boot but that's not
   really my problem. I have been totally unable to set up Linux because
   I am unable to set up the Non-MS DOS partition that Linux requires. I
   am pretty new to Linux. I would appreciate anyone that could give me
   detailed step by step instructions on how I go about setting up Redhat
   Linux. I would call Redhat directly but I am at work during their
   operating hours and not near the machine I need help with this!
   Please, somebody help me out!!
   
   Thanks!!
     _________________________________________________________________
   
                                General Mail
     _________________________________________________________________
   
   Date: Fri, 29 Aug 1997 11:02:39 -0300
   From: Mario Storti mstorti@minerva.unl.edu.ar
   Subject: acknowledge to GNU software
   
   (Sorry if this is off-topic)
   
   From now on I will put a mention to the GNU (and free in general)
   software I make use in the "acknowledgment" section of my (scientific)
   papers. I suggest to do the same to all those who are working on
   scientific applications. Since Linux is getting stronger every day in
   the scientific community, this could represent an important support,
   specially when requesting funding. Even better would be to make a
   database with all these "acknowledgments" in a Web site or something
   similar. Do anyone know of something like this that is already
   working? Any comments?
   
   Mario
     _________________________________________________________________
   
   Date: Sun, 07 Sep 1997 23:58:16 -0500
   From: mike shimanski mshiman@xnet.com
   Subject: Fun
   
   I just discovered Linux in July and am totally pleased. After years of
   Dos, Win 3.1, OS/2 and Win95, ( I won't discuss my experience with
   Apple), I think I found an operating system I can believe in.I cannot
   make this thing crash!
   
   The Linux Gazette has been a rich source of information and makes
   being a newbe a great deal easier.I want to thank you for the time and
   effort you put into this publication. It has made my induction into
   the Linux world a lot easier.
   
   Did I mention I am having way too much fun exploring this operating
   system? Am I wierd or what?
   
   Again, thanks for a great resource.
   
   Mike Shimanski
     _________________________________________________________________
   
   Date: Sat, 06 Sep 1997 18:01:52 -0700
   From: George Smith gbs@swdc.stratus.com
   Subject: Issue 21
   
   THANKS! Thanks! Thank You!
   
   Issue 21 was great! I loved it! I most appreciate the ability to
   download it to local disk and read it without my network connection
   being live and with the speed of a local disk. Please keep offering
   this feature - I wish everyone did. BTW, I am a subscriber to the
   Linux Journel from issue 1 and enjoy it immensely also.
   
   Thanks again.
     _________________________________________________________________
   
   Date: Wed, 03 Sep 1997 19:34:29 -0500
   From: Mark C. Zolton trustno1@kansas.net
   Subject: Thank you Linux Gazzette
   
   Hello There,
   
   I just wanted to thank you for producing such a wonderful publication.
   As a relative newbie to Linux, I have found your magazine of immense
   use in answering the plethora of questions I have. Keep up the good
   work. Maybe oneday I'll be experienced enough to write for you.
   
   Mark
     _________________________________________________________________
   
   Date: Mon, 1 Sep 1997 00:09:53 -0500 (CDT)
   From: Arnold Hennig amjh@qns.com
   Subject: Response to req. for help - defrag
   
   I saw the request for information about the (lack of) need for
   defragging in issue 20, and have just been studying the disk layout a
   bit anyway.
   
   Hope the following is helpful:
   
   In reference to the question titled "Disk defrag?" in issue 20 of the
   Linux Gazette:
   
   I had the same question in the back of my mind once I finally Linux up
   and running after some years of running a DOS based computer. After I
   was asked the same question by someone else, I poked around a bit and
   did find a defrag utility buried someplace on sunsite. The
   documentation pretty much indicated that with the ext2 file system it
   is rarely necessary to use the utility (he wrote it prior to the
   general use of ext2fs). He gave a bit of an explanation and I found
   some additional information the other day following links that (I
   believe) originated in the Gazette.
   
   Basically, DOS does not keep a map of the disk usage in memory, and
   each new write simply starts from the next available free cluster
   (block), writes till it gets to the end of the free space and then
   jumps to the next free space and continues. After it reaches the end
   of the disk or at the next reboot, the "next free cluster" becomes the
   "first free cluster", which is probably where something was deleted,
   and may or may be an appropriate amount of free space for the next
   write. There is no planning ahead for either using appropriate sized
   available spaces or for clustering related files together. The result
   is that the use of space on the disk gets fragmented and disorganized
   rather quickly, and the defrag utilities are a necessary remedy.
   
   In fairness to DOS, it was originally written for a computer with
   precious little memory, and this method of allocating write locations
   didn't strain the resources much.
   
   The mounting requirement under unices allows the kernel to keep a map
   of the disk usage and allocate disk space more intelligently. The Ext2
   filesystem allocates writes in "groups" spread across the area of the
   disk, and allocates files in the same group as the directory to which
   they belong. This way the disk optimization is done as the files are
   written to disk, and a separate utility is not needed to accomplish
   it.
   
   Your other probable source of problems is unanticipated shutdowns
   (power went out, Dosemu froze the console and you don't have a way to
   dial in through the modem to kill it - it kills clean, btw ;-), or
   your one year old niece discovered the reset button). This will tend
   to cause lost cluster type problems with the files you had open at the
   time, but the startup scripts almost universally run fsck, which will
   fix these problems. You WILL notice the difference in the startup time
   when you have had an improper shutdown.
   
   So, yes, you may sleep with peace of mind in this respect.
   
   Arnold M.J. Hennig
     _________________________________________________________________
   
   Date: Wed, 3 Sep 1997 16:19:17 -0600 (MDT)
   From: Mark Midgley midgley@pht.com
   Subject: Commercial Distribution
   
   Mo'Linux, a monthly Linux distribution produced by Pacific HiTech,
   Inc. includes current Linux Gazette issues. They are copied in whole,
   according to the copyright notice.
   
   Mark
     _________________________________________________________________
   
   Date: Thu, 11 Sep 1997 12:26:53 -0400
   From: Brian Connors connorbd@bc.edu
   Subject: Linux and Mac worlds vs Microsoft?
   
   Michael Hammel made an interesting comment in the September letters
   column about aligning with Mac users against Microsoft. The
   situation's not nearly as rosy as all that, what with Steve Jobs'
   latest activity in the Mac world. As a Mac diehard, I'm facing the
   prospect of a good platform being wiped out by its own creator,
   whether it's really his attention or not. IMHO the Linux world should
   be pushing for things like cheap RISC hardware (which IBM and Motorola
   have but aren't pushing) and support from companies like Adobe. I know
   that in my case, if the MacOS is robbed of a future, I won't be
   turning to Windows for anything but games...
     _________________________________________________________________
   
   Date: Thu, 11 Sep 1997 22:59:19 +0900
   From: mark stuart mark@www.hotmail.com
   Subject: article ideas
   
   why not an issue on linux on sparc and alpha(especially for scientific
   applications) and also how about an issue on SMP with linux?
     _________________________________________________________________
   
   Date: Sat, 27 Sep 1997 01:57:09 -0700 (PDT)
   From: Ian Justman ianj@chocobo.org
   
   Except for the SNA server, all I've got to say about Linux with all
   the necessary software is: "Eat your heart out, BackOffice!"
   
   --Ian.
     _________________________________________________________________
   
   Date: Wed, 24 Sep 1997 21:49:28 -0700
   From: Matt Easton measton@lausd.k12.ca.us
   Subject: Thanks
   
   Thank you for Linux Gazette. I learn a lot there; and also feel more
   optimistic about things not Linux after visiting.
     _________________________________________________________________
   
   Date: Fri, 26 Sep 1997 13:24:29 -0500
   From: "Samuel Gonzalez, Jr." buzz@pdq.net
   Subject: Excellent Job
   
   Excellent job !!!
   
   Sam
     _________________________________________________________________
   
             Published in Linux Gazette Issue 22, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Next 
   
      This page written and maintained by the Editor of Linux Gazette,
      gazette@ssc.com
      Copyright © 1997 Specialized Systems Consultants, Inc.
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun! "
     _________________________________________________________________
   
                               More 2˘ Tips!
                                      
               Send Linux Tips and Tricks to gazette@ssc.com 
     _________________________________________________________________
   
  Contents:
  
     * Netscape and Seyon questions
     * Keeping track of tips
     * Displaying File Tree
     * Making Changing X video modes easier
     * Tree Program
     * Finding what you want with find
     * Minicom kermit help
     * Postscript printing
     * Realaudio without X-windows
     * Connecting to dynamic IP via ethernet
     * Running commands from X w/out XTerm
     * Ascii problems with FTP
     * Red Hat Questions
     _________________________________________________________________
   
  Netscape and Seyon questions
  
   Date: Mon, 8 Sep 1997 11:23:51 -0600 (MDT)
   From: "Michael J. Hammel" mjhammel@long.emass.com
   
   Lynn Danielson asked:
   
   I downloaded Netscape Communicator just a few weeks ago from the
   Netscape site. I'm not sure older versions of Netscape are still
   available. I'm probably wrong, but I was under the impression that
   only the most current beta versions were freely available.
   
   Answer:
   
   A quick search through Alta-Vista for Netscape mirrors showed a couple
   of different listing for mirror sites. I perused a few and found most
   either didn't have anything or had non-English versions, etc. One site
   I did find with all the appropriate pieces is:
   
   ftp://ftp.adelaide.edu.au/pub/WWW/Netscape/pub/ 
   
   Its a long way to go to get it (Australia), but thats all I could
   find. If you want to go directly to the latest (4.03b8) Communicator
   directory, try:
   
   ftp://ftp.adelaide.edu.au/pub/WWW/Netscape/pub/communicator/4.03/4.03b
   8/english/unix/ 
   
   I did notice once while trying to download from Netscape that older
   versions were available, although I didn't try to download them. I
   noticed this while looking for the latest download of Communicator
   through their web sites. Can't remember how I found that, though.
   
   The 3.x version is available commercially from Caldera. I expect that
   the 4.x versions will be as well, though I don't know if Caldera keeps
   the beta versions on their anonymous ftp sites.
   
   BTW, the Page Composer is pretty slick, although it has no interface
   for doing Javascript. It has a few bugs, but its the best WYSIWYG
   interface for HTML composition on Linux that I've seen. Its better
   than Applix's HTML Editor, although that one does allow exporting to
   non-HTML stuff. Collabra Discussions sucks. The old news reader was
   better at most things. I'd still like to be able to mark a newsgroup
   read up to a certain point instead of the all-or-nothing bit.
   
   For anyone who is interested - 4.x now supports CSS (Cascading Style
   Sheets) and layers. Both of these are *very* cool. They are the future
   of Web design and, IMHO, a very good way to create Multimedia
   applications for distribution on CDs. One of C|Net's web pages (I
   think) has some info on these items, including a demo of layers (moves
   an image all over the screen *over* the underlying text - way cool).
   The only C|Net URL I ever remember is www.news.com, but you can get to
   the rest of their sites from there.
   
   -- Michael J. Hammel
     _________________________________________________________________
   
  Keeping track of tips
  
   Date: Tue, 26 Aug 1997 16:29:13 +0200
   From: Ivo Saviane saviane@astrpd.pd.astro.it
   
   Dear LG,
   
   it always happens to me that I spend a lot of time finding out how to
   do a certain thing under Linux/Unix, and then I forget it. The next
   time I need that information I will start all the `find . ...', `grep
   xxx *' process again and waste the same amount of time!
   
   To me, the best way to avoid that is to send a mail to myself telling
   how to do that particular operation. But mail folders get messy and,
   moreover, are not useful to other users who might need that same
   information.
   
   Finally I found something that contributes solving this problem. I set
   up a dummy user who reads his mail and puts it in www readable form.
   Now it is easy for me to send a mail to news@machine as soon as I
   learn something, and be sure that I will be able to find that
   information again just clicking on the appropriate link. It would also
   be easy to set up a grep script and link it to the same page.
   
   The only warning is to put a meaningful `subject: ' to the mail, since
   this string will be written besides the link.
   
   I am presently not aware of something similar. At least, not that
   simple. It you know, let me know too!
   
   If you want to see how this works, visit
   
   http://obelix.pd.astro.it/~news
   
   A quick description of the basic operations needed is given below.
   
   ----------------------------------------------------------------------
   ----
   
   The following lines briefly describe how to set up the light news
   server.
   
   1. Create a new user named `news'
   
   2. Login as news and create the directories ~/public_html and
   ~/public_html/folders (I assume that your http server is configured so
   that `http://machine/~user' will point to `public_html' in the user's
   $HOME).
   
   3. Put the wmanager.sh script in the $HOME/bin directory. The script
   follows the main body of this message as attachment [1]. The script
   does work under bash.
   
   The relevant variables are grouped at the beginning of the script.
   These should be changed according to the machine/user setup
   
   4. The script uses splitmail.c in order to break the mail file in
   sub-folders The binary file should be put in the $HOME/bin dir. See
   attachment [2].
   
   5. Finally, add a line in the `news' user crontab, like the following
   
   00 * * * * /news_bin_dir/wmanager.sh
   
   where `news_bin_dir' stands for $HOME/bin. In this case the mail will
   be checked once every hour.
   
   ---------------------------------- attachment [1]
#!/bin/sh

# wmanager.sh

# Updates the www news page reading the user's mails
# (c) 1997 Ivo Saviane

# requires splitmail (attachment [2])

## --- environment setup

BIN=/home/obelnews/bin                  # contains all the executables
MDIR=/usr/spool/mail                    # mail files directory
USR=news                                # user's login name
MFOLDER=$MDIR/$USR                      # user's mail file
MYFNAME=`date +%y~%m~%d~%H:%M:%S.fld`   # filename for mail storage under www

FLD=folders                             # final dir root name
PUB=public_html                         # httpd declared public directory
PUBDIR=$HOME/$PUB/$FLD
MYFOLDER=$PUBDIR/$MYFNAME
INDEX=$HOME/$PUB/index.html

## --- determines the mailfile size

MSIZE=`ls -l $MFOLDER | awk '{print $5}'`

## --- if new mail arrived goes on; otherwise does nothing

if [ $MSIZE != "0" ]; then

## --- writes the header of index.html in the pub dir

 echo "<html><head><title> News! </title></head>" > $INDEX
 echo "<h2> Internal news archive </h2> <p><p>" >> $INDEX
 echo "Last update: <i>`date`</i> <hr>" >> $INDEX

## --- breaks the mail file in single folders; splitmail.c must be compiled

 $BIN/splitmail $MFOLDER > $MFOLDER

## --- each folder is copied in the folder dir, under the pub dir,
##     and given an unique name

 for f in $MFOLDER.*; do\
   NR=`echo $f | cut -d. -f2`;\
   MYFNAME=`date +%y~%m~%d~%H:%M:%S.$NR.fld`;\
   MYFOLDER=$PUBDIR/$MYFNAME;\
   mv $f $MYFOLDER;\
 done

## --- prepares the mailfile for future messages

 rm $MFOLDER
 touch $MFOLDER

## --- Now creates the body of the www index page, searching the folders
##     dir

 for f in `ls $PUBDIR/* | grep -v index`; do\
   htname=`echo $f | cut -d/ -f5,6`;\
   rfname=`echo $f | cut -d/ -f6 | sed 's/.fld//g'`;\
   echo \<a href\=\"$htname\"\> $rfname\<\/a\> >> $INDEX;\
   echo \<strong\> >> $INDEX;\
   grep "Subject:" $f | head -1  >> $INDEX;\
   echo \</strong\> >> $INDEX;\
   echo \<br\> >> $INDEX;\
 done

  echo "<hr>End of archive" >> $INDEX
  echo "</html>" >> $INDEX
fi

   ---- attachment [2]


/******************************************************************************

   Reads stdin. Assuming that this has a mailfile format, it breaks the input
   in single messages. A filestem must be given as argument, and single
   messages will be written as  filestem.1 filestem.2 etc.
   (c) 1997 I.Saviane

******************************************************************************/

#define NMAX 256
/*****************************************************************************/

#include <stdio.h>
/*****************************************************************************/

/*****************************************************************************/

/**************************  MAIN **************************************/

int main(int argc, char *argv[]) {

  FILE *fp;
  char mline[NMAX], mname[NMAX];
  int nmail=0, open;

  if(argc < 2) {
    fprintf(stderr, "splitmail: no input filestem");
    return -1;
  }

  fp = fopen("/tmp/xx", "w");
  while(fgets(mline, NMAX, stdin) != NULL) {

    open = IsFrom(mline);
    if(open==1) {

      fclose(fp);
      nmail++;
      sprintf(mname, "%s.%d", argv[1], nmail);
      fp = fopen(mname, "w");
      open = 0;
    }
    fprintf(fp, "%s", mline);
  }
  fclose(fp);
  system("rm /tmp/xx");
  return 1;
}


/*****************************************************************************/

int IsFrom(char *s) {

  if(s[0]=='F' && s[1]=='r' && s[2]=='o' && s[3]=='m' && s[4]==' ') {

    return 1;
  } else {

    return 0;
  }
}
     _________________________________________________________________
   
  Displaying File Tree
  
   Date: Tue, 26 Aug 1997 16:40:43 -0400 (EDT)
   From: Scott K. Ellis storm@gate.net
   
   A nice tool for displaying a graphic tree of files or directories in
   your filesystem can be found at your local sunsite mirror under
   /pub/Linux/utils/file/tree-1.2.tgz. It is also included as the package
   tree included in the Debian distribution.
     _________________________________________________________________
   
  Making Changing X video modes easier
  
   Date: Thu, 28 Aug 1997 20:29:59 +0100
   From: Jo Whitby pandore@globalnet.co.uk
   Hi
   
   In issue 20 of the Linux gazette there was a letter from Greg Roelofs
   on changing video modes in X - this was something I had tried and had
   found changing colour depths awkward, and didn't know how to start
   multiple versions of X.
   
   I also found the syntax of the commands difficult to remember, so
   here's what I did.
   
   First I created 2 files in /usr/local/bin called x8 and x16 for the
   colour depths that I use, and placed the command in them -
   
   for x8
#!/bin/sh
startx -- :$* -bpp 8 &

   and for x16
   
#!/bin/sh
startx -- :$* -bpp 16 &

   then I made them executable -
   
chmod -c 755 /usr/local/bin/x8
chmod -c 755 /usr/local/bin/x16

   now I simply issue the command x8 or x16 for the first instance of X
   and x8 1 or x16 1 for the next and so on, this I find much easer to
   remember:-) An addition I would like to make would be to check which X
   servers are running and to increment the numbers automatically, but as
   I have only been running Linux for around 6 months my script writing
   is extremely limited, I must invest in a book on the subject.
   
   Linux is a fantastic OS, now I've tried it I could not go back to
   Windoze and hate having to turn my Linux box into a wooden doze box
   just to run the couple of progs that I can't live without (Quicken 4
   and a lottery checking prog), so if anyone knows of a good alternative
   to these please let me know, the sooner doze is gone for good the
   better - then Linux can have the other 511Mb of space doze95 is
   hogging!
   
   ps. Linux Gazette is just brilliant, I've been reading all the back
   issues, nearly caught up now - only been on the net for 3 months. I
   hope to be able to contribute something a little more useful to the
   Gazette in the future, when my knowledge is a little better:-)
   
   keep up the good work.
     _________________________________________________________________
   
  Tree Program
  
   Date: Mon, 01 Sep 1997 03:28:57 -0500
   From: Ian Beth13@mail.utexas.edu
   
   Try this instead of the tree shell-script mentioned earlier:
   --------- Cut here --------


#include <stdlib.h>
#include <stdio.h>

#include <sys/stat.h>
#include <unistd.h>

#include <sys/types.h>
#include <dirent.h>


// This is cool for ext2.
#define MAXLEN 256
#define maxdepth 4096

struct dnode {
 dnode *sister;
 char name[MAXLEN];
};

const char *look;
const char *l_ascii="|+`-";
const char l_ibm[5]={179,195,192,196,0};

int total;

char map[maxdepth];

void generate_header(int level) {
 int i;
 for (i=0;i<level;i++) printf(" %c ",(map[i]?look[0]:32));
 printf (" %c%c ",(map[level]?look[1]:look[2]),look[3]);
}

dnode* reverselist(dnode *last) {
 dnode *first,*current;
 first=NULL;
 current=last;

 // Put it back in order:
 // Pre: last==current, first==NULL, current points to backwards linked
list
 while (current != NULL) {
  last=current->sister;
  current->sister=first;
  first=current;
  current=last;
 }

 return first;
}

void buildtree(int level) {
 dnode *first,*current,*last;
 first=current=last=NULL;
 char *cwd;
 struct stat st;

 if (level>=maxdepth) return;

 // This is LINUX SPECIFIC: (ie it may not work on other platforms)
 cwd=getcwd(NULL,maxdepth);
 if (cwd==NULL) return;

 // Get (backwards) Dirlist:
 DIR *dir;
 dirent *de;

 dir=opendir(cwd);
 if (dir==NULL) return;

 while ((de=readdir(dir))) {
  // use de->d_name for the filename
  if (lstat(de->d_name,&st) != 0) continue; // ie if not success go on.
  if (!S_ISDIR(st.st_mode)) continue; // if not dir go on.
  if (!(strcmp(".",de->d_name) && strcmp("..",de->d_name))) continue; //
skip ./
..
  current=new dnode;
  current->sister=last;
  strcpy(current->name,de->d_name);
  last=current;
 }

 closedir(dir);

 first=reverselist(last);

 // go through each printing names and subtrees

 while (first != NULL) {
  map[level]=(first->sister != NULL);
  generate_header(level);
  puts(first->name);
  total++;
  // consider recursion here....
  if (chdir (first->name) == 0) {
   buildtree(level+1);
   if (chdir (cwd) != 0) return;
  }
 current=first->sister;
  delete first;
  first=current;
 }
 free (cwd);
}

void tree() {
 char *cwd;
 cwd=getcwd(NULL,maxdepth);
 if (cwd==NULL) return;
 printf("Tree of %s:\n\n",cwd);
 free (cwd);
 total=0;
 buildtree(0);
 printf("\nTotal directories = %d\n",total);
}

void usage() {
 printf("usage: tree {-[agiv]} {dirname}\n\n");
 printf("Tree version 1.0 - Copyright 1997 by Brooke Kjos
<beth13@mail.utexas.ed
u>\n");
 printf("This program is covered by the Gnu General Public License
version 2.0\n
");
 printf("or later (copyleft). Distribution and use permitted as long
as\n");
 printf("source code accompanies all executables and no additional\n");
 printf("restrictions are applied\n");
 printf("\n\n Options:\n\t-a use ascii for drawings\n");
 printf("\t-[ig] use IBM(tm) graphics characters\n");
 printf("\t-v Show version number and exit successfully\n");
};

void main (int argc,char ** argv)  {
 look=l_ascii;
 int i=1;
 if (argc>1) {
  if (argv[1][0]=='-') {
   switch ((argv[1])[1]) {
    case 'i':
    case 'I':
    case 'g':
    case 'G':
    look = l_ibm;
    break;
    case 'a':
    case 'A':
    look = l_ascii;
    break;
    case 'v':
    case 'V':
    usage();
    exit(0);
    default:
    printf ("Unknown option: %s\n\n",argv[1]);
    usage();
    exit(1);
   } // switch
   i=2;
  } // if2
 } // if1
 if (argc > i) {
  char *cwd;
  cwd=getcwd(NULL,maxdepth);
  if (cwd==NULL) {
   printf("Failed to getcwd:\n");
   perror("getcwd");
   exit(1);
  }
  for (;i>argc;i++) {
   if (chdir(argv[i]) == 0) {
    tree();
    if (chdir(cwd) != 0) {
     printf("Failed to chdir to cwd\n");
     exit(1);
    }
   }
   else printf("Failed to chdir to %s\n\n",argv[i]);
  } // for
  free (cwd);
 } else tree();
}

   ------- Cut Here --------
   
   Call this tree.cc and run gcc -O2 tree.cc -o /usr/local/bin/tree.
     _________________________________________________________________
   
  Managing an Entire Project
  
   Date: Tue, 26 Aug 1997 16:44:06 -0400 (EDT)
   From: Scott K. Ellis storm@gate.net
   
   While RCS is useful for managing one or a small set of files, CVS is a
   wrapper around RCS that allows you to easily keep track of revisions
   across an entire project.
     _________________________________________________________________
   
  Finding what you want with find
  
   Date: Tue, 2 Sep 1997 21:53:41 -0500 (CDT)
   From: David Nelson dnelson@psa.pencom.com
   
   While the find . -type f -exec grep "string" {} \; works, it does not
   tell you what file it found the string in. Try using find . -type f
   -exec grep "string" /dev/null {} \; instead.
   
   David /\/elson
     _________________________________________________________________
   
  Minicom kermit help
  
   Date: Wed, 10 Sep 1997 12:21:55 -0400 (EDT)
   From: "Donald R. Harter Jr." ah230@traverse.lib.mi.us
   
   With minicom, ckermit was hanging up the phone line after I exited it
   to return to minicom. I was able to determine a quick fix for this. In
   file ckutio.c comment out (/* */) line 2119 which has tthang() in it.
   tthang hangs up the line. I don't know why ckermit thought that it
   should hang up the line.
   
   Donald Harter Jr.
     _________________________________________________________________
   
  Postscript printing
  
   Date: Sun, 7 Sep 1997 15:12:17 +0200 (MET DST)
   From: Roland Smith mit06@ibm.net
   
   Regarding your question in the Linux Gazette, there is a program that
   can interpret postscript for different printers. It's called
   Ghostscript.
   
   The smartest thing to do is to encapsulate it in a shell-script and
   then call this script from printcap.
   
----- Ghostscript shell script -------

#!/bin/sh
#
# pslj       This shell script is called as an input filter for the
#            HP LaserJet 5L printer as a PostScript printer
#
# Version:   /usr/local/bin/pslj  1.0
#
# Author:     R.F. Smith <rsmit06@ibm.net>

# Run GhostScript, which runs quietly at a resolution
# of 600 dpi, outputs for the laserjet 4, in safe mode, without pausing
# at page breaks, writing and reading from standard input/output
/usr/bin/gs -q -r600 -sDEVICE=ljet4 -dSAFER -dNOPAUSE -sOutputFile=- -
------- Ghostscript shell script ------

   You should only have to change the resolution -r and device -sDEVICE
   options to something more suitable to your printer. See gs -? for a
   list of supported devices. I'd suggest you try the cdeskjet or
   djet500c devices. Do a chmod 755 <scriptname>, and copy it to
   /usr/local/bin as root.
   
   Next you should add a Postscript printer to your /etc/printcap file.
   Edit this file as root.
   
-------- printcap excerpt -----------

ps|HP LaserJet 5L as PostScript:\
    :lp=/dev/lp1:\
    :sd=/var/spool/lp1:\
    :mx#0:\
    :if=/usr/local/bin/pslj:sh

-------- printcap excerpt ------------

   This is the definition of a printer called ps. It passes everything it
   should print through the pslj filter, which converts the postscript to
   something my Laserjet 5 can use.
   
   To print Postscript, use lpr -Pps filename.
   
   change this to reflect your script name.
   
   Hope this helps!
   
   Roland
     _________________________________________________________________
   
  Realaudio without X-windows
  
   Date: Sun, 7 Sep 1997 00:45:58 -0700 (PDT)
   From: Toby Reed toby@eskimo.com
   
   This is more of a pointer than a tip, but your readers might want to
   check out traplayer on sunsite, it lets you play realaudio without
   starting up an X server on your screen. Kinda useful if you don't like
   to use memory-hog browsers just to listen to realaudio.
   
   The file is available at sunsite.unc.edu/pub/Linux in the Incoming
   directory (until it gets moved), and then who knows where. It's called
   traplayer-0.5.tar.gz.
     _________________________________________________________________
   
  Connecting to dynamic IP via ethernet
  
   Date: Fri, 12 Sep 1997 13:22:06 +0200
   From: August Hoerandl hoerandl@elina.htlw1.ac.at
   
   in LG 21 Denny wrote:
   
   "Hello. I want to connect my Linux box to our ethernet ring here at my
   company. The problem is that they(we) use dynamic IP adresses, and I
   don't know how to get an address."
   
   There is a program called bootpc (a bootp client for linux). From the
   LSM entry (maybe there is a newer version now):
   
Title:          Linux Bootp Client
Version:        V0.50
Entered-date:   1996-Apr-16
Description:    This is a boot protocol client used to grab the machines
                ip number, set up DNS nameservers and other useful information.
Keywords:       bootp bootpc net util
Author:         ceh@eng.cam.ac.uk (Charles Hawkins)
Maintained-by:  J.S.Peatfield@damtp.cam.ac.uk (Jon Peatfield)
Primary-site:   ftp.damtp.cam.ac.uk:/pub/linux/bootpc/bootpc.v050.tgz
Alternate-site:
sunsite.unc.edu:/pub/Linux/system/Network/admin/bootpc.v050.tgz
Platform:       You need a BOOTP server too.
Copying-policy: This code is provided as-is, with no warrenty, share and
enjoy.

   The package inludes a shell script to set up the ethernet card, send
   the bootp request, receive the answer and set up everything needed.
   
   I hope this helps
   
   Gustl
     _________________________________________________________________
   
  Running commands from X w/out XTerm
  
   Date: Fri, 26 Sep 1997 18:28:51 -0600
   From: "Kenneth R. Kinder" Ken@KenAndTed.com
   
   I often found myself running XTerm just to type a single shell
   commmand. After a while, you just wish you could run a single command
   without even accessing a menu. To solve this problem, I wrote exec. As
   the program name would emply, the exec program mearly prompts (in X11)
   for a command, and replaces its own process with the shell-orriented
   command you type in. Exec can also browse files, and insert the path
   in the text box, incase you need a file in your command line. Pretty
   simple huh? Exec (of course!) is GPL, and can be downloaded at
   http://www.KenAndTed.com/software/exec/ -- I would appreciate it if
   someone would modify my source to do more! =)
     _________________________________________________________________
   
  Ascii problems with FTP
  
   Date: Wed, 24 Sep 1997 12:42:05 -0400
   From: Carl Hohman carl@microserv-canada.com
   
   Andrew, I read your letter to the Linux Gazzette in issue 19. I don't
   know if you have an answer yet, but here's my 2 bits...
   If I understand correctly, you are using FTP under DOS to obtain Linux
   scripts. Now, as you may know, the line terminators in text files are
   different between Unix systems and DOS (and Apples, for that matter).
   I suspect that what's happening is this: FTP is smart enough to know
   about terminator differences between systems involved in an ascii mode
   transfer and performs appropriate conversions silently and on the fly.
   This give you extra ^M's on each line if you download the file in DOS
   and then simply copy it (or use an NFS mount) to see it from Unix. I
   suspect that if you use a binary tranfer (FTP> image) the file will
   arrive intact for Linux use if it originates on a Unix server.
   
   Hope this helps.
   Carl Hohman
     _________________________________________________________________
   
  Red Hat Questions
  
   Date: Thu, 18 Sep 1997 14:06:08 -0700
   From: James Gilb p27451@am371.geg.mot.com
   
   Signal 11 crashes are often caused by hardware problems. Check out the
   The Sig11 FAQ on: http://www.bitwizard.nl/sig11/
   
   James Gilb
     _________________________________________________________________
   
             Published in Linux Gazette Issue 22, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
      This page maintained by the Editor of Linux Gazette, gazette@ssc.com
      Copyright © 1997 Specialized Systems Consultants, Inc.
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                                 News Bytes
                                      
                                 Contents:
                                      
     * News in General
     * Software Announcements
     _________________________________________________________________
   
                              News in General
     _________________________________________________________________
   
  BLINUX Documentation and Development Project
  
   The purpose of The BLINUX Documentation and Development Project is to
   serve as a catalyst which will both spur and speed the development of
   software and documentation which will enable the blind user to run his
   or her own Linux workstation.
   
   Their web site is at:
   http://leb.net/blinux/
   It contains information about documenting Linux for the Blind and
   Visually Impaired, the BLINUX FTP Archive, and where to find Linux
   Software for the Blind User.
     _________________________________________________________________
   
  Linux "class" via the Internet
  
   There is a Linux "class" being offered on the internet! It's a
   beginners class that's using Matt Welsh's "Running Linux" as the
   textbook. Lessons are posted to the site, with links to Linux related
   urls and reading from the text as additional assignments. I just
   checked out the first lesson (history of Linux), looks pretty good.
   
   If anyone's interested (it's free), the url is:
   http://www.vu.org/channel25/today/
     _________________________________________________________________
   
  WindowMaker and AfterStep themes
  
   Give your X-windows a whole new look with one of the WindowMaker or
   AfterStep themes. There are almost 30 different themes for the
   WindowMaker and another 30 for AfterStep window manager available at:
   http://x.unicom.net/themes
     _________________________________________________________________
   
                           Software Announcements
     _________________________________________________________________
   
  TCD 1.0: New curses-based CD player
  
   TCD is a new curses based CD player for Linux. Here are some of it's
   distinct features:
   
   * Nice-looking color (if supported) curses interface.
   * Simple, sensible, one-keystroke control. (No more mapping little
   icons to your keypad!) :)
   * Repeat track, continuous play control.
   * Track name database.
   * Uses little CPU time while running.
   
   It should still be at
   ftp://sunsite.unc.edu/pub/Linux/Incoming/tcd-1.0.tar.gz
   
   But by the time you read this is may have moved to
   /pub/Linux/apps/sound/cdrom/curses/
     _________________________________________________________________
   
  urlmon -- The URL Monitor
  
   urlmon reports changes to web sites (and ftp sites, too).
   
   urlmon makes a connection to a web site and records the last_modified
   time for that url. Upon subsequent calls, it will check the url again,
   this time comparing the information to the previously recorded times.
   Since the last_modified data is not required to be given by HTTP (it's
   optional) and is non-existent for ftp, urlmon will then take an MD5
   checksum.
   
   It's real utilitity is evident when running it periodically (from
   cron, for example) in batch mode, so as to keep tabs on many different
   web pages, reporting on those that have recently changed.
   
   New with 2.1, it can monitor muliple URLs in parallel. It also has
   user settable proxy server ability, and user settable timeout lengths.
   A few algorithm improvements have been made.
   
   It can be found at
   
   http://sunsite.unc.edu/pub/Linux/apps/www/mirroring/urlmon-21.tgz
   
   http://web.syr.edu/~jdimpson/proj/urlmon-21.tgz
   
   ftp://camelot.syr.edu/pub/web/urlmon-21.tgz
   
   urlmon requires perl 5, the LWP perl modules, the MD5 module, all
   available at any CPAN archive http://www.perl.com/perl/CPAN/
     _________________________________________________________________
   
  New Netscape Version for Linux
  
   Netscape Communicator 4.03 (Standard and Professional editions) is now
   available for Linux.
   
   To download it, go to http://www.netscape.com
     _________________________________________________________________
   
  TeamWave Workplace 2.0
  
   TeamWave Workplace is an Internet groupware product that lets you work
   together with colleagues in shared Internet rooms using Windows,
   Macintosh or Unix platforms.
   
   TeamWave's rooms are customized with shared tools like whiteboards,
   chat, calendars, bulletin boards, documents, brainstorming and voting,
   so you can fit the rooms to your team's tasks. Team members can work
   together in rooms any-time, whether meeting in real-time or leaving
   information for others to pick up or add to later.
   
   The support for any-time collaboration and easy customization,
   combined with its rich cross-platform support and modest
   infrastructure needs, make TeamWave Workplace an ideal communication
   solution for telecommuters, branch offices, business teams, road
   warriors -- any teams whose members sometimes work apart.
   
   System Requirements: TeamWave Workplace runs on both Windows 95/NT and
   Macintosh platforms, as well as SunOS, Solaris, SGI, AIX and Linux. A
   network connection (LAN or modem) is also required.
   
   Availability and Pricing
   
   TeamWave Workplace 2.0 is available now. A demonstration version may
   be downloaded from TeamWave's web site at http://www.teamwave.com/. A
   demo license key, necessary to activate the software, can also be
   requested from the web site.
   
   Regular licenses are US$50 per team member, with quantity discounts
   available. Licenses can be purchased via postal mail, fax, email or
   secure web server. We are making free licenses available for qualified
   educational use. Please see our web site for additional information.
     _________________________________________________________________
   
             Published in Linux Gazette Issue 22, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
      This page written and maintained by the Editor of Linux Gazette,
      gazette@ssc.com
      Copyright © 1997 Specialized Systems Consultants, Inc.
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                               The Answer Guy
                                      
                   By James T. Dennis, jimd@starshine.org
          Starshine Technical Services, http://www.starshine.org/
     _________________________________________________________________
   
  Contents:
  
     * Faxing and Dialing-Out on the Same Line
     * Linux and the 286
     * Accessing ext2fs from Windows 95
     * chattr +i
     * Linux sendmail problem
     * POP3 vs. /etc/passwd
     * Problem with make
     * Swap partition and Modems
     * Redhat 4.2/Motif
     * E-mail adjustment needed
     * REALBIOS?
     * X-Windows Libraries
     * PC Emulation
     * Visual Basic for Linux
     * Linux 4.2 software and Hardware compatablity problems
     * Moving /usr subdirectory to another drive..
     * C++ Integrated Programming Enviroment for X...
     * LYNX-DEV new to LYNX
     _________________________________________________________________
   
  Faxing and Dialing Out on the Same Line
  
   From: Carlos Costa Portela c.c.portela@ieee.org 
   
   Hello, Linux Gazette!
   First of all, let me say you that the Gazette is EXCELLENT! Well, you
   probably know that, but I must say it!. I have the next problem:
   I am using the fax program efax, by Ed Casas. Really good!. When my
   system starts, I put the fax in answer mode: 
   
   This is the entry in the inittab file: rf:3:respawn:/bin/sh
   /usr/bin/fax answer 
   
   Another option here would be 'mgetty' -- which provides dial-in
   (terminal, PPP, etc) and fax support on the same line. Allegedly the
   'vgetty' extension to 'mgetty' will even allow limited "voice" support
   on that same line (although the only modem that's currently supported
   seems to be certain Zyxel models -- none of the other modem
   manufacturers seem to be willing to release the API's for voice
   support!).
   
   But sometimes a day (once or twice) I need my modem to connect to my
   ISP and, at least, read and send my mail! 
   
   Then there is an overlapping between one program -or command- and the
   other. 
   
   This is a very common situation. That's why Unix communications
   programs support various sorts of "device locking."
   
   The only trick is to make sure that all the programs on your system
   agree on the name, location, and type of lock files.
   
   On a Linux box this is reasonably easy -- compile them all to use the
   /var/lock/ directory. The lock files will be of the form: LCK..$device
   (where $device is the base name of the modem device -- like 'ttyS0' or
   'modem'). That takes care of the location.
   
   My advice is to ignore everything you've heard about using "cuaXX" as
   the call out device and "ttySxx" as the dial-in device. I make a
   symlink from /dev/modem to the appropriate /dev/ttyS* node and use
   /dev/modem as the device name for EVERYTHING (pppd, chat, uucp,
   C-Kermit, minicom, efax, mgetty/sendfax, diald, EVERYTHING). Obviously
   that advice applies to situations where you only have one or two
   modems. If you're handling whole banks of modems (you're an ISP) than
   your situation is different (you probably don't allow much dial-out
   via these lines and would probably have one or more lines dedicated to
   fax). However, that handles the 'name' issue.
   
   Finally there is the question of lock file "type." There are three
   common strategies in Unix for dealing with lock files. The first a
   refer to a "touch" -- the mere existence of any file by the correct
   name is a flag for all other processes to leave the device/resource
   alone. If a process dies and leaves a stale lock file -- there is not
   automatic recovery -- an administrator must manually remove the lock
   file. This limitation makes this the least useful and least common of
   the lockfile types.
   
   With the other sorts of lock files the controlling process (the one
   creating the lock) writes its PID into the file. Any other process
   seeing the lock file then parses a 'ps' listing to determine the
   status of the process that locked the resource. If it's dead or
   non-existent (possibly even if it's a zombie) then the new process
   removes the "stale" lock file (usually with a message to that effect)
   and creates a new one.
   
   Here the only question is: what format should the PID be written in? I
   prefer "text" (i.e. the PID is a string of ASCII digits -- like the
   printf("%d", int) would generate). Some programs might default to
   "binary" -- where the PID is written to the file in the same way that
   a program stores it in memory.
   
   The advantage of text format lock files is that you can more easily
   write a wrapper script in perl, sh, or whatever -- to provide lock
   file support to a program that doesn't use the same sort of lock files
   you want. Another advantage is that the admin of a system can read it
   -- and use 'ps' or 'top' to check the state of the locking process
   manually (useful if a client program is overly timid about removing
   the lock file from a "zombie" for example).
   
   The only other problem associated with device lock files involves the
   permissions of the /var/lock directory. The simple solution is to make
   it world writable. However I consider that to be poor administrative
   practice -- particularly on a multi-user or server system. You can't
   make this directory "sticky" (as you should with your /tmp/) unless
   you make all of your modem using programs SUID. If you did that, no
   program would be able to remove a lock file that was created by a
   different user -- stale or otherwise.
   
   So, I make this directory group writable by the 'uucp' group and make
   all my modem using programs SGID 'uucp'. If you need finer grain
   support (for other programs that use the /var/lock directory) then
   you'd want to create more specific directories below /var/lock, and
   compile all of your programs to use those. On my main Red Hat (3.03)
   system all of the other programs that I've see use directories below
   /var/lock/ so only my modem programs really need write access.
   Obviously any root owned, or suid root or even suid 'bin' programs can
   also write to the /var/lock directory -- all we're doing is keeping
   out the "riff-raff" (like my personal shell account).
   
   Obviously, this is not a solution:
   Turn off the modem, and then turn on.
   Kill the efax process. 
   
   Because the entry has a "respawn" keyword. 
   
   What is the best way to:
   - inactivate the fax.
   - connect to Internet.
   - disconnect.
   - activate the fax. 
   
   The best way is to avoid the problem. Configure or compile efax to use
   a locking mechanism that's compatible with your dial-out programs (or
   switch to 'mgetty' or some other enhanced getty).
   
   The 'mgetty' home page is at:
   
   Mgetty+Sendfax Documentation Centre (Gert Doering)
   http://www.leo.org/~doering/mgetty/
   
   ... and some related resources are at:
   
   ISP Resources - mgetty info (AutoPPP)
   http://www.buoy.com/isp/mgetty.html
   
   Coastal Internet - ISP Info! http://www.buoy.com/isp/
   
   Well, one solution is:
   go to the /etc/inittab comment the line restart the system Is there a
   better one?. 
   
   If you really had an insurmountable problem of this sort -- a program
   that just wouldn't co-exist with something that you're respawning in
   your inittab (like some weird UPS power daemon or data aquisition
   service) -- I'd solve it using a new runlevel. The line where you're
   loading your fax daemon process specifies that it runs in level 3 (the
   default "multi-user with networking" mode). So you could just use the
   'telinit 4' command to switch to the (currently undefined or "custom")
   runlevel. This should kill the fax process (and any getty's or xdm's
   that you have configured for runlevel 3) and start any processes that
   you define for runlevel 4.
   
   Read the man page for inittab(5) (that is "the inittab page in section
   section 5 of the man tree") for details. I've always been mildly
   surprised that the SysV Init programmers didn't put in options for a
   full 9 runlevels (where 7, 8, and 9 would all be custom). However I've
   never seen a need for such elaborate handling -- so they likely didn't
   either.
   
   Hope that clarifies the whole issue of lock files and resolving access
   concurrency issues. You can use similar programming techniques (even
   in shell scripts) to resolve similar problems with directory, file, or
   device locking.
   
   -- Jim
     _________________________________________________________________
   
  Linux and the 286
  
   From: tbickl@inreach.com tbickl@inreach.com 
   
   Hello,
   I am taking a class at community college for introduction to Unix. I
   was told I could download Linux, put it on the 286 machine I have, and
   that it would function well enough to learn from. 
   
   You were told wrong.
   
   Searching thru the downloadables, I have only seen versions that will
   run on 386 or above, and I do not have a 386 machine available to me
   right now. 
   
   Your observations are to be trusted more than the sources of your
   rumors.
   
   Do you know if and where I could find a version of Linux that would
   suffice? 
   
   There is a project to produce an 8086 (and thus 286 compatible) subset
   of the Linux kernel (ELK -- embeddable Linux kernel). However it is
   probably not far enough along to be of interest to you. More generally
   we can say that a kernel is not enough -- there would be considerable
   work to porting a large enough set of tools to the subset
   architecture.
   
   Moving back a little bit from Linux specifically we can recommend a
   couple of Unix like OS' that did run on the 286. Of them, only Minix
   is still widely available. It is not free (in the sense of GPL or the
   BSD License) -- but is included with copies of Andrew Tanenbaum's
   seminal text book on _Operating_Systems_Design_and_Implementation_.
   You'll want the 2nd Edition.
   
   The two other implementations of Unix that have run on 286 systems are
   Xenix (originally a Microsoft product then handed off to SCO -- Santa
   Cruz Operations; which I think Microsoft still owns a good chunk of)
   and long since discontinued, and Coherent (by the now defunct Mark
   Williams Company).
   
   Neither of these offered any TCP/IP support. I think the latest
   versions of Minix do -- although I don't know how robust or extensive
   that support is.
   
   For the price of the book you could probably find a 386 motherboard
   and 16Mb of RAM to toss on it. I don't like to "push" people into
   hardware upgrades -- but the change from 286 to 386 is night and day.
   
   Like I said, it only has to function textually (textually?), no
   graphics or other fancies are necessary. Just regular
   Unix-command-line based stuff. 
   
   The tough nut to crack isn't really the GUI -- Geoworks' Ensemble
   provided that (also there used to be a Windows for the 286 and Windows
   3.x had a "standard mode" to support the AT). It isn't the
   timeslicing/multitasking (DESQview did that). It isn't providing Unix
   semantics in a shell and a set of Unix like tools (there's a whole
   directory full of GNUish tools on SimTel and there's the earlier
   versions of the MKS toolkit).
   
   The hard part of running a "real" Unix on a 286 or earlier processor
   is the memory protection model. Prior to the 286 there was simply no
   memory protection mechanism at all. Any process could read or write to
   any address (I/O or memory) and therefore had complete control of the
   machine. These architectures are unsuitable for multi-user interactive
   systems. Unix is, at its heart, a multi-user system.
   
   Thank you for any help you can offer . . . 
   
   The most bang for your buck is to buy a 386 or better motherboard. If
   you are in the SF bay area (Silicon Valley) I can give you one. This
   will allow you to run Linux, OpenBSD (or any of the other FreeBSD
   derivatives) and will just make more sense than spending any time or
   money on the 286.
   
   If that just doesn't work for you -- get a copy of Tanenbaum's book
   (with the included CD). In fact, even if that does work for you, get a
   copy of his book. If you read that, you'll probably more about Unix
   than your instructors.
   
   --Jim
     _________________________________________________________________
   
  Accessing ex2fs from Windows 95
  
   From: globus@pathcom.com 
   
   Hi:
   Just wondering, is there any way (i.e. driver) in existence that would
   let me access ext2fs from Win95? I need read and write capabilites. 
   
   Try the Linux Software Map (currently courtesy of ExecPC). I used just
   the keyword "DOS":
   
   Have you looked at ext2tool:
   
   Database: Linux Software Map
   
   Title: Ext2 tools
   Version: 1.1
   Entered-date: 09 Jan, 96
   
   Description:
   A collection of DOS programs that allow you to read a Linux ext2 file
   system from DOS.
   
   Keywords: DOS, ext2
   Author: ct@login.dknet.dk (Claus Tondering)
   Maintained-by: ct@login.dknet.dk (Claus Tondering)
   Primary-site:
   login.dknet.dk pub/ct
   287706 ext2tool_1_1.zip
   Alternate-site:
   sunsite.unc.edu pub/Linux/system/Filesystems/ext2
   287706 ext2tool_1_1.zip
   Platforms:
   PC with 386 or better
   Copying-policy: GPL
   
   There is also an installale filesystem for OS/2 -- but that probably
   won't help you much.
   
   -- Jim
     _________________________________________________________________
   
  chattr +i
  
   From: ckkrish@cyberspace.org 
   
   Hi Jim, I was going thru the "Tips" document distributed along with
   Slackware 3.2. Thanks for the "chattr +i". I used to take pride that I
   knew Unix related stuff reasonably well, until I read about
   "attribute" in your snippet. If only I had read it a few weeks before!
   I have been running Linux for about 2 years now. Only recently I went
   for an upgrade. To Slackware 3.2. While exploring the set of four CD's
   that came in the pack, I hit upon a language called INTERCAL - a sort
   of crazy stuff, the antethe- sis of a good programming language. As
   per the documents that ac- companied it, INTERCAL was made by pundits
   for fun. Well, I gave a "make install" and after that the usuall
   commands failed! The makefile had a line to "rm -f" everything from
   the target "bin" directory! I really felt a need for a "chattr +i" at
   that time, not really aware that it already exists. Thanks for the
   tip. It is a lifesaver. 
   
   You're welcome. If you're ever administering a BSD machine (FreeBSD,
   OpenBSD, NetBSD or the commercial BSDI/OS) you can use the chflags
   +syschg command for the same purpose. That requires the UFS filesystem
   (while Linux' chattr is exclusively for ext2 filesystems. If they ever
   port ext2fs to other Unix system they'll probably port the lsattr and
   chattr commands along with them.
   
   There's a few other tips you should consider following -- which will
   also help prevent disasters. First, configure your /usr/ as a separate
   filesystem and mount it read-only. You can always issue a 'mount'
   command with the 'remount' option when you really need to write to it
   (which should be pretty rarely). As part of that -- make sure to
   consistently user /usr/local for all new software that you install. It
   should also be a separate filesystem which you usually leave mounted
   read-only. Developement should be done in home directories, additions
   that are not part of a distribution should be in /usr/local/ and the /
   and /usr/ should be almost exclusively reserved for things that came
   with the initial installation. (you may end up and a /opt as well --
   though mine is just a symlink to /usr/local).
   
   Following these conventions helps when you need to do an upgrade --
   since you can isolate, even unmount, the portions of your directory
   tree that the OS upgrade should NOT touch.
   
   The other suggestion is to avoid doing things as root. You can set the
   permission on /usr/local to allow write access to member of a "staff"
   or "wheel" or "adm" group (I like to just create one called staff) --
   and add your user account to that group. You can also use also use
   'sudo' and carefully chosen suidperl scripts (which are also group
   executable and not accessible to other) to minimize the time you spend
   at the root prompt.
   
   I've read about Intercal before. It's almost as infamous as TECO (the
   "tape editing command") which was the language in which EMACS was
   originally implemented. EMACS stands for "editor macros." There is a
   TECO emulator for GNU emacs now -- which was obviously done to satisfy
   some lisp programmer's sick fascination with recursion.
   
   Anyway -- glad my tips were helpful.
   
   -- Jim
     _________________________________________________________________
   
  Linux sendmail problem
  
   From: Jason Moore jsmoore@brain.uccs.edu 
   
   I have a problem with my linux setup. I have a Linksys Ether16
   Ethernet Card(NE2000 compat), and It finds the card fine(with the
   correct irg, etc..) but when it boots, the machine freezes when it's
   loading send mail. currently I'm using Redhat 4.2, Kernal 2.0.30, and
   I don't know anything about sendmail. 
   
   Sendmail isn't really hanging. It's blocking while waiting for a DNS
   query to time out. If you were to leave it alone long enough it would
   eventually timeout and your boot process will continue.
   
   This is because your system can't talk to a name server whereby your
   copy of sendmail can look up the names associated with your network
   interfaces (using "reverse" DNS resolution). The quick solution is to
   remove the symlink from /etc/rc.d/rc3.d/S??sendmail (which points to
   /etc/rc.d/init.d/sendmail).
   
   I like to manage these by creating a "disabled" directory under each
   of the /etc/rc.d/ directories -- then I can disable any of the startup
   scripts by simply moving their symlinks down one directory. The
   advantage of this is that is is self-documenting. Also, if I have to
   put an entry back in -- I don't have to wonder what numeric sequence
   it used to be in, since this "meta information" is encoded in the
   symlink's name (that's what the Sxx and Kyy part of the link names are
   doing).
   
   Another thing you could do is just start sendmail asynchronously. To
   do this just find the line in /etc/rc.d/init.d/sendmail that actually
   loads /usr/lib/sendmail -- and put an "&" (ampersand) on the end of
   the line. If you do that right then sendmail will do it's waiting (and
   timing out) in the background -- and the rest of your startup scripts
   will continue.
   
   Obviously this last item is not a solution -- it's just a workaround.
   sendmail will still fail to operate properly until it's configured
   properly (big surprise, right?).
   
   I'm not going to write a treatise on sendmail configuration here.
   First I don't have enough information about your network connections
   and your requirements (it would be a monumental waste of our time if
   you're planning on reading your e-mail from a different system, for
   instance). Also there are a few HOWTO's and Mini-HOWTO's and a couple
   of pretty decent books on the topic. Here's the HOWTO's you want to
   peruse:
   
DNS HOWTO
  How to set up DNS.
  _Updated 3 June 1997._
http://sunsite.unc.edu/LDP/HOWTO/DNS-HOWTO.html

   (Like I said -- the real problem is your DNS).
   
Electronic Mail HOWTO
  Information on Linux-based mail servers and clients.
  _Updated 29 November 1995. _
http://sunsite.unc.edu/LDP/HOWTO/Mail-HOWTO.html

   (This is a bit of an overview).
   

Mail Queue mini-HOWTO
  How to queue remote mail and deliver local mail.
  _Updated 22 March 1997. _
http://sunsite.unc.edu/LDP/HOWTO/mini/Mail-Queue

   (This is more specific -- and might be how you want to do your mail).
   

Offline Mailing mini-HOWTO
  How to set up email addresses without a dedicated Internet
  connection.
  _Updated 10 June 1997. _
http://sunsite.unc.edu/LDP/HOWTO/mini/Offline-Mailing

   (This is another way you might want to do your mail).
   

ISP Hookup HOWTO
  Basic introduction to hooking up to an ISP.
  _Updated 9 December 1996. _
http://sunsite.unc.edu/LDP/HOWTO/ISP-Hookup-HOWTO.html

   (Your e-mail almost certainly has to go through some sort of ISP to
   get anywhere beyond your system. Reading this will determine which of
   the mail configuration options are available to you).
   

PPP HOWTO
  Information on using PPP networking with Linux.
  _Updated 31 March 1997. _
http://sunsite.unc.edu/LDP/HOWTO/PPP-HOWTO.html

   (Most people are connecting to their ISP's via PPP these days. There
   are other sorts of connections, like SLIP and various SLIP/PPP
   "emulators" (like TIA))
   

UUCP HOWTO
  Information on UUCP software for Linux.
  _Updated 29 November 1995. _
http://sunsite.unc.edu/LDP/HOWTO/UUCP-HOWTO.html

   (This is another way to get mail and news. It is much older than PPP
   and SLIP and doesn't support protocols like HTTP. UUCP is a protocol
   that can work over dial up modem lines, or over TCP/IP -- including
   PPP and SLIP. I use UUCP for all my mail and news -- because it is
   designed for intermittent operation and spooling. However it can be a
   hassle to find an ISP that's ever heard of it. Another advantage to a
   UUCP feed is that you can control your own e-mail address space --
   every user you create on your box can send and receive e-mail and
   read/post news. You don't have to have to ask your ISP to do anything
   at their end -- and they can't charge you based on the number of
   addresses at your end)

Sendmail+UUCP mini-HOWTO
  How to use sendmail and UUCP together.
  _Updated 15 March 1997. _
http://sunsite.unc.edu/LDP/HOWTO/mini/Sendmail+UUCP

   (In the unlikely event that you decide to go out and find a UUCP feed
   (or several -- it can handle that) this is what you need to configure
   sendmail to talk to UUCP. This isn't difficult (once you have UUCP
   working) -- and sendmail and UUCP have been interoperating for over
   twenty years. It's just that you have to pay attention to the
   details).
   
   Although our whole discussion has been about 'sendmail' -- it's worth
   noting that there are a couple of alternatives to it available. The
   two that are relatively recent and readily available for Linux are
   'smail' and 'qmail.' I'm not going to go into much detail about them
   -- but you can find out more about these at:
   
        smail:
                FTP Site:
                ftp://ftp.uu.net/networking/mail/smail

                Newsgroup:
                news:comp.mail.smail

        qmail:
                http://www.qmail.org

   -- Jim
     _________________________________________________________________
   
  POP3 vs. /etc/passwd
  
   From: Benjamin Peikes benp@npsa.com 
   
   The problem with that is that now that person has ftp access. Too many
   programs rely on /etc/passwd. What I would like is to be able to set
   up users on a per service basis. 
   
   Yes -- I understood that from the get go.
   
   I guess what I'm looking for is a way to manage which users can use
   which services. i.e. put this person into a no ftp, no samba, yes mail
   group. I guess what I really need is to write some scripts to manage
   users/services. 
   
   This is precisely the intent of PAM/XSSO. Unfortunately PAM isn't
   quite done yet -- it's about 60% there and can be used for some of
   what you want now.
   
   Under PAM you can configure any service to require membership in a
   specific group. You can also limit access to specific users based on
   the time of day or the source of the connection -- setup ulimit's and
   environment values, and provide/require S/Key (OPIE) one-time
   passwords in some cases while allowing plaintext in others.
   
   Under the hood you can use shadowing, pwdb (indexed/hashed
   account/password files) to handle large numbers of accounts (without
   introducing linear delays for lookups), MD5 or "big DES" to allow long
   passwords (some might write an SHA-1 password hashing module now that
   MD5 has shown some weakness).
   
   You could write a custom SQL query client if you wanted to allow
   database driven access to a particular service. The advantage to PAM
   is that you'd write this once -- and an admin could use it on any
   service with no coding required.
   
   This gives us the flexibility that previously required very localized
   sysadmin hacking -- to reinvent the same wheel at every site and for
   every service!
   
   -- Jim
     _________________________________________________________________
   
  Problem with make
  
   Date: Thu, 25 Sep 1997 21:17:56 -0700
   
   From: Alfredo Todini mc0736@mclink.it
   Jim, 
   
   I have a strange problem with make. I have Red Hat 4.0, and I recently
   installed GNU make 3.76.1. The compilation went well, and the program
   works, except for the fact that it doesn't accept the "short" version
   of the command line options. For example, "make --version" works,
   "make -v" doesn't; "make --file" works, "make -f" doesn't. All I get
   in these cases is the standard "invalid option" error message. It
   seems to be a problem related to my particular Linux distribution: I
   have also tried it on a Slackware 3.2 distribution, and it worked
   well. The old version of make that I have removed to install the new
   one worked well.
   
   Could you please help me? 
   
   This sounds very odd. What version of GCC did you use? Did you run the
   ./configure script under this directory? For GNU software this
   behavior should be controlled by the getopt libraries (defined in your
   /usr/include/getopt.h) -- which I think are linked with your normal
   libc (C libraries).
   
   So, are there differences between the getopt.h files between these
   systems? What libc's are these linked against (use the 'ldd' command
   to see that)? Are there differences between the Makefiles generated by
   the ./configure on each of these systems?
   
   If you make the program ('make') on one system, and copy it to the
   other system -- do you see the same problem? How about the converse?
   What if each is made "statically" (not using shared libraries)?
   
   Obviously, there are many ways to try to isolate the problem.
   
   I just make a copy of this same version -- grabbed it from
   prep.ai.mit.edu, ran ./configure and make -- and tested it (in part by
   taking the 'make' I just built and using it to remake itself). There
   was no problem.
   
   --Jim
     _________________________________________________________________
   
  Swap partition and Modems
  
   Date: Thu, 25 Sep 1997 16:50:19 -0700
   From: Robert Rambo robert.rambo@yale.edu
   
   I was wondering if it is possible to resize the swap partition in
   Linux. I think mine is too small, I keep getting some virtual memory
   problem and a friend of mine suggested changing the swap partition. 
   
   Resizing is more trouble than its worth. You can add addition swap
   partitions or swap files. Must read the 'mkswap' and 'swapon (8)' man
   pages for details.
   
   --Jim
     _________________________________________________________________
   
  Redhat 4.2/Motif
  
   Date: Thu, 25 Sep 1997 03:11:51 -0700
   From: "Victor J. McCoy" vmccoy@kmrmail.kmr.ll.mit.edu
   
   Ok, the details first:
   Redhat 4.2 (default installation)
   Redhat Motif 2.0.1
   Intel p133
   64 MB RAM
   ATI Graphics Pro Turbo (4MB)
   I think that's all the relevant info.
   I'm having trouble with pppd and Motif. If I run my connection script,
   the Motif stops behaving properly.
   
   Before pppd...popup menus work fine, click anywhere in client window
   and focus shifts.
   
   After pppd...popups are non-existent, must click on window border to
   get focus. 
   
   Are there *any* other symptoms?
   This seems awfully specific -- and the PPP connection seems awfully
   peripheral to the windowing system.
   
   What if you initiate the PPP session from another virtual console --
   or prior to loading X? What if you use the modem for some other form
   of dial-up activity? (i.e. is it a particular X client application, is
   it something to do with the serial hardware?)
   
   Is this an internal modem? Is it "Plug and Pray?" What if you try an
   external modem?
   
   What if you connect another system with PLIP or via ethernet?
   
   What if you use a different Window manager (other than mwm)?
   
   I can't offer much of a suggestion. Just try to isolate it further --
   try different screen resolutions, copy your xinitrc and other conf
   files off to somewhere else and strip them down to nothing -- etc.
   
   You'll definitely want to post in the newsgroups -- where you might
   find someone who's actually used Red Hat's Motif. (I haven't -- I
   hardly use X -- and fvwm or twm is fine for the little that I do in
   it).
   
   I noticed the behavior quite a while back with previous versions, but
   I was unable to duplicate the problem (I connect to work much more
   often than I used to so I noticed a pattern). 
   
   Has this been trouble for anyone else? I emailed redhat, but their
   "bugs@" email address states not to expect an answer. 
   
   I might even get involved in a program to provide a better support
   infrastructure for Red Hat.
   
   Unfortunately that's probably months away -- and this sort of "no
   response" situation is likely to be the norm for RH users for a bit.
   
   --Jim
     _________________________________________________________________
   
  E-mail adjustment needed
  
   Date: Mon, 22 Sep 1997 12:52:50 -0700
   From: Terrey Cobbtcobb@onr.com
   
   Greetings Answer Guy:
   I have a problem with e-mail which you may have already deduced from
   the "from:" line of this letter. In brief, I am running RedHat 4.0 on
   a home computer. I get onto the Internet by means of a local ISP using
   a dynamic ppp connection. I send and read my e-mail through EMACS.
   Whenever I send mail to anyone, the "from:" line states that I am
   "root <sierra.onr.com>." Even though I always use a "reply to" header
   giving my actual e-mail address, it would be nice if I could configure
   something so that the "from" header would reflect my true identity.
   Any help you could give me on this would be greatly appreciated. 
   
   What you want to use is called "masquerading" in the 'sendmail'
   terminology. This should not be confused with IP Masquerading (which
   everyone outside of the Linux world calls "NAT" -- network address
   translation).
   
   The other think you'll want to use is to use M-x customize or M-x
   edit-options (in emacs) to customize/override the e-mail address that
   emacs' mail readers (RMAIL VM mh-e -- whichever) will put in its
   headers).
   
   --Jim
     _________________________________________________________________
   
  REALBIOS?
  
   From: Bill Dawson bdawson@abginc.com
   Linux Wizard,
   I am a newbie to Linux, and it has been a rocky start. Through a
   series of trial and error I discovered I needed to use loadlin to get
   started. When I ran loadlin I got this message: 
   
   "Your current configuration needs interception of "setup.S," but the
   setup-code in your image is *very* old (or wrong) Please use BIOSINTV/
   REALBIOS or try another image file" 
   
   I looked at the reference on your page to REALBIOS, but it did not
   tell me where to find this program. Could you tell me where to get it
   and how to use it, please? 
   
   This happens when you have a memory manager, a disk manager, or any
   sort of TSR or device driver that "hooks" into your BIOS controlled
   interrupt vectors prior to running LOADLIN.
   
   Short Answer:
   -------------
   Look for the loadlin.tar.gz package -- it should include that. Here's
   the URL for the copy of that on sunsite:
   
   http://sunsite.unc.edu/pub/Linux/distributions/slackware/slakware/a4/l
   oadlin.tgz
   
   In this file there should be a copy of a program called REALBIOS.EXE
   which you would run as I've described before. It would create a
   special "system/hidden" file in the root of your C:\ drive -- which
   allows LOADLIN to find all the ROM handlers for each of your hardware
   interrupts.
   
   One way you might avoid the problem is to invoke LOADLIN from your
   CONFIG.SYS. You can do that by invoking LOADLIN.EXE from a SHELL=
   directive in your CONFIG.SYS.
   
   If you're using a version of MS-DOS later than 5.0 you can create a
   menu of boot options pretty easily -- see your MS-DOS/Windows '95
   manuals for real details. Heres a trivial example:
   
                 rem CONFIG.SYS

                 menuitem WIN
                 menuitem LINUX
                 menudefault LINUX

                 [WINDOWS]
                 FILES=64
                 BUFFERS=32

                 [LINUX]
                 rem Load my 2.0.30 Linux kernel
                 SHELL=C:\LINUX\LOADLIN.EXE C:\LINUX\L2030.K root=/dev/hdc1

   A bit of Background:
   --------------------
   
   PC Interrupt's are similar to Unix signals or Macintosh "traps." They
   are a table of pointers (in the first 4K of RAM) to "handlers"
   (routines that process verious sorts of events -- like characters
   coming in from the keyboard, handshaking signals from modems or
   printers, or data-ready events from disk drives). Normally, under
   MS-DOS, many of these events are handled by the BIOS. Others are
   handled by DOS device drivers. Still others aren't assigned to
   hardware events at all. In fact most of the interrupts are reserved
   for "service routines" (similar to Unix "system calls").
   
   Linux doesn't use any of these routines. Your system's BIOS is a set
   of machine language routines written for the processor's "real mode."
   All x86 processor start in real mode. Every processor since the 286
   has had a "protected" mode -- which is where all of the cool extended
   memory addressing and other features are implemented (actually the 286
   only supported 24-bit addressing -- but it's not supported by any
   modern operating protected mode OS, the obscure 80186 was never used
   as the core processor).
   
   So, your kernel has to shift from "real mode" to "protected mode." It
   also has to provide low level device drivers for any device you want
   to access -- where it uses I/O port and DMA channels to talk to the
   devices. The problem is that something from real mode must load the
   Linux kernel.
   
   LILO and LOADLIN.EXE:
   ---------------------
   
   The two common ways to load a Linux kernel into memory are: LILO and
   LOADLIN.EXE.
   
   On any PC hard disk there is a "partition table" which is how multiple
   operating systems can share the same disk. This was necessary because
   the early design o fthe PC made it very difficult to swap drives.
   (Using the sorts of external SCSI drives that are common on other
   systems -- and any sort of OpenBoot or other PROM "monitor/debugger"
   -- makes it pretty easy to connect external drives with alternative
   OS' on them -- but that would have been far too expensive for the
   early PC XT's (the first PC's to offer hard drives).
   
   Throughout most of the history of the PC architecture the BIOS for
   most machines could only see two hard drives -- any additional hard
   drives required additional drivers. Furthermore these two drives had
   to be on a single controller -- so you couldn't mix and match (without
   resorting to software drivers).
   
   Worse than that -- there were no standard drivers -- each manufacturer
   had to write their own -- and none of them followed an particular
   conventions.
   
   None of this matters to us, once we get the Linux kernel loaded,
   because Linux will recognize as many drives and devices as you attach
   to it (assuming you compile in the drivers or load their modules).
   
   However, it does matter *until* we get our kernel loaded. With LILO
   this basically requires that we have our kernel somewhere where the
   BIOS can reliably find it from real mode. With LOADLIN we have a bit
   more flexibility -- since we can put the kernel anywhere where DOS can
   find it (after any of those funky drivers is loaded).
   
   The partition table is a small block of data at the end of the master
   boot record (the MBR). It's about 40 bytes long and has enough for 4
   entries. These are your "primary" partitions. One of them may be
   marked "active" that is will be the partition that is "booted" by
   default. One of the partitions may be an "extended" partition -- which
   is a pointer to another partition table on the same hard disk. The
   rest of the MBR (512 bytes total) which precedes the partition table
   is a section of real mode machine code called the 'boot loader'.
   
   LILO can replace the MBR boot code (or it can be in the "logical boot
   record" -- which is like the "superblock" in Unix terminology -- it
   can also be placed in the boot sector of a floppy. If LILO is placed
   in "logical boot record" of a Linux partition -- then the DOS (or NT,
   or OS/2 or whatever) code must be set to load it (usually by setting
   that partition -- with LILO in it -- as the "active" partition).
   
   With LOADLIN all of this is moot. You just boot DOS (or Win '95 in
   "command prompt" mode -- using {F8} during the boot sequence or
   whatever) -- or you can use the mult-boot configuration I described
   earlier.
   
   One of the funny things about Linux is how many different ways you can
   load it. You can even shove a Linux kernel unto a floppy (using the dd
   command) and boot it that way (though you don't get any chance to pass
   it any parameters that way -- as you do with LOADLIN and LILO).
   
   Last Notes:
   -----------
   
   Things are improving in the PC world. We no have some SCSI and EIDE
   controllers that can boot off of specially formatted CD-ROM disks
   (meaning we can use a full featured system for our rescue media,
   rather than and to scrimp and fight to get what we need onto one or
   two floppies). Most new systems come with at least EIDE -- giving us
   support for four devices rather than just two. (That's especially
   important when you want to share a system with a couple of OS and you
   want to have a CD-ROM drive). Any decent system comes with SCSI -- and
   most PCI SCSI controllers support 15 devices, rather than the
   traditional limit of seven. There are "removable bay" and drive
   adapters for IDE and SCSI -- so having an extra "cold spare" hard
   drive is pretty simple (and with SCSI we can have external drives
   again).
   
   Conclusion:
   -----------
   
   There are still many cases where we need to use LOADLIN.EXE rather
   than LILO. I personally recommend that anyone that has DOS installed
   on their system make a LINUX directory somewhere and toss a copy of
   LOADLIN.EXE and their favorite kernel(s) in there. This makes an
   effective "alternative boot" sequence of your partition tables
   
   --Jim
     _________________________________________________________________
   
  X-Windows Libraries
  
   Date: Sun, 21 Sep 1997 14:06:26 -0700
   From: PATAP!DPFALTZG@patapsco.com
   
   Although I did not get any response from you, I want to follow up with
   what I have found in the hopes that it may benefit someone along the
   way. 
   
   Sorry. The volume of my mail and the nature of my expertise (that is
   the fact that I don't know much about X Windows -- meaning I have to
   research anything I'm thinking of saying), means that there are
   sometimes unfortunate delays in my responses.
   
   By the beginning of next year I hope to entirely revamp the way we do
   "The Answer Guy" (it will hopefully become "The Answer Gang").
   
   This is about the problem of the X-Windows System not coming up but
   instead gives messages to the effect that it couldn't map the
   libraries. 
   
   In the process of our playing around, on occasion it would give a
   message about being out of memory. This puzzled us in that it was not
   consistent and appeared in a small percentage of the cases. However,
   on that clue, I found that the swap entry was missing from
   '/etc/fstab'. I manually turned on swapping and now the X-Windows
   System comes up and runs normally. 
   
   After adding the entry to '/etc/fstab', the whole system comes up and
   plays as it should. All I can say is that somewhere in the process of
   trying to get the system back on the air, the entry got removed! 
   
   Although you were not directly involved in the solution, I'd like to
   say, "Thanks for being there!" 
   
   I'm glad that worked. I'll try remember that next time a similar probl
   em comes up.
   
   To the extent that I have "been there" you're welcome. As with most of
   the contributors to Linux I must balance my participation against my
   paying work. Naturally my contributions are far less significant than
   those of our illustrious programmers -- bit I hope to help anyway.
   
   --Jim
     _________________________________________________________________
   
  PC Emulation
  
   Date: Sat, 20 Sep 1997 13:07:56 -0700
   From: SAFA ISAA safaisaa@swipnet.se
   
   Hi Im working in comp. named Fordons Data our databas is a UNIX
   RS/6000.and we use aprogram calld Reflection to emulte pc so we can
   use the 
   
   That would be the WRQ Reflections to emulate a 3270 or 5150/5250 IBM
   terminal.
   
   pc=B4s as aterminal.We use ethernet withe TCP/IP protcol=20 for
   com.betwen RS and PC .In pc we use win95.My q. is can we use doslinux
   or minilinux to com. withe rs instade of Reflection ?? 
   
   You could install DOSLinux or MiniLinux and a copy of tn3270 and it
   *might* be able to talk to your RS/6000 (AIX) applications.
   
   The problem is that the 3270 and 5150 terminals are very complex --
   more of a client/server hardware than a "terminal/host." Essentially
   the IBM mainframes and mini's download whole forms to the "terminal"
   and the "terminal" then handles all sorts of the processing on its
   own.
   
   tn3270 just implements a bare minimum subset of the 3270 protocols
   (just the weird EBCDIC character set so far as I know).
   
   Frankly I don't know how this relates to your RS/6000 AIX system. That
   should be able to accept standard telnet and terminal connections. The
   question be becomes: "Can your database application (frontends) handle
   this sort of connection?" Does it provide a curses or tty interface?
   
   If the answer is YES would U tell me where can I gat and how to test
   it..We R the bigest comp. in skandinavin for adm the hole car sys THX 
   
   This looks pretty mangled. The answer is "I don't know." However,
   Linux has the virtual of being free -- so there's very low risk in
   setting up a copy and trying it.
   
   The more fundamental question is: What are you trying to accomplish?
   If you currently use Win '95 and Reflections why do you want to
   switch?
   
   Do you want to save money?
   
   While Win '95 and Reflections are commercial packages -- they aren't
   terribly expensive. Your administrative and personnel training costs
   are presumably much higher.
   
   Is is for administrative flexibility?
   
   The number one complaint about MS Windows products by Unix sysadmins
   (based on my attendance at LISA, USENIX, and similar events) is that
   MS products are difficult to administer -- and largely impossible to
   administer remotely or in any automated way.
   
   Unix admins are spoiled by rlogin, rcp, rdist, and the fact that
   almost *anything* under Unix can be scripted. Most jobs are amenable
   to shell or perl scripts run via rlogin or cron -- and some of the
   "tough" jobs require expect (or the perl comm.pl) to "overcome those
   fits of interactivity."
   
   Mouse driven interfaces with "floating" windows and dialog boxes are
   not "automation friendly" and MS Windows is particularly unfriendly in
   this regard. (MacOS has an Applescript and a popular third-party
   utility called QuickKeys (sp) that reduce its deficiencies in this
   area).
   
   So, if you're considering switching from Win '95 to Linux so that you
   can centrally administer your client desktops -- it's probably not
   quite a compelling reason.
   
   I could go on and on. The point is that you have to make a good
   business case for making this switch. Is there some Linux application
   that you intend to deploy? Is this suggested by your security needs?
   What are the requirements of you database applications? Could you
   migrate those to use "thin clients" (HTML/CGI forms) through a web
   (intranet) gateway? Could you implement the client on Java?
   
   As for DOSLinux and MiniLinux specifically: Those can be pretty hard
   to find. I've sent e-mail to Kent Robotti, the creator of the DOSLinux
   distribution, to ask where it's run off to.
   
   There are some other small Linux distributions that are suitable for
   installation into a DOS directory and able to be run off of the UMSDOS
   filesystem mount on '/' (root).
   
   Mini-Linux is pretty old (1.2.x kernel) and doesn't appear to be
   currently maintained.
   
   I'd look at Sunsite's distibutions directory --
   
   http://sunsite.unc.edu/pub/Linux/distributions/
   
   Normally there would be a doslinux directory thereunder -- but Kent
   seems to change things pretty rapidly and it may be that this as been
   removed while he's doing another upgrade or release.
   
   It may be that you best bet would be the "Monkey" distribution
   (there's a directory under the URL above for that). This seems to be a
   five diskette base set in a set of split ARJ (Jung Archive) files.
   This seems to have been put together by Milan Kerslager of
   Czechloslovakia (CZ). There are about nine add-on "packages" that are
   ready to roll with it.
   
   This is pretty recent (last March) package -- and one of the packages
   for it is a 2.0.30 kernel from the end of April.
   
   A copy of ARJ.EXE doesn't seem to be included, so you'd have to grab
   that from someplace like:
   
   Simtel: arj250a.exe -- Robert Jung's Archiver
   
   ftp://ftp.cdrom.com/pub/simtelnet/msdos/arcers/arj250a.exe 
   
   * (for those who don't know Simtel used to be at the White Sands
   Missile Range on an old TOPS system. It's primary mirror used to be at
   oak.oakland.edu -- and it's now hosted by Walnut Creek CD-ROM
   (ftp.cdrom.com). If you need any sort of DOS shareware or freeware
   (perhaps to run under dosemu or Caldera's OpenDOS) this is the
   definitive collection. If you need any significant number of packages
   (like you need to test/evaluate a dozen of them to decide which works
   for you) I'd suggest springing for the CD. Another invaluable site for
   any non-MS DOS users is at http://www.freedos.org -- which in proper
   free software tradition has links to other DOS sites like RxDOS. DOS
   is truly the OS that wouldn't die -- and the shareware writers have
   about a decade headstart on ubiquitous availability over Linux).
   
   --Jim
     _________________________________________________________________
   
  Visual Basic for Linux
  
   Date: Thu, 18 Sep 1997 15:34:08 -0700
   From: Forzano Forzano@ansaldo.it
   
   I'm looking for a sw that can translate an application developed in
   Visual Basic to Unix. Could you help me? 
   
   The product you were undoubtedly thinking ofis VBIX by Halcyon
   Software (http://www.vbix.com). (408-378-9898).
   
   I haven't used this product personally (since I have no interest in
   Visual BASIC). However they do claim to support Microsoft Visual BASIC
   source code and they offer some other, related products.
   
   I see a DBIX (which appears to be a database engine with ODBC -- open
   database connectivity drivers for Linux/Unix and MS Windows '95 and
   NT). Also interesting might be their "BASIC 4 Java." Here's a blurb
   from their web pages:
   
   "Halcyon Software Java Products 
   
   InstantBasic Script -Written in 100% Pure Java, Halcyon InstantBasic
   Script (IBS) is more than just cross-platform BASIC; it is BASIC for
   the Internet. Moreover, IBS is available as both a compiler and an
   interpreter, thus allowing developers to execute scripts as either
   BASIC source code or Java binaries(class file). The engine is
   compatible with Microsoft's BASIC Script Edition and provides complete
   Java Beans and ActiveX* support. The engine is easily customizable for
   quick integration and comes with its own lightweight Interactive
   Development Environment (IDE). 
   
   InstantBasic 4 Java - InstantBasic 4 Java is a 4GL development
   environment written 100% in Java that allows programmers to quickly
   and easily migrate their existing VB applications to run under any
   Java environments using the VB-like IDE.
   
   --Jim
     _________________________________________________________________
   
  Linux 4.2 software and Hardware compatablity problems
  
   Date: Wed, 17 Sep 1997 20:03:54 -0700
   From: John Arnold jarnold@hal-pc.org
   
   I purchased a new computer system and 4.2 RedHat Linux Power Tools for
   my son, Blake, who is a student at Trinity University in San Antonio,
   TX.
   
   They were purchased from different vendors. 
   
   Neither, Blake, his profs,myself or my vendor knew what we were doing.
   The result is a big mess. I believe the basic configuration is
   incorrect. That notwithstanding, I need to know which parts are not
   supported by Linux and recommended replacements. The following is a
   brief description of the system:
   
   Supermicro P5MMS motherboard with 430TX chip set. Ultra DMA 33 Mb/s
   Transfer and 512K pipe line burst mode cache

   AMD K6 MMX Processor @166 MHz, 6th generation performance, Microsoft
   certified.

   32 MEG SDRAN-10ns-DIMM Memory
   Western Digital 4.0 Gig IDE hard drive.  Split 50/50 by vendor
   TEAC 1.44 floppy disk drive
   MATROX MYSTIQUE 4MEG SGRAM PCI Video card
   14" NI SVGA Color monitor by MediaTech,
   1024X768-28DPI (I beleive it has a Fixed Frequency)
   PIONEER 24X CD ROM Drive
   Keytronics keyboard
   Microsoft PS2 mouse
   US Robotics 28.8/33.6 Sportster modem
   Sound Blaster AWE 64 sound card with speakers
   Windows 95 & Plus, Service release 2

   When I have the correct equipment I will find a professional to
   properly configurer it. 
   
   Thank you for your assistance. 
   
   All of this equipment is fine. However I have to question your
   approach. There are several vendors that can ship you a fully
   configured system with Linux and Windows '95 pre-installed and
   configured (or just Linux, if you prefer).
   
   In fact an upcoming issue of the Linux Journal has a hardware review
   of just such a system: the VAR Station II by VA Research
   (http://www.varesearch.com).
   This system is very similar to the one you described (using the same
   video card, keyboard, and sound card and a very similar 24X CDROM).
   The big difference between the configuration you list and the one I
   reviewed is that the VAR Station came with a 4Gb SCSI hard drive, a
   Toshiba SCSI CD-ROM, and a SymBIOS SCSI adapter (in lieu of the IDE
   equipment you listed). Also the system I reviewed had a 3Com PCI
   ethernet card rather than any sort of modem (I already have some modem
   on my LAN). The other thing is that this motherboard is an Intel and
   uses a 266 Pentium II.
   
   For about the same as you have spent on these parts separately you
   could probably get a system from VA Research or several others.
   
   Here's a short list in no particular order:
   
   PromoX (http://www.promox.com)
   
   Aspen Systems (http://www.aspsys.com)
   
   Linux Hardware Solutions (http://www.linux-hw.com)
   
   SW Technology (http://www.swt.com)
   
   Apache Digital (http://www.apache.com
   
   Telenet Systems Solutions (http://www.tesys.com)
   
   ... and that doesn't include the ones that specialize in Alphas or
   SPARC based systems.
   
   So, you have many choices for getting system with Linux preconfigured.
   
   Now, if you're stuck with the system you've got, and you just want it
   all to work, you could pay a consultant to install and configure on
   the existing hardware. At typical rates of $50 to $150 per hour (mine
   are usually set at $91/hr) you'd rapidly spend more on this than on
   getting system from any of these vendors (who presumably have most of
   the installation and configuraiton process automated).
   
   I cannot, in good conscience, recommend that you hire me to configure
   a system like this. It's just too expensive that way.
   
   If you made it clear to your vendor that you intended to run Linux on
   the system, and they were unable to adequately install and configure
   it -- I personally think you are fully justified in returning
   everything and starting over. (If not then yo are still probably
   within your rights -- and you may still want to consider it).
   
   Another approach you might try is to get just a hard disk with Linux
   pre-installed on it. This is the popular LOAD (Linux on a Disk)
   product from Cosmos Engineering (http://www.cosmoseng.com). This isn't
   quite a neat as getting the whole box pre-configured -- you still have
   to tell it what sort of video, sound, and other cards you want it to
   use (and you have to be able to support the extra drive -- which may
   be tricky if you have an IDE HD and an IDE CD-ROM drive already on
   your IDE controller. Many new IDE controller have two "channels"
   (enough to support four IDE devices) and some don't.
   
   Another approach is to just let Blake fend for himself. He can wander
   around the campus a bit and look for fellow students who use and
   understand Linux. Who knows, he may meet some great people that way --
   maybe even get a date in the process. Linux is very popular at
   colleges and universities -- and students are generally pretty
   enthusiastic about helping one another use any sort of toys --
   computers especially.
   
   --Jim
     _________________________________________________________________
   
  Moving /usr subdirectory to another drive..
  
   Date: Wed, 17 Sep 1997 18:11:32 -0700
   From: Ben Bullock bullock@toolcity.net
   
   My entire Linux filesystem currently resides on /dev/hda2 and uses up
   almost 90% of this partition. Because I am quickly running out of disk
   space on my original hard drive, I recently added a second hard drive
   and created a Linux partition on it which the system sees as
   /dev/hdb1. The /usr subdirectory of my filesystem has swollen to over
   300MB, so I would like to copy all the directories and files under
   /usr over to /dev/hdb1 and then edit /etc/fstab so that this partition
   will then be mounted on /usr in the filesystem when I boot up. 
   
   I've given a lot of thought about how to do this, but I am very
   concerned about making this change because of the potential problems
   it might cause if not done properly. I would, therefore, appreciate
   your advice on how to proceed and what steps I should take to
   safeguard the integrity of my filesystem. BTW, I have a second, unused
   partition (/dev/hdb2) available on the new drive that could be used to
   store a "backup copy" of all the directories and files currently under
   /usr on /dev/hda2, and I also have an emergency boot/root floppy disk
   set that provides basic utilties. 
   
   Thanks very much for any help you can give me on this. Also, I want
   you to know that I enjoy your column in the Linux Gaxette and have
   found it to be very helpful. 
   
   Re: my previous columns and articles.
   
   You're welcome.
   
   Re: how to move (migrate) trees full of files:
   
   I can understand you concerns. Under DOS and Windows this sort of
   operation is hairy, tricky, painful, and often terribly destructive.
   
   The good news is that Unix is *much* better at this.
   
   Here's the overview:
   
   Mount the new filesytem to a temporary location Use a cpio or tar
   command to copy everything * (optionally) Make all these files
   "immutable" Boot from an alternate partition or a rescue disk Rename
   the source directory Make a new directory by that name (a mount point)
   Mount the new fs on the new mount point Update your /etc/fstab to make
   this permanent * (optionally) Update your tripwire database Test
   Remove the old tree at your leisure.
   
   That's all there is to it. Now we'll go back over those steps in
   greater detail -- with same commands and some commentary.
   
   Mount the new filesytem to a temporary location:
   
   I like to use /mnt/tmp for this. So the command is:
   
   mount /dev/hdb1 /mnt/tmp
   
   Use a cpio or tar command to copy everything
   
   I used to use tar for this -- but I've found that cpio is better. So
   here's the tricky command that's really the core of your question:
   
   cd /usr/ && find . -print0 | cpio -p0vumd /mnt/tmp
   
   * note: must do this as root -- to preserve permissions and ownership!
   
   I realize this is an ugly looking command. However, we'll explain it
   step by step:
   
   cd /usr/ && -- this cd's to the user directory and (if that goes O.K.)
   executes the following. If you typed /usr/ wrong you won't end up with
   a mess.
   
   find . -print0 -- this provides a list of filenames as "null
   terminated strings" -- this will work *even if some of the files have
   spaces, newlines, or other dubious characters in them*. The results
   are written into a pipe -- and the program reading them must be
   capable of using this list. Luckily the GNU cpio and xargs command
   have this feature, as we'll see.
   
   | cpio -p0vmd /mnt/tmp -- here's the tricky part. This is the
   "passthrough" mode of cpio. cpio normally copies files "in" or "out"
   -- but it can do "both" using the "passthrough" mode. cpio expects a
   list of filenames for its standard input (which we are providing with
   the 'find' command). It then copies the corresponding file "in" from
   the path specified (as part of the input line) and "out" to the the
   path specified as one of cpio's arguments (/mnt/tmp in this case).
   
   The rest of the switches on this cpio command are: 0 -- expect the
   input records (lines) to be null terminated, v -- be verbose, m --
   preserve the modification time of the files (so your next incremental
   backup does think that everything under /usr/ has suddenly changed),
   and d -- make leading directories as needed.
   
   The last argument to this cpio command is simply the target directory
   we supply to the -p switch.
   
   * (optionally) Make all these files "immutable"
   
   One obscure feature of Linux' ext2 filesystem that I like to suggest
   is the "immutable attribute." This prevents *any* change to a given
   file or directory until the file is made "mutable" again. It goes way
   beyond simply removing write permissions via the standard Unix chmod
   command.
   
   To do this use the command:
   
   cd /mnt/tmp && chattr -R +i *
   
   ... or (to just do the files and not the directories):
   
   find /mnt/tmp -type f -print0 | xargs -0 chattr +i
   
   Ultimately this protects the sysadmin from his or her own 'rootly'
   powers. Even 'root' gets an "operation not permitted" error on any
   attempt to modify any feature of an immutable file.
   
   Under normal circumstances this only marginally improves the system's
   security (any attackers who get a 'root' shell can just 'chattr' the
   files back to "-i" (mutable), and then have their way with your
   files). However, with the addition of the "sysctl securelevel"
   features that are expected in the 2.2 kernel (and may already be in
   the current 2.0 and 2.1 kernels) -- this will actually be a real
   security feature. (Discussion of "securelevel" is for a different
   article).
   
   The point is that you can save yourself from many sorts of mistakes by
   making files immutable. This is particularly handy when running 'make'
   as root -- when you may have missed some problem in the file that
   would otherwise wipe out some of your important files. I suspect it's
   also handy if you get a bogus RPM package -- for basically the same
   reason.
   
   (Many sysadmin's I've talked to and exchanged mail and news postings
   with fervently rail about the dangers of running make as root or using
   any sort of package management system. I understand their concerns but
   also recognize that the number of new inexperienced SA's -- and the
   sheer amount of work that many SA's are expected to complete --
   practically require us all to take shortcuts and place some trust in
   some of the packages we're installing. So this "immutable" feature is
   a reasonable compromise).
   
   Boot from an alternate partition or a rescue disk
   
   Now we've done the hard part. All we have to do now is use the new
   copy of /usr. The only problem is that many of the commands we want to
   use require access to the shared libraries in /usr/lib. If you ever
   accidentally remove or damage /usr/lib/libc.so you'll have first hand
   experience with the problem.
   
   So, we boot from an alternative boot partition or from a rescue disk,
   mount our normal root partition and continue. I'll leave out the
   details on this -- since the details vary from one distribution and
   site to another.
   
   * Note to distributors and installation script maintainers: PLEASE
   INCLUDE AN OPTION TO CREATE AN ALTERNATIVE BOOT PARTITION IN YOUR
   PRODUCTS
   
   Rename the source directory
   
   Now we've copied the whole /usr/ tree to /mnt/tmp. We could just
   modify the /etc/fstab, and reboot the system. Your rc scripts would
   blithely mount the new /dev/hdb1 right over the existing /usr -- in
   effect "hiding" the old usr files. However this wouldn't be very
   useful -- it does free up any disk space.
   
   So we issue a command like:
   
                        cd $NORMALROOT          # (wherever you mounted
                                                # your normal root filesystem)
                        mv usr usr.old

   Make a new directory by that name (a mount point)
   
   Now we need to make a new /usr directory. We just issue the "mkdir
   /usr" command. However -- we're not quite done. We also want to chown
   and chmod this new directory to match the old one.
   
   So we use "ls -ld usr.old" to see the owner, group, and permissions --
   whice are typically like:
   
drwxr-xr-x  20 root     root         1024 Aug  1 22:10 usr

   ... and we use the commands:
   
                        chown root.root usr
                        chmod 755 usr

   ... to finish the new mount point.
   
   (Personally I like to make /usr/ owned by root.bin and mode 1775 --
   sticky and group writable. However, I also mount the whole thing
   read-only so I'm not sure this is comparable to any of the FSSTND (the
   filesystem standard) or the conventions used by any distribution).
   
   I get a bit of confused about how the mount command works -- because
   it seems that the mount command actually over-rides the underlying
   ownership and permissions of the mount point. However I have seen
   problems that only seemed to go away when I make the underlying mount
   point match my intended permissions -- so I do it without
   understanding it completely.
   
   Mount the new fs on the new mount point
   
   I like to do this just to test things.
   
   Update your /etc/fstab to make this permanent
   
   Now you can edit your /etc/fstab (which should actually be under
   whatever mount point your using during this "alternative root/rescue"
   session)
   
   You'll add a line like:
   
/dev/sdb1     /usr               ext2   defaults,ro 1 2

   ... to it.
   
   (Note, I like to mount /usr/ in "read-only" mode. this provide one
   extra layer of protection from the occasional root 'OOOOPS!' It also
   helps enforce my policy that all new packages are installed under
   /usr/local, or /usr/local/opt (to which my /opt is a symlink), or
   under a home directory (which, on some of my systems are under
   /usr/local/home). The idea of maintaining this policy is that I know
   what files and packages are not part of the base OS).
   
   * (optionally) Update your tripwire database
   
   Tripwire is a program that maintains a detailed database of your
   files, their permissions, ownership, dates, sizes, and several
   different checksums and hashes. The intent is to detect modifications
   to the system -- in particular these would be signs of corruption, or
   tampering (security breaches or the work of a virus or trojan horse).
   
   I won't go into details here. If you have tripwire installed, you want
   to update the database and store it back on it's read-only media.
   
   For more info about tripwire see:
   
   Tripwire (ftp://coast.cs.purdue.edu/pub/COAST/Tripwire)
   
   To get it to compile cleanly under Linux look at the patch I wrote for
   it:
   
   Tripwire Patch for Linux
   (http://www.starshine.org/linux/tripwire-linux.patch)
   
   (no .html extension on that -- its just a text file).
   
   (* one of these days I'll get around to writing up a proper web page
   for Tripwire and for my patch -- I submitted it to Gene and Gene and
   they never integrated it into their sources).
   
   Test
   
   Now you simply reboot under your normal configuration and test to your
   hearts content. You haven't removed the old /usr.old yet -- so you can
   back out of all your changes if anything is broken.
   
   Remove the old tree at your leisure.
   
   When you're satisfied that everthing was copied O.K. -- you can simply
   remove all the old copies using the command:
   
   rm -fr /usr.old
   
   Now you finally have all that extra disk space back.
   
   Obviously this process can be done for other parts of your filesystems
   as well. Luckily any other filesystem (that doesn't include the /
   (root) and /usr/lib/ trees) is less involved. You shouldn't have to
   reboot or even switch to single user mode for any other migrations
   (though it won't hurt to do so).
   
   I like to put /tmp, /var, and /usr/local all on their own filesystems.
   On news servers I put /var/spool/news on it's own. Here's a typical
   fstab from one of my systems:
   
# <device>    <mountpoint>   <filesystemtype> <options> <dump> <fsckorder>

/dev/sdc1      /                  ext2   defaults       1 1
/dev/sda6      /tmp               ext2   defaults       1 2
/dev/sda10     /usr               ext2   defaults,ro    1 2
/dev/sda7      /var               ext2   defaults       1 3
/dev/sda8      /var/log           ext2   defaults       1 3
/dev/sda9      /var/spool         ext2   defaults       1 3
/dev/sdb5      /usr/local         ext2   defaults       1 3

/proc          /proc              proc   defaults
/dev/sda2      none               swap   sw

/dev/fd0       /mnt/a             umsdos  noauto,rw,user 0 0
/dev/fd1       /mnt/b             umsdos  noauto,rw,user 0 0
/dev/hda1      /mnt/c             umsdos  defaults 0 0
/dev/scd1      /mnt/cd            iso9660 noauto,ro,user,nodev,nosuid 0 0
/dev/scd0      /mnt/cdwr          iso9660 noauto,ro,user,nodev,nosuid 0 0
/dev/fd0       /mnt/floppy        minix  noauto,rw,user,noexec,nodev,nosuid 0 0
/dev/fd0       /mnt/e2floppy      ext2   noauto,rw,user,noexec,nodev,nosuid 0 0
/dev/sdd1      /mnt/mo            ext2   noauto,rw,user,nodev,nosuid 0 0
/dev/sdd1      /mnt/mo.offline    ext2   noauto,rw,user,nodev,nosuid 0 0
/dev/sdd1      /mnt/modos         umsdos  defaults,noauto 0 0

tau-ceti:/      /mnt/tau-ceti   nfs     ro

   Note all the noauto and user point points. These allow users to access
   these removable devices without switching to 'root.' To protect
   against potential problems with the 'mount' command (being SUID
   'root') I have it configured with the following ownership and
   permissions:
   
        -r-sr-x---   1 root     wheel       26116 Jun  3  1996 /bin/mount

   Thus, only members of the "wheel" group are allowed to use the mount
   command (and I only put a few people in that). So I balance the risk
   of one of the "wheel" members finding and exploiting a bug in 'mount'
   vs. the expense having to do all mount's myself and risk of my typing
   *bad things* at the root shell prompt. I could also accomplish the
   same sorts of things with 'sudo' (and I use that for many other
   cases).
   
   For more info about sudo see:
   
   Sudo Home Page (http://www.courtesan.com/courtesan/products/sudo/)
   
   FTP sudo: (ftp://ftp.cs.colorado.edu/pub/sysadmin/sudo
   
   I hope that I've done more than answer your question. I hope I've
   given you some ideas for how to make your system more robust and
   secure -- how to apply some of the principles of "best practice" to
   administering your Linux box.
   
   --Jim
     _________________________________________________________________
   
  C++ Integrated Programming Enviroment for X...
  
   Date: Wed, 17 Sep 1997 17:56:30 -0700
   From: trustno1@kansas.net
   
   Dear Answer Guy,
   I am a student in Information Systems at Kansas State University. As a
   relatively new user of Liunx, I was wondering if there exists a
   software package for X which could be comparable to something like
   Borland's C++ IDE? I've heard of something called Wipeout, but I'm not
   running Xview, is there anything else that I should check out? 
   
   I've never heard of "Wipeout" -- but it sounds suspicously like a
   slurred pronunciation of "wpe" -- which would be the "Window
   Programming Environment" by Fred Kruse. This has a console mode (wpe)
   and an X mode (xwpe) which are just links to the same binary.
   
   I don't know that it requires Xview. Certainly on the rare occasions
   when I've run it I didn't have to do anything special -- just type the
   appropriate command for the mode I wanted and it just appears. So, I
   didn't have to install any special libraries or run a particular
   window manager or anything silly like that.
   
   t typing 'xwpe &' from any xterm and see if that's already installed
   for you. If so you can add it to your window manager's menu tree, or
   to whatever sort of desktop manager or program/applications manager
   you use (or just always launch if from an xterm -- which is what I do
   for 90% of the things I run under X).
   
   --Jim
     _________________________________________________________________
   
  LYNX-DEV new to LYNX
  
   Date: Tue, 16 Sep 1997 22:06:45 -0700
   
   Will I be able to browse the FULL INTERNET using LYNX? I am using LYNX
   at my job, and the computer does not have window! 
   
   The web is not the FULL INTERNET!
   
   Web browsers (such as Lynx, Mosaic, Netscape and MSIE) only access the
   web, ftp, and gopher. These are only a few of the services and
   protocols supported by the Internet.
   
   There is no such thing as "browsing" the "full Internet." Indeed, the
   phrase "full Internet" is meaningless.
   
   As to your implicit question:
   
   Will you be able to browse all public web sites using Lynx?
   
   ... the answer is no.
   
   Lynx is a browser that complies with as much of the HTTP and HTML
   specifications (the protocols and data representation (file formats)
   used by the "web") as possible -- within the constraints of it various
   platforms (text only -- no "inline" graphics, no sound, no support for
   "Java" or "JavaScript" (which aren't part of these specifications
   anyway).
   
   Therein lies the rub. The client (Lynx) is able -- but many of the
   servers aren't willing. (In this case, by "servers" I'm referring to
   the people and the sites -- not the software).
   
   Basically there are some sites that are "unfriendly." They make
   gratuitous use of tables, imagemaps, frames, Java applets, embedded
   JavaScript, cookies, ActiveX, active server pages (ASP) and ISAPI, and
   other extensions. They hope to win in some "one-up-manship" contest of
   "coolness."
   
   Most of these extensions were introduced or promoted by one or another
   company (mostly Microsoft or Netscape) in their efforts to "capture"
   the "mindshare" -- which they hope will lead to increased
   *market*-share for their browsers and "web developement tools" (at the
   expense of standards, interoperability, and -- most especially --
   their competitors).
   
   The "web development tools" are the most insidious power piece in this
   little chess game. These tools (mostly Microsoft's "FrontPage") seem
   to include these non-standard extensions wherever possible -- with no
   warning, commentary, and mostly with no option to avoid them. Anyone
   who wants to produce "clean," friendly, standards conformant code is
   basically reduced to using a bare text editor -- and knowing the
   syntax inside and out.
   
   In some particularly notorious cases there are "active" or "dynamic
   content" sites that will slam the door shut on your browser just based
   on a prejudice about it's name. By default your browser identifies
   itself to the server when fetching pages. Some sites are "just too
   cool" to have any textual content -- and shove a message down your
   throat:
   
   "Go get a 'real' browser, punk!"
   
   ... (the sheer effrontery of telling your "customers" what sort of
   vehicle to drive around on the "stupor hypeway" -- it simply boggles
   the mind and gasts the flabber!).
   
   I've even encountered a couple of cases where some "dynamic sites"
   would shove hundreds of kilobytes of "search engine spam" to my copy
   of Lynx. This was a crude effort to seed the databases maintained by
   Yahoo!, InfoSeek, HotBot, and others with excessively favorable
   content rating (based on the notion that most of these sites used
   "bots" (web robots, or "spiders") that identify themselves as "Lynx"
   (to avoid using the extra bandwidth on graphics that they couldn't
   use).
   
   There are also an increasing number of sites that require SSL even for
   their non-secure information. SSL is a set of encryption protocols
   which are primarily used to provide for server-authenticated (or
   mutually authenticated) and "secure" (encrypted) access to web forms
   (mostly for order Pizzas without shouting your credit card number to
   every router in fifty states and a few countries).
   
   So, there are a number of places on the "full Internet" that you can't
   adequately or comfortably browse with Lynx.
   
   The good news is that Lynx does support features to address most of
   these problems. You can get an SSL proxy (which you'd run on the same
   machine as you run Lynx), the current versions of Lynx will list all
   the "frames" (which are a Netscape extension for displaying multiple
   separate HTML files concurrently), and can fetch some sorts of "map"
   files (the text files which describe the "hot" (clickable) regions of
   an IMAGEMAP -- which is a picture with "clickable" point therein) --
   so you can browse them. Lynx can offer to accept cookies *(see note:
   cookies) for a given session -- and, eventually, may offer options to
   save them.
   
   The bad news, again from the site maintainers and devlopers, is that
   they often don't provide meaningful names for their frames, or within
   their image map files. These are intended to be "seen" by a site's
   users -- and often aren't "seen" by the site's developers (remember
   the "integrated web developer software we mentioned earlier?).
   
   The final bit of good news is this:
   
   "Most sites that are particularly "Lynx-unfriendly" have not real
   content. When I succumb to curiosity and view them in a GUI browser --
   they are all flash and no substance."
   
   When we say "hypertext" they seem to hear "hype OR text"
   
   So, Lynx acts as a bit of a twit filter. Visit a site first with a
   text browser (Lynx or emacs' W3 mode) and you'll know immediately
   whether their webmasters are hard of hearing or whether they "get it."
   
   "* Cookies are another Netscape extension which are intended to allow
   web site developers a crude and unreliable way to "maintain state"
   (distinguish between users who might be at the same site -- like all
   of the AOL, CompuServe, and Netcom users going through their
   respective gateways). Marketing people drool over statistics based on
   "cookies" which can purport to tell how many *new* and *returning*
   users there are to a site, *who* read *which* documents other
   nonsense. However, for those statistics to be even close enough for a
   marketeer, the use of them must be almost universal (so we stop
   non-cookies browsers at the front home page) and we have to rely on
   them being so obscure in the browser software that no one tampers with
   them (they essentially must be "sneaky")."
   
   PS: I've copied this to my editor at the Linux Gazette -- since I
   think it's a article for them to consider. Maybe they'll reprint it in
   "Websmith" (a feature of the Linux Journal, which is published by SSC,
   the maintainers for the Linux Gazette webazine). Interested parties
   can view all of the back issues of LG the URL in my sig. - -- a site
   that is emminently "Lynx Friendly"
   
   -- Jim
     _________________________________________________________________
   
                     Copyright © 1997, James T. Dennis
          Published in Issue 22 of the Linux Gazette October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
   
   Welcome to the Graphics Muse
   
    Set your browser as wide as you'd like now.  I've fixed the Muse to
                    expand to fill the aviailable space!
                                      
                               © 1997 by mjh
                                      
   
   ______________________________________________________________________
   
   Button Bar muse:
    1. v; to become absorbed in thought
    2. n; [ fr. Any of the nine sister goddesses of learning and the arts
       in Greek Mythology ]: a source of inspiration
       
     W elcome to the Graphics Muse! Why a "muse"? Well, except for the
   sisters aspect, the above definitions are pretty much the way I'd
   describe my own interest in computer graphics: it keeps me deep in
   thought and it is a daily source of inspiration.
   
            [Graphics Mews] [WebWonderings][Musings] [Resources]
                                      
   
   T his column is dedicated to the use, creation, distribution, and
   discussion of computer graphics tools for Linux systems.
   
   As expected, two months of material piled up while I was out wondering
   the far reaches of the US in August.  My travels took me to California
   for SIGGRAPH, Washington DC for vacation (honest), Huntsville Alabama
   for work (they kind that pays the rent) and just last week I was in
   Dallas for a wedding.  All that plane travel gave me lots of time to
   ponder just where the Muse has come in the past year and where it
   should go from here.  Mixed with a good dose of reality from SIGGRAPH,
   I came up with the topics for this month. [INLINE]
   
   First, there are two new sections: Reader Mail and Web Wonderings.
   Reader Mail is an extension of Did You Know and Q and A.  I'm getting
   much more mail now than I did when I first started this column and
   many of the questions are worthy of passing back to the rest of my
   readers.  I've also gotten many suggestions for topics.  I wish I had
   time to cover them all.
   
   Web Wonderings is new but may be temporary.  I know that many people
   are reading my column as part of learning how to do Web page
   graphics.  Its hard to deny how important the Web has become or how
   much more important it will become in the future.  I started reading a
   bit more on JavaScript to see if the language is sufficient to support
   a dynamically changing version of my Linux Graphics mini-Howto.  Well,
   it is.  I'll be working (slowly, no doubt) on converting the LGH to a
   JavaScript based set of pages.  My hope is to make it easier to search
   for tools of certain types.  I can do this with JavaScript, although
   the database will be psuedo static as an JavaScript array.  But it
   should work and requires no access to a Web server.
   
   Readers with Netscape 3.x or later browsers should notice a lot more
   color in this column.  The Netscape 4.x Page Composer makes it pretty
   easy to add color to text and tables so I make greater use of color
   now.  Hopefully it will add more than it distracts.  We'll see. I may
   do a review of Netscape 4.x here or maybe for Linux Journal soon.
   There are some vast improvements to this release of Netscape, although
   the new reader (known as Collabra Discussions) is not one of them.
   
         In this months column I'll be covering ...
     * Browser detection using JavaScript
     * SIGGRAPH 97 - what I saw, what I learned
     * Designing Multimedia applications for Linux
       
   Oh yeah, one other thing:  Yes, I know I spelled "Gandhi" wrong in the
   logo used in the September 1997 Linux Gazette.  I goofed.  I was more
   worried about getting the quote correct and didn't pay attention to
   spelling.  Well, I fixed it and sent a new version to our new editor,
   Viki.  My apologies to anyone who might have been offended by the
   misspelling.  Note:  the logo has been updated at the SSC site.
   
   
   Graphics Mews       Disclaimer: Before I get too far into this I
   should note that any of the news items I post in this section are just
   that - news. Either I happened to run across them via some mailing
   list I was on, via some Usenet newsgroup, or via email from someone.
   I'm not necessarily endorsing these products (some of which may be
   commercial), I'm just letting you know I'd heard about them in the
   past month.
   
   indent
   
  VRML 98
  
   The third annual technical symposium focusing upon the research,
   technology and applications of VRML, the Vritual Reality Modeling
   Language will be held Feb 16-19, 1998 in Monterey, California.  VRML
   98 is sponsored by ACM SIGGRAPH and ACM SIGCOMM in cooperation with
   the VRML Consortium. Deadlines for submission are as follows:
   
                             Papers Mon. 22 Sep
                             Panels Fri. 3 Oct
                                 Workshops
                                  Courses
                              Video Mon. 2 Feb
                                      
   Contact Information:
   
   VRML 98 Main Web Site http://ece.uwaterloo.ca/vrml98
   Courses vrml98-courses@ ece.uwaterloo.ca
   Workshops vrml98-workshops@ ece.uwaterloo.ca
   Panels vrml98-panels@ ece.uwaterloo.ca
   Papers vrml98-papers@ ece.uwaterloo.ca
   Video Submissions vrml98-video@ ece.uwaterloo.ca
   Demo Night vrml98-demos@ ece.uwaterloo.ca   indent
   
  Iv2Rib
  
   Cow House Productions is please to present the first release of
   Iv2Rib, an Inventor 2.0 (VRML 1.0) to Renderman / BMRT converter.
   Source (C++) and an Irix 5.3 binary are available at:
   
   http://www.cowhouse.com/ Home/Converters/converters.html
   
   Additionally, new updates (V0.12, 30-Jul-97) of both Iv2Ray (the
   Inventor to Rayshade converter) and Iv2POV (the inventor to POVRAY
   converter) are also available on the same page, as both source (C++)
   and binaries for Irix 5.3
   [INLINE]
   Crack released the Abuse source code to the public domain recently.
   Abuse was a shareware and retail game released for DOS, MacOS, Linux,
   Irix, and AIX platforms.
   
   The source is available at
   
     http://games.3dreview.com/abuse/files/abuse_pd.tgz
     and
     http://games.3dreview.com/abuse/files/abuse_pd.zip
   
   If you don't know the 1st thing about Abuse,
   
     http://crack.com/games/abuse
     and
     http://games.3dreview.com/abuse
   
   Lastly, if you want to discuss the source (this is a just-in-case
   thing-it may very well not get used), we put a small newsgroup up at
   news://addicted.to.crack.com/crack.technical. That is also where we'll
   prolly host a newsgroup about Golgotha DLL's, mods, editting, movies
   and stuff like that later on.
   Dave Taylor
   
   [INLINE] [INLINE]
   
  Version 0.2.0 of DeltaCine
  
   DeltaCine is a software implemented MPEG (ISO/IEC 11172-1 and 11172-2)
   decompressor and renderer for GNU/Linux and X-Windows. It is available
   from ftp://thumper.moretechnology.com/pub/deltacine.
   
   This project aims to provide portable C++ source code that implements
   the system and video layers of the MPEG standard.  This first release
   will interpret MPEG 1 streams, either 11172-1 or raw 11172-2, and
   render them to an X-Windows display.  The project emphasizes
   correctness and source code readability, so the performance suffers.
   It cannot maintain synchronized playback on a 166MHz Pentium.
   
   Still, the source code contains many comments about the quality of the
   implementation and the problems encountered when interpreting the
   standard.  All of the executing code was written from scratch, though
   there is an IDCT (Inverse Discrete Cosine Transform) implementation
   adapted from Tom Lane's IJG project that was used during development.
   
   This is an ALPHA release which means that the software comes with no
   warranties, expressed or implied.  It is being released under the GNU
   Public License for the edification of the GNU/Linux user community.
   
   Limitations:
     * Requires ix86
     * No playback synchronization.  Movies play as fast as the decoder
       can render the frames.
     * Requires X-Windows server in 16bpp mode.
       
   Features:
     * Full decode of Part 1 (System) and Part 2 (Video) specification
       for ISO/IEC 11172.  Full implementation except for
       synchronization.
     * Reference quality output as compared to the Stanford
       implementation.
     * User-mode multi-threading implemented as part of the decoder.
       
  RenderMan Module v0.01 for PERL 5
  
   This module acts as a Perl5 interface to the Blue Moon Rendering Tools
   (BMRT) RenderMan-compliant client library, written by Larry Gritz:
   http://www.seas.gwu.edu/student/gritz/bmrt.html
   
   REQUIREMENTS
   This module requires Perl 5, a C compiler, and BMRT.
   
   EXAMPLES
   Some extra code has been added to the examples directory that should
   enable you to convert LightWave objects to RIB or to a Perl script
   using the RenderMan binding.  More useful examples will be provided in
   future releases.
   
   Updates will hopefully be uploaded to PAUSE once I am authorized to
   upload there, and will be posted to my personal home page at:
   http://www.gmlewis.com/
   
   AUTHOR
   Glenn M. Lewis | glenn@gmlewis.com
   
   [INLINE]
   Sven Neumann released two more GIMP scripts for the megaperls script
   collection. You can find them as usual at:
   http://www-public.rz.uni-duesseldorf.de/ ~neumanns/gimp/megaperls
   
   You'll need to patch the waves-plug-in if you want to use the
   waves-anim script. The patch was posted a while ago on the list but
   hasn't made its way into any semi-official release yet. It is also
   available from the web-site mentioned above.
   
   Ed. Note:  Please note that the current release of the GIMP is a
   developers only release and not a public release.  If you plan on
   using it you should be very familiar with software development and C.
   A public release is expected sometime before the end of the year.
   
   Sven Neumann
   <neumanns@uni-duesseldorf.de>
   [INLINE]
   
  t1lib-0.3-beta
  
   t1lib is a library for generating character- and string-glyphs from
   Adobe Type 1 fonts under UNIX. t1lib uses most of the code of the X11
   rasterizer donated by IBM to the X11-project. But some disadvantages
   of the rasterizer being included in X11 have been eliminated. Here are
   the main features:
     * t1lib is completely independent of X11 (although the program
       provided for testing the library needs X11)
     * fonts are made known to library by means of a font database file
       at runtime
     * searchpaths for all types of input files are configured by means
       of a configuration file at runtime
     * characters are rastered as they are needed
     * characters and complete strings may be rastered by a simple
       function call
     * when rastering strings, pairwise kerning information from
       .afm-files may optionally be taken into account
     * an interface to ligature-information of afm-files is provided
     * rotation is supported at arbitrary angles
     * there's full support for extending and slanting fonts
     * new encoding vectors may be loaded at runtime and fonts may be
       reencoded using these encoding vectors
     * antialiasing is implemented using three gray-levels between black
       and white
     * a logfile may be used for logging runtime error-, warning- and
       other messages
     * an interactive test program called "xglyph" is included in the
       distribution. This program allows to test all of the features of
       the library. It requires X11.
       
   For X11-users a special set of functions exists which:
     * draw directly into X11 drawbles
     * respect fore- and background color of the graphics context
     * provide opaque and transparent drawing mode
     * provide automatic colored antialiasing
       
   Author:      Rainer Menzner (rmz@neuroinformatik.ruhr-uni-bochum.de)
   
   You can get t1lib by anonymous ftp at:
   ftp://ftp.neuroinformatik.ruhr-uni-bocum.de/pub/software/t1lib/t1lib-0
   .3-beta.tar.gz
   
   An overview on t1lib including some screenshots of xglyph can be found
   at:
   http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib.htm
   l
   
   [INLINE]
   
   GTK Needs A Logo!
  
   GTK, the GIMP Toolkit (I think, at least thats what it used to stand
   for) is looking a for a logo. Something that defines the essence of
   GTK, something that captures its soul and personality. A frozen image
   of everything that GTK stands for. Or maybe just something cool.
   
   The Prize
   
   The prize for submitting the winning logo is a very cool
   yourname@gimp.org email alias. Thats right, if you win, you can be the
   envy of your friends with your sparkling @gimp.org email alias.
   
   See http://www.gimp.org/contest.html for more details.
   
   [INLINE]
   
  Announcing MpegTV SDK 1.0 for Unix
  
   MpegTV SDK 1.0 is the first toolkit that allows any X-windows
   application to support MPEG video without having to include the
   complex code necessary to decode and play MPEG streams.
   
   MpegTV SDK 1.0 is currently available for:
     * Solaris 2.5 SPARC
     * Solaris 2.5 x86
     * IRIX 6.2
     * Linux x86
     * BSD/OS 3.0
       
   MpegTV also announces more good news: MpegTV Player 1.0 for Unix is
   now free for non-commercial use!
   For more information on MpegTV products and to download MpegTV
   software, please visit the MpegTV website:
   http://www.mpegtv.com
   
   Regards,
   Tristan Savatier - President, MpegTV LLC  [INLINE]
   
  Announcing MpegTV Plug-in 1.0 for Unix
  
   MpegTV Plug-in 1.0 is a streaming-capable Netscape Plug-in that allows
   you to play MPEG movie embedded inside HTML documents.
   
   Unlike other similar Netscape Plug-ins (e.g. the Movieplayer Plug-in
   on SGI), MpegTV Plug-in is capable of streaming from the network, i.e.
   you can play a remote MPEG stream immediately, without having to wait
   for the MPEG file to be downloaded on your hard disk.
   
   MpegTV Plug-in 1.0 is currently available for:
     * Solaris 2.5 SPARC
     * IRIX 6.2
     * Linux x86
     * Solaris 2.5 x86 (coming soon)
     * BSD/OS 3.0      (coming soon)
       
   Get it now at http://www.mpegtv.com/plugin.html !
   Regards, -- Tristan Savatier (President, MpegTV LLC)
   
   MpegTV:   http://www.mpegtv.com
   MPEG.ORG: http://www.mpeg.org
   [INLINE]
   
  USENIX 1998 Annual Technical Conference
  
   The 1998 USENIX Technical Conference Program Committee seeks original
   and innovative papers about the applications, architecture,
   implementation, and performance of modern computing systems. Papers
   that analyze problem areas and draw important conclusions from
   practical experience are especially welcome. Some particularly
   interesting application topics are:
   
    ActiveX, Inferno, Java, and other embeddable environments
    Distributed caching and replication
    Extensible operating systems
    Freely distributable software
    Internet telephony
    Interoperability of heterogeneous systems
    Nomadic and wireless computing
    Privacy and security
    Quality of service
    Ubiquitous computing and messaging
   
   A major focus of this conference is the challenge of technology: What
   is the effect of commodity hardware on how we build new systems and
   applications? What is the effect of next-generation hardware? We seek
   original work describing the effect of hardware technology on
   software. Examples of relevant hardware include but are not limited
   to:
   
    Cheap, fast personal computers
    Cheap, large DRAM and disks
    Flash memory
    Gigabit networks
    Wireless networks
    Cable modems
    WebTV
    Personal digital assistants
    Network computers
   
   The conference will also feature tutorials, invited talks, BOFs,
   and Vendor Exhibits.
   
   For more information about this event:
   
   * Visit the USENIX Web site:
     http://www.usenix.org/events/no98/index.html
   
   * Send email to the USENIX mailserver at info@usenix.org.  Your
   message should contain the line:  "send usenix98 conferences".
   
   * Or watch comp.org.usenix for full postings
   
   The USENIX Association brings together the community of engineers,
   system administrators, scientists, and technicians working on the
   cutting edge of computing. Its technical conferences are the essential
   meeting grounds for the presentation and discussion of the most
   advanced information on new developments in all aspects of advanced
   computing systems.  [INLINE]
   
  Ra-vec version 2.1b - convert plan drawings to 3D vector format
  
   Ra-vec is a program which can convert plan drawings of buildings into
   a vector format suitable for the creation of 3D models using the
   popular modelling package AC3D. It is freely avalible for linux from
   http://www.comp.lancs.ac.uk/ computing/users/aspinr/ra-vec.html
   
   [INLINE]
   
  xfpovray 1.2.4
  
   A new release of the graphical interface to the cool ray-tracer
   POV-Ray called xfpovray is now available.  It requires the most recent
   (test) version of the XForms library (0.87), and supports most of the
   numerous options of POV-Ray.  Hopefully 0.87 will migrate from test
   release to public release soon.
   
   This version of xfpovray adds a couple nice features, such as POV-Ray
   templates to aid in writing scene files. Binary and source RPMs are
   also available.  Since xforms does not come in rpm, you may get a
   failed dependency error.  If you get this, just use the --nodeps
   option.
   
   You can view an image of the interface and get the RPMs and source
   code from
   
                      http://cspar.uah.edu/~mallozzir/
                                      
   There is a link there to the XForms home page if you don't yet have
   this library installed.
   
   Bob Mallozzi <mallozzir@cspar.uah.edu>
   
   [INLINE]
   
  WSCG'98 - Call for Papers and Participation
  
   Just a reminder:
   
   The Sixth International Conference in Central Europe on Computer
   Graphics and Visualization 98, in cooperation with EUROGRAPHICS and
   IFIP working group 5.10 on Computer Graphics and Virtual Worlds, will
   be held in February 9 - 13, 1998 in Plzen at the University of West
   Bohemia close to PRAGUE, the capital of Czech Republic
   
   Information for authors: http://wscg.zcu.cz select WSCG'98
   Contribution deadline:  September 30, 1997
   [INLINE]
   
  ivtools 0.5.7
  
   ivtools contains, among other things, a set of drawing editors written
   in C++ for Unix/X11.  They extend idraw with networked export/import,
   multi-frame flipbook editing, and node/graph topology editing.  A new
   release, 0.5.7, is now available.
   
   Source code at:
   http://www.vectaport.com/pub/src/ivtools-0.5.7.tar.gz
   ftp://sunsite.unc.edu/pub/Linux/apps/graphics/draw/ivtools-0.5.7.tar.g
   z
   
   Linux elf binaries at:
   http://www.vectaport.com/pub/src/ivtools-0.5.7-LINUXx.tar.gz
   ftp://sunsite.unc.edu/pub/Linux/apps/graphics/draw/ivtools-0.5.7-LINUX
   .tar.gz
   
   Web page at:
   http://www.vectaport.com/ivtools/
   
   Vectaport Inc.
   http://www.vectaport.com
   info@vectaport.com
   
   [INLINE]
   
  Pixcon & Anitroll 1.04
  
   New features since version 1.04:
     * added DOS binaries to the distribution
     * 3DSMAX import/export plugin for Pixcon data files
     * 25% increase in rendering speed
       
   Pixcon 3D rendering package that creates high quality images by using
   a combination of 11 rendering primitives.  Anitroll is a forward
   kinematic hierarchical based animation system that has some support
   for some non-kinematic based animation (such as flock of birds, and
   autonomous cameras).  These tools are based upon the Graph library
   which is full of those neat rendering and animation algorithms that
   those 3D faqs keep mentioning.
   
   Why Pixcon & Anitroll?  Well, systems like Alias, Renderman,
   3DS/3DSMAX, Softimage, Lightwave, etc are too expensive for average
   users (anywhere from $1000 - $5000 US)  and require expensive hardware
   to get images in a reasonable amount of time.  Conventional freeware
   systems, such as BMRT, Rayshade, and POV are too slow (they're
   raytracers...). Pixcon & Anitroll is FREE, and doesn't take a long
   time to render a frame (true, its not real time... but I'm working on
   it). It also implements some rendering techniques that were presented
   at Siggraph 96 by Ken Musgrave and was used to generate an animation
   for Siggraph '95.
   
   The Pixcon & Anitroll Home page is at:
   http://www.radix.net/~dunbar/index.html
   
   Comments to dunbar@saltmine.radix.net
   Availabe from:  ftp://sunsite.unc.edu/incoming/Linux/pixcon-105.tgz
   and will be moved to:
   ftp://sunsite.unc.edu/pub/Linux/apps/graphics/rays/pixcon-105.tgz
   
   [INLINE]
   
  Glide 2.4 ported to Linux
  
   Glide version 2.4 has now been ported to Linux and is available free
   of charge. This library enables Linux users with 3Dfx Voodoo Graphics
   based cards such as the Orchid Righteous 3D, Diamond Monster 3D,
   Canopus Pure 3D, Realvision Flash 3D, and Quantum Obsidian to write 3D
   applications for the cards. The Voodoo Rush is not yet supported. The
   library is available only in binary form.
   
   To quote 3Dfx's web page:
   
     Glide is an optimized rasterization library that serves as a
     software 'micro-layer' to the 3Dfx Voodoo accelerators. With Glide,
     developers can harness the power of the Voodoo to provide
     perspective correct, filtered, and MIP mapped textures at real-time
     frame rates - without having to work directly with hardware
     registers and memory, enabling faster product development and
     cleaner code.
     
   As a separate effort, a module for Mesa is also under development to
   provide an OpenGL like interface for the Voodoo Graphics cards.
   
   For more information on Glide please see:
   http://www.3dfx.com/download/sdk/index.html
   For more download informtion for Glide see:
   http://www.3dfx.com/download/sdk/index.html
   For more information on Mesa see:
   http://www.ssec.wisc.edu/~brianp/Mesa.html
   For an FAQ on 3Dfx on Linux see:
   http://www.gamers.org/~bk/xf3D/
   Finally, if you need to discuss all this, try the 3Dfx newsgroup:
   news://news.3dfx.com/3dfx.glide.linux
   
   [INLINE]
   
    Did You Know?
    
    Q and A
    
   Q: Let me ask a graphic related question: is there a software which
   converts GIF/JPEG file to transparent GIF/JPEG file?  Raju Bathija
   <bathija@sindhu.theory.tifr.res.in>
   
   A: JPEG, to my knowledge, doesn't support transparency.  You have to
   use GIF (or PNG).  GIF files can have a transparency added by picking
   the color you want to be transparent.  One of the colors, and only
   one, can be specified as transparent.  You can use xv to pick the
   color.  Then you can use the NetPBM tools to convert the image to a
   transparent GIF.  You would do something like
   
    giftopnm file.gif | ppmtogif -transparent rgb:ff/ff/ff > newfile.gif
                                      
   Check the man page for ppmtogif for how to specify the color to use.
   
   [INLINE]
   
  Reader Mail
  
   Chris Bentzel <cbentzel@rhythm.com> wrote:
   
     At the end of your gamma correction discussion of graphics muse
     issue 17, you mention that you were unable to find contact info for
     Greg Ward. He is at gregl@sgi.com (he is now Greg Ward Larson->
     believes in reciprocating on the maiden-married name
     thing).However, a better link is to the radiance page: a high-end,
     physically correct ray-tracing/radiosity renderer used mostly for
     architectural design (and runs on Linux! Free source!)
     http://radsite.lbl.gov/radiance/HOME.html
     
   Jean Francois Martinez <jfm2@club-internet.fr> wrote:
   
     I had just finished reading your article in LJ about Megahedron and
     I was reading some of the examples and playing with them.  I looked
     in mhd/system/smpl_prims and found the following:
     
                         coord_system=right_handed;
                                      
     so you can do this
     
                       picture smokey_train_pic with
                                      
                             coord_system=left_handed;
                                      
     Notice than I put it just under the declaration of the top level
     object (the one called by do). Of course if you use this for the
     examples provided you will notice that now the camera is not
     focusing on the subject.
     
   John P. Pomeroy <pomerojp@ttc2.lu.farmingdale.edu> wrote:
   
     Usually I skip over the Graphics Muse, (I'm a bit head, not a
     graphic artist) but something drew me in this time.  Perhaps it's
     because I'm investigating the development of a Linux based Distance
     Learning platform for for use in my networking classes.Anyway, one
     of the  least expensive resources I've found over time has been the
     Winnov Videum-AV.  An outstanding card but near as I can tell,
     there are no Linux drivers .  I contacted Winnov a while back and
     they're not interested in Linux at all, but after reading about the
     efforts of the QuickCam folks I was wondering if you could just
     mention that the Videum card exists, perhaps simply asking if
     anyone is working on a driver?  (And, no, I don't own stock in
     Winnov nor know anyone that does.)Perhaps some of the programmers
     out there are working on something, or maybe Winnov will take the
     hint.  I'm certain that a Videum card on Linux would outperform the
     same card under NT.  Imagine a streaming video service (Either Java
     based or using the just released 60 stream Real Video Linux server)
     with a live feed under Linux. Sure wish the folks at Winnov
     could!Anyway, thanks. The 'Muse has a good balance of technical
     material and artistic issues.  I'll be reading the 'Muse a lot more
     often, but first...... the back issues!
     
   'Muse:  Well?  Anyone working on a driver for this?
   
   Jim Tom Polk  <jtpolk@camalott.com>  http://camalott.com/~jtpolk/
   wrote:
   
     Reading your column I noticed that you state that you don't know of
     any animated GIF viewers for Linux. I use xanim.  I usually use
     gifmerge to create the image, and then load up the image and step
     through it with xanim.  I also find it useful to see just how some
     animations are composed / created.  The version I have installed
     is: XAnim Rev 2.70.6.4 by Mark Podlipec (c) 1991-1997 I only found
     it out by accident when I loaded an animated GIF by accident (I was
     clicking on an mpeg file and missed it). You can start/stop/pause.
     Go forward and backwards one frame at a time, and speed up or slow
     down the entire sequence.  You still have to use another utility to
     create the GIF, but I use it all the time.Really enjoy your column.
     
   'Muse: I got a number of replies like this.  I never tried xanim for
   animated GIFs.  Sure enough, it works.  It just goes to show how much
   this wonderful tool can do.
   
   Alf Stockton <stockton@acenet.co.za> wrote:
   
     I have a number of JPEGs that I want to add external text to. ie
     Comments on photographs I have taken with my QV-10 digital camera.
     Now I don't want the text to appear on the picture. It must appear
     either next to or below same. So in other words I want to create a
     large JPEG consisting of some text and my picture. Of course it
     does not necessarily have to be a JPEG but it must be something
     that a web browser can display as I intend uploading same to my
     ISP.The thought was that I would create a HTML document for each
     image and this would work but now I have a large number of images &
     I don't want to create an equal amount of HTMLs.
     
   'Muse: I'm a little confused here.  Do you want the text visible at
   all?  Or just include the text as unprintable info (like in the header
   of the image)? If you want the text in the header I'm not sure how to
   do this.  I'm pretty sure it can be done, but I've never messed with
   it.
   
   If you want the text visible but not overlapping the original image
   there are lots of ways to get it done.  I highly recommend the GIMP,
   even though you feel its overkill - once you've learned to use it
   you'll find it makes life much easier.  However, if you just want a
   shell script to do it you can try some of the NetPBM tools.  NetPBM is
   a whole slew of simple command line programs that do image conversion
   and manipulations.  One of the tools is pnmcat.  To use this you'd
   take two images and convert them to pnm files.  For GIFs that would be
   like
   
                       giftoppm file1.gif > file1.pnm
                                      
   Then you use pnmcat like this:
   
          pnmcat -leftright file1.pnm file2.pnm > final-image.pnm
                                      
   This would place the two images side by side.  You could then convet
   this back to a GIF file for placing on the Web page.  pnmcat has other
   options allowing you to stack the images (-topbottom) and specify the
   way to justify the smaller image if the images are not the same
   width/height. There is a man page for pnmcat that comes with NetPBM.
   
   Note that the NetPBM tools do not have tools for dealing with JPEG
   images. However, there are some tools called jpegtoppm and ppmtojpeg
   available from the JPEG web site (I think).  I'm not positive abou
   that.  I don't use these specific tools for dealing with JPEGs.
   
   If you want, you can always read in the JPEG with xv first and save it
   as a PPM/PNM (these two formats are essentially the same) file first,
   then use the NetPBM tools.
   
   Jeff Taylor <jeff@adeno.wistar.upenn.edu> wrote:
   
     1)  You mentioned [in your review of Megahedron in the September
     issue of Linux Journal]some difficulty in writing the model
     information to a file for rendering with an alternative renderer.
     This is important to me as I would like to use PVMPOV for the final
     rendering.  It wasn't clear from what you wrote, is it difficult to
     do or impossible?
     
   'Muse: Difficult, but not impossible.  I think you can get model
   information via polygon data (vectors), but you'll have to do the work
   of getting that out to the file format of interest. I'm no expert,
   however.  I used it only for a little while, to get modestly familiar
   with it.  The best thing to do is write to them and ask the same
   question.  It will get a better answer (one would hope, anyway) and
   also show that the Linux community is interested in supporting
   commercial products.
   
     2)  Does the modeller allow 2D images to be printed?  I'm thinking
     of CAD type 3-angle-view drawings.  I'd like to use it for CAD
     applications where a model is created and scale drawing can be
     printed.
     
   'Muse: There isn't a print function for the 2D images, but you can
   save the images to a file and then print them using some other tool,
   like xv or the GIMP. The manual has a section on how to save the
   images.  BTW, I'm assuming you mean the images that have been
   rendered.  These images can be saved in RAW  or TGA format using
   functions provided in the SMPL language.
   
   Daniel Weeks <danimal@blueskystudios.com> wrote:
   
     I just want to start of by telling you that you are doing a great
     job with the Graphic Muse and on the current article in the Linux
     Jornal on Megahedron.  This is where my questions come from.
     
   'Muse: Thanks for the compliments!
   
     First, with Megahedron I noticed that it is a progamatic/procedural
     language for modeling (interestingly enough the language itself is
     not that dissimilar to our cgiStudio language in structure and
     function {except for that wierd commenting style}, in fact I
     already have a perl script that translates most of SPML to
     cgiStudio :).  The question here is does Megahedron have any sort
     of interface over the demo mode, I guess I mean something like (but
     it doesn't have to be as fully functional or bloated as) SoftImage
     or Alias|Wavefront.  Second can Megahedron support NURBS patches
     and deforming geometry.
     
   'Muse: Megahedron is a programming API - actually a scripting API.
   The CD I got (which is the $99 version they sell from their web pages)
   wasn't a demo, although it had lots of demos on it.  There is no X
   interface to the language (ie no graphical front end/modeler).  I
   suppose if there was enough interest they'd look into it.  Best thing
   to do is check their web page and get an email address to ask for it.
   There might be a non-Unix graphical front end, but I didn't check on
   that. As for Nurbs, there wasn't any mention of support for it on the
   disk I got. In fact, I don't think I've come across any modellers (or
   modelling languages) aside from BMRT that has support for NURBS on
   Linux.  But Linux is just beginning to move into this arena anyway, so
   its just a matter of time.
   BTW:  for those that don't know it, Blue Sky Studios is the special
   effects house that is doing, among other things, the special effects
   for the upcoming Alien Resurrection movie.  Yes, it appears Ripley may
   live forever.
   
   Hap Nesbitt <hap@handmadesw.com>, of Handmade Software wrote in reply
   to my review of Image Alchemy:
   
     A very nice review thanks.  BTW we do 81 formats now.  The new
     formats are documented in addendum.pdf. The Mews seems quite
     ambitious.  Is this all your work or do you get some help?
     
   'Muse: Its all mine, although I've had a couple of people write
   articles on two separate occassions.  And Larry Gritz offered lots of
   help when I did the BMRT write ups.  I still owe the readers an
   advanced version of that series.
   
     We've found a tool for porting Mac libraries to X. Our Mac
     interface is beautiful and we should get it ported sometime in the
     next 6 months or so.  I'll keep you posted. BTW people don't really
     buy much Image Alchemy, they buy Image Alchemy PS to RIP PostScript
     files out to large format inkjet plotters in HP-RTL format. If you
     give me your mailing address I'll send you a poster done this way.
     I think you might enjoy it.
     
   'Muse: Sounds great.  Thanks for the info Hap!
   
   G. Lee Lewis <GLLewis@ecc.com> wrote:
   
     Your web pages look really nice.
     
   'Muse: Thanks.
   
     Did you use Linux software to create your web pages?
     
   'Muse: Yes.  In fact, thats all I use - Linux.  I don't use MS for
   anything anymore.  All the software used to create the graphic images
   on my pages runs on Linux.
   
     Can you say what you used?.
     
   'Muse: Mostly the GIMP, a Photoshop clone for Unices.  "GIMP" stand
   for GNU Image Manipulation Program, but the acronym kinda stinks
   (IMHO, of course).  Its quite a powerful program though. I also use xv
   quite a bit, along with tools like the NetPBM toolkit (a bunch of
   little command line programs for doing various image processing
   tasks), MultiGIF (for creating GIF animations) and Netscape's 4.x Page
   Composer for creating HTML.  I just started using the latter and not
   all my pages were created with it, but eventually I'll probably switch
   from doing the HTML by hand (through vi) to only using the Page
   Composer. For 3D images I use POV-Ray and BMRT.  These require a bit
   more understanding of the technology than a tool like the GIMP, but
   then 3D is at a different state of development than 2D tools like the
   GIMP.
   
     What flavor of Linux do you like, redhat, debian, etc..??
     
   'Muse: Right now two of my 3 boxes at home are WGS Linux Pro's (which
   is really a Red Hat 3.x distribution) and one is a Slackware (on my
   laptop).  I like the Red Hat 4.2 distribution, but it lacks support
   for network installs using the PCMCIA ethernet card I have for my
   laptop.  I plan on upgrading all my systems to the RH4.2 release by
   the end of the year.
   
   I've not seen the Debian distribution yet.  Slackware is also quite
   good. I liked their "setup" tool for creating packages for
   distribution because it used a simple tar/gzip/shell script
   combination that was easy to use and easy to diagnose.  However, its
   not a real package management system like RPM.  "Consumers" (not
   hackers) will probably appreciate RPM more than "setup".
   
   I also use commercial software for Linux when possible.  I run
   Applixware, which I like very much, and Xi Graphics AcceleratedX
   server instead of the XFree86 servers.  The Xi server is much easier
   to install and supports quite a few more video adapters.  However, it
   doesn't yet support the X Input Extension unfortunately.  The latest
   XFree86 servers do, and thats going to become important over the next
   year with respect to doing graphics.
   
     What do you think of Caldera OpenLinux?
     
   'Muse: I haven't had a chance to look it over.  However, I fully
   support the commercial distributions.  I'm an avid supporter of
   getting Linux-based software onto the shelves of software reseller
   stores like CompUSA or Egghead Software.  Caldera seems the most
   likely candidate to be able to get that done the quickest.  After
   that, we'll start to see commercial applications on the shelves too.
   And thats something I'd love to see happen.  I did buy the Caldera
   Network Desktop last year but due to some hardware limitations decided
   to go back to the Slackware distributions I had then.
   
   Of all the distributions Caldera probably has a better understanding
   of what it takes to make a "product" out of Linux - something beyond
   just packing the binaries and sticking them on a CD.  A successful
   product will require 3rd party products (ones with full end-user
   quality, printed documentation and professional support organizations)
   and strategic alliances to help prevent fragmentation.  Fragmentation
   is part of what hurt the early PC Unix vendors (like Dell and Everex)
   and what has plagued Unix workstation vendors for years.
   
   So, in summary, I strongly support the efforts of Caldera, as well as
   Red Hat, Xi Graphics, and all vendors who strive to productize Linux.
   
   <veliath@jasmine.hclt.com> wrote:
   
     Is there some documentation available on GIMP - please, please say
     there is and point me towards it.
     
   'Muse: No, not yet.  A couple of books are planned, but nothing has
   been started officially.  No online documentation exists yet.  Its a
   major flaw in free software in general which annoys me to no end, but
   even in commercial organizations the documentation is usually the last
   thing to get done.
   
   There will be a 4 part series on the GIMP in the Linux Journal
   starting with the November issue.  I wrote this series.  It is very
   introductory but should help a little. I also did the cover art for
   that issue.  Let me know what you think!
   
   You can also grab any Photoshop 3 or Photoshop 4 book that covers the
   basics for that program.  The Toolbox (the main window with all the
   little icons in it) is nearly exactly the same in both programs (GIMP
   and Photoshop).  Layers work the same (with some minor differences in
   the way the dialog windows look).  I taught myself most of what I know
   based on "The Photoshop 3 Wow! Book" and a couple of others.
   ______________________________________________________________________
   
   [INLINE]
   
   
  Browser Detection with JavaScript
  
   I recently started reading up on the latest features that will be
   supported in the upcoming releases of the Netscape and MSIE Web
   browsers through both the C|Net web site known as Builder.com and
   another site known as Developer.com.  A couple of the more interesting
   features are Cascading Style Sheets, which you'll often see referred
   to as CSS, and layers.  CSS will allow HTML authors to define more
   definitive characteristics to their pages.  Items such as the font
   family(Ariel, Helvetica, and so forth), style (normal, italic,
   oblique), size, and weight can be specified for any text on the page.
   Browsers will attempt to honor these specifications and if they can't
   do so they will select appropriate defaults.  CSS handles most of the
   obvious characteristics of text on a page plus adds the ability to
   position text in absolute or relative terms.  You can also clip,
   overflow, and provide a z-index to the position of the text.  The
   z-index positioning is useful because it provides a means of accesing
   text and graphics in layers.  By specifying increasing values of z to
   a position setting you can effectively layer items on a page.
   Builder.com and Developer.com both have examples of these extensions
   to HTML that are fairly impressive.  There is a table of the new CSS
   features available at
   http://www.cnet.com/Content/Builder/Authoring/CSS/table.html.   You
   will need Netscape 4.x to view these pages.
   
   CSS is about to make web pages a whole lot more interesting.
   
   The down side to CSS is that its new.  Any new technology has a
   latency period that must pass before the technology is sufficiently
   distributed to be useful to the general populace.  In other words, the
   browsers aren't ready yet, or will just be released at the time this
   goes to print, so adding CSS elements to your pages will pretty much
   go unnoticed for some time.  I would, however, recommend becoming
   familiar with them if you plan on doing any serious Web page design in
   the future.  In the meantime we still have our JavaScript 1.1 and good
   ol' HTML 3.0.
   
   Ok, enough philosophizing, down to some nitty gritty.
   
   I just updated my GIMP pages to reflect the fact that the 0.54 version
   is pretty much dead and the 0.99 version is perpetually "about to
   become 1.0".  What that means is I've dropped most of my info and
   simply put up a little gallery with some of the images I've created
   with the GIMP.  Along with the images, including a background image
   that was created using nothing more than a set of gradients created or
   modified with the gradient editor in the GIMP, I've added some
   Javascript code to spice up my navigation menus and a couple of simple
   animated GIFs.  It was probably more fun to do than it is impressive.
   If you check out these pages you'll find its a little more attractive
   with Netscape 4.x since I'm using a feature for tables that allows me
   to specify background images for tables, rows and even individual
   cells.  Netscape 3.x users can still see most of the effects, but a
   few are lost.
   
   I had added some JavaScript code to the main navigation page of my
   whole site some time back.  I sent email to my brother, who does NT
   work at Compaq, and a Mac-using friend asking them to take a look at
   it and see what they thought.  It turned out MSIE really disliked that
   code and the Netscape browser on the Mac didn't handle the image
   rollers correctly (image rollovers cause one image to be replaced by
   another due to some user initiated action - we'll talk about those in
   a future Web Wonderings).  Shocking - JavaScript wasn't really cross
   platform as was first reported.  Well, its a new technology too.  The
   solution is to add code to determine if the rest of the code should
   really execute or not.  I needed to add some browser detection code.
   
   That was .... a year ago?  I can't remember, its been so long now.
   Well, while scanning the CSS and other info recently I ran across a
   few JavaScript examples that explained exactly how to do this.  I now
   take this moment to share it with my readers.  Its pretty basic, so
   I'll show it first, then explain it.   Note:  the following columns
   might be a little hard to read in windows less than about 660 pixels
   wide.  Sorry 'bout that.
   
     <SCRIPT LANGUAGE="JavaScript1.1">
     <!-- // Activate Cloaking Device
     //***************************************
     // Browser Detection - check which browse
     // we're working with.
     // Based loosely on code from both Tim
     // Wallace and the Javascript section of
     // www.developer.com.
     //***************************************
     browserName = navigator.appName;
     browserVersion = parseInt(navigator.appVersion);
     browserCodeName = navigator.appCodeName;
     browserUserAgent = navigator.appUserAgent;
     browserPlatform = navigator.platform;
     // Test for Netscape browsers
     if ( browserName == "Netscape" &&
        browserVersion >= 4 )
        bVer = "n4";
     if ( browserName == "Netscape" &&
        browserVersion == 3 )
        bVer = "n3";
     if ( browserName == "Netscape" &&
        browserVersion == 2 )
        bVer = "n1";
     // Test for Internet Explorer browsers
     if ( browserName == "Microsoft Internet Explorer" &&
          browserVersion == 2 ) bVer = "e2";
     if ( browserName == "Microsoft Internet Explorer" &&
          browserVersion == 3 ) bVer = "e3";
     if ( browserName == "Microsoft Internet Explorer" &&
          browserVersion >= 4 ) bVer = "e4";
     // Deactivate Cloaking  -->
     </SCRIPT>
     
   The first line tells browsers that a script is about to follow.  The
   LANGUAGE construct is supposed to signify the scripting language, but
   is not required. If the LANGUAGE tag is left off browsers are supposed
   to assume the scripting language to be JAVASCRIPT.  The only other
   language available that I'm aware of currently is VBSCRIPT for MSIE
   Browsers that do not understand this HTML element simply ignore it.
   The next line starts the script.  All scripts are enclosed in HTML
   comment structures.  By doing this the script can be hidden from
   browsers that don't understand them (thus the comment on "cloaking").
   Note that scripts can start and stop anywhere in your HTML document.
   Most are placed in the <HEAD> block at the top of the page to make
   debugging a little easier, but thats not required.
   
   Comments in scripts use the C++ style comment characters, either
   single lines prefixed with // or multiple lines that start with /* and
   end with */.  I placed the comments in the example in a purple color
   for those with browsers that support colored text, just to make them
   stand out from the real code a little.
   
   The next five lines grab identification strings from the browser by
   accessing the navigator object.  The first two, which set the
   browserName and browserVersion variables,  are obvious and what you
   will use most often to identify browsers in your scripts.  The
   appCodeName is "Mozilla" for Netscape and may not be set for MSIE.
   The appUserAgent is generally a combination of the appCodeName and the
   appVersion, although it doesn't have to be.  Often you can use grab
   this string and parse out the information you are really looking for.
   The last item, the platform property for the navigator object, was
   added in Javascript 1.2.  Be careful - this code tries to access a
   property that not all browsers can handle!  You may want to embed the
   browserPlatform assignment inside one of the IF statements below it to
   be safe.
   
   Now we do some simple tests for the browsers our scripts can support.
   Note that the tests are fairly simply - we just test the string values
   that we grabbed for our browserName and browserVersion variables.  In
   the first set of tests we check for Netscape browsers.  The second set
   of tests test for MSIE browsers.  We could add code inside these tests
   to do platform specific things (like special welcome messages for
   Linux users!) but in practice you'll probably want this particular
   script to only set a global flag that can be tested later, in other
   scripts where the real work will be done.  Remember - you can have
   more than one script in a single HTML page and each script has access
   to variables set in other scripts.
     Why is it important to test for browers versions?  Simple -
   JavaScript is a new technology, introduced in Netscape's 2.0 release
   of their Navigator browser.  Microsoft, despite whining that
   JavaScript isn't worth supporting, added support for the language in
   their 3.0 browser.  The problem is that each version, for either
   browser, supports the language to different extents.  For example, one
   popular use of the language is "image rollovers".  These allow images
   to change in the display based when the mouse is placed over the
   image.  Various versions of Netscape from 2.0 handled this just fine.
   The Mac version had a bug in 3.0 that would not clear the original
   image before updating with the new image.  MSIE 2.0 and 3.0 didn't
   like this bit of JavaScript at all, popping up error windows in
   protest.  Knowing the browser and platform information can help you
   design your JavaScript to work reasonably well on any platform.
   ______________________________________________________________________
   
   
   Musings
   
SIGGRAPH 97

   Unfortunately I'm not able to bring you my experiences at
   SIGGRAPH this month.  On my trip I took notes in my NEC Versa notebook
   (running Linux, of course).  Unfortunately I left the power supply and
   power cable in my motel room and by the time I realized it after I
   returned the motel could not find it.  Its probably on some used
   computer resellers shelves now.  Anyway, I just ordered a
   replacement.  I'll have my SIGGRAPH report for you next month.  Sorry
   about that.  I am, of course, taking donations to cover the cost of
   replacement.  <grin>
   
   [INLINE]
   
Designing Multimedia Applications

   I recently picked up a copy of Design Graphics from my local computer
   bookstore.  This is a monthly magazine with a very high quality layout
   that covers many areas of computer graphics in great detail.  The
   magazine is rather pricey, about $9US, but so far has proven to be
   worth the price.  If you are into Graphic Design and/or User Interface
   Design it might be worth your time and money to check out this
   magazine.
   
   The July issue focused on MetaCreations, the company that was created
   from the merger of MetaTools and Fractal Design.  MetaTools founders
   includeKai Krause, a unique designer and software architect, the man
   responsible for the bold interfaces found in MetaTools products like
   Soap and GOO.  This issue also included very detailed shots of the
   interface for Soap.  It was while reading this issue and studying the
   interface for Soap that I realized something basic:  Multimedia
   applications can look like anything you want.  You just have to
   understand a little about how Graphical Interfaces work and a lot
   about creating graphical images.
   
   Graphical Interfaces are simply programs which provide easily
   recognizable displays that permit users to interact with the program.
   These interfaces are event driven, meaning they sit in a loop waiting
   for an event such as a mouse click or movement and then perform some
   processing based on that event.  There are two common ways to create
   programs like this.  You can use a application programming interface,
   often referred to as an API, like Motif or OpenGL.  Or you can use a
   scripting interface like HTML with Java/JavaScript or VRML.  Which
   method you choose depends on the applications purpose and target
   audience.
   
   So, who is the target audience?  My target audience for this column is
   the multitudes of Linux users who want to do something besides run Web
   servers.  Your target audience will either be Linux/Unix users or
   anyone with access to a computer no matter what platform they use.  In
   the first case you have a choice:  you can use either the API's or you
   can make use of HTML/VRML and browser technology.  If you are looking
   for cross-platform support you will probably go with browser
   technology.  Note that a third alternative exists - native Java which
   runs without the help of a browser - but that this is even newer than
   browser technology.  You'll have about a year to wait till Java can be
   used easily across platforms.  Browser technology, although a little
   shakey in some ways, is already here.
   
   In order to use an API for your multimedia application you need to
   choose a widget set.  A widget set is the part of the API that handles
   windowing aspects for you.  Motif has a widget set that provides 3D
   buttons, scrollbars, and menus.  Mutlimedia applications have higher
   demands than this, however. The stock Motif API cannot handle
   MPEG movies, sound, or even colored bitmaps.  It must be used in
   conjunction with OpenGL, MpegTV's library, the OSS sound interface and
   the XPM library to provide a full multimedia development environment.
   The advantage to the API method is control - the tools allow the
   developer the ability to create applications that are much more
   sophisticated and visually appealing than with browser based
   solutions.  An API solution, for example, can run in full screen mode
   without a window manager frame, thus creating the illusion that it is
   the only application running on the X server.  In order to get the
   effects you see in MetaTool's Soap you will need to create 2D and
   3D pixmaps to be used in Motif label and button widgets.  If you do
   this you should turn off the border areas which are used to create
   Motif's 3D button effects. You will also need to write special
   callbacks (routines called based on an event which you specify) to
   swap the pixmaps quickly in order to give the feeling of motion or
   animation.
   
   Even with the use of 3D pixmaps in Motif you still won't have the
   interactivity you desire in your multimedia application.  To add
   rotating boxes and other 3D effects with which the user can interact
   you will need to embed the OpenGL widget, available from the
   MesaGL package, into your Motif program.  By creating a number of
   OpenGL capable windows you can provide greater 3D interactivity than
   you can by simply swapping pixmaps in Motif labels and buttons.  The
   drawback here is that you will be required to write the code which
   registers events within given areas of the OpenGL widget.  This is not
   a simple task, but it is not impossible.  Using OpenGL with Motif is a
   very powerful solution for multimedia applications, but it is not for
   the faint of heart developer.
   
   Using browser technology to create a multimedia application is a
   little different.  First, the browser will take care of the event
   catching for you.  You simply need to tell it what part of a page
   accepts events, which events it should watch for and what to do when
   that event happens.  This is, conceptually, just like using the
   API method.  In reality, using a browser this way is much simpler
   because the browser provides a layer of abstraction to simplify the
   whole process.  You identify what parts of the page accept input via
   HTML markup using links, anchors, and forms and then use JavaScript's
   onEvent style handlers, such as onClick or onMouseOver, to call an
   event handler.  Formatting your application is easier using the
   HTML markup language than trying to design the interface using the
   API.  You can have non-rectangular regions in imagemaps, for example,
   that accept user input.  API's can also have non-rectangular regions,
   but HTML only requires a single line of code to specify the region.
   An API can use hundreds of lines of code.
   
                            -Top of next column-
                                      
   [INLINE]
   
    More Musings...
   No other musings - what?  This wasn't enough for you?  <grin>
   
   [INLINE]
   
   Ok, since we know using API's can be complex, and because I'm going to
   run out of room long before I can cover how to use an API to do a
   multimedia application, lets look at creating an application using
   browser technology.
   
   Creating web pages is pretty easy.  If you haven't had a chance yet,
   take a look at Netscape 4.0.  It includes a tool called the Page
   Composer which allows for WYSIWYG creations of web pages.  This column
   was created using Page Composer.  Web pages are not enough, of
   course.  We need graphics, animations and sound.  Not to mention
   interaction with files on disk.
   
   Graphics, animations and sound can easily be embedded in a web page
   with links.  Your application will probably need to provide players
   for any animations or sounds you provide unless you feel really
   confident users will already have players.   For animations on Linux
   systems, other than animated GIFs which are supported natively in most
   browsers these days, you can try xanim.  Your installation process
   will have to explain how to install the players.  JavaScript does
   permit you to query what players and plug-ins are available but
   doesn't appear to give you the ability to automatically launch them
   without having first registered them with the browser.
   
   Sound can be added just like the graphics and animations.  You simply
   have links to the sound files.  Not all Linux systems will have sound
   available.  You might want to consider writing a plug-in which checks
   for the sound devices before trying to play sounds and having this
   plug-in installed for your sound files.  Security issues may prevent a
   plug-in from opening a device file.  You should check the Netscape
   plug-in API to find out what files you can and cannot open.
   
   You might be wondering how you can use a browser for a multimedia
   application on a CD.  Don't forget - both MSIE and Netscape allow you
   to view HTML documents on the native system.  On Netscape you can just
   use something like file:/cdrom/start.html to open up the main page of
   the application.  Any links - sound, graphics, or animations - can be
   displayed or played when the page is first loaded using JavaScript's
   onLoad event handler.  Graphics, animations, sound and Java applets do
   not have to be served via a Web server to be viewed or run by the
   browser.  And JavaScript is embedded in the HTML page so it doesn't
   require a Web server either.  As long as you use relative links
   (relative to the directory where your applications start page is
   located) your users won't need access to a Web server to use your
   HTML-based multimedia application.
   
   Well, we've covered just about all the things you'll want to do in
   your program except how to access files.  Security in browsers and
   with Java has traditionally been rather zealous - the systems were
   secure by denying all access to your hard drives.  Thats still the
   case even with JavaScript 1.2.  There are no real file I/O commands in
   the JavaScript language.  In order to place data in your application
   you will need to place it all in static arrays embedded in JavaScript
   code in a page.  Fortunately you can place this data in separate files
   and link to them when the page is loaded.  To do this you would use
   the SRC= attribute of the SCRIPT tag.  Netscape 3.0 or later browsers
   will read this and load the script file as if it were embedded at the
   SCRIPT tag of the original page.  This will not work for pre-3.0
   browsers, some of the beta 4.0 browsers or (apparently) any of the
   MSIE browsers.
   
   The SCR attribute  provides some level of control for maintaining your
   data files, but it also means your data is in user readable files on
   the CD. If you use Java applets instead you have the ability to
   compile this data into an object file but you still don't have access
   to your file system.  It may be possible to read data from files using
   plug-ins in order to perform some interactive operations but I'm not
   familiar with the Netscape or MSIE plug-in API's and suspect they also
   have some measure of security that may prevent this.  Reading files
   seems harmless enough, but there are reasons to disallow this
   practice. There is a way to get read/write access to the users
   filesystem from a JavaScript or Java application - certificates.  This
   is a new technology and I'm not that familiar with its use yet.  The
   Official Netscape JavaScript 1.2 Book describes certificates and how
   to obtain and create them.  I suggest taking a look at this book (at
   the end of chapter 14) if you are interested in this.
   
   As I reread this article I realize what is so crystal clear in my mind
   now is probably still a muddy swamp to my readers.  Don't fret.
   I covered a lot of material in a rather short space.  What you should
   do is first pick a method - API or browsers.  Then pick one part of
   that method and start reading all you can about it.  Personally,
   I understand the API methods better since I'm a programmer by trade.
   The browser technology is interesting in that it provides the User
   Interface (UI) that is filled in by the developer with images and
   sound.  Abstrasting the UI in this manner is the future of
   applications but its still in its early days of development.  In
   either case you still need an understanding of what each piece of the
   puzzle does for you. The API method will give you more control and
   access to databases without the need for servers (you can embed the
   database code in the application).  The browser method is easier to
   prototype and develop but has limited access to the system for
   security reasons. Either method can produce stunning effects, if you
   understand how all the pieces fit together.  And when you look at
   MetaCreations products, like Soap and GOO, you can see the kinds of
   effects that are possible.
   [INLINE]
   
   Resources The following links are just starting points for finding
   more information about computer graphics and multimedia in general for
   Linux systems. If you have some application specific information for
   me, I'll add them to my other pages or you can contact the maintainer
   of some other web site. I'll consider adding other general references
   here, but application or site specific information needs to go into
   one of the following general references and not listed here.
   
   Linux Graphics mini-Howto
   Unix Graphics Utilities
   Linux Multimedia Page
   
   Some of the Mailing Lists and Newsgroups I keep an eye on and where I
   get alot of the information in this column:
   
   The Gimp User and Gimp Developer Mailing Lists.
   The IRTC-L discussion list
   comp.graphics.rendering.raytracing
   comp.graphics.rendering.renderman
   comp.graphics.api.opengl
   comp.os.linux.announce  [INLINE]
   
Future Directions

   Next month:
     * Web Wonderings - Adding JavaScript Rollovers to simulate dynamic
       images
     * My SIGGRAPH notes, if I can get my notebook running again.
     * Maybe a look at libgr, if I have time.
       
   Let me know what you'd like to hear about!
     _________________________________________________________________
   
                    Copyright © 1997, Michael J. Hammel
          Published in Issue 22 of the Linux Gazette, August 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                       Linux Benchmarking - Concepts
                                      
                   by André D. Balsa andrewbalsa@usa.net
                                      
With corrections and contributions by Uwe F. Mayer mayer@math.vanderbilt.edu
                  and David C. Niemi bench@wauug.erols.com
     _________________________________________________________________
   
   This is the first article in a series of 4 articles on Linux
   Benchmarking, to be published by the Linux Gazette. This article deals
   with the fundamental concepts in computer benchmarking, as they apply
   to the Linux OS. An example of a classic benchmark, "Whetstone", is
   analyzed in more detail.
     _________________________________________________________________
   
1. Basic concepts and definitions

     * 1.1 Benchmark
     * 1.2 Benchmark results
     * 1.3 Index figures
     * 1.4 Performance metrics
     * 1.5 Elapsed wall-clock time vs. CPU time
     * 1.6 Resolution and precision
     * 1.7 Synthetic benchmark
     * 1.8 Application benchmark
     * 1.9 Relevance
       
2. A variety of benchmarks

3. FPU tests: Whetstone and Sons, Ltd.

     * 3.1 Whetstone history and general features
     * 3.2 Getting the source and compiling it
     * 3.3 Running Whetstone and gathering results
     * 3.4 Examining the source code, the object code and interpreting
       the results
       
4. References
     _________________________________________________________________
   
1. Basic concepts and definitions

1.1 Benchmark

   A benchmark is a documented procedure that will measure the time
   needed by a computer system to execute a well-defined computing task.
   It is assumed that this time is related to the performance of the
   computer system and that someh ow the same procedure can be applied to
   other systems, so that comparisons can be made between different
   hardware/software configurations.
   
1.2 Benchmark results

   From the definition of a benchmark, one can easily deduce that there
   are two basic procedures for benchmarking:
    1. Measuring the time it takes for the system being examined to loop
       through a fixed number of iterations of a specific piece of code.
    2. Measuring the number of iterations of a specific piece of code
       executed by the system under examination in a fixed amount of
       time.
       
   If a single iteration of our test code takes a long time to execute,
   procedure 1 will be preferred. On the other hand, if the system being
   tested is able to execute thousands of iterations of our test code per
   second, procedure 2 should be chosen.
   
   Both procedures 1 and 2 will yield final results in the form
   "seconds/iteration" or "iterations/second" (these two forms are
   interchangeable). One could imagine other algorithms, e.g.
   self-modifying code or measuring the time needed to reach a steady s
   tate of some sort, but this would increase the complexity of the code
   and produce results that would probably be next to impossible to
   analyze and compare.
   
1.3 Index figures

   Sometimes, figures obtained from standard benchmarks on a system being
   tested are compared with the results obtained on a reference machine.
   The reference machine's results are called the baseline results. If we
   divide the results of the system under examination by the baseline
   results, we obtain a performance index. Obviously, the performance
   index for the reference machine is 1.0. An index has no units, it is
   just a relative measurement.
   
1.4 Performance metrics

   The final result of any benchmarking procedure is always a set of
   numerical results which we can call speed or performance (for that
   particular aspect of our system effectively tested by the piece of
   code).
   
   Under certain conditions we can combine results from similar tests or
   various indices into a single figure, and the term metric will be used
   to describe the "units" of performance for this benchmarking mix.
   
1.5 Elapsed wall-clock time vs. CPU time

   Time measurements for benchmarking purposes are usually taken by
   defining a starting time and an ending time, the difference between
   the two being the elapsed wall-clock time. Wall-clock means we are not
   considering just CPU time, but the "real" time usually provided by an
   internal asynchronous real-time clock source in the computer or an
   external clock source (your wrist-watch for example). Some tests,
   however, make use of CPU time: the time effectively spent by the CPU
   of the system being test ed in running the specific benchmark, and not
   other OS routines.
   
1.6 Resolution and precision

   Resolution and precision both measure the information provided by a
   data point, but should not be confused.
   
   Resolution is the minimum time interval that can be (easily) measured
   on a given system. In Linux running on i386 architectures I believe
   this is 1/100 of a second, provided by the GNU C system library
   function times (see /usr/include/time .h - not very clear, BTW).
   Another term used with the same meaning is "granularity". David C.
   Niemi has developed an interesting technique to lower granularity to
   very low (sub-millisecond) levels on Linux systems, I hope he will
   contribute an explanation of his algorithm in the next article.
   
   Precision is a measure of the total variability in the results for any
   given benchmark. Computers are deterministic systems and should always
   provide the same, identical benchmark results if running under
   identical conditions. However, since Linux is a multi-tasking,
   multi-user system, some tasks will be running in the background and
   will eventually influence the benchmark results.
   
   This "random" error can be expressed as a time measurement (e.g. 20
   seconds + or - 0.2 s) or as a percentage of the figure obtained by the
   benchmark considered (e.g. 20 seconds + or - 1%). Other terms
   sometimes used to describe variations in results ar e "variance",
   "noise", or "jitter".
   
   Note that whereas resolution is system dependent, precision is a
   characteristic of each benchmark. Ideally, a well-designed benchmark
   will have a precision smaller than or equal to the resolution of the
   system being tested. It is very important to iden tify the sources of
   noise for any particular benchmark, since this provides an indication
   of possibly erroneous results.
   
1.7 Synthetic benchmark

   A program or program suite specifically designed to measure the
   performance of a subsystem (hardware, software, or a combination of
   both). Whetstone is an example of a synthetic benchmark.
   
1.8 Application benchmark

   A commonly executed application is chosen and the time to execute a
   given task with this application is used as a benchmark. Application
   benchmarks try to measure the performance of computer systems for some
   category of real-world computing task. Measu ring the time your Linux
   box takes to compile the kernel can be considered as a sort of
   application benchmark.
   
1.9 Relevance

   A benchmark or its results are said to be irrelevant when they fail to
   effectively measure the performance characteristic the benchmark was
   designed for. Conversely, benchmark results are said to be relevant
   when they allow an accurate prediction of re al-life performance or
   meaningful comparisons between different systems.
     _________________________________________________________________
     _________________________________________________________________
   
2. A variety of benchmarks

   The performance of a Linux system may be measured by all sorts of
   different benchmarks:
    1. Kernel compilation performance.
    2. FPU performance.
    3. Integer math performance.
    4. Memory access performance.
    5. Disk I/O performance.
    6. Ethernet I/O performance.
    7. File I/O performance.
    8. Web server performance.
    9. Doom performance.
   10. Quake performance.
   11. X graphics performance.
   12. 3D rendering performance.
   13. SQL server performance.
   14. Real-time performance.
   15. Matrix performance.
   16. Vector performance.
   17. File server (NFS) performance.
       
   Etc...
     * Conclusion I: it's obvious that no single benchmark can provide
       results for all the above items.
     * Conclusion II: you must first decide what you are trying to
       measure, then choose an appropriate benchmark (or write your own).
     * Conclusion III: it's impossible to come up with a single figure
       (called Single Figure of Merit in benchmarking terminology) that
       will summarize the performance of a Linux system. Hence, no
       "Lhinuxstone" metric exists.
     * Conclusion IV: benchmarking always takes more time than you
       thought it would.
     _________________________________________________________________
   
3. FPU tests: Whetstone and Sons, Ltd.

   Floating-point (FP) instructions are among the least used while
   running Linux. They probably represent < 0.001% of the instructions
   executed on an average Linux box, unless one deals with scientific
   computations. Besides, if you really want to know how well designed
   the FPU in your processor is, it's easier to have a look at its data
   sheet and check how many clock cycles it takes to execute a given FPU
   instruction. But there are more benchmarks that measure FPU
   performance than anything else. Why ?
   
    1. RISC, pipelining, simultaneous issuing of instructions,
       speculative execution and various other CPU design tricks make the
       CPU performance, specially FPU performance, difficult to measure
       directly and simply. The execution time of an FPU instruction
       varies depending on the data, and a continuous stream of FPU
       instructions will execute under special circumstances that make
       direct predictions of performance impossible in most cases.
       Simulations (synthetic benchmarks) are needed.
    2. FPU tests are easier to write than other benchmarks. Just put a
       bunch of FP instructions together and make a loop: voilŕ !
    3. The Whetstone benchmark is widely (and freely) available in Basic,
       C and Fortran versions, in case you don't want to write your own
       FPU test.
    4. FPU figures look good for marketing purposes. Here is what Dave
       Sill, the author of the comp.benchmarks FAQ, has to say about
       MFLOPS: "Millions of Floating Point Operations Per Second.
       Supposedly the rate at which the system can execute floating point
       instructions. Varies widely between different benchmarks and
       different configurations of the same benchmarks. Popular with
       marketing types because it's sounds like a "hard" value like miles
       per hour, and represents a simple concept."
    5. If you are going to buy a Cray, you'd better have an excuse for
       it.
    6. You can't get a data sheet for the Cray (or don't believe the
       numbers), but still want to know its FP performance.
    7. You want to keep your CPU busy doing all sorts of useless FP
       calculations, and want to check that the chip gets very hot.
    8. You want to discover the next big bug in the FPU of your
       processor, and get rich speculating with the manufacturer's
       shares.
       
   Etc...
   
3.1 Whetstone history and general features

   The original Whetstone benchmark was designed in the 60's by Brian
   Wichmann at the National Physical Laboratory, in England, as a test
   for an ALGOL 60 compiler for a hypothetical machine. The compilation
   system was named after the small town of Whetstone, where it was
   designed, and the name seems to have stuck to the benchmark itself.
   
   The first practical implementation of the Whetstone benchmark was
   written by Harold Curnow in FORTRAN in 1972 (Curnow and Wichmann
   together published a paper on the Whetstone benchmark in 1976 for The
   Computer Journal). Historically it is the first major synthetic
   benchmark. It is designed to measure the execution speed of a variety
   of FP instructions (+, *, sin, cos, atan, sqrt, log, exp) on scalar
   and vector data, but also contains some integer code. Results are
   provided in MWIPS (Millions of Whetstone Instructions Per Second). The
   meaning of the expression "Whetstone Instructions" is not clear,
   though, at least after close examination of the C source code.
   
   During the late 80's and early 90's it was recognized that Whetstone
   would not adequately measure the FP performance of parallel
   multiprocessor supercomputers (e.g. Cray and other mainframes
   dedicated to scientific computations). This spawned the development of
   various modern benchmarks, many of them with names like Fhoostone, as
   a humorous reference to Whetstone. Whetstone however is still widely
   used, because it provides a very reasonable metric as a measure of
   uniprocessor FP performance.
   
   Whetstone has other interesting qualities for Linux users:
   
     * Its source code is short and relatively easy to understand, with a
       clean, self-explanatory structure.
     * The C version compiles cleanly on Linux boxes with gcc.
     * Execution time is short: 100 seconds (by design).
     * It is very precise (small variations in the results).
     * CPU architecture digression: for the Whetstone benchmark, the
       object code that gets looped through is very small, fitting
       entirely in the L1 cache of most modern processors, hence keeping
       the FPU pipeline filled and the FPU permanently busy. This is
       desirable because Whetstone is doing exactly what we want it to
       do: measuring FPU performance, not CPU/L2 cache/main memory
       coupling, integer performance or any other feature of the system
       under test. Note however that David C. Niemi has provided some
       conclusive evidence that at least some interaction with the L2
       cache or main memory is taking place on Pentium (R) systems
       (Pentium CPUs have a sophisticated FPU instruction pipeline and
       can dispatch two FPU instructions on a single clock cycle. One
       pipe can execute all integer and FP instructions, while the other
       pipe can execute simple integer instructions and the FXCH FP
       instructions. This is quoted from Intel's datasheet on the Pentium
       processor, available at Intel's developers site). I wish somebody
       with a Pentium ICE equipment could investigate this a little
       further...
       
3.2 Getting the source and compiling it

  Getting the standard C version by Roy Longbottom.
  
   The version of the Whetstone benchmark that we are going to use for
   this example was slightly modified by Al Aburto and can be downloaded
   from his excellent FTP site dedicated to benchmarks. After downloading
   the file whets.c, you will have to edit slightly the source: a)
   Uncomment the "#define POSIX1" directive (this enables the Linux
   compatible timer routine). b) Uncomment the "#define DP" directive
   (since we are only interested in the Double Precision results).
   
  Compiling
  
   This benchmark is extremely sensitive to compiler optimization
   options. Here is the line I used to compile it: cc whets.c -o whets
   -O2 -fomit-frame-pointer -ffast-math -fforce-addr -fforce-mem -m486
   -lm.
   
   Note that some compiler options of some versions of gcc are buggy,
   most notably one of -O, -O2, -O3, ... together with -funroll-loops can
   cause gcc to emit incorrect code on a Linux box. You can test your gcc
   with a short test program available at Uwe Mayer's site. Of course, if
   your compiler is buggy, then any test results are not written in
   stone, to say the least (pun intended). In short, don't use
   -funroll-loops to compile this benchmark, and try to stick to the
   optimization options listed above.
   
3.3 Running Whetstone and gathering results

  First runs
  
   Just execute whets. Whetstone will display its results on standard
   output and also write a whets.res file if you give it the information
   it requests. Run it a few times to confirm that variations in the
   results are very small.
   
  With L1, L2 or both L1 and L2 caches disabled
  
   Some motherboards allow you to disable the L1 (internal) or L2
   (external) caches through the BIOS configuration menus (take a look at
   the motherboard's manual; the ASUS P55T2P4 motherboard, for example,
   allows disabling both caches separately or together). You may want to
   experiment with these settings and/or main memory (DRAM) timing
   settings.
   
  Without optimization
  
   You can try to compile whets.c without any special optimization
   options, just to verify that compiler quality and compiler
   optimization options do influence benchmark results.
   
3.4 Examining the source code, the object code and interpreting the results

  General program structure
  
   The Whetstone benchmark main loop executes in a few milliseconds on an
   average modern machine, so its designers decided to provide a
   calibration procedure that will first execute 1 pass, then 5, then 25
   passes, etc... until the calibration takes more than 2 seconds, and
   then guess a number of passes xtra that will result in an approximate
   running time of 100 seconds. It will then execute xtra passes of each
   one of the 8 sections of the main loop, measure the running time for
   each (for a total running time very near to 100 seconds) and calculate
   a rating in MWIPS, the Whetstone metric. This is an interesting
   variation in the two basic procedures described in Section 1.
   
  Main loop
  
   The main loop consists of 8 sections each containing a mix of various
   instructions representative of some type of computational task. Each
   section is itself a very short, very small loop, and has its own
   timing calculation. The code that gets looped through for section 8
   for example is a single line of C code:
   
   x = sqrt(exp(log(x)/t1); where x = 0.75 and t1=0.50000025, both
   defined as doubles.
   
  Executable code size, library calls
  
   Compiling as specified above with gcc 2.7.2.1, the resulting ELF
   executable whets is 13 096 bytes long on my system. It calls libc and
   of course libm for the trigonometric and transcendental math
   functions, but these should get compiled to very short executable code
   sequences since all modern CPUs have FPUs with these functions
   wired-in.
   
  General comments
  
   Now that we have an FPU performance figure for our machine, the next
   step is comparing it to other CPUs. Have you noticed all the data that
   whets.c asked you after you had run it for the first time? Well, Al
   Aburto has collected Whetstone results for your convenience at his
   site, you may want to download the data file and have a look at it.
   This kind of benchmarking data repository is very important, because
   it allows comparisons between various different machines. More on this
   topic in one of my next articles.
   
   Whetstone is not a Linux specific test, it's not even an OS specific
   test, but it certainly is a good test for the FPU in your Linux box,
   and also gives an indication of compiler efficiency for specific kinds
   of applications that involve FP calculations.
   
   I hope this gave you a taste of what benchmarking is all about.
     _________________________________________________________________
   
4. References

   Other references for benchmarking terminology:
   
     * The comp.benchmarks FAQ by Dave Sill.
     * The On-Line Computing Dictionary.
     * The Linux Benchmarking HOWTO available from the LDP site and
       mirrors.
     _________________________________________________________________
   
                      Copyright © 1997, André D. Balsa
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                    Word Processing and Text Processing
                                      
                               by Larry Ayers
     _________________________________________________________________
   
   One of the most common questions posted in the various Linux
   newsgroups is "Where can I find a good word-processor for Linux?".
   This question has several interesting ramifications:
     * There is an unspoken assumption that a word processor is a vital
       application for an operating system.
     * The query implies that the questioner has investigated the text
       processing capabilities readily available for Linux and has either
       found them too daunting to learn and/or not suited to the tasks at
       hand, or...
     * The questioner is a recent migrant from one of the commercial OS's
       and is accustomed to a standard word processor.
     _________________________________________________________________
   
                             Vital For Some...
                                      
   A notion has become prevalent in the minds of many computer users
   these days: the idea that a complex word processor is the only tool
   suitable for creating text on a computer. I've talked with several
   people who think of an editor as a primitive relic of the bad old DOS
   days, a type of software which has been superseded by the modern
   word-processor. There is an element of truth to this, especially in a
   business environment in which even the simplest memos are distributed
   in one of several proprietary word-processor formats. But when it is
   unnecessary to use one of these formats, a good text editor has more
   power to manipulate text and is faster and more responsive.
   
   The ASCII format, intended to be a universal means of representing and
   transferring text, does have several limitations. The fonts used are
   determined by the terminal type and capability rather than by the
   application, normally a fixed, monospace font. These limitations in
   one sense are virtues, though, as this least-common-denominator
   approach to representing text assures readability by everyone on all
   platforms. This is why ASCII is still the core format of e-mail and
   usenet messages, though there is a tendency in the large software
   firms to promote HTML as a replacement. Unfortunately, HTML can now be
   written so that it is essentially unreadable by anything other than a
   modern graphical browser. Of course, HTML is ASCII-based as well, but
   is meant to be interpreted or parsed rather than read directly.
   
   Working with ASCII text directly has many advantages. The output is
   compact and easily stored, and separating the final formatting from
   actual writing allows the writer to focus on content rather than
   appearance. An ASCII document is not dependent on one application; the
   simplest of editors or even cat can access its content. There is an
   interesting parallel, perhaps coincidental, between the Unix use of
   ASCII and other OS's use of binary formats. All configuration files in
   a Linux or any Unix system are generally in plain ASCII format:
   compact,editable, and easily backed-up or transferred. Many
   programmers use Linux; source code is written in ASCII format, so
   perhaps using the format for other forms of text is a natural
   progression. The main configuration files for Win95, NT and OS/2 are
   in binary format, easily corruptible and not easily edited. Perhaps
   this is one reason users of these systems tend towards proprietary
   word-processing formats which, while not necessarily in binary format,
   aren't readable by ASCII-based editors or even other word-processors.
   But I digress...
   
   There are several methods of producing professional-looking printable
   documents from ASCII input, the most popular being LaTeX, Lout, and
   Groff.
     _________________________________________________________________
   
                   Text Formatting with Mark-Up Languages
                                      
                                   LaTeX
                                      
   LaTeX, Leslie Lamport's macro package for the TeX low-level formatting
   system, is widely used in the academic world. It has become a
   standard, and has been refined to the point that bugs are rare. Its
   ability to represent mathematical equations is unparalleled, but this
   very fact has deterred some potential users. Mentioning LaTeX to
   people will often elicit a response such as: "Isn't that mainly used
   by scientists and mathematicians? I have no need to include equations
   in my writing, so why should I use it?" A full-featured word-processor
   (such as WordPerfect) also includes an equation editor, but (as with
   LaTeX) just because a feature exists doesn't mean you have to use it.
   LaTeX is well-suited to creating a wide variety of documents, from a
   simple business letter to articles, reports or full-length books. A
   wealth of documentation is available, including documents bundled with
   the distribution as well as those available on the internet. A good
   source is this ftp site, which is a mirror of CTAN, the largest
   on-line repository of TeX and LaTeX material.
   
   LaTeX is easily installed from any Linux distribution, and in my
   experience works well "out of the box". Hardened LaTeX users type the
   formatting tagging directly, but there are several alternative
   approaches which can expedite the process, especially for novices.
   There is quite a learning curve involved in learning LaTeX from
   scratch, but using an intermediary interface will allow the immediate
   creation of usable documents by a beginner.
   
   AucTeX is a package for either GNU Emacs or XEmacs which has a
   multitude of useful features helpful in writing LaTeX documents. Not
   only does the package provide hot-keys and menu-items for tags and
   environments, but it also allows easy movement through the document.
   You can run LaTeX or TeX interactively from Emacs, and even view the
   resulting output DVI file with xdvi. Emacs provides excellent syntax
   highlighting for LaTeX files, which greatly improves their
   readability. In effect AucTeX turns Emacs into a "front-end" for
   LaTeX. If you don't like the overhead incurred when running Emacs or
   especially XEmacs, John Davis' Jed and Xjed editors have a very
   functional LaTeX/TeX mode which is patterned after AucTeX. The
   console-mode Jed editor does syntax-highlighting of TeX files well
   without extensive fiddling with config files, which is rare in a
   console editor.
   
   If you don't use Emacs or its variants there is a Tcl/Tk based
   front-end for LaTeX available called xtem. It can be set up to use any
   editor; the September 1996 issue of Linux Journal has a good
   introductory article on the package. Xtem has one feature which is
   useful for LaTeX beginners: on-line syntax help-files for the various
   LaTeX commands. The homepage for the package can be visited if you're
   interested.
   
   It is fairly easy to produce documents if the default formats included
   with a TeX installation are used; more knowledge is needed to produce
   customized formats. Luckily TeX has a large base of users, many of
   whom have contributed a variety of style-formatting packages, some of
   which are included in the distribution, while others are freely
   available from TeX archive sites such as CTAN.
   
   At a further remove from raw LaTeX is the LyX document processor. This
   program (still under development, but very usable) at first seems to
   be a WYSIWYG interface for LaTeX, but this isn't quite true. The text
   you type doesn't have visible LaTeX tagging, but it is formatted to
   fit the window on your screen which doesn't necessarily reflect the
   document's appearance when printed or viewed with GV or Ghostscript.
   In other words, the appearance of the text you type is just a user
   convenience. There are several things which can be done with a
   document typed in LyX. You can let LyX handle the entire LaTeX
   conversion process with a DVI or Postscript file as a result, which is
   similar to using a word-processor. I don't like to do it this way; one
   of the reasons I use Linux is because I'm interested in the underlying
   processes and how they work, and Linux is transparent. If I'm curious
   as to how something is happening in a Linux session I can satisfy that
   curiosity to whatever depth I like. Another option LyX offers is more
   to my taste: LyX can convert the document's format from the
   LaTeX-derived internal format to standard LaTeX, which is readable and
   can be loaded into an editor.
   
   Load a LyX-created LaTeX file into an Emacs/Auctex session (if you
   have AucTeX set up right it will be called whenever a file with the
   .tex suffix is loaded), and your document will be displayed with new
   LaTeX tags interspersed throughout the text. The syntax-highlighting
   can make the text easier to read if you have font-locking set up to
   give a subdued color to the tagging (backslashes (\) and $ signs).
   This is an effective way to learn something about how LaTeX documents
   are written. Changes can be made from within the editor and you can
   let AucTeX call the LaTeX program to format the document, or you can
   continue with LyX. In effect this is using LyX as a preprocessor for
   AucTeX. This expands the user's options; if you are having trouble
   convincing LyX to do what you want, perhaps AucTeX can do it more
   easily.
   
   Like many Linux software projects LyX is still in a state of flux. The
   release of beta version 0.12 is imminent; after that release the
   developers are planning to switch to another GUI toolkit (the current
   versions use the XForms toolkit). The 0.11.38 version I've been using
   has been working dependably for me (hint: if it won't compile, give
   the configure script the switch --disable-nls. This disables the
   internationalization support).
     _________________________________________________________________
   
                                    YODL
                                      
   YODL (Yet One-Other Document Language) is another way of interacting
   with LaTeX. This system has a simplified tagging format which isn't
   hard to learn. The advantage of YODL is that from one set of marked-up
   source documents, output can be generated in LaTeX, HTML, and Groff
   man and ms formats. The package is well-documented. I wrote a short
   introduction to YODL in issue #9 of the Gazette. The current source
   for the package is this ftp site.
     _________________________________________________________________
   
                                    Lout
                                      
   About thirteen years ago Jeffrey Kingston (of the University of
   Sydney, Australia) began to develop a document formatting system which
   became known as Lout. This system bears quite a bit of resemblance to
   LaTeX: it uses formatting tags (using the @ symbol rather than \) and
   its output is Postscript. Mr. Kingston calls Lout a high-level
   language with some similarities to Algol, and claims that user
   extensions and modifications are much easier to implement than in
   LaTeX. The package comes with hundreds of pages of Postscript
   documentation along with the Lout source files which were used to
   generate those book-length documents.
   
   The Lout system is still maintained and developed, and in my trials
   seemed to work well, but there are some drawbacks. I'm sure Lout has
   nowhere near as many users as LaTeX. LaTeX is installed on enough
   machines that if you should want to e-mail a TeX file to someone
   (especially someone in academia) chances are that that person will
   have access to a machine with Tex installed and will be able to format
   and print or view it. LaTeX's large user-base also has resulted in a
   multitude of contributed formatting packages.
   
   Another drawback (for me, at least) is the lack of available
   front-ends or editor-macro packages for Lout. I don't mind using
   markup languages if I can use, say, an Emacs mode with key-bindings
   and highlighting set up for the language. There may be such packages
   out there for Lout, but I haven't run across them.
   
   Lout does have the advantage of being much more compact than a typical
   Tex installation. If you have little use for some of the more esoteric
   aspects of LaTeX, Lout might be just the thing. It can include tables,
   various types of lists, graphics, foot- and marginal notes, and
   equations in a document, and the Postscript output is the equal of
   what LaTeX generates.
   
   Both RedHat and Debian have Lout packages available, and the
   source/documentation package is available from the Lout home FTP site.
     _________________________________________________________________
   
                                   Groff
                                      
   Groff is an older system than TeX/LaTeX, dating back to the early days
   of unix. Often a first-time Linux user will neglect to install the
   Groff package, only to find that the man command won't work and that
   the man-pages are therefore inaccessible. As well as in day-to-day
   invocation by the man command, Groff is used in the publishing
   industry to produce books, though other formatting systems such as
   SGML are more common.
   
   Groff is the epitome of the non-user-friendly and cryptic unix
   command-line tool. There are several man-pages covering various of
   Groff's components, but they seem to assume a level of prior knowledge
   without any hint as to where that knowledge might be acquired. I found
   them to be nearly incomprehensible. A search on the internet didn't
   turn up any introductory documents or tutorials, though there may be
   some out there. I suspect more complete documentation might be
   supplied with some of the commercial unix implementations; the
   original and now-proprietary version is called troff, and a later
   version is nroff; Groff is short for GNU roff.
   
   Groff can generate Postscript, DVI, HP LaserJet4, and ASCII text
   formats.
   
   Learning to use Groff on a Linux system might be an uphill battle,
   though Linux software developers must have learned enough of it at one
   time or other, as most programs come with Groff-tagged man-page files.
   Groff's apparent opacity and difficulty make LaTeX look easy in
   contrast!
     _________________________________________________________________
   
                            A Change in Mind-Set
                                      
   Processing text with a mark-up language requires a different mode of
   thought concerning documents. On the one hand, writing blocks of ASCII
   is convenient and no thought needs to be given to the marking-up
   process until the end. A good editor provides so many features to deal
   with text that using any word-processor afterwards can feel
   constrictive. Many users, though, are attracted by the integration of
   functions in a word processor, using one application to produce a
   document without intermediary steps.
   
   Though there are projects underway (such as Wurd) which may eventually
   result in a native Linux word-processor, there may be a reason why
   this type of application is still rare in the Linux world. Adapting
   oneself to Linux, or any unix-variant, is an adaptation to what has
   been called "the Unix philosophy", the practice of using several
   highly-refined and specific tools to accomplish a task, rather than
   one tool which tries to do it all. I get the impression that
   programmers attracted to free software projects prefer working on
   smaller specialized programs. As an example look at the plethora of
   mail- and news-readers available compared to the dearth of all-in-one
   internet applications. Linux itself is really just the kernel, which
   has attracted to itself all of the GNU and other software commonly
   distributed with it in the form of a distribution.
   
   Christopher B. Browne has written an essay titled An Opinionated Rant
   About Word-Processors which deals with some of the issues discussed in
   this article; it's available at this site.
   
   The StarOffice suite is an interesting case, one of the few instances
   of a large software firm (StarDivision) releasing a Linux version of
   an office productivity suite. The package has been available for some
   time now, first in several time-limited beta versions and now in a
   freely available release. It's a large download but it's also
   available on CDROM from Caldera. You would think that users would be
   flocking to it if the demand is really that high for such an
   application suite for Linux. Judging by the relatively sparse usenet
   postings I've seen, StarOffice hasn't exactly swept the Linux world by
   storm. I can think of a few possible reasons:
     * Many hard-core Linux users aren't working in a corporate office
       setting in which such a product would be valuable; they are
       scientists, engineers or academics who are perfectly happy with
       LaTeX, Lout, Groff, et al.
     * Then there are the users who have dual or multiple-boot set-ups;
       if they need to use MS Word they just boot from their Win95 or NT
       partitions.
     * Another group of users run Linux at home and whatever OS their job
       requires at work.
     * StarOffice is written with a cross-platform development tool-kit;
       this may be responsible for its bulk and lack of speed.
     _________________________________________________________________
   
   I remember the first time I started up the StarOffice word-processor.
   It was slow to load on a Pentium 120 with 32 mb. of RAM (and I thought
   XEmacs was slow!), and once the main window appeared it occurred to me
   that it just didn't look "at home" on a Linux desktop. All those icons
   and button-bars! It seemed to work well, but with the lack of English
   documentation (and not being able to convince it to print anything!) I
   eventually lost interest in using it. I realized that I prefer my
   familiar editors, and learning a little LaTeX seemed to be easier than
   trying to puzzle out the workings of an undocumented suite of
   programs. This may sound pretty negative, and I don't wish to
   denigrate the efforts of the StarDivision team responsible for the
   Linux porting project. If you're a StarOffice user happy with the
   suite (especially if you speak German and therefore can read the docs)
   and would like to present a dissenting view, write a piece on it for
   the Gazette!
   
   Two other commercial word-processors for Linux are Applix and
   WordPerfect. Applix, available from RedHat, has received favorable
   reviews from many Linux users.
   
   A company called SDCorp in Utah has ported Corel's WordPerfect 7 to
   Linux, and a (huge!) demo is available now from both the SDCorp ftp
   site and Corel's. Unfortunately both FTP servers are unable to resume
   interrupted downloads (usually indicating an NT server) so the CDROM
   version, available from the SDCorp website, is probably the way to go,
   if you'd like to try it out. The demo can be transformed into a
   registered program by paying for it, in which case a key is e-mailed
   to you which registers the program, but only for the machine it is
   installed on.
   
   Addendum: I recently had an exchange of e-mail with Brad Caldwell,
   product manager for the SDCorp WordPerfect port. I complained about
   the difficulty of downloading the 36 mb. demo, and a couple of days
   later I was informed that the file has been split into nine parts, and
   that they were investigating the possibility of changing to an FTP
   server which supports interrupted downloads. The smaller files are
   available from this web page.
     _________________________________________________________________
   
   There exists a curious dichotomous attitude these days in the Linux
   community. I assume most people involved with Linux would like the
   operating system to gain more users and perhaps move a little closer
   to the mainstream. Linux advocates bemoan the relative lack of
   "productivity apps" for Linux, which would make the OS more acceptable
   in corporate or business environments. But how many of these advocates
   would use the applications if they were more common? Often the change
   of mindset discussed above mitigates against acceptance of
   Windows-like programs, with no source code available and limited
   access to the developers. Linux has strong roots in the GNU and free
   software movements (not always synonymous) and this background might
   be a barrier towards development of a thriving commercial software
   market.
     _________________________________________________________________
   
                       Copyright © 1997, Larry Ayers
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                               GNU Emacs 20.1
                                      
                               by Larry Ayers
     _________________________________________________________________
   
                                Introduction
                                      
   Richard Stallman and the other members of the GNU Emacs development
   team are a rather reticent group of programmers. Unlike many other
   development projects in the free-software world, the Emacs beta
   program is restricted to a closed group of testers, and news of what
   progress is being made is scanty. In the past couple of months hints
   found in various usenet postings seemed to intimate that a new release
   of GNU Emacs was imminent, so every now and then I began to check the
   GNU main FTP site on the off-chance that a release had been made.
   
   Early on the morning of September 17 I made a quick check before
   beginning my day's work, and there it was, a new Emacs 20.1 source
   archive. As with all Emacs source packages, it was large (over 13
   megabytes) so I began the download with NcFtp and left it running.
   
                                Building It
                                      
   There is always a delay between the release of a new version of a
   software package and the release of a Linux distribution's version,
   such as a Debian or RedHat binary package. Even if you usually use
   RPMs or *.deb releases (in many cases it's preferable) a source
   release of a major team-developed piece of software such as GNU Emacs
   will usually build easily on a reasonably up-to-date Linux machine.
   The included installation instructions are clear: just run the
   configure script, giving your machine-type and preferred installation
   directory as switches. In my case, this command did the trick:
   
   ./configure i586-Debian-linux-gnu --prefix=/mt
   
   The script will generate a Makefile tailored to your machine; make,
   followed by make install and you're up and running.
     _________________________________________________________________
   
                               So What's New?
                                      
   It's been about a year since the last public GNU Emacs release, so
   there have been quite a few changes. One of the largest is the
   incorporation of the MULE (MUltiLingual Emacs) extensions, which give
   Emacs the capability of displaying extended character sets necessary
   for languages such as Chinese and Japanese. This won't be of interest
   to most English-speaking users, but if you're interested the necessary
   files are in a separate archive at the GNU site.
   
   Here's a partial list of changes and updated packages:
     * For some reason, the scroll-bar is now on the left, but it can be
       changed back to its old position on the right with the new
       Customize facility. Some day it would be nice if someone
       implemented a real scrollbar for GNU Emacs, with the usual buttons
       or arrows at top and bottom which allow smooth scrolling rather
       than paging, but it seems this is a low priority for the
       developers.
     * Per Abrahamsen's Customize package is now thoroughly integrated
       with the majority of the included LISP packages, allowing easy
       customization of all sorts of options, with the results appended
       to your ~.emacs file. This so much easier than hacking on the
       .emacs file; I don't know how many times I've had a misplaced or
       unbalanced parentheses, causing Emacs to quit loading the file and
       giving me the dread message: Error in init file.
     * Viper, CC-Mode, the GNUS newsreader, and many other extension
       packages have been updated.
     * The default values for many configuration parameters have been
       changed to values more likely to be acceptable to most users, the
       sort of thing which would be entered in an ~/.emacs file.
     * The syntax-highlighting color default values are now sensitive to
       whether you have a dark or light screen background; for the most
       part the dark-background default colors are readable, with enough
       contrast.
     * The text-filling commands now handle indented and bulleted
       paragraphs more effectively.
     * The word Emacs no longer is shown in the mode-line, allowing more
       room for line and column numbers, mode specifications, time of
       day, etc.
     * For programmers, there are new commands for looking up symbols or
       files in the Info documentation files. As an example, in C mode
       the GNU libc Info files would be searched for a reference to the
       symbol or file at the cursor position in the current buffer.
     * Another programmer's feature: Alt-tab (with a numeric argument)
       will now perform completion on a symbol name in the current
       buffer, using Info files as above.
     * The main /lisp directory has been subdivided into several
       sub-directories, which makes individual files much easier to find.
       
   Have you ever been puzzled or annoyed by the peculiar way the Emacs
   screen scrolls when using the up- or down- arrow keys? It's a jerky
   scroll, difficult for the eye to follow, which could only be partially
   alleviated by setting scroll-step to a small value. In 20.1 this has
   been changed, so that if you set scroll-step to 2 (setq scroll-step 2)
   the screen actually scrolls up and down smoothly, without the
   disorienting jerks. This feature alone makes the upgrade worthwhile!
   
   Another Emacs quirk has been addressed with a new variable,
   scroll-preserve-screen-position. This variable, if set to t (which
   means "yes"), will allow the user to page-up and page-down and then
   returns the cursor to its original position when the starting page is
   shown again. I really like this. With the default behavior you have to
   find the cursor on the screen and manually move it back to where it
   was. This variable can be enabled with the line
   
   (setq scroll-preserve-screen-position t)
   
   entered into your ~.emacs init file.
     _________________________________________________________________
   
                         The Customization Utility
                                      
   What a labor-saver! Rather than searching for the documentation which
   deals with altering one of Emacs' default settings, the user is
   presented with a mouse-enabled screen from which changes can be made,
   either for the current session or permanently, in which case the
   changes are recorded in the user's ~.emacs file. It appears that a
   tremendous amount of work went into including the customization
   framework in the LISP files for Emacs' countless modes and add-on
   packages. A Customize screen can be summoned from the Help menu; the
   entries are in a cascading hierarchy, allowing an easy choice of the
   precise category a user might want to tweak. Here's a screenshot of a
   typical Customization screen:
   
   Customizing screen
     _________________________________________________________________
   
   Per Abrahamsen is to be congratulated for writing this useful utility,
   and for making it effective both for XEmacs and GNU Emacs users.
     _________________________________________________________________
   
                                  Musings
                                      
   Emacs used to be thought of as a hefty, memory-intensive editor which
   tended to strain a computer's resources. Remember the old
   mock-acronym, Eight Megabytes And Constantly Swapping? These days it
   seems that the hardware has caught up with Emacs; today a mid-range
   machine can run Emacs easily, even with other applications running
   concurrently. Memory and hard-disk storage have become less expensive
   which makes Emacs usable for more people.
   
   Some people are put off by the multiple keystrokes for even the most
   common commands. It's easy to rebind the keys, though. The function
   keys are handy, as they aren't in use by other Emacs commands. As
   examples, I have F1 bound to Kill-Buffer, F2 bound to Ispell-Word
   (which checks the spelling of the word under the cursor), F3 and F4
   put the cursor at the beginning or end of the current file, and F7 is
   bound to Save-Buffer. Of course, these operations are on the menu-bar,
   but using the keyboard is quicker. If you are accustomed to a Vi-style
   editor, the Viper package allows toggling between the familiar Vi
   commands (which are extraordinarily quick, as most are a single
   keystroke) and the Emacs command set. This emulation mode has been
   extensively improved lately, and is well worth using.
   
   Even with the exhaustively detailed Info files, the tutorial, etc. I
   would hesitate to recommend Emacs for a novice Linux user. There is
   enough to learn just becoming familiar with basic Linux commands
   without having to learn Emacs as well. I think Nedit would be a more
   appropriate choice for a new user familiar with Windows, OS/2, or the
   Macintosh, since its mouse-based operation and menu structure are
   reminiscent of editors from these operating systems.
   
   Emacs has a way of growing on you; as your knowledge of its traits and
   capabilities increases the editor gradually is molded to your
   preferences and work habits. It is possible to use the editor at a
   basic level, (using just the essential commands), but it's a waste to
   run a large editor like Emacs without using at least some of its
   manifold capabilities.
     _________________________________________________________________
   
                       Copyright © 1997, Larry Ayers
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                        A True "Notebook" Computer?
                                      
                               by Larry Ayers
     _________________________________________________________________
   
                                Introduction
                                      
   Recently I happened across an ingeniously designed add-on LISP package
   for the GNU Emacs editor. It's called Notes-Mode, and it helps
   organize and cross-reference notes by subject and date. It was written
   by John Heidemann. Here's his account of how he happened to write the
   package:
   
     Briefly, I started keeping notes on-line shortly after I got a
     portable computer in January, 1994. After a month-and-a-half of
     notes, I realized that one does not live by grep alone, so I
     started adding indexing facilities. In June of 1995 some other
     Ficus-project members started keeping and indexing on-line notes
     using other home-grown systems. After some discussion, we
     generalized my notes-mode work and they started using it. Over the
     next 18 months notes-mode grew. Finally, in April, 1996 I wrote
     documentation, guaranteeing that innovation on notes-mode will now
     cease or the documentation will become out of date.
     _________________________________________________________________
   
                              Using Notes-Mode
                                      
   Here's what one of my smaller notes files looks like:
     _________________________________________________________________
   
25-Jul-97 Friday
----------------

* Today
-------
prev: <file:///~/notes/199707/970724#* Today>
next: <file:///~/notes/199707/970728#* Today>

* Prairie Plants
----------------
prev: <file:///~/notes/199707/970724#* Prairie Plants>
next: <none>

   So far the only results I've seen in response to the various desultory
   efforts I've made to direct-seed prairie plants in the west prairie:
   1: Several rattlesnake-master plants in a spot where we burned a
   brush-pile. Two are blooming this summer. 2: One new-england aster
   near the above. There are probably others which are small and haven't
   flowered yet. * Linux Notes ------------- prev:
   <file:///~/notes/199707/970724#* Linux Notes> next:
   <file:///~/notes/199708/970804#* Linux Notes> I noticed today that a
   new version of e2compress was available, and I've patched the 2.0.30
   kernel source but haven't compiled it yet. I've been experimenting
   with the color-syntax-highlighting version of nedit 4.03 lately; it
   has a nifty dialog-box interface for creating and modifying modes.
   Easier than LISP!
     _________________________________________________________________
   
   The first entry,Today, contains nothing; it just serves as a link to
   move from the current notes file to either the previous day's file or
   the next day's. Any other word preceded by an asterisk and a space
   will serve as a hyper-link to previous or next entries with the same
   subject. Type in a new (or previously-used) subject with the asterisk
   and space, press enter, and the dashed line and space will
   automatically be entered into the file; this format is what the Perl
   indexing script uses to identify discrete entries.
   
   While in Emacs with a notes-mode file loaded, several keyboard
   commands allow you to navigate between successive entries, either by
   day or by subject, depending on where the cursor is when the keystroke
   is executed. A handy key-binding for notes-mode is Control-c n, which
   will initialize a new notes file for the day if the following LISP
   code is entered into your ~.emacs file:
   (define-key global-map "^Cn" 'notes-index-todays-link). The "^C" part
   is entered into the file by entering Control-q Control-c.
   
   When Notes-Mode is installed a subdirectory is created in your home
   directory called Notes. As you use the mode a subdirectory for each
   month is created as well as a subdirectory under each month's
   directory for each week in the month. The individual note files, one
   for each day the mode is used, are given numerical names; the format
   of the path and filename can be seen in the above example.
   
   The ability to navigate among your notes is enabled by means of a Perl
   script called mkall, which is intended to be run daily by cron. Mkall
   in turn calls other Perl scripts which update the index file with
   entries for any new notes you may have made. This system works well,
   making good use of Linux's automation facilities. Once you have it set
   up you never have to think about it again.
   
   While this mode is designed for an academic environment in which
   voluminous notes are taken on a variety of subjects, it can also be
   useful for anyone who wants to keep track of on-line notes. It could
   even be used as a means of organizing diary or journal entries. The
   only disadvantage I've seen is that, though the notes-files are ASCII
   text readable by any editor, the navigation and hyper-linking features
   are only available from within Emacs. This is fine if you use Emacs as
   your main editor but makes the package not too useful for anyone else.
   XEmacs users are out of luck as well, as the package doesn't work
   "out-of-the-box" with XEmacs. I imagine a skilled LISP hacker could
   modify Notes-Mode for XEmacs; I've made some tentative attempts but
   without success.
   
                                Availability
                                      
   The only source I've seen for this package is from the author's web
   page, at this URL:
   http://gost.isi.edu/~johnh/SOFTWARE/NOTES_MODE/index.html
   
   The documentation for Notes-Mode can be browsed on-line at this site
   if you'd like to read more before trying it out.
     _________________________________________________________________
   
                       Copyright © 1997, Larry Ayers
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                          Using m4 to write HTML.
                                      
                    By Bob Hepple bhepple@pacific.net.sg
     _________________________________________________________________
   
    Contents:
    
     * 1. Some limitations of HTML
     * 2. Using m4
     * 3. Examples of m4 macros
     * 3.1 Sharing HTML elements across several page
     * 3.2 Managing HTML elements that often change
     * 3.3 Creating new text styles
     * 3.4 Typing and mnemonic aids
     * 3.5 Automatic numbering
     * 3.6 Automatic date stamping
     * 3.7 Generating Tables of Contents
     * 3.7.1 Simple to understand TOC
     * 3.7.2 Simple to use TOC
     * 3.8 Simple tables
     * 4. m4 gotchas
     * 4.1 Gotcha 1 - quotes
     * 4.2 Gotcha 2 - Word swallowing
     * 4.3 Gotcha 3 - Comments
     * 4.4 Gotcha 4 - Debugging
     * 5. Conclusion
     * 6. Files to download
     _________________________________________________________________
   
           This page last updated on Thu Sep 18 22:46:54 HKT 1997
                              $Revision: 1.4 $
     _________________________________________________________________
   
1. Some limitations of HTML

   It's amazing how easy it is to write simple HTML pages - and the
   availability of WYSIWYG HTML editors like NETSCAPE GOLD lulls one into
   a mood of "don't worry, be happy". However, managing multiple,
   interrelated pages of HTML rapidly gets very, very difficult. I
   recently had a slightly complex set of pages to put together and it
   started me thinking - "there has to be an easier way".
   
   I immediately turned to the WWW and looked up all sorts of tools - but
   quite honestly I was rather disappointed. Mostly, they were what I
   would call Typing Aids - instead of having to remember arcane
   incantations like <a href="link">text</a>, you are given a button or a
   magic keychord like ALT-CTRL-j which remembers the syntax and does all
   that nasty typing for you.
   
   Linux to the rescue! HTML is built as ordinary text files and
   therefore the normal Linux text management tools can be used. This
   includes the revision control tools such as RCS and the text
   manipulation tools like awk, perl, etc. These offer significant help
   in version control and managing development by multiple users as well
   as in automating the process of extracting from a database and
   displaying the results (the classic "grep |sort |awk" pipeline).
   
   The use of these tools with HTML is documented elsewhere, e.g. see Jim
   Weinrich's article in Linux Journal Issue 36, April 1997, "Using Perl
   to Check Web Links" which I'd highly recommend as yet another way to
   really flex those Linux muscles when writing HTML.
   
   What I will cover here is a little work I've done recently with using
   m4 in maintaining HTML. The ideas can probably be extended to the more
   general SGML case very easily.
   
   Contents
   
2. Using m4

   I decided to use m4 after looking at various other pre-processors
   including cpp, the C front-end. While cpp is perhaps a little too
   C-specific to be very useful with HTML, m4 is a very generic and clean
   macro expansion program - and it's available under most Unices
   including Linux.
   
   Instead of editing *.html files, I create *.m4 files with my favourite
   text editor. These look something like this:
   
m4_include(stdlib.m4)
_HEADER(`This is my header')
<P>This is some plain text<P>
_HEAD1(`This is a main heading')
<P>This is some more plain text<P>
_TRAILER

   The format is simple - just HTML code but you can now include files
   and add macros rather like in C. I use a convention that my new macros
   are in capitals and start with "_" to make them stand out from HTML
   language and to avoid name-space collisions.
   
   The m4 file is then processed as follows to create an .html file e.g.
   
m4 -P <file.m4 >file.html

   This is especially easy if you create a "makefile" to automate this in
   the usual way. Something like:
   
.SUFFIXES: .m4 .html
.m4.html:
        m4 -P $*.m4 >$*.html
default: index.html
*.html: stdlib.m4
all: default PROJECT1 PROJECT2
PROJECT1:
        (cd project2; make all)
PROJECT2:
        (cd project2; make all)

   The most useful commands in m4 include the following which are very
   similar to the cpp equivalents (shown in brackets):
   
   m4_include:
          includes a common file into your HTML (#include)
          
   m4_define:
          defines an m4 variable (#define)
          
   m4_ifdef:
          a conditional (#ifdef)
          
   Some other commands which are useful are:
   
   m4_changecom:
          change the m4 comment character (normally #)
          
   m4_debugmode:
          control error disgnostics
          
   m4_traceon/off:
          turn tracing on and off
          
   m4_dnl:
          comment
          
   m4_incr, m4_decr:
          simple arithmetic
          
   m4_eval:
          more general arithmetic
          
   m4_esyscmd:
          execute a Linux command and use the output
          
   m4_divert(i):
          This is a little complicated, so skip on first reading. It is a
          way of storing text for output at the end of normal processing
          - it will come in useful later, when we get to automatic
          numbering of headings. It sends output from m4 to a temporary
          file number i. At the end of processing, any text which was
          diverted is then output, in the order of the file number i.
          File number -1 is the bit bucket and can be used to comment out
          chunks of comments. File number 0 is the normal output stream.
          Thus, for example, you can `m4_divert' text to file 1 and it
          will only be output at the end.
          
   Contents
   
3. Examples of m4 macros

3.1 Sharing HTML elements across several page

   In many "nests" of HTML pages, each page shares elements such as a
   button bar like this:
   
     [Home] [Next] [Prev] [Index]
     
   This is fairly easy to create in each page - the trouble is that if
   you make a change in the "standard" button-bar then you then have the
   tedious job of finding each occurance of it in every file and then
   manually make the changes.
   
   With m4 we can more easily do this by putting the shared elements into
   an m4_include statement, just like C.
   
   While I'm at it, I might as well also automate the naming of pages,
   perhaps by putting the following into an include file, say
   "button_bar.m4":
   
m4_define(`_BUTTON_BAR',
        <a href="homepage.html">[Home]</a>
        <a href="$1">[Next]</a>
        <a href="$2">[Prev]</a>
        <a href="indexpage.html">[Index]</a>)

   and then in the document itself:
   
m4_include button_bar.m4
_BUTTON_BAR(`page_after_this.html',
        `page_before_this.html')

   The $1 and $2 parameters in the macro definition are replaced by the
   strings in the macro call.
   
   Contents
   
3.2 Managing HTML elements that often change

   It is very troublesome to have items change in multiple HTML pages.
   For example, if your email address changes then you will need to
   change all references to the new address. Instead, with m4 you can do
   something like this in your stdlib.m4 file:
   
m4_define(`_EMAIL_ADDRESS', `MyName@foo.bar.com')

   and then just put _EMAIL_ADDRESS in your m4 files.
   
   A more substantial example comes from building strings up with
   multiple components, any of which may change as the page is developed.
   If, like me, you develop on one machine, test out the page and then
   upload to another machine with a totally different address then you
   could use the m4_ifdef command in your stdlib.m4 file (just like the
   #ifdef command in cpp):
   
m4_define(`_LOCAL')
.
.
m4_define(`_HOMEPAGE',
        m4_ifdef(`_LOCAL', `//127.0.0.1/~YourAccount',
                `http://ISP.com/~YourAccount'))

m4_define(`_PLUG', `<A REF="http://www.ssc.com/linux/">
        <IMG SRC="_HOMEPAGE/gif/powered.gif"
        ALT="[Linux Information]"> </A>')

   Note the careful use of quotes to prevent the variable _LOCAL from
   being expanded. _HOMEPAGE takes on different values according to
   whether the variable _LOCAL is defined or not. This can then ripple
   through the entire project as you make the pages.
   
   In this example, _PLUG is a macro to advertise Linux. When you are
   testing your pages, you use the local version of _HOMEPAGE. When you
   are ready to upload, you can remove or comment out the _LOCAL
   definition like this:
   
m4_dnl m4_define(`_LOCAL')

   ... and then re-make.
   
   Contents
   
3.3 Creating new text styles

   Styles built into HTML include things like <EM> for emphasis and
   <CITE> for citations. With m4 you can define your own, new styles like
   this:
   
m4_define(`_MYQUOTE',
        <BLOCKQUOTE><EM>$1</EM></BLOCKQUOTE>)

   If, later, you decide you prefer <STRONG> instead of <EM> it is a
   simple matter to change the definition and then every _MYQUOTE
   paragraph falls into line with a quick make.
   
   The classic guides to good HTML writing say things like "It is
   strongly recommended that you employ the logical styles such as
   <EM>...</EM> rather than the physical styles such as <I>...</I> in
   your documents." Curiously, the WYSIWYG editors for HTML generate
   purely physical styles. Using these m4 styles may be a good way to
   keep on using logical styles.
   
   Contents
   
3.4 Typing and mnemonic aids

   I don't depend on WYSIWYG editing (having been brought up on troff)
   but all the same I'm not averse to using help where it's available.
   There is a choice (and maybe it's a fine line) to be made between:
   
<BLOCKQUOTE><PRE><CODE>Some code you want to display.
</CODE></PRE></BLOCKQUOTE>

   and:
   
_CODE(Some code you want to display.)

   In this case, you would define _CODE like this:
   
m4_define(`_CODE',
         <BLOCKQUOTE><PRE><CODE>$1</CODE></PRE></BLOCKQUOTE>)

   Which version you prefer is a matter of taste and convenience although
   the m4 macro certainly saves some typing and ensures that HTML codes
   are not interleaved. Another example I like to use (I can never
   remember the syntax for links) is:
   
m4_define(`_LINK', <a href="$1">$2</a>)

   Then,
   
   <a href="URL_TO_SOMEWHERE">Click here to get to SOMEWHERE </a>
   
   becomes:
   
   _LINK(`URL_TO_SOMEWHERE', `Click here to get to SOMEWHERE')
   
   Contents
   
3.5 Automatic numbering

   m4 has a simple arithmetic facility with two operators m4_incr and
   m4_decr which act as you might expect - this can be used to create
   automatic numbering, perhaps for headings, e.g.:
   
m4_define(_CARDINAL,0)

m4_define(_H, `m4_define(`_CARDINAL',
        m4_incr(_CARDINAL))<H2>_CARDINAL.0 $1</H2>')

_H(First Heading)
_H(Second Heading)

   This produces:
   
<H2>1.0 First Heading</H2>
<H2>2.0 Second Heading</H2>

   Contents
   
3.6 Automatic date stamping

   For simple, datestamping of HTML pages I use the m4_esyscmd command to
   maintain an automatic timestamp on every page:
   
This page was updated on m4_esyscmd(date)

   which produces:
   
   This page was last updated on Fri May 9 10:35:03 HKT 1997
   
   Of course, you could also use the date, revision and other facilities
   of revision control systems like RCS or SCCS, e.g. $Date$.
   
   Contents
   
3.7 Generating Tables of Contents

   Using m4 allows you to define commonly repeated phrases and use them
   consistently - I hate repeating myself because I am lazy and because I
   make mistakes, so I find this feature absolutely key.
   
   A good example of the power of m4 is in building a table of contents
   in a big page (like this one). This involves repeating the heading
   title in the table of contents and then in the text itself. This is
   tedious and error-prone especially when you change the titles. There
   are specialised tools for generating tables of contents from HTML
   pages but the simple facility provided by m4 is irresistable to me.
   
3.7.1 Simple to understand TOC

   The following example is a fairly simple-minded Table of Contents
   generator. First, create some useful macros in stdlib.m4:
   
m4_define(`_LINK_TO_LABEL', <A HREF="#$1">$1</A>)
m4_define(`_SECTION_HEADER', <A NAME="$1"><H2>$1</H2></A>)

   Then define all the section headings in a table at the start of the
   page body:
   
m4_define(`_DIFFICULTIES', `The difficulties of HTML')
m4_define(`_USING_M4', `Using <EM>m4</EM>')
m4_define(`_SHARING', `Sharing HTML Elements Across Several Pages')

   Then build the table:
   
<UL><P>
        <LI> _LINK_TO_LABEL(_DIFFICULTIES)
        <LI> _LINK_TO_LABEL(_USING_M4)
        <LI> _LINK_TO_LABEL(_SHARING)
<UL>

   Finally, write the text:
   
.
.
_SECTION_HEADER(_DIFFICULTIES)
.
.

   The advantages of this approach are that if you change your headings
   you only need to change them in one place and the table of contents is
   automatically regenerated; also the links are guaranteed to work.
   
   Hopefully, that simple version was fairly easy to understand.
   
   Contents
   
3.7.2 Simple to use TOC

   The Table of Contents generator that I normally use is a bit more
   complex and will require a little more study, but is much easier to
   use. It not only builds the Table, but it also automatically numbers
   the headings on the fly - up to 4 levels of numbering (e.g. section
   3.2.1.3 - although this can be easily extended). It is very simple to
   use as follows:
   
    1. Where you want the table to appear, call Start_TOC
    2. at every heading use _H1(`Heading for level 1') or _H2(`Heading
       for level 2') as appropriate.
    3. After the very last HTML code (probably after </HTML>), call
       End_TOC
    4. and that's all!
       
   The code for these macros is a little complex, so hold your breath:
   
m4_define(_Start_TOC,`<UL><P>m4_divert(-1)
  m4_define(`_H1_num',0)
  m4_define(`_H2_num',0)
  m4_define(`_H3_num',0)
  m4_define(`_H4_num',0)
  m4_divert(1)')

m4_define(_H1, `m4_divert(-1)
  m4_define(`_H1_num',m4_incr(_H1_num))
  m4_define(`_H2_num',0)
  m4_define(`_H3_num',0)
  m4_define(`_H4_num',0)
  m4_define(`_TOC_label',`_H1_num. $1')
  m4_divert(0)<LI><A HREF="#_TOC_label">_TOC_label</A>
  m4_divert(1)<A NAME="_TOC_label">
        <H2>_TOC_label</H2></A>')
.
.
[definitions for _H2, _H3 and _H4 are similar and are
in the downloadable version of stdlib.m4]
.
.

m4_define(_End_TOC,`m4_divert(0)</UL><P>')

   One restriction is that you should not use diversions within your
   text, unless you preserve the diversion to file 1 used by this TOC
   generator.
   
   Contents
   
3.8 Simple tables

   Other than Tables of Contents, many browsers support tabular
   information. Here are some funky macros as a short cut to producing
   these tables. First, an example of their use:
   
<CENTER>
_Start_Table(BORDER=5)
_Table_Hdr(,Apples, Oranges, Lemons)
_Table_Row(England,100,250,300)
_Table_Row(France,200,500,100)
_Table_Row(Germany,500,50,90)
_Table_Row(Spain,,23,2444)
_Table_Row(Denmark,,,20)
_End_Table
</CENTER>

                           Apples Oranges Lemons
                            England 100 250 300
                             France 200 500 100
                             Germany 500 50 90
                               Spain 23 2444
                                 Denmark 20
                                      
   ...and now the code. Note that this example utilises m4's ability to
   recurse:
   
m4_dnl _Start_Table(Columns,TABLE parameters)
m4_dnl defaults are BORDER=1 CELLPADDING="1" CELLSPACING="1"
m4_dnl WIDTH="n" pixels or "n%" of screen width
m4_define(_Start_Table,`<TABLE $1>')

m4_define(`_Table_Hdr_Item', `<th>$1</th>
  m4_ifelse($#,1,,`_Table_Hdr_Item(m4_shift($@))')')

m4_define(`_Table_Row_Item', `<td>$1</td>
  m4_ifelse($#,1,,`_Table_Row_Item(m4_shift($@))')')

m4_define(`_Table_Hdr',`<tr>_Table_Hdr_Item($@)</tr>')
m4_define(`_Table_Row',`<tr>_Table_Row_Item($@)</tr>')

m4_define(`_End_Table',</TABLE>)

   Contents
   
4. m4 gotchas

   Unfortunately, m4 is not unremitting sweetness and light - it needs
   some taming and a little time spent on familiarisation will pay
   dividends. Definitive documentation is available (for example in
   emacs' info documentation system) but, without being a complete
   tutorial, here are a few tips based on my fiddling about with the
   thing.
   
4.1 Gotcha 1 - quotes

   m4's quotation characters are the grave accent ` which starts the
   quote, and the acute accent ' which ends it. It may help to put all
   arguments to macros in quotes, e.g.
   
_HEAD1(`This is a heading')

   The main reason for this is in case there are commas in an argument to
   a macro - m4 uses commas to separate macro parameters, e.g. _CODE(foo,
   bar) would print the foo but not the bar. _CODE(`foo, bar') works
   properly.
   
   This becomes a little complicated when you nest macro calls as in the
   m4 source code for the examples in this paper - but that is rather an
   extreme case and normally you would not have to stoop to that level.
   
   Contents
   
4.2 Gotcha 2 - Word swallowing

   The worst problem with m4 is that some versions of it "swallow" key
   words that it recognises, such as "include", "format", "divert",
   "file", "gnu", "line", "regexp", "shift", "unix", "builtin" and
   "define". You can protect these words by putting them in m4 quotes,
   for example:
   
Smart people `include' Linux in their list
of computer essentials.

   The trouble is, this is a royal pain to do - and you're likely to
   forget which words need protecting.
   
   Another, safer way to protect keywords (my preference) is to invoke m4
   with the -P or --prefix-builtins option. Then, all builtin macro names
   are modified so they all start with the prefix m4_ and ordinary words
   are left alone. For example, using this option, one should write
   m4_define instead of define (as shown in the examples in this
   article).
   
   The only trouble is that not all versions of m4 support this option -
   notably some PC versions under M$-DOS. Maybe that's just another
   reason to steer clear of hack code on M$-DOS and stay with Linux!
   
   Contents
   
4.3 Gotcha 3 - Comments

   Comments in m4 are introduced with the # character - everything from
   the # to the end of the line is ignored by m4 and simply passed
   unchanged to the output. If you want to use # in the HTML page then
   you would need to quote it like this - `#'. Another option (my
   preference) is to change the m4 comment character to something exotic
   like this: m4_changecom(`[[[[') and not have to worry about `#'
   symbols in your text.
   
   If you want to use comments in the m4 file which do not appear in the
   final HTML file, then the macro m4_dnl (dnl = Delete to New Line) is
   for you. This suppresses everything until the next newline.
   
m4_define(_NEWMACRO, `foo bar') m4_dnl This is a comment

   Yet another way to have source code ignored is the m4_divert command.
   The main purpose of m4_divert is to save text in a temporary buffer
   for inclusion in the file later on - for example, in building a table
   of contents or index. However, if you divert to "-1" it just goes to
   limbo-land. This is useful for getting rid of the whitespace generated
   by the m4_define command, e.g.:
   
m4_divert(-1) diversion on
m4_define(this ...)
m4_define(that ...)
m4_divert       diversion turned off

   Contents
   
4.4 Gotcha 4 - Debugging

   Another tip for when things go wrong is to increase the amount of
   error diagnostics that m4 emits. The easiest way to do this is to add
   the following to your m4 file as debugging commands:
   
m4_debugmode(e)
m4_traceon
.
.
buggy lines
.
.
m4_traceoff

   Contents
   
5. Conclusion

   "ah ha!", I hear you say. "HTML 3.0 already has an include statement".
   Yes it has, and it looks like this:
   
<!--#include file="junk.html" -->

   The problem is that:
     * The work of including and interpreting the include is done on the
       server-side before downloading and adds a big overhead as the
       server has to scan files for `include' statements.
     * Consequently most servers (especially public ISP's) deactivate
       this feature.
     * `include' is all you get - no macro substitution, no parameters to
       macros, no ifdef, etc, etc.
       
   There are several other features of m4 that I have not yet exploited
   in my HTML ramblings so far, such as regular expressions and doubtless
   many others. It might be interesting to create a "standard" stdlib.m4
   for general use with nice macros for general text processing and HTML
   functions. By all means download my version of stdlib.m4 as a base for
   your own hacking. I would be interested in hearing of useful macros
   and if there is enough interest, maybe a Mini-HOWTO could evolve from
   this paper.
   
   There are many additional advantages in using Linux to develop HTML
   pages, far beyond the simple assistance given by the typical Typing
   Aids and WYSIWYG tools.
   
   Certainly, this little hacker will go on using m4 until HTML catches
   up - I will then do my last make and drop back to using pure HTML.
   
   I hope you enjoy these little tricks and encourage you to contribute
   your own. Happy hacking!
   
6. Files to download

   You can get the HTML and the m4 source code for this article here (for
   the sake of completeness, they're copylefted under GPL 2):
   
using_m4.html   :this file
using_m4.m4     :m4 source
stdlib.m4       :Include file
makefile

   Contents
     _________________________________________________________________
   
                        Copyright © 1997, Bob Hepple
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
             An introduction to The Connecticut Free Unix Group
                                      
                by Lou Rinaldi lou@cfug.org, CFUG Co-Founder
     _________________________________________________________________
   
   October of 1996 was when Nate Smith and I first began discussing the
   creation of a local-area unix users' group here in Connecticut,
   something we felt the area was desperately in need of. We bantered
   around some initial ideas; some great, some not so great. Finally we
   decided on creating a group whose focus was on the "free unix"
   community. CFUG, The Connecticut Free Unix Group, was born in November
   of 1996. Both of us had very busy schedules, so all of the time we
   were going to invest in this project came directly from our
   ever-decreasing periods of leisure activity. We agreed upon three
   major goals for CFUG: The first was the wide distribution and
   implementation of free, unix-like operating systems and software. The
   second was educating the public about important developments in the
   evolution of free operating systems. Finally, we strove to provide an
   open, public forum for debate and discussion about issues related to
   these topics. After writing to several major vendors and asking for
   donations of their surplus stock and/or older software releases, the
   packages began rolling in. (After all, we wanted to create some sort
   of incentive for people to come to the first meeting)! We then got
   started doing some heavy advertising on the newsgroups, in local
   computer stores and also on local college campuses. Finally, after
   securing an honored guest speaker for our first meeting, (Lar Kaufman,
   co-author of the seminal reference book "Running Linux"), we were
   ready to set a date. December 9th, 1996 marked the first official CFUG
   gathering, which took place at a local public library. We've held
   meetings on the second Monday of each month ever since, and are now
   widely recognized as Connecticut's only organization dedicated to the
   entire free unix community. We've since lost Nate Smith to the
   lucrative wiles of Silicon Valley, but we continue to carry on with
   our original goals. We have close relations with companies such as
   Caldera Inc., InfoMagic Inc., and Red Hat Software, as well as such
   non-commercial entities as The FreeBSD Project, Software In The Public
   Interest (producers of Debian GNU/Linux), The OpenBSD Project and The
   Free Software Foundation. We were also featured on the front page of
   the Meriden Record-Journal, a major local newspaper, on May 26th of
   this year. Our future plans include more guest speakers, as well as
   trips to events of pertinence throughout New England.
   
   For more information, please check our website - http://www.cfug.org
   
   There is a one-way mailing list for announcements concerning CFUG. You
   can sign up by emailing cfug-announce-request@cfug.org with
   "subscribe" as the first line of the message body (without the
   quotes).
     _________________________________________________________________
   
                       Copyright © 1997, Lou Rinaldi
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
    "Linux Gazette...making Linux just a little more fun!"
     _________________________________________________________________
   
                     Review: The Unix-Hater's Handbook
                                      
                     by Andrew Kuchling amk@magnet.com
     _________________________________________________________________
   
   I've written a review of an old (1994-vintage) book that may be of
   interest to Linuxers. While even just its title will annoy people,
   there actually is material of interest in the book to Linux developers
   and proponents.
   
   Andrew Kuchling
   amk@magnet.com
   http://starship.skyport.net/crew/amk/
     _________________________________________________________________
   
   The UNIX-HATERS Handbook (1994)
   by Simson Garfinkel, Daniel Weise, and Steven Strassman.
   Foreword by Donald Norman
   Anti-Forward by Dennis Ritchie.
   
   Summary: A sometimes enraging book for a Linux fan, but there are
   valuable insights lurking here.
   
   In his Anti-Forward to this book, Dennis Ritchie writes "You claim to
   seek progress, but you succeed mainly in whining." That's a pretty
   accurate assessment of this book; it's one long complaint about work
   lost due to crashes, time wasted finding workarounds for bugs, unclear
   documentation, and obscure command-line arguments. Similar books could
   be written about any operating system. Obviously, I don't really agree
   with this book; I wouldn't be using Linux if I did. However, there is
   informative material here for people interested in Linux development,
   so it's worth some attention.
   
   The book describes problems and annoyances with Unix; since it was
   inspired by a famous mailing list called UNIX-HATERS, there are lots
   of real-life horror stores, some hilarious and some wrenching. The
   shortcomings described here obviously exist, but in quite a few cases
   the problem has been fixed, or rendered irrelevant, by further
   development. Two examples:
   
   * On the Unix file system: "...since most disk drives can transfer up
   to 64K bytes in a single burst, advanced file systems store files in
   contiguous blocks so they can be read and written in a single
   operation ... All of these features have been built and fielded in
   commercially offered operating systems. Unix offers none of them." But
   the ext2 file system, used on most Linux systems, does do this;
   there's nothing preventing the implementation of better filesystems.
   
   * "Unix offers no built-in system for automatically encrypting files
   stored on the hard disk." (Do you know of any operating system that
   has such capability out of the box? Can you imagine the complaints
   from users who forget their passwords?) Anyway, software has been
   written to do this, either as an encrypting NFS server (CFS) or as a
   kernel module (the loopback device).
   
   There are some conclusions that I draw from reading this book:
   
   First, when the book was written in 1994, the free Unixes weren't very
   well known, so the systems described are mostly commercial ones.
   Proponents of free software should notice how many of the problems
   stem from the proprietary nature of most Unix variants at the time of
   writing. The authors point out various bugs and missing features in
   shells and utilities, flaws which could be *fixed* if the source code
   was available.
   
   Better solutions sometimes didn't become popular, because they were
   owned by companies with no interest in sharing the code. For example,
   the book praises journalled file systems such as the Veritas file
   system, because they provide faster operation, and are less likely to
   lose data when the computer crashes. The authors write, "Will
   journaling become prevalent in the Unix world at large? Probably not.
   After all, it's nonstandard." More importantly, I think, the file
   system was proprietary software, and companies tend to either keep the
   code secret (to preserve their competitive advantage), or charge large
   fees to license the code (to improve their balance sheets).
   
   The chapter on the X Window System is devastating and accurate; X
   really is an overcomplicated system, and its division between client
   and server isn't always optimal. An interesting solution is suggested;
   let programs extend the graphics server by sending it code. This
   approach was used by Sun's NeWS system, which used PostScript as the
   language. Unfortunately NeWS is now quite dead; it was a proprietary
   system, after all, and was killed off by X, which was freely available
   from MIT. (Trivia: NeWS was designed by James Gosling, who is now
   well-known for designing Java. Sun seems determined not to make the
   same mistake with Java... we hope.)
   
   Second, many of the problems can be fixed by integrating better tools
   into the system. The Unix 'find' command has various problems which
   are described in chapter 8 of the book, and are pretty accurate,
   though they seem to have been fixed in GNU find. Someone has also
   written GNU locate, an easier way to find files. It runs a script
   nightly to build a database of filenames, and the 'locate' command
   searches through that database for matching files. You could make this
   database more than just a list of filenames; add the file's size and
   creation time, and you can do searches on those fields. One could
   envision a daemon which kept the database instantly up to date with
   kernel assistance. The source is available, so the idea only needs an
   author to implement it...
   
   Chapter 8 also points out that shell programming is complex and
   limited; shell scripts depend on subprograms like 'ls' which differ
   from system to system, making portability a problem, and the quoting
   rules are elaborate and difficult to apply recursively. This is true,
   and is probably why few really sizable shell scripts are written
   today; instead, people use scripting language like Perl or Python,
   which are more powerful and easier to use.
   
   Most important for Linux partisans, though, it's very important to
   note that not all of the flaws described have been fixed in Linux yet!
   For example, most Linux distributions don't really allow you to
   undelete files, though the Midnight Commander program apparently
   supports undeletes. As the authors say, 'sendmail' really is very
   buggy, and Unix's security model isn't very powerful. But people are
   working on new programs that do sendmail's job, and they're coding
   security features like the immutable attributes, and debating new
   security schemes.
   
   For this reason, the book is very valuable as a pointer to things
   which still need fixing. I'd encourage Linux developers, or people
   looking for a Linux project, to read this book. Your blood pressure
   might soar as you read it, but look carefully at each complaint and
   ask "Is this complaint really a problem? If yes, how could it be
   fixed, and the system improved? Could I implement that improvement?"
     _________________________________________________________________
   
                     Copyright © 1997, Andrew Kuchling
          Published in Issue 22 of the Linux Gazette, October 1997
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
     _________________________________________________________________
   
                          Linux Gazette Back Page
                                      
           Copyright © 1997 Specialized Systems Consultants, Inc.
For information regarding copying and distribution of this material see the
                              Copying License.
     _________________________________________________________________
   
  Contents:
  
     * About This Month's Authors
     * Not Linux
     _________________________________________________________________
   
                         About This Month's Authors
     _________________________________________________________________
   
    Larry Ayers
    
   Larry Ayers lives on a small farm in northern Missouri, where he is
   currently engaged in building a timber-frame house for his family. He
   operates a portable band-saw mill, does general woodworking, plays the
   fiddle and searches for rare prairie plants, as well as growing
   shiitake mushrooms. He is also struggling with configuring a Usenet
   news server for his local ISP.
   
    Jim Dennis
    
   Jim Dennis is the proprietor of Starshine Technical Services. His
   professional experience includes work in the technical support,
   quality assurance, and information services (MIS) departments of
   software companies like Quarterdeck, Symantec/ Peter Norton Group, and
   McAfee Associates -- as well as positions (field service rep) with
   smaller VAR's. He's been using Linux since version 0.99p10 and is an
   active participant on an ever-changing list of mailing lists and
   newsgroups. He's just started collaborating on the 2nd Edition for a
   book on Unix systems administration. Jim is an avid science fiction
   fan -- and was married at the World Science Fiction Convention in
   Anaheim.
   
    John M. Fisk
    
   John Fisk is most noteworthy as the former editor of the Linux
   Gazette. After three years as a General Surgery resident and Research
   Fellow at the Vanderbilt University Medical Center, John decided to
   ":hang up the stethoscope":, and pursue a career in Medical
   Information Management. He's currently a full time student at the
   Middle Tennessee State University and hopes to complete a graduate
   degree in Computer Science before entering a Medical Informatics
   Fellowship. In his dwindling free time he and his wife Faith enjoy
   hiking and camping in Tennessee's beautiful Great Smoky Mountains. He
   has been an avid Linux fan, since his first Slackware 2.0.0
   installation a year and a half ago.
   
    Michael J. Hammel
    
   Michael J. Hammel, is a transient software engineer with a background
   in everything from data communications to GUI development to
   Interactive Cable systems--all based in Unix. His interests outside of
   computers include 5K/10K races, skiing, Thai food and gardening. He
   suggests if you have any serious interest in finding out more about
   him, you visit his home pages at http://www.csn.net/~mjhammel. You'll
   find out more there than you really wanted to know.
   
    Bob Hepple
    
   Bob Hepple has been hacking at Unix since 1981 under a variety of
   excuses and has somehow been paid for it at least some of the time.
   It's allowed him to pursue another interest - living in warm, exotic
   countries including Hong Kong, Australia, Qatar, Saudi Arabia, Lesotho
   and (presently) Singapore. His initial aversion to the cold was
   learned in the UK. Ambition - to stop working for the credit card
   company and taxman and to get a real job - doing this, of course!
     _________________________________________________________________
   
                                 Not Linux
     _________________________________________________________________
   
   Thanks to everyone who contributed to this month's issue!
   
   I'm very excited to edit the Linux Gazette for October.
   At my last job, where I fixed computers for a big company, I was
   talking with a woman about life in general while fixing her computer,
   and suddenly she blurted: "Oh my God! You're really a computer geek!"
   She immediately apologized and explained that she didn't mean any
   offense, even though I had a huge smile on my face and was trying to
   explain that I appreciated the compliment.
   
   After many experiences like that, working with SSC has been a welcome
   change. And since Linux Gazette is one of the places where geeks come
   home to roost, I'm happy to be a part of it.
   
   I just came back from the Grace Hopper Celebration for Women in
   Computing, which was held in San Jose, California this year. To quote
   Bill and Ted, it was totally awesome! I got to meet the illustrious
   Anita Borg, the amazing Ruzena Bajcny, and the inspiring Fran Allen
   from IBM, as well as many many many others who came from all over the
   country, and from dozens of countries from around the world. It was
   the most incredible even that I have ever attended, and I encourage
   everyone to go to the next one which will be in the year 2000.
   
   Margie Richardson will return next month as Editor-In-Chief, and I'll
   be helping out on the sidelines. I'm really glad that I got the chance
   to be the Big Cheese for a month. :)
   Keep sending those articles to gazette@ssc.com!
   
   Until next month, keep reading and keep hacking!
     _________________________________________________________________
   
   Viktorie Navratilova
   Editor, Linux Gazette gazette@ssc.com
     _________________________________________________________________
   
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back 
     _________________________________________________________________
   
   Linux Gazette Issue 22, October 1997, http://www.ssc.com/lg/
   This page written and maintained by the Editor of Linux Gazette,
   gazette@ssc.com
