Linux Gazette... making Linux just a little more fun!
                                      
  Copyright � 1996-97 Specialized Systems Consultants, Inc. linux@ssc.com
                                      
     _________________________________________________________________
                                      
                       Welcome to Linux Gazette! (tm)
                                      
   Sponsored by:
   
                                 InfoMagic
                                      
   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.
   
     _________________________________________________________________
                                      
    "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
                                      
     _________________________________________________________________
                                      
   The last couple of months have been rather light on articles. It's
   been helpful to have the new chapters for Linux Installation and
   Getting Starting to include. So all you budding authors and Linux
   users out there, send me your stuff. Don't depend on our regular
   authors to fill the gap. We want to hear about all the neat tips and
   tricks you've found, as well as all the neat applications your are
   writing or working with. --Editor
   
     _________________________________________________________________
                                      
   Date: Sat Apr 19 07:29:14 1997
   Subject: Searching for Information On Newsgroups
   From: Roman, Roman@pussycat.ping.de
   
   Hi folks!
   
   I'm installing a very small news- and email system at my local
   university (peolpe there are studying arts, so there's no one to help
   me with this). I set up one computer with Linux 2.0.29 which is
   permanently connected to the 'internet' via ethernet. Then I want to
   connect a second PC which is installed in the hallway via
   nullmodem-cable for all the students to write and receive eMail. But
   the problem now is, that the provider (another part of the university)
   doesn't give us access to the newsgroups, so I want to set up at least
   some local newsgroups on this Linux-station.
   
   But I just can't seem to find any documentation explaining how to set
   up local newsgroups. smtpd and nntpd are running, but the manpages
   won't tell anything about how to set up ng's (forgive me if I'm just
   too blind or stupid to find the obvious source of information).
   
   So I don't want to bother you explaining me how to accomplish this
   task, but perhaps someone can at least tell me where to find the
   desired information.
   
   Best regards, Roman.
   
     _________________________________________________________________
                                      
   Date: Thu Apr 24 11:44:40 1997
   Subject: VGA_16 Server
   From: Javier Viscain
   
   Congratulations for the aim and contents of the Gazette. Here is an
   issue I've never seen addressed: the VGA_16 server maintains two
   monitors (the second monochrome with an Hercules card) but what only
   works is the mouse movement, which moves out of left and right to the
   other monitor, and console switching. No window on the monochrome gets
   focus. Things that moreless appear on the monochrome but don't work:
     * Xeyes: both eyes are displayed, but the inner dots appear as
       moving diagonal lines out of the eyes.
     * Xterm: an useless box appears. Xterm with exec: say "xterm
       -display xxx:0.1 -exec top &" appears as an xterm box with the
       letters from "top" without any order, in and out from the xterm
       box.
     * Xload: the "load" and letters appear out of the box.
       
   I think that the hardware absolute addressing is the normal VGA one
   (0A0000 to 0AFFFF) and 64K for the Hercules (0B0000 to 0BFFFF), which
   is correct. In adition, this server and the mono server are very buggy
   when with only the Hercules.
   
   Any easy solution, or is it that this configuration has not been
   debugged?
   
   TIA, Javier Vizcaino, Madrid, Spain.
   
     _________________________________________________________________
                                      
   Date: Sun 6 Apr 1997 11:54:42 -0400
   Subject: Initilation Files
   From Karl Easterly bigtexan@mindspring.com
   As an article Idea, I think an overview of the major boot scripts
   would = be helpful. The overview could include an objective view of
   the = locations, functions, and nifty "tips and tricks" or such. Also,
   links = to how-toos for each script would future simplify the learning
   curve for = new users.
   
   Another idea would be to do a chronological installations and =
   customization series of articles. Granted, hardware diversity might be
   = a problem and could possibly be subverted by starting the series as
   = though a working installation of Linux has already been installed.
   It = would proceed as a rough idea like this.
    1. Booting customization and kernel rebuilding.
    2. Xwin customization, to include the type of activities one = would
       do in Win95 desktop setup.
    3. Getting dialup connectivity to work.
    4. Getting network connectivity to work.
       
   These are just stabs at a scheme, the actual order would have to be =
   hammered out before the series started, but in general, would be
   helpful = to have a step by step issue oriented series of articles
   concerning the = setup and customization of any linux installation.
   
     _________________________________________________________________
                                      
   Date: Sat, 1 Mar 1997 15:39:10 -0500
   Subject: Ideas for Beginners
   From: stephen jarvis 106363.2642@compuserve.com
   
   Hello
   
   I am 'the' absolute beginner.I have had a copy of Linux Slackware and
   a copy of "Linux configuration and installation " by P Volkerding et
   al for about two weeks.Prior to this I had dabbled at dos and
   wondered(?) at windows.But when I heard about Linux in a magazine it
   occured to me that it might be fun to have a go.And indeed it has
   been.
   
   The only problem I have had is with regard to the man pages. In
   general they are technical to a degree that while appropriate for
   those who can follow the argument from end to end,are pretty
   debilitating for the newbie like me.Indeed I don't always get to the
   end.
   
   Perseverence will no doubt pay off and I have expanded my collection
   of books already,to take advantage of the possibility of learning
   something about programming on Linux.But then I have always had the
   kind of curiousity that,while not enough to kill the cat,is enough to
   keep me in the book shop.The point I think is that the man pages
   themselves are a bit of a barrier to the wider useage of Linux.
   
   No doubt others would say the detail and technical clout of this
   source of information is needed for those who want to make serious use
   of Linux.But not everyone who wants to escape from the soporific
   influence of Microsoft is that demanding or that knowledgeable.I think
   someone needs to pitch things at the introductory level.In the realms
   of 'this will get it going'and 'try this out'.Merely a more chatty
   approach would help remove the shiney armour of incomprehensibilty
   some pages deploy.
   
   If this sounds a little unfair to the many people who have compiled
   ,man pages it is most definitley not meant to be.There is a need for
   accurate and complete information especially as Linux is a cooperative
   venture and everyone needs to have a common root of information.The
   question is how can the benefits of Linux be made widely known to
   people outside the existing network.What will grab their attention and
   take the gleam off Windows 95? Something more open to a wider audience
   perhaps.
   
   This does not have to be completely bland and overly simple just in
   the range of every day usage.An approach that does not assume that
   everyone reading knows the meaning of every term on the page.People
   need an introduction to the language of Linux in the way that you
   might learn French or English.Start with very basic things and build
   up in stages.Don't launch straight into 'How To Compile Your Kernal
   '.Ok thats important ,but I am sure most people still think a kernal
   is what you find inside a nut.I hope you are getting the general idea.
   
   What us new people need is probably a collection of basic texts each
   about the length of a several page magazine article.Hopefully they
   would cover the things that a hardend Linux user would be embarrassed
   to ask about.'The kernal for beginners'.'Great now I can ask what it
   really is'.If this undertaking was started then I am sure that the end
   product of a few months could be published as a small book.Maybe you
   could publish it.I think there is a potential market.Many magazines
   recently covered the subject of Linux.That's how I got the bug.
   
   Now it's true there are books already that cover Linux but there are
   not many on line man pages or magazine articles that give the beginner
   the feeling that they can actually get their system up and running
   easily.So if you really want to publish articles for absolute
   beginners bear in mind the kind of language that is used.
   
   Regards Steve Jarvis
   
   ps.. here's some ideas ' What is the kernal','The basic commands to
   get around bash','What are disk partitions and why bother',' To Umsdos
   or not. That's the question','Midnight Commander-an
   introduction','This is the easiest editor anybody ever used(insert
   your choice)','A glossary of general terms you'll find on a man
   page','These books are a good read(assorted titles)'.'How to get
   around an info text with less than 20 pages of instructions','Why the
   idea of a free and open o/s matters','X is not a horror film'.
   
   Maybe these are a bit daft but they'd get my attention.They are the
   sort of things I'd like to know about.
   
     _________________________________________________________________
                                      
   Date: 04 Apr 97 19:02:21 EST
   Subject: Technical Support
   From: Dani Fricker 101550.3160@CompuServe.COM
   
   first i wanna say thanx for the lj! great work and fun not even for
   linuxers! i need your help. for some reasons i have to identify a user
   on my webserver by his/her ip-address. fact is that users logon comes
   from different physical machines. that means that i have to assign
   something like a virtual ip-address to a users log name. something
   like a reversal masquerading. my ip-gateway connects my inner lan over
   two token ring network cards (sorry, not my idea!) with the internet
   (lan tr0 tr1 internet). the masquerading forward roule of ipfwadm
   gives me the possibility to indicate a source and a destination
   address. do you see a possibility for an 'address assignment' between
   the two interfaces? if you do please let me know.
   
   dani fricker
   programmer
   zurich-switzerland
   
     _________________________________________________________________
                                      
   Date: Mon, 07 Apr 1997 03:01:17 -0500
   Subject:HELP with Man Pages From: "Mauricio Naranjo N."
   davasgut@col2.telecom.com.co
   
   Well, I have installed the linux toolkit / october 1996 and I have not
   been able to install the man pages for commonly used commands like
   cat, ls, and so on; instead I have installed the man pages for
   packages like, fvwm, midnight commander, ....
   
   So, I installed man2.tgz, man3.tgz, manpgs.tgz, but I still have not
   been able to get installed the whole support for man; Can you tell me
   please, what's the matter???? Any kind of help would be great
   appreciated, and excuses for ignorance but I am new at this OS
   (finally I found a true one)
   
   Mao
   
     _________________________________________________________________
                                      
   Date: Mon, 7 Apr 1997 15:43:21 -0400 (EDT)
   Subject: Port Mouse
   From: Jose, notDefined@novagate.com
   
   Hi, Maybe you can help me with this. (I hope) I switched motherboards,
   from a zeos pentium 90 that used a serial mouse to a asus p/i-p55tvp4
   motherboard that uses a port mouse. And now I can't get x-windows to
   run. Any ideas?
   
   Jose
   
     _________________________________________________________________
                                      
                                General Mail
                                      
     _________________________________________________________________
                                      
   Date: Tue, 01 Apr 1997 04:26:04 -0600
   Subject: Linux
   From: Tred Riggs tred@oak.sfasu.edu
   
   I am a college student attending Stephen F. Austin State University. I
   work in a Geographic Information Systems Laboratory (GIS) and we have
   been just using AIX machines. Howerver we do have a full blown linux
   pc and it is great. {Since then I stripped DOS off my PC and made me a
   full blown linux box, which works wonderful. We were considering to
   upgrade to all linux PC's in out lab because they were cheaper and
   faster than the AIX boxes, but we ran into a problem. The Software we
   need to run to make our GIS maps is not supported by ESRI, so we gave
   them a call. This is what they told us:
   
   "Linux will not be a supported platform. They told me that product
   ports are user driven and there is not enough users wanting this OS."
   
   I could not figure out how they could even say this when all you have
   to do is get on the web and see millions of people using linux. So
   here is what I want to happen. I need linux users to E-mail ESRI at
   buspartners@esri.com and tell them that you use linux and that there
   are many more people using linux too. ESRI needs to get there head out
   of Microsofts world and see what is going on in the real world.
   
   Thanks for your time Linux Gazette,
   
   Tred Riggs
   
     _________________________________________________________________
                                      
   Date: Thu, 3 Apr 97 22:40:23 BST
   Subject:http://www.ssc.com/lg/index.html
   From: Duncan Simpson dps@duncan.telstar.net
   
   Given Micro$oft's tag line of "Yet another Web server powered by NT"
   maybe we should collect a list of people doing this sort of stuff on
   Linux. I can add 3 items myself http://mail.telstar.net is powered by
   Linux The telstar mail service described there is also powered by the
   same linux box Astra has switch from NT to Linux for its radius
   server. (NT was just too expensive and no better than Linux
   (Un*x)---the price diffrernece was *1000s* of pounds, each about 1.5 $
   US). Both astra (and telstar.net) DNS servers are linux.
   
   If the stats show that Linux is more popular for comercial web servers
   than NT, this would be something nice to be able to point out...
   
   Duncan (-:
   
   P.S. Any bets when Truetype fonts can be used for proper typesetiing.
   At present they lack litagures (fl and various other items that are
   tradionally rendered as single characters)?
   
   P.P.S. The use of the present tense (switch) is apt because the change
   is happening now. (Despite a bug that is now not being exercised due
   to an attempt to eradicate it mail.telstar.net is more reliable than
   any of various NT machines at handling mail).
   
     _________________________________________________________________
                                      
   Date: Fri, 04 Apr 1997 15:57:12 -0600
   Subject: Re: How to ftp Back Home
   From: James Stansell james.stansell@wcom.com
   
   The ifconfig command works, and may be the most authoritative on the
   subject (except I believe the PPP log also contains your current IP),
   but the ifconfig command returns a ton more information than I want.
   
   So I ask my machine at work who I am:
who am i
stansell   ttyp6   Apr 4 15:51   (206.125.79.118)

   I've inserted your example IP address where my actual address showed
   up. If the DNS at work does happen to know a name for my address, then
   it shows up instead of the IP.
   
   --james
   
     _________________________________________________________________
                                      
   Date: Thu, 10 Apr 1997 17:08:38 -0500
   Subject: Re:GV article
   From: Larry Ayers ayers@vax2.rainis.net
   To: Geoffrey Leach geoffrey@iname.com
   Sorry the URL didn't work for you; I recently got an email message
   from Helmut Geyer, the maintainer of the Debian GV version and he
   included a URL for a new GV home-page:
   http://wwwthep.physik.uni-mainz.de/~plass/gv/
   
   The Debian version is in the /text section of the /i386 binary
   directory of any Debian mirror. Shouldn't be too hard to find.
   
   Good luck!
   
   Larry Ayers
   
     _________________________________________________________________
                                      
               Published in Linux Gazette Issue 17, May 1997
                                      
     _________________________________________________________________
                                      
   [ TABLE OF CONTENTS ] [ FRONT PAGE ] Next 
   
      This page written and maintained by the Assistant 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:
  
     * X Limitation to 8 Bit Color
     * Screen Blanking Under X
     * Doubleclick Internet User Profiles
     * How to Mount/Unmount For Users
     * File Transfer With the z Protocol
     Using ftp Commands in Shellscript
     ASCII-Artwork Translator
     Including Graphics in Linuxdoc SGML
     X Configuration Issues
     Multiple X Displays
     Color Depths with X
     Figuring Out the Boot Process
     ftping Home
         _____________________________________________________________
                                        
  X Limitation to 8 Bit Color
       From: Gary Masters gmasters@devcg.denver.co.us
       I read your question in Linux Gazette regarding an X limitation to
       8 bit color when the system has more than 14 megs of RAM. Where
       did you find that information? I ask because my system has 24 megs
       of RAM, and I run 16 bit color all the time. One difference
       between our systems is that I am using a Diamond Stealth 64 video
       card.
       The place I tell X to run in 16 bit mode is in the file
       /usr/X11R6/bin/startx. There is a line in this file that begins
       with serverargs. I get 16 bit mode by giving "-bpp 16" as an
       argument in this line (e.g. serverargs="-bpp 16").
       One problem I did have was that the OpenLook Window Manager (olwm)
       did not like 16 bpp mode. I solved this by switching to the
       OpenLook Virtual Window Manager (olvwm)[1]. I also had success
       using the Tab and FV Window Managers (twm & fvwm) in 16 bpp mode.
       Coming from a SunOS background, I'm used to OpenLook.
       Gary Masters
         _____________________________________________________________
                                        
  Screen Blanking Under X
       From: Gary Masters gmasters@devcg.denver.co.us
       I read your question in the Linux Gazette regarding unwanted
       screen blanking under X after upgrading to a newer distribution of
       Linux. I had the same frustration. Apparently the X servers
       included in the Xfree86 version distributed with current Linux
       distributions has screen blanking compiled as a default behavior.
       This behavior can be controlled with the -s option to the server.
       Look in the startx script for a line that begins with serverargs
       and add "-s 0". This will disable the X screen blank.
       Gary Masters
         _____________________________________________________________
                                        
  Doubleclick Internet User Profiles
       From: Kragen Javier Sittler kragen@pobox.com
       Check out the description of what doubleclick.net does at
       http://www.doubleclick.net/frames/adinfo/dartset.htm
       Then decide whether you want to be added to their database of
       Internet user profiles. If not, you can use the script below; I
       run it in my
/etc/rc.d/rc.inet1
   . It prevents any DoubleClick banners from being displayed, prevents
       any cookies from being set, and prevents DoubleClick from
       collecting any data on you.
       It also does the same thing with linkexchange.com, because I find
       their constant banners and requests for cookies annoying. If you'd
       prefer, you can take out the linkexchange lines.
       However, this will also keep you from receiving *any* information
       from doubleclick or linkexchange directly... so you can't visit
       their web sites either.
       On my machine, I put the script in
/etc/rc.d/rc.doubleclick
   and run it from
/etc/rc.d/rc.inet1
   at boot time, so I'm always protected from DoubleClick.

# Script begins below:

#!/bin/sh
# By Kragen Sitaker, 21 April 1997.

# Prevent any packets from reaching doubleclick.net
/sbin/route add -net 199.95.207.0 netmask 255.255.255.0 lo
/sbin/route add -net 199.95.208.0 netmask 255.255.255.0 lo

# And ad.linkexchange.com too!
/sbin/route add -net 204.71.189.0 netmask 255.255.255.0 lo
         _____________________________________________________________
                                        
  How to Mount/Unmount For Users
       From: Kidong Lee kidong@shinbiro.com
       When I mount/umount file, I have to login as root. It's not
       convenient for me & other users. but, I found the solution that
       user who is not root can do mount/umount in mount man page.
       Take a look at /etc/fstab.

#

/dev/hdb      /cdrom         iso9660          ro,user   0      0
       Note "user" in options field. In options field, if you add "user",
       users can do mount/umount.
         _____________________________________________________________
                                        
  File Transfer With the z Protocol
       From: Gregor Gerstmann, gerstman@tfh-berlin.de
       Regarding Linux Gazette issue16, April 1997, I have some remarks
       regarding the article on file transfer with the z protocol: 'I
       type sz things go along fine, until about 40K then I get a couple
       of different error messages....' We have an internal modem with a
       transfer rate of 2880 cps on the telephone line. My son has an
       account at a Berlin university with a limited capacity of 5MB. We
       found the same error but not limited to a special file size!
       During the night hours, between 1 and 5h local time, when
       telephone costs are lowest, we sometimes transfered files up to
       100KB without errors! To avoid any errors at all, I limited the
       packages to 20 * 1024 = 20480 bytes, if a CRC occurs, transfer
       begins once more but with- out timeout error, because the parcels
       are small. I use two proce- dures: the first, Chop, generates
       another procedure that chops the file to be transfered with the
       help of dd into packages and regu- lates the transfer and removing
       of transfered packages. At home we concatenate the packages again
       with cat ... ... > ... and everything is ok. The last step could
       be done by a procedure too. Of course, it is rather simple
       software, but it works until we will use ISDN.

first parameter - number of bytes
second          - begin of output names, e.g. p1
third           - name of file to be chopped
#!/bin/bash
echo "* Begin of procedure Chop *"
date
# rm alte Datei
if test -e /usr/TFH/EXAMPLE
        then rm /usr/TFH/EXAMPLE
fi
# Test auf Parameter
if test $# -lt 3
        then echo "Incorrect number of parameters !
Please repeat procedure call !"
echo "* End of procedure Chop (error) *"
        exit 1
        else echo "Call was ok"
fi
#
BY=$1
ANZZ=$[(($BY / 20480) + 1)]
quantity=$ANZZ
i=1
recs=0
while test "$i" -lt "$quantity"
do
echo dd if=$3 of=$2_$i bs=1024 skip=$recs count=20 >> /usr/TFH/EXAMPLE
echo sz $2_$i >> /usr/TFH/EXAMPLE
echo rm $2_$i >> /usr/TFH/EXAMPLE
        i="`expr $i + 1`"
        recs="`expr $recs + 20`"
done
echo dd if=$3 of=$2_$i bs=1024 skip=$recs >> /usr/TFH/EXAMPLE
echo sz $2_$i >> /usr/TFH/EXAMPLE
echo rm $2_$i >> /usr/TFH/EXAMPLE
#
echo "* End of procedure Chop (ok) *"
#
         _____________________________________________________________
                                        
  Using ftp Commands in Shellscript
       From: Walter Harms, Walter.Harms@Informatik.Uni-Oldenburg.DE
       Using FTP as a shell-command with ftplib
       Working on several different networks means that you always need
       to copy your data from net to net. Most ppl use rcp but like most
       SysOps I found this to be a terrible security hole. So as I
       started this job my first business was to rewrite several scripts
       that were using rsh,rcp etc. I replaced them with an ftp based
       script ftp - &ltinput> out 2> out.err. It's easy to see that this
       was not a good idea because ftp was not intended as shell-commando
       like cp,mv and the other guys. So I was happy to find the ftplib
       on a linux-CD. It's a nice lib that I used to build cmds like
       ftpmv, ftpcp, ftprm.. This made my scripts much slimmer and
       simpler. I have some terrible copy-scripts running but no problems
       copying on different systems like Ultrix or AIX.
       Example using ftpget (from the ftplib Author Thomas Pfau)
ftpget sunsite.unc.edu -r /pub/Linux ls-lR.gz
   This command reads the file
/pub/Linux/ls-lR.gz from sunsite.unc.edu
   Likewise there are other commands with the lib: ftpdir ,ftpsend, ftprm
       Who needs ftplib?
       Everybody tired of typing ftp... every evening to get the latest
       patches or whatever. Everyone who is regularly copying with ftp
       the same Datafiles.
       Why use ftplib?
       Of course you can add it to you own application but more
       experienced users don't have to use these r-commands anymore. An
       ftpd is available for the majority of systems so it is easier to
       access more of them.
       Any drawbacks?
       Of course, for any ftp session you need a user/paswdr. I copy into
       public area using anonymous/email@ others will need to surly a
       password at login, what is not very useful for regular jobs or you
       have to use some kind of public login but still I think it's
       easier and better to use than the r-cmds.
       -- walter
         _____________________________________________________________
                                        
  ACSII-Artwork Translator
       Here is something interesting which you might consider for
       publication. It is a short program written in LEX and C, which
       takes ASCII-Artwork and translates it into HTML 3.0 compliant
       table data. It is a pretty interesting idea, and as far as I know,
       I'm the first person to try something like this, or automate the
       process. The translator (a2t) has a few options:
          + -x : reverse the output This is because some ASCII-Artwork is
            meant to be seen as black on white and not white on black.
          + -r value
          + -g value
          + -b value Sets constant r,g, and or b, rgb values, so that the
            resulting "grayscale" output can be altered to shades of a
            color.
          + -w value Sets the width of the resulting table.
       The program was completed just today, so it is very new. I've
       released it under the GNU license agreement.
       For some examples of the output generated by a2t, see:
       http://wilkes.edu/~pkeane
       I think you'll find the results to be pretty amusing, and slightly
       more interesting than the usual bag of HTML table-tricks.
       Enjoy-- Patrick

%{

/* Ascii-to-Table version 2.0
**
** A conversion utility to convert gifscii type ASCII-Artwork into
** grayscale HTML 3.0 compliant html documents using tables.
**
** Copyright(C) 1997 by Patrick J.M. Keane --  All rights reserved.
** (pkeane@wilkes.edu)
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
*/

#include
#include
#include

char shade1[4], shade2[4], shade3[4] ;
int reverse=0, widthset=0, width=0 ;
int shade1set=0, shade2set=0, shade3set=0 ;

void maketd(const char *value) {
  printf(" ",
         ((shade1set==0) ? value : shade1),
         ((shade2set==0) ? value : shade2),
         ((shade3set==0) ? value : shade3)) ;
  printf(" ") ;
}

main(int argc, char *argv[]) {
  int c;
  extern int optind;
  extern char *optarg;
  extern int opterr;

  while ((c = getopt(argc, argv, "w:r:g:b:xh")) != EOF) {
    switch (c) {
    case 'x':
      reverse = 1 ;
      break;
    case 'h':
      fprintf(stderr, "Usage:\n\tcat asciifile | a2t [-h] [-x] [-[rgb] value] [
-w width] > document.html\n\n") ;
      fprintf(stderr, "\t-h       : This help screen\n") ;
      fprintf(stderr, "\t-x       : Reverse output\n") ;
      fprintf(stderr, "\t-r value : Constant R GB value\n") ;
      fprintf(stderr, "\t-g value : Constant G RB value\n") ;
      fprintf(stderr, "\t-b value : Constant B RG<B> value\n") ;
      fprintf(stderr, "\t-w value : Set width of output table\n") ;
      exit(0) ;
      break;
    case 'r':
      shade1set = 1 ;
      strcpy(shade1, optarg) ;
      break ;
    case 'g':
      shade2set = 1 ;
      strcpy(shade2, optarg) ;
      break ;
    case 'b':
      shade3set = 1 ;
      strcpy(shade3, optarg) ;
      break ;
    case 'w':
      widthset = 1 ;
      width = atoi(optarg) ;
      break ;
    default:
      fprintf(stderr, "Bad option: %c\n", c);
      exit(1) ;
      break;
    }
  }

  printf ("\n") ;
  printf ("\n") ;
  printf ("\n") ;
  printf ("\n") ;
  printf ("

          \n") ; printf ("", width) ; else printf(">") ; printf ("
                         \n") ; yylex() ; printf("
\n") ;

}

%}

%option yylineno
ws [ ]*
%%

"$"|"@" { (reverse) ? maketd("00") : maketd("ff") ; }
"W"|"M" { (reverse) ? maketd("20") : maketd("f7") ; }
"B"|"%"|"8"|"&" { (reverse) ? maketd("20") : maketd("f0") ; }
"#"|"*"|"9"|"6"|"H" { (reverse) ? maketd("20") : maketd("e7") ; }
"o"|"h"|"k" { (reverse) ? maketd("27") : maketd("e0") ; }
"4"|"5"|"S"|"K" { (reverse) ? maketd("30") : maketd("d7") ; }
"a"|"e"|"s" { (reverse) ? maketd("37") : maketd("d0") ; }
"b"|"d"|"p"|"q" { (reverse) ? maketd("40") : maketd("c7") ; }
"w"|"m"|"3" { (reverse) ? maketd("47") : maketd("b7") ; }
"z"|"O"|"0"|"Q" { (reverse) ? maketd("50") : maketd("b0") ; }
"L"|"G"|"D"|"C"|"2" { (reverse) ? maketd("57") : maketd("a7") ; }
"R"|"E"|"U"|"X" { (reverse) ? maketd("60") : maketd("a0") ; }
"N"|"A"|"Y"|"P" { (reverse) ? maketd("67") : maketd("97") ; }
"F"|"J"|"Z"|"z"|"c" { (reverse) ? maketd("70") : maketd("90") ; }
"g"|"y" { (reverse) ? maketd("77") : maketd("85") ; }
"x"|"v"|"u"|"n" { (reverse) ? maketd("80") : maketd("80") ; }
"="|"I"|"r"|"j"|"T" { (reverse) ? maketd("87") : maketd("77") ; }
"f"|"t" { (reverse) ? maketd("90") : maketd("70") ; }
"|"|"?"|"V"|"/"|"\\"|"7" { (reverse) ? maketd("97") : maketd("67") ; }
"["|"]"|"{"|"}" { (reverse) ? maketd("a0") : maketd("60") ; }
""|"("|")" { (reverse) ? maketd("c5") : maketd("50") ; }
"i"|"l"|"1"|"|"|"!" { (reverse) ? maketd("d0") : maketd("40") ; }
":"|";"|"+"|"~" { (reverse) ? maketd("e0") : maketd("30") ; }
"^"|"\"" { (reverse) ? maketd("e7") : maketd("27") ; }
"-"|"_" { (reverse) ? maketd("ff") : maketd("20") ; }
"'"|"`" { (reverse) ? maketd("ff") : maketd("20") ; }
"."|"," { (reverse) ? maketd("ff") : maketd("20") ; }
{ws}"\n" { printf("  ") ;
       printf("\n") ; }
" " { maketd("00") ; }
.    { fprintf(stderr, "Warning: Character %s is not recognized.\n",
               yytext) ;
       fprintf(stderr, "Choosing a medium color!\n") ;
       maketd("97") ; }
%%

void yyerror(char *msg) {
  fprintf(stderr, "^GError :\tLine %d: %s at '%s'\n", yylineno, msg, yytext) ;
}

int yywrap() {
  return (1);
}






  __________________________________________________________________________
                                       





  Including Graphics in Linuxdoc SGML



From: Martin Michlmayrtbm@cyrius.com

Date: Thu, Apr 17, 1997 at 07:48:19PM +0200


You can already include PostScript images in Linuxdoc-SGML which
will get included in TeX output (and consequently in DVI and
PostScript).  Linuxdoc-SGML doesn't support images for HTML,
however.

An example:



CAPTION: Decade of the brain



You can make references to the figure with

PostScript is already supported and the developer version of SGML-Tools
(the successor of Linuxdoc-SGML) now supports HTML as well.  You
can specify a PostScript and a GIF file and depending on the output
(TeX or HTML) the respective image will be included.


  __________________________________________________________________________
                                       





  X Configuration Issues



Date: Wed Apr 2 12:15:54 1997

From: Michael J. Hammel, mjhammel@emass.com
If you get sufficiently tweaked by the X monitor config problems,
I
suggest X Inside's AcceleratedX package.  Its much simpler to configure
than the XFree package for both cards and monitors.  I used to work
for them, but haven't in over a year.  I still use their package because
its the easiest to handle all the video card/monitor details.

BTW, the monitor setup is menu based.  If your monitor is not listed
you can just use one of the multisync if single frequency generic
configs.  No dot clocks, but you do need to no your monitors frequency
capabilities.  These should be listed in the monitors cdocumetntation.

The package is a commercial distribution and runs about $100 (last time
I checked). They change their name to Xi Graphics recently and the domain
for xinside.com might not be working right now. Try http://www.xig.com.


--
Michael J. Hammel


  __________________________________________________________________________
                                       





  Multiple X Displays



Date: Wed Apr 2 13:38:08 1997

From: Michael J. Hammel mjhammel@emass.com


Setting up the software is probably fairly straight forward.  I've
never used MetroX (I use AcceleratedX instead), however.  Basically
you'll have two choices:
    1. Multiple displays (host:0.0 and host:1.0)
    2. Multiple screens of the same display (host:0.0 and host:0.1)

The second choice is the one you need if you want to move the mouse
between the two monitors - like when the mouse goes past the right edge
of the first monitor it shows up on the left edge of the second monitor.
You'll have to check with Metro to find out which of these options is
supported and how to configure for it.

The hardware problem is tougher.  The problem lies in the fact that PC's
were not originally designed with the idea that multiple display
adapters would be installed.  The BIOS looks for an adapter at certain
locations (IRQ, I/O address) and, unless the second card is configurable
to some other address, the system will find multiple cards.  What
happens next is in-determinant.  Some systems won't boot.  Some do but
don't display to either monitor correctly.

The trick is to find video adapters that were designed to be used
in conjunction with other video adapters.  Many are not.  The easiest
way for you to find out is check with Metro about what combinations of
video adapters they know work together.  Chances are good the ones you
have don't.  I know X Inside had a list of cards they knew work
together.  You could search their web site (http://www.xinside.com or
http://www.xig.com) and see if that info is still there.

Hope this helps.
--
Michael J. Hammel


  __________________________________________________________________________
                                       





  Color Depths with X



Date: Wed Apr 2 13:27:40 1997

From: Michael J. Hammel mjhammel@emass.com


 After fiddling with the xf86config file in a concerted effort to coax X
 into displaying 16 bit color, I was dismayed to learn that with my
 current hardware (16 megs RAM and a Cirrus Logic GL-5426) 16 bit color
 is *impossible*...not because of any hardware in-capability, but because
 of a certain limitation of X Windows itself...a problem with linear
 addressing. Seems that to have 16 bit color under X, one must have
 linear addressing enabled, which only works if the system has *no more
 than 14 megs RAM*.

Horse hockeys.  16 bit color is a limitation of the video subsystem and
has nothing to do with the memory of your system.  Linear addressing in
the XFree86 X servers might be tied to system memory amounts, but that
would be a limitation in the XFree86 server, not in X.  X defines
"method without policy", so such limitations just aren't built into X.

A couple of things you should note:  The number of colors available
under 16bit displays is actually *less* than the number available to
8bit displays.  Why this is true has to do with the way 16bit display
hardware works.  The actual color palette for 8 bit displays can have
millions of colors - it can only display 256 colors at a time, however.
Frugal use of colormaps can allow you to have nearly exactly the right
colors for any given application.  16 bit displays only have a palette
of 65k (roughly) colors.  Once those are used up, you're outta luck.

I'm not completely clear on what makes this difference such a problem
but if you visit the Gimp User's mailing list (see the Linux Graphics
mini-howto:  http://www.csn.net/~mjhammel/linux/lgh.html) and ask this
question you'll get similar replies.  Its been discussed quite at length
on the developers list, and most of them read the User's list.

BTW, if you want to see if Linear Addressing is the real problem, try
the X Inside AcceleratedX demo server and see if it works in 16 bit
color for you.  Generally, your video card needs at least 1M of on board
RAM (not system memory - this is video memory on the video card) to
run in 16Bit mode, but then you'll probably only be able to run in
640x480 or (at most) 800x600 resolution.  To run at higher resolutions
you'll need more video memory.

Hope this helps.
--
Michael J. Hammel


  __________________________________________________________________________
                                       





  Figuring Out the Boot Process


Date: Fri, 04 Apr 1997 13:20:40 -0600

From: David Ishee dmi1@ra.MsState.Edu


One of the things that is confusing about Linux at first is which files
Linux uses to load programs and get the system started at bootup. Once
you figure out which programs are run during the boot process, which
order are they run? Here is an easy solution.

On my Red Hat 4.0 system, the /etc/rc.d directory tree is where
everything happens. There are a lot of shell scripts in this set of
directories that are run when the system boots. To give yourself a
little more info, add some echo statements to the files. For example:

edit /etc/rc.d/rc.sysinit and add the following lines at the beginning

echo " "
echo "**** Running /etc/rc.d/rc.sysinit ****
echo " "

Now when the system is booting you can see exactly when rc.sysinit is
run, and what programs it launches. Repeat the above process for all the
scripts you find.

Now if the system hangs or gives an error during bootup you have a
better idea of where to look. If you don't have any problems while
booting then at least you have more info about what Linux is doing.

David


  __________________________________________________________________________
                                       





  ftping Home


Date: Thu, 3 Apr 1997 20:38:02 +0300 (EET DST)

From: Kaj J. Niemi, kajtzu@4u.net



I read your article about ftping home with dynamic IPs.. Here's
something you might need if you get tired of looking at the screen every
time you want to find out the IP.

ADDRESS=`/sbin/ifconfig | awk 'BEGIN { pppok = 0}
                          /ppp.*/ { pppok = 1; next }
                          {if (pppok == 1 ) {pppok = 0; print} }'\
                          | awk -F: '{print $2 }'| awk  '{print $1 }'`


Just replace the ppp.* with whatever you want (if you have multiple
ppps running). The easiest thing would to be write a script called ftphome
(or similar) and make it first assign the address and then doing ftp or
ncftp $ADDRESS. The snippet is originally from a local firewall, at the part
where it needs to know what its' own address is. :-)
A friend of mine at 
mstr@ntc.nokia.com wrote this for me.

--
Kaj J. Niemi




  __________________________________________________________________________
                                       



               Published in Linux Gazette Issue 17, May 1997


  __________________________________________________________________________
                                       



[ TABLE OF CONTENTS ] [ FRONT PAGE ] Back 
Next 


  __________________________________________________________________________
                                       


      This page maintained by the Assistant 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
                                      




  __________________________________________________________________________
                                       




  GLUE Announcement


    Every GLUE User Group To Receive Free Copy of BRU 2000 Backup And Restore
    Utility



Linux Expo, Research Triangle Park, NC (April 4, 1997) -
Enhanced Software Technologies, Inc. announced today that Groups of Linux
Users Everywhere (GLUE) will provide a free copy of the new BRU 2000 backup
and restore utility to GLUE user groups.

Enhanced Software Technologies, Inc. has joined Linux International as a
corporate member and is also offering members of GLUE user groups a
10-percent discount on purchases of BRU 2000.


Enhanced Software Technologies, Inc., a privately held corporation based in
Tempe, Arizona, is a leading provider of high-reliability systems

Additional information on BRU Giveaway.

GLUE is a project of SSC
publishers of Linux Journal. GLUE was implemented
to provide a world-wide member group for Linux User Groups. GLUE member
groups receive a subscription, materials for promoting and developing
their group, a way of advertising their group in a global setting, list-serv
and Linux Group location services, and discounts and samples from SSC and
Linux Journal. Other vendors may also offer special services or
discounts to GLUE member groups.

Additional information on Glue.


  __________________________________________________________________________
                                       




  SOLID desktop for Linux offered free of charge to developers


Solid Information Technology Ltd today announced a campaign
targeted at the community of Linux developers. Between March
and September 1997 Linux enthusiasts will be presented with
a free personal version of the robust SQL database engine
SOLID Server.

SOLID Server is a unique product by Solid Information Technology
Ltd, a privately held innovator of database
technologies.

To download your own copy of SOLID Desktop for Linux, access
http://www.solidtech.com/linuxfre.htm to find a site near you.

Additional Information:

Solid Information Technology Ltd, http://www.solidtech.com.



  __________________________________________________________________________
                                       




  The Elsop Webmaster Resource Center



The Elsop Webmaster Resource Center

http:www.elsop.com/wrc/


Contains links and comprehensive
coverage of computer industry trade publications,
website development, HTML, servers, validators,
link checkers, and software for webmasters.

Major sections include:
     * Computer Industry Publications
     * Electronic Commerce Solutions
     * High Technology Trade Shows & Conferences
     * History of the Technology
     * Internet, Cyberspace and Computer Law
     * Internet Trade Associations and Societies
     * Link Validators & Site Mappers
     * Reference Room of Outstanding Resources for Webmasters
     * Systems and Software Sources on the Web
     * Website Development Services

Produced and Sponsored by the
Electronic Software Publishing Corporation
http://www.elsop.com/linkscan


  __________________________________________________________________________
                                       




  Linux Jokes Wanted


Do you consider yourself witty?  Do you want to show your fabulous sense of
humor to the world?  NOW IS YOUR CHANCE!

For several years now Linux Journal has been considering adding a monthly carto
on to
our magazine. We know who we could have "draw" the cartoons, but we really
don't have any idea what the jokes should be.

Please  contribute any ideas you have for "Linux related" cartoons.  The type
of cartoon we are imagining are one panel cartoons akin to what they have in
magazines like the New Yorker.

So send us your
favorite Linux jokes (one liners are best), and we will turn them into
cartoons.


  __________________________________________________________________________
                                       




  Too Good Not To Print


For a good time, check out this website!

http://www.lightlink.com/fors/press/net-history.txt

  __________________________________________________________________________
                                       




  New User's Group in Knoxville



There is a new user's group for Linux in Knoxvill, TN

They are called the Knoxville's Linux Users Base.  Check out the web page
at
http://klub.ml.org



  __________________________________________________________________________
                                       




  AfterStep Themes Page



Take a look at the AfterStep Themes
page!  Trae Mc Combs has been devoting some time to creating themes for

http://www.mindspring.com/~xwindow/as.html

or
http://www.mindspring.com/~xwindow



  __________________________________________________________________________
                                       




  Version 7 of Corel's WordPerfect for Linux



Software Development Corporation http://www.sdcorp.com is working on
releasing version 7 of Corel's WordPerfect for Linux.  It's expected to
ship sometime in April, with beta testing currently taking place.

Their webpages seem to warn that only beta testers have access to the
software, but following the links takes you to the download area where
they're freely available.



  __________________________________________________________________________
                                       




  Computer Comparison



Here is a URL that has some interesting data:
http://fampm201.tu-graz.ac.at/karl/timings30.html

This web site is maintained by Karl Unterkofler, and has comparisons of
various computers running the latest versions of Mathemetica. Karl and
others run a series of tests on the machines, that involve timing
mathematical problems.

8 of the 10 fastest machines are running the Mac OS! the first windows
machine doesn't make a showing until 11th place( a pentium pro 200Mhz
running Windows NT 4.0) Incidently this ppro 200 is beat by a Mac 7500
150 Mhz!

You might wonder how this can be when the SPECint95 for Pentium Pros and
for Power PC 604's are so close? Its the operating system dummy!

What do I mean?

The Intel machines and the Macs are pretty equal, its Windows that slows
things down. If you check out the URL you'll see that although 8 of the
top ten are Macs or Mac clones, 2 of them are Intel pentium Pro 200Mhz
machines. Sadly for the Mac, the number one spot is a Pentium Pro 200
with 64 Meg RAM and a 256kb L2 cache running LINUX 2.0.27.

This barely beats the number 2 machine, a 225Mhz Power Tower Pro from
Power Computing with 256 Meg RAM and a 1Meg L2 cache.

The other Intel in the top 10 is a Pentium Pro 200Mhz with 128Meg Ram and
256Kb L2 cache, running NeXT STEP 3.3.

I don't think that Mac owners should be ashamed of losing to a LINUX
machine. LINUX is the result of an amazing effort put forth by many
dedicated programmers to produce a state of the art 32bit operating
system that utilizes hardware to the fullest. Mac users should be happy
that they can go head to head with such an OS, and still maintain the
great human interface of the Mac!

The only other contender is a NeXT machine! Wait'll your windows friends
see redbox!

Oh, BTW the first Win '95 machine doesn't make a showing until 15th
place. its a Pentium pro 200, 64 MB, 256kb, OS: Win95 and is just below a
PowerMac 7600/120, 48MB, 256kb, MacOS!

So if a windows user tells you their machine is faster, tell them that
you know...if they switch to LINUX.


  __________________________________________________________________________
                                       




  Word Processor for the Linux Environment



The development of 'wp', a word processor for the Linux environment has
recently been started. Although it's primary goal is a Linux-based word
processor, wp will eventually be available for many other platforms.

WP is an open system, object orientated, and object driven; written mainly
using C++, although little code has of yet been written. The current
objective is a full design specification/mission statement and determining
the current products that can be used to help the development of the
product further.

Because of this openness, it is proposed to have the user interface
seperate from the main program; the reason for this meaning that the user
can choose whichever interface suits them best, from a ncurses driven text
interface to an X-Windows display using different widget sets.

The web site for Wp is at http://sunsite.unc.edu/paulc/wp

If you wish to obtain the design specification notes for wp, they are also
available at the above site.

A FAQ is currently being prepared, if you have any questions or
suggestions, please send them to wp@squiznet.demon.co.uk

If you wish to contribute to the project in any form, please contact
paulc@sunsite.unc.edu and introduce yourself, a copy of which will be sent
to the wp-developers mailing list unless you specifically state that you
do not wish for this to happen.




  __________________________________________________________________________
                                       



                           Software Announcements
                                      



  __________________________________________________________________________
                                       




  Xcoral 3.0



Xcoral-3.0 has been released and now available on the Net.
     * EUROPE: X/contrib-R5/clients
     * USA: contrib/editors
        

Xcoral is a multiwindow  mouse-based text editor for
the X Window System. It contains a built-in browser that enables you to
navigate through C functions, C++ classes, Java classes, methods and files.
It also contains a SMall Ansi C Interpreter (Smac) which is also built-in
to extend the editor's possibilities
(user functions, key bindings, modes etc).
Xcoral provides variable width  fonts, menus, toolbar,
scrollbars, buttons, search, regions, kill-buffers, macros and
undo. An on-line manual box, with a table of contents
and an index, helps you to use and customize the editor.
Xcoral also offers facilities to write Latex documents
and Html pages.
Xcoral is a direct Xlib client and runs on color/bw
X Display.

OS: SunOS 4.1.x, Solaris 2.[45], LINUX, AIX, HPUX,
       IRIX and OSF-1.

Changes from xcoral-2.5:
     * New browser for C/C++ and Java.
     * Standard X selection mecanism.
     * Toolbar
     * Some bugs fixed...




  __________________________________________________________________________
                                       




  Beta Version of EM86


The Linux/Alpha team at Digital Equipment Corporation
today is releasing a developers' beta version of EM86, a Linux/x86
emulator for Linux/Alpha. Using components of the
DIGITAL FX!32 technology, EM86 is a software emulator that enables
Linux/Alpha systems to run Linux/x86 software without modification.

EM86 currently supports statically linked and dynamically linked x86
ELF32 binaries under Linux/Alpha.  Future enhancements will include
support for iBCS-2 compliant executables, improved emulator performance,
and interoperation with native Alpha code.  A release incorporating
these features is anticipated in July, 1997.

They are releasing a beta version of EM86 at this time to provide
Linux developers early access to the software, to aid in the
verification of software packages, and to provide feedback and bug
reports to the Linux/Alpha team.

The following Linux/x86 software packages run successfully on this
beta version of EM86, with some qualifications as described in the
README file included in the distribution:
     * Netscape Navigator Gold 3.01
     * Adobe Acrobat Reader 3.0
     * Red Baron web browser 3.00
     * Applixware 4.2

    EM86 may be obtained via anonymous ftp from:

ftp://ftp.digital.com/pub/DEC/Linux-Alpha/em86


  __________________________________________________________________________
                                       




  XForms V0.86




XForms V0.86 is now available from:
     * http://brigg.phys.uwm.edu/xforms
     * ftp://einstein.phys.uwm.edu/pub/xforms

for Linux/i386, Linux/alpha, Linux/sparc, and Linux/m68k.

XForms is a graphical user interface toolkit and builder based on Xlib
for X Window Systems. XForms is a portable and efficient C library
that can be used in both C and C++ programs.
The library works in all visuals and all depths (1-24) and comes
with a rich set of objects such as buttons (of many flavors, including color
XPMs as labels) , browsers, sliders, and menus integrated into an
elegant event/object callback execution model that allows fast and
easy construction of X-applications. It also has OpenGL (on SGI) and
Mesa support.

XForms comes bundled with
     * Precompiled library (static and shared) and header files.
     * Source code for 50+ demonstration programs;
     * Precompiled fdesign, an interactive GUI builder that can be used
       to design dialogues in a WYSIWYG way and to output the
       corresponding UI code for you.
     * 250+ pages of indexed documentation (tutorial and reference) in
       both PostScript and html

perl, ada95, python and fortran bindings to xforms are in alpha/beta.
Please visit the xforms' home page for more info.


  __________________________________________________________________________
                                       




  Debian 1.3 Available for Beta Test



Debian 1.3 is now in beta test. We are performing a month-long test
with an organized quality control team. If you'd like to be an official
beta tester, please contact Dale Scheetz dwarf@polaris.net .

The Debian 1.3 files are under the "frozen" directory on most of the
Debian mirror sites. There are now 73 Debian mirrors worldwide! You can
find the mirror list at
ftp://ftp.debian.org/debian/README.mirrors or
ftp://debian.crosslink.net/pub/debian/README.mirrors. Please consider
that this is beta-quality software and there will be bugs. If you have
any problem, please see the information on our bug-tracking system
at http://www.debian.org/support.html, or write to Dale at the above
address.


  __________________________________________________________________________
                                       




  Freedom Desktop Lite Announced (1.01)



Announcing the public availability of the Freedom
Desktop Lite. Freedom Desktop Lite is a
desktop environment/GUI  integrated to the Unix
environment. It
helps users interact with Unix quickly and efficiently.  Freedom
Desktop  runs transparently in a variety of Unix environments,
from Desktop computers (i.e. Linux)  to enterprise workstations.

The Freedom Desktop Lite environment bundles the following
applications:
     * File Manager
     * Program Manager
     * Print Tool
     * Find Tool
     * Editor
     * Terminal emulator
     * Pixmap/Icon Editor
     * Screen grabber
     * Screen saver
     * Rolodex


For more information and the ftp site feel free to visit http://freedom.lm.com/
desktop.html



  __________________________________________________________________________
                                       



               Published in Linux Gazette Issue 17, May 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:

     * fs's
     * Linux/Unix Emulator
     * Using X With 2 Monitors and 2 Video Cards
     * Virtual Hosting
     * Response from Weitse Venema
     * Automatic File Transfer
     * Installing wu-ftpd on a Linux Box
     * Trying to Boot a Laptop
     * zmodem Reply
     * StartX
     * IMAP and Linux
     * IMAP Again
     * UUCP Questions
     * Using MS-DOS Floppies
     * inetd Questions
     * Navas Modem FAQ
     * Setting Up a Modem
     * User Identification
     * Duplicating a Linux Installed HD


  __________________________________________________________________________
                                       




  fs's


From: Aaron M. Lee aaron@shifty.adosea.com


Howdy Jim,
My name's Aaron and I am sysadmin Cybercom Corp., an ISP in
College Station, TX. We run nothing but Linux, and have been involved w/
a lot of hacking and development on a number of projects. I have an
unusual problem and have exhausted my resources for finding an answer- so
I thought you might be able to help me out, if you've got the time.
Anyway, here goes...
I've got a scsi disk I was running under Sparclinux that has 3
partitions, 1 Sun wholedisk label, 2 ext2. That machine had a heart
attack, and we don't have any spare Hypersparcs around- but I _really_
need to be able to mount that drive to get some stuff off of it. I compiled
in UFS fs support w/ Sun disklabel support into the kernel of an i386 Linux
box, but the when I try to mount it, it complains that /dev/sd** isn't a
valid block device, w/ either the '-t ufs' or '-t ext2' options. Also,
fdisk thinks the fs is toast, and complains that the blocks don't end
in physical boundaries (which is probably the case for an fdisk that
doesn't know about Sun disklabels), and can't even tell that the
partitions are ext2 (it thinks one of them is AIX!). Any ideas?



        Consider the nascent state of Sparc support for Linux
        I'm not terribly surprised that you're having problems.

        You seem to be asking:
                "How do I get Linux/Intel to see the fs on
                 this disk?"

        However I'm going to step back from the that question
        and ask the broader question:

                "How do you recover the (important) data off of
                that disk in a usable form?"

        Then I'll step back even further and ask:

                "How important is that data? (what is its
                recovery worth to you)?"

        ... and


                "What were the disaster plans, and why
                are those plans inadequate for this
                situation?"

        If you are like most ISP's out there -- you have not
        disaster or recovery plans, and little or no backup
        strategy.  Your boss essentially asks you to running
        back and forth on the high wire at top speed -- without
        a net.

        As a professional sysadmin you must resist the pressure
        to perform in this manner -- or at least you owe it to
        yourself to carefully spell out the risks.

        In this case you had a piece of equipment that was
        unique the Sparc system -- so that any failure of
        any of its components would result in the lack of
        access to all data on that system.

        Your question makes it clear that you didn't have
        sufficiently recent backups of the data on that
        system (otherwise the obvious solution would be
        to restore the data to some other system and
        reformat the drive in question).
        
        My advice would be to rent (or even borrow) a
        SPARC system for a couple of days (a week is a
        common minimum rental period) -- and install
        the disk into that.

        Before going to the expense of renting a system
        (or buying a used one) you might want to ensure
        that the drive is readable at the lowest physical
        level.  Try the dd command on that device.  Something
        like:

                dd if=/dev/sda | od | less

        ... should let you know if the hardware is operational.
        If that doesn't work -- double and triple-check all of the
        cabling, SCSI ID settings, termination and other hardware
        compatibility issues.  (You may be having some weird problem
        with a SCSI II differential drive connecting to an
        incompatible controller -- if this is an Adaptec 1542B
        -- be sure to break it in half before throwing it away
        to save someone else the temptation (the 1542C series is
        fine but the B series is *BAD*)).

        Once you are reasonably confident that the hardware
        is talking to your system I'd suggest doing a direct,
        bitwise, dump of the disk to a tape drive.  Just use a
        command like:

                dd if=/dev/sda of=/dev/st0

        ... if you don't have a sufficiently large tape drive
        (or at least a sufficiently large spare hard disk) *and
        can't get one* than consider looking for a better
        employer.

        Once you have a tape backup you can always get back
        to where you are now.  This might not seem so great
        (since you're clearly not where you'd like to be) but
        it might be infinitely preferable to where you'll be
        if you have a catastrophic failure on mounting/fsck'ing
        that disk.

        For the broader problem (the organizational ones rather
        than the technical ones) -- you need to review
        the requirements and expectations of your employer --
        and match those against the resources that are being
        provided.

        If they require/expect reliable access to their data --
        they must provide resources towards that end.  The most
        often overlooked resource (in this case) is sysadmin
        time and training.  You need the time to develop
        disaster/recovery plans -- and the resources to test
        them.   (You'd be truly horrified at the number of sites
        that religiously "do backups" but have an entire staff that
        has never restored a single file from those).

        Many organizations can't (or won't) afford a full spare
        system -- particularly of their expensive Sparc stations.
        They consider any system that's sitting on a shelf to be a
        "waste."  -- This is a perfectly valid point of view.
        However -- if the production servers and systems are
        contributing anything to the companies bottom line --
        there should be a calculable cost for down time.  If that's
        the case then there is a basis for comparison to the costs of
        rentals, and the costs of "spare" systems.

        Organizations that have been informed of this risks and
        costs (by there IS staff) and continue to be unwilling or
        unable to provide the necessary resources will probably
        fail.



Thanks in advance for any possible help,
        --Aaron



It's often the case that I respond with things that
I suspect my customer don't want to hear.

The loss of this data (or the time lost to recovering
it) is an opportunity to learn and plan -- you may
prevent the loss of much more important information
down the road if you now start planning for the
inevitable hardware and system failures.


  __________________________________________________________________________
                                       




  Linux/Unix Emulator


From:Steven W., steven@gator.net


 Can you help me?  Do you know of a Unix (preferably Linux) emulator
 that runs under Windows95?
 -- Steven.


        Short Answer:

                I don't know of one.

        Longer Answer:

        This is a tough question because it really doesn't
        *mean* anything.  An emulator is a piece of software
        that provide equivalent functionality to other software
        or hardware.  Hopefully this software is indistinguishable
        from the "real" thing in all ways that count.

                (Usually this isn't the case -- most VT100
                 terminal emulation packages have bugs in them
                 -- and that is one of the least complicated
                 and most widespread cases of emulation in the
                 world).

        A Unix "emulator" that ran under Win '95 would probably not be
        of much use.  However I have to ask what set of features
        you want emulated?

                Do you want a Unix-like command shell (like
                Korn or Bash)?  This would give you some of the
                "feel" of Unix.

                Do you want a program that emulates one of the
                GUI's that's common on Unix?  There are X Windows
                "display servers" (sort of like "emulators") that
                run under NT and '95.  Quarterdeck's eXpertise
                would be the first I would try.

                Do you want a program that allows you to run
                some Unix programs under Win '95?  There are
                DOS, OS/2, and Windows (16 and 32 bit) ports of
                many popular Unix programs -- including most of
                the GNU utilities.  Thus bash, perl, awk, sed,
                vi, emacs, tar, and hundreds of other utilities
                can be had -- most of them for free.

                Do you want to run pre-compiled Unix binaries
                under Win '95?  This would be a very odd request
                since there are dozens of implementations of
                Unix for the PC platform and hundreds for other
                architectures (ranging from Unicos on Cray super-
                computers to Minix and Coherent on XT's and 286's).
                Binary compatibility has playing only a tiny role
                in the overall Unix picture.  I suspect that
                supporting iBCS (a standard for Unix binaries on
                intel processors -- PC's) under Win '95 would be a
                major technical challenge (and probably never
                provide truly satisfying results).

                *note*: One of the papers presented at Usenix in
                Anaheim a couple of months ago discussed the
                feasibility of implementing an improved Unix
                subsystem under NT -- whose claim of POSIX support
                as proven to be almost completely useless in the
                real world.  Please feel free to get a copy of
                the Usenix proceeding if you want the gory details
                on that.  It might be construed as a "Unix emulation"
                for Windows NT -- and it might even be applicable to
                Win '95 -- with enough work.

                If you're willing to run your Windows programs
                under Unix there's hope.  WABI currently supports
                a variety of 16-bit Windows programs under Linux
                (and a different version support them under Solaris).
                Also work is continuing on the WINE project -- and
                some people have reported some success in running
                Windows 3.1 in "standard mode" under dosemu (the
                Linux PC BIOS emulator).  The next version of WABI
                is expect to support (at least some) 32-bit Windows
                programs.

        My suggestion -- if this is of any real importance to you --
        is that you either boot between Unix and DOS/Windows or that
        you configure a separate machine as a Unix host -- put it in
        a corner -- and using your Win '95 system as a terminal,
        telnet/k95 client and/or an X Windows "terminal" (display
        server).

        By running any combination of these programs on your Windows
        box and connecting to your Linux/Unix system  you won't have
        to settle for "emulation."  You'll have the real thing --
        from both sides.  In fact one Linux system can serve as the
        "Unix emulation adapter" for about as many DOS and Windows
        systems as you care to connect to it.

        (I have one system at a client site that has about 32Mb
        of RAM and 3Gb -- it's shared by about 300 shell and
        POP mail users.  Granted only about 20 or 30 of them are
        ever shelled at any given time but it's no where near it's
        capacity).

        I hope this gives you some idea why your question is
        a little non-sensical.  Operating systems can be viewed
        from three sides -- user interface (UI), applications
        programming interface (API), and supported hardware
        (architecture).

        Emulating one OS under another might refer to emulating
        the UI, or the API or both.  Usually emulation of the
        hardware support is not feasible (i.e. we can't run DOS
        device drivers to provide Linux hardware support).

        If one implemented the full set of Unix system calls
        in a Win '95 program that provided a set of "drivers"
        to translate a set of Unix like hardware abstractions
        into calls to the Windows device drivers -- and one
        ported a reasonable selection of software to run under
        this "WinUnix kernel" -- one could call that "Unix emulation."
        
        However it would be more accurate to say that you had
        implemented a new version of Unix on a virtual machine
        which you hosted under Windows.

        Oddly enough this is quite similar to what the Lucent
        (Formerly Bell Labs?) Inferno package does.  Inferno
        seems to have evolved out of the Plan 9 research project
        -- which apparently was Dennis Ritchie's pet project for
        a number of years.  I really don't know enough about
        the background of this package -- but I have a CD
        (distributed to attendees of the aforementioned Usenix
        conference) which has demo copies of Inferno for several
        "virtual machine" platforms (including Windows and Linux).

        Inferno is also available as a "native" OS for a couple
        of platforms (where it includes it's own device drivers
        and is compiled as direct machine code for a machine's
        platform).

        One reason I mention Inferno is that I've heard that
        it offers features and semantics that are very similar
        to those that are common in Unix.  I've heard it described
        as a logical outgrowth of Unix that eschews some of the
        accumulation of idiosyncrasies that has plagued Unix.

        One of these days I'll have to learn more about that.



 I have Windows95 and Linux on my system, on separate partitions, I
 can't afford special equipment for having them on separate machines.
 I really like Linux, and Xwindows, mostly because of their great
 security features.  (I could let anybody use my computer without
 worrying about them getting into my personal files).  Windows95's
 pseudo-multi-user system sucks really bad.  So, mainly, this is why I
 like Linux.  I also like the way it looks.  Anyways, I would just run
 Linux but my problem is that Xwindows doesn't have advanced support
 for my video card, so the best I can get is 640x480x16colors and I
 just can't deal with that.  Maybe I'm spoiled.  The guy I wrote on
 the Xwin development team told me that they were working on better
 support for my card, though.  (Aliance Pro-Motion).  But, meanwhile,
 I can't deal with that LOW resolution.  The big top-it-off problem is
 that I don't know of anyway to have Linux running _while_ Win95 is
 running, if there even is a way.  If there was, it would be great,
 but as it is I have to constantly reboot and I don't' like it.  So
 this is how I came to the point of asking for an emulator.  Maybe
 that's not what I need after all.  So what can I do?  Or does the
 means for what I want not exist yet?


-- Steven.



        If you prefer the existing Linux/X applications and
        user interface -- and the crux of the problem is support
        for your video hardware -- focus on that.  It's a simpler
        problem -- and probably offers a simpler solution.

        There are basically three ways to deal with a lack of
        XFree86 support for your video card:

     * Help write an XFree86 driver (I'm not a coder either -- but I do
       occasionally beat the bushes and offer bribes to coder friends)
     * Look for Metro-X or other (probably commercial) support. (A copy
       of Metro-X comes with Red Hat 4.1 for about $50 -- so this is not
       outrageously expensive).
     * Replace the video card. There are plenty of really good video
       cards that are supported by XFree86. Number 9, and Matrox have
       good track records. Some of the 2Mb PCI cards are only about $100
       (US).

        Be sure to contact the manufacturer to ask for a
        driver.  Point out that they may be able to make
        small changes to an existing XFree86 driver.  You
        can even offer to help them find a volunteer
        (where you post to the comp.os.linux.dev...sys.
        newsgroup and one or two of the developer's mailing
        lists -- and offer some support).  Just offering to
        do some of the "legwork" maybe be a significant
        contribution.

        This is an opportunity to be a "Linux-Activist."

--
Jim


  __________________________________________________________________________
                                       




  Using X with 2 Monitors and 2 Video Cards


From:Charles A. Barrassocharles@blitz.com


I was wondering how I would go about using X with 2 monitors and 2
video cards?  I am currently using XFree86 window manager.  I know you
can do this with the MetroX window manager but that costs money :(.



        I'm sure I gave a lengthy answer to this fairly recently.
        Maybe it will appear in this month's issue (or maybe
        I answered it on a newsgroup somewhere).

        In any event, the short answer is:  You don't.

        The PC architecture doesn't support using multiple
        VGA/EGA cards concurrently.  I don't think XFree86 can
        work with CGA cards (and who'd want to!).  You might
        be able to get a Hercules compatible Monochrome Graphics
        Adapter (MGA) to work concurrently with a VGA card (since
        they don't use overlapping address spaces).  I don't know
        if this is the method that Metro-X supports.

        There are specialized video adapters (typically very expensive
        --  formerly in the $3000+ range) that can co-exist with
        VGA cards.  Two sets of initials that I vaguely recall are
        TIGA and DGIS.  Considering that you seem unwilling to
        pay $100 (tops) for a copy of Metro-X I think these --
        even if you can still find any of them -- are way out of
        your price league.

        Another, reasonable, alternative is to connect a whole
        Xterminal or another whole system and run X on that.  You
        can then remotely display your windows on that about as
        easily as you could set them to display on the local
        server.

        (I know -- you might not get some cool window manager
        to let you drag windows from one display server to another
        -- a trick which I've seen done with Macs under MacOS and
        with Suns and SGI's.  But I've never set one of those up
        anyway -- so I couldn't begin to help you there).

        You might double check with the Metro-X people to see
        what specific hardware is required/supported by their
        multiple display feature and then check with the XFree86.org
        to see if anyone has any drivers for one of those supported
        configurations.

        As a snide note I find your phrase "that costs money :("
        to be mildly offensive.  First the cost of an additional
        monitor has got to be at least 3 times the price of
        a copy of Metro-X.  Second "free" software is not about
        "not having to pay money."

        I'm not trying to sell you a copy of Metro-X here.  I
        don't use it -- and I specifically choose videos cards
        that are supported by XFree86 when I buy my equipments.

        Likewise I don't recommend Linux to my customers because
        it "doesn't cost them anything."  In fact it does cost
        them the time it takes me to install, configure and maintain
        it -- which goes for about $95/hr currently.  I recommend
        Linux because it is a better tool for many jobs -- and because
        the benefits of it's being "free" -- in the GNU sense of the
        term -- are an assurance that no one can "have them over a
        barrel" for upgrades or additional "licensing" fees.  They are
        always *free* to deploy Linux on as many systems as they want,
        have as many users and/or processes as they want on any system,
        make their own modifications to the vast majority of tools
        on the system or hire any consultants they want to make the
        customizations they need.

        I'm sorry to be so "political" here -- but complaining
        that Metro-X "costs money" and asking me for a way to
        get around that just cost me about $50 worth of my time.
        Heck -- I'll go double or nothing -- send my your postal
        address and I'll buy you a copy of RedHat 4.1.  That comes
        with a license for one installation of Metro-X and only
        costs about $50.  I'll even cover the shipping and handling.

        (Please call them first to make sure that it really does
        support your intended hardware configuration).



 Thanks for the time,



        No problem.  (I did say "mildly" didn't I).

--
Jim

  __________________________________________________________________________
                                       




  Virtual Hosting


From: Wietse Venema wietse@szv.sin.tue.nl



 tcpd has supported virtual hosting for more than two years. Below
 is a fragment from the hosts_access(5) manual page.

        Wietse



        Thanks for the quick response.  I'll have to play with
        that.  I suppose a custom "virtual finderd" would
        be a good experiment.

        Do you know where there are any working examples of this
        and the twist option posted to the 'net?  I fight with
        some of these and don't seem to get the right results.

        What I'd like is an example that drops someone into a
        chroot'd jail as "nobody" or "guest"  and running a
        copy of lynx  if they are from one address -- but
        lets them log in a a normal user if they are from an
        internal address.  (We'll assume a good anti-spoofing
        packet-filter on the router(s)).

        Did you ever add the chrootuid functionality to tcpd?

        How would you feel about an option to combine the
        hosts.allow and hosts.deny into just tcpd.conf?

        (I know I can already put all the ALLOW and DENY
        directives in a single file -- and I'm not much of a
        programmer but even *I* could patch my own copy to
        change the filename -- I'm just talking about the
        general case).




    SERVER ENDPOINT PATTERNS

        In  order  to  distinguish  clients by the network address
        that they connect to, use patterns of the form:

          process_name@host_pattern : client_list ...



        (which is what he said one to me when I suggested merging
        his chrootuid code with tcpd).

        I've blind copied Wietse on this (Hi!).  I doubt he has
        time to read the Linux Gazette.


--
Jim

  __________________________________________________________________________
                                       




  Response from Weitse Venema


From:Wietse Venema, wietse@wzv.win.tue.nl


        Do you know where there are any working examples of this
        and the twist option posted to the 'net?  I fight with
        some of these and don't seem to get the right results.



Use "twist" to run a service that depends on destination address:

fingerd@host1: ALL: twist /some/where/fingerd-for-host1


        What I'd like is an example that drops someone into a
        chroot'd jail as "nobody" or "guest"  and running a
        copy of lynx  if they are from one address -- but
        lets them log in a a normal user if they are from an
        internal address.  (We'll assume a good anti-spoofing
        packet-filter on the router(s)).



I have a little program called chrootuid that you could use.


        Did you ever add the chrootuid functionality to tcpd?



I would do that if there was a performance problem. Two small
programs really is more secure than a bigger one.



        How would you feel about an option to combine the
        hosts.allow and hosts.deny into just tcpd.conf?



What about compatibility with 1 million installations world-wide?


        (I know I can already put all the ALLOW and DENY
        directives in a single file -- and I'm not much of a
        programmer but even *I* could patch my own copy to
        change the filename -- I'm just talking about the
        general case).


This is because the language evolved over time. Compatibility can
become a pain in the rear.

--
Weitse

  __________________________________________________________________________
                                       




  Automatic File Transfer


From:Kenneth Ng, kenng@kpmg.com


In Linux Gazette, there is a mention of how to transfer files
automatically using ftp.

Here is how:

 #!/bin/csh
 ftp -n remote.site

And that's it.  Granted ssh is better.  But sometimes you have to go
somewhere that
only supports ftp.


        That's one of several ways.  Another is to use ncftp
        -- which supports things like a "redial" option to keep
        trying a busy server until it gets through.  ncftp also has
        a more advanced macro facility than the standard .netrc (FTP).

        You can also use various Perl and Python libraries (or classes)
        to open ftp sessions and control them.  You could use 'expect'
        to spawn and control the ftp program.

        All of these methods are more flexible and much more robust
        than using the standard ftp client with redirection ("here"
        document or otherwise).

--
Jim

  __________________________________________________________________________
                                       




  Installing wu-ftpd on a Linux Box


From: Stephen P. Smith, ischis@evergreen.com


I just installed wu-ftpd on my linux box.  I have version 2.4.
I can login under one of my accounts on the system and everything
works just fine.

If I try an anonymous ftp session, the email password is rejected.

what are the possible sources of failure?
where should i be going for more help? :-)



        Do you have a user named 'ftp' in the /etc/passwd file?

done.



        wu-ftpd takes that as a hint to allow *anonymous* FTP.
        If you do have one -- or need to create one -- be sure that
        the password for it is "starred out."  wu-ftpd will not
        authenticate against the system password that's defined for a
        a user named "ftp."

done.



        You should also set the shell to something like /bin/false or
        /bin/sync (make sure that /bin/false is really a binary and
        *not* a shell script -- there are security problems -- involve
        IFS (inter-field separators) if you use a shell script in the
        /etc/passwd shell field).

done.



        There is an FAQ for anonymous FTP (that's not Linux specific).
        There is also a How-To for FTP -- that is more Linux oriented.
        If you search Yahoo! on "wu-ftp" you'll find the web pages
        at Washington University (where it was created) and at
        academ.com -- a consulting service that's taken over development
        of the current beta's.


Guess I will just have to do it the hard
way.  Will tell you what I find (just in
case you want to know.



        What does your /etc/ftpaccess file look like?

        Did you compile a different path for the ftpaccess file
        (like /usr/local/etc/)?

        What authentication libraries are you using (old
        fashioned DES hashes in the /etc/passwd, shadow,
        shadow with MD5 hashes -- like FreeBSD's default,
        or the new PAM stuff)?

        Is this invoked through inetd.conf with tcpd
        (the TCP Wrappers)?  If so, what does your /var/log/messages
        say after a login failure?  (Hint: use the command:
        'tail -f /var/log/messages > /dev/tty7 &' to leave a continuously
        updated copy of the messages file sitting on one of your
        -- normally unused -- virtual consoles).

        One trick I've used to debug inetd launched programs (like
        ftpd and telnetd) is to wedge a copy of strace into the
        loop.  Change the reference to wu.ftpd to trace.ftpd --
        create a shell or perl script named trace.ftpd that consists
        of something like:

                #! /bin/sh
                exec strace -o /tmp/ftpd.strace /usr/sbin/wu.ftpd

        ... and then inspect the strace file for clues about
        what failed.  (This is handy for finding out that the
        program couldn't find a particular library or configuration
        file -- or some weird permissions problems, etc).


--
Jim


  __________________________________________________________________________
                                       




  Trying to Boot a Laptop


From: Yash Khemani, khemani@plexstar.com


I've got a Toshiba satellite pro 415cs notebook computer on which I've
installed RedHat 4.1.  RedHat 4.1 was installed on a jaz disk connected
via an Adaptec slimscsi pcmcia adapter. the installation went
successfully, i believe, up until the lilo boot disk creation.  i
specified that i wanted lilo on a floppy - so that nothing would be
written to the internal ide drive and also so that i could take the
installation and run it at another such laptop.  after rebooting, i
tried booting from the lilo floppy that was created, but i get nothing
but continuous streams of 0 1 0 1 0 1...

i am guessing that the lilo floppy does not have on it the pcmcia
drivers.  what is the solution at this point to run RedHat on this
machine?



        You've got the right idea.
        The 1010101010101... from LILO is a dead giveaway that
        your kernel is located on some device that cannot be
        accessed via the BIOS.

        There are a couple of ways to solve the problem.
        I'd suggest LOADLIN.EXE.

        LOADLIN.EXE is a DOS program (which you might have
        guessed by the name) -- which can load a Linux kernel
        (stored as a DOS file) and pass it parameters (like
        LILO does).  Basically LOADLIN loads a kernel (Linux or
        FreeBSD -- possibly others) which then "kicks" DOS
        "out from under it." In other words -- it's a one-way
        trip.  The only way back to DOS is to reboot (or
        run dosemu ;-) .

        LOADLIN is VCPI compatible -- meaning that it can run
        from a DOS command prompt even when you have a memory
        manager (like QEMM) loaded.  You can also set LOADLIN
        as your "shell" in the CONFIG.SYS.  That's particularly
        handy if you're using any of the later versions of DOS
        that support a multi-boot CONFIG.SYS (or you're using the
        MBOOT.SYS driver that provided multi-boot features in
        older versions of DOS).

        To use LOADLIN you may have to create a REALBIOS.INT
        file (a map of the interrupt vectors that are set by
        your hardware -- before any drivers are loaded).
        To do this you use a program (REALBIOS.EXE) to create
        a special boot floppy, then you boot off that floppy
        (which records the interrupt vector table in a file)
        -- reboot back off your DOS system and run the second
        stage of the REALBIOS.EXE.

        This little song and dance may be necessary for each
        hardware configuration.  (However you can save and
        copy each of the REALBIOS.INT files if you have a
        couple of configurations that you switch between --
        say, with a docking station and without).

        With LOADLIN you could create a DOS bootable floppy,
        with a copy of LOADLIN.EXE and a kernel (and the
        REALBIOS.INT -- if it exists).  All of that will
        just barely fit on a 1.44M floppy.

        Another way to do this would be to create a
        normal DOS directory on your laptop's IDE drive --
        let's call it C:\LINUX (just to be creative).

        Then you'd put your LOADLIN.EXE and as many different
        kernels as you liked in that directory -- and maybe
        a batch file (maybe it could be called LINUX.BAT) to
        call LOADLIN with your preferred parameters.  Here's a
        typical LINUX.BAT:

                @ECHO OFF
                ECHO "About to load Linux -- this is a one-way trip!"
                PAUSE
                LOADLIN lnx2029.krn root=/dev/sda1 ro

        (where LNX2029.KRN might be a copy of the Linux-2.0.29
        kernel -- with a suitable DOS name).

        I'd also recommend another batch file (SINGLE.BAT) that
        loads Linux in single-user mode (for fixing things when
        they are broken).  That would replace the LOADLIN line
        in the LINUX.BAT with a line like:

                LOADLIN lnx2029.krn single root=/dev/sda ro

        Another way to do all of this is to simply dd a
        properly configured kernel to a floppy.  You use the
        rdev command to patch the root device flags in the
        kernel and dump it to a floppy.  This works because
        a Linux kernel is designed to work as a boot image.
        The only problem with this approach is that it doesn't
        allow you to pass any parameters to your kernel (to
        force single user mode, to select an alternate root
        device/filesystem, or whatever).

        For other people who have a DOS system and want to
        try Linux -- but don't want to "commit" to it with
        a "whole" hard drive -- I recommend DOSLINUX.

        A while back there was a small distribution called
        MiniLinux (and another called XDenu) which could
        install entirely within a normal DOS partition --
        using the UMSDOS filesystem.  Unfortunately MiniLinux
        has not been maintained -- so it's stuck with a 1.2
        kernel and libraries.

        There were several iterations of a distribution called
        DILINUX (DI= "Drop In") -- which appears to have eventually
        evolved into DOSLINUX.  The most recent DOSLINUX seems was
        uploaded to the Incoming at Sunsite within the last two
        weeks -- it includes a 2.0.29 kernel.

        The point MiniLinux and DOSLINUX is to allow one to install
        a copy of Linux on a DOS system as though it were a DOS
        program.  DOSLINUX comes as about 10Mb of compressed
        files -- and installs in about 20-30Mb of DOS file space.
        It includes Lynx, Minicom, and a suite of other utilities
        and applications.

        All in all this is a quick and painless way to try Linux.
        So, if you have a DOS using friend who's sitting on the fence,
        give them a copy of DOSLINUX and show them how easy it is.



thanks!

yash



        You're welcome.

        (Oh -- you might want to get those shift keys fixed --
        e.e. cummings might sue for "look and feel")


--
Jim

  __________________________________________________________________________
                                       




  zmodem Reply


From: Donald Harter Jr., harter@mufn.org


I saw your post about zmodem in the Linux Gazette.  I can't answer the
readers question, but maybe this will help.  My access to the internet is a
dial in account(no slip, no ppp).  I access the freenets.  I can't use
zmodem to transfer files from the internet and freeenets to my pc.  I can
use kermit though.  It seems that there are some control characters involved
in zmodem that prevent it from being used with my type of connection.  I saw
a some information about this on one of the freenets.  They suggested using
telix and another related protocol.  I tried that, but it didn't work
either.  Kermit is set up to run slow.  You can get kermit to go faster in
certain circumstances by executing its "FAST" macro.  I can download data at
about 700cps with the "FAST" macro of kermit.  Unfortunately kermit hangs up
the line for me so I have to "kill -9 kermitpid" to exit it.  That  problem
can probably be eliminated with the right compile options.  In certain cases
I can't use the "FAST" macro when uploading.



        I'm familiar with C-Kermit.  In fact I may have an
        article in the June issue of SysAdmin magazine on that very
        topic.

        The main points of my article are that C-Kermit is a
        telnet and rlogin client as well as a serial communications
        program -- and that it is a scripting language that's
        available on just about every platform around.

        I know about Telix' support for the kermit transfer protocol.
        It sucks.  On my main system I get about 1900 cps for
        ZMODEM transfers -- about 2200 for kermit FAST (between
        a copy of C-Kermit 5A(188) and 6.0.192 and about 70 cps
        (yes -- seventy!) between a copy of C-Kermit and Telix'
        internal kermit.

        Other than that I've always liked Telix.  Minicom has
        nice ncurses and color -- but is not nearly as featureful
        or stable as either Telix for DOS or any version of C-Kermit.

        Your line hangups probably have to do with your settings for
        carrier-watch.  Try SET CARRIER-WATCH OFF or ON and see if
        it still "hangs" your line.  I suspect that its actually just
        doing read() or write() calls in "blocking" mode.  You might
        have to SET FLOW-CONTROL NONE, too.  There are lots of
        C-Kermit settings.  If you continue to have trouble -- post
        a message to the comp.protocols.kermit.misc newsgroup
        (preferred) or send a message to kermit-support@columbia.edu.

        When I first started using C-Kermit (all of about two months
        ago) my initial questions where answered by Frank da Cruz
        himself (he's the creator of the Kermit protocol and the
        technical lead of the Kermit project at Columbia University).
        (That was before he knew that I'm a "journalist" -- O.K.
        quit laughing!).  Frank is also quite active in the newsgroup.
        I think he provides about 70 or 80 per cent of the technical
        support for the project.

        Oh yeah!  If you're using C-Kermit you should get the
        _Using_C-Kermit_ book.  It was written by Frank da Cruz and
        Christine Gianone -- and is the principal source of funding
        for the Kermit project.  From what I gather a copy of the
        book is your license to use the software.

--
Jim


  __________________________________________________________________________
                                       




  StartX

 
From: Robert Rambo, robert.rambo@yale.edu


Hi, I was wondering if you can help me out.  When I use the command
'startx -- -bpp16' to change the color depth, the windows in X are much
bigger than the monitor display.  So, nothing fits properly and
everything has become larger.  But the color depth has changed
correctly.  I use FVWM as my display manager.  Is there some way to fix
this problem?


If using the 16 bit plan (16bpp) mode to increase
your color depth -- that suggests that selecting this
mode is causing the server to use a lower resolution.

        That is completely reasonable.  If you have a 2Mb video
card and you run it in 1024x768x256 or 1024x768x16 --
then you try to run it with twice as many colors --
the video RAM has to come from somewhere.  So it
bumps you down to 800x600 or 640x480.  These are just
examples.  I don't deal with graphics much so I'd have
to play with a calculator to figure the actual maximum
modes that various amounts of video RAM could support.

        There are alot of settings in the XConfig file.  You
may be able to tweak them to do much more with your
existing video card.  As I've said before -- XConfig
files are still magic to me.  They shifted from blackest
night to a sort of charcoal gray -- but I can't do them
justice in a little article hear.  Pretty much I'd have
to lay hands on it -- and mess with it for a couple of
hours (and I'm definitely not the best one for that job).

        If you haven't upgraded to a newer XFree86 (3.2?) then
this would be a good time to try that.  The newer one
is much easier to configure and supports a better selection
of hardware -- to a better degree than the older versions.
I haven't heard of any serious bugs or problems with
the upgrades.

        You may also want to consider one of the commercial servers.
Definitely check with them in advance to be absolutely certain
that your hardware is supported before you buy.  Ask around in
the newsgroups for opinions about your combination of hardware.
It may be that the XFree86 supports you particular card better
than Metro-X or whatever.

        You may also want to look at beefing up your video hardware.
As I've said -- I don't know the exact figures -- but I'd
say that you probably need a 4Mb card for anything like
16bpp at 1024x768.  You should be able to look up the
supported modes in your card's documentation or on the
manufacturer's web site or BBS.



Also, is there some way to change the color depth
setting to start X with a depth of 16 every time.  I do not use the XDM
manager to initiate an X session.



Yes -- it's somewhere in that XConfig file.  I don't
remember the exact line.  I really wish a bona fide GUI
X wiz would sign up for some of this "Answer Guy" service.

        It doesn't matter whether you use xdm or not.  If you
put the desired mode in the  XConfig file.  However --
since you don't you could just write your own wrapper
script, alias or shell function to call 'startx' with
the -- -bpp16 options.  You could even re-write 'startx'
(it is just a shell script).  That may seem like cheating --
but it may be easier than fighting your way through the
XConfig file (do you get the impression that I just don't
like that thing -- it is better than a WIN.INI or a
SYSTEM.INI -- but not be much).



--
Jim Dennis,

  __________________________________________________________________________
                                       




  IMAP and Linux

 
From: Brian Moore, bem@thorin.cmc.net


Being a big IMAP fan (and glad to see it finally getting recognition:
Netscrape 4 and IE4 will both support it), your answer left a lot out.



Will these support the real features (storing and
organizing folders on the server side)?

        I heard that NS "Communicator" (the next release
Netscape's Navigator series is apparently going to
come with a name change) supports IMAP -- but it's
possible to implement this support as just a variant
of POP -- get all the message and immediately
expunge all of them from the server.

        It seems that this is how Eric S. Raymond's 'fetchmail'
treating IMAP mail boxes -- as of about 2.5 (it seems
that he's up to 3.x now)


The easiest IMAP server to install is certainly the University of
Washington server.  It works, handles nearly every mailbox format around
and is very stable.  It's also written by the guy in charge of the IMAP
spec itself, Mark Crispin.

As for clients, there is always Pine, which knows how to do IMAP quite
well.  This is part of most Linux distributions as well.



I did mention pine.  However it's not my personal favorite.

Do you know of a way to integrate IMAP with emacs mh-e/Gnus
(or any mh compatible folder management system)?



For GUI clients there is ML, which is a nice client, but requires Motif
and can be slow as sin over a modem when you have a large mailbox.
That's available in source at
http://www-CAMIS.Stanford.EDU/projects/imap/ml



I thought I mentioned that one as well -- but it's
a blur to me.

        I personally avoid GUI's like the plague.  I'm
typing this from my laptop, through a null modem link
to my machine in the other room.

        I run emacs under screen -- so I can use mh-e for most
mail, Gnus for netnews and for some of my mailing lists
(it can show news folders as though they were threaded
news groups). screen allows me to detach my session from
my terminal so I can log out, take off with the laptop,
and re-attach to the same session later (via modem or when
I get back home).



Asking on the mailing list about static linked linux versions will get
you one (and enough nagging may get them to actually put one of the
current version up).

ML is really the nicest mail client I have ever used.

As for pop daemons with UIDL support, go for qpopper from qualcomm.
ftp.qualcomm.com somewhere.  Has UIDL and works fine.




O.K.  I'll at that to my list.

        Does that one also support APOP's authentication
mechanism (which I gather prevents disclosing your
password over an untrusted network by using something
like an MD5 hash of your password concatenated with
a date and time string -- or something like that)?

        Does qpopper allow you to maintain a POP user account
file that's separate from your /etc/passwd file?

        Do you know of an IMAP server that supports these
sorts of features (secure authentication and separate
user base)?

        (I know this probably seems like a switch -- the
so called "Answer Guy" asking all the questions --
but hey -- I've got to get my answers from *somewhere*)


--
Jim

  __________________________________________________________________________
                                       



  More IMAP
 
From: Graham Todd, gtodd@yorku.ca



PINE - one of the easiest to use mail clients around - does IMAP just
fine.  You can read mail from multiple servers and mailboxes and save
it locally or in remote folders on the servers - which is what IMAP is
all about: Internet Message Access Protocol = flexible and
configurable *access* to mail servers without having to pop and fetch
messages all over the place (but still having the ability save locally
if you want).

The Netscape's Communicator 4.0b2 thing does too but there are so many
other ugly bits that I'm not gonna bite.

Jeez pretty soon with this fancy new IMAP stuff you'll be able to do
almost as much as you can right now with emacs and ange-ftp (which I
use regularly to access remote mail folders and boxes with out having
to login - it's all set up in .netrc).

Of course the answer is almost always "emacs"  ....  BTW Linux
makes a GREAT program loader for emacs ;-)



 Seems kind of kludgey.  Besides -- does that
 give you the main feature that's driving the creation
 of the IMAP/ACAP standards?  Does it let you
 store your mail on a server and replicate that to
 a couple of different machines (say your desktop and
 your laptop) so you can read and respond to mail "offline"
 and from *either* system?



Yeah, more or less.  If you save the mail on your server to local
folders or make a local folder be /me@other.mail.host:/usr/spool/me.
Using ange-ftp to me seem exactly like IMAP in Pine or Netscape
communicator 4.0b2. Though apparently IMAP will update folders across
hosts so that only that mail deleted locally (while offline) will get
deleted on the remote host on the next login etc. etc. I don't know
much about IMAP's technical standard either but find I get equal mail
management capability from ange-ftp/VM. (equal to Pine and
Communicator so far).

WARNING: In a week or so when I get time I'm gonna ask you a tricky
question about emacs and xemacs.



  Feel free.  Of course I do know a bit more about emacs
  than I do about X -- so you may not like my answer much.



Heh heh OK...


(comp.emacs.xemacs is silent on this).  Emacs running as emacs -nw in
a tty (i.e console or an xterm) runs fine and lets me use all the job
control commands (suspend/fg etc) but with Xemacs job control won't
work unless I'm running as root. That is if I'm running "xemacs" or
"xemacs -nw" in an xterm or at the console and do C-z and then once
I'm done in the shell I do "fg", xemacs comes back but the keyboard
seems to be bound to the tty/console settings (Ctrl-z Ctrl-s Ctrl-q
etc all respond as if I were in a dumb terminal).  The only recourse
is to Ctrl-z back out and kill xemacs. This does not happen if I run
xemacs setuid root (impractical/scary) or as root (scary).  Something
somewhere that requires root permission or suid to reset the tty
characteristics doesn't have it in xemacs - but does in emacs...

My only response so far has been that "you'll have to
rebuild/recompile your xemacs" - but surely this wrong. Does anything
more obvious occur to you? I feel it must be something simple in my
set up (RH Linux 2.0.29). Of course if I could get this fixed I'd
start feeling more comfortable not having GNU-Emacs on my machine ;-)
 which may not be an outcome you would favour.



        I once had a problem similar to this one -- suspending
        minicom would suspend the task and lock me out of it.

        It seemed that the ownership of the tty was being
        changed.

        So -- the question comes up -- what permissions are set on
        your /dev/tty* nodes.  It  seems that most Linux distributions
        are set up to have the login process chown the these to to the
        current user (and something seems to restore them during or after
        logout).

        I don't know enough about the internals of this process.
        I did do a couple of experiments with the 'script' command
        and 'strace' using commands like:

                strace -o /tmp/strace.script /usr/bin/script

        ... and eyeballing the trace file.  This shows how the
        script command (which uses a psuedo tty -- or pty) searches
        for an available device.

        I then did a simple 'chown 600 /dev/ttyp*' as root
        (this leaves a bunch of /dev/ttyq* and /dev/ttyr nodes
        available).  The 'script' command then reports that
        the system is "out of pty's."

        Obviously the script command on my system don't
        do a very thorough search for pty's.  It effectively
        only looks at the first page of them.

        The next test I ran was to add a new line to my
        /etc/services file (which I called stracetel) -- and
        a new line to me /etc/inetd.conf that referred to it.

        This line looks like this:

stracetel  stream  tcp     nowait  root    /usr/sbin/tcpd  \
        /usr/bin/strace -o /root/tmp/t.strace /usr/sbin/in.telnetd

        ... all on one line, of course.

        Then I connected to that with the command:

                        telnet localhost stracetel

        This gives me an strace of how telnetd handles the
        allocation and preparation of a pty.  Here, as I suspected,
        I saw chown() and chmod() calls after telnetd did it's
        search through to list of pty's to find the first one.

        Basically both programs (and probably most other
        pty clients) attempt to open each pty until one returns
        a valid file descriptor or handle.  (It might be nice
        if there was a system call or a daemon that would allow
        programs to just say "give me a pty" -- rather than forcing
        a flurry of failed open attempts -- but that's probably too
        much to ask for.

        There result of these experiments suggests that there
        are many ways of handling pty's -- and some of them may
        have to be set as compile time options for your system.

        It may be that you just need to make all the pty's
        mode 666 (which they are on my system) or you might
        chgrp them to a group like tty or pty, make them mode
        660 and make all the pty using programs on your system
        SGID.

        I've noticed that all of my pty's are 666 root.root
        (my tty's  root.tty and ttyS*'s are root.uucp all are
        mode 660 and all programs that need to open them are
        either root run (getty) or SGID as appropriate).

        Some of the policies for ownership and permissions are
        set my your distribution.  Red Hat 2.x is *old* and
        some of these policies may have changed in the 3.03 and
        4.1 releases.  Mine is a 3.03 with *lots* of patches,
        updated RPM's and manually installed tarballs.

        Frankly I don't know *all* of the security implications
        of having your /dev/tty* set to mode 666.  Obviously
        normal attempt to open any of these while they're in
        use return errors (due to the kernel locking mechanisms).
        Other attempts to access them (through shell redirection,
        for example) seem to block on I/O.  I suspect that a
        program that improperly opened it's tty (failed to
        set the "exclusive" flag on the open call) would be
        vulnerable.


   Since you're an emacs fan -- maybe you can tell me --
      is there an mh-e/Gnus IMAP client?




No Kyle Jones (VM maintainer/author) has said maybe IMAP4 for VM
version 7.  I think his idea is to make VM do it what it does well and
rely on outside packages to get the mail to it ...



  Also -- isn't there a new release of ange-ftp --
  I forget the name -- but I'm sure it changed named too.


 Yes it's called EFS - it preserves all the functionality but is more
 tightly meshed with dired - supposedly it will be easier to use EFS in
 other elisp packages (I don't know why or how this would be so).



        I'll have to play with those a bit.
        Can VM handle mh style folders?

--
Jim

  __________________________________________________________________________
                                       




  UUCP Questions

 
From: David J. Weis, weisd3458@uni.edu



I had a couple minor questions on UUCP. If you have a few minutes, I'd
appreciate the help immensely. I'll tell you a little bit about what we're
doing.




Glancing ahead -- I'd guess that this would take quite a bit
more than a few minutes.


My company has a domain name registered (plconline.com) and two offices.
One is the branch office which is located in the city with the ISP. The
head office is kind of in the sticks in western Iowa. I've been
commissioned to find out how difficult it would be to set up the uucp so
the machine in Des Moines (the big city ;-) would grab all the domain mail
and then possibly make a subdomain like logan.plconline.com for all the
people in the main office to use email.

This would all be running on RedHat 4 over dialup uucp. The system in Des
Moines uses uucp over tcp because it has to share the line with
masquerading, etc.

Thanks for any advice or pointers you have.




Unfortunately I this question is too broad to answer
via e-mail.  O'Reilly has a whole book on uucp and
there are several HOW-TO's for Taylor UUCP and
sendmail under Linux.

        My uucp mostly works but I haven't configured it to
run over TCP yet.  I also haven't configured my
system to route to any uucp hosts within my domain.

        You can address mail to a uucp host through a
DNS by using the '%' operator.  For example I can
get my main mail system (antares.starshine.org) to
forward mail to my laptop using an address like:

        jim%mercury@starshine.org

        ... the DNS MX record for starshine.org routes
mail to my ISP.  My ISP then spools it up in UUCP
until my machine (antares) picks it up.  The
name antares is basically transparent to most of
this process.

        When antares gets the mail it converts the
percent sign into a "bang" (!) and spools it
for mercury (which happens to be my laptop).

        Obviously requiring all of your customers and
correspondents to use percent signs in their addressing
to your users is not going to work very well.  It will
probably result in alot of lost mail, alot of complaints
and a constant barrage of support calls.

        There are two ways to make your internal mail routing
transparent to the rest of world.  You can create a
master aliases list on your mail hub (the easy way) or
you can create DNS and MX entries for each of the hosts.

        If you'd like more help we could arrange to talk on
the phone.  UUCP is difficult to set up for the first
time (nearly vertical initial learning curve).  Once it's
set up it seems to be pretty low maintenance.  However
my meta-carpus can't handle explaining the whole process
via e-mail (and I don't understand enough of it well to
be brief).


--
Jim


  __________________________________________________________________________
                                       




  Using MS-DOS Floppies

 
From: Barry, remenyi@hotmailcom


Hi, I have a problem that I can't find the solution to:

I run Redhat 4.1 with mtools already installed, with it, I can copy a
file to or from a dos disk in A: with mcopy etc..
But if I change the disk & do mdir, it tells gives me the listing of
what was in the last disk.  The only solution is to wait hours for the
cache to expire before I can look at another disk.

The problem occurs no matter how I access the floppy, I also tried using
dosemu, and mount, but I have the same problem.  I can read and write
from the first disk that I put in with no problems, but if I change the
disk, the computer acts as if the first disk is still in the drive.  It
also doesn't matter who I am loged in as eg. root has the same problem.
I also upgraded mtools to 3.3 but no change.

Is there some way to disable the disk cache (I assume thats the problem)
for the floppy drive?



You probably have a problem with the "change disk" detection
circuitry on your floppy.

        There's a pretty good chance that you'd see the same thing
under DOS too.

        Unfortunately I don't know of an easy way to solve this
problem.  You could try replacing the floppy ($30 or so)
the controller ($20 -- to ???) and/or the cable.

        If that's not feasible in your case you could try something
like a mount/sync/umount (on a temporary mount point).
This might force the system to detect the new floppy.  It's
very important not to try to write anything to a floppy when the
system is confused about which floppy is in there.

        DOS systems that I have used -- while they were afflicted
with this problem -- sometimes severely trash the directories
on a diskette in that situation.

        It probably doesn't even matter if the mount, sync, umount
that I describe fails -- just so the system is forced to
"rethink" what's there.  I'd consider writing a short script
to do this -- put a temporary mount point that's "user" accessible
to avoid having to be root to do this (and especially to avoid
having to create any SUID root perl scripts or write a C wrapper
or any of that jazz).

        Here's a sample line for your /etc/fstab:

# /etc/fstab
/dev/fd0                  /mnt/tmp       umsdos  noauto,rw,user 0 0

        (according to my man pages the "user" options should
imply the nosuid, nodev etc. options -- which prevent
certain other security problems).

        So your chdisk script might look something like:

        #! /bin/sh
        /bin/mount /mnt/tmp
        /bin/sync
        /bin/umount /mnt/tmp

        ... you could also just do a 'mount /mnt/tmp' or a
'mount /mnt/a' or whatever you like for your system --
and just use normal Linux commands to work with those
files.  The mtools are handy sometimes -- but far from
indispensable on a Linux system with a good fstab
file.

        As a security note:  mount must be SUID in order to
allow non-root users to mount filesystems.  Since
there have been security exploits posted on mount
specifically and various other SUID files chronically,
I suggest configuring mount and umount such that they
can only be executed by members of a specific group
(like a group called "disk" or "floppy").  Then you
can add yourself and any other users who have a valid
reason to work at your console to that group.  Finally
change the permissions on mount and umount to something
like:

        -r-sr-x---  1  root    disk  .... /bin/mount

        .... i.e. don't allow "other" to execute it.

        This also applies to all your SVGALib programs (which
should not be executed except from the console) and
as many of your other SUID programs as you can.

        (... it would be nice to do that to sendmail -- and
I've heard it's possible.  However it's a bit trickier
than I've had time to mess with on this system).

        As PAM (pluggable authentication module) technology
matures you'll be able to configure your system to
dynamically assign group membership's based on
time of day and source of login (value of `tty`).

        This will be nice -- but it doesn't appear to be
quit ready yet.


--
Jim



I just wanted to write to thank you for you response to my mail.
I did as you suggested and the problem is solved!



Actually, you were also right about the problem occurring in DOS as
I used to have a lot of floppies go bad before I went all the way
to linux, but I didn't make the connection.


Anyway, thanks again, you've made my day!

Barry


        You're welcome.  I'm glad it wasn't something complicated.
BTW: which suggestion worked for you?  Replacing one or
another componenent?  Or did you just use the "mount, sync,
umount" trick?

        Under DOS I used to use Ctrl-C, from the COMMAND.COM A:
prompt to force disk change detection.  You can use that
if you still boot this machine under DOS for some work.

--
Jim

  __________________________________________________________________________
                                       




  inetd Questions

 
From: Benjamin Peikes, benp@npsa.com


Answer guy,


  I have two questions for you.

        1) I'm using one machine with IPAliasing and was wondering if
   there is a version of inetd built so that you can have different
   servers spawned depending on the ip number connected to.



That's an excellent question.

There is apparently no such feature or enhanced version of
inetd or xinetd.

        It also doesn't appear to be possibly to use TCP Wrapper
rules (tcpd, and the /etc/hosts.allow and /etc/hosts.deny)
to implement this sort of virtual hosting.

        So far it appears that all of the support for virtual hosting
is being done by specific applications.  Apache and some other
web servers have support for it.  The wu-ftpd's most recent
versions support it.

        I suspect that you could create a special version of
inetd.conf to open sockets on specific local IP addresses
and listen on those.  I would implement that as a command
line option -- passing it a regex and/or list of ip addresses
to listen on after the existing command line option to
specify which configuration file to use.  Then you'd load
different copies of this indetd with commands like:

        /usr/sbin/inetd /etc/inetd.fred 192.168.14.0 17.18.0.0
/usr/sbin/inetd /etc/inetd.barney barneyweb
/usr/sbin/inetd /etc/inetd.wilma 192.168.2.3

        (This would be something like -- all of the 192.168.14.*
address and all of the 17.18.*.* addresses are handled by
the first inetd -- all of the access to a host named
barneyweb (presumably looked up through the /etc/hosts file)
would be handled by the next inetd. and all of the accesses
to the ipalias 192.168.2.3 would be handled by the last one)

        This would allow one to retain the exact format of the
existing inetd files.

        However I don't know enough about sockets programming to
know how much code this would entail.  The output of
'netstat -a' on my machine here shows the system listening
on *:smtp and *:telnet (among others).  I suspect that those
stars would show up different if I had a socket open to
a specific service on a specific service.

        This scheme might use up to many file descriptors.  Another
approach would be to have a modified tcpd.  This would have
to have some option where by the destination *as well as*
the source was matched in the /etc/tcpd.conf file(s).

                (Personally I think that tcpd should be compiled
         with a change -- so that the single tcpd.conf
         file is used in preference to the /etc/hosts.allow
         and /etc/hosts.deny files.  Current versions do
         support the single conf file -- but the naming is
         still screwy).

        I'm not sure quite how Wietse would respond to this --
possibly by repeating the question:

                "If you want me to add that -- what should I
        take OUT?"

        (which is what he said one to me when I suggested merging
his chrootuid code with tcpd).

        I've blind copied Wietse on this (Hi!).  I doubt he has
time to read the Linux Gazette.


2) A related problem: I have one machine running as a mail server
   for several domains where the users are using pop to get their
   mail. The problem is that the From: line always has the name
   of the server on it. Is there a way to use IPaliasing to fix
   this? Or do I have to muck around with the sendmail.conf file?


        This is becoming a common question.

        Here's a couple of pointers to web sites and FAQ or HOWTO
documents that deal specifically with "Virtual Mail Hosting"
     * How to Set up Sendmail for Virtual Domains
     * qmail: A Replacement for Sendmail

                   (look for references to "virtualdomains")

        ... and here's one guide to Virtual Web Hosting:
     * Virtual Web Mini-HOWTO



I guess the best way to do this would be to change inetd to figure
out on which interface the connection has been made on and then
pick the correct inetd.conf to reference, like

inetd.conf.207.122.3.8
inetd.conf.207.122.3.90


        I would recommend that as a default behavior.
        I suggested adding additional parameters to the
        command line specifically because it could be done
        without breaking any backward compatibility.  The
        default would be to simply work as it does now.

        I still suspect that this has some scalability problems
        -- it might not be able to handle several hundred or several
        thousand aliased addresses.

        I might still be useful to implement it as a variation of --
        or enhancement to -- tcpd (TCP_Wrappers).


I think that inetd reads in the configuration file when it
starts because it needs a SIGHUP to force it to reread the conf
file. All you would have to do is make it reference the right table.



        This is also documented in the inetd man page.


Do you know where I could find the code? I would be interested
in looking at it?



        The source code from inetd should be in the bundle
        of sources that comes with the "NetKit"

        Look to:

ftp:..ftp.inka.de/pub/comp/Linux/networking/NetTools/

        and mirrored at:

ftp://sunsite.unc.edu/pub/Linux/system/network/NET-3-HOWTO/

        ... this includes the history of it's development and the
        names of people who were active in it at various stages.

        If you're going to try to hack this together -- I'd suggest
        a friendly posting to the comp.linux.development.system
        newsgroup -- and possibly some e-mail to a couple of
        carefully chosen people in the NET-3-HOWTO.

--
Jim

  __________________________________________________________________________
                                       




  Navas Modem FAQ

 
From: John Doe


The next time you answer a modem question, you'd do well
to recommend reading of the very good Navas Modem FAQ at
http://www.aimnet.com/~jnavas/modem/faq.html/


Well, here's someone who wants to make a anonymous
tip to "The Answer Guy."


At "John Doe's" request I looked over this site.  It
does have extensive information about modems -- including
lots of press releases about which companies are acquiring
each other (3Com over US Robotics, Quarterdeck gets DataStorm).

However there didn't appear to be any references to Linux,
Unix or FreeBSD.

So -- if one needs information about modems in general this
looks like an excellent site to visit.  However it the question
pertains specifically to using your modem with Linux -- I'd
suggest:

        http://sunsite.unc.edu/LDP/HOWTO/Serial-HOWTO.html


--
Jim

  __________________________________________________________________________
                                       




  Setting Up a Modem

 
From: Yang, lftian@ms.fudan..edu.cn

        I have an AT 3300 card( from Aztech) which integrates the function of
sound card and 28.8K modem. It seems that it need a special driver for its
modem function to be work. In MSDOS, there is a aztpnp.exe for that
purpose. Do you know is there any way I can get the card work (at least its
modem function) in Linux?

Tianming Yang


        I'm not familiar with that device.  The
        name of the driver suggests that this is a
        Plug 'n Play (pnp) device (sometimes we use the
        phrase "plug and *pray*" -- as it can be a toss
        of the dice to see if they'll work as intended.

        My guess would be that this is a  PCMCIA card
        for a laptop system (which I personally pronounce
        "piecemeal").

        Did you look in the "Hardware HOWTO" (start at
        www.ssc.com, online mirror of FAQ's and HOWTO's)?

        Did you go to Yahoo! and do a keyword search on
        the string:

                        linux +aztech

        ... (the plus sign is important there)?

        Since all of the real details about the configuration
        of the card are determined by the manufacturer
        (Aztech in this case) I would start by contacting
        them.

        If they've never heard of Linux -- or express no
        interest in supporting it -- please consider letting
        them know that Linux support affects your purchasing
        decisions.  Also let them know that getting support
        for Linux is likely to cost them very little.
        

        How to get a Linux driver for your hardware:

                If you are a hardware company that would like
                to provide support for Linux and FreeBSD and other
                operating systems -- but you don't have the
                development budget -- just ask.

                That's right.  Go to the comp.os.linux.development.system
                newsgroups and explain that you'd like to provide
                full documentation and a couple of units of your hardware
                to a team of Linux programmers in exchange for a freely
                distributable driver.  Be sure to make the sources for
                one of your other drivers (preferably any UNIX, DOS, or
                OS/2 driver) available to them.

                If you don't like that approach, consider publishing the
                sources to your existing drivers.  If you are really in
                the hardware business than the benefits of diverse OS
                support should far outweigh any marginal "edge" you might
                get from not letting anyone see "how you do it."

        (Just a suggestion for all those hardware vendors out there).

--
Jim

  __________________________________________________________________________
                                       




  User Identification
 
From: Dani Fricker, 101550.3160@CompuServe.COM


i need your help. for some reasons i have to identify a user on my
webserver by his/her ip-address. fact is that users logon comes from
different physical machines. that means that i have to assign something
like a virtual ip-address to a users log name. something like a reversal
masquerading.


        The IP Address of any connecting client is provided
        to any CGI scripts you run, and is stored in the
        server's access log (or a reverse DNS lookup of it
        is stored therein -- depending on your httpd and
        configuration).

                * Note:  I suggest disabling reverse DNS
                  lookup on webserver wherever possible.
                  it generates alot of unnecessary traffic
                  and you can isolate, sort, and look up the
                  IP addresses in batches when you want to
                  generate statistics involving domain names.

                  (I also tend to think that most of the
                   reports done on web traffic logs have about
                   as much rigor and resemblance to statistical
                   analysis as reading chicken entrails).


my ip-gateway connects my inner lan over two token ring network cards
(sorry, not my idea!) with the internet (lan  tr0  tr1
internet). the masquerading forward roule of ipfwadm gives me the
possibility to indicate a source and a destination address.



        Oh.  So all of the clients that you're interested in
        are on a private LAN and going through a masquerading/NAT
        server (network address translation).

        I would try using ident for starters.  Run identd on your
        Masquerade Host and make calls to the ident service from
        your CGI scripts.  I don't think it will work -- but it
        should be worth a little info.

        From there you might be able to configure all the clients
        on the inner LAN to use an *applications* level proxy
        (squid -- formerly cached, CERN httpd, or the apache cache/
        proxy server).  Masquerading can be thought of as a
        "network layer proxying services" while SOCKS, and similar
        services -- which work with the co-operation of the client
        software -- are applications layer proxies.

        I don't know if the private net IP address or other info
        will propagate through any of these HTTP proxies.

        If this is *really* important to you, you could consider
        writing your own "NAT Ident" service and client.  I don't
        know how difficult that would be -- but it seems like the
        code for the identd (and the RFC 931? spec) might give you
        a starting point for defining a protocol (you might want
        to secure that service under TCP_Wrappers).  You might want
        to consider making this a TCP "Multiplexed" service --
        look for info on tcpmux for details about that.

        The gist of tcpmux is that it allows your custom client
        to talk to a daemon on TCP port 1 of the server host and
        ask for a service by name (rather than relying on
        "Well-Known Port Addresses").  So, if you're going to create
        a new service -- it makes sense to put it under tcpmux
        so you don't pick your own port number for it -- and then
        have the IANA assign that port to something else that you
        might want later.

do you see a possibility for an 'address assignment' between the two
interfaces? if you do please let me know.


        I don't know of any existing way to determine the IP
        address of a client on the other side of any NAT/masquerading
        host -- I'm not even sure if there's any existing way to do it
        for a client behind a SOCKS or TIS FWTK or other applications
        level proxy.

        I'll be honest.  With most "Answer Guy" questions I
        do some Yahoo!, Alta-vista and SavvySearch queries -- and
        ask around a bit (unless I already know the answer pretty
        well -- which doesn't happen all that often these days).
        I skipped that this time -- since I'm pretty sure that
        there's nothing out there that does this.

        I welcome any corrections on this point.  I'll be happy
        to forward any refutations and corrections to Dani.

        All of this begs the greater question:

                What are you really trying to do?

        If you are trying to provide some form of transparent
        access control to your webserver (so local users can
        see special stuff without using a "name and password")
        -- there are better ways available.

        Netscape and Internet Explorer both support a form
        of client-certificate SSL -- which is supported at
        the server side by the Stronghold (commercial Apache)
        server.

        As an alternative -- I'd look at the possibility of
        finding or writing a Kerberos "auth" module for
        Apache (and deploying Kerberos to the clients).
        This might be more involved than you're management
        is willing to go for -- but writing new variations of
        the indentd service might also fall into that category.

        IP addresses are a notoriously bad form of access
        control.  If you have a properly configured set of
        anti-spoofing rules in the packet filters on your
        router -- and you can show that no other routes exist
        into your LAN -- then you can base access controls to
        services (TCP/Wrappers) to about the granularity of
        "from here" and "not from here."  Attempting to read
        more into them than that is foolhardy.

        Ethernet and Token Ring MAC (media access control) addresses
        (sometimes erroneously called "BIA's" -- burned in addresses)
        are just about as bad (most cards these days have options to
        over-ride the BIA with another MAC -- usually a feature of
        operating the card in "promiscuous" mode).

        Yet another approach to the problem might be to simply
        put a web server on the internal LAN (no routing through
        the NAT/masquerading host) -- and use something like
        rdist to replication/mirror the content between the
        appropriate document trees on the internal and exterior
        web servers.

        Basically we'd need to know much more about your
        requirements in order to give relevant recommendations.



--
Jim

  __________________________________________________________________________
                                       




  Duplicating a Linux Installed HD
 
From: Mohammad A. Rezaei, rezaei@tristan.TN.CORNELL.EDU


I just read your response to duplicating a hard drive using dd.
I think using dd limits the uses of this technique too much.



        I absolutely agree.  I wonder where I suggested 'dd'
        without expressing my misgivings.

        Please consider quoting little portions of my posting
        when making references to them -- I write alot and
        can't remember past postings without some context.


I have more than once installed/transfered entire hard drives using
tar. simply put both drives in the same machine, mount the new drive
in /mnt and do something like

tar -c -X /tmp/excludes -f / | (cd /mnt; tar xvf -)
        The file....

/tmp/excludes should contain:

        /mnt
        /proc
 and any other non-local, mounted drives, such as nfs mount points.




        There are better ways to do this.

        One way is to use a command like:

                find ... -xdev -type f | tar cTf - - | \
                        (cd ... && tar xpf - )

        Another is to use:

                find ... | cpio pvum /new/directory

        ... which I only learned after years of using
        the tar | (cd ... && tar) construct.


        In both of these cases you can use find parameters
        to include just the files that you want.  (Note:
        with tar you *must* prevent find from printing any
        directory names by using the -type f (or more
        precisely a \! -type d clause) -- since tar will
        default to tar'ing any directories named in a
        recursive fashion).

        The -T (capital "tee") option to GNU tar means to
        "Take" a list of files as an "include" list.  It
        is the complement to the -X option that you list.

        You can also pipe the output of your find through
        grep -v (or egrep -v) to filter out a list of
        files that you want to exclude.


finally, one has to install the drive onto the new machine,
boot from floppy and run lilo.

The disks don't have to be identical. the only disadvantage is having
to run lilo, but that's takes just a few minutes.



        The only message I can remember posting about 'dd'
        had an extensive discussion of using tar and cpio for
        copying trees.

        Am I forgetting one -- or did you only get part of
        my message?



Hope this helps.



        Hopefully it will help some readers.  The issues of
        copying file trees and doing differential and
        incremental backups is one that is not well covered in
        current books on system administration.

        When I do a full backup I like to verify that it
        was successful by extracting a table of contents or
        file listing from the backup media.  I then keep a
        compressed copy of this.  Here I use tar:

                tar tf /dev/st0 | gzip > /root/tapes.contents/.....

        .... where the contents list is named something like:

                antares-X.19970408

        .... which is a hostname, a volume (tape) number and a
        date in YYYYMMDD format (for proper collation -- sorting).

        To do a differential I use something like:

                find / -newer /root/tape.contents/....  \
                        | egrep -v "^(/tmp|/proc|/var/spool/news)" \
                        | tar czTf - /mnt/mo/diff.`date +%Y%m%d`.tar

        ... (actually it's more complicated than that since
        I build the list and compute the size -- and do some
        stuff to make sure that the right volume is on the
        Magneto Optical drive -- and mail nastygrams to myself
        if the differential won't fit on that volume -- if the
        volume is the most recent one (I don't overwrite the
        most recent -- I rotate through about three generations)
        -- etc).

        However this is the core of a differential backup.
        If you wanted an incremental -- you'd supply a different
        file to the -newer switch on your find command.

        The difference between differential and incremental is
        difficult to explain briefly (I spent about a year
        explaining it to customers of the Norton Backup).  Think of
        it this way:

                If you have a full -- you can just restore that.

                If you have a full, and a series of differentials,
                you can restore the most recent full, and the
                most recent differential (any older fulls or differentials
                are unneeded)

                If you have a full and a series of incrementals you
                need to restore the most recent full, and each
                subsequent incremental -- in order until the most
                recent.

        It's possible (even sensible in some cases) to use a
        hybrid of all three methods.  Let's say you have a large
        server that takes all day and a rack full of tapes to do a
        full backup.  You might be able to do differentials for
        a week or two on a single tape per night.  When that fills
        up you might do an incremental, and then go back to
        differentials.  Doing this to a maximum of three incrementals
        might keep your all day backup marathons down to once a month.
        The restore must go through the "hierarchy" of media in the
        correct order -- most recent full, each subsequent incremental
        in order, and finally the most recent differential that was
        done after that.

        (Personally, I avoid such complicated arrangements like the
        plague.  However they are necessary in some sites.)




-- Jim



  __________________________________________________________________________
                                       


                     Copyright � 1997, James T. Dennis
            Published in Issue 17 of the Linux Gazette May 1997
                                      



  __________________________________________________________________________
                                       



[ TABLE OF CONTENTS ] [ FRONT PAGE ]
Back 
Next 

    "Linux Gazette...making Linux just a little more fun!"



  __________________________________________________________________________
                                       




        CLUELESS at the Prompt: A Column for New Users By Mike List,
                             troll@net-link.net
                                      
  _______________________________________________________________________
                                      
                                  [INLINE]
                                      
  Welcome to installment 4 of Clueless at the Prompt: a new column for new
                                   users.
  _______________________________________________________________________
                                      
 Connecting to a Second ISP...or Third, orI recently got e-mail from a guy
    who wanted to know how to connect to a second ISP.His e-mail address
  apparently wasn't valid, and it got bounced back several times. Just as
 well, since I didn't have the answer at that point. Well, I got this idea,
            and I tried it and it works.Here's the deal: First,
 cp /usr/sbin/ppp-on to /usr/sbin/ppp-on.anysuffix

   Then open the file you just created with a text editor, and change any
information that applies to the secondary ISP, eg. dialup, the IP number of
  the ISP, username and password. write the file(save it) and try your new
executable, ppp-on.anysuffix. Just a quick pointer, you could call your new
script any name you want as long as there's no other file with the same name
      in your path,preferably no other file with the same name at all
  _______________________________________________________________________
                                      
                         Dealing With a Dynamic IP
                                      
These days most Internet Service Providers assign you a Dynamic IP when you
logon to their network, due to the cost of assigning every customer a static
IP. At present there are only so many IP addresses available and, apparently
  each one costs to register. Consequently ISPs buy a pool of IP addresses
within a range and assign an available one at login. For most uses, such an
  arrangement is no problem, assuming that most internet usage consists of
interaction between the ISP's computer and the local one. For some purposes,
 however such as allowing telnet or ftp to your computer the dynamic scheme
is less than ideal. Here's a relatively painless way to get your current IP,
     so you can run with the big dogs. Open an xterm, or rxvt and type:
 ifconfig

which will bring up some info in two blocks. You'll want to note the bottom
  block, which will have a line that specifies your inet address expressed
 numerically. It will be in a xxx.xxx.xxx.xxx format, which corresponds to
the standard IP address, in fact that's what it is. you ca write this number
        down or just highlight this IP address(to paste it)and type:
nslookup the.num.ber.

the number being your inet address from the last step. It may take a couple
      of minutes, but you will get a two line messagethat looks like:
Name:   your Fully Qualified Domain Name
                Address: IPa.ddr.ess.!!!

we may talk about FQDN some more another time, but for the purpose at hand,
                                 just type:
hostname Name

where Name is the first line from the above step. That's it, except that you
must repeat this procedure every time you connect to your ISP. You might be
able to write a script to automate this procedure, but in the meantime which
 as my friend Al used to say "is a groovy time", you can use this knowledge
to run remote X apps(just a minute,I'm coming to that) allow your friends or
 inet associates to telnet to your computer, or ftp files from a telnetted
  site(this too, momentarily).What you need to know is that the next time
 youreboot, you may get a message saying that your computer name is "bad".
 This isn't a comment on your lack of originality or taste, and you should
                            basically ignore it.
  _______________________________________________________________________
                                      
Using your Domain NameIf you have a shell account at a computer located at a
university or school near you, this will amaze you. Oh yeah not, by way of a
  plug, but there is a semi commercial telnet box called linuxware.com(you
   will have to look up the URL yourself semi- plug, you might say, I'm a
  subscriber) What am I talking about? Using X to run apps from the remote
computer on your screen. You can actually run a program that isn't installed
  on your computer, in X with the remote computer supplying the program. I
think it embodies the essence of networking, with permissions set right, you
  can co-author a document, play a multi-user game (MUD)use a talkprogram,
like ytalk, or do office or school work from your home computer.Here's what
you need to do. First, you need to know and have your FQDN listed by typing:
hostname

   as detailed above. If you have a static IP address, you can skip this
                step.What needs to be done next is to type:
xhost + the.telnet.box

  When you hit enter you will see a message like, "the.telnet.box has been
 added to the control list". You will probably have to restart your window
 manager, your mileage may, as they say, vary. Now when you start a telnet
  session, you can enter the name of an X application and in a moment, the
  application window will apear on your screen, even if you don't have it
installed on your computer. Do your work, play your game, and marvel at the
                     ramifications of this capability.
                                      
 You can also invite friends and coworkers over to your computer to do some
  work, socialize or learn something, in the following manner. Obtain your
 FQDN, or IP address, as detailed above. E-mail it to them or call them on
  the phone to let them know where you are today(Not where you want to go
                today, that's another "OS"). they can then:
 telnet FQDN  or  ftp IPa.ddr.ess.!!!

and all of a sudden they're in your den, or office or wherever you keep your
 computer. For more sophisticated methods of getting your address, read the
   "Dynamic IP hacks-HOWTO. Just a Reminder: Read the whole Linux Gazette
                                      
This esteemed tabloid is just full of novice- to intermediate level tips and
     tricks.The Answer Guy, Two Cent Tips, and The Weekend Mechanic in
  particular, are good sources of the kinds of things that will make you a
                        demi-guru in no time at all.
  _______________________________________________________________________
                                      
                      Formatting Floppy Disks in Linux
                                      
   In DOS and Windows,formatting a floppy disk is a one shot affair which
  formats, erases data, and creates a file system on the floppy. In linux
however, you have to format and create the filesystem in separate steps. At
      first glance, this seems backward, after all, isn't linux a more
sophisticated OS? Why do things in two steps that the others do in one? The
reason is that linux can read several filesystems so that data can be moved
 from one OS to the other. By mounting the floppy drive as MSDOS, VFAT, or
other filesystem type the data can be read from the mount point in a manner
                        that linux can make use of.
  _______________________________________________________________________
                                      
            Other Stuff I've Collected/Found out Since Last Time
                                      
                           have trouble with the
 find

  command?Try leaving your computer on overnight, and the next day use the
locate /filename |less

command instead. Locate is a database that is gathered during idle times on
your computer Actually locate reads a database that is updated by a command
in your system files, but if you give it time to breathe, usually overnight,
       it can locate any file on your hard drive(s). You can also try
 whereis filename

              and you will get a location for the named file.
  _______________________________________________________________________
                                      
 Next Time- Let me know what you would like to see in here and I'll try to
oblige just e-mail troll@net-link.net me and ask, otherwise I'll just write
             about what gave me trouble and how I got past it.
                                      
                              TTYL, Mike List
                                      
  _______________________________________________________________________
                                      
                        Copyright � 1997, Mike List
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
  _______________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
  _______________________________________________________________________
                                      
                                  [INLINE]
                                      
                  By Jesper Pedersen, blackie@imada.ou.dk
                                      
     _________________________________________________________________
                                      
      In this article I will describe a configuration tool called The
   Dotfile Generator (TDG for short). TDG is a configuration tool, which
     configures programs, using X11 widgets like check boxes, entries,
                            pull-down menus etc.
                                      
   For TDG to configure a given program a module must be made for it. At
     the moment modules exist for the following programs: Bash, Fvwm1,
                     Fvwm2, Emacs, Tcsh, Rtin and Elm.
                                      
   The article will describe common use of TDG, so if you do not have it
   yet, it might be a good idea to download it (It's free!) You may also
   go to the home page of the Dotfile Generator for further information.
                                      
     _________________________________________________________________
                                      
                                   Intro
                                      
    The UNIX system, was developed many years ago, long before graphical
      user interfaces became commonplace. This means that most of the
      applications today work fine without a graphical user interface.
                  Examples of this are editors and shells.
                                      
    A basic concept in UNIX is that the programs are very configurable.
              Here is an example from Emacs, which shows this:
                                      
     What should be done if the user asks to go to the next line at the
     of a file?
     There are two logical possibilities:
    1. Insert a blank line, and move to it.
    2. Beep, to tell the user that there is no next line.
       
     Instead of implementing only one of the solution the people behind
     Emacs, have chosen to implement both, and let you decide which one
     you prefer.
     
       Since the program works without a GUI, the standard method for
    configuring such options is to use a dot-file. In this file, you may
                    program, which method you will use.
                                      
      This solution, however, requires that the user has to learn the
     programming language used in the dot-file, and has to read lots of
   documentation to find out which configurations can be made. This task
     may be difficult and tedious, and for that reason many users often
          choose to use the default configuration of the program.
                                      
    If you take a look at some dot-files, you may find that most of the
          configurations can be described by the following items:
     * Configurations with two possibilities (like above)
     * Configuration, where the program wishes to know a number or text.
       Examples of this could be questions like: how many times should
       one press CTRL-d to quit, and email address to use in reply-to
       field.
     * Configuration, where the user may choose an option from a list,
       eg:
       which editor would you like to use: emacs, jed, vi or vim
       
      The configurations above may easily be done with a GUI, with the
     following widgets in order: A check box, an entry and a pull down
                 menu. This is exactly what is done in TDG.
                                      
     _________________________________________________________________
                                      
                          The basic concept of TDG
                                      
     TDG is a tool, which configures other programs (eg. emacs,bash and
      fvwm) with widgets as those described above, and many more. The
   widgets are placed in groups, which makes it easy to find the correct
     configuration without having seen it before. And most important of
    all, help is located at the configuration of each option, instead of
     in a manual far away. To get help, you just press the right mouse
     button on the widget, which contains the configuration you want to
                              know more about!
                                      
         When you start TDG, you will be offered a list of standard
   configurations, where you may pick one to start out with. This may be
   convenient, if you do not have a dot-file for the given program, or if
    you would like to try a new configuration. If on the other hand, you
     already have a dot-file, which you would like to put the finishing
   touches to, you may read this file into TDG. Note, however, that it is
    not all modules, which have the capability to read the dot-file (the
    fvwm2, rtin and elm modules have, the other modules do not, since it
             would be to complicated to create such a parser.)
                                      
   When you have selected a start-up configuration, the menu-window will
    be displayed (see figure 1). In this window, you can travel through
      the configuration pages, just like a directory structure. If you
   select a page, a new window will be displayed, with the configuration
    for this page (see figure 2). This window will be reused for all the
    configuration pages, ie. only one configuration page is visible at a
          time, so you do not have to destroy the window yourself.
                                      
                                  [INLINE]
                                      
                              Figure 1[INLINE]
                                      
   Figure 2In region 1, the actual configuration is located. Region 2 is
   the help region. In this region help for the whole page is shown, when
      the window is displayed. It's also here, help for the individual
    configuration is shown, when you press the right mouse button on one
                              of the widgets.
                                      
   In region 3, information is shown on what will be generated. You have
                            three possibilities:
    1. You may generate all pages. This is the most natural thing to do,
       when you just want a configuration for a given program.
    2. You may generate just the page shown. This is useful if you are
       plying around with TDG to see what will be generated for the
       different configurations.
    3. Finally you may tell TDG, to just generate some of the pages,
       which is done with radio buttons in this region.
       
   In the Setup->Options menu, you may select which of the three methods
                            above will be used.
                                      
   When you have done all the configurations, you have to tell TDG which
       file you wish to generate. This is done from the Options menu
     (Setup->Options). And now it's time to create the actual dot-file,
           which is done by selecting Generate in the File menu.
                                      
   Once you have generated the dot-file, you may find that you would like
     some of the configuration to be different. You could now go to the
    configuration page in question, change your configuration, and then
    generate once again. If, however, you are testing several different
   options for a single configuration (ie. several items from a pull-down
   menu) you may find it cumbersome to generate the whole module over and
    over again. In this situation, you may chose Regenerate this page in
   the File menu. Note, however, that if some part of the configurations
    on the page effects other pages, these will not be generated, so in
           these situation you have to generate the whole module.
                                      
   To see how to use the generated dot-file, please go to the Help menu,
                 and select the How to use the output item.
                                      
     _________________________________________________________________
                                      
                         The configuration widgets
                                      
   TDG uses a lot of widgets to let you configure the different options.
   Some of them are well known from other applications and include: check
      boxes, radio buttons, pull-down menus, entries, text boxes (for
    multi-line text), directory and file browsers. Others, however, are
    specifically designed for use in TDG, and they will be described in
                               the following.
                                      
                            The ExtEntry widget
                                      
    The ExtEntry is a container, which repeats its elements, just like a
    list-box repeat labels. A number of the elements in the ExtEntry may
    be visible on the screen at a time. The elements in the ExtEntry may
    be any of the widgets from TDG (ie. check boxes, pull-down menus and
   even other ExtEntries.) One element in an ExtEntry is called a tuple.
         In Figure 3, you can see an ExtEntry from the Tcsh module.
                                      
                                  [INLINE]
                                  Figure 3
                                      
      This ExtEntry has three visible tuples, though only two of them
   contain values (you can see, that the third one is grayed out). To add
   a new tuple to the ExtEntry, you have to press the button in the lower
   right corner, just below the scroll bar. If the ExtEntry contains more
     tuples than can be shown in it, you may scroll to the other tuples
                            with the scroll bar.
                                      
   If you press the left mouse button on one of the scissors, a menu with
   four elements will be displayed. These elements are used to cut, copy
                   and paste tuples within the ExtEntry.
                                      
     If the tuples get very large, only one of them may be shown on the
         screen at a time. An example of that is seen in figure 4.
                                      
    When the tuples contain many widgets, scrolling the ExtEntry becomes
    slow. In these cases, the ExtEntry may have a quick index. In figure
    4, you can see the quick index at the top of the ExtEntry (it's the
     button labeled Idx.) When this quick index is invoked, a pull-down
     menu is display with the values of the element associated with the
      quick index. This makes it much easier to scroll the ExtEntries.
                                      
                                  [INLINE]
                                      
                              Figure 4[INLINE]
                                      
                                  Figure 5
                                      
                             The FillOut widget
                                      
    Every shell has a configuration option called Prompt. This option is
   some text, which will be printed, when the shell is ready to execute a
   new command. In this text special tokens may be inserted, and when the
        prompt is printed, these tokens will be replaced, with some
     information from the shell. Eg. in Bash \w will be expanded to the
                         current working directory.
                                      
   In TDG, a special widget has been created called a FillOut, which does
     configurations like the above. In Figure 5, you can see a FillOut
     widget from the Bash module. At the top of the widget there is an
     entry, where you can type ordinary text. Below it, the tokens are
    placed. If you select one of the tokens, it is inserted in the entry
     at the point of the cursor. Some of the tokens may even have some
   additional configurations. Eg. the token Current working directory has
     two possible options: Full directory, and only the last part. When
    tokens with additional configurations are selected, a window will be
     displayed, where these configurations can be done. If you wish to
   change such a configuration, press the left mouse button on the token
                               in the entry.
                                      
                            The Command widgets
                                      
      TDG can be extended by the module programmer through the Command
     widget. This makes it possible to configure specific options with
      widgets they have developed themseves. At the moment three such
    widgets exist: The directory/file browser, the color widget and the
                                font widget.
                                      
   The widgets will appear as a button within TDG, and when the button is
   pressed a new window will be displayed, where the actual configuration
                                  is done.
                                      
     _________________________________________________________________
                                      
                          Save, Export and Reload
                                      
   When you have configured the different options in TDG, you may wish to
   leave it, and come back later, and change some of the configurations.
    When you leave TDG, you may save your changes, which you do from the
                                 File menu.
                                      
   Next time you enter TDG, your saved file will be one of the the files
              you will be offered as a start-up configuration.
                                      
     One important point you have to note is that this save file is an
   internal dump of the state of TDG. This means that this file dependson
   the version of TDG and the module. This means that if you wish to send
        a given configuration to another person, this format is not
   appropriate. A version independent format exists, which is called the
      export format. To create such a file, you have to select Export
                     instead of Save in the File menu.
                                      
   Sometimes you may wish to restore the configuration on a single page,
    to its value as it was before you started playing around with it, or
    you may wish to merge another person's configuration with your own.
    This is done by selecting Reload in the File menu. To tell TDG that
     you only want to reload some of the pages, you have to select the
    Detail button in the load window. This will bring up a window, where
   you can select which configuration pages, you wish to reload. Here you
    can also tell it how you want the pages to be reloaded. You have two
                               possibilities:
                                      
   Overwrite
          The pages you are loading, will totally overwrite the contents
          of the file
          
   Merge
          Tuples in the ExtEntries will be appended to those which
          already exist in the module. Other configurations will be
          ignored in the file.
          
   Here's another difference between the save-files and the export-files:
      You cannot merge with save-files. This means that if you have a
    save-file, which you wish to merge with, you first have to load it,
                 export it, and then you can merge with it.
                                      
     _________________________________________________________________
                                      
                                  The End
                                      
       Additional information can be found on the home page for TDG.
                                      
    It's always a good idea to have a bookmark on this page, as work is
                   currently in progress on new modules.
                                      
   procmail
          I have finished a module on procmail, a mail filter, which can
          sort your incoming mail.
          
   firewall configuration (ipfwadm)
          John D. Hardin (jhardin@wolfenet.com) is working on a module
          for configuring the fire walling and IP Masquerading setup for
          standalone systems connected to the Internet via dialup. He
          may, however, expand it to more general fire walling.
          
    If you have some spare time, I would very much like to encourage you
     to develop a module for your favorite program. On the home page of
     TDG, there is a link to a document, which describe how to create a
   module for TDG. Send me a letter, and I will be happy to help you get
                              started with it.
     _________________________________________________________________
                                      
                                      
    Jesper Kj�r Pedersen <blackie@imada.ou.dk>
    
                   Last modified: Wed Feb 5 15:59:35 1997
                                      
     _________________________________________________________________
                                      
                     Copyright � 1997, Jesper Pedersen
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
           "Linux Gazette...making Linux just a little more fun!"
                                      
     _________________________________________________________________
                                      
                        Welcom to the Graphics Muse
     Set your browser to the width of the line below for best viewing.
                               � 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] [Musings] [Resources]
    indent T his column is dedicated to the use, creation, distribution,
        and dissussion of computer graphics tools for Linux systems.
           What a month. Actually, two months. Last month I was busily
    working on putting together an entry for the IRTC using BMRT. At the
     same time I was trying to teach myself enough about the RenderMan
    Interface Specification to put together the second of three articles
    on BMRT. I didn't succeed in the latter and ended up postponing the
    article by one month. Because I did this I was able to focus more on
     learning the interface and worry less about writing. I think this
   strategy worked. The scene I rendered for this months IRTC is the best
     I've ever done and I managed to gain enough experience to write a
           meaningful article on the RenderMan Shading Langauge.
            One of the reasons I enjoy doing this column is because it
   exposes me to all sorts of people and software. The world of computer
    graphics for Linux is constantly growing and the software constantly
    improves. I hear about new products just about once or twice a week
    now and I hear about updates to existing packages all the time. Its
    very difficult to keep track of all the changes (and the fact that I
   haven't made any updates to the Linux Graphics mini-Howto in some time
                    reflects this) but I enjoy the work.
          Since things change so often I have found its never clear how
    many announcements I'll have for any one month. Its gone from famine
   to feast - with this month being the feast. Most of the announcements
   in this months column are from April alone. I don't know what happened
    - maybe all the bad weather around the globe kept people inside and
   busily working and now that the suns out they're starting to let loose
    what they've done. I only wish I had the time to examine everything,
      to play with them all. But my employer would rather I finish my
   current project first. Has something to do with keeping my salary, so
                                 they say.
          In this months column I'll only be covering two related items.
   The first is a case study on learning to use BMRT. When you submit an
      image in the IRTC you are required to submit an ASCII text file
    describing your image and, to some extent, how you created it. Some
   people don't put much work into this. I just about wrote a book. Since
    the information I provided covered more than just BMRT I thought it
                     would be relavent to this column.
         The second item is the long awaited (well, I waited a long time
     to finish it anyway) 2nd article on BMRT that covers the RenderMan
      Shading Language. I think this article came out quite good. I've
     included quite a few samples and some general explanations on what
    they do. I want to say right up front that I couldn't have done this
   without lots of help from BMRT's author, Larry Gritz at Pixar. He was
   a very willing teacher and critic who offered many tips and ideas for
      my IRTC entry. Most of that also ended up in this article. Many
                               thanks, Larry.
         I know I said I'd do an HF-Lab article this month too, but that
     IRTC entry took more time than I expected. It was quite addicting,
   trying to get things just right. I have started to review HF-Lab once
   again and will make it my first priority for next months column. I've
      already figured out how to use the output from HF-Lab to produce
    height fields with BMRT. Its quite simple really. Anyway, I hope you
                        enjoy this months articles.
          Note: I've been asked by a couple of readers about support for
   3D hardware support in the various X servers. I'm going to contact the
    X Server vendors (Xi Graphics, MetroLink, The XFree Project) as well
    as Brian Paul (the MesaGL author) and see what they have to say. If
    you are connected with these folks and have some insight I'd love to
   hear what you have to say. Please email me if you know if such support
      is forthcoming and I'll include it in an upcoming Graphics Muse
                                  column.
                                      
                               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
                                      
Frame grabber device driver for the ImageNation Cortex I video capture card
                               - Version 1.1
                                      
         This adapter is an 512 by 486 resolution 8bit gray scale video
    capture card. The device can provide data in pgm file format or raw
                                image data.
                                 FTP site:
                      ftp://sunsite.unc.edu/pub/Linux/
                         apps/video/cortex.drv.1.1.tgz
                                 Web Site:
                        http://www.cs.ubc.ca/spider/
                   jennings/cortex.drv.1.1.tgz indent indent
                                      
          3DOM - a new 3D modeller project using OpenGL for Linux
                                      
         3DOM is a 3D Modeler for Unix (using HP StarBase or OpenGL/Mesa)
       that is free for non-commercial use. Source code is available.
      Binaries for Linux/Intel, SGI, Sparc Solaris and HP-UX are also
                                 availalbe.
                                      
     It's not quite 'ready for prime-time', meaning there is almost no
      documentation and there is still a lot of work to do on the user
                  interface. http://www.cs.kuleuven.ac.be/
                         cwis/research/graphics/3DOM/
                                   indent
                                      
                           Pixcon/Anitroll R1.04
                                      
   I found this in my /tmp directory while getting ready for this months
   column. I couldn't find a reference to it in any other Muse columns so
    I guess I must have just misplaced it while preparing for an earlier
               issue. Hopefully, this isn't too out of date.
       Pixcon & Anitroll is a freely available 3D rendering and animation
    package, complete with source. Pixcon is a 3D renderer that creates
   high quality images by using a combination of 11 rendering primitives.
    Anitroll is a forward kinematic heirarchical 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. 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.
                        New features since version 1.03:
     * elimination of a memory leak w/ the polygon class
     * implemented a vector system for fast preview of frames
     * reorganize rendering process to support future parallel processing
     * 30-60 % reduction in rendering time and memory usage
       
                   The Pixcon & Anitroll home page is at:
                    http://www.radix.net/~dunbar/index.html
       Comments can be emailed to dunbar@saltmine.radix.net Pixcon is
      available either through the above web site or at Sunsite. It is
    currently under: /pub/Linux/Incoming/pixcon104.tgz and will be moved
      to: /pub/Linux/apps/graphics/pixcon104.tgz NOTE: there is a file
    pixcon1.04.tgz in those directories, but it's corrupted. Be sure to
                           get the correct files.
                                   indent
                                      
                              ELECTROGIG 3DGO
                                      
       ELECTROGIG is a software company specialiced in 3D solid modeling,
      visualization and animation software. The latest version of 3DGO
     (version 3.2), a modeling animation and raytracing package, is now
       available for the Intel Linux platform. A beta version is also
   available for the MkLinux platform. Take a look at the benchmarks for
                        Linux on the intel platform:
                 http://www.gig.nl/products/prodbench.html.
           3DGO was originally developed for the SGI platform and is
                available for the SGI, SUN and HP platforms.
          For more comprehensive information about 3DGO, check out the
            WWW-site: http://www.gig.nl/products/prodinfo.html.
        You can download a demo-version of 3DGO for linux, this version
    has all functionality, except the save functions. Go to our download
      area: ftp://ftp.gig.nl/demo/. Please Read the .txt files before
                                downloading.
                                      
                           ELECTROGIG Technology
                             INFO: info@gig.nl
                                   indent
                                      
              EZWGL v1.2, the EZ widget and graphics library.
                                      
             EZWGL is a C library written on top of Xlib. It has been
      developed on a Linux system and has been tested on the following
   platforms: SunOS 4.1.4, OSF1 V3.2 Alpha, IRIX 5.3 Linux 1.2 and Linux
    2.0.23. It should work on all Unices with X11R6. This release is the
          first one that comes with a complete postscript manual.
                                      
   For more information, check out http://www.ma.utexas.edu/~mzou/EZWGL.
                                   indent
                                      
                               xfpovray v1.2b
                                      
       A new release of xfpovray, the graphical interface to POV-Ray, has
      been released by Robert S. Mallozzi. xfpovray v1.2b requires the
    XForms library and supports most of the numerous options of POV-Ray.
    You can view an image of the interface and get the 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. indent indent
                                      
                               libgr V2.0.12
                                      
          A new version of libgr, version 2.0.12, is now available from
                            ftp.ctd.comsat.com:/
                       pub/linux/ELF/libgr-2.0.12.tar.gz.
    Changes to this release:
     * updated pbm, pgm, ppm, pnm from netpbm-94.
     * All the netpbm-94 apps are now included. They are NOT built or
       installed by default, however. You must say make everything, make
       install_everything.
     * Minor mods to compile with bash-2.0.
     * Minor mods to compile with glibc-2.
       
   libgr is a collection of graphics libraries, which includes fbm, jpeg,
                    pbm, pgm, ppm, pnm, png, tiff, rle.
                                      
          libgr will build shared libs on Linux-ELF and on HP/UX.
                                   indent
                                      
        EPSCAN - scanner driver for EPSON ES-1200C/GT-9000 scanners
                                      
         EPSCAN is a scanner driver for EPSON ES-1200C/GT-9000 scanners.
       It includes a driver and a nice Qt-based X frontend. It allows
   previewing, and selecting a region of an image to be scanned, as well
   as changing scanner settings. It only supports scanners attached to a
                    SCSI port, not to the parallel port.
                                      
                           EPSCAN can be found at
        ftp://sunsite.unc.edu/pub/Linux/Incoming/epscan-0.1.tar.gz.
          RPM versions of the binary and source are available from
           ftp://ftp.redhat.com/pub/Incoming/epscan-0.1-1.src.rpm
          ftp://ftp.redhat.com/pub/Incoming/epscan-0.1-1.i386.rpm.
                     They're intended destinations are
           ftp://ftp.redhat.com/pub/contrib/epscan-0.1-1.src.rpm
        ftp://ftp.redhat.com/pub/contrib/epscan-0.1-1.i386.rpm. and
   ftp://sunsite.unc.edu/pub/Linux/apps/graphics/scanners/epscan-0.1.tar.
                                     gz
                                      
    The driver should work for any of the ES-{300-800}C / GT-{1000-6500}
             models as well, but has not been tested on these.
    Requirements:
     * Linux 2.x
     * XFree3.x
     * Qt library version >= 1.1
     * libtiff version >= 3.4
     * g++ version >= 2.7.2
       
              Author: Adam P. Jenkins <ajenkins@cs.umass.edu>
                                   indent
                                      
                           Inlab-Scheme Release 4
                                      
            Inlab-Scheme Release 4 is now available for Linux/386 (2.X
                      kernel, ELF binary) and FreeBSD.
         Inlab-Scheme is an independent implementation of the algorithmic
   language Scheme as defined by the R4RS and the IEEE Standard 1178. In
         addition to the language core Inlab-Scheme has support for
    bitmap/greymap processing of several kinds. Inlab-Scheme can be used
     as a general tool for image processing, OCR or specialized optical
                            object recognition.
          Inlab-Scheme Release 4 reads and writes multipage tiff/G4, XBM
     and PNG graphic file formats. Inlab-Scheme Release 4 has built in
   converters for various patent image file formats (USAPat, PATENTIMAGES
                                and ESPACE).
                          Inlab-Scheme is distributed at
   http://www.munich.net/inlab/scheme, where additional information about
   the current state of the project, supported platforms, current license
                 fees and more is available. indent indent
                                      
                         The Linux Game SDK Project
                                      
               The new WWW page for the Linux Game SDK is at
                     http://www.ultranet.com/~bjhall/GSDK/.
           The Linux GSDK Project is a new project which aims to make a
    consistent and easy to use set of libraries to ease game developers
    (professional or not) to make first class games under the Linux OS.
      The GSDK will provide libraries for 2D and 3D graphics, advanced
    sound, networked games and input devices. It should also improve the
   development of multimedia applications for Linux. See the Web site for
                             more informations.
          The GSDK mailing list has moved from linux-gsdk@endirect.qc.ca
   to linux-gsdk@mail.wustl.edu. Additionnal lists have been created for
                             the various teams.
                                   indent
                                      
                       WebMagick Image Web Generator
                                      
         WebMagick is a package which supports making image collections
    available on the Web. It recurses through directory trees, building
   HTML pages, imagemap files, and client-side/server-side maps to allow
   the user to navigate through collections of thumbnail images (somewhat
   similar to xv's Visual Schnauzer) and select the image to view with a
                                mouse click.
       WebMagick is based on the "PerlMagick" ImageMagick PERL extension
       rather than external ImageMagick utilities (as its predecessor
      "Gifmap" is). This alone is good for at least a 40% performance
       increase on small images. WebMagick supports smart caching of
   thumbnails to speed montage generation on average size images. After a
      first pass at "normal" speed, successive passes (upon adding or
         deleting images) are 5X to 10X faster due to the caching.
         WebMagick supports a very important new feature in its caching
       subsystem: it can create and share a thumbnail cache with John
     Bradley's 'xv' program. This means that if you tell 'xv' to do an
   update, WebMagick montages will benefit and you can run WebMagick as a
   batch job to update xv's thumbnails without having to wait for 'xv' to
       do its thumbnail reduction (and get a browsable web besides!).
       WebMagick requires the ImageMagick (3.8.4 or later) and PerlMagick
       (1.0 or later) packages as well as a recent version of PERL 5.
                               Primary-site:
   http://www.cyberramp.net/~bfriesen/webmagick/dist/webmagick-1.17.tar.g
                                     z
                              Alternate-site:
     ftp.wizards.dupont.com/pub/ImageMagick/perl/webmagick-1.17.tar.gz
        Perl Language Home Page: http://www.perl.com/perl/index.html
     ImageMagick: http://www.wizards.dupont.com/cristy/ImageMagick.html
       PerlMagick: http://www.wizards.dupont.com/cristy/www/perl.html
           Author: Bob Friesenhahn (bfriesen@simple.dallas.tx.us)
                                   indent
                                      
                       SIMLIB IG - Commercial library
                                      
         SIMLIB IG a C library which enables communication with Evans &
    Sutherland graphics Supercomputers (so called image generators). It
       enables the user to communicate with Evans & Sutherland image
      generators (Liberty and ESIG Systems) using a very efficient raw
   Ethernet protocol. There is no need for using opcodes, since SIMLIB IG
       provides an API to the functionality of the image generators.
        Documentation comes printed in English, and source code examples
   are provided on the distribution media. The software is also available
                          for SGI and NT systems.
                                      
                     SIMLIB IG for Linux is $2500 (US)
                  SIMLIB IG for all other OS is $5000 (US)
                                      
         KNIENIEDER Simulationstechnik KG (office@knienieder.co.at)
                        Technologiezentrum Innsbruck
                        AUSTRIA/EUROPE indent indent
                                      
        mtekscan - Linux driver for MicroTek ScanMaker SCSI scanners
                                      
     mtekscan is a Linux driver for MicroTek ScanMaker (and compatible)
    SCSI scanners. Originally developed for the ScanMaker E6, it is (so
     far) known to also work with the ScanMaker II/IIXE/IIHR/III/E3/35t
    models, as well as with the Adara ImageStar I, Genius ColorPage-SP2
                         and Primax Deskscan Color.
        The new version of mtekscan is v0.2. It's still in beta testing,
   but all major options should work without problems. Besides some small
   bugfixes and minor improvements, the new version contains a couple of
                        new features, most notably:
     * 3-pass scanning support
     * gamma correction
     * loadable gamma correction tables
     * better documentation
       
      mtekscan v0.2 is available as mtekscan-0.2.tar.gz from the Fast
                            Forward ftp-server:
                    ftp://fb4-1112.uni-muenster.de/pub/ffwd/
                              or from sunsite:
                             ftp://sunsite.unc.edu/
                       pub/Linux/apps/graphics/scanners/
                                   indent
                                      
                PNG binaries for Netpbm tools now available
                                      
    Linux binaries for pnmtopng, pngtopnm, and gif2png are available at:
     http://www.universe.digex.net/~dave/files/pngstuff.tgz If you have
                        trouble dowloading that, see
      http://www.universe.digex.net/~dave/files/index.html for helpful
                               instructions.
       PNG is the image format that renders GIF obsolete. For details on
    that, you can visit the PNG home page at: http://www.wco.com/~png/.
        The only shared libraries you need are libc and libm; all of the
   others are linked statically. The versions of libraries used to build
   the programs are those that were publicly available as of 1997-04-06:
     * pnmtopng-2.34
     * gif2png 0.6 (beta)
     * zlib-1.0.4 (statically linked)
     * libpng-0.90 (statically linked)
     * netpbm-1mar1994 (statically linked)
       
                                   indent
                                      
                           TN-Image Version 2.5.0
                                      
                                TN-Image is:
     * Scientific image analysis program for the X Window System.
     * Mouse & menu-based image editing and scientific analysis with
       user-friendly user interface.
     * Freely distributable.
       
    It includes a 123-page manual, tutorials, and on-line help. The Unix
     version is highly customizable with regard to fonts, colors, etc.
    System requirements
     * Unix version requires X11R5 or higher and Motif 1.2 or higher.
       Statically-linked version does not require Motif.
     * Binaries are provided for the Linux (x86), Solaris, Irix,
       ConvexOS, and MS-DOS.
     * DOS version requires SVGA card and 4 MB of RAM; handles all VESA
       screen modes including 1600x1200, as well as XGA and XGA-2 video
       cards.
       
    Some features of TN-Image
     * Scanner interface for H/P SCSI scanners with preview scan and
       interactive image scanning at 8, 10, 12, 24, 30, and 36 bits/pixel
       (Not available in ConvexOS and MS-DOS versions).
     * Create, cut/paste, and add text labels in multiple fonts and
       graphic elements such as circles, Bezier curves, freehand drawing,
       etc.
     * Handles up to 512 images of any depth simultaneously. Each image
       can be in a separate window or in a single large window to
       facilitate creation of composite images. Cut/paste works even if
       images are of different depths or in different windows.
     * Prints to PCL or PostScript printer. CMY, CMYK, or RGB formats.
     * Import/export formats: PCX, IMG, TIF (both Macintosh and PC),
       JPEG, BMP, GIF, TGA, IMG, Lumisys Xray scanner, and ASCII images,
       of any depth from 1-32 bits per pixel, color or monochrome, raw
       binary images, 3D images (such as PET scan and confocal images),
       and user-definable image formats. Handles unusual image depths
       such as 12- and 17-bit grayscale.
     * Interconversion of image formats.
     * Solid and gradient flood fill.
     * R, G, and B image planes can be manipulated separately.
     * Adjust color, intensity, contrast, and grayscale mapping.
       Grayscale images deeper than 8 bits/pixel, such as medical
       grayscale images, can be viewed with a sliding scale to enhance
       any particular intensity region.
     * Rotate, resize, warp, flip, invert or remap colors; crop, paint,
       spray paint, etc.
     * Convolution filters: sharpen, blur, edge enhancement, shadow
       sharpening, background subtract, background flatten, and noise
       filter.
     * Interactively create arbitrary colormaps or select from 10,000
       pre-defined colormaps.
     * Macro language and macro editor. Macro programming guide is
       included.
     * Image algebra function allows multiple images to be subtracted or
       otherwise transformed according to arbitrary user-defined
       equations.
     * RGB & intensity histograms.
     * 3D images can be viewed interactively as a movie, or each frame
       can be manipulated separately.
     * Many advanced features
       
                      Contact and archive information:
                    Contact: tjnelson@las1.ninds.nih.gov
                             Archive locations
           sunsite.unc.edu:/apps/graphics/tnimage250.linux.tar.gz
       sunsite.unc.edu:/apps/graphics/tnimage250.linux-static.tar.gz
            las1.ninds.nih.gov:/pub/unix/tnimage250.linux.tar.gz
        las1.ninds.nih.gov:/pub/unix/tnimage250.linux-static.tar.gz
           las1.ninds.nih.gov:/pub/unix/tnimage250.solaris.tar.gz
            las1.ninds.nih.gov:/pub/unix/tnimage250.irix.tar.gz
           las1.ninds.nih.gov:/pub/unix/tnimage250.solaris.tar.gz
                  las1.ninds.nih.gov:/pub/dos/tnimg216.zip
                                   indent
                                   indent
                                   indent
                                      
                               Did You Know?
                                      
              ...that there is a converter available to turn POV-Ray
     heightfields into RenderMan compliant RIB files for use with BMRT?
                            Florian Hars writes:
                                      
     I've worked on my code, now it uses libpgm and has all the
     necessary vector routines included, it is on my page (with some
     comparisions of rendering time and memory consumption):
     http://www.math.uni-hamburg.de/home/hars/rman/height.html
     
   Florian also has some pages of general POV vs. RenderMan comparisons:
        http://www.math.uni-hamburg.de/home/hars/rman/rm_vs_pov.html
                                      
           ...that there is a freely available RenderMan shader library
    from Guido Quaroni? The library contains shaders from the RenderMan
    Companion, Pixar, Larry Gritz and a number of other places. You can
                find a link to it from the BMRT Web pages at
              http://www.seas.gwu.edu/student/gritz/bmrt.html.
                                      
          ...that there is an FTP site at CalTech that contains a large
      number of RenderMan shaders? The collection is similar to Guido
   Quaroni's archive, except the FTP site includes sample RIB files that
    use the shaders plus the rendered RIBs in both GIF and TIFF formats.
     The site is located at ftp://pete.cs.caltech.edu/pub/RMR/Shaders/.
                                      
                                  Q and A
                                      
     Q: Where can I get a copy of the netscape color cube for use with
                      Netpbm? How should it be used? 
                                      
    A: The color cube can be found at the web site for the text Creating
                             Killer Websites at
   http://www.killersites.com/images/color_cube_colors.gif. The cube can
                      be used in the following manner:
             % giftopnm color_cube_colors.gif" > color_cube.ppm
         % tgatoppm image.tga | ppmquant -m color_cube.ppm -fs | \
        ppmtogif -interlace -transparent rgb:ff/ff/ff > image.gif where
         ff/ff/ff is any set of Red, Green, and Blue values to make
                                transparent.
                                      
              Q: Where can I get models of the human figure? 
                                      
      A: Here are two addresses for human figure models. The first is
   3DCafe's official disclaimer and the second takes you straight to the
   human figures. Please read the disclaimer first (although you may need
          an asp capable browser, such as Netscape 3.x to do so):
                      http://www.3dcafe.com/meshes.htm
                     http://www.3dcafe.com/anatomy.htm
                                      
                        From the IRTC-L mailing list
                                      
       Q: Is there a VRML 2.0 compliant browser available for Linux? 
                                      
     A: Yes. Dimension X's Liquid Reality is a fully compliant VRML 2.0
    browser. The download web page says that there will be support as a
     plug-in for Netscape 3.x soon. This is a commercial product with a
               free trial version available for download. See
     http://www.dimensionx.com/products/lr/download/ for more details.
                                      
   From a friendly reader, whose name I absent mindedly discarded before
                        recording it. My apologies.
                                      
     Q: Can anyone tell me how I would go about defining a height field
    according to a specific set of data points? My goal is to be able to
     take a topographic map, overlay it with a rough grid, and use the
    latitude, longitude, and elevation markings as points in a definable
   3-D space to create a height field roughly equal to real topography. 
                                      
     A: The easiest way is probably to write a PGM file. I wouldn't use
    longitude and latidude because the length of one degree isn't fixed
     and it will give reasonable results only near the equator. Use UTM
      coordinates or superimpose any arbitrary grid on your map which
                      represents approximate squares.

         P2
         # kilimajaro.pgm
         15 10
         59
         10 15 18 20 21 22 23 23 21 20 19 18 17 16 15
         11 15 19 22 27 30 30 30 29 28 25 20 19 18 17
         13 15 19 21 28 38 36 40 40 35 30 24 20 19 18
         15 16 18 20 29 39 37 44 59 44 38 30 22 19 18
         15 16 18 20 28 30 30 40 50 46 51 48 28 20 19
         15 15 16 17 18 19 20 24 30 35 37 37 30 20 19
         15 15 14 15 16 17 18 19 22 29 30 29 27 20 19
         15 15 14 13 15 16 15 17 18 20 22 20 20 20 18
         15 14 13 11 12 12 12 13 14 15 17 15 15 15 14
         14 11 10  9  9 10 10 10  9 10 13 12 11 11 11
                
    Use it with scale to get an to-scale image and with a larger y-scale
        if you want to see something. The earth is incredibly flat.
                                      
               From Florian Hars via the IRTC-L mailing list
                                      
     Q: I've been fiddling with some simple CSG using BMRT and have run
     into a problem. I'm trying to cut a square out of a plane that was
     created from a simple bilinear patch. Whatever I use to define the
     square (a box actually) comes out white instead of the background
    color (black in this case). I dont know what I'm doing wrong and was
          wondering if someone might take a peek at this for me. 
                                      
   A: There are several problems with your RIB file, as well as your use
                        of CSG. The two biggies are:
                                      
                          You just can't do this:
            ObjectBegin 2
               SolidBegin "primitive"
               TransformBegin
                  Translate -1 0 0
                  Rotate -90 0 1 0
                  Patch "bilinear" "P"
                     [ -1 -1 0   1 -1 0
                       -1  1 0   1  1 0  ]
               TransformEnd
               ... etc.
            ObjectEnd
                        
         Transformations just aren't allowed inside object definitions.
      Remember that object instances inherit the entire graphics state
   that's active when they are instanced -- including transformations. So
        all primitives within the instanced object get the very same
     transformation. If they're all bilinears like you have them, that
           means that they will all end up on top of one another.
       For this reason and others, I urge everybody to not use instanced
     objects at all for any RenderMan compliant renderer. They're quite
      useless as described in the RenderMan 3.1 spec. Yes, I know that
    RenderMan Companion has an example that does exactly what I said is
   illegal. The example is wrong, and will not work with either PRMan or
                                   BMRT.
         Solid (CSG) operations are meant only to operate on solids. A
     solid is a boundary representation which divides space into three
   distinct loci: (a) the boundary itself, which has finite surface area,
   (b) a (possibly disconnected) region of finite volume (the "inside"),
     and (c) a connected region of infinite volume (the "outside"). You
     can't subtract a box from a bilinear patch, since a bilinear patch
                        isn't a solid to begin with.
          If you want a flat surface with a square hole, there are two
   methods that I'd recommend: (a) simply use several bilinears (4 to be
                     exact) for the surface, like this:

            +-----------------------+
            |  #1                   |
            |                       |
            +======+---------+======+
            |      |         |      |
            | #2   |  (hole) | #3   |
            |      |         |      |
            +======+---------+======+
            |  #4                   |
            |                       |
            +-----------------------+

     Or, (B) if you really want to be fancy, use a single flat order 2
         NURBS patch with an order 2 trim curve to cut out a hole.
                                      
                      From Larry Gritz <lg@pixar.com>
                                   indent
                                   indent
                                   indent
                                      
                                  Musings
                                      
                        Correcting for display gamma
                                      
    Gamma Correction Scale     This past 2 months I've been hard at work
      on an entry for this round of the IRTC, the Internet Ray Tracing
   Competition. In previous rounds I had submitted entries using POV-Ray,
     but for this round I switched to BMRT, mostly so I could learn the
     RenderMan API and how to write shaders using the RenderMan shading
      language. This months main article is the second of a three part
   series on BMRT. The BMRT package is written by Larry Gritz, and Larry
    was gracious enough to offer some wonderful critiques and tips on my
                                   image.
        During out email correspondence, Larry noticed I had overlit my
   scenes quite badly. While we tried to figure out what was causing this
   (it turned out to be a misuse of some parameters to some spotlights I
     was using) he asked if I had gamma corrected for my display. Gamma
     correction is a big issue in computer graphics, one that is often
     overlooked by novices. I'd heard and read quite a bit about gamma
    correction but had never really attempted to determine how to adjust
   the gamma for my display. Larry offered an explanation, a quick way to
       test the gamma on my system, and a tip for adjusting for gamma
     correction directly in the BMRT renderer, rendrib. I thought this
      would be a great thing to share with my readers, so here it is.
       Rendrib produces linear pixels for its output -- i.e. a pixel with
     value 200 represents twice as much light as a pixel of value 100.
       Thus, it's expected that your display will be twice as bright
   (photometrically, not necessarily perceptually) on a pixel of 200 than
                                one of 100.
       This sort of display only really happens if you correct for gamma,
   the nonlinearity of your monitor. In order to check this, take a look
     at the following chart. Display the chart as you'd view any image.
   You'll notice that if you squint, the apparent brightness of the left
     side will match some particular number on the right. This is your
      gamma correction factor that must be applied to the image to get
                linear response on your particular monitor.
                                      
          If your display program uses Mesa (as rendrib's framebuffer
     display does), you can set an environment variable, MESA_GAMMA, to
    this value and it will transparently do the correction as it writes
   pixels to the screen. Most display programs let you correct gamma when
   you view an image, though I've had trouble getting xv to do it without
                   messing up the colors in a weird way.
       Another alternative is to put the following line in your RIB file:

          Exposure 1 &ltgamma>

                            indent indent indent
                              More Musings...
     My Entry in the March/April IRTC - a case study in learning to use
                             RenderMan and BMRT
                                      
               BMRT Part 2 - The RenderMan Shading Language 
                                   indent
     where gamma was what you measured with the chart. This will cause
       rendrib to pre-correct the output pixels for the gamma of your
     display. I think it's important to gamma correct so that at least
      you're viewing the images the way that rendrib "expects" them to
   appear. It can't know about the nonlinearities of your CRT without you
                                telling it.
        Larry has more on the gamma issue on his own pages. You can find
   it at http://www.seas.gwu.edu/student/gritz/gamma.html. He also asked
     me to mention that he got this chart from Greg Ward, but we didn't
    have any contact information for him. Hopefully he doesn't mind our
     using it.     Readers should note that the image displayed in this
   article may not provide accurate information for adjusting gamma since
     your browser may dither the colors in a way which changes what the
     actual value should be. Also, this image is a JPEG version of the
    original TIFF image Larry supplied. Its possible the conversion also
   changed the image. If you're interested in trying this out you should
                  grab the original TIFF image (300x832).
                                      
                                 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.os.linux.announce
                                      
                             Future Directions
                                      
                                Next month:
     * HF-Lab - no really, I mean it this time.
     * Possibly a review of Image Alchemy
     * A preview of Gimp 1.0 (unless its already released, in which case
       it won't be a preview)
     * If I can find the info, I'll report on the future of 3D hardware
       support from Xi Graphics, Metro and The XFree Project.
     * and who knows what else.
       
                                      
                 Let me know what you'd like to hear about!
                                      
     _________________________________________________________________
                                      
     _________________________________________________________________
                                      
                    Copyright � 1997, Michael J. Hammel
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
                                  More...
                                      
                                      
                                  Musings
     * My Entry in the March/April IRTC - a case study in learning to use
       RenderMan and BMRT
       
                                   indent
                          � 1997 Michael J. Hammel
                                   indent
                                      
My Entry in the March/April IRTC - a case study in learning to use RenderMan
                                  and BMRT
                                      
         One reason I took so long to get down to writing the Muse column
    this month was that I was hard at work on an entry in the IRTC, the
   Internet Relay Tracing Competition, which I help administer. I've been
    an active participant in the IRTC since its restart back in May 1996
    but have only actually entered one competition. So this round had a
   special meaning for me. I don't often have the time to work on entries
    unless something else suffers. In this case, it was last months Muse
    column. To be honest, however, I was also using this entry to learn
    more about RenderMan, BMRT and in particular, the RenderMan Shading
     Language. Nothing is quite such a a teacher as experience. And my
                 entry in the IRTC was a wonderful teacher.
         Below I've included the text file which accompanies my entry in
        the IRTC. All entries must have this file. It describes the
   who/what/how and so forth relating to an entry. I'll let the text file
     describe what I did, who helped me do it, and some of the issues I
           encountered. I hope you find this useful information.
                          EMAIL: mjhammel@csn.net
                          NAME: Michael J. Hammel
                               TOPIC: school
                           TITLE: Post Detention
                            RENDERER USED: BMRT
       TOOLS USED: Linux, AC3D, BMRT, Gimp 0.99.8, wc2pov, xcalc, xv
                         RENDER TIME: about 4 hours
   HARDWARE USED: Cyrix P166 (133Mhz) based Linux system, 64M memory Post
                           Detention - thumbnail
   Post Detention - Full size image is 800x600 / 102k IMAGE DESCRIPTION:
             Pretty simplistic, really. Its a school room, just after
   detention has let out. You can tell that detention has let out by the
   writing on the chalk board and the time displayed by the clock on the
    wall. The sun is starting to get low outside, which causes the types
   of shadows you can see on the bookshelf. All the students who were in
    detention are required to read the latest New York Times bestseller
   titled "Post Detention". Its written by some author who is rumored to
    do 3D graphics on the side. You can see the book on the desk in the
                      lower right corner of the image.
                                      
                 DESCRIPTION OF HOW THIS IMAGE WAS CREATED:
          I used this image to learn to use RenderMan and BMRT. I find I
   like these tools a bit better than POV-Ray, mostly because I can write
       C code to create models if I want (although I didn't for this
    particular scene) and the shader language allows a bit more control
      than POV's. I still have much to learn to make real use of these
                             features, however.
         I started with some canned models from 3DCafe: a chair, a couple
    of bookcases, and some books. I had to convert the chair from 3DS to
   DXF so I could then import it into AC3D. Once I had it in the modeler,
   I broke the chair into two pieces - the arm and the rest of the chair.
    I did this so I could texture them seperately (note that in the 3DS
     format these pieces may have already been seperate, but after the
    conversion to DXF they were a single entity). I also sized the chair
   to be a common unit size and centered it on the origin. This unit size
    was used on all models so that the real sizing and positioning could
                          be done in the RIB file.
            The book case only needed resizing but the books had to be
    broken into a cover and "text pages". The latter are a single entity
      that were textured with a matte finish. The covers were textured
       individually. All the books are basically the same book sized
   differently and placed in the bookcase from within AC3D. This provided
    relative positioning for the books in the bookcase, after which any
   other translations would maintain that relative positioning. Books on
                  the chairs or floor were done similarly.
         The walls are simple polygons or bilinear patches. The windowed
   wall turned out to show problems in the way AC3D does polygons for RIB
   output. I had to convert this wall from polygons to a set of bilinear
   patches (see the May issue of the Graphics Muse for how to make a hole
      in a wall using bilinear patches) in order for the texture to be
    applied evenly over all of the patches. This problem also showed up
    when trying to apply texture maps to the chalk board. It apparently
    has to do with vertex ordering. I had to change the chalkboard to a
     bilinear patch too. I may have to write my own models for anything
     that uses texture maps in the future instead of using AC3D. To his
    credit, I haven't told Andy (AC3D's author) about this yet and he's
    been very good about addressing any problems I've found in the past.
          An important aspect of this image is the tremendous help I got
   from Larry Gritz, the author of BMRT. He offered some special shaders,
   although I only used one of them (the one for the ceiling tiles). The
    biggest help was very constructive criticism and tips for things too
    look for in my code. For example, he pointed out that I was probably
     using the parameters to spotlights incorrectly. I was, and it was
      causing my scene to be very overlit (spotlights use coneangle in
   radians, and I had specified them in degrees). This one change made a
                 dramatic improvement in the overall image.
            All the shaders used, except for the ceiling tiles and the
      papers on the desks, are from the archive of shaders from Guido
   Quaroni. This archive includes shaders from the RenderMan Companion by
   Steve Upstill, from Texturing and Modeling by Ebert, Musgrave, et al,
   Larry Gritz, and various other places. Its quite a useful resource for
   novices just getting started with shaders and RenderMan. The papers on
       the desks are textured with a shader I wrote that creates the
     horizonatl and vertical lines. It also puts in 3 hole punches, but
      thats not obvious from the image. This shader is the only one I
   included in the source [Ed. The IRTC allows the source code for scenes
    to be uploaded along with the JPEG images and text file]. The chairs
    are textured with a rusty metallic shader and a displacement shader
     for the dents. Displacement shaders are cool because they actually
     move points on the surface (unlike bump maps which just change the
    normals for those points). The arm surfaces are textured with a wood
    shader that I made a minor change to (to allow better control of the
   direction of the wood grain) and a displacement shader that caused the
    bumpiness, scratches, and chips in the wood. This latter item could
              have been better, but I was running out of time.
         The chalkboard is an image map created in the 0.99.8 developers
      release of the Gimp. This is a very cool tool for Linux and Unix
   platforms, very similar to Photoshop (but apparently better, according
      to people who've used both - I've never used Photoshop myself).
            The image out the window is an image map on a simple plane
      angled away from the window. The window panes are dented using a
   displacement map. We had windows with bumps in them in High School and
     thats the effect I was going for here. Its pretty close and as an
   added benefit it prevents the image outside the window from being too
                                washed out.
             The globe on the book shelf is one of those ones that is
   suspended by magnets. The globe has a displacement map on it as well,
   which is why, if you look real close, the lighting on it is not smooth
     where it moves into shadow. The globe and its base were completely
    modeled in AC3D. It was quick and very easy to do. All the items on
   the booksshelf by the window are in a single model file, but exported
    as individual objects so they could be shaded properly. The same is
                   true for the bookcase under the clock.
           It was fun. This is certainly the best 3D image I've done to
   date. Its also the first one of something recognizable (as opposed to
           space ships and planets no one has ever really seen).
         NOTE: One thing I forgot to mention in my original text file for
      my entry is that I had to edit all the exported RIB files that I
     created with AC3D to remove the bits of RIB that made each file an
    independently renderable file. By default AC3D generates a complete
   scene, one that can be passed to rendrib (the BMRT renderer) directly
   to render a scene. But what I needed was for the files generated to be
   only partially complete scenes, without the camera or lighting and so
       forth. In this way I could use these files in RIB ReadArchive
   statements, similar to #include files for POV. Considering the number
   of objects I exported with AC3D, that turned out to be quite a bit of
   hand editing. I sent email to Andy Colebourne, the author of AC3D, and
   he's looking into making it possible to output partial RIBs for use as
                         ReadArchive include files.
                                      
                                   indent
                        � 1997 by Michael J. Hammel
                                      
More...

                                      
                                  Musings
                                      
  BMRT
  
                               Gritz Sample 1
                       Image courtesy of Larry Gritz
    Part II: Renderman Shaders
     A quick review
     What is a shader?
     Compiling shaders
     Types of shaders
     Shader language syntax
         a. Shader names
         b. Variables and scope
         c. Data types and expressions
         d. Functions
         e. Statements
         f. Coordinate systems
     Format of a shader file
     A word about texture maps
     Working examples
         a. Colored Mesh pattern
         b. Adding opacity - a wireframe shader
         c. A simple paper shader
         d. A texture mapped chalk board
         e. Displacement map example
       indent
       � 1996 Michael J. Hammel
       indent
       
1. A quick review

             Before we get started on shaders, lets take a quick look
       back at RIB files. RIB files are ASCII text files which describe a
       3D scene to a RenderMan compliant renderer such as BMRT. A RIB
       file contains descriptions of objects - their size, position in 3D
       space, the lights that illuminate them and so forth. Objects have
       surfaces that can be colored and textured, allowing for
       reflectivity, opacity (or conversely, transparency), bumpiness,
       and various other aspects.
             An object is instanced inside AttributeBegin/AttributeEnd
       requests (or procedures in the C binding). This instancing causes
       the current graphics state to be saved so that any changes made to
       the graphics state (via the coloring and texturing of the object
       instance) inside the AttributeBegin/AttributeEnd request will not
       affect future objects. The current graphics state can be modified,
       and objects colored and textured, with special procedures called
       shaders.
             Note: Keep in mind that this is not a full fledged tutorial
       and I won't be covering every aspect of shaders use and design.
       Detailed information can be found in the texts listed in the
       bibliography at the end of this article.
       
2. What is a shader?

             In the past, I've often used the terms shading and texturing
       interchangeably. Darwyn Peachy, in his Building Procedural
       Textures chapter in the text Texturing and Modeling: A Procedural
       Approach, says that these two concepts are actually separate
       processes:
       
     Shading is the process of calculating the color of a pixel from
     user-specified surface properties and the shading model. Texturing
     is a method of varying the surface properties from point to point
     in order to give the appearance of surface detail that is not
     actually present in the geometry of the surface. [1]
       A shader is a procedure called by the renderer to apply colors and
       textures to an object. This can include the surface of objects
       like block or spheres, the internal space of a solid object, or
       even the space between objects (the atmosphere). Although based on
       Peachy's description would imply that shaders only affect the
       coloring of surfaces (or atmosphere, etc), shaders handle both
       shading and texturing in the RenderMan environment.
       
3. Compiling shaders

             RIB files use filenames with a suffix of ".rib". Similarly,
       shader files use the suffix ".sl" for the shader source code.
       Unlike RIB files, however, shader files cannot be used by the
       renderer directly in their source format. They must be compiled by
       a shader compiler. In the BMRT package the shader compiler is
       called slc.
             Compiling shaders is fairly straightforward - simply use the
       slc program and provide the name of the shader source file. For
       example, if you have a shader source file named myshader.sl you
       would compile it with the following command:     slc myshader.sl
       You must provide the ".sl" suffix - the shader source file cannot
       be specified using the base portion of the filename alone. When
       the compiler has finished it will have created the compiled shader
       in a file named myshader.so in the current directory. A quick
       examination of this file shows it to be an ASCII text file as
       well, but the format is specific for the renderer in order for it
       to implement its graphics state stack. Note: the filename
       extension of ".so" used by BMRT (which is different than the one
       used by PRMan) does not signify a binary object file, like shared
       library object files. The file is an ASCII text file. Larry says
       he's considering changing to a different extension in the future
       to avoid confusion with shared object files.
             Note that in the RIB file (or similarly when using the C
       binding) the call to the shader procedure is done in the following
       manner:

               AttributeBegin
                  Color [0.9 0.6 0.6]
                  Surface "myshader"
                  ReadArchive "object.rib"
               AttributeEnd
   This example uses a surface shader (we'll talk about shader types in a
       moment). The name in double quotes is the name of the shader
       procedure which is not necessarily the name of the shader source
       file. Since shaders are procedures they have procedure names. In
       the above example the procedure name is myshader. This happens to
       the be same as the base portion (without the suffix) of the shader
       source filename. The shader compiler doesn't concern itself with
       the name of the source file, however, other than to know which
       file to compile. The output filename used for the .so file is the
       name of the procedure. So if you name your procedure differently
       than the source file you'll get a differently named compiled .so
       file. Although this isn't necessarily bad, it does make it a
       little hard to keep track of your shaders. In any case, the name
       of the procedure is the name used in the RIB (or C binding) when
       calling the shader. In the above example, "myshader" is the name
       of the procedure, not the name of the source file.
       
4. Types of shaders

             According to the RenderMan Companion [2]
       
     The RenderMan Interface specifies six types of shaders,
     distinguished by the inputs they use and the kinds of output they
     produce.
       The text then goes on to describe the following shader types:
         1. Light source shaders
         2. Surface shaders
         3. Volume shaders
         4. Displacement shaders
         5. Transformation shaders
         6. Imager shaders
       Most of these can only have one instance of the shader type in the
       graphics state at any one time. For example, there can only be one
       surface shader in use for any object or objects at a time. The
       exception to this are light shaders, which may have many instances
       at any one time, some of which may not be actually turned on for
       some objects.
       
       Light Source Shaders 
             Light sources in the RenderMan Shading Language are provided
       a position and direction and return the color of the light
       originating from that light and striking the current surface
       point. The RenderMan specification provides for a set of default
       light shaders that are very useful and probably cover the most
       common lighting configurations an average user might encounter.
       These default shaders include ambient light (the same amount of
       light thrown in all directions), distant lights (such as the Sun),
       point lights, spot lights, and area lights. All light sources have
       an intensity that defines how bright the light shines. Lights can
       be made to cast shadows or not cast shadows. The more lights that
       cast shadows you have in a scene the longer it is likely to take
       to render the final image. During scene design and testing its
       often advantagous to keep shadows turned off for most lights. When
       the scene is ready for its final rendering turn the shadows back
       on.
             Ambient light can be used to brighten up a generally dark
       image but the effect is "fake" and can cause an image to be washed
       out, losing its realism. Ambient light should be kept small for
       any scene, say with an intensity of no more than 0.03. Distant
       lights provide a light that shines in one direction with all rays
       being parallel. The Sun is the most common example of a distant
       light source. Stars are also considered distant lights. If a scene
       is to be lit by sunlight it is often considered a good idea to
       have distant lights be the only lights to cast shadows. Distant
       lights do not have position, only direction.
             Spot lights are the familiar lights which sit at a
       particular location in space and shine in one generalized
       direction covering an area specified by a cone whose tip is the
       spot light. A spot lights intensity falls off exponentially with
       the angle from the centerline of the cone. The angle is specified
       in radians, not degress as with POV-Ray. Specifying the angle in
       degrees can have the effect of severly over lighting the area
       covered by the spot light. Point lights also fall off in
       intensity, but do so with distance from the lights location. A
       point light shines in all directions at once so does not contain
       direction but does have position.
             Area lights are series of point lights that take on the
       shape of an object to which they are attached. In this way a the
       harshness of the shadows cast by a point light can be lessened by
       creating a larger surface of emitted light. I was not able to
       learn much about area lights so can't really go into detail on how
       to use them here.
             Most light source shaders use one of two illumination
       functions: illuminate() and solar(). Both provides ways of
       integrating light sources on a surface over a finite cone.
       illuminate() allows for the specification of position for the
       light source, while solar() is used for light sources that are
       considered very distant, like the Sun or stars. I consider the
       writing of light source shaders to be a bit of an advanced topic
       since the use of the default light source shaders should be
       sufficient for the novice user to which this article is aimed.
       Readers should consult The RenderMan Companion and The RenderMan
       Specification for details on the use of the default shaders.
       
       Surface Shaders 
             Surface shaders are one of the two types of shaders novice
       users will make use of most often (the other is displacement
       shaders). Surface shaders are used to determine the color of light
       reflected by a given surface point in a particular direction.
       Surface shaders are used to create wood grains or the colors of an
       eyeball. They also define the opacity of a surface, ie the amount
       of light that can pass through a point (the points transparency).
       A point that is totally opaque allows no light to pass through it,
       while a point that is completely transparent reflects no light.
             The majority of the examples which follow will cover surface
       shaders. One will be a displacement shader.
       
       Volume Shaders 
             A volume shader affects light traveling to towards the
       camera as it passes though and around objects in a scene. Interior
       volume shaders determine the effect on the light as it passes
       through an object. Exterior volume shaders affect the light in the
       "empty space" around an object. Atmospheric shaders handle the
       space between objects. Exterior and interior volume shaders differ
       from atmospheric shaders in that the latter operate on all rays
       originating from the camera (remember that ray tracing traces the
       lights ray in reverse from nature - from camera to light source).
       Exterior and interior shaders work only on secondary rays, those
       rays spawned by the trace() function in shaders. Atmospheric
       shaders are used for things like fog and mist. Volume shaders are
       a slightly more advanced topic which I'll try to cover in a future
       article.
       
       Displacement Shaders 
             The texture of an object can vary in many ways, from very
       smooth to very bumpy, from smooth bumps to jagged edges. With
       ordinary surface shaders a texture can be simulated with the use
       of a bump map. Bump maps perturb the normal of a point on the
       surface of an object so that the point appears to be raised,
       lowered, or otherwised moved from its real location. A bump map
       describes the variations in a surfaces orientation. Unfortunately,
       this is only a trick and the surface point is not really moved.
       For some surfaces this trick works well when viewed from the
       proper angle. But when seen edge on the surface variations
       disapper - the edge is smooth. A common example is an orange. With
       a bump map applied the orange appears to be pitted over its
       surface. The edge of the sphere, however, is smooth and the
       pitting effect is lost. This is where displacement shaders come
       in.
             In The RenderMan Interface Specification[3] it says
       
     The displacement shader environment is very similar to a surface
     shader, except that it only has access to the geometric surface
     parameters. [A displacement shader] computes a new P [point] and/or
     a new N [normal for that point].
       A displacement shader operates across a surface, modifying the
       physical location of each point. These modifications are generally
       minor and of a type that would be much more difficult (and
       computationally expensive) to specify individually. It might be
       difficult to appreciate this feature until you've seen what it can
       do. Plate 9 in [4] shows an ordinary cylinder modified with the
       threads() displacement shader to create the threads on the base of
       a lightbulb. Figures 1-3 shows a similar (but less sophisticated)
       example. Without the use of the displacement shader, each thread
       would have to be made with one ore more individual objects. Even
       if the computational expense for the added objects were small, the
       effort required to model these objects correctly would still be
       significant. Displacement shaders offer procedural control over
       the shape of an object.
       
       Ordinary cylinder Ordinary cylinder with Normals modified Cylinder
       with true displacments
       An ordinary cylinder
       
                    Same cylinder with modified normals
       
       Note that in this case the renderer attributes have not been
       turned on. The edges of the cylinder are flat, despite the
       apparent non-flat surface. Same cylinder with true displacements
       In this image the renderer attributes have been turned on. The
       edges of the cylinder reflect the new shape of the cylinder.
       Figure 1 Figure 2 Figure 3
             An important point to remember when using displacement
       shaders with BMRT is that, by default, displacements are not
       turned on. Even if a displacement shader is called the points on
       the surface only have their normals modified by the shader. In
       order to do the "true displacement", two renderer attribute
       options must be set:

     Attribute "render" "truedisplacement" 1
     Attribute "displacementbound" "coordinatesystem"
               "object" "sphere" 2
   The first of these turns on the true displacement attribute so that
       displacement shaders actually modify the position of a point on
       the surface. The second specifies how much the bounding box around
       the object should grow in order to enclose the modified points.
       How this works is that the attribute tells the renderer how much
       the bounding box is likely to grow in object space. The renderer
       can't no before hand how much a shader might modify a surface, so
       this statement provides a maximum to help the renderer with
       bounding boxes around displacement mapped objects. Remember that
       bounding boxes are used help speed up ray-object hit tests by the
       renderer. Note that you can compute the possible change caused by
       the displacement in some other space, such as world or camera. Use
       whatever is convenient. The "sphere" tag lets the renderer know
       that the bounding box will grow in all directions evenly.
       Currently BMRT only supports growth in this manner, so no other
       values should be used here.
       
       Transformation and Imager Shaders 
             BMRT doesn't support Transformation Shaders (neither does
       Pixar's PRMan apparently). Apparently transformation shaders are
       supposed to operate on geometric coordinates to apply "non-linear
       geometric transformations". According to [5]
       
     The purpose of a transformation shader is to modify a coordinate
     system.
       It is used to deform the geometry of a scene without respect to
       any particular surface. This differs from a displacement shader
       because the displacement shader operates on a point-by-point basis
       for a given surface. Transformation shaders modify the current
       transform, which means they can affect all the objects in a scene.
       
             Imager shaders appear to operate on the colors of output
       pixels which to me means the shader allows for color correction or
       other manipulation after a pixels color has been computed but
       prior to the final pixel output to file or display. This seems
       simple enough to understand, but why you'd use them I'm not quite
       sure. Larry says that BMRT supports Imager shaders but PRMan does
       not. However, he suggests the functionality provided is probably
       better suited to post-processing tools, such as XV, ImageMagick or
       the Gimp.
       
5. Shader language syntax

             So what does a shader file look like? They are very similar
       in format to a C procedure, with a few important differences. The
       following is a very simplistic surface shader:

        surface matte (
                 float Ka = 1;
                 float Kd = 1;
        )
        {
          point Nf;

          /*
           * Calculate the normal which is facing the
           * direction that points towards the camera.
           */
          Nf = faceforward (normalize(N),I);

          Oi = Os;
          Ci = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf));
        }
   This is the matte surface shader provided in the BMRT distribution.
       The matte surface shader happens to be one of a number of required
       shaders that The RenderMan Interface Specification says a
       RenderMan compliant renderer must provide.
       
       Shader procedure names 
             The first thing to notice is the procedure type and name. In
       this case the shader is a surface shader and its name is "matte".
       When this code is compiled by slc it will produce a shader called
       "matte" in a file called "matte.so". Procedure names can be any
       name that is not a reserved RIB statement. Procedure names may
       contain letters, numbers and underscores. They may not contain
       spaces.
       
       Variables and scope 
             There are a number of different kinds of variables that are
       used with shaders: Instance variables, global variables, and local
       variables. Instance variables are the variables used as parameters
       to the shader. When calling a shader these variables are declared
       (if they have not already been declared) and assigned a value to
       be used for that instance of the shader. For example, the matte
       shader provides two parameters that can have appropriate values
       specified when the shader is instanced within the RIB file. Lets
       say we have a sphere for which we will shade using the matte
       shader. We would specify the instance variables like so:

        AttributeBegin
           Declare "Kd" "float"
           Declare "Ka" "float"
           Surface "matte" "Kd" 0.5 "Ka" 0.5
           Sphere 1 -.5 .5 360
        AttributeEnd
   The values specified for Kd and Ks are the instance variables and the
       renderer will use these values for this instance of the shader.
       Instance variables are generally known only to the shader upon the
       initial call for the current instance.
             Local variables are defined within the shader itself and as
       such are only known within the shader. In the example matte
       shader, the variable Nf is a point variable as has meaning and
       value only within the scope of the shader itself. Other shaders
       will not have access to the values Nf holds. Local variables are
       used to hold temporary values required to compute the values
       passed back to the renderer. These return values are passed back
       as global variables.
             Global variables have a special place in the RenderMan
       environment. The only way a shader can pass values back to the
       renderer is through global variables. Some of the global variables
       that a shader can manipulate are the surface color (Cs), surface
       opacity (Os), the normal vector for the current point (N) and the
       incident ray opacity (Oi). Setting these values within the shader
       affects how the renderer colors surface points for the object
       which is being shaded. The complete list of global variables that
       a particular shader type can read or modify is listed in tables in
       the RenderMan Interface Specification [6]. Global variables are
       global in the sense that they pass values between the shader and
       the renderer for the current surface point, but they cannot be
       used to pass values from one objects shader to another.
       
       Data types and expressions 
             Shaders have access to only 4 data types: one scalar type,
       two vector types, and a string type. A string can be defined and
       used by a shader, but it cannot be modified. So an instance
       variable that passes in a string value cannot be modified by the
       shader, nor can a local string variable be modified once it has
       been defined.
             The scaler type used by shaders is called a float type.
       Shaders must use float variables even for integer calculations.
       The
       
     point type is a a 3 element array of float values which describe a
    point in some space. By default the point is in world space in BMRT
    (PRMan uses camera space by default), but it is possible to convert
     the point to object, world, texture or some other space within the
     shader. On point can be transformed to a different space using the
                     transform statement. For example:

       float y = ycomp(transform("object",P));

      will convert the current point to object space and return the Y
   component of the new point into the float variable y. The other vector
   type is also a 3 element array of float values that specify a color. A
               color type variable can be defined as follows:

       color Cp = color (0.5, 0.5, 0.5);

                                      
           Expressions in the shading language follow the same rules of
    precedence that are used in the C language. The only two expressions
   that are new to shaders are the Dot Product and the Cross Product. The
    Dot Product is used to measure the angle between two vectors and is
     denoted by a period (.). Dot Products work on point variables. The
   Cross Product is often used to find the normal vector at a point given
    two nonparallel vectors tangent to the surface at a given point. The
     Cross Product only works on points, is denoted by a caret (^) and
                           returns a point value.
                                      
   Functions 
         A shader need not be a completely self contained entity. It can
   call external routines, known as functions. The RenderMan Interface
   Specificatoin predefines a large number of functions that are
   available to shader authors using BMRT. The following list is just a
   sample of these predefined functions:
     * Math functions such as sin(), cos(), pow(), exp(), sqrt() and
       log().
     * Math functions such as min(), max() and clamp().
     * Derivative functions Du(), Dv(), and Deriv() which have versions
       which work on float, color, and point values.
     * A noise() function for random value.
     * Geometric functions like area(), length() and distance().
     * Color functions like mix() which mixes two of its arguments based
       on a third argument.
     * Shading and Lighting functions such as specular() and phong()
     * Texture map functions for using texture maps within shaders
       
   This is not a comprehensive list, but it provides a sample of the
   functions available to the shader author. Many functions operate on
   more than one data type (such as points or colors). Each can be used
   to calculate a new color, point, or float value which can then be
   applied to the current surface point.
         Shaders can use their own set of functions defined locally. In
   fact, its often helpful to put functions into a function library that
   can be included in a shader using the #include directive. For example,
   the RManNotes Web site provides a function library called
   "rmannotes.sl" which contains a pulse() function that can be used to
   create lines on a surface. If we were to use this function in the
   matte shader example, it might look something like this:

        #include "rmannotes.sl"

        surface matte (
                 float Ka = 1;
                 float Kd = 1;
        )
        {
          point Nf;
          float fuzz = 0.05
          color Ol;

          /*
           * Calculate the normal which is facing the
           * direction that points towards the camera.
           */
          Nf = faceforward (normalize(N),I);

          Ol = pulse(0.35, 0.65, fuzz, s);
          Oi = Os*Ol;
          Ci = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf));
        }

   The actual function is defined in the rmmannotes.sl file as
  #define pulse(a,b,fuzz,x) (smoothstep((a)-(fuzz),(a),(x)) - \
                             smoothstep((b)-(fuzz),(b),(x)))

   A shader could just as easily contain the #defined value directly
   without including another file, but if the function is useful shader
   authors may wish to keep them in a separate library similar to
   rmmannotes.sl. In this example, the variable s is the left-to-right
   component of the current texture coordinate. "s" is a component of the
   texture space, which we'll cover in the section on coordinate systems.
   "s" is a global variable which is why it is not defined within the
   sample code.
   
   Note: This particular example might not be very useful. It is just
   meant to show how to include functions from a function library.
   
         Functions are only callable by the shader, not directly by the
   renderer. This means a function cannot be used directly in a RIB file
   or referenced using the C binding to the RenderMan Interface.
   Functions cannot be recursive - they cannot call themselves. Also, all
   variables passed to functions are passed by reference, not by value.
   It is important to remember this last item so that your function
   doesn't inadvertantly make changes to variables you were not
   expecting.
   
   Statements 
         The shading language provides the following statements for flow
   control:
     * if-then-else
     * while (boolean expression) statement
     * for (expr; boolean expr; expr) statement
     * break [n] - "n" is the number of nested levels to exit from
     * continue [n] - "n" is the number of nested levels to exit from
     * return expression
       
   All of these act just like their C counterparts.
   
   Coordinate Systems 
         There are number of coordinate systems used by RenderMan. Some
   of these I find easy to understand by themselves, others are more
   difficult - especially when used within shaders. In a shader, the
   surface of an object is mapped to a 2 dimensional rectangular grid.
   This grid runs from coordinates (0,0) in the upper left corner to
   (1,1) in the lower right corner. The grid is overlayed on the surface,
   so on a rectangular patch the mapping is obvious. On a sphere the
   upper corners of the grid map to the same point on the top of the
   sphere. This grid is known as parameter space and any point in this
   space is referred to by the global variables u and v. For example, a
   point on the surface which is in the exact center of the grid would
   have (u,v) coordinates (.5, .5).
         Similar to parameter space is texture space. Texture space is a
   mapping of a texture map that also runs from 0 to 1, but the variables
   used for texture space are s and t. By default, texture space is
   equivalent to parameter space unless either vertex variables
   (variables applied to vertices of primitive objects like patches or
   polygons) or the TextureCoordinates statement have modified the
   texture space of the primitive being shaded. Using the default then, a
   texture map image would have its upper left corner mapped to the upper
   left corner of the parameter space grid overlying the objects surface,
   and the lower right corner of the image would be mapped to the lower
   right corner of the grid. The image would therefore cover the entire
   object. Since the texture space does not have to be equivalent to
   parameter space it would be possible to map an image to only a portion
   of an object. Unfortunately, I didn't get far enough this month to
   provide an example of how to do this. Maybe next month.
         There are other spaces as well: world space, object space, and
   shader space. How each of these affects the shading and texturing
   characteristics is not completely clear to me yet. Shader space is the
   default space in which shaders operate, but points in shader space can
   be transformed to world or object space before being operated on. I
   don't know exactly what this means or why you'd want to do it just yet
   
6. Format of a shader file

         Shader files are fairly free form, but there are methodologies
   that can be used to make writing shaders easier and the code more
   understandable. In his RManNotes [7], Stephen F. May writes
   
     One of the most fundamental problem solving techniques is "divide
     and conquer." That is, break down a complex problem into simpler
     parts; solve the simpler parts; then combine those parts to solve
     the original complex problem.
     
     In shaders, [we] break down complicated surface patterns and
     textures into layers. Each layer should be fairly easy to write (if
     not, then we can break the layer into sub-layers). Then, [we]
     combine the layers by compositing.
     
   The basic structure of a shader is similar to a procedure in C - the
   shader is declared to be a particular type (surface, displacement, and
   so forth) and a set of typed parameters are given. Unlike C, however,
   shader parameters are required to have default values provided. In
   this way a shader may be instanced without the use of any instance
   variables. If any of the parameters are specified with instance
   variables then the value in the instance variable overrides the
   parameters default value. An minimalist shader might look like the
   following:

        surface null ()
        {
        }

   In fact, this is exactly the definition of the null shader. Don't ask
   me why such a shader exists. I'm sure the authors of the specification
   had a reason. I just don't know what it is. Adding a few parameters,
   we start to see the matte shader forming:

        surface matte (
                 float Ka = 1;
                 float Kd = 1;
        )
        {
        }

   The parameters Ka and Kd have their default values provided. Note that
   Ka is commonly used in the shaders in Guido Quaroni's archive of
   shaders to represent a scaling factor for ambient light. Similarly, Kd
   is used to scale diffuse light. These are not global variables, but
   they are well known variables, much like "i", "j", and "k" are often
   used as counters in C source code (a throwback to the heady days of
   Fortran programming).
         After the declaration of the shader and its parameters comes the
   set of local variables and the shader code that does the "real work".
   Again, we look at the matte shader:

        #include "rmannotes.sl"

        surface matte (
                 float Ka = 1;
                 float Kd = 1;
        )
        {
          point Nf;
          float fuzz = 0.05
          color Ol;

          /*
           * Calculate the normal which is facing the
           * direction that points towards the camera.
           */
          Nf = faceforward (normalize(N),I);

          Ol = pulse(0.35, 0.65, fuzz, s);
          Oi = Os*Ol;
          Ci = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf));
        }

   Nothing special here. It looks very much like your average C
   procedure. Now we get into methodologies. May [8] shows us how a
   layered shader's psuedo-code might look:

        surface banana(...)
        {
          /* background (layer 0) */
          surface_color = yellow-green variations;

          /* layer 1 */
          layer = fibers;
          surface_color = composite layer on surface_color;

          /* layer 2 */
          layer = bruises;
          surface_color = composite layer on surface_color;

          /* layer 3 */
          layer = bites;
          surface_color = composite layer on surface_color;

          /* illumination */
          surface_color = illumination based on surface_color
                          and illum params;

          /* output */
          Ci = surface_color;
        }

   What is happening here is that the lowest level applies yellow-and
   green colors to the surface, after which a second layer has fiber
   colors composited (blended or overlayed) in. This continues for each
   of 4 defined layers (0 through 3) plus an illumination calculation to
   determine the relative brightness of the current point. Finally, the
   newly computed surface color is ouput via a global variable. Using
   this sort of methodology makes writing a shader much easier as well as
   allowing other shader authors to debug and/or extend the shader in the
   future. A shader file is therefore sort of bottom-up design, where the
   bottom layers of the surface are calculated first and the topmost
   layers are computed last.
   
7. A word about texture maps

         As discussed earlier, texture maps are images mapped from 0 to 1
   from left to right and top to bottom upon a surface. Every sample in
   the image is interpolated between 0 and 1. The mapping does not have
   to apply to the entire surface of an object, however, and when used in
   conjunction with the parameter space of the surface (the u,v
   coordinates) it should be possible to map an image to a section of a
   surface.
         Unfortunately, I wasn't able to determine exactly how to use
   this knowledge for the image I submitted to the IRTC this month. Had I
   figured it out in time, I could have provided text labels on the
   bindings of the books in the bookcases for that scene. Hopefully, I'll
   figure this out in time for the next article on BMRT and can provide
   an example on how to apply texture maps to portions of surfaces.
   
8. Working examples

   
         The best way to actually learn how to write a shader is to get
   down and dirty in the bowels of a few examples. All the references
   listed in the bibliography have much better explanations for the
   exaples I'm about to describe, but these should be easy enough to
   follow for novices.
   
   A colored cross pattern
         This example is taken verbatim from RManNotes by Stephen F. May.
   The shader creates a two color cross pattern. In this example the
   pattern is applied to a simple plane (a bilinear patch). Take a look
   at the source code.

        color surface_color, layer_color;
        color surface_opac, layer_opac;

   The first thing you notice is that this shader defines two local color
   variables: surface_color and layer_color. The layer_color variable is
   used to compute the current layers color. The surface_color variable
   is used to composite the various layers of the shader. Two other
   variables, surface_opacity and layer_opacity, work similarly for the
   opacity of the current layer.
         The first layer is a verticle stripe. The shader defines the
   color for this layer and then determines the opacity for the current
   point by using a function called pulse(). This is a function provided
   by May in his "rmannotes.sl" function library. The pulse() function
   allows the edges of the stripes in this shader to flow smoothly from
   one color to another (take a look at the edges of the stripes in the
   sample image). pulse() uses the fuzz variable to determine how fuzzy
   the edges will be. Finaly, for each layer the layers color and opacity
   are blended together to get the new surface color. The blend()
   function is also part of rmannotes.sl and is an extension of the
   RenderMan Interface's mix() function, which mixes color and opacity
   values.
   Tiled cross pattern
   Figure 4
   RIB Source code for this example       Finally, the incident rays
   opacity global variable is set along with its color.

        Oi = surface_opac;
        Ci = surface_opac * surface_color;

   These two values are used by the renderer to compute pixel values in
   the output image.
   
   Adding opacity - a wireframe shader 
         This example is taken from the RenderMan Companion. It shows how
   a shader can be used to cut out portions of a solid surface. We use
   the first example as a backdrop for a sphere that is shaded with the
   screen() shader from the RenderMan Companion text (the name of the
   shader as used here is slightly different because it is taken from the
   collection of shaders from Guido Quaroni, who changed the names of
   some shaders to reflect their origins). First lets look at the sceen
   using the "plastic" shader (which comes as a default shader in the
   BRMT distribution). Figure 5 shows how this scene renders. The sphere
   is solid in this example. The RIB code for this contains the following
   lines:

        AttributeBegin
           Color [ 1.0 0.5 0.5 ]
           Surface "plastic"
           Sphere 1 -1 1 360
        AttributeEnd

   In Figure 6 the sphere has been changed to a wireframe surface. The
   only difference between this scene and Figure 5 is the surface shader
   used. For Figure 6 the rib code looks like this:

        AttributeBegin
           Color [ 1.0 0.5 0.5 ]
           Surface "RCScreen"
           Sphere 1 -1 1 360
        AttributeEnd

   The rest of the RIBs are exactly the same. Now lets look at the
   screen() shader code.

surface
RCScreen(
  float Ks   = .5,
  Kd         = .5,
  Ka         = .1,
  roughness  = .1,
  density    = .25,
  frequency  = 20;
  color specularcolor = color (1,1,1) )
{
   varying point Nf =
           faceforward( normalize(N), I );

   point V = normalize(-I);

   A Wireframed sphere - without wireframe
   Figure 5
   RIB Source code for this example
   A Wireframed sphere - with wireframe
   Figure 6
   RIB Source code for this example
   A Wireframed sphere - thinner grid lines
   Figure 7
   RIB Source code for this example

   if( mod(s*frequency,1) < density ||
       mod(t*frequency,1) < density )
      Oi = 1.0;
   else
      Oi = 0.0;
   Ci = Oi * ( Cs * ( Ka*ambient() + Kd*diffuse(Nf) ) +
               specularcolor*Ks* specular(Nf,V,roughness));
}

   
         The local variable V is defined to be the normalized vector for
   the incident light rays direction. The incident light ray direction is
   the direction from which the camera views the current surface
   coordinate. This value is used later to compute the specular highlight
   to be used on the portion of the surface which will not be cut out of
   the sphere.
         The next thing the shader does is to compute the modulo of the s
   component of the texture space times the frequency of the grid lines
   of the wireframe. This value is always less than 1 (the modulo of
   s*frequency is the remainder left for n*1 < s*frequency for some value
   n). If this value is also less then the density then the current
   coordinate on the surface is part of the visible wireframe that
   traverses the surface horizontally. Likewise, the same modulo is
   computed for t*frequency and if this value is also less than the
   density then the current coordinate point is on one of the visible
   verticle grid lines of the wireframe. Any point for which the module
   of either of these is greater than the density is rendered completely
   transparent. The last line computes the grid lines based on the
   current surface color and a slightly metallic lighting model.
         The default value for the density is .25, which means that
   approximately 1/4 of the surface will be visible wireframe. Changing
   the value with an instance variable to .1 would cause the the
   wireframe grid lines to become thinner. Figure 7 shows an example of
   this. Changing the frequency to a smaller number would cause fewer
   grid lines to be rendered.
   
   A simple paper shader 
         While working on my entry for the March/April 1997 round of the
   IRTC I wrote my first shader - a shader to simulate 3 holed notebook
   paper. This simplistic shader offers some of the characteristics of
   the previous examples in producing regularly spaced horizontal and
   verticle lines plus the added feature of fully transparent circular
   regions that are positioned by instance variables.       We start by
   defining the parameters needed by the shader. There are quite a few
   more parameters than the other shaders. The reason for this is that
   this shader works on features which are not quite so symmetrical. You
   can also probably chalk it up to my inexperience.

   color hcolor       = color "rgb" (0, 0, 1);
   color vcolor       = color "rgb" (1, 0, 0);
   float hfreq        = 34;
   float vfreq        = 6;
   float skip         = 4;
   float paper_height = 11;
   float paper_width  = 8.5;
   float density      = .03125;
   float holeoffset   = .09325;
   float holeradius   = .01975;
   float hole1        = 2.6;
   float hole2        = 18;
   float hole3        = 31.25;

   The colors of the horizontal and vertical lines come first. There are,
   by default, 34 lines on the paper with the first 4 "skipped" to give
   the small header space at the top of the paper. The vertical frequency
   is used to divide the paper in n equal vertical blocks across the
   page. This is used to determine the location of the single verticle
   stripe. We'll look at this again in a moment.
         The paper height and width are used to map the parameter space
   into the correct dimensions for ordinary notebook paper. The density
   parameter is the width of each of the visible lines (horizontal and
   vertical) on the paper. The hole offset defines the distance from the
   left edge of the paper to the center point of the 3 holes to be
   punched out. The holeradius is the radius of the holes and the
   hole1-hole3 parameters give the horizontal line over which the center
   of that hole will live. For example, for hole1 the center of the hole
   is 2.6 horizontal stripes down. Actually, the horizontal stripes are
   created at the top of equally sized horizontal blocks, and the
   hole1-hole3 values are number of horizontal blocks to traverse down
   the paper for the holes center. Now lets look at how the lines are
   created.

   surface_color = Cs;

   This line simply initializes a local variable to the current color of
   the surface. We'll use this value in computing a new surface color
   based on whether the point is on a horizontal or vertical line.

/*
 * Layer 1 - horizontal stripes.
 * There is one stripe for every
 * horizontal block.  The stripe is
 * "density" thick and starts at the top of
 * each block, except for the first "skip"
 * blocks.
 */
tt = t*paper_height;
for ( horiz=skip; horiz&lthfreq; horiz=horiz+1 )
{
   min = horiz*hblock;
   max = min+density;
   val = smoothstep(min, max, tt);
   if ( val != 0 && val != 1 )
      surface_color = mix(hcolor, Cs, val);
}

   This loop runs through all the horizontal blocks on the paper (defined
   by the hfreq parameter) and determines if the point lies between the
   top of the block and the top of the block plus the width of a
   horizontal line (specified with the density parameter).
   3 Holed paper
   Figure 8
   RIB Source code for this example
   3 Holed paper - thicker lines
   Figure 8 The smoothstep() function is part of the standard RenderMan
   functions and returns a value that is between 0 and 1, inclusive, that
   shows where "tt" sits between the min and max values. If this value is
   not at either end then the current surface point lies in the bounds of
   a horizontal line. The point is given the "hcolor" value mixed with
   the current surface color We mix the colors in order to allow the
   edges of the lines to flow smoothly between the horizontal lines color
   and the color of the paper. In other words, this allows for
   antialiasing the horizontal lines. The problem with this is - it
   doesn't work. It only aliases one side of the line, I think. In any
   case, you can see from Figure 8 that the result does not quite give a
   smooth, solid set of lines.
         An alternative approach would be to change the mix() function
   call (which is part of the RenderMan shading lanague standard
   functions) to a more simple mixture of the line color with the value
   returned by smoothstep(). This code would look like this:

   min = horiz*hblock;
   max = min+density;
   val = smoothstep(min, max, tt);
   if ( val != 0 && val != 1 )
      surface_color = val*hcolor;

   Alternatively, the line color could be used on its own, without
   combining it with the value returned from the smooth step. This gives
   a very jagged line, but the line is much darker even when used with
   smaller line densities. The result from using the line color alone
   (with a smaller line density) can be seen in Figure 9.

   /* Layer 2 - vertical stripe */
   ss = s*paper_width;
   min = vblock;
   max = min+density;
   val = smoothstep(min, max, ss);
   if ( val != 0 && val != 1 )
      surface_color = mix(vcolor, Cs, val);

   This next bit of code does exactly the same as the previous code
   except it operates on the vertical line. Since there is only one
   verticle line there is no need to check every vertical block, only the
   one which will contain the visible stripe (which is specified with the
   vblock parameter).
         Finally we look at the hole punches. The center of the holes are
   computed relative to the left edge of the paper:

   shole = holeoffset*paper_width;
   ss  = s*paper_height;
   tt  = t*paper_height;
   pos = (ss,tt,0);

   Note that we use the papers height for converting the ss,tt variables
   into the scale of the paper width and height. Why? Because if we used
   the width for ss we would end up with eliptical holes. There is
   probably a better way to deal with this problem (of making the holes
   circular) but this method worked for me.
         For each hole, the current s,t coordinates distance from the
   hole centers is computed. If the distance is less than the holes
   radius then the opacity for the incident ray is set to completely
   transparent.

   /* First Hole */
   thole = hole1*hblock;
   hpos  = (shole, thole, 0);
   Oi = filterstep (holeradius*paper_width,
                     distance(pos,hpos));

   /* Second Hole */
   thole = hole2*hblock;
   hpos = (shole, thole, 0);
   Oi *= filterstep (holeradius*paper_width,
                      distance(pos,hpos));

   /* Third Hole */
   thole = hole3*hblock;
   hpos = (shole, thole, 0);
   Oi *= filterstep (holeradius*paper_width,
                      distance(pos,hpos));

   Filterstep is, again, a standard function in the RenderMan
   specification. However, this function was not documented by either the
   RenderMan Interface Specification or the RenderMan Companion.
   According to Larry Gritz
   
     The filterstep() function is identical to step, except that it is
     analytically antialiased. Similar to the texture() function,
     filterstep actually takes the derivative of its second argument,
     and "fades in" at a rate dependent on how fast that variable is
     changing. In technical terms, it returns the convolution of the
     step function with a filter whose width is about the size of a
     pixel. So, no jaggies.
     
   Thus, using filterstep() helped to antialias the edges of the holes
   (although its not that obvious from such a small image given in
   Figures 8 and 9). I didn't try it, but I bet filterstep() could
   probably be used to fix the problems with the horizontal and vertical
   lines.
   
   A textured mapped chalkboard 
         This simple texture map example is used in my Post Detention
   image which I entered in the March/April 1997 IRTC. The actual shader
   is taken from the archive collection by Guido Quaroni, and the shader
   originally comes from Larry Knott (who I presume works at Pixar). I
   didn't add an image of this since all you would see would be the
   original image mapped on a flat plane, which really doesn't show
   anything useful. If you want to take a look at the chalkboard in a
   complete scene, take a look at the companion article in this months
   Graphics Muse column.
         Like the other shader examples, this one is fairly
   straightforward. An image filename is passed in the texturename
   parameter. Note that image files must be TIFF files for use with BMRT.
   The texture coordinates are used to grab a value from the image file
   which is then combined with the ambient and diffuse lighting for the
   incident ray. If a specular highlight has been specified (which it is
   by default in the Ks parameter) then a specular highlight is added to
   the incident ray. Finally, the output value, Ci, is combined with the
   surfaces opacity for the final color to be used by the current surface
   point.
   
   Displacement map example 
         We've already seen an example of displacement maps using the
   threads() shader. Lets take a quick look at the shader code:

   magnitude = (sin( PI*2*(t*frequency +
                     s + phase))+offset) * Km;

   Here, the displacement of the surface point is determined by using a
   phased sinusoidal. The t variable determines the position lengthwise
   across the surface and s is used to cause the spiraling effect. The
   next bit of code

   if( t > (1-dampzone))
      magnitude *= (1.0-t) / dampzone;
   else if( t < dampzone )
      magnitude *= t / dampzone;

   causes the ends of the surface, in our case a cylinder, to revert to
   the original shape. For our example that means this forces the shader
   to leave the ends circular. This helps to keep the object that has
   been threaded in a shape that is easily joined to other objects. In
   the RenderMan Companion, the threaded cylinder is joined to a glass
   bulb to form a light bulb. Finally, the last two lines

   P += normalize(N) * magnitude;
   N = calculatenormal(P);

   cause the point to be moved and the normal for the new point to be
   calculated. In this way the point visually appears to have moved,
   which indeed it has.
   
   Next month I planned on doing the 3rd part of this 3 part BMRT series.
   I think taking 2 months between articles worked well for me this time
   since it allowed me a little more time to dig deeper. Plan on the
   final article on BMRT in this series in the July issue of the Graphics
   Muse. Till then, happy rendering.
   indent
    Bibliography
    1. Ebert, Musgrave, Peachy, Perlin, Worley. Texturing and Modeling: A
       Procedural Approach, 5-6; AP Professional (Academic Press), 1994
    2. Upstill, Steve. The RenderMan Companion - A Programmer's Guide to
       Realistic Computer Graphics, 277-278; Addison Wesley, 1989
    3. The RenderMan Interface Specification, Version 3.1 112-113; Pixar,
       Septermber 1989
    4. Upstill, Steve. The RenderMan Companion - A Programmer's Guide to
       Realistic Computer Graphics, color plates section; Addison Wesley,
       1989
    5. Upstill, Steve. The RenderMan Companion - A Programmer's Guide to
       Realistic Computer Graphics, 279; Addison Wesley, 1989
    6. The RenderMan Interface Specification, Version 3.1 110-114; Pixar,
       Septermber 1989
    7. RManNotes "Writing RenderMan Shaders - Why follow a methodolgy?";
       Stephen F. May, Copyright � 1995, 1996
    8. RManNotes "Writing RenderMan Shaders - The Layered Approach";
       Stephen F. May, Copyright � 1995, 1996
       
   indent
   � 1996 by Michael J. Hammel
   
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                                 Kandinski
                                      
                      By Jeff Hohensee, ott@casper.com
                                      
     _________________________________________________________________
                                      
   Kandinski is my new pre-pre-pre-beta program which generates a picture
    file from a MIDI file. It does so based on my cycluphonic method of
    correlating colors to musical pitches. The few careful observers who
   have seen previous implementations of cycluphonics agree that it gives
    visual events which seem to sympathize with the generating music, in
   terms of implied feeling, better than previous "color organ" methods.
   Kandinski was written with pfe under Linux on a 486. It should be easy
   to port to another ANSI Forth system, as I am rusty at Forth, and the
        task at hand didn't call for any trickery, and I avoided the
      Linux-specific stuff in pfe, mostly because I couldn't find much
   documentation on it. The code presented here creates a .ppm image file
   on a selectable track by track basis. The piano envelope option is not
   implemented yet, just organ. .ppm files can be converted to just about
     any image format with the unix pbmplus tools, and are viewable in
    Linux with zgv. The crucial cycluphonic element in Kandinski is the
   "cycle" construct, a lookup table which Kandinski uses to map a 12 hue
    color wheel to the Cycle of Fifths. That's the crux of cycluphonics.
       If you use this code, or cycluphonics, give credit where due.
                                      
  How Kandinski operates ( I hope )
  
    Copy a MIDI file with some tonal music to filename in.mid . Run your
   ANSI Forth in the same directory. Include the Kandinski code into your
    dictionary. Type main at the ok prompt. Kandinski will check in.mid
    for a MIDI header. If in.mid is a midi file, Kandinski will traverse
    tracks until it finds a noteon message. It will then tell you a bit
   about the track and ask you if you want to make a picture of it. Hit y
   and it will ask you if you want to use a piano or an organ type volume
     envelope. The piano option is curently just a stub. Kandinski will
    then ask you to hit a key to seed the filename randomizer. Kandinski
        will then create a picture file with a filename of the form
     kanrrrrr.ppm, where r is a random letter. The track portion of the
     program repeats if there are more tracks with notes. The pictures
   created by Kandinski are 640 by 80 pixels, 24 bits color depth. I will
    soon be putting some Kandinski output up at http://cqi.com/~humbubba

( kandinski   )
( ANSI Forth sourcecode    Rick Hohensee    begun 199703  )
( A MIDIfile-to-still-picture implementation of my  Cycluphonic method
       of correlating colors and musical pitches. )
( used i486 Slackware Linux from the InfoMagic LDR sept 96, pfe,
      Jeff Glatt's    MIDI docs, dpans7    )
(   redistribution permission contingent on authorship credit   )

( default number base of file is.... ) decimal

( app notes, pfe file-postition is a DOUBLE!
            MIDI sizes are SINGLEs
            YEESH!  "f0" is a variable!   AAAAARRRRGGG!!!
            hex f0 decimal .      doesn't work as wished.      )


( my prefered tools, jigs and cheats )

: binary decimal 2   base !      ;

: .base base @ dup decimal . base !     ;



: walk ."             " key drop     ;

: 0s (   wipe data stack )
    depth dup if 0 do drop loop else drop then     ;

: paddump ( [  count ---  ]        counted dump from pad )
       pad swap dump    ;


(  app related ....)

0 value deltasum
2variable trkend   0 0 trkend 2!

0 value dpp  ( deltas per pixel )
create rgbs 640 3 * allot
0 value trk#
variable midifile
0 value pbmfile

create organstate 128 allot
organstate 128 0 fill  ( pfe allot leaves an "allot" string in the alloted
                               space )
create 12state 12 allot
12state 12 0 fill

0 value redac
0 value greenac
0 value blueac
0 value backfoot

create cycle 0 , 7 , 2 , 9 , 4 , 11 , 6 , 1 , 8 , 3 , 10 , 5 ,

create wheelred 12 allot
255 c, 255 c, 255 c, 127 c, 0 c, 0 c, 0 c, 0 c, 0 c, 127 c, 255 c, 255 c,
create wheelgreen 12 allot
0 c, 127 c, 255 c, 255 c, 255 c, 255 c, 255 c, 127 c, 0 c, 0 c, 0 c, 0 c,
create wheelblue 12 allot
0 c, 0 c, 0 c, 0 c, 0 c, 127 c, 255 c, 255 c, 255 c, 255 c, 255 c, 127 c,


0 value fid

create ppm
ascii P c, ascii 6 c, 10 c, ascii 6 c, ascii 4 c, ascii 0 c,
bl c, ascii 8 c, ascii 0 c,
bl c, ascii 2 c, ascii 5 c, ascii 5 c,




: msboff 127 and ;

: openin  ( opens a file called in.mid in current dir
            which can then be referenced via    midifile @ )
    S" in.mid" r/w bin open-file drop midifile !        ;

: in.mid ( --- fid_of_in.mid ) ( poorly factored, ) midifile @      ;

: inpos ( ---  2inpos ) ( get file position in in.mid )
     midifile @  file-position drop ( ior)      ;

: inpeek  ( [  count --- ]        counted read from in.mid to pad )
        pad swap
        midifile @ read-file drop     ;

: trksize (  --- trksize ) ( DOES move inpos )
     ( build a 32 bit track size cell from the WRONGendian value
       , from body0 to body0 )
     4 inpeek  drop     ( endianism translation )
     pad c@ 24 lshift
     pad 1 + c@ 16 lshift +
     pad 2 + c@ 8  lshift +
     pad 3 + c@ +                ;

2variable prevpos
2variable starttrk 0 0 starttrk 2!

: filebound ( fid --- 0 if inside file )
      dup >r file-position  drop r> file-size drop  2swap d< ;

: hoptrk ( [ --- inbounds_flag ] body0 to next trk body0 )
    trksize 8 + 0 inpos d+ in.mid reposition-file drop
    in.mid  filebound            ;

0 value envelope
0 value noteons 0 value noteoffs

: hinybble 240 and ;  ( f0 is a &$^%##%$ variable name! )
hex
0f constant lonybble
binary
: bit7 10000000 and ;
decimal

0 value delta

: bytein pad 1 in.mid read-file drop
1  if ( error) cr
." end of in.mid  "
    quit  else pad c@ then    ;

: bignum 0
begin bytein dup bit7
while
  msboff swap 7 lshift +
repeat
swap 7 lshift + ;

: ignore ( n --- ) ( add n to inpos )
0  inpos  d+ in.mid reposition-file drop     ;

: ignoreto ( delimiter --- ) ( ignore filebytes to delimiter )
 begin dup bytein = until  drop     ;

0 value moment

: mthd   ( --- da position of MThD or fail )
77 ignoreto 84 ignoreto 104 ignoreto 100 ignoreto inpos      ;

: mtrk 77 ignoreto  84 ignoreto 114 ignoreto 107 ignoreto inpos     ;

: seed
." hit a key please " key
time&date 2drop drop + + + in.mid + ;




: 128to12 ( organstate to 12state, i.e. midinote#s to notename#s )
12state 12 0 fill
128 0 do
   organstate i + c@  if
     1 i 12 mod 12state + c!
   then ( simple for now )
loop
;

: 12torgb 0 to redac  0 to  greenac  0 to blueac
12 0 do
   12state i + c@ if
      i cells cycle + @
      cells dup wheelred + @ redac  + 2 / to redac
      dup wheelgreen + @ greenac + 2 / to greenac
      wheelblue + @ blueac  + 2 / to blueac
   then
loop  ;




: orgtorgb ( pixel# --- )
128to12
12torgb
dup redac swap 3 * rgbs + c!
dup greenac swap  3 * 1 + rgbs + c!
blueac swap  3 * 2 + rgbs + c!
;


: reset (  --- )  (  actions on an   FF status byte  )
bytein case
  0 of bignum ignore ." ff 00 ignored "  endof
  1 of ." text     "           bignum ignore        endof
  2 of ." copyright     "      bignum ignore  endof
  3 of ."  trackname       "   bignum ignore   endof
  4 of ." inst name   "        bignum ignore     endof
  5 of ." lyric    "           bignum ignore      endof
  6 of ." flow marker   "      bignum ignore  endof
  7 of ." cue point, sample "  bignum ignore  endof
  33 of 2 ignore   ( port # )                         endof
  47 of ( ." last event of track   " ) 1 ignore       endof
  81 of  4 ignore                                     endof
  84 of 6 ignore ." smte o/s ignored "                endof
  88 of 5 ignore ( time sig )                         endof
   (  ."       unknown reset ff thang               "  )
endcase          ;

: sysex ( sysexbyte ---       ) ( i.e. message with status hinyb of f )
dup case
  240 of      247 ignoreto  ." ignoring f0 to f7      "     drop  endof
  241 of ." miditimecode, unsupported  "  drop          endof
  242 of ."  song position pointer     "  drop          endof
  243 of ."  song select               "  drop          endof
  244 of ."  unimplemented f4 sysex     "  drop         endof
  245 of ."  unimplemented f5 sysex    "  drop          endof
  246 of ."  tune calibrate            "  drop          endof
  249 of ."  unimplemented f9 sysex     "  drop         endof
  247 of ."  discontinue f0/240 stream  "  drop         endof
  248 of ."  midi clock                 "  drop         endof
  250 of ."  restart song               "  drop         endof
  251 of ."  midi continue, flow        "  drop         endof
  252 of ."  stop                       "  drop         endof
  254 of ."  active sense message       "  drop         endof
  253 of ."  unimplemented fd sysex     "  drop         endof
  255 of        reset                   endof
   ." impossible sysex     "
endcase      ;

: envelope? cr ." piano envelope or organ? (p=piano/other=organ) " key
ascii p = if -1 to envelope else 0 to envelope then ;

: message   ( survey pass )
bytein dup hinybble  case
   128 of 2 ignore   noteoffs 1 + to noteoffs  drop endof
   144 of  noteons  1+ to noteons   2 ignore drop endof
   160 of 2 ignore drop   endof
   176 of 2 ignore drop   endof
   192 of 2 ignore drop   endof
   208 of 2 ignore drop   endof
   224 of 2 ignore drop   endof
   240 of cr  sysex           endof

endcase     ;

: pianooff ." pianooff " 2 ignore ;
: pianoon  2 ignore ;
: organoff 0  organstate bytein +  c!  1 ignore   ;
: organon  -1  organstate bytein +  c! 1 ignore   ;

: messageagain   ( processing pass )
bytein dup hinybble  case
   128 of envelope if pianooff else organoff then drop endof
   144 of envelope if pianoon else organon then  drop endof
   160 of 2 ignore drop   endof
   176 of 2 ignore drop   endof
   192 of 2 ignore drop   endof
   208 of 2 ignore drop   endof
   224 of 2 ignore drop   endof
   240 of cr  sysex           endof

endcase     ;


: random.kan ( create file[name] kan[random].ppm )
seed srand
ascii k pad  c! ascii a pad 1 + c!   ascii n pad 2 + c!
8 3 do 26 random 97 + i pad + c! loop
    ascii . pad 8 + c! ascii p pad 9 + c! ascii p pad 10 + c!
    ascii m pad 11 + c!      ;

: makepic
random.kan
pad 12 r/w create-file drop to pbmfile  ( new filename exists )
ppm 16 pbmfile write-file drop
80 0 do
rgbs 640 3 * pbmfile write-file drop
loop
;

: process
0 to deltasum 0 to noteons 0 to noteoffs
640 0 do ( i=pixel )

   begin
     (  bignum backfoot   )
     bignum deltasum + to deltasum
     messageagain
     i dpp *  deltasum >
   while
   repeat
   (  paint pixel  )

   i orgtorgb
loop
makepic
;


: survey (  a track )
inpos  starttrk 2!
trksize 0  inpos d+ trkend 2!
0 to deltasum 0 to noteons 0 to noteoffs
begin
   bignum deltasum + to deltasum
   message
   inpos trkend 2@ d<
while
repeat
;

: track survey
noteons if ." This track has notes....    "
   cr ."  noteons " noteons .  ."     noteoffs " noteoffs .
   ."     MIDI clocks per pixel " deltasum 640 / dup to dpp .
   cr   ." wanna do a pic of this track? (y/other) "  key ascii y = if
envelope?
starttrk 2@ in.mid reposition-file drop inpos d. walk
noteons     .      dpp if
process else ."  less than one clock per pixel, no can do " walk then
then then
   ;

: typecheck
   mthd
inpos 2dup 4 0 d= if ." apparent std MIDI seq file. Yay.    "
else 16 0 d= if ." apparent RMID MIDI file.  OK.    " else
cr  ." in.mid is apparently not a MIDI file "  cr
." Copy MIDI file to be processed to in.mid   " bye then then       ;

: main        0 to trk#
openin  typecheck
begin
   trk# 1 + dup to trk#

   mtrk
   track
   ( bytein does a QUIT on end-of-file )
again
;

    Separate documentation file for the Kandinski program Rick Hohensee
        http://cqi.com/~humbubba or rickh@capaccess.org please cc to
                              humbubba@cqi.com
                                      
     _________________________________________________________________
                                      
                      Copyright � 1997, Jeff Hohensee
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                              1997 Linux Expo
                                      
                  By Jon "maddog" Hall maddog@zk3.dec.com
                                      
     _________________________________________________________________
                                      
    "Well, should we get one pitcher or two?" That was the question that
    began the first unofficial event of the Linux Expo Thursday night. A
   group of people, including Red Hat employees, some of the speakers and
     a tired maddog were at the Carolina Brewery in Chapel Hill, North
      Carolina. It was late, and I was the last person to arrive."Two
            pitchers," I cried,"Now what will you be drinking?"
                                      
    The next day, Friday April 4th started early, as I had to set up the
    Linux International booth, as well as absorb all that was happening.
      The event was held in the North Carolina Biotechnology Center at
   Research Triangle Park. As I approached the Biotech Center, I was met
    with a friendly parking coordinator that reinforced the information
       that "parking was scarce", and that most people had to park at
     outlying lots. Fortunately Red Hat had arranged for shuttle busses
    from those lots and from several of the hotels. Since our car had an
   exhibitor's pass, we were able to park close to the Biotech Center and
             unload our banners, handouts and stuffed penguins.
                                      
   There was a large tent to the left outside of the building containing
    the "Linux Expo Super Store" stocked with Linux books, Linux bumper
   stickers, T-shirts (including an excellently designed Expo shirt that
      said "Expose yourself to Linux" with a front and rear view of a
      penguin holding open an overcoat) and other interesting souvenir
       items. Further to the left was an outdoor viewing area for the
    conference talks that (due to the excellent weather) was a favorite
   spot for people to view the technical talks for free, especially while
      playing Frisbee. A raffle was held in the registration area, and
       prizes were given away on an hourly basis. Having registered,
   attendees were given a copy of the talks as well as an event schedule.
                                      
   The event was held on two floors with the exhibits spread out on both.
   There was another conference viewing area inside the building with TV
    monitors, as well as the conference auditorium itself. There was an
      Install Fest area (sponsored by the Washington D.C. Linux User's
    Group, Linux Hardware Solutions and Red Hat Software), where people
   brought their systems, received help with installing Red Hat's latest
   release, and Olaf Kirch's kernel-based NFS server was "stress tested"
    at the same time. Finally, there was a food court area, where people
     could buy sandwiches, chips, soda and other "software development
                                   food".
                                      
    There were fifteen vendors at the Expo, each with "table-top" booths
     to display their wares. I prefer the "pipe-and-drape" approach to
     trade shows rather than expensive booths, since I would rather the
    vendors put more money into development of the product and less into
     elaborate displays or floor shows with unicycle riders who juggle
       things. While not all Linux vendors were at Linux Expo, a wide
      spectrum of companies, including Linux International, Cyclades,
       Numerical Algorithms Group, Linux Hardware Solutions, Enhanced
     Software Technologies, Caldera, Applix, Xess, WorkGroup Solutions,
   Stay Online, VA Research, Apex Systems Integration, PromoX Systems and
   (of course) Red Hat Software were present. One item being demonstrated
     at the Linux Hardware Solutions booth was a free piece of software
   called [cw]em86[ecw] that allowed an Intel/Linux binary to run without
    change on an Alpha/Linux system. Being shown for the first time, it
   allowed Applixware, Netscape and various other applications to execute
                 as if they had been ported to the system.
                                      
   Penguins abounded in various T-shirts, giveaways and objects d'art. In
      fact, there were so many people there (I estimated 900 over the
   two-day event) with penguin "stuff", that I thought I'd had enough of
   penguins; but afterwards while wandering around Chapel Hill, Alan Cox
    found some candy in the shape of penguins, so penguin "lust" started
                              all over again.
                                      
    The technical conference started off with a presentation by Gilbert
    Coville of Apple Computer with a talk about the MkLinux kernel. For
     people who were afraid that this would turn into a "Red Hat Only"
   event, it was interesting that Gilbert's talk opened the Expo and that
     a talk about the Debian Linux Distribution (given by Bruce Perens)
   followed shortly after. Bruce also discussed the graphics used in the
              making of Toy Story in a separate presentation.
                                      
    Various presentations about hardware-specific ports were given. Dave
    Miller talked about the "Next Generation SPARCLinux" as well as the
   Free Software Development Model, and David Mosberger-Tang talked about
      the Alpha Port, as well as methods, applicable to both Intel and
   Alpha, for speeding up your programs by paying attention to memory and
                              cache accesses.
                                      
      Other talks were more general across the Linux OS, such as Jeff
       Uphoff's "Network File Locking", Alan Cox's "Tour of the Linux
   Networking Stack", Peter Braam's "Coda Filesystem", Alexander Yuriev's
    talk on the IPv4 family of protocols and infrastructure and his talk
       on security, Michael Callahan's "Linux and Legacy LANs", Eric
    Youngdale's "Beyond ELF", Olaf Kirch's "Linux Network File System",
      Theodore Ts's "Ext2 File System: Design, Implementation and the
      Future", Miguel de Icaza's talk on the new RAID code and Daniel
           Quinlan's talk on the File System Hierarchy Standard.
                                      
     To round out the list of talks and events was Dr. Greg Wettstein's
     talk on "Working and Playing with others: Linux Grows Up" and the
                                Linux Bowl.
                                      
    The Linux Bowl was the final event. Two teams of six developers were
    pitted against each other to answer thirty questions about Linux and
     the Linux community. Questions ranged from "What liquid should one
    drink between rounds of a Finnish sauna?" (correct answer: beer) to
   "What version library fixed a particular security hole?" to which Alan
   Cox gave a (seemingly) ten minute answer. While some of the questions
   were very obscure (even the moderator was unsure of the answer), most
    of the time either the right answer (or a good facsimile) was given.
                                      
   The show sponsors (after tallying up the attendence) reported that 958
     people showed up, which could be the largest Linux-specific event
     ever, of which 40% were from within North Carolina. Attendees came
   from over 25 states, 4 Canadian provinces, and 10 countries, including
                  Australia, Korea and European countries.
                                      
      Finally, I would like to thank the members of the Atlanta Linux
    Enthusiasts http://www.ale.org/ group who helped to staff the Linux
   International booth. They were great and helped give me the freedom to
     get out from behind the booth every once in a while, because most
     importantly, Linux Expo was a chance to talk with the vendors, the
     developers and other old and new friends on a one-to-one, quality
    basis. Perhaps some things could be improved for next year: A larger
    auditorium for the talks, more and closer parking and less expensive
     food in the food court. But certainly the southern hospitality and
   warmth of Red Hat Software came through. I want to thank the sponsors
   for arranging a great event, and I hope that next year's will be even
                             larger and better.
                                      
     _________________________________________________________________
                                      
                    Copyright � 1997, Jon "maddog" Hall
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
            A Fresh Beginning: The Enlightenment Window Manager
                                      
                   By Larry Ayers, layers@vax2.rainis.net
                                      
     _________________________________________________________________
                                      
                                Introduction
                                      
    Most of the window-managers available for Linux these days can trace
    their ancestry back to the original twm program, which may have been
   the first widely used manager on unix systems. There is a good reason
    for this, as twm pioneered many of the features taken for granted by
        users, such as movable, resizable windows and a root-window
      applications menu. It's good, time-tested code; why reinvent the
                                   wheel?
                                      
   Two programmers have recently done just that, from two perspectives as
        far removed from each other as their respective geographical
        locations. Chris Cannam, a British programmer, has taken the
    minimalist approach with his wm2 manager (which I wrote about in LG
    #14) and the new wm2 variant wmx, which I discuss elsewhere in this
                                   issue.
                                      
   At the other extreme is the work of a young Australian programmer who
     likes to be known as the Rasterman. Imagine asking the programmers
        responsible for the games Quake or Duke Nukem 3D to write a
   window-manager; the result might bear some resemblance to the fanciful
                      program known as Enlightenment.
                                      
   I first encountered Enlightenment (what a name! it seems to carry the
     implication that we users of fvwm et al are still crawling blindly
    through the primordial ooze...) earlier this year, when a binary was
   available on the web. I tried it briefly, but at the time I had a 486
     machine; it ran slowly for me and seemed to consume great gobs of
   memory. Recently the Rasterman (his real name is Carsten Haitzler) has
        rewritten the application from scratch, tightening it up and
        introducing a new shared lib which handles image loading and
    rescaling. The memory consumption has been greatly reduced since the
    initial release. At this point (beta release 4) there are no virtual
     desktops or root-window menus, but the project looks promising and
                   what there is of it runs well for me.
                                      
                          Features and Appearance
                                      
    Enlightenment uses the ppm image format for both window details and
   icons. An elaborate configuration file (called windowstyles) specifies
       which image goes where. Each segment of the window border and
   detailing is a separate ppm file. I haven't made any attempt to modify
    the default configuration. It looks like it would take many hours to
    write a new one. Carsten plans on eventually offering configurations
           which would emulate any of the other window-managers.
                                      
     I get the impression from the Enlightenment web-page that the ppm
       format is more efficient than others, especially on 16-32 bit
   displays. I don't know how valid this is, but the window-manager does
      seem to do quite a bit of image handling without consuming great
                             amounts of memory.
                                      
    This window-manager automatically will load any sort of image format
   as a root background image. At startup the appropriate netpbm utility
    is summoned to transform the image to the ppm format. Naturally, you
   need to have the netpbm graphics utility package installed for this to
                                   work.
                                      
           Here is a screenshot of a window under Enlightenment:
                                      
                            Enlightenment Window
                                      
    XV (with which I made the screenshot) couldn't figure out where the
     actual window border was; can you blame it? I set the root-window
     background to be the same color as this HTML-file background as a
                             quick work-around.
                                      
                                Availability
                                      
                      The Enlightenment web-site is at
     http://www.cse.unsw.edu.au/~s2154962/enlightenment/index.html. The
     source for the latest version can be downloaded from the site; the
           latest news about the application will also be there.
                                      
                              Closing Thoughts
                                      
         It will be interesting to see what eventually happens with
          Enlightenment, though personally I'm satisfied with the
      window-managers I currently use. I just like to see diversity in
      software for Linux. Fancy new window-borders might seem to be a
    trivial matter but it is user-interface features such as these which
   can attract new users, especially younger ones. I showed Enlightenment
   to my sixteen-year-old son (an avid computer- game player) and he was
       impressed. His comment was "It looks like a game interface!".
                                      
    Another factor is the simple human desire for novelty. Sometimes the
     same old interface becomes boring -- you realize you aren't really
   even seeing it anymore. A change in background and window-style can be
     refreshing. People routinely change room interiors for these same
   reasons and, come to think of it, I look at my computer screen quite a
                       bit more than I do the walls!
                                      
    Keep in mind that the science-fiction Bladerunneresque appearance is
   just the default. Enlightenment is a framework and could be configured
    in a variety of ways, depending upon taste (and how much time you're
      willing to spend!). Luckily (if you have patience), someone will
     eventually come up with a configuration which will suit you. or at
    least be close. Interest seems to be growing in this window-manager
   lately (judging by the volume of messages in the mailing list) and it
     may yet evolve into a community-supported window-manager, such as
    Fvwm2 or Afterstep. It's been released under the Gnu license, but so
                far Carsten Haitzler is the sole developer.
                                      
     _________________________________________________________________
                                      
                       Copyright � 1997, Larry Ayers
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                  Visual Music: The Linux Port of Cthugha
                                      
                   By Larry Ayers, layers@vax2.rainis.net
                                      
     _________________________________________________________________
                                      
                                Introduction
                                      
     Around 1993 Kevin Burfitt, an Australian computer science student,
     began developing a computer program which would transform recorded
   music into moving colored patterns. Programs such as this had been in
     use for some time, typically as an adjunct to a rock concert, i.e.
   part of the "light show". This program was originally written for DOS,
    though before long it began to acquire a trait common to software in
           the unix world: a multitude of options and parameters.
                                      
      Kevin must be a fan of the early 20th-century horror writer H.P.
       Lovecraft. How else to account for the distinctive appellation
   "Cthugha" which he gave his program? In the Lovecraft stories Cthugha
   is the name given to a horrific "elder god" which manifested itself to
   humans in the form of shifting colored lights. (This doesn't sound too
     horrific, but Lovecraft could make a loaf of bread seem sinister!)
                                      
   Cthugha has from the early days been available under the aegis of the
    Gnu General Public License, making the source freely available. This
    opened the door for many other programmers scattered throughout the
    world who became involved with the project. Sound familiar? Ports of
         the program are now available for the PowerMac, Win95 (in
    development), and of course Linux. Harald Deischinger is responsible
   for the Linux port. He recently released a new version (0.9) which is
                    available from the following sites:
     * Sunsite (may still be in /pub/Linux/Incoming)
     * The main Cthugha site
       
                             What Cthugha Does
                                      
        The input to the program can be any audio source, such as a
   microphone, a CDROM drive (though you must have the drive connected to
   your soundcard), or even a sound file. Cthugha takes the digital audio
   information and, after passing the data stream through any combination
    of filters, displays it to the screen in real time. The keyboard is
   used to change the various parameters either specifically or randomly.
   The simplest displays resemble the screen of an oscilloscope being fed
   audio data (Cthugha has been called "an oscilloscope on acid") but as
       more optional filters are added the display becomes baroquely
   intricate. If too many filters are active the resulting images can be
        chaotic, with little discernible relation to the sound being
                                 processed.
                                      
                              Running Cthugha
                                      
       The Linux version of Cthugha is compiled into two executables:
   cthugha, which is a console application (using Svgalib), and xcthugha,
     which runs either in an X-window or as a full-screen X application
   using the new DGA extensions. This last requires XFree86 3.2 or later.
   Xcthugha can also be run as a screensaver; in former releases this was
                           a separate executable.
                                      
      In this release the X11 version runs faster and smoother than in
     earlier releases, but I still prefer the console version. It's the
      quickest and most responsive of the three interfaces and (in my
   experience) the only usable version on a machine less powerful than a
                             mid-range Pentium.
                                      
   Running Cthugha reminds me of playing a musical instrument. The first
   attempts aren't consistently pleasant, but with practice a measure of
   control is gained. Orchestral or loud rock music can benefit from low
    gain settings, which help to produce a non-chaotic display. The good
   sort of recording to start with is music with few voices or tracks. A
    vocalist with minimal accompaniment or solo instrumental music give
            good results while you gain a feel for the program.
                                      
     Cthugha comes with several "translation tables"; these are filters
    which map the display to various moving patterns, such as spirals or
     the appearance of traveling through a starfield. I don't use them
     much, as it seems to me they obscure the relationship between the
   music and the display. The tables also tend to increase CPU usage. Try
     them and see what you think, as they seem to be popular with other
                               Cthugha users.
                                      
      The other filter categories are more useful. The "wave" filters
   control the general shape of the sound waves. These run the gamut from
     basic oscilloscope sine and square waves to angular lightning-like
    patterns or floating clusters of fire-flies. The "flame" filters add
   to the waves trailing clouds of glory (I've always wanted to use that
                      phrase in a non-ironic sense!).
                                      
      Using a microphone as input is fun, especially if there are kids
        around. Seeing your voice represented as billowing clouds of
       iridescent plasma is novel, to say the least. Various musical
    instruments are interesting to try as well; if one person plays the
     instrument while the other keys in parameters, a combination which
    seems to reflect the character of the melody can often be found. If
    you should happen upon a combination of settings which results in a
    particularly pleasing screen just press the a key and those settings
             are entered into your Cthugha initialization file.
                                      
   Another option is the Fast Fourier Transform, an algorithm which gives
    an entirely different look to the sound; it's hard to describe, but
   FFT seems more three-dimensional and subtle. The sampling rate should
   be reduced to 22000 hz. (from the default of 44000 hz.) since FFT adds
      one more level of computation to the sound-translation process.
                                      
   Kevin Burfitt's decision to use the Fractint 256-color palette file as
       the Cthugha palette file format was fortuitous. Over the years
    Fractint users have come up with a multitude of palette files among
     which can be found palettes to please anyone's taste. The Fractint
    fractal generator includes a handy palette-file editor which can be
     used to create or modify palettes for Cthugha. I'm not sure if the
     palette editor is included with Xfractint -- I mostly use the DOS
                   Fractint in a Dosemu console session.
                                      
     Here are a couple of screen-shots of xcthugha running in a 320x200
                                  window:
     _________________________________________________________________
                                      
                     Cthugha image #1 Cthugha image #2
     _________________________________________________________________
                                      
   These are snapshots, of course, and show little of the dynamic quality
   of Cthugha reacting to the music. The above images, by the way, are of
    an old recording of Sarah Vaughan singing with piano accompaniment.
                                      
     _________________________________________________________________
                                      
                       Last modified: Sun 27 Apr 1997
                                      
     _________________________________________________________________
                                      
                       Copyright � 1997, Larry Ayers
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                          Updates and Corrections
                                      
                   By Larry Ayers, layers@vax2.rainis.net
                                      
     _________________________________________________________________
                                      
   After I finish these Gazette articles and get them uploaded to SSC, I
    can usually count on a URL changing or a newer version of a program
   being released. Sometimes that very day! The Gazette readers are also
   quick to let me know of any factual errors I've made. I've accumulated
   several of these corrections and updates and shall present them here.
     _________________________________________________________________
                                      
                                     GV
                                      
      Last month I wrote a short piece about GV, a new Postscript file
      viewer. I received a letter from the maintainer of the Debian GV
                                  package:


       Hello Larry!

       I enjoyed reading your article, but there are two remarks I want to
       make:

       - Your screen capture is one of the one modified gv that works with
       all Athena Widgets, including the standard one. These modifications
       were made by me (although it wasn't very hard once I realized how
       well Johannes separated the Xaw3d stuff from the rest).
       It would have been better to have a screen capture using libXaw3d, as
       that is the standard look and feel. The last statement about having
       to have Xaw3d is not very convincing this way.
      - There is a gv homepage now:
                   
                    http://wwwthep.physik.uni-mainz.de/~plass/gv/

      This page currently features gv version 3, which can no longer be
       used without libXaw3d. The last version of gv supporting standard
       Xaw was 2.9.4 which will soon be available on a debian archive site.
       Version 3 is even better than version 2 with respect to look and feel
       (one of the first really convincing applications using Xaw3d, IMO)
       and an improved postscript scanner.

      While I'm sure that it isn't possible to change/add to the article,
      there could be a short notice in the next gazette.

              Helmut

      --
      Helmut Geyer                                Helmut.Geyer@iwr.uni-heidelbe
rg.de
      public PGP key available :           finger geyer@saturn.iwr.uni-heidelbe
rg.de

     _________________________________________________________________
                                      
                                 FileRunner
                                      
   FileRunner has been updated several times since I reviewed it several
     months ago. The latest version, 2.3, has improved FTP capabilities
   (including the option of downloading files with a separate background
    process). I must confess I'm addicted to this file-manager. Once you
    get the hang of it file manipulation and directory traversals become
   so speedy that using it as root can be risky! Check the FileRunner WWW
                     site for latest releases and news.
                                      
    Here's an example of a user-configured action-button for FileRunner,
    which will mostly interest XEmacs users (though it could probably be
     adapted easily for use with GNU Emacs). Create a file in the ~/.fr
            directory named cmds, then enter this text into it:


# This is an example of user-defined commands. This file should be named
# cmds and placed in your ~/.fr directory. It will then be read by
# FileRunner at startup.  Versions of FileRunner prior to 2.3 need to have
#the file named .fr_cmds and placed directly in the home directory.

# This list should contain all user-defined commands formatted as:
# { { <button-title> <procedure-name> } {..} {..} }
set config(usercommands) {
    { XEmacs xemacs }
 }
#
proc xemacs { filelist srcdir destdir } {
  cd $srcdir
#  set l {}
  foreach f $filelist {
  exec gnuclient -q $f
  }
}

    For this to work, you must have gnuserv running; this can be started
           from your ~/.xemacs-options file by including the line
                              (gnuserv-start)
    in the file. What this button does is send the files you've selected
   to an already-running XEmacs process (I usually have one running in a
    different virtual desktop than the one FileRunner is using). XEmacs
   will then open up a new frame in your current desktop with the file(s)
          displayed in it. This is handy for browsing source code.
                                      
                                wm2 and wmx
                                      
   In LG #14 I wrote about the minimalist window-manager wm2, written by
   British programmer Chris Cannam. Since then wm2 has spawned a variant,
   known as wmx. Evidently Mr. Cannam felt that spartan wm2 was becoming
    decadently featureful. Wm2 was stripped down to the bare minimum; no
        more frame-background pixmaps,etc. Wmx is just wm2 with the
    afore-mentioned pixmaps and a basic virtual-desktop utility. It has
    one more feature which I thought was very cleverly designed: if you
      click the middle mouse button on the desktop an application menu
    appears. Unlike most window-managers, the entries on the menu are a
    snap to set up. Simply create a subdirectory stemming from your home
   directory called .wmx and symlink executables to it. This can be even
    done while wmx is running. Whatever appears in ~/.wmx will appear in
   the menu. The menu can be configured with a transparent background so
      that it has a very stylish and spare appearance. As with wm2 the
   configuration can only be changed by recompiling, but this can be done
   very quickly as the source is not large or complex. Source for either
             wm2 or wmx can be obtained from the wm2 web-site.
                                      
                                 Afterstep
                                      
      A reader pointed out an error in my description of the Afterstep
      window-manager in LG #14. Rather than being based on Fvwm2 code,
   Afterstep is based on Fvwm version 1 code. Incidentally, pre-release 6
    has been released and is well worth a trial. Several bugs have been
       fixed but the improved documentation alone makes it worth the
                                 download.
                                      
                                   Xvile
                                      
    Lately it seems that a fad is sweeping the insular world of vi-like
   editors. First the X versions of Elvis and Vim appeared with pull-down
   menus; now it appears that Xvile will soon have a menubar as well. If
    a: you like vile/xvile and b: you have the Motif libs installed, you
    may want to take a look at the patches for vile 7.00 available from
    the Vile ftp site. The patches A through G need to be applied to the
    vile 7.0 source. It looks like the menu items will be fairly easy to
        set up, as they make use of the standard vile functions. An
             implementation for non-Motif X setups is planned.
                                      
     I have mixed feelings about GUI conveniences such as menus in a vi
    editor. One of the appealing traits of these editors is the lack of
     such visible features combined with a wide array of invisible and
    powerful commands. Little overhead but great power and speed. If you
   have to reach for the mouse and select a menu-item, why not use Nedit
     (for example) which is designed as a mouse-oriented editor? On the
        other hand, how many users have had an unpleasant first-time
   experience with vi and rejected it forever? At least the menubar will
      have a "quit-ZZ" item, allowing a novice to end a first session
   without having to desperately flee to another virtual console and kill
                         the vi process from afar!
                                      
                                   TkDesk
                                      
   The latest version of this versatile desktop/file manager can be found
     at the TkDesk home site. Version 1.0b4 has been released and many
    minor bugs have been fixed. There are three patches available on the
   web-site which should be applied by users of the program. Two of them
     are changes to *.tcl files, whereas the third is a c-source-level
   change which requires recompilation. Debian users can instead install
            a patched TkDesk package which is available from the
      /bo/binary-i386/x11 directory of ftp.debian.org and its mirrors.
                                      
                           The Midnight Commander
                                      
   For the past several months a beta development cycle has been underway
    in preparation for the release of mc-3.1.5. The recent releases (the
   latest as of this writing is patchlevel 25) have been very stable and
   usable. If you use the Midnight Commander frequently it might be worth
     your while to try the new version, as many improvements have been
                                   made.
                                      
   An internal editor has been incorporated into mc, though you still can
   change the settings and use any console-mode external editor. The FTP
     capabilities of mc have been augmented and the Tk version has made
    great strides and needs just a few more features to be the equal of
   the classic console version. mc now has the ability to dive into *.rpm
    and *.deb files in the same manner it has been able to do with *.tgz
      and *.zip files, allowing you to inspect their contents without
                          unpacking the archives.
                                      
   It's only available in source form, but it comes with a good configure
    script and compiles easily here. The source is available from the mc
                                 home site.
                                      
                               XEmacs Update
                                      
   Last month I wrote about the release of XEmacs 19.15. The XEmacs team
        didn't stop and rest on their laurels (probably because some
    unexpected problems showed up after the release!); beta releases of
   XEmacs 20.1 began showing up about twice a week at ftp.xemacs.org. It
      looked as if version 20.1 was about to be released, but for some
    reason the release was cancelled and they moved on to betas of 20.2.
     I'm running beta 2 now, and have found that several small problems
    with 19.15 have been fixed. The Customization utility works quite a
      bit better now, for one. When 20.2 is released I would recommend
    obtaining it, as it looks like it will be an improvement over 19.15.
     Another approach if you've already installed 19.15 is to visit the
       XEmacs patches page, which offers patches to upgrade 19.15 to
    patchlevel 2. The problems dealt with are described on the page; if
   the patches concern modes or utilities you never use, there's no point
                             in applying them.
                                      
     _________________________________________________________________
                                      
     _________________________________________________________________
                                      
                       Copyright � 1997, Larry Ayers
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                                 Slackware
                                      
                    By Sean Dreilinger, sean@kensho.com
                                      
     _________________________________________________________________
                                      
     _________________________________________________________________
                                      
  Contents:
  
     * Slackware Is Not For You (Or Maybe It Is)
     * A Quick History
     * Why, Then?
     * Planning
     * Thinking Through Storage and File Systems
     * Upgrade? Think Twice!
     * Boot Disks: Always A Good Thing
     * Slackware Setup Worksheet
     * Slackware Setup Program
     * Troubleshooting
     * Basking In The Afterglow
     * Install and Test
     * Secure the System
     * Back Up
       
  Slackware Is Not For You (Or Maybe It Is)
  
    Welcome to the Slackware distribution of Linux! This chapter aims to
    help the new Linux user or administrator evaluate Slackware, plan a
    Slackware system, and install Slackware Linux. In it you'll find an
     emphasis on careful planning rather than rushing into an impetuous
     installation. A special worksheet is included to help you "get it
      right the first time", which I hope will be especially useful to
            overworked Unix administrators in busy environments.
                                      
   Whether or not to choose Slackware as the flavor of Linux you will use
    is a serious consideration. It may seem like a trivial decision now,
    but Linux boxes have a way of taking on more and more responsibility
   in organizational computing environments. Plenty of Linux experiments
    have evolved in their first year to become mission-critical machines
       serving many more users and purposes than originally intended.
   Slackware is one of the most widely used distributions of Linux. When
     it comes to finding the newest, easiest, or most carefully planned
     distribution of Linux, Slackware may be "none of the above". Some
       background on the life and times of Slackware put things into
                                perspective.
                                      
  A Quick History
  
      In 1993, SLS created one of the first organized distributions of
    Linux. Although it was a great start, the SLS distribution had many
     shortcomings (it didn't exactly work, for starters). Slackware, a
     godsend from Patrick Volkerding, solved most of these issues, was
    mirrored via FTP and pressed onto CD-ROMs the worldwide, and quickly
    became the most widely used flavor of Linux. For a while, Slackware
    was the only full-featured Linux solution. Other Linux distribution
    maintainers, both commercial and nonprofit, have gradually developed
         distributions that are also well worth your consideration.
                                      
      According to statistics maintained by the Linux Counter Project,
   Slackware inhabits about 69% of all machines that run Linux. Slackware
    is typically obtained via FTP or CD-ROM and installed on a 486-class
    computer running at 66Mhz with about 16 MB of memory and 1050 MB of
      storage. More information about Linux use and the Linux Counter
                Project is available on the World Wide Web.
              http://domen.uninett.no/\~hta/linux/counter.html
                                      
    By January 1994, Slackware had achieved such widespread use that it
    earned a popular notoriety normally reserved for rock stars and cult
    leaders. Gossip spread through the Usenet suggesting that the entire
      Slackware project was the work of witches and devil-worshippers!
         "Linux, the free OS....except for your SOUL! MOUHAHAHAHA!"
                                      
                            From: cajho@uno.edu
                       Date: 7 Jan 1994 15:48:07 GMT
                                      
    Jokes alluding to RFC 666, demonic daemons, and speculation that Pat
   Volkerding was actually L. Ron Hubbard in disguise were rampant in the
     threads that followed. The whole amusing incident probably helped
                     Slackware gain some market share:
                                      
                               I LOVE THIS!!
                                      
    I was browsing here to figure which version of Linux to install, but
   after this, I think that I hve no choice but to install Slackware now.
                                      
                            From: David Devejian
                       Date: 10 Jan 1994 04:57:41 GMT
                                      
      All folklore and kidding aside, Slackware is a wise and powerful
      choice for your adventures in Linux, whether you are a hobbyist,
          student, hacker, or system administrator in the making.
                                      
  Why, Then?
  
   If you are a system administrator, you may already be dealing with one
       or more key servers running Slackware. Unless you have time to
   experiment at work, sticking to the tried-and-true distribution may be
    the easiest way to go. If you expect to get help from Unix literate
     friends and colleagues, better make sure they're running something
    compatible-odds are they're running Slackware. Its shortcomings are
     widely acknowledged, for the most part discovered, documented and
   patched whenever possible. You can put together a Slackware box, close
    the known security holes, and install some complementary tools from
    the other Linux distributions to create an excellent Unix server or
               desktop workstation, all in about half a day.
                                      
  Slackware Pros and Cons
  
    Slackware is old It's mature, widely available, and the most widely
                        installed Linux distribution
    Slackware lacks sexy administrative tools a la RedHat You're free to
         add other distributions such as the RedHat package manager
     Slackware includes bundled security holes We know what some of the
            vulnerabilities are and volunteers have posted fixes
    Donald Knuth complained about the fonts Patrick Volkerding fixed the
                                   fonts
              Linus Torvalds uses another distribution Oh well
     Slackware is assembled by Devil Worshippers Satanist crackers (not
                     SATAN itself) will avoid your box
   Slackware is no longer This is a myth, Slackware is developed actively
                      maintained, sans marketing hype
   Slackware is not supported by a commercial vendor or sanctionaed user
     group Linux support is available along with consultants, explained
                further in the section on Commercial Support
    Slackware is not created by a committee or development team Good. A
         system designed by one accountable individual is cohesive
                                      
   If you are still undecided whether Slackware is the tastiest flavor of
     Linux for you, have a look at the "Buyer's Guide" published in the
     Linux Journal, which gives a thorough comparison and evaluation of
      each major distribution. For a straightforward listing of Linux
   flavors, have a look at the Linux Distribution HOWTO on the Internet:
          http://sunsite.unc.edu/LDP/HOWTO/Distribution-HOWTO.html
                                      
  Planning
  
   Nine tenths of wisdom is timing. The right time to set up Slackware is
   afteryou've carefully planned the installation and alternatives in the
       unfortunate event of a problem. A well-planned installation of
    Slackware will repay itself many times over in the future, when the
      natural process of Linux evolution leads you to add disk space,
      install a newer Slackware release, or jettison any old, inferior
             operating systems that may linger on your drives.
                                      
   Like Unix, Slackware Linux tends to grow like a virus. If you succeed
    in getting one Slackware box up and running, you're likely to start
     infecting other computers that belong to your friends, family, and
     coworkers. When this happens, you'll be grateful that you at least
     took the time to think through this first setup-and so will they!
                                      
                    This section will help you decide...
     * if you've got what it takes (of course you do!)
     * whether your computer hardware is ready to run Slackware Linux
     * where and how to get Slackware Linux
     * how to best arrange disks and file systems to protect your work
     * not to upgrade an older version of Slackware
     * which packages of the distribution you want and need
     * how you will handle installation problems (however unlikely)
       
  Literacy Required
  
         Linux is a powerful operating system, and with power comes
   responsibility. Like Linux, the Slackware release treats you with the
     respect you deserve as an intelligent human being. If you elect to
    wipe out a few hard drives with a misplaced punctuation mark, so be
   it. There are graceful and intelligent front-ends to Linux that allow
   the average end-user to get lots of productive work done without ever
   delving into the cryptic subtleties of Unix setup and administration.
   But there's no such luck for you, the appointed installation guru. If
   you're going to install Slackware, be forewarned that you should know
         your IRQs from your RS232s and your SCSIs from your IDEs.
                                      
  Hardware Compatibility
  
   This is an essential element for planning any Linux installation. The
   only Slackware-specific hardware issue is this: you must confirm that
    the particular version (vintage, release) distribution of Slackware
     you'll be installing from provides a kernel and drivers to support
          your hardware. You're in great shape with just about any
   IBM-compatible personal computer with an Intel CPU older than the date
     on your Slackware distribution but younger than 1992 (built after
   1992). If you have a bleeding-edge machine, you may need to download a
        newer boot disk that includes an updated kernel and drivers.
                                      
   For the latest information on it general Linux hardware compatibility,
     check the Linux Hardware Compatibility HOWTO document on the World
                                 Wide Web:
            http://sunsite.unc.edu/LDP/HOWTO/Hardware-HOWTO.html
                                      
      To check for up-to-the minute Slackware news, such as which boot
   kernels are available, you can look in this directory of the Slackware
                       home ftp site, ftp.cdrom.com:
              ftp://ftp.cdrom.com/pub/linux/slackware/patches/
                                      
  Thinking Through Storage And File Systems
  
   Careful planning of file systems and the storage media upon which they
     reside can spare you hours of painful juggling at a later date. In
     particular, putting all of your custom administration files, user
     homes, and local software onto dedicated partitions or disks will
     allow you to upgrade Slackware on the root partition with minimal
               disruption to your improvements to the system.
                                      
  Multiple Operating Systems On One Hard Drive
  
     A typical personal computer has one fixed disk drive. If you're a
    hobbyist or power user, you may already have installed more than one
    Operating System on that drive. For example, your computer may have
   shipped running MS-DOS or Windows 95 as a pre-loaded operating system,
   after which you added another operating system such as OS/2, NeXTstep,
   Geoworks, or Linux. To run multiple operating systems from one drive,
     the disk is divided into separate areas known as partitions. Each
      partition may contain a different operating system. Once you've
   installed a second OS, you also need to install a small program called
      a boot manager or OS loader that runs at system startup time and
        offers you a choice of all the installed operating systems.
                                      
     If you're adding Linux to a computer running a lesser OS, you may
    elect to keep the old operating system around for kicks. Take a look
     at the Linux Loader (LILO), a high-powered boot manager that comes
        free with Slackware. The latest distribution of LILO and its
             documentation are available via FTP from this URL:
                 ftp://lrcftp.epfl.ch/pub/linus/local/lilo/
   An overview of LILO and how you can use it are easily gleaned from the
                              LILO Mini-HOWTO:
                http://sunsite.unc.edu/LDP/HOWTO/mini/LILO/
                                      
  Designing a File System To Use Multiple Partitions
  
      In a simple world, you can set up Linux to run on a single disk
     partition (or maybe two-one for swap). In a real-world, multi-user
     Unix system, a single-drive file system setup creates unnecessary
   risks and hassles you can avoid by distributing the file system across
    multiple partitions. It's all the same to Unix, which views the file
    system as a continuum of available space comprised of all the disks
     and partitions "mounted" into various locations on the file tree.
                                      
      If you create a Slackware setup on only one drive partition, you
   effectively put all of your eggs in one basket-one user may receive an
    abundance of e-mail and overload the /var/mail file system, another
   might store enormous files in their home area, etc. As with many Unix
   quandaries, you have a choice of solutions to control file system use,
    including quotas and user limits. Distributing your Unix file system
       across multiple partitions and disks has an extra benefit for
    Slackware users-it allows you to upgrade the Slackware installation
                          with a minimum of pain.
                                      
    The Linux file system standard puts the personal space of each user
    into a subdirectory of /home. The user Linus would typically have a
   home under /home/linus, the user Patricia under /home/patricia, and so
   on. An easy way to protect this file system during future upgrades is
    to mount /home on a separate disk or partition. Same goes for custom
       programs and resources you add to the off-the-shelf version of
    Slackware-plan to put these on a separate disk mounted to /usr/local
   and you'll have much less grief when it comes time to upgrade. "Where
    things go"---or where they try to go unless you dictate otherwise---
     in a Slackware box is determined by a standard file system layout,
     called the Linux File system Hierarchy Standard. Read all about it
                                    URL:
                        http://www.pathname.com/fhs/
                                      
  Designing a File System To Use Multiple Hard Drives
  
         In some settings, Linux boxes are assembled from leftover
    parts-"worthless" 386 and 486 motherboards, old grayscale monitors,
      and discarded hard drives. You may need to link together several
      ancient 40MB hard drives to come up with enough space to install
   Slackware. In other environments using Linux, there are so many users
      and such large development projects that several of the biggest,
   state-of-the-art drives or drive arrays must be integrated to provide
                               enough space.
                                      
        You can install Slackware onto more than one disk at once by
    designating individual disks to hold specific parts of the Slackware
       installation (just like using multiple partitions), creating a
               logically continuous and unified file system.
                                      
     For an informed second opinion on partitioning, swap space setup,
    fragmentation and inode size consult Kristian Koehntopp's Partitions
                        Mini-HOWTO via Internet URL:
              http://sunsite.unc.edu/mdw/HOWTO/mini/Partition/
                                      
  Upgrade? Think Twice!
  
       24-Aug-95 NOTE: Trying to upgrade to ELF Slackware from a.out
    Slackware will undoubtedly cause you all kinds of problems. Don't do
                                    it.
                                      
                             Patrick Volkerding
                                      
      One thing we don't hear too often with Slackware is the U-word.
   Slackware's setup program is designed to put a fresh operating system
   onto empty hard disks or empty disk partitions. Installing on top of a
   previous Slackware installation can erase your custom applications and
    cause compatibility problems between updated applications and older
      files on the same system. When Slackware was first put together,
      everyone was a first-time Linux user, and the system was always
   experimental-reinstalling the entire operating system and applications
    was the norm in a developmental system. Today, many institutions and
    businesses now run mission-critical applications on Slackware Linux.
   In such environment, a simple reboot is a planned activity and taking
        down the system and overwriting all the user files or custom
                  applications is absolutely unacceptable.
                                      
    So, if you cracked open these pages to plot an upgrade, better think
    twice. If you're planning a first-time Slackware installation, there
    are a few decisions you can make now that will ease upgrading in the
                                  future:
     * assign /usr/local to be mounted from its own separate drive or
       partition
     * build and install all of your organization's custom applications
       under the /usr/local area of the file system
     * assign /home to be mounted from its own separate drive or
       partition
     * make sure all user "homes" are added under the /home area of the
       file system
       
   Teaching you how to finagle a Slackware upgrade is beyond the scope of
      this chapter, but it is workable if you are an experienced Unix
     administrator and you've taken the precautions above. There is an
    Internet resource that claims to analyze your distribution and bring
    it up to date across the Internet, you might want to have a look at
              this URL if you're facing an upgrade situation:
             ftp://ftp.wsc.com/pub/freeware/linux/update.linux/
                                      
    Or read, weep, and learn from the upgrade expertise of Greg Louis in
   his mini HOWTO document: Upgrading Your Linux Distribution, available
                 where finer LDP publications are mirrored:
                        http://sunsite.unc.edu/LDP/
                                      
  Select An Installation Method
  
   Slackware can be installed from a variety of media and network sources
    to fit your needs and budget. Every installation method will require
   you to have at least three floppy diskettes available to get started.
                                      
  CD-ROM
  
    Installation from CD-ROM is fast, popular, and convenient. Although
      someone has to break down and pay for the initial purchase of a
    CD-ROM, sharing CD's is encouraged. Because Linux and the Slackware
   distribution are copylefted, you may make as many copies as you like.
       CD-ROM installation is also a bit better practice in terms of
     netiquette, since you're not hogging bandwidth for an all-day FTP
     transfer. Finally, you may be grateful for the extra utilities and
    documentation that accompany the CD-ROM, especially if you run into
       installation hassles or need to add components in the future.
                                      
  Party!
  
   If you're a hobbyist (or want to watch a few dozen Slackware installs
   before taking on the task at work), see if there is a LUG (Linux User
    Group) in your area that sponsors install parties. Imagine a roomful
     of generous and knowledgeable hackers uniting to share CD-ROMs and
                     expertise with other enthusiasts.
                                      
                                    FTP
                                      
   According to the Linux Counter Project, FTP is still the most popular
    way to obtain Linux by a narrow margin. Once you transfer Slackware
     from the closest possible FTP mirror, you'll still need to put the
     Slackware 'disk sets' onto installation media such as a hard drive
      partition or laboriously copy them onto 50-odd floppy diskettes.
                                      
                                    NFS
                                      
    In a networked environment, it is possible to install Slackware on a
    shared file system and allow everyone on the Local net to attach to
    this shared location and install. If you have the technical know-how
   or a geeked out system administrator who is Linux-literate, this is a
   great way to go. The initial distribution of Slackware can be added to
     the network via CD-ROM, FTP, Loading floppies, tape, or even via a
     remote NFS share across the Internet! For details on such a remote
                           share, see these URLs:
     * http://sunsite.doc.ic.ac.uk/sunsite/access/nfs.html
     * ftp://ftp.cdrom.com/pub/linux/slackware/MIRRORS.TXT
     * http://www.cs.us.es/archive/nfs.html
       
                                   Floppy
                                      
    It's time consuming, but it works-you can buy or create the pile of
   floppies needed to install Slackware and then feed them into your box
   one-by-one when prompted. Slackware 'disk sets' are actually designed
     and arranged to fit floppy diskettes. If you happen to have a huge
   stack of recycled high-density floppy diskettes at your disposal, this
                   can be the most economical way to go.
                                      
                                 Hard Disk
                                      
        This is the way to do it if you've transferred the Slackware
   distribution across the Internet via FTP-you'll escape the floppy trap
    by merely creating boot, root, and rescue diskettes. It requires you
    to have an extra disk or disk partition with extra space to hold the
    Slackware files during installation (you can erase them afterwards).
    Installation from the hard drive is also a workaround if you bought
     the CD but your CD-ROM drive is not supported by any of the Linux
     kernels that come with the Slackware CD. You can use your present
   operating system to transfer the Slackware files onto spare hard disk
             space, then boot into the Slackware installation.
                                      
                                    Tape
                                      
   Still experimental as of this writing, tape offers a great compromise
   of speed and economy when installing Slackware-worth considering if a
     friend with compatible tape drive can dupe a CD or FTP archive for
    you. Get the latest details from the TAPE section of the INSTALL.TXT
             file that accompanies your Slackware distribution.
                                      
  Boot Disks: Always a Good Thing
  
      Even if you're gifted with a direct T-3 Internet connection that
    allows you to suck up a new distribution of Slackware right off the
     'net, you'll be wise to start by building the two Slackware setup
        disks (boot and root) before proceeding. In the event of an
     unfortunate accident (power outage, feline friends traversing the
    keyboard, or even human error), these two little disks, in the hands
   of an experienced Unix hacker, may be able to revive your system or at
                     least rescue your personal files.
                                      
  Prepare To Be Questioned (There Will Be a Quiz...)
  
   During the installation, must choose which disk sets (Slackware lingo
    for collections of software) and individual programs to install. You
   can usually just accept the default recommendation of whether or not a
        package is worth having. A few setup decisions are crucial.
   Mid-installation is no time to decide you want to boot back into OS/2
     and look up what kind of graphics chip your video card uses, which
   network card you've got in there, or whether you'll be needing a SCSI
                      or an IDE kernel to get started.
                                      
  Contingency Plan: Food For Thought
  
   I've often blurted out to a supervisor, "Oh sure, I can have it up and
   running in a few hours." Famous last words. If anyone else has a stake
   in the Slackware computer's health, you owe it to them and yourself to
          think through a less-than-perfect installation attempt:
    1. What's your plan in the unfortunate event that Slackware Linux
       doesn't run perfectly on your system?
    2. Do you have the necessary tools and know-how to revert to your
       previous operating system?
    3. Do you have a backup of your old system on-hand, and do you have
       experience restoring entire systems?
    4. Is this a shared computer? Will people be coming into work on
       Monday expecting to log in to the system you just hosed?
    5. Where is the closest Unix expert with Slackware Linux expertise?
       Can you call on them to help you in the event of a problem setting
       up or upgrading a critical Slackware system?
       
  Slackware Setup Worksheet
  
   After the files are all copied, Slackware can go on to do most of the
    system and network configuration, if you're ready. To help you plan
     your decisions, Section 3 consists of a worksheet derived from the
     text-based Slackware setup program. You can use this worksheet to
   record answers in advance (while your computer is still working!), so
    you'll be ready with the necessary details-partitions, IP addresses,
    modem and mouse IRQs, host and domain names, and others that you're
                     required to provide during setup.
    1. Keyboard: Slackware setup will want to know if you need to remap
       your keyboard to something other than a standard USA 101 key
       layout? Yes or No.
    2. Swap Configuration:Do you have one or more partitions prepared as
       type 82 (Linux Swap)? Yes or No.
    3. Do you want setup to use mkswap on your swap partitions? Most
       likely "yes", unless you have less than 4MB of RAM and have
       already done this to help setup work better. Yes or No.
    4. Prepare Main Linux Partition: Setup will list any partitions
       marked as type 83 (Linux Native) and ask which one to use for the
       root (/) of the Linux file system. Use a format like /dev/hda3 or
       whatever the device name is. Yes or No.
       
       Last chance to back out! When using the install from scratch
       option, you must install to a blank partition. If you have not
       already formatted it manually, then you must format it when
       prompted. Enter I to install from scratch, or a to add software to
       your existing system.
    5. (Re)format the main Linux partition. Would you like to format this
       partition? Yes or No.
       
       Ext2fs defaults to one inode per 4096 bytes of drive space. If
       you're going to have many small files on your drive, you may need
       more inodes (one is used for each file entry). You can change the
       density to one inode per 2048 bytes, or even per 1024 bytes. Enter
       2048 or 1024, or just hit Enter to accept the default of 4096.
       4096, 2048, or 1024.
    6. Prepare Additional Linux Partitions: You can mount some other
       partitions for /usr or /usr/X11 or whatever (/tmp---you name it).
       Would you like to use some of the other Linux partitions to mount
       some of your directories? Yes or No.
       
       These are your Linux partitions (partition list displayed). These
       partitions are already in use (partition list displayed). Enter
       the partition you would like to use, or type q to quit adding new
       partitions. Use a format such as: /dev/hda3 or whatever the device
       name is. Partition name or quit
    7. Would you like to format this partition? Yes, No, or Check
       Sections, too
       
     Now this new partition must be mounted somewhere in your new
   directory tree. For example, if you want to put it under /usr/X11R6,
   then respond: /usr/X11R6 Where would you like to mount this new
   partition? Mount point
   
     Would you like to mount some more additional partitions? Yes or No.
   
      DOS and OS/2 Partition Setup: The following DOS FAT or OS/2 HPFS
             partitions were found: (partition list displayed).
                                      
     Would you like to set up some of these partitions to be visible from
   Linux? Yes or No.
   
     Please enter the partition you would like to access from Linux, or
   type q to quit adding new partitions. Use a format such as: /dev/hda3
   or whatever the device name is. Partition name or Quit
   
     Now this new partition must be mounted somewhere in your directory
   tree. Please enter the directory under which you would like to put it.
   for instance, you might want to reply /dosc, /dosd, or something like
   that. Where would you like to mount this partition? Mount point
   
     Source Media Selection:
    1. Install from a hard drive partition.
    2. Install from floppy disks.
    3. Install via NFS.
    4. Install from a pre-mounted directory.
    5. Install from CD-ROM.
       
   1, 2, 3, 4, or 5
   
     Install from a hard drive partition: To install directly from the
   hard disk you must have a partition with a directory containing the
   Slackware distribution such that each disk other than the boot disk is
   contained in a subdirectory. For example, if the distribution is in
   /stuff/slack, then you need to have directories named /stuff/slack/a1,
   /stuff/slack/a2, and so on, each containing the files that would be on
   that disk. You may install from DOS, HPFS, or Linux partitions. Enter
   the partition where the Slackware sources can be found, or p to see a
   partition list. Partition name or Partition list
   
     What directory on this partition can the Slackware sources be found.
   In the example above, this would be: /stuff/slack. What directory are
   the Slackware sources in? Directory name
   
     What type of file system does your Slackware source partition
   contain?
    1. FAT (MS-DOS, DR-DOS, OS/2)
    2. Linux Second Extended File System
    3. Linux Xiafs
    4. Linux MINIX
    5. OS/2 HPFS
       
   1, 2, 3, 4, or 5
   
     Install from a pre-mounted directory: OK, we will install from a
   directory that is currently mounted. This can be mounted normally or
   through NFS. You need to specify the name of the directory that
   contains the subdirectories for each source disk. Which directory
   would you like to install from? Directory name
   
     Install from floppy disks: The base Slackware series (A) can be
   installed from 1.2M or 1.44M media. Most of the other disks will not
   fit on 1.2M media, but can be downloaded to your hard drive and
   installed from there later. Which drive would you like to install from
   (1/2/3/4)?
    1. /dev/fd0u1440 (1.44M drive a:)
    2. /dev/fd1u1440 (1.44M drive b:)
    3. /dev/fd0h1200 (1.2M drive a:)
    4. /dev/fd1h1200 (1.2M drive b:)
       
   1, 2, 3, or 4
   
     Install via NFS: You're running off the hard drive file system. Is
   this machine currently running on the network you plan to install
   from? If so, we won't try to reconfigure your ethernet card. Are you
   up-and-running on the network? Yes or No.
   
     You will need to enter the IP address you wish to assign to this
   machine. Example: 111.112.113.114. What is your IP address? IP address
   
     Now we need to know your netmask. Typically this will be
   255.255.255.0. What is your netmask? IP address
   
     Do you have a gateway? Yes or No.
   
     What is your gateway address? IP address
   
   Good! We're all set on the local end, but now we need to know where to
    find the software packages to install. First, we need the IP address
    of the machine where the Slackware sources are stored. Since you're
   already running on the network, you should be able to use the hostname
                   instead of an IP address if you wish.
                                      
     What is the IP address of your NFS server? IP address
   
   There must be a directory on the server with the Slackware sources for
    each disk in subdirectories beneath it. Setup needs to know the name
   of the directory on your server that contains the disk subdirectories.
   For example, if your A3 disk is found at /slackware/a3, then you would
                            respond: /slackware.
                                      
     What is the Slackware source directory? Directory name
   
     Install from CD-ROM: What type of CD-ROM drive do you have?
    1. Works with most ATAPI/IDE CD drives /dev/hd*
    2. SCSI /dev/scd0 or /dev/scd1
    3. Sony CDU31A/CDU33A /dev/sonycd
    4. Sony 531/535 /dev/cdu535
    5. Mitsumi, proprietary interface---not IDE /dev/mcd
    6. New Mitsumi, also not IDE /dev/mcdx0
    7. Sound Blaster Pro/Panasonic /dev/sbpcd
    8. Aztech/Orchid/Okano/Wearnes /dev/aztcd
    9. Phillips and some ProAudioSpectrum16 /dev/cm206cd
   10. Goldstar R420 /dev/gscd
   11. Optics Storage 8000 /dev/optcd
   12. Sanyo CDR-H94 + ISP16 soundcard /dev/sjcd
   13. Try to scan for your CD drive
       
   1, 2, 3, 4, 5, 6, 7 8, 9, 10, 11, 12, or 13 IDE CD-ROM: Enter the
   device name that represents your IDE CD-ROM drive. This will probably
   be one of these (in the order of most to least likely): /dev/hdb
   /dev/hdc /dev/hdd /dev/hde /dev/hdf /dev/hdg /dev/hdh /dev/hda Device
   name
   
     SCSI CD-ROM: Which SCSI CD-ROM are you using? If you're not sure,
   select /dev/scd0. 1. /dev/scd0
   2. /dev/scd1
   
     Installation method: With the Slackware CD, you can run most of the
   system from the CD if you're short of drive space or if you just want
   to test Linux without going through a complete installation. Which
   type of installation do you want (slakware or slaktest)?
     * [slakware] Normal installation to hard drive
     * [slaktest] Link family /usr-$>$/cdrom/live/usr to run mostly from
       CD-ROM
       
   slakware or slaktext
   
     Series Selection: Identify which Packages you plan to install. You
   may specify any combination of disk sets at the prompt which follows.
   For example, to install the base system, the base X Window System, and
   the Tcl toolkit, you would enter: a x tcl Which disk sets do you want
   to install?
     * [A] Base Linux system
     * [AP] Various applications that do not need X
     * [D] Program Development (C, C++, Kernel source, Lisp, Perl, etc.)
     * [E] GNU Emacs
     * [F] FAQ lists
     * [K] Linux kernel source
     * [N] Networking (TCP/IP, UUCP, Mail)
     * [Q] Extra kernels with special drivers (needed for non-SCSI CD)
     * [T] TeX
     * [TCL] Tcl/Tk/TclX, Tcl language, and Tk toolkit for developing X
       apps
     * [X] Xfree86 Base X Window System
     * [XAP] X Window Applications
     * [XD] Xfree86 X11 server development system
     * [XV] Xview (OpenLook virtual Window Manager, apps)
     * [Y] Games (that do not require X)
       
   Any combination of a ap d e f k n q t tcl x xap xd xv y and other disk
   sets offered, separated by spaces
   
     Software Installation: Next, software packages are going to be
   transferred on to your hard drive. If this is your first time
   installing Linux, you should probably use PROMPT mode. This will
   follow a defaults file on the first disk of each series you install
   that will ensure that required packages are installed automatically.
   You will be prompted for the installation of other packages. If you
   don't use PROMPT mode, the install program will just go ahead and
   install everything from the disk sets you have selected. Do you want
   to use PROMPT mode (y/n)?
   
     These defaults are user definable---you may set any package to be
     added or skipped automatically by editing your choices into a file
    called TAGFILE that will be found on the first disk of each series.
    There will also be a copy of the original tagfile called TAGFILE.ORG
      available in case you want to restore the default settings. The
    tagfile contains all the instructions needed to completely automate
                             your installation.
                                      
     Would you like to use a special tagfile extension?
   
      You can specify an extension consisting of a "." followed by any
    combination of 3 characters other than tgz. For instance, I specify
   '.pat', and then whenever any tagfiles called 'tagfile.pat' are found
   during the installation they are used instead of the default "tagfile"
    files. If the install program does not find tagfiles with the custom
   extension, it will use the default tagfiles. Enter your custom tagfile
       extension (including the leading ("."), or just press Enter to
        continue without a custom extension. Tagfile extension Enter
                                      
     Extra Configuration: If you wish, you may now go through the options
   to reconfigure your hardware, make a bootdisk, and install LILO. If
   you've installed a new kernel image, you should go through these steps
   again. Otherwise, it's up to you.
   
     Boot Disk Creation: It is recommended that you make a boot disk.
   Would you like to do this? Yes or No.
   
   Now put a formatted floppy in your boot drive. This will be made into
      your Linux boot disk. Use this to boot Linux until LILO has been
    configured to boot from the hard drive. Any data on the target disk
   will be destroyed. Insert the disk and press Return, or s if you want
                             to skip this step.
                                      
     Modem Setup: A link in /dev will be created from your callout device
   (cua0, cua1, cua2, cua3) to /dev/modem. You can change this link later
   if you put your modem on a different port. Would you like to set up
   your modem? Yes or No.
   
     These are the standard serial I/O devices, Which device is your
   modem attached to (0, 1, 2, 3)?
    1. /dev/ttyS0 (or COM1: under DOS)
    2. /dev/ttyS1 (or COM2: under DOS)
    3. /dev/ttyS2 (or COM3: under DOS)
    4. /dev/ttyS3 (or COM4: under DOS)
       
     Mouse Setup: A link will be created in /dev from your mouse device
   to /dev/mouse. You can change this link later if you switch to a
   different type of mouse. Would you like to set up your mouse? Yes or
   No.
   
     These types are supported. Which type of mouse do you have (1, 2, 3,
   4, 5, 6, 7)?
    1. Microsoft compatible serial mouse
    2. QuickPort or PS/2 style mouse (Auxiliary port)
    3. Logitech Bus Mouse
    4. ATI XL Bus Mouse
    5. Microsoft Bus Mouse
    6. Mouse Systems serial mouse
    7. Logitech (MouseMan) serial mouse
       
   1, 2, 3, 4, 5, 6, or 7
   
     These are the standard serial I/O devices. Which device is your
   mouse attached to (0, 1, 2, 3)?
    1. /dev/ttyS0 (or COM1: under DOS)
    2. /dev/ttyS1 (or COM2: under DOS)
    3. /dev/ttyS2 (or COM3: under DOS)
    4. /dev/ttyS3 (or COM4: under DOS)
       
   0, 1, 2, or 3
   
     Network Configuration: Now we will attempt to configure your mail
   and TCP/IP. This process probably won't work on all possible network
   configurations, but should give you a good start. You will be able to
   reconfigure your system at any time by typing netconfig. First, we'll
   need the name you'd like to give your host. Only the base hostname is
   needed right now (not the domain). Enter the hostname. Hostname
   
    Now, we need the domain name. Do not supply a leading "." Enter the
                          domain name. Domain name
                                      
   If you only plan to use TCP/IP through loopback, then your IP address
   will be 127.0.0.1 and we can skip a lot of the following questions. Do
                 you plan to ONLY use loopback? Yes or No.
                                      
   Enter your IP address for the local machine. Example: 111.112.113.114.
    Enter the IP address for this machine (aaa.bbb.ccc.ddd). IP address
                                      
     Enter your gateway address, such as 111.112.113.1. If you don't have
   a gateway, you can edit /etc/rc.d/rc.inet1 later,or you can probably
   get away with entering your own IP address here. Enter the gateway
   address (aaa.bbb.ccc.ddd). IP address
   
     Enter your netmask. This will generally look something like this:
   255.255.255.0. Enter the netmask (aaa.bbb.ccc.ddd). IP address
   
     Will you be accessing a nameserver? Yes or No.
   
     Please give the IP address of the name server to use. You can add
   more Domain Name Servers by editing /etc/resolv.conf. Name Server for
   your domain (aaa.bbb.ccc.ddd)? HIP address
   
    You may now reboot your computer by pressing Ctrl+Alt+Delete. If you
       installed LILO, remove the boot disk from your computer before
     rebooting. Don't forget to create you {/etc/fsta if you don't have
                                    one!
                                      
  Making Slackware Happen
  
      If you've taken the time to plot and plan as recommended in the
    preceding sections, then the actual installation will be a piece of
   cake. There isn't much writing needed to explain the actual process of
   loading Slackware onto your computer(s). You just follow the steps to
   build boot and root diskettes, then answer a long series of questions
     asked by the menu-driven Slackware installation program. If you've
    completed the Slackware Installation Worksheet, these questions will
               be familiar and everything will run smoothly.
                                      
  Build Some Boot Disks
  
                             Choose Your Kernel
                                      
   When installing Slackware Linux, you must create a boot diskette with
     a Linux kernel that is specially prepared to recognize your system
    hardware. For example, to install Slackware from an IDE CD-ROM drive
   onto a SCSI hard drive, the kernel that you put onto the boot diskette
      will need to have drivers for your SCSI card and your IDE CD-ROM
                                   drive.
                                      
    The kernels are stored as compressed binary image files that you can
      access from most any operating system to create a Slackware Boot
   diskette. On the Slackware FTP site, CD-ROM, or NFS mount, you'll find
    a subdirectory called bootdsks.144-containing 1.44 MB kernel images
   for creating boot disks on 1.44MB high density 3.5'' floppy diskettes.
      If you're working from a 5.25'' floppy diskette drive, look in a
      directory called bootdsks.12 for kernel images that will fit the
                          smaller diskette format.
                                      
    Table 2 provides a quick reference of the kernel images available as
        we went to press. Information and up-to-date boot disk image
                  information is available from this URL:
      ftp://ftp.cdrom.com/pub/linux/slackware/bootdsks.144/README.TXT
                                      
                  Slackware Boot Kernel Image Descriptions
                                      
                                  Table 1
                                      
         aztech.i CD-ROM drives: Aztech CDA268-01A, Orchid CD-3110,
          Okano/Wearnes, CDD110, Conrad TXC, CyCDROM CR520, CR540
                      bare.i (none, just IDE support)
                       cdu31a.i Sony CDU31/33a CD-ROM
                      cdu535.i Sony CDU531/535 CD-ROM
          cm206.i Philips/LMS cm206 CD-ROM with cm260 adapter card
        goldstar.i Goldstar R420 CD-ROM (sometimes sold in a Reveal
                             "Multimedia Kit")
                    mcd.i NON-IDE Mitsumi CD-ROM support
               mcdx.i Improved NON-IDE Mitsumi CD-ROM support
                           net.i Ethernet support
        optics.i Optics Storage 8000 AT CD-ROM (the "DOLPHIN" drive)
                   sanyo.i Sanyo CDR-H94A CD-ROM support
   sbpcd.i Matsushita, Kotobuki, Panasonic, CreativeLabs (Sound Blaster),
                 Longshine and Teac NON-IDE CD-ROM support
                        xt.i MFM hard drive support
                                      
                                  Table 2
                                      
             7000fast.s Western Digital 7000FASST SCSI support
                      Advansys.s AdvanSys SCSI support
                    Aha152x.s Adaptec 152x SCSI support
                         Adaptec 1542 SCSI support
                    Aha1740.s Adaptec 1740 SCSI support
     Aha2x4x.s Adaptec AIC7xxx SCSI support (For these cards: AHA-274x,
     AHA-2842, & AHA-2940, AHA-2940W, AHA-2940U, AHA-2940UW, AHA-2944D,
          AHA-2944WD, & AHA-3940, AHA-3940W, AHA-3985, AHA-3985W)
                  Am53c974.s AMD AM53/79C974 SCSI support
      Aztech.s All supported SCSI controllers, plus CD-ROM support for
    Aztech CDA268-01A, Orchid CD-3110, Okano/Wearnes CDD110, Conrad TXC,
                            CyCDROM CR520, CR540
                Buslogic.s Buslogic MultiMaster SCSI support
   Cdu31a.s All supported SCSI controllers, plus CD-ROM support for Sony
                                 CDU31/33a
   Cdu535.s All supported SCSI controllers, plus CD-ROM support for Sony
                                 CDU531/535
   Cm206.s All supported SCSI controllers, plus Philips/LMS cm206 CD-ROM
                          with cm260 adapter card
        Dtc3280.s DTC (Data Technology Corp) 3180/3280 SCSI support
   Eata\_dma.s DPT EATA-DMA SCSI support (Boards such as PM2011, PM2021,
     PM2041, & PM3021, PM2012B, PM2022, PM2122, PM2322, PM2042, PM3122,
     PM3222, & PM3332, PM2024, PM2124, PM2044, PM2144, PM3224, PM3334.)
   Eata\_isa.s DPT EATA-ISA/EISA SCSI support (Boards such as PM2011B/9X,
    & PM2021A/9X, PM2012A, PM2012B, PM2022A/9X, PM2122A/9X, PM2322A/9X)
         Eata\_pio.s DPT EATA-PIO SCSI support (PM2001 and PM2012A)
               Fdomain.s Future Domain TMC-16x0 SCSI support
    Goldstar.s All supported SCSI controllers, plus Goldstar R420 CD-ROM
               (sometimes sold in a Reveal "Multimedia Kit")
                    In2000.s Always IN2000 SCSI support
                                      
                                  Table 3
     Iomega.s IOMEGA PPA3 parallel port SCSI support (also supports the
                  parallel port version of the ZIP drive)
     Mcd.s All supported SCSI controllers, plusstandard non-IDE Mitsumi
                               CD-ROM support
    Mcdx.s All supported SCSI controllers, plus enhanced non-IDE Mitsumi
                               CD-ROM support
                    N53c406a.s NCR 53c406a SCSI support
                 N\_5380.s NCR 5380 and 53c400 SCSI support
       N\_53c7xx.s NCR 53c7xx, 53c8xx SCSI support (Most NCR PCI SCSI
                        controllers use this driver)
    Optics.s All supported SCSI controllers, plus support for the Optics
                Storage 8000 AT CDROM (the "DOLPHIN" drive)
             Pas16.s Pro Audio Spectrum/Studio 16 SCSI support
   Qlog\_fas.s ISA/VLB/PCMCIA Qlogic FastSCSI! support (also supports the
        Control Concepts SCSI cards based on the Qlogic FASXXX chip)
      Qlog\_isp.s Supports all Qlogic PCI SCSI controllers, except the
               PCI-basic, which the AMD SCSI driver supports
     Sanyo.s All supported SCSI controllers, plus Sanyo CDR-H94A CD-ROM
                                  support
     Sbpcd.s All supported SCSI controllers, plus Matsushita, Kotobuki,
    Panasonic, CreativeLabs (Sound Blaster), Longshine and Teac NON-IDE
                               CDROM support
    Scsinet.s All supported SCSI controllers, plus full ethernet support
    Seagate.s Seagate ST01/ST02, Future Domain TMC-885/950 SCSI support
               Trantor.s Trantor T128/T128F/T228 SCSI support
            Ultrastr.s UltraStor 14F, 24F, and 34F SCSI support
               Ustor14f.s UltraStor 14F and 34F SCSI support
                                      
                           Unix Operating Systems
                                      
     If you have the Slackware kernel images on a Unix host that has a
      floppy drive, you can quickly create the necessary boot and root
   diskettes using Unix commands. You can use the dd command. The example
    below which puts the scsi.s boot kernel image onto the floppy device
                  rfd0: dd if=scsi.s of=/dev/rfd0 obs=18k
                                      
    You'll need to repeat this process with one of the root disk images
                       onto a second floppy diskette.
                                      
                       DOS, OS/2, MS-Windows 95 \& NT
                                      
   Slackware bundles a utility called rawrite.exe that will generate boot
   and root diskettes under DOS-literate operating systems. To write the
   scsi.s kernel image onto the formatted, high-density diskette in your
    A:$\backslash$ diskette drive, issue the following command: RAWRITE
                                 SCSI.S A:
                                      
    You'll need to repeat this process with one of the root disk images
                       onto a second floppy diskette.
                                      
  Boot Into Action
  
    Here's the big anticlimax. After all this planning, preparation, and
   partitioning, you're in the home stretch. Make sure the boot floppy is
    in the diskette drive, and restart your computer. Now is a good time
    to go get some coffee (or whatever you like to keep you company) and
      return to the machine ready to play the part of a button-pushing
            drone, answering yes-no questions for an hour or so.
                                      
          Log in as root (no password) and type setup or setup.tty
                                      
  Slackware Setup Program
  
    Slackware comes with two versions of an excellent setup program. One
      is a colorful, dialog-based, menu-driven version. An alternative
   setup, setup.tty, is a text-only version of the installation that you
    may actually prefer, because detailed diagnostics and error messages
     will stay on the screen and not be erased by the next dialog box,
    which happens in the color version. If you're attempting a Slackware
     setup on sketchy hardware, I strongly recommend the less colorful
    setup.tty routine. If you don't know much about Unix and would feel
    more comfortable with an attractive. ``clean'' interface to the same
        setup process, then by all means go for the beautiful setup.
                                      
                 Slackware96 Linux Setup (version HD-3.1.0)
                                      
  Welcome to Slackware Linux Setup
  
   Hint: If you have trouble using the arrow keys on your keyboard, you
   can use '+', '-', and TAB instead. Which option would you like?
     * HELP: Read the Slackware Setup HELP file
     * KEYMAP: Remap your keyboard
     * MAKE TAGS: Tagfile customization program
     * TARGET: Select target directory [now: / ]
     * SOURCE: Select source media
     * DISK SETS: Decide which disk sets you wish to install
     * INSTALL: Install selected disk sets
     * CONFIGURE: Reconfigure your Linux system
     * PKGTOOL: Install or remove packages with Pkgtool
     * EXIT: Exit Slackware Linux Setup OK Cancel
       
   To transfer Slackware onto your system from here should involve little
   more than selecting what you want off the menus. By filling out the
   Section 3 worksheet in advance, you should be able progress quickly
   through each menu in order, until you reach the INSTALL option, at
   which point things may s l o w down: you are advised to select the
   PROMPT feature and read about each software package, deciding whether
   or not you'd like it to end up on your Slackware system. The last part
   of a regular setup is the CONFIGURE section on the setup menu, and the
   questions you must answer bear a striking resemblance to the second
   half of the Section 3 worksheet.
   
  Is That All?
  
   Definitely not! At this point, you've either got some annoying
   obstacle that is preventing the setup from completing, or more likely,
   you're looking at the root prompt darkstar\~\#
   and wondering "What Next?"
   
   Well, if you're plagued by problems, you'll want to proceed directly
   to the next section on troubleshooting. If things appear to be in
   working order, you've still got some details to attend to. Sort of
   like purchasing a new automobile-after you've selected an paid for a
   new car, there are still some things you need before you can drive it
   with confidence-insurance, a steering wheel club, and perhaps some
   luxuries that make the driving experience closer to Fahrvergn\�gen
   than FAQ!
   
  Troubleshooting Difficult Deliveries
  
   Not every Slackware installation is born on cue to expecting system
   administrators. I've pulled a few all nighters, sitting down after
   work one evening to upgrade a Slackware box and still there struggling
   to get the damn thing back online at dawn, before people start
   bitching about their missing mail and news. This section will look at
   a few common Slackware setup problems, solutions, and where to look
   for additional assistance.
   
  Slackware Installation FAQs
  
   Patrick Volkerding, the father of Slackware, has dealt with the many
   questions of new users by listening, answering, and anticipating
   repeat queries. To catch the new Slackware users before they ask the
   same question for the 5,000th time, Patrick has kindly created
   documentation and included it with the Slackware distribution. Three
   files that you may find very helpful in answering your initial
   questions are FAQ.TXT, INSTALL.TXT, and BOOTING.TXT.
   
   Web Support For Slackware
   
   At this time, the Slackware-specific help you'll find on the Internet
   tends to be highly customized---such as how to NFS-mount the
   distribution on computers within a certain university or how to wire
   your dorm room into a particular residential WAN using Slackware.
   
   Usenet Groups For Slackware
   
   The comp.os.linux.* hierarchy of the Usenet is a treasure-trove of
   Linux information, not necessarily Slackware-specific. At present, 11
   separate Linux forums handle a high volume of discussion in this
   hierarchy. Dozens of other general-Unix newsgroups are also available.
   Some discussions relevant to getting Slackware up and running are:
     * comp.os.linux.setup
       
       A group established for figuring out Linux installation and system
       administration. The best place to look for clever setup strategies
       and to network with others who may have recently installed
       Slackware.
     * comp.os.linux.announce
       
       A must-read for Linux administrators and enthusiasts, C.o.l.a is a
       sort of daily Linux digest for the Internet community. The group
       is moderated, so only the relevant material makes it into
       circulation. The newsgroup is designed as a low-traffic alert
       service for announcing Linux-specific software, documentation, and
       security warnings.
     * comp.os.linux.answers
       
       Here's where to find (or post) the latest Linux FAQs, How-Tos,
       READMEs and other documents that answer questions about Linux.
       
   Mail Lists For Slackware
   
   At this time, there are no electronic mail discussions devoted to
   Slackware per-se. You can participate in some excellent Linux-related
   talk via e-mail, try www.linux.org and asking in the newsgroups for a
   few good subscription lists.
   
  You Get What You Pay For (Commercial Support)
  
   Commercial support for Linux is available from some of the CD-ROM
   vendors and a long list of Linux Consultants, who can be contacted
   through the Linux Commercial and Consultants HOWTO documents:
   http://sunsite.unc.edu/LDP/HOWTO/Consultatns-HOWTO.html
   http://sunsite.unc.edu/LDP/HOWTO/Commercial-HOWTO.html
   
  Basking In the Afterglow
  
   Don't rest on your laurels quite yet. Especially if your Slackware
   machine is a shared computer or lives in a networked environment.
   Grooming a computer for community and network use is a bit more
   demanding than just running the setup program and forgetting about it.
   We'll leave you with a few pointers to securing and sharing your new
   Slackware system.
   
  Consider Reinstalling!
  
   I know you just sat through what may have been a long and perplexing
   installation session. But before you move into the house you just
   built, consider tearing it down and starting over again. Friedrich
   Nietzsche had a quote: "A man learns what he needs to know about
   building his house only after he's finished."
   
   If, in the process of installing the system, you had some thoughts
   about how you might do it differently, now is the time. If your
   Slackware Linux box will be a multi user machine or a network server,
   there may never be such a convenient opportunity to reinstall or
   reconfigure the system in radical ways.
   
  Install And Test Key Applications
  
   Before you put away the CDROM or return the 50 floppy disks you
   borrowed to run the Slackware installation, sit down and test each
   application that your users may expect to find in working order. If
   professor Bien absolutely has to have emacs humming under X-Windows,
   you'd better test it out now, while you've still got the workstation
   'in the shop.'
   
   Did you set up this Linux box to serve a specific purpose in your
   organization, such as...
     * File and Print Server for Macintoshes or Windows PCs: Better make
       sure netatalk, CAP and samba are configured and tested
     * World Wide Web Server: Time to choose a www daemon and get it up
       and running
     * Mail Server: Have you configured sendmail? How alternative mail
       applications that offer improved performance, features, or
       security over their Slackware-default counterparts? Most mail
       servers would benefit from cucipop, procmail, and Smarlist, to
       name a few.
     * Remote Access Server: Got those serial ports or add-in boards
       working?
     * Firewall: You might like to look at the second firewall toolkit
       from TIS, as well as front-ends to ease firewall and network
       administration, such as linuxconf.
       
  Secure the System
  
   Get Off The LAN At Once
   
   Out of the box, Slackware is an insecure system. Although Patrick does
   his best to create a secure distribution, a few inevitable holes
   become known, and patches or workarounds are made available in the
   system administration (and cracker) communities. If you installed
   Slackware from a network source such as an NFS-mounted drive, you
   should temporarily disconnect your box from the LAN after a successful
   installation, while you plug a few holes.
   
   Give Root a Password
   
   By default, a new Slackware box will not require a password for the
   root user. When you're comfortable that your new Slackware system is
   stable (after a few hours, not days or weeks), add a password to
   protect the root account. Login as root and type: passwd root
   
   Give Yourself An Account
   
   On large shared systems, the super-user root account is not used as a
   working login account by any individual. If you're interested in
   system administration or are running a networked machine, this is a
   good precedent to follow. Use the \texttt{/sbin/adduser} program to
   make yourself a login account, rather than working out of the root
   login. I always smile when I see students and hobbyists posting
   proudly to the Usenet as root@mymachine.mydomain. Be humble and safe,
   create another login account for your daily work and use su (rather
   than login) to enter the root account sparingly.
   
   Deny Root Logins
   
   Not only is it uncommon to work as the root user, it is not considered
   secure to login as root across the network. Administrative users
   usually connect to a Unix box as their regular username login, and
   then use the su utility to become the root user as needed. To prevent
   crackers, hackers, and ignorant users from logging in directly as
   root, edit the file /etc/securetty and comment out (prepend a pound \#
   sign before) all but the local terminals: console tty1 tty2 \# ttyS0
   \# ttyS1
   
   After this fix, users who attempt to login in as root across the
   network will be denied: Linux 2.0.29 (durak.interactivate.com)
   durak login: root
   root login refused on this terminal.
   durak login:
   
   Apply the Simple Fixes
   
   Slackware installs itself with some very real security problems.
   Rather than master Unix security and sleuth out these vulnerabilities
   yourself, you can jump start the hole-patching process by visiting a
   web resource maintained for just this purpose, called Slackware
   SimpleFixes:
   http://cesdis.gsfc.nasa.gov/linux-web/simplefixes/simplefixes.html
   
   Check For Patches On ftp.cdrom.com
   
   As an actively maintained Linux distribution Slackware updates and
   patches are available from:
   ftp://ftp.cdrom.com/pub/linux/slackware/patches/
   
   Stay Current
   
   You might like to subscribe to one or more electronic mail lists that
   alert users to issues in Linux administration, such as:
     * linux-alert-request@tarsier.cv.nrao.edu
     * linux-security-request@redhat.com
       
  Back Up
  
   Like how things are running? Save it for a rainy day by backing up.
   Amanda (The Advanced Maryland Automatic Network Disk Archiver) is one
   of several backup options for Linux installations. You can learn more
   about Amanda from: http://www.cs.umd.edu/projects/amanda/index.html/
   
     _________________________________________________________________
                                      
                     Copyright � 1997, Sean Dreilinger
            Published in Issue 17 of the Linux Gazette, May 1997
                                      
     _________________________________________________________________
                                      
              [ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next 
                                      
     _________________________________________________________________
                                      
    "Linux Gazette...making Linux just a little more fun!"
    
     _________________________________________________________________
                                      
                         Linux Installation Project
                                      
              By Kendall G. Clark, kclark@dal284.computek.net
                                      
     _________________________________________________________________
                                      
                          Linux Installation Project
                                       
   It all started with a simple question: `Why don't we install Linux at
     all our meetings instead of at only some of them?' The North Texas
    Linux Users Group had been in existence for only about five months,
     and we wanted to make sure to spread the word in North Texas about
     Linux. We wanted to educate the computing public in our area about
   Linux, but we also wanted to let experienced computer users know that
               Linux could handle anything they threw at it.
                                      
       After meeting at Texas Christian University for our first few
   meetings, we signed a contract with the DFWXchange that enabled NTLUG
       to meet at the Dallas Infomart. The DFWXchange is an umbrella
   organization that allows Dallas-Fort Worth users groups to meet at the
        Infomart for free, with all costs being absorbed by the many
     commercial vendors who also meet at the Infomart during the Super
    Satuday Sale. So every month between 3,000 and 5,000 computer users
    from the Dallas-Fort Worth Metroplex converge on the Infomart---the
      premier meeting facility in the Southwest devoted exclusively to
    computer and technology events and organziations---to participate in
   users groups meetings and to take advantage of some really good prices
              on computer-related hardware. It's a big party.
                                      
    It didn't take long for the NTLUG leadership to realize that we had
   stumbled upon a great opportunity: we wanted to let computer users in
    our area know about Linux, and we were now meeting every month in a
      facility filled with thousands of potential Linux converts. Our
    solution was to start the Linux Installation Project, which we call
                                  the LIP.
                                      
     The goal of LIP is simply to install Linux on as many computers as
    possible. Those of us who participate in this project month-to-month
   have discovered that the very best way to advocate the use of Linux is
     to make it easy and painless for the unconverted to do just that:
    namely, run Linux on their computer of choice. In other words, Linux
     is its own best advocate. After a few weeks without a crash, most
    people say goodbye to Windows 95 with zealous enthusiasm. We like to
   think of LIP as an ongoing Linux Installation Festival that allows us
             to convert computer users to Linux one at a time.
                                      
   The first step in establishing LIP as a well-run, consistent endeavor
    was to find someone to lead the effort. NTLUG is fortunate to have a
    technologically advanced membership, and it was fairly easy to find
   someone to lead the LIP; in fact, we found two such people: Mike Dunn
       and Bill Petersen, both of whom are experienced Unix and Linux
    Sysadmins. Under their guidance, and due to the generosity of NTLUG
      members, NTLUG's LIP has solicited and organized enough computer
   hardware to perform up to many simultaneous installations of Linux by
    all the usual methods, although we've found that cdrom installations
                     are usually the most trouble free.
                                      
        The word has now spread in and around the Dallas-Fort Worth
     Metroplex---from schools and universities to computer vendors and
       other users groups---that NTLUG's LIP is the place to go for a
    painless installation of Linux onto PCs, laptops, servers, and even
     Alpha platforms. We have expanded our efforts at the LIP booth to
   include Linux advocacy, advertisement for Linux vendors who supply us
     with materials, the sale of Linux CDs (thanks to Bradley Glonka at
    Linux Systems Labs), and even basic Linux system administration and
   maintenance. We also spend a lot of time explaining to the uninitiated
        masses what makes Linux free and what makes it so much fun.
                                      
     While we have been happy with the results so far, the LIP has more
   work to do. We want to expand our sales efforts to include other kinds
   of Linux merchandise (the sales of which go to support NTLUG and LIP),
      and we'd also like to expand our hardware assets to enable more
   simultaneous installations. Finally, we also want to develop our users
      group assets to such an extent that we can go to other DFW-area
     computer events and setup Linux installation and advocacy booths.
   NTLUG's approach to the Linux Installation Project can be summed up in
                 the phrase: "Linux is free. Life is good."
                                      
    If you want to learn more about the North Texas Linux Users Group or
    our Linux Installation Project, or if you're a Linux Users Group and
     would like to talk about setting up your own local version of LIP,
    please visit the NTLUG website or contact me at kclark@computek.net.
                                      
      Finally, I would be guilty of ingratitude if I did not thank the
    following people and organizations that have made the LIP possible.
   Please forgive me if I've forgotten anyone. It's just about impossible
             not to meet great people when you work with Linux.
        NTLUG Members
          + Mike Dunn
          + Bill Petersen
          + Thomas Griffing
          + Bill Richards
          + Steve Brennan
          + Allen Prince
          + Pete Koren
          + Eric Chang
          + everyone else who made financial and hardware donations
        Organizations
          + Linux Systems Labs, especially Bradley Glonka
          + Red Hat Software
          + SouthWest Technology
          + DFWXchange, especially Stuart Yarus, President.
       
     _________________________________________________________________
                                      
                     Copyright � 1997, Kendall G. Clark
            Published in Issue 17 of the Linux Gazette, May 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.
                                      
    Kendall G. Clark
    
    Kendall Clark is a PHD candidate in systematic theology at Southern
   Methodist University. He is hard at work on his dissertation using Red
     Hat 4.1, LaTeX, and AucTeX & Xemacs. He helped found NTLUG in the
    summer of 1996 with Stephen Denny and Tim Jones and currently serves
    as Acting President. He makes his home with his wife Hope in Dallas,
                                   Texas.
                                      
    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.
                                      
    Sean Dreilinger
    
    Sean Dreilinger suffered through two years of Los Angeles smog for a
   Masters degree in library/information systems at UCLA. Linux swept him
    off his feet in grad school and turned into a Network Administration
       career for the University. Consulting on Internet strategy and
   info-system design in assorted bored-rooms followed. Today he beams-in
    to www.interactivate.com from a remote mountain cabin near Cuyamaca,
      California and is only required to show his face at work once a
    week--nice job for the outdoors-loving and socially inept. He lives
           with his lover Kathy and this incredible high-altitude
       silence--punctuated only by the sound of wind rustling in the
   Manzanita trees, hummingbirds fighting for a perch on the feeder, and
   that reassuring whir of SCSI drives dancing with Linux under the desk.
            More life story with explicit photos can be found at
                 http://www.interactivate.com/people/sean/.
                                      
    Jon "maddog" Hall
    
      Jon "maddog" Hall is Senior Leader of Digital UNIX Base Product
                 Marketing, Digital Equipment Corporation.
                                      
    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.
                                      
    Rick Hohensee
    
    Rick Hohensee is a guitar bum and former construction executive who
   has so many irons in the fire he can't keep the fire going. Visit him
                  on the web at http://cqi.com/~humbubba.
                                      
    Mike List
    
      Mike List is a father of four teenagers, musician, printer (not
      laserjet), and recently reformed technophobe, who has been into
             computers since April,1996, and Linux since July.
                                      
    Jesper Pedersen
    

Jesper Pedersen lives in Odense, Denmark, where he has studied computer science
at Odense University since 1990. He expects to obtain his degree in a year and
a half. He has a great job as a system manager at the
university, and also teaches computer science two hours a week. He is very
proud of his "child," The Dotfile Generator, which he wrote as part of his
job at the university. The idea for it came a year and a half ago, when he had
to learn how to configure Emacs by reading about 700 pages of the lisp manual.
It started small, but as time went by, it expanded into a huge project.
In his spare time, he does Yiu-Yitsu, listens to music, drinks beer and has fun
 with
his girl friend. He loves pets, and has a 200 litre aquarium and two very cute
rabbits.


    Jay Painter

Jay Painter is the Systems Administrator at SSC.



  __________________________________________________________________________
                                       




                                 Not Linux
                                      



  __________________________________________________________________________
                                       




Thanks to all our authors, not just the ones above, but also those who wrote
giving us their tips and tricks and making suggestions. Thanks also to our
new mirror sites. And many, many thanks to Amy for doing most of the work
this month.


Seattle--always a wonderful event. Riley and I spent the morning working
in the yard, clearing out a flower bed that was overgrown with grass. It
felt like hard physical labor after sitting at a desk all week. We rewarded
ourselves by taking a spin on the motorcycle along the Sound. Even as
passenger there is something about riding on a motorcycle that puts a smile
on my face. I guess it helps that I have complete trust in Riley's driving
abilities.

Afterward I went to the Opera House for a talk about Il Trovatore by
Giuseppe Verdi (or Joe Green, as Riley likes to call him). I had seen
the opera itself on Wednesday night--a silly
story as usual but, oh, such
wonderful music! I think it has to be one of my favorites. At any rate
the talk was informative and fun and made a nice end to a very wonderful
day.

Have fun!


  __________________________________________________________________________
                                       



Marjorie L. Richardson

Editor, Linux Gazette gazette@ssc.com


  __________________________________________________________________________
                                       



[ TABLE OF CONTENTS ]
[ FRONT PAGE ]
Back 
  __________________________________________________________________________
                                       

Linux Gazette Issue 17, May 1997, http://www.ssc.com/lg/

This page written and maintained by the Editor of Linux Gazette,
 gazette@ssc.com