home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / comp / windows / x / 19240 < prev    next >
Encoding:
Internet Message Format  |  1992-11-17  |  22.2 KB

  1. Xref: sparky comp.windows.x:19240 news.answers:4033
  2. Newsgroups: comp.windows.x,news.answers
  3. Path: sparky!uunet!destroyer!cs.ubc.ca!alberta!art
  4. From: art@cs.UAlberta.CA (Art Mulder)
  5. Subject: comp.windows.x: Getting more performance out of X.  FAQ
  6. Message-ID: <art.722031409@edwand>
  7. Followup-To: poster
  8. Summary: This posting contains a list of suggestions about what you can do to get the best performance out of X on your workstation -- without buying more hardware.
  9. Sender: news@cs.UAlberta.CA (News Administrator)
  10. Nntp-Posting-Host: edwand.cs.ualberta.ca
  11. Reply-To: art@cs.ualberta.ca (Art Mulder)
  12. Organization: University of Alberta, Edmonton, Canada
  13. Date: Tue, 17 Nov 1992 20:16:49 GMT
  14. Approved: news-answers-request@MIT.Edu
  15. Lines: 529
  16.  
  17. Archive-name: x-faq/speedups
  18. Last-modified: 1992/11/16
  19.  
  20. - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
  21.             THIS LIST IS STILL VERY NEW.
  22.         MORE SUGGESTIONS ARE EAGERLY SOUGHT.  
  23. - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -
  24.  
  25.         HOW TO MAXIMIZE THE PERFORMANCE OF X -- monthly posting
  26.  
  27.   More RAM, Faster CPU's, More disk space, Faster Ethernet...  These are
  28.   the standard responses you get when you ask about how to make your
  29.   workstation go faster.
  30.  
  31.   Well, more hardware isn't always an option, and I wonder if more
  32.   hardware is really always even a necessity.
  33.  
  34.   This "FAQ" list is a collection of suggestions and ideas from different
  35.   people on the net on how you can the best possible performance from your
  36.   workstation, WITHOUT PURCHASING MORE HARDWARE.
  37.  
  38.   This document is specifically concerned with X.  I realize that there are
  39.   a whole host of other factors that affect the performance of a
  40.   workstation.   Perhaps at some point, this document will grow into a
  41.   generalized "System Performance Tuning" document, but for now our focus is
  42.   X.
  43.     [ Note: People seriously interested in the whole area of system
  44.     performance, might want to look at the O'Reilly nutshell book
  45.     "System Performance Tuning" by Mike Loukides.  I've seen it,
  46.     but not read it, so I can't comment on it's content.  --ed.]
  47.  
  48. -----------------
  49. Table of Contents
  50. -----------------
  51.   1. What about the "Other X FAQ"?
  52.   2. Window Managers
  53.   3. The X Server
  54.        Which Server?
  55.        Starting your Server
  56.        Fonts
  57.        About the Resources File
  58.        Define Your Display Properly
  59.   4. Clients
  60.        A Better Clock for X
  61.        A Better Terminal Emulator for X
  62.   5. Miscellaneous Suggestions
  63.        Pretty Pictures
  64.        A Quicker Mouse
  65.        Programming Thoughts
  66.        Say What!?
  67.   6. Other Sources of Information
  68.   7. Author & Notes
  69.   
  70. -----------------------------
  71. What about the "Other X FAQ"?
  72. -----------------------------
  73.  
  74.   David B. Lewis (faq%craft@uunet.uu.net) maintains the informative and
  75.   well written "comp.windows.x Frequently Asked Questions" document.
  76.   It's focus, though, is on generally useful X information, and this
  77.   FAQ is focussed on the issue of performance.
  78.  
  79.   The comp.windows.x FAQ does address the issue of speed, but only with
  80.   regards to the X server.  The gist of that topic seems to be:  "Use
  81.   X11R5, it is faster than R4".  (Please see the X FAQ for complete
  82.   details).
  83.  
  84.   Performance is also a subjective topic, and the individual users must
  85.   balance speed versus features to come to a personal decision.
  86.   Therefore this document will no doubt contain lots of subjective
  87.   opinions in and amongst the objective facts.
  88.  
  89. ---------------
  90. Window Managers
  91. ---------------
  92.  
  93.   There are a lot of window managers out there, with lots of different
  94.   features and abilities.  The choice of which to use is by necessity a
  95.   balancing act between performance and useful features.  At this
  96.   point, most respondents have agreed upon "twm" as the best candidate
  97.   for a speedy window manager. 
  98.  
  99.   Farrell McKay (fbm@ptcburp.ptcbu.oz.au) :
  100.     I've used mwm, olwm, tvtwm, and twm.  Subjectively, I think twm is the
  101.     fastest.  It seems to have the best performance to cost ratio, with a
  102.     good feature set as well.
  103.  
  104.   Joe English (joe@trystero.art.com) :
  105.     * Use twm or one of its variants instead of mwm.  It tends to
  106.       be faster in almost every operation, except mapping pop-up
  107.       windows and top-level shells.
  108.  
  109.     * Turn off nifty features like zooming, opaque move, etc.
  110.  
  111.     * Lay out your windows in a tiled fashion wherever possible.
  112.       Not having to raise & lower windows (generating Expose events)
  113.       when switching windows helps.
  114.  
  115.   I've found that a good font for tiling is
  116.   -misc-fixed-medium-r-normal--13-100-100-100-c-70-iso8859-1 (anyone
  117.   know the short form for this?).  It is the biggest font I have found
  118.   that I can use on a SPARC ELC and still get two 80 column terminal
  119.   windows side-by-side on the display with no overlap.  Other
  120.   suggestions will be accepted. 
  121.  
  122. ------------
  123. The X Server
  124. ------------
  125.  
  126. Which Server?
  127. - - - - - - -
  128.  
  129.   Doesn't the old saying go: "Use the right tool for the job"?  This
  130.   applies to the X11 server also.  Make sure that your server is a
  131.   proper match for your hardware platform.  Specifically, If you have a
  132.   monochrome monitor, use a monochrome X11 server.
  133.  
  134.   On my Monochrome Sun ELC, I haven't noticed much difference between
  135.   the Xsun (colour) server and XsunMono, however it was pointed out to
  136.   me that XsunMono is about 800k smaller and therefore should contribute
  137.   to less paging.  
  138.          [ thanks to: Jonny Farringdon (j.farringdon@psychol.ucl.ac.uk),
  139.                         Michael Salmon (Michael.Salmon@eos.ericsson.se) ]
  140.  
  141.   How your server was compiled can also make a difference.  Jeff Law
  142.   (law@schirf.cs.utah.edu) points out that on a Sun system, you should
  143.   compile X with gcc2 or with the unbundled Sun compiler, and *not*
  144.   use the the SunOS 4.1.1 bundled compiler.  You can expect to get
  145.   "*very* large speedups in the server" that way.  I would assume that
  146.   similar results would occur if you used some of the other popular
  147.   high-quality commercial compilers on the market.
  148.  
  149. Starting your Server
  150. - - - - - - - - - - -
  151.  
  152.   Joe English (joe@trystero.art.com) :
  153.     If you start up a lot of clients in your .xsession or whatever, sleep
  154.     for a second or two after launching each one.  After I changed my
  155.     .xclients script to do this, logging in actually took *less* time...
  156.     we have a heavily loaded system without much core, though.
  157.  
  158.   This sounds crazy, but I tried it, and it works!  
  159.  
  160.   Warner Losh (imp@Solbourne.COM) provided me with a good explanation of
  161.   why this works, which I have summarized here:
  162.  
  163.     When you start up an X server it takes a huge amount of time to
  164.     start accepting connections.  A lot of initialization is done by
  165.     the server when it starts.  This process touches a large number of
  166.     pages.  Any other process running at the same time would fight the
  167.     server for use of the CPU, and more importantly, memory.  If you
  168.     put a sleep in there, you give the Server a chance to get itself
  169.     sorted out before the clients start up.
  170.  
  171.     Similarly, there is also a lot of initialization whenever an X
  172.     client program starts: toolkits registering widgets, resources
  173.     being fetched, programs initializing state and "databases" and so
  174.     forth.  All this activity is typically memory intensive.  Once this
  175.     initialization is done ("The process has reached a steady state"),
  176.     the memory usage typically settles down to using only a few pages.
  177.     So, by using sleeps to stagger the launching of your clients in
  178.     your .Xinitrc , you avoid them "fighting" each other over your
  179.     workstations limited resources
  180.  
  181.   This whole situation is most definitely a "Your Mileage May Vary"
  182.   situation, as there are so many variables to be considered: available
  183.   RAM, local swap space, load average, number of users on your system,
  184.   which clients you are starting etc.
  185.  
  186.   Currently in my .xinitrc I have a situation like:
  187.     (sleep 1; exec xclock ) &
  188.     (sleep 1; exec xbiff ) &
  189.     (sleep 1; exec xterm ) &
  190.     (sleep 1; exec xterm ) &
  191.     (sleep 1; exec xterm ) &
  192.  
  193.   I've experimented with:
  194.     (sleep 1; exec xclock ) &
  195.     (sleep 2; exec xbiff ) &
  196.     (sleep 3; exec xterm ) &
  197.     (sleep 4; exec xterm ) &
  198.     (sleep 5; exec xterm ) &
  199.  
  200.   I've even tried:
  201.     (sleep 2; exec start_X_clients_script ) &
  202.   and then in start_X_clients_script I had:
  203.     (sleep 1; exec xclock ) &
  204.     (sleep 1; exec xbiff ) &
  205.     (sleep 1; exec xterm ) &
  206.     (sleep 1; exec xterm ) &
  207.     (sleep 1; exec xterm ) &
  208.  
  209.     [ The idea with this last one was to make sure that xinit had
  210.     completely finished processing my .xinitrc, and had settled down
  211.     into a "steady state" before the sleep expired and all my clients
  212.     were launched. ]
  213.  
  214.   All of these yielded fairly comparable results, and so I just stuck with
  215.   my current setup, for it's simplicity.  You will probably have to
  216.   experiment a bit to find a setup which suits you.
  217.  
  218. Fonts
  219. - - -
  220.  
  221.   Loading fonts takes time, and RAM.  If you minimize the number of fonts
  222.   your applications use, you'll get speed increases in load-up time.
  223.  
  224.   Farrell McKay (fbm@ptcburp.ptcbu.oz.au) :
  225.     One small point I've noticed (not specifically related to R5) is that
  226.     clients will always start up more quickly if they don't have to load a
  227.     new font into the server.  So I only use two or three fonts throughout
  228.     the whole of my X environment.  Sometimes I need to use a Kanji font
  229.     (for my work) at intervals throughout the day, so in the morning I
  230.     start up xfd with that font (that loads it into the server), iconify
  231.     it, and leave it there for the rest of the day.  Pre-loaded fonts sure
  232.     cut down initialization time.
  233.  
  234.   Joe English (joe@trystero.art.com) :
  235.     Carefully choose a small number of fonts (one fixed-width, one roman,
  236.     one sans-serif, one large one, whatever else you need) and
  237.     reconfigure all the applications you use to use only those fonts.
  238.     This will conserve server resources and make applications start up
  239.     faster.  Loading fonts takes a long time.
  240.  
  241.   Oliver Jones (oj@roadrunner.pictel.com):
  242.     Keep fonts local to the workstation, rather than loading them over nfs.
  243.     If you will make extensive use of R5 scalable fonts, use a font server.
  244.  
  245. About the Resources File
  246. - - - - - - - - - - - - -
  247.  
  248.   Joe English (joe@trystero.art.com) :
  249.     Keep your .Xresources and .Xdefaults file small.  Same effect as
  250.     [reducing the number of fonts].  
  251.  
  252.   In your .Xdefaults (.Xresources) file, try just putting the minimum
  253.   amount of resources that you want to have available to all your
  254.   applications.  For example:  *reverseVideo: true
  255.  
  256.   Then, separate your resources into individual client-specific
  257.   resource files.  For Example: I store mine in $HOME/lib/app-defaults.
  258.   In my .login file I set the environment variable XUSERFILESEARCHPATH:
  259.       setenv XUSERFILESEARCHPATH $HOME/lib/app-defaults/%N
  260.  
  261.   So, when I launch an xterm, it loads it's resources from
  262.   ...app-defaults/XTerm.  Xdvi finds them in .../app-defaults/XDvi,
  263.   and so on and so forth.  Not all clients follow the same class-naming
  264.   convention, so you may have some fun figuring out what to call the
  265.   resource file (xterm? Xterm? XTerm?).  In general, try following the
  266.   standard XXxxx pattern first.
  267.  
  268.   This method of organizing your personal resources has the following
  269.   benefits:
  270.  
  271.   - Easier to maintain/ more usable.
  272.  
  273.   - Fewer resources are stored in the X server in the RESOURCE_MANAGER
  274.     property.  As a side benefit your server may start fractionally
  275.     quicker, since it doesn`t have to load all your resources.
  276.  
  277.   - Applications only process their own resources, never have to sort 
  278.     through all of your resources to find the ones that affect them.
  279.  
  280.   - the application that you are interested in has to load an additional
  281.     file every time it starts up.  This doesn't seem to make that much of a
  282.     performance difference, and you might consider this a huge boon to
  283.     usability.  If you are modifying an application's resource database,
  284.     you just need to re-run the application without having to "xrdb" again.
  285.  
  286.   This is all documented in the Xt Specification (pg 125 & 666).
  287.             [Thanks to: Kevin Samborn (samborn@mtkgc.com)
  288.              and Michael Urban (urban@cobra.jpl.nasa.gov) ]
  289.  
  290.   The "comp.windows.x Frequently Asked Questions" FAQ list contains an
  291.   excellent explanation of how these environment variables work.
  292.  
  293.   NOTE: xrdb will by default run your .Xdefaults file through cpp.
  294.     When your resources are split out into multiple resource files
  295.     (as described above) and then loaded by the individual client
  296.     programs, they will NOT be processed first through cpp.  
  297.     WATCH OUT FOR THIS!!
  298.  
  299.     I had C style comments in my .Xdefaults file, which cpp
  300.     stripped out.  When I switched to this method of distributed
  301.     resource files I spent several frustrating days trying to
  302.     figure out why my clients were not finding their resources.  Xt
  303.     did *NOT* provide any error message when it encountered those C
  304.     style comments in the resource files, it simply silently
  305.     aborted processing that resource file.
  306.  
  307.   You may also run into some clients which break the rules.  For example,
  308.   neither Emacs (18.58.3) nor Xvt (1.0) will find their resources if they
  309.   are anywhere other than in .Xdefaults.
  310.  
  311. Define Your Display Properly
  312. - - - - - - - - - - - - - - -
  313.  
  314.   Client programs are often executed on the same machine as the server.  In
  315.   that situation, rather than setting your DISPLAY environment variable to 
  316.   "<hostname>:0.0", where <hostname> is the name of your workstation, you
  317.   should set your DISPLAY variable to "unix:0.0" or ":0.0".  By doing this
  318.   you access optimized routines that know that the server is on the same
  319.   machine and use a shared memory method of transferring requests.
  320.             [thanks to Patrick J Horgan (pjh70@ras.amdahl.com)]
  321.  
  322.   See the _DISPLAY NAMES_ section of the X(1) man page for further
  323.   explanation of how to properly set your display name.
  324.  
  325. -------
  326. Clients
  327. -------
  328.  
  329.   If you only have a few megabytes of Ram then you should think
  330.   carefully about the number of programs you are running.  Think also
  331.   about the _kind_ of programs you are running.  For example:  Is there
  332.   a smaller clock program than xclock?
  333.  
  334.   Unfortunately, I haven't really noticed that programs advertise how large
  335.   they are, so the onus is on us to do the research and spread the word.
  336.  
  337.   [ Suggestions on better alternatives to the some of the standard clients
  338.   (eg: Xclock, Xterm, Xbiff) are welcome.  --ed.]
  339.  
  340. A Better Clock for X
  341. - - - - - - - - - - -
  342.  
  343.   Richard Hesketh (rlh2@ukc.ac.uk) :
  344.     xbiff and xclock are written using the X toolkit and are therefore
  345.     rather large ...
  346.  
  347.   der Mouse (mouse@Lightning.McRCIM.McGill.EDU) :
  348.     For your consideration I offer mclock, my clock program.  It is
  349.     non-Xt-based, which alone should help, and is extensively
  350.     configurable:  it can be made to look very much like MIT oclock, or
  351.     mostly like xclock purely by changing resources.
  352.  
  353.     You can get this by anonymous ftp from larry.mcrcim.mcgill.edu
  354.     (132.206.1.1), /X/mclock.shar
  355.  
  356.   I've tried this clock program out, and it works fine, but I haven't tried
  357.   any extensive testing to see how it compares to xclock in resource
  358.   consumption.  One point: don't let the size of the executable fool you.
  359.   The binary on my site is about 2.5 times the size of Xclock, but the
  360.   author pointed out to me that mclock does *not* drag in Xaw, Xmu, or Xt,
  361.   which Xclock does.  Therefore, it should be lighter when running.
  362.  
  363.   Of course, the ultimate clock --- one that consumes no resources, and 
  364.   takes up no screen real estate --- is the one that hangs on your wall.
  365.   :-) 
  366.  
  367. A Better Terminal Emulator for X
  368. - - - - - - - - - - - - - - - - -
  369.  
  370.   From the README file distributed with xterm:
  371.  
  372.   +-----
  373.   |         Abandon All Hope, Ye Who Enter Here
  374.   |
  375.   | This is undoubtedly the most ugly program in the distribution.
  376.   | ...
  377.   +-----
  378.  
  379.   Ugly maybe, but at my site it's still the most used.  I suspect that
  380.   xterm is one of the most used clients at many, if not most sites.
  381.   Laziness?  Isn't there a better terminal emulator available?  See below.
  382.  
  383.   If you must use xterm, you can try reducing the number of saveLines
  384.   to reduce memory usage.  [ Oliver Jones (oj@roadrunner.pictel.com),
  385.                    Jonny Farringdon (j.farringdon@psychol.ucl.ac.uk) ]
  386.  
  387. 1) Xvt
  388.  
  389.   Richard Hesketh (rlh2@ukc.ac.uk) :
  390.     ... if you don't need all the esoteric features of xterm, then get
  391.     hold of xvt from export.lcs.mit.edu:/contrib/xvt-1.0.tar.Z, it was
  392.     written here just to save swap space as xterm is rather a hog!
  393.  
  394.   I've since obtained and am evaluating 'xvt' and it does seem to me
  395.   to be noticeably faster than xterm, while yet coming off as a full
  396.   featured "clone" of xterm -- you don't even have to rename your xterm
  397.   resources as xvt pretends to be XTerm.  It is missing a few xterm
  398.   features that I've grown accustomed too, but I'm giving it a try.
  399.  
  400. 2) mterm
  401.  
  402.   der Mouse (mouse@Lightning.McRCIM.McGill.EDU) :
  403.     I also have my own terminal emulator.  Its major lack is
  404.     scrollback, but some people like it anyway.  It can be had from the
  405.     same site as above, in /X/mterm.src/mterm.ball-o-wax.
  406.  
  407. -------------------------
  408. Miscellaneous Suggestions
  409. -------------------------
  410.  
  411. Pretty Pictures
  412. - - - - - - - -
  413.  
  414.   One of the things I did when first learning to use X, was experiment with
  415.   using different images as the background on my display.  (via xsetroot, or
  416.   xphoon, etc).  I soon abandoned this practise for some very good reasons:
  417.  
  418.   - The more complicated your root window bitmap, the slower the server
  419.     is at redrawing your screen when you reposition windows (or redraw, etc)
  420.   - These take up RAM, and CPU power.  I work on a Sun SPARC ELC with 8mb
  421.     RAM and I'm looking for more power, I can't comprehend it when I see
  422.     people with a 4mb Sun 3/60 running xphoon as their root window.
  423.  
  424.   If you're anything like me, you need all the screen real estate
  425.   that you can get for clients, and so rarely see the root window anyway.
  426.     [ Thanks to Qiang Alex Zhao (azhao@cs.arizona.edu) for reminding me of
  427.     this one. --ed.]
  428.  
  429. A Quicker Mouse
  430. - - - - - - - -
  431.  
  432.   Using xset, you can speed up how fast your pointer moves when you
  433.   move your mouse.  This is very subjective to personal taste of
  434.   course, but I like to be able to send my pointer across the screen
  435.   with just a flick of the wrist.  I use "xset m 5 10", see the xset
  436.   man page for further ideas & information.
  437.  
  438.   Hint: sometimes you may want to *slow down* your mouse tracking for
  439.   fine work.  To cover my options, I placed a number of different mouse
  440.   setting commands into menus in my window manager.
  441.   eg: (for twm)
  442.       menu "mouse settings"
  443.       {
  444.         "Mouse Settings:"            f.title
  445.     "  Very Fast"                ! "xset m 7 10 &"
  446.     "  Normal (Fast)"            ! "xset m 5 10 &"
  447.     "  System Default (Un-Accelerated)"    ! "xset m default &"
  448.     "  Glacial"                ! "xset m 0 10 &"
  449.       }
  450.  
  451. Programming Thoughts
  452. - - - - - - - - - - -
  453.  
  454.   Joe English (joe@trystero.art.com) :
  455.     To speed up applications that you're developing, there are tons of
  456.     things you can do.  Some that stick out:
  457.  
  458.     * For Motif programs, don't set XmFontList resources for individual
  459.       buttons, labels, lists, et. al.; use the defaultFontList or
  460.       labelFontList or whatever resource of the highest-level manager
  461.       widget.  Again, stick to as few fonts as possible.
  462.  
  463.     * Better yet, don't use Motif at all.  It's an absolute pig.
  464.  
  465.     * Don't create and destroy widgets on the fly.  Try to reuse them.
  466.       (This will avoid many problems with buggy toolkits, too.)
  467.  
  468.     * Use a line width of 0 in GCs.  On some servers this makes a HUGE
  469.       difference.
  470.  
  471.     * Compress and collapse multiple Expose events.  This can make the
  472.       difference between a fast application and a completely unusable
  473.       one.
  474.  
  475.   Francois Staes (frans@kiwi.uia.ac.be) :
  476.     Just a small remark: I once heard that using a better malloc
  477.     function would greatly increase performance of Xt based
  478.     applications since they use malloc heavily. They suggested trying
  479.     out the GNUY malloc, but I didn't find the time yet. I did some
  480.     tests on small programs just doing malloc and free, and the
  481.     differences were indeed very noticeable ( somewhat 5 times faster)
  482.  
  483.   [ Any confirmation on this from anyone?  --ed.]
  484.  
  485. Say What!?
  486. - - - - - - 
  487.  
  488.   Some contributors proposed ideas that seem right off the wall at first:
  489.  
  490.   David B. Lewis (by day: dbl@osf.org, by night: david%craft@uunet.uu.net) :
  491.     How about this: swap displays with someone else. Run all your programs
  492.     on the other machine and display locally; the other user runs off your
  493.     machine onto the other display. Goal: reduce context switches in the
  494.     same operation between client and server.
  495.  
  496.   I'm not in a situation where I can easily try this, but I have received
  497.   the following confirmation...
  498.  
  499.   Michael Salmon (Michael.Salmon@eos.ericsson.se):
  500.     I regularly run programs on other machines and I notice a big
  501.     difference. I try to run on a machine where I will reduce net usage
  502.     and usually with nice to reduce the impact of my intrusion. This
  503.     helps a lot on my poor little SS1+ with only 16 MB, it was
  504.     essential when I only had 8 MB.
  505.  
  506. ----------------------------
  507. Other Sources of Information
  508. ----------------------------
  509.  
  510.   Adrian Nye (adrian@ora.com):
  511.     A lot more tips on performance are in the paper "Improving X
  512.     Application Performance" by Chris D. Peterson and Sharon Chang, in
  513.     Issue 3 of The X Resource.
  514.  
  515.     An earlier version of this paper appeared in the Xhibition 1992
  516.     conference proceedings.
  517.  
  518.     This paper is absolutely essential reading for X programmers.
  519.  
  520.   [Seems I've got some competition. :-)  --ed.]
  521.   
  522. --------------
  523. Author & Notes
  524. --------------
  525.   This list is currently maintained by Art Mulder (art@cs.ualberta.ca)
  526.  
  527.   Suggestions, corrections, or submission for inclusion in this list
  528.   are gladly accepted.  Layout suggestions and comments (spelling
  529.   mistak's too! :-) are also welcome.
  530.  
  531.   Currently I have listed all contributors of the various comments and
  532.   suggestions.  If you do not want to be credited, please tell me.
  533.  
  534.   speedup-x-faq is copyright (c) 1992 by Arthur E. Mulder
  535.  
  536.   You may copy this document in whole or in part as long as you don't
  537.   try to make money off it, or pretend that you wrote it.
  538.  
  539.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  540. // ...art mulder                       Department of Computing Science \\
  541. \\ art@cs.ualberta.ca          University of Alberta, Edmonton, Canada //
  542. --
  543.  ...art mulder ( art@cs.ualberta.ca )    | "Do not be conformed to this world,
  544.  Department of Computing Science         |  but be transformed by the renewal
  545.  University of Alberta, Edmonton, Canada |  of your mind, ..."  Romans 12:2
  546.