diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2020-12-01 06:30:36 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2020-12-01 06:30:36 +0200 |
commit | c432356f6e1a544f31f65b7fbbee9e2f061bdb08 (patch) | |
tree | 0826a19a0493e69a41359d82da92ea3b5fb6d83e | |
parent | 2811b2f83a6f230ade3d79978fcb469b3ce1a582 (diff) | |
download | egawk-c432356f6e1a544f31f65b7fbbee9e2f061bdb08.tar.gz egawk-c432356f6e1a544f31f65b7fbbee9e2f061bdb08.tar.bz2 egawk-c432356f6e1a544f31f65b7fbbee9e2f061bdb08.zip |
Lots of small cleanups in gawkinet.texi.
-rw-r--r-- | doc/ChangeLog | 5 | ||||
-rw-r--r-- | doc/gawkinet.info | 461 | ||||
-rw-r--r-- | doc/gawkinet.texi | 223 |
3 files changed, 363 insertions, 326 deletions
diff --git a/doc/ChangeLog b/doc/ChangeLog index b606d14b..4d392a01 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +2020-12-01 Arnold D. Robbins <arnold@skeeve.com> + + * gawkinet.texi: Lots of cleanup edits. Bump the minor part + of the edition. + 2020-11-28 Arnold D. Robbins <arnold@skeeve.com> * gawkworkflow.texi: Add an additional web resource. diff --git a/doc/gawkinet.info b/doc/gawkinet.info index 626048fa..2a75964f 100644 --- a/doc/gawkinet.info +++ b/doc/gawkinet.info @@ -1,7 +1,7 @@ This is gawkinet.info, produced by makeinfo version 6.7 from gawkinet.texi. -This is Edition 1.5 of 'TCP/IP Internetworking with 'gawk'', for the +This is Edition 1.6 of 'TCP/IP Internetworking with 'gawk'', for the 5.1.0 (or later) version of the GNU implementation of AWK. @@ -36,7 +36,7 @@ General Introduction This file documents the networking features in GNU Awk ('gawk') version 4.0 and later. - This is Edition 1.5 of 'TCP/IP Internetworking with 'gawk'', for the + This is Edition 1.6 of 'TCP/IP Internetworking with 'gawk'', for the 5.1.0 (or later) version of the GNU implementation of AWK. @@ -358,7 +358,7 @@ client and server are the same in both roles.) server or email server. It is the "host" (system) which is _connected to_ in a transaction. For this to work though, the server must be expecting connections. Much as there has to be someone at the office -building to answer the phone(1), the server process (usually) has to be +building to answer the phone,(1) the server process (usually) has to be started first and be waiting for a connection. The "client" is the system requesting the service. It is the system @@ -385,10 +385,10 @@ doesn't work too well. when sending data. Data writes "block" until the data have been received on the other end. For both TCP and UDP, data reads block until there is incoming data waiting to be read. This is summarized in the -following table, where an "X" indicates that the given action blocks. +following table, where an "x" indicates that the given action blocks. -TCP X X -UDP X +TCP x x +UDP x ---------- Footnotes ---------- @@ -493,10 +493,10 @@ File: gawkinet.info, Node: Special File Fields, Next: Comparing Protocols, Pr 2.1.1 The Fields of the Special File Name ----------------------------------------- -This node explains the meaning of all the other fields, as well as the +This node explains the meaning of all of the fields, as well as the range of values and the defaults. All of the fields are mandatory. To let the system pick a value, or if the field doesn't apply to the -protocol, specify it as '0': +protocol, specify it as '0' (zero): NET-TYPE This is one of 'inet4' for IPv4, 'inet6' for IPv6, or 'inet' to use @@ -514,28 +514,31 @@ LOCALPORT Determines which port on the local machine is used to communicate across the network. Application-level clients usually use '0' to indicate they do not care which local port is used--instead they - specify a remote port to connect to. It is vital for - application-level servers to use a number different from '0' here - because their service has to be available at a specific publicly - known port number. It is possible to use a name from - '/etc/services' here. + specify a remote port to connect to. + + It is vital for application-level servers to use a number different + from '0' here because their service has to be available at a + specific publicly known port number. It is possible to use a name + from '/etc/services' here. HOSTNAME Determines which remote host is to be at the other end of the - connection. Application-level servers must fill this field with a - '0' to indicate their being open for all other hosts to connect to - them and enforce connection level server behavior this way. It is - not possible for an application-level server to restrict its + connection. Application-level clients must enter a name different + from '0'. The name can be either symbolic (e.g., + 'jpl-devvax.jpl.nasa.gov') or numeric (e.g., '128.149.1.143'). + + Application-level servers must fill this field with a '0' to + indicate their being open for all other hosts to connect to them + and enforce connection level server behavior this way. It is not + possible for an application-level server to restrict its availability to one remote host by entering a host name here. - Application-level clients must enter a name different from '0'. - The name can be either symbolic (e.g., 'jpl-devvax.jpl.nasa.gov') - or numeric (e.g., '128.149.1.143'). REMOTEPORT Determines which port on the remote machine is used to communicate across the network. For '/inet/tcp' and '/inet/udp', application-level clients _must_ use a number other than '0' to indicate to which port on the remote machine they want to connect. + Application-level servers must not fill this field with a '0'. Instead they specify a local port to which clients connect. It is possible to use a name from '/etc/services' here. @@ -677,10 +680,10 @@ socket and an IP address. Thus there are subtle differences between UDP cannot guarantee that the datagrams at the receiving end will arrive in exactly the same order they were sent. Some datagrams could -be lost, some doubled, and some out of order. But no overhead is -necessary to accomplish this. This unreliable behavior is good enough -for tasks such as data acquisition, logging, and even stateless services -like the original versions of NFS. +be lost, some doubled, and some could arrive out of order. But no +overhead is necessary to accomplish this. This unreliable behavior is +good enough for tasks such as data acquisition, logging, and even +stateless services like the original versions of NFS. ---------- Footnotes ---------- @@ -712,7 +715,7 @@ respects: * A special file is used as a shell command that pipes its output into 'getline'. One would rather expect to see the special file being read like any other file ('getline < - "/inet/tcp/0/localhost/daytime")'. + "/inet/tcp/0/localhost/daytime"'). * The operator '|&' has not been part of any 'awk' implementation (until now). It is actually the only extension of the 'awk' @@ -751,18 +754,18 @@ File: gawkinet.info, Node: Troubleshooting, Next: Interacting, Prev: TCP Conn It may well be that for some reason the program shown in the previous example does not run on your machine. When looking at possible reasons for this, you will learn much about typical problems that arise in -network programming. First of all, your implementation of 'gawk' may -not support network access because it is a pre-3.1 version or you do not -have a network interface in your machine. Perhaps your machine uses -some other protocol, such as DECnet or Novell's IPX. For the rest of -this major node, we will assume you work on a Unix machine that supports -TCP/IP. If the previous example program does not run on your machine, it -may help to replace the name 'localhost' with the name of your machine -or its IP address. If it does, you could replace 'localhost' with the -name of another machine in your vicinity--this way, the program connects -to another machine. Now you should see the date and time being printed -by the program, otherwise your machine may not support the 'daytime' -service. Try changing the service to 'chargen' or 'ftp'. This way, the +network programming. + + For the rest of this major node, we will assume you work on a +POSIX-style system that supports TCP/IP. If the previous example program +does not run on your machine, it may help to replace the name +'localhost' with the name of your machine or its IP address. If it +does, you could replace 'localhost' with the name of another machine in +your vicinity--this way, the program connects to another machine. Now +you should see the date and time being printed by the program, otherwise +your machine may not support the 'daytime' service. + + Try changing the service to 'chargen' or 'ftp'. This way, the program connects to other services that should give you some response. If you are curious, you should have a look at your '/etc/services' file. It could look like this: @@ -825,11 +828,11 @@ File: gawkinet.info, Node: Interacting, Next: Setting Up, Prev: Troubleshooti 2.4 Interacting with a Network Service ====================================== -The next program makes use of the possibility to really interact with a -network service by printing something into the special file. It asks -the so-called 'finger' service if a user of the machine is logged in. -When testing this program, try to change 'localhost' to some other -machine name in your local network: +The next program begins really interacting with a network service by +printing something into the special file. It asks the so-called +'finger' service if a user of the machine is logged in. When testing +this program, try to change 'localhost' to some other machine name in +your local network: BEGIN { NetService = "/inet/tcp/0/localhost/finger" @@ -841,29 +844,29 @@ machine name in your local network: After telling the service on the machine which user to look for, the program repeatedly reads lines that come as a reply. When no more lines -are coming (because the service has closed the connection), the program -also closes the connection. Try replacing '"NAME"' with your login name -(or the name of someone else logged in). For a list of all users -currently logged in, replace NAME with an empty string ('""'). +are available (because the service has closed the connection), the +program also closes the connection. Try replacing '"NAME"' with your +login name (or the name of someone else logged in). For a list of all +users currently logged in, replace NAME with an empty string ('""'). - The final 'close()' command could be safely deleted from the above + The final 'close()' call could be safely deleted from the above script, because the operating system closes any open connection by -default when a script reaches the end of execution. In order to avoid -portability problems, it is best to always close connections explicitly. -With the Linux kernel, for example, proper closing results in flushing -of buffers. Letting the close happen by default may result in -discarding buffers. +default when a script reaches the end of execution. But, in order to +avoid portability problems, it is best to always close connections +explicitly. With the Linux kernel, for example, proper closing results +in flushing of buffers. Letting the close happen by default may result +in discarding buffers. When looking at '/etc/services' you may have noticed that the 'daytime' service is also available with 'udp'. In the earlier example, change 'tcp' to 'udp', and change 'finger' to 'daytime'. After starting the modified program, you see the expected day and time message. The -program then hangs, because it waits for more lines coming from the -service. However, they never come. This behavior is a consequence of -the differences between TCP and UDP. When using UDP, neither party is +program then hangs, because it waits for more lines to come from the +service. However, they never do. This behavior is a consequence of the +differences between TCP and UDP. When using UDP, neither party is automatically informed about the other closing the connection. Continuing to experiment this way reveals many other subtle differences -between TCP and UDP. To avoid such trouble, one should always remember +between TCP and UDP. To avoid such trouble, you should always remember the advice Douglas E. Comer and David Stevens give in Volume III of their series 'Internetworking With TCP' (page 14): @@ -912,14 +915,14 @@ this: Both programs explicitly close the connection. Now we will intentionally make a mistake to see what happens when the -name '8888' (the so-called port) is already used by another service. -Start the server program in both windows. The first one works, but the -second one complains that it could not open the connection. Each port -on a single machine can only be used by one server program at a time. -Now terminate the server program and change the name '8888' to 'echo'. -After restarting it, the server program does not run any more, and you -know why: there is already an 'echo' service running on your machine. -But even if this isn't true, you would not get your own 'echo' server +name '8888' (the port) is already used by another service. Start the +server program in both windows. The first one works, but the second one +complains that it could not open the connection. Each port on a single +machine can only be used by one server program at a time. Now terminate +the server program and change the name '8888' to 'echo'. After +restarting it, the server program does not run any more, and you know +why: there is already an 'echo' service running on your machine. But +even if this isn't true, you would not get your own 'echo' server running on a Unix machine, because the ports with numbers smaller than 1024 ('echo' is at port 7) are reserved for 'root'. On machines running some flavor of Microsoft Windows, there is no restriction that reserves @@ -933,8 +936,8 @@ sends a result back to the client. The server-side processing could be: BEGIN { NetService = "/inet/tcp/8888/0/0" - NetService |& getline - CatPipe = ("cat " $1) # sets $0 and the fields + NetService |& getline # sets $0 and the fields + CatPipe = ("cat " $1) while ((CatPipe | getline) > 0) print $0 |& NetService close(NetService) @@ -956,9 +959,11 @@ File: gawkinet.info, Node: Email, Next: Web page, Prev: Setting Up, Up: Usin ================= The distribution of email is usually done by dedicated email servers -that communicate with your machine using special protocols. To receive -email, we will use the Post Office Protocol (POP). Sending can be done -with the much older Simple Mail Transfer Protocol (SMTP). +that communicate with your machine using special protocols. In this +node we show how simple the basic steps are. + + To receive email, we use the Post Office Protocol (POP). Sending can +be done with the much older Simple Mail Transfer Protocol (SMTP). When you type in the following program, replace the EMAILHOST by the name of your local email server. Ask your administrator if the server @@ -971,7 +976,7 @@ the first email the server has in store: BEGIN { POPService = "/inet/tcp/0/EMAILHOST/pop3" RS = ORS = "\r\n" - print "user NAME" |& POPService + print "user NAME" |& POPService POPService |& getline print "pass PASSWORD" |& POPService POPService |& getline @@ -985,19 +990,19 @@ the first email the server has in store: close(POPService) } - The record separators 'RS' and 'ORS' are redefined because the -protocol (POP) requires CR-LF to separate lines. After identifying -yourself to the email service, the command 'retr 1' instructs the -service to send the first of all your email messages in line. If the -service replies with something other than '+OK', the program exits; -maybe there is no email. Otherwise, the program first announces that it -intends to finish reading email, and then redefines 'RS' in order to -read the entire email as multiline input in one record. From the POP -RFC, we know that the body of the email always ends with a single line -containing a single dot. The program looks for this using 'RS = -"\r\n\\.\r\n"'. When it finds this sequence in the mail message, it -quits. You can invoke this program as often as you like; it does not -delete the message it reads, but instead leaves it on the server. + We redefine the record separators 'RS' and 'ORS' because the protocol +(POP) requires CR-LF to separate lines. After identifying yourself to +the email service, the command 'retr 1' instructs the service to send +the first of all your email messages in line. If the service replies +with something other than '+OK', the program exits; maybe there is no +email. Otherwise, the program first announces that it intends to finish +reading email, and then redefines 'RS' in order to read the entire email +as multiline input in one record. From the POP RFC, we know that the +body of the email always ends with a single line containing a single +dot. The program looks for this using 'RS = "\r\n\\.\r\n"'. When it +finds this sequence in the mail message, it quits. You can invoke this +program as often as you like; it does not delete the message it reads, +but instead leaves it on the server. File: gawkinet.info, Node: Web page, Next: Primitive Service, Prev: Email, Up: Using Networking @@ -1048,7 +1053,7 @@ then a colon, and finally the value of that parameter. then you get binary data that should be redirected into a file. Another application is calling a CGI (Common Gateway Interface) script on some server. CGI scripts are used when the contents of a web page are not -constant, but generated instantly at the moment you send a request for +constant, but generated on demand at the moment you send a request for the page. For example, to get a detailed report about the current quotes of Motorola stock shares, call a CGI script at Yahoo! with the following: @@ -1089,10 +1094,10 @@ The steps are as follows: of the message. This was not necessary earlier because both parties knew that the document ended when the connection closed. Nowadays it is possible to stay connected after the transmission of - one web page. This is to avoid the network traffic necessary for + one web page. This avoids the network traffic necessary for repeatedly establishing TCP connections for requesting several - images. Thus, there is the need to tell the receiving party how - many bytes will be sent. The header is terminated as usual with an + images. Thus, it is necessary to tell the receiving party how many + bytes will be sent. The header is terminated as usual with an empty line. 3. Send the '"Hello, world"' body in HTML. The useless 'while' loop @@ -1143,8 +1148,7 @@ will become the core of event-driven execution controlled by a graphical user interface (GUI). Each HTTP event that the user triggers by some action within the browser is received in this central procedure. Parameters and menu choices are extracted from this request, and an -appropriate measure is taken according to the user's choice. For -example: +appropriate measure is taken according to the user's choice: BEGIN { if (MyHost == "") { @@ -1202,7 +1206,7 @@ the HTML content of the web pages to refer to the home system. Each server that is built around this core has to initialize some application-dependent variables (such as the default home page) in a -procedure 'SetUpServer()', which is called immediately before entering +function 'SetUpServer()', which is called immediately before entering the infinite loop of the server. For now, we will write an instance that initiates a trivial interaction. With this home page, the client user can click on two possible choices, and receive the current date @@ -1228,15 +1232,17 @@ browser. It does so by printing the HTTP header into the network connection ('print ... |& HttpService'). This command blocks execution of the -server script until a client connects. If this server script is -compared with the primitive one we wrote before, you will notice two -additional lines in the header. The first instructs the browser to -close the connection after each request. The second tells the browser -that it should never try to _remember_ earlier requests that had -identical web addresses (no caching). Otherwise, it could happen that -the browser retrieves the time of day in the previous example just once, -and later it takes the web page from the cache, always displaying the -same time of day although time advances each second. +server script until a client connects. + + If you compare this server script with the primitive one we wrote +before, you will notice two additional lines in the header. The first +instructs the browser to close the connection after each request. The +second tells the browser that it should never try to _remember_ earlier +requests that had identical web addresses (no caching). Otherwise, it +could happen that the browser retrieves the time of day in the previous +example just once, and later it takes the web page from the cache, +always displaying the same time of day although time advances each +second. Having supplied the initial home page to the browser with a valid document stored in the parameter 'Prompt', it closes the connection and @@ -1330,8 +1336,8 @@ File: gawkinet.info, Node: CGI Lib, Prev: Interacting Service, Up: Interactin HTTP is like being married: you have to be able to handle whatever you're given, while being very careful what you send back. - Phil Smith III, - <http://www.netfunny.com/rhf/jokes/99/Mar/http.html> + -- _Phil Smith III, + <http://www.netfunny.com/rhf/jokes/99/Mar/http.html>_ In *note A Web Service with Interaction: Interacting Service, we saw the function 'CGI_setup()' as part of the web server "core logic" @@ -1340,11 +1346,11 @@ for CGI requests. One thing it doesn't do is handle encoded characters in the requests. For example, an '&' is encoded as a percent sign followed by the hexadecimal value: '%26'. These encoded values should be decoded. Following is a simple library to perform these tasks. This -code is used for all web server examples used throughout the rest of -this Info file. If you want to use it for your own web server, store -the source code into a file named 'inetlib.awk'. Then you can include -these functions into your code by placing the following statement into -your program (on the first line of your script): +code is used for all web server examples throughout the rest of this +Info file. If you want to use it for your own web server, store the +source code into a file named 'inetlib.awk'. Then you can include these +functions into your code by placing the following statement into your +program (on the first line of your script): @include inetlib.awk @@ -1407,7 +1413,7 @@ is the code: } } - function CGI_setup( method, uri, version, i) + function CGI_setup(method, uri, version, i) { delete GETARG delete MENU @@ -1564,7 +1570,7 @@ way your HTML pages look (colors, titles, menu items, etc.). The function 'HandleGET()' is a nested case selection that decides which page the user wants to see next. Each nesting level refers to a menu level of the GUI. Each case implements a certain action of the -menu. On the deepest level of case selection, the handler essentially +menu. At the deepest level of case selection, the handler essentially knows what the user wants and stores the answer into the variable that holds the HTML page contents: @@ -1599,7 +1605,7 @@ holds the HTML page contents: Now we are down to the heart of ELIZA, so you can see how it works. Initially the user does not say anything; then ELIZA resets its money -counter and asks the user to tell what comes to mind open heartedly. +counter and asks the user to tell what comes to mind open-heartedly. The subsequent answers are converted to uppercase characters and stored for later comparison. ELIZA presents the bill when being confronted with a sentence that contains the phrase "shut up." Otherwise, it looks @@ -1723,7 +1729,7 @@ often necessary to wait a short while before reopening the connection. Even more difficult is the establishment of a connection that previously ended with a "broken pipe." Those connections have to "time out" for a minute or so before they can reopen. Check this with the command -'netstat -a', which provides a list of still "active" connections. +'netstat -a', which provides a list of still-active connections. File: gawkinet.info, Node: Challenges, Prev: Caveats, Up: Using Networking @@ -1881,7 +1887,7 @@ File: gawkinet.info, Node: Some Applications and Techniques, Next: Links, Pre In this major node, we look at a number of self-contained scripts, with an emphasis on concise networking. Along the way, we work towards -creating building blocks that encapsulate often needed functions of the +creating building blocks that encapsulate often-needed functions of the networking world, show new techniques that broaden the scope of problems that can be solved with 'gawk', and explore leading edge technology that may shape the future of networking. @@ -1899,7 +1905,7 @@ standard for GUIs: the web browser. Now, 'gawk' can rival even Tcl/Tk. languages that allow us to quickly solve problems with short programs. But Tcl has Tk on top of it, and 'gawk' had nothing comparable up to now. While Tcl needs a large and ever-changing library (Tk, which was -bound to the X Window System until recently), 'gawk' needs just the +originally bound to the X Window System), 'gawk' needs just the networking interface and some kind of browser on the client's side. Besides better portability, the most important advantage of this approach (embracing well-established standards such HTTP and HTML) is @@ -1935,11 +1941,11 @@ not working. When a web server breaks down, it makes a difference if customers get a strange "network unreachable" message, or a short message telling them that the server has a problem. In such an emergency, the hard disk and everything on it (including the regular web -service) may be unavailable. Rebooting the web server off a diskette +service) may be unavailable. Rebooting the web server off a USB drive makes sense in this setting. To use the PANIC program as an emergency web server, all you need are -the 'gawk' executable and the program below on a diskette. By default, +the 'gawk' executable and the program below on a USB drive. By default, it connects to port 8080. A different value may be supplied on the command line: @@ -1977,7 +1983,7 @@ the contents and extract the text or the links. An ASCII browser could be written around GETURL. But more interestingly, web robots are straightforward to write on top of GETURL. On the Internet, you can find several programs of the same name that do the same job. They are -usually much more complex internally and at least 10 times longer. +usually much more complex internally and at least 10 times as big. At first, GETURL checks if it was called with exactly one web address. Then, it checks if the user chose to use a special proxy @@ -2203,12 +2209,12 @@ those lines that differ in their second and third columns: Another thing that may look strange is the way GETURL is called. Before calling GETURL, we have to check if the proxy variables need to be passed on. If so, we prepare strings that will become part of the -command line later. In 'GetHeader()', we store these strings together +command line later. In 'GetHeader', we store these strings together with the longest part of the command line. Later, in the loop over the -URLs, 'GetHeader()' is appended with the URL and a redirection operator -to form the command that reads the URL's header over the Internet. -GETURL always produces the headers over '/dev/stderr'. That is the -reason why we need the redirection operator to have the header piped in. +URLs, 'GetHeader' is appended with the URL and a redirection operator to +form the command that reads the URL's header over the Internet. GETURL +always sends the headers to '/dev/stderr'. That is the reason why we +need the redirection operator to have the header piped in. This program is not perfect because it assumes that changing URLs results in changed lengths, which is not necessarily true. A more @@ -2243,8 +2249,8 @@ expression. However, it is straightforward to add them, if doing so is necessary for other tasks. This program reads an HTML file and prints all the HTTP links that it -finds. It relies on 'gawk''s ability to use regular expressions as -record separators. With 'RS' set to a regular expression that matches +finds. It relies on 'gawk''s ability to use regular expressions as the +record separator. With 'RS' set to a regular expression that matches links, the second action is executed each time a non-empty link is found. We can find the matching link itself in 'RT'. @@ -2253,7 +2259,7 @@ retrieve the page, but here we use a different approach. This simple program prints shell commands that can be piped into 'sh' for execution. This way it is possible to first extract the links, wrap shell commands around them, and pipe all the shell commands into a file. After editing -the file, execution of the file retrieves exactly those files that we +the file, execution of the file retrieves only those files that we really need. In case we do not want to edit, we can retrieve all the pages like this: @@ -2552,7 +2558,7 @@ where it can be viewed by the user. It is probably better not to mix up so many different languages. The result is not very readable. Furthermore, the statistical part of the server does not take care of invalid input. Among others, using -negative variances will cause invalid results. +negative variances causes invalid results. ---------- Footnotes ---------- @@ -2571,22 +2577,22 @@ File: gawkinet.info, Node: MAZE, Next: MOBAGWHO, Prev: STATIST, Up: Some App =================================================== In the long run, every program becomes rococo, and then rubble. - Alan Perlis + -- _Alan Perlis_ By now, we know how to present arbitrary 'Content-type's to a -browser. In this node, our server will present a 3D world to our -browser. The 3D world is described in a scene description language -(VRML, Virtual Reality Modeling Language) that allows us to travel -through a perspective view of a 2D maze with our browser. Browsers with -a VRML plugin enable exploration of this technology. We could do one of -those boring 'Hello world' examples here, that are usually presented -when introducing novices to VRML. If you have never written any VRML -code, have a look at the VRML FAQ. Presenting a static VRML scene is a -bit trivial; in order to expose 'gawk''s new capabilities, we will -present a dynamically generated VRML scene. The function -'SetUpServer()' is very simple because it only sets the default HTML -page and initializes the random number generator. As usual, the -surrounding server lets you browse the maze. +browser. In this node, our server presents a 3D world to our browser. +The 3D world is described in a scene description language (VRML, Virtual +Reality Modeling Language) that allows us to travel through a +perspective view of a 2D maze with our browser. Browsers with a VRML +plugin enable exploration of this technology. We could do one of those +boring 'Hello world' examples here, that are usually presented when +introducing novices to VRML. If you have never written any VRML code, +have a look at the VRML FAQ. Presenting a static VRML scene is a bit +trivial; in order to expose 'gawk''s capabilities, we will present a +dynamically generated VRML scene. The function 'SetUpServer()' is very +simple because it only sets the default HTML page and initializes the +random number generator. As usual, the surrounding server lets you +browse the maze. function SetUpServer() { TopHeader = "<HTML><title>Walk through a maze</title>" @@ -2706,7 +2712,7 @@ File: gawkinet.info, Node: MOBAGWHO, Next: STOXPRED, Prev: MAZE, Up: Some Ap make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. - C. A. R. Hoare + -- _C.A.R. Hoare_ A "mobile agent" is a program that can be dispatched from a computer and transported to a remote server for execution. This is called @@ -2751,9 +2757,7 @@ process is implemented depends upon the kind of server process: Our agent example abuses a common web server as a migration tool. So, it needs a universal CGI script on the receiving side (the web server). The receiving script is activated with a 'POST' request when -placed into a location like '/httpd/cgi-bin/PostAgent.sh'. Make sure -that the server system uses a version of 'gawk' that supports network -access (Version 3.1 or later; verify with 'gawk --version'). +placed into a location like '/httpd/cgi-bin/PostAgent.sh'. #!/bin/sh MobAg=/tmp/MobileAgent.$$ @@ -2880,7 +2884,7 @@ of the serious obstacles in implementing a framework for mobile agents is that it does not suffice to migrate the code. It is also necessary to migrate the state of execution of the agent. In contrast to 'Agent Tcl', this program does not try to migrate the complete set of -variables. The following conventions are used: +variables. The following conventions apply: * Each variable in an agent program is local to the current host and does _not_ migrate. @@ -2909,7 +2913,7 @@ for migration takes place in three steps: standard output to avoid irritating the server. The application-independent framework is now almost complete. What -follows is the 'END' pattern that is executed when the mobile agent has +follows is the 'END' pattern which executes when the mobile agent has finished reading its own code. First, it checks whether it is already running on a remote host or not. In case initialization has not yet taken place, it starts 'MyInit()'. Otherwise (later, on a remote host), @@ -2969,12 +2973,13 @@ time to start the real work by appending the host's name to the result string, and reading line by line who is logged in on this host. A very annoying circumstance is the fact that the elements of 'MOBVAR' cannot hold the newline character ('"\n"'). If they did, migration of this -string did not work because the string didn't obey the syntax rule for a -string in 'gawk'. 'SUBSEP' is used as a temporary replacement. If the -list of hosts to visit holds at least one more entry, the agent migrates -to that place to go on working there. Otherwise, we replace the -'SUBSEP's with a newline character in the resulting string, and report -it to the originating host, whose name is stored in +string would not work because the string wouldn't obey the syntax rule +for a string in 'gawk'. 'SUBSEP' is used as a temporary replacement. + + If the list of hosts to visit holds at least one more entry, the +agent migrates to that place to go on working there. Otherwise, we +replace the 'SUBSEP's with a newline character in the resulting string, +and report it to the originating host, whose name is stored in 'MOBVAR["MyOrigin"]'. ---------- Footnotes ---------- @@ -3002,7 +3007,7 @@ File: gawkinet.info, Node: STOXPRED, Next: PROTBASE, Prev: MOBAGWHO, Up: Som these were largely concerned with the movements of small green pieces of paper, which is odd because it wasn't the small green pieces of paper that were unhappy. - Douglas Adams, 'The Hitch Hiker's Guide to the Galaxy' + -- _Douglas Adams, 'The Hitch Hiker's Guide to the Galaxy'_ Valuable services on the Internet are usually _not_ implemented as mobile agents. There are much simpler ways of implementing services. @@ -3010,7 +3015,7 @@ All Unix systems provide, for example, the 'cron' service. Unix system users can write a list of tasks to be done each day, each week, twice a day, or just once. The list is entered into a file named 'crontab'. For example, to distribute a newsletter on a daily basis this way, use -'cron' for calling a script each day early in the morning. +'cron' for calling a script each day early in the morning: # run at 8 am on weekdays, distribute the newsletter 0 8 * * 1-5 $HOME/bin/daily.job >> $HOME/log/newsletter 2>&1 @@ -3233,7 +3238,7 @@ could have made in the year before. At this point the hard work has been done: the array 'predict' contains the predictions for all the ticker symbols. It is up to the -function 'Report()' to find some nice words to introduce the desired +function 'Report()' to find some nice words to present the desired information. function Report() { @@ -3306,8 +3311,9 @@ File: gawkinet.info, Node: PROTBASE, Prev: STOXPRED, Up: Some Applications an 3.10 PROTBASE: Searching Through A Protein Database =================================================== - Hoare's Law of Large Problems: Inside every large problem is a - small problem struggling to get out. + Inside every large problem is a small problem struggling to get + out.(1) + -- _With apologies to C.A.R. Hoare_ Yahoo's database of stock market data is just one among the many large databases on the Internet. Another one is located at NCBI @@ -3324,11 +3330,12 @@ genetic material is a very long chain of four base nucleotides. It is the order of appearance (the sequence) of nucleotides which contains the information about the substance to be produced. Scientists in biotechnology often find a specific fragment, determine the nucleotide -sequence, and need to know where the sequence at hand comes from. This -is where the large databases enter the game. At NCBI, databases store -the knowledge about which sequences have ever been found and where they -have been found. When the scientist sends his sequence to the BLAST -service, the server looks for regions of genetic material in its +sequence, and need to know where the sequence at hand comes from. + + This is where the large databases enter the game. At NCBI, databases +store the knowledge about which sequences have ever been found and where +they have been found. When the scientist sends his sequence to the +BLAST service, the server looks for regions of genetic material in its database which look the most similar to the delivered nucleotide sequence. After a search time of some seconds or minutes the server sends an answer to the scientist. In order to make access simple, NCBI @@ -3389,7 +3396,7 @@ residue). The nucleic acid codes supported are: - gap of indeterminate length Now you know the alphabet of nucleotide sequences. The last two -lines of the following example query show you such a sequence, which is +lines of the following example query show such a sequence, which is obviously made up only of elements of the alphabet just described. Store this example query into a file named 'protbase.request'. You are now ready to send it to the server with the demonstration client. @@ -3531,9 +3538,9 @@ and you might appreciate the following hints. Michael S. Waterman, which is worth reading if you are seriously interested. You can find a good book review on the Internet. - 2. While Waterman's book can explain to you the algorithms employed - internally in the database search engines, most practitioners - prefer to approach the subject differently. The applied side of + 2. While Waterman's book explains the algorithms employed internally + in the database search engines, most practitioners prefer to + approach the subject differently. The applied side of Computational Biology is called Bioinformatics, and emphasizes the tools available for day-to-day work as well as how to actually _use_ them. One of the very few affordable books on Bioinformatics @@ -3546,14 +3553,19 @@ and you might appreciate the following hints. 'perl', 'tcl', or 'python' which are not even proper sequences. (:-) + ---------- Footnotes ---------- + + (1) What C.A.R. Hoare actually said was "Inside every large program +is a small program struggling to get out." + File: gawkinet.info, Node: Links, Next: GNU Free Documentation License, Prev: Some Applications and Techniques, Up: Top 4 Related Links *************** -This section lists the URLs for various items discussed in this major -node. They are presented in the order in which they appear. +This section lists the URLs for various items discussed in this Info +file. They are presented in the order in which they appear. 'Internet Programming with Python' <http://www.fsbassociates.com/books/python.htm> @@ -4173,7 +4185,7 @@ Index * AI: Challenges. (line 75) * apache: WEBGRAB. (line 72) * apache <1>: MOBAGWHO. (line 42) -* Bioinformatics: PROTBASE. (line 227) +* Bioinformatics: PROTBASE. (line 229) * BLAST, Basic Local Alignment Search Tool: PROTBASE. (line 6) * blocking: Making Connections. (line 35) * Boutell, Thomas: STATIST. (line 6) @@ -4183,15 +4195,15 @@ Index * CGI (Common Gateway Interface): MOBAGWHO. (line 42) * clients: Making Connections. (line 21) * Clinton, Bill: Challenges. (line 58) -* Computational Biology: PROTBASE. (line 227) +* Computational Biology: PROTBASE. (line 229) * contest: Challenges. (line 6) * cron utility: STOXPRED. (line 23) * CSV format: STOXPRED. (line 128) * Dow Jones Industrial Index: STOXPRED. (line 44) * ELIZA program: Simple Server. (line 11) * ELIZA program <1>: Simple Server. (line 178) -* email: Email. (line 11) -* FASTA/Pearson format: PROTBASE. (line 102) +* email: Email. (line 13) +* FASTA/Pearson format: PROTBASE. (line 104) * FDL (Free Documentation License): GNU Free Documentation License. (line 6) * filenames, for network access: Gawk Special Files. (line 29) @@ -4204,7 +4216,7 @@ Index * FTP (File Transfer Protocol): Basic Protocols. (line 45) * gawk, networking: Using Networking. (line 6) * gawk, networking, filenames: Gawk Special Files. (line 29) -* gawk, networking, connections: Special File Fields. (line 53) +* gawk, networking, connections: Special File Fields. (line 56) * gawk, networking, connections <1>: TCP Connecting. (line 6) * gawk, networking, service, establishing: Setting Up. (line 6) * gawk, networking, email: Email. (line 6) @@ -4219,29 +4231,29 @@ Index * GNU/Linux: Troubleshooting. (line 54) * GNU/Linux <1>: Interacting. (line 27) * GNU/Linux <2>: REMCONF. (line 6) -* GNUPlot utility: Interacting Service. (line 189) +* GNUPlot utility: Interacting Service. (line 190) * GNUPlot utility <1>: STATIST. (line 6) * Hoare, C.A.R.: MOBAGWHO. (line 6) * Hoare, C.A.R. <1>: PROTBASE. (line 6) -* hostname field: Special File Fields. (line 34) +* hostname field: Special File Fields. (line 35) * HTML (Hypertext Markup Language): Web page. (line 29) * HTTP (Hypertext Transfer Protocol): Basic Protocols. (line 45) * HTTP (Hypertext Transfer Protocol) <1>: Web page. (line 6) * HTTP (Hypertext Transfer Protocol), record separators and: Web page. (line 29) * HTTP server, core logic: Interacting Service. (line 6) -* HTTP server, core logic <1>: Interacting Service. (line 24) +* HTTP server, core logic <1>: Interacting Service. (line 23) * Humphrys, Mark: Simple Server. (line 178) * Hypertext Markup Language (HTML): Web page. (line 29) * image format: STATIST. (line 6) * images, retrieving over networks: Web page. (line 45) -* images, in web pages: Interacting Service. (line 189) +* images, in web pages: Interacting Service. (line 190) * input/output, two-way,: Gawk Special Files. (line 19) * JavaScript: STATIST. (line 57) * Linux: Troubleshooting. (line 54) * Linux <1>: Interacting. (line 27) * Linux <2>: REMCONF. (line 6) -* Lisp: MOBAGWHO. (line 98) +* Lisp: MOBAGWHO. (line 96) * localport field: Gawk Special Files. (line 34) * Loebner, Hugh: Challenges. (line 6) * Loui, Ronald: Challenges. (line 75) @@ -4257,14 +4269,14 @@ Index * networks, gawk and: Using Networking. (line 6) * networks, gawk and, filenames: Gawk Special Files. (line 29) * networks, ports, specifying: Special File Fields. (line 24) -* networks, gawk and, connections: Special File Fields. (line 53) +* networks, gawk and, connections: Special File Fields. (line 56) * networks, gawk and, connections <1>: TCP Connecting. (line 6) * networks, gawk and, service, establishing: Setting Up. (line 6) * networks, ports, reserved: Setting Up. (line 37) * networks, gawk and, email: Email. (line 6) * networks, gawk and, troubleshooting: Caveats. (line 6) * Numerical Recipes: STATIST. (line 13) -* ORS variable, POP and: Email. (line 36) +* ORS variable, POP and: Email. (line 38) * ORS variable, HTTP and: Web page. (line 29) * PANIC program: PANIC. (line 6) * Perl: Using Networking. (line 14) @@ -4274,7 +4286,7 @@ Index * PNG image format: Web page. (line 45) * PNG image format <1>: STATIST. (line 6) * POP (Post Office Protocol): Email. (line 6) -* POP (Post Office Protocol) <1>: Email. (line 36) +* POP (Post Office Protocol) <1>: Email. (line 38) * Post Office Protocol (POP): Email. (line 6) * PostScript: STATIST. (line 139) * PROLOG: Challenges. (line 75) @@ -4283,23 +4295,23 @@ Index * PS image format: STATIST. (line 6) * Python: Using Networking. (line 14) * Python, gawk networking and: Using Networking. (line 24) -* record separators, POP and: Email. (line 36) +* record separators, POP and: Email. (line 38) * record separators, HTTP and: Web page. (line 29) * REMCONF program: REMCONF. (line 6) * remoteport field: Gawk Special Files. (line 34) * RFC 1939: Email. (line 6) -* RFC 1939 <1>: Email. (line 36) +* RFC 1939 <1>: Email. (line 38) * RFC 1945: Web page. (line 29) * RFC 2068: Web page. (line 6) -* RFC 2068 <1>: Interacting Service. (line 104) +* RFC 2068 <1>: Interacting Service. (line 103) * RFC 2616: Web page. (line 6) * RFC 821: Email. (line 6) * robot: Challenges. (line 84) * robot <1>: WEBGRAB. (line 6) -* RS variable, POP and: Email. (line 36) +* RS variable, POP and: Email. (line 38) * RS variable, HTTP and: Web page. (line 29) * servers: Making Connections. (line 14) -* servers, as hosts: Special File Fields. (line 34) +* servers, as hosts: Special File Fields. (line 35) * servers <1>: Setting Up. (line 22) * servers, HTTP: Interacting Service. (line 6) * servers, web: Simple Server. (line 6) @@ -4332,14 +4344,14 @@ Index * vertical bar (|), |& operator (I/O): TCP Connecting. (line 25) * VRML: MAZE. (line 6) * web pages: Web page. (line 6) -* web pages, images in: Interacting Service. (line 189) +* web pages, images in: Interacting Service. (line 190) * web pages, retrieving: GETURL. (line 6) * web servers: Simple Server. (line 6) * web service: Primitive Service. (line 6) * web service <1>: PANIC. (line 6) * WEBGRAB program: WEBGRAB. (line 6) * Weizenbaum, Joseph: Simple Server. (line 11) -* XBM image format: Interacting Service. (line 189) +* XBM image format: Interacting Service. (line 190) * Yahoo!: REMCONF. (line 6) * Yahoo! <1>: STOXPRED. (line 6) @@ -4362,44 +4374,45 @@ Ref: Making Connections-Footnote-216889 Node: Using Networking17070 Node: Gawk Special Files19393 Node: Special File Fields21202 -Ref: table-inet-components25095 -Node: Comparing Protocols26406 -Node: File /inet/tcp26940 -Node: File /inet/udp27926 -Ref: File /inet/udp-Footnote-129625 -Node: TCP Connecting29879 -Node: Troubleshooting32225 -Ref: Troubleshooting-Footnote-135284 -Node: Interacting35857 -Node: Setting Up38597 -Node: Email42100 -Node: Web page44432 -Ref: Web page-Footnote-147249 -Node: Primitive Service47447 -Node: Interacting Service50188 -Ref: Interacting Service-Footnote-159355 -Node: CGI Lib59387 -Node: Simple Server66362 -Ref: Simple Server-Footnote-174107 -Node: Caveats74208 -Node: Challenges75353 -Ref: Challenges-Footnote-184095 -Node: Some Applications and Techniques84196 -Node: PANIC86661 -Node: GETURL88385 -Node: REMCONF91018 -Node: URLCHK96514 -Node: WEBGRAB100366 -Node: STATIST104830 -Ref: STATIST-Footnote-1117982 -Node: MAZE118427 -Node: MOBAGWHO124634 -Ref: MOBAGWHO-Footnote-1138651 -Node: STOXPRED138706 -Node: PROTBASE152994 -Node: Links166110 -Node: GNU Free Documentation License169543 -Node: Index194663 +Ref: table-inet-components25102 +Node: Comparing Protocols26413 +Node: File /inet/tcp26947 +Node: File /inet/udp27933 +Ref: File /inet/udp-Footnote-129645 +Node: TCP Connecting29899 +Node: Troubleshooting32245 +Ref: Troubleshooting-Footnote-135073 +Node: Interacting35646 +Node: Setting Up38370 +Node: Email41870 +Node: Web page44253 +Ref: Web page-Footnote-147070 +Node: Primitive Service47268 +Node: Interacting Service50002 +Ref: Interacting Service-Footnote-159157 +Node: CGI Lib59189 +Node: Simple Server66189 +Ref: Simple Server-Footnote-173934 +Node: Caveats74035 +Node: Challenges75178 +Ref: Challenges-Footnote-183920 +Node: Some Applications and Techniques84021 +Node: PANIC86482 +Node: GETURL88208 +Node: REMCONF90841 +Node: URLCHK96337 +Node: WEBGRAB100181 +Node: STATIST104645 +Ref: STATIST-Footnote-1117793 +Node: MAZE118238 +Node: MOBAGWHO124463 +Ref: MOBAGWHO-Footnote-1138365 +Node: STOXPRED138420 +Node: PROTBASE152712 +Ref: PROTBASE-Footnote-1165879 +Node: Links165994 +Node: GNU Free Documentation License169426 +Node: Index194546 End Tag Table diff --git a/doc/gawkinet.texi b/doc/gawkinet.texi index 2bb22d93..f4dd2f6f 100644 --- a/doc/gawkinet.texi +++ b/doc/gawkinet.texi @@ -61,8 +61,8 @@ @c pages, I think this is the right decision. ADR. @set TITLE TCP/IP Internetworking with @command{gawk} -@set EDITION 1.5 -@set UPDATE-MONTH June, 2020 +@set EDITION 1.6 +@set UPDATE-MONTH November, 2020 @c gawk versions: @set VERSION 5.1 @set PATCHLEVEL 0 @@ -453,7 +453,7 @@ web server or email server. It is the @dfn{host} (system) which is @emph{connected to} in a transaction. For this to work though, the server must be expecting connections. Much as there has to be someone at the office building to answer -the phone@footnote{In the days before voice mail systems!}, the +the phone,@footnote{In the days before voice mail systems!} the server process (usually) has to be started first and be waiting for a connection. @@ -485,12 +485,12 @@ In the case of TCP, the synchronicity is enforced by the protocol when sending data. Data writes @dfn{block} until the data have been received on the other end. For both TCP and UDP, data reads block until there is incoming data waiting to be read. This is summarized in the following table, -where an ``X'' indicates that the given action blocks. +where an ``x'' indicates that the given action blocks. @ifnottex @multitable {Protocol} {Reads} {Writes} -@item TCP @tab X @tab X -@item UDP @tab X @tab +@item TCP @tab x @tab x +@item UDP @tab x @tab @end multitable @end ifnottex @tex @@ -513,9 +513,7 @@ UDP&&X&\cr @comment node-name, next, previous, up @chapter Networking With @command{gawk} -@c STARTOFRANGE netgawk @cindex networks @subentry @command{gawk} and -@c STARTOFRANGE gawknet @cindex @command{gawk} @subentry networking The @command{awk} programming language was originally developed as a pattern-matching language for writing short programs to perform @@ -606,11 +604,8 @@ The special files provided in @command{gawk} hide the details from the programmer, making things much simpler and easier to use. @c Who sez we can't toot our own horn occasionally? -@c STARTOFRANGE filenet @cindex filenames, for network access -@c STARTOFRANGE gawnetf @cindex @command{gawk} @subentry networking @subentry filenames -@c STARTOFRANGE netgawf @cindex networks @subentry @command{gawk} and @subentry filenames The special @value{FN} for network access is made up of several fields, all of which are mandatory: @@ -633,10 +628,10 @@ you allow the system to choose. @node Special File Fields, Comparing Protocols, Gawk Special Files, Gawk Special Files @subsection The Fields of the Special @value{FFN} -This @value{SECTION} explains the meaning of all the other fields, +This @value{SECTION} explains the meaning of all of the fields, as well as the range of values and the defaults. All of the fields are mandatory. To let the system pick a value, -or if the field doesn't apply to the protocol, specify it as @samp{0}: +or if the field doesn't apply to the protocol, specify it as @samp{0} (zero): @table @var @cindex network type field @@ -663,7 +658,9 @@ explained later in this @value{SECTION}. Determines which port on the local machine is used to communicate across the network. Application-level clients usually use @samp{0} to indicate they do not care which local port is -used---instead they specify a remote port to connect to. It is vital for +used---instead they specify a remote port to connect to. + +It is vital for application-level servers to use a number different from @samp{0} here because their service has to be available at a specific publicly known port number. It is possible to use a name from @file{/etc/services} here. @@ -672,14 +669,16 @@ port number. It is possible to use a name from @file{/etc/services} here. @cindex hostname field @cindex servers @subentry as hosts Determines which remote host is to -be at the other end of the connection. Application-level servers must fill +be at the other end of the connection. +Application-level clients must enter a name different from @samp{0}. +The name can be either symbolic +(e.g., @samp{jpl-devvax.jpl.nasa.gov}) or numeric (e.g., @samp{128.149.1.143}). + +Application-level servers must fill this field with a @samp{0} to indicate their being open for all other hosts to connect to them and enforce connection level server behavior this way. It is not possible for an application-level server to restrict its availability to one remote host by entering a host name here. -Application-level clients must enter a name different from @samp{0}. -The name can be either symbolic -(e.g., @samp{jpl-devvax.jpl.nasa.gov}) or numeric (e.g., @samp{128.149.1.143}). @item remoteport Determines which port on the remote @@ -687,7 +686,9 @@ machine is used to communicate across the network. For @file{/inet/tcp} and @file{/inet/udp}, application-level clients @emph{must} use a number other than @samp{0} to indicate to which port on the remote machine -they want to connect. Application-level servers must not fill this field with +they want to connect. + +Application-level servers must not fill this field with a @samp{0}. Instead they specify a local port to which clients connect. It is possible to use a name from @file{/etc/services} here. @end table @@ -849,7 +850,8 @@ network facilities to make them easier to understand and use.} UDP cannot guarantee that the datagrams at the receiving end will arrive in exactly the same order they were sent. Some datagrams could be -lost, some doubled, and some out of order. But no overhead is necessary to +lost, some doubled, and some could arrive out of order. +But no overhead is necessary to accomplish this. This unreliable behavior is good enough for tasks such as data acquisition, logging, and even stateless services like the original versions of NFS. @@ -857,11 +859,8 @@ the original versions of NFS. @node TCP Connecting, Troubleshooting, Gawk Special Files, Using Networking @section Establishing a TCP Connection -@c STARTOFRANGE tcpcon @cindex TCP (Transmission Control Protocol) @subentry connection, establishing -@c STARTOFRANGE netcon @cindex networks @subentry @command{gawk} and @subentry connections -@c STARTOFRANGE gawcon @cindex @command{gawk} @subentry networking @subentry connections Let's observe a network connection at work. Type in the following program and watch the output. Within a second, it connects via TCP (@file{/inet/tcp}) @@ -885,7 +884,7 @@ respects: A special file is used as a shell command that pipes its output into @code{getline}. One would rather expect to see the special file being read like any other file (@samp{getline < -"/inet/tcp/0/localhost/daytime")}. +"/inet/tcp/0/localhost/daytime"}). @item @cindex @code{|} (vertical bar), @code{|&} operator (I/O) @@ -931,20 +930,25 @@ we are pedantic and always explicitly close the connections.) @cindex troubleshooting @subentry networks @subentry connections It may well be that for some reason the program shown in the previous example does not run on your machine. When looking at possible reasons for this, you will learn much -about typical problems that arise in network programming. First of all, +about typical problems that arise in network programming. +@ignore +First of all, your implementation of @command{gawk} may not support network access because it is a pre-3.1 version or you do not have a network interface in your machine. Perhaps your machine uses some other protocol, such as -DECnet or Novell's IPX. For the rest of this @value{CHAPTER}, -we will assume -you work on a Unix machine that supports TCP/IP. If the previous example program does -not run on your machine, it may help to replace the name +DECnet or Novell's IPX. +@end ignore + +For the rest of this @value{CHAPTER}, we will assume you work on a POSIX-style +system that supports TCP/IP. If the previous example program does not +run on your machine, it may help to replace the name @samp{localhost} with the name of your machine or its IP address. If it does, you could replace @samp{localhost} with the name of another machine in your vicinity---this way, the program connects to another machine. Now you should see the date and time being printed by the program, otherwise your machine may not support the @samp{daytime} service. + Try changing the service to @samp{chargen} or @samp{ftp}. This way, the program connects to other services that should give you some response. If you are curious, you should have a look at your @file{/etc/services} file. It could @@ -991,6 +995,7 @@ flavor of Microsoft Windows usually do @emph{not} support these services. Nevertheless, it @emph{is} possible to do networking with @command{gawk} on Microsoft Windows.@footnote{Microsoft preferred to ignore the TCP/IP +@c FIXME: What about Windows 7, 8, 10? family of protocols until 1995. Then came the rise of the Netscape browser as a landmark ``killer application.'' Microsoft added TCP/IP support and their own browser to Microsoft Windows 95 at the last minute. They even back-ported @@ -1009,7 +1014,7 @@ well as UDP. @node Interacting, Setting Up, Troubleshooting, Using Networking @section Interacting with a Network Service -The next program makes use of the possibility to really interact with a +The next program begins really interacting with a network service by printing something into the special file. It asks the so-called @command{finger} service if a user of the machine is logged in. When testing this program, try to change @samp{localhost} to @@ -1031,7 +1036,7 @@ BEGIN @{ After telling the service on the machine which user to look for, the program repeatedly reads lines that come as a reply. When no more -lines are coming (because the service has closed the connection), the +lines are available (because the service has closed the connection), the program also closes the connection. Try replacing @code{"@var{name}"} with your login name (or the name of someone else logged in). For a list of all users currently logged in, replace @var{name} with an empty string @@ -1039,10 +1044,12 @@ of all users currently logged in, replace @var{name} with an empty string @cindex Linux @cindex GNU/Linux -The final @code{close()} command could be safely deleted from +The final @code{close()} call could be safely deleted from the above script, because the operating system closes any open connection -by default when a script reaches the end of execution. In order to avoid +by default when a script reaches the end of execution. But, in order to avoid portability problems, it is best to always close connections explicitly. +@c FIXME: This following statement isn't really true; gawk flushes +@c and closes all open files before exiting. With the Linux kernel, for example, proper closing results in flushing of buffers. Letting the close happen by default may result in discarding buffers. @@ -1052,12 +1059,12 @@ When looking at @file{/etc/services} you may have noticed that the example, change @samp{tcp} to @samp{udp}, and change @samp{finger} to @samp{daytime}. After starting the modified program, you see the expected day and time message. -The program then hangs, because it waits for more lines coming from the -service. However, they never come. This behavior is a consequence of the +The program then hangs, because it waits for more lines to come from the +service. However, they never do. This behavior is a consequence of the differences between TCP and UDP. When using UDP, neither party is automatically informed about the other closing the connection. Continuing to experiment this way reveals many other subtle -differences between TCP and UDP. To avoid such trouble, one should always +differences between TCP and UDP. To avoid such trouble, you should always remember the advice Douglas E.@: Comer and David Stevens give in Volume III of their series @cite{Internetworking With TCP} (page 14): @@ -1111,6 +1118,7 @@ to a new file and edit it, changing the name @samp{daytime} to @samp{8888}. Then start the modified client. You should get a reply like this: +@c FIXME: Let's put a newer date here... @example Sat Sep 27 19:08:16 CEST 1997 @end example @@ -1123,7 +1131,7 @@ Both programs explicitly close the connection. @cindex networks @subentry ports @subentry reserved @cindex Unix, network ports and Now we will intentionally make a mistake to see what happens when the name -@samp{8888} (the so-called port) is already used by another service. +@samp{8888} (the port) is already used by another service. Start the server program in both windows. The first one works, but the second one complains that it could not open the connection. Each port on a single @@ -1138,6 +1146,7 @@ than 1024 (@samp{echo} is at port 7) are reserved for @code{root}. On machines running some flavor of Microsoft Windows, there is no restriction that reserves ports 1 to 1024 for a privileged user; hence, you can start an @samp{echo} server there. +@c FIXME: Is this still true? Turning this short server program into something really useful is simple. Imagine a server that first reads a @value{FN} from the client through the @@ -1148,8 +1157,8 @@ could be: @example BEGIN @{ NetService = "/inet/tcp/8888/0/0" - NetService |& getline - CatPipe = ("cat " $1) # sets $0 and the fields + NetService |& getline # sets $0 and the fields + CatPipe = ("cat " $1) while ((CatPipe | getline) > 0) print $0 |& NetService close(NetService) @@ -1177,9 +1186,11 @@ execute arbitrary commands, anyone would be free to do @samp{rm -rf *}. @cindex Post Office Protocol (POP) @cindex Simple Mail Transfer Protocol (SMTP) The distribution of email is usually done by dedicated email servers that -communicate with your machine using special protocols. To receive email, we -will use the Post Office Protocol (POP). Sending can be done with the much -older Simple Mail Transfer Protocol (SMTP). +communicate with your machine using special protocols. +In this @value{SECTION} we show how simple the basic steps are. + +To receive email, we use the Post Office Protocol (POP). Sending can +be done with the much older Simple Mail Transfer Protocol (SMTP). @cindex email When you type in the following program, replace the @var{emailhost} by the @@ -1194,7 +1205,7 @@ shows you the first email the server has in store: BEGIN @{ POPService = "/inet/tcp/0/@var{emailhost}/pop3" RS = ORS = "\r\n" - print "user @var{name}" |& POPService + print "user @var{name}" |& POPService POPService |& getline print "pass @var{password}" |& POPService POPService |& getline @@ -1214,7 +1225,7 @@ BEGIN @{ @cindex @code{RS} variable @subentry POP and @cindex @code{ORS} variable @subentry POP and @cindex POP (Post Office Protocol) -The record separators @code{RS} and @code{ORS} are redefined because the +We redefine the record separators @code{RS} and @code{ORS} because the protocol (POP) requires CR-LF to separate lines. After identifying yourself to the email service, the command @samp{retr 1} instructs the service to send the first of all your email messages in line. If the service @@ -1274,6 +1285,7 @@ HTTP request that existed when the web was created in the early 1990s. HTTP calls this @code{GET} request a ``method,'' which tells the service to transmit a web page (here the home page of the Yahoo! search engine). Version 1.0 added the request methods @code{HEAD} and +@c FIXME: Update this footnote? @code{POST}. The current version of HTTP is 1.1,@footnote{Version 1.0 of HTTP was defined in RFC 1945. HTTP 1.1 was initially specified in RFC 2068. In June 1999, RFC 2068 was made obsolete by RFC 2616, an update @@ -1298,7 +1310,7 @@ but then you get binary data that should be redirected into a file. Another application is calling a CGI (Common Gateway Interface) script on some server. CGI scripts are used when the contents of a web page are not -constant, but generated instantly at the moment you send a request +constant, but generated on demand at the moment you send a request for the page. For example, to get a detailed report about the current quotes of Motorola stock shares, call a CGI script at Yahoo! with the following: @@ -1312,7 +1324,6 @@ You can also request weather reports this way. @node Primitive Service, Interacting Service, Web page, Using Networking @section A Primitive Web Service -@c STARTOFRANGE webser @cindex web service Now we know enough about HTTP to set up a primitive web service that just says @code{"Hello, world"} when someone connects to it with a browser. @@ -1338,8 +1349,8 @@ Send a line to tell the browser how many bytes follow in the body of the message. This was not necessary earlier because both parties knew that the document ended when the connection closed. Nowadays it is possible to stay connected after the transmission of one web page. -This is to avoid the network traffic necessary for repeatedly establishing -TCP connections for requesting several images. Thus, there is the need to tell +This avoids the network traffic necessary for repeatedly establishing +TCP connections for requesting several images. Thus, it is necessary to tell the receiving party how many bytes will be sent. The header is terminated as usual with an empty line. @@ -1403,8 +1414,7 @@ graphical user interface (GUI). Each HTTP event that the user triggers by some action within the browser is received in this central procedure. Parameters and menu choices are extracted from this request, and an appropriate measure is taken according to -the user's choice. -For example: +the user's choice: @cindex HTTP server, core logic @example @@ -1464,7 +1474,7 @@ applies to the port number. These values are inserted later into the HTML content of the web pages to refer to the home system. Each server that is built around this core has to initialize some -application-dependent variables (such as the default home page) in a procedure +application-dependent variables (such as the default home page) in a function @code{SetUpServer()}, which is called immediately before entering the infinite loop of the server. For now, we will write an instance that initiates a trivial interaction. With this home page, the client user @@ -1493,8 +1503,10 @@ initialized, the server can start communicating to a client browser. @cindex RFC 2068 It does so by printing the HTTP header into the network connection (@samp{print @dots{} |& HttpService}). This command blocks execution of -the server script until a client connects. If this server -script is compared with the primitive one we wrote before, you will notice +the server script until a client connects. + +If you compare this server +script with the primitive one we wrote before, you will notice two additional lines in the header. The first instructs the browser to close the connection after each request. The second tells the browser that it should never try to @emph{remember} earlier requests @@ -1604,11 +1616,9 @@ by calling the tool with the @code{system()} function or through a pipe. @quotation @i{HTTP is like being married: you have to be able to handle whatever you're given, while being very careful what you send back.}@* -Phil Smith III,@* -@uref{http://www.netfunny.com/rhf/jokes/99/Mar/http.html} +@author Phil Smith III,@* @uref{http://www.netfunny.com/rhf/jokes/99/Mar/http.html} @end quotation -@c STARTOFRANGE cgilib @cindex CGI (Common Gateway Interface) @subentry library In @ref{Interacting Service, ,A Web Service with Interaction}, we saw the function @code{CGI_setup()} as part of the web server @@ -1620,7 +1630,7 @@ the hexadecimal value: @samp{%26}. These encoded values should be decoded. Following is a simple library to perform these tasks. This code is used for all web server examples -used throughout the rest of this @value{DOCUMENT}. +throughout the rest of this @value{DOCUMENT}. If you want to use it for your own web server, store the source code into a file named @file{inetlib.awk}. Then you can include these functions into your code by placing the following statement @@ -1631,6 +1641,7 @@ into your program @@include inetlib.awk @end example +@c FIXME: Needs revising, now that gawk has @include @noindent But beware, this mechanism is only possible if you invoke your web server script with @command{igawk} @@ -1705,7 +1716,7 @@ BEGIN @{ @} @} -function CGI_setup( method, uri, version, i) +function CGI_setup(method, uri, version, i) @{ delete GETARG delete MENU @@ -1798,6 +1809,7 @@ BEGIN @{ @c endfile @end example +@c FIXME: Rerun to make sure still correct And this is the result when we run it: @c artificial line wrap in last output line @@ -1823,9 +1835,7 @@ p2=stuff%26junk&percent=a %25 sign @node Simple Server, Caveats, Interacting Service, Using Networking @section A Simple Web Server -@c STARTOFRANGE webserx @cindex web servers -@c STARTOFRANGE serweb @cindex servers @subentry web In the preceding @value{SECTION}, we built the core logic for event-driven GUIs. In this @value{SECTION}, we finally extend the core to a real application. @@ -1872,6 +1882,7 @@ This approach can be used to implement other kinds of servers. The only changes needed to do so are hidden in the functions @code{SetUpServer()} and @code{HandleGET()}. Perhaps it might be necessary to implement other HTTP methods. +@c FIXME: @include? The @command{igawk} program that comes with @command{gawk} may be useful for this process. @@ -1883,7 +1894,7 @@ items, etc.). The function @code{HandleGET()} is a nested case selection that decides which page the user wants to see next. Each nesting level refers to a menu -level of the GUI. Each case implements a certain action of the menu. On the +level of the GUI. Each case implements a certain action of the menu. At the deepest level of case selection, the handler essentially knows what the user wants and stores the answer into the variable that holds the HTML page contents: @@ -1923,7 +1934,7 @@ function HandleGET() @{ Now we are down to the heart of ELIZA, so you can see how it works. Initially the user does not say anything; then ELIZA resets its money -counter and asks the user to tell what comes to mind open heartedly. +counter and asks the user to tell what comes to mind open-heartedly. The subsequent answers are converted to uppercase characters and stored for later comparison. ELIZA presents the bill when being confronted with a sentence that contains the phrase ``shut up.'' Otherwise, it looks for @@ -2188,6 +2199,7 @@ function SetUpEliza() @{ @c endfile @end example +@c FIXME: Not sure what this home page is, or if available any more. Needs updating. @cindex Humphrys, Mark @cindex ELIZA program Some interesting remarks and details (including the original source code @@ -2228,7 +2240,7 @@ establishment of a connection that previously ended with a ``broken pipe.'' Those connections have to ``time out'' for a minute or so before they can reopen. Check this with the command @samp{netstat -a}, which -provides a list of still ``active'' connections. +provides a list of still-active connections. @node Challenges, , Caveats, Using Networking @section Where To Go From Here @@ -2387,7 +2399,7 @@ of all the newsgroups, mailing lists and FAQs on the Internet. @chapter Some Applications and Techniques In this @value{CHAPTER}, we look at a number of self-contained scripts, with an emphasis on concise networking. Along the way, we -work towards creating building blocks that encapsulate often needed +work towards creating building blocks that encapsulate often-needed functions of the networking world, show new techniques that broaden the scope of problems that can be solved with @command{gawk}, and explore leading edge technology that may shape the future of networking. @@ -2406,11 +2418,12 @@ accepted standard for GUIs: the web browser. Now, @command{gawk} can rival even Tcl/Tk. @cindex Tcl/Tk @subentry @command{gawk} and -Tcl and @command{gawk} have much in common. Both are simple scripting languages -that allow us to quickly solve problems with short programs. But Tcl has Tk -on top of it, and @command{gawk} had nothing comparable up to now. While Tcl -needs a large and ever-changing library (Tk, which was bound to the X Window -System until recently), @command{gawk} needs just the networking interface +Tcl and @command{gawk} have much in common. Both are simple scripting +languages that allow us to quickly solve problems with short programs. But +Tcl has Tk on top of it, and @command{gawk} had nothing comparable up +to now. While Tcl needs a large and ever-changing library (Tk, which was +originally bound to the X Window System), @command{gawk} needs just the +networking interface and some kind of browser on the client's side. Besides better portability, the most important advantage of this approach (embracing well-established standards such HTTP and HTML) is that @emph{we do not need to change the @@ -2444,11 +2457,11 @@ site is not working. When a web server breaks down, it makes a difference if customers get a strange ``network unreachable'' message, or a short message telling them that the server has a problem. In such an emergency, the hard disk and everything on it (including the regular web service) may -be unavailable. Rebooting the web server off a diskette makes sense in this +be unavailable. Rebooting the web server off a USB drive makes sense in this setting. To use the PANIC program as an emergency web server, all you need are the -@command{gawk} executable and the program below on a diskette. By default, +@command{gawk} executable and the program below on a USB drive. By default, it connects to port 8080. A different value may be supplied on the command line: @@ -2488,7 +2501,7 @@ could analyze the contents and extract the text or the links. An ASCII browser could be written around GETURL. But more interestingly, web robots are straightforward to write on top of GETURL. On the Internet, you can find several programs of the same name that do the same job. They are usually -much more complex internally and at least 10 times longer. +much more complex internally and at least 10 times as big. At first, GETURL checks if it was called with exactly one web address. Then, it checks if the user chose to use a special proxy server whose name @@ -2744,11 +2757,11 @@ BEGIN @{ Another thing that may look strange is the way GETURL is called. Before calling GETURL, we have to check if the proxy variables need to be passed on. If so, we prepare strings that will become part -of the command line later. In @code{GetHeader()}, we store these strings +of the command line later. In @code{GetHeader}, we store these strings together with the longest part of the command line. Later, in the loop -over the URLs, @code{GetHeader()} is appended with the URL and a redirection +over the URLs, @code{GetHeader} is appended with the URL and a redirection operator to form the command that reads the URL's header over the Internet. -GETURL always produces the headers over @file{/dev/stderr}. That is +GETURL always sends the headers to @file{/dev/stderr}. That is the reason why we need the redirection operator to have the header piped in. @@ -2788,8 +2801,8 @@ of links are missing in the regular expression. However, it is straightforward to add them, if doing so is necessary for other tasks. This program reads an HTML file and prints all the HTTP links that it finds. -It relies on @command{gawk}'s ability to use regular expressions as record -separators. With @code{RS} set to a regular expression that matches links, +It relies on @command{gawk}'s ability to use regular expressions as the record +separator. With @code{RS} set to a regular expression that matches links, the second action is executed each time a non-empty link is found. We can find the matching link itself in @code{RT}. @@ -2799,7 +2812,7 @@ This simple program prints shell commands that can be piped into @command{sh} for execution. This way it is possible to first extract the links, wrap shell commands around them, and pipe all the shell commands into a file. After editing the file, execution of the file retrieves -exactly those files that we really need. In case we do not want to edit, +only those files that we really need. In case we do not want to edit, we can retrieve all the pages like this: @smallexample @@ -2889,6 +2902,7 @@ files.@footnote{Due to licensing problems, the default installation of GNUPlot disables the generation of @file{.gif} files. If your installed version does not accept @samp{set term gif}, just download and install the most recent version of GNUPlot and the +@c FIXME: URL doesn't work @uref{http://www.boutell.com/gd/, GD library} by Thomas Boutell. Otherwise you still have the chance to generate some @@ -3057,7 +3071,7 @@ transmit, but rather raw image data to contain in the body. Most of the work is done in the second menu choice. It starts with a strange JavaScript code snippet. When first implementing this server, -we used a short @code{@w{"<IMG SRC="} MyPrefix "/Image>"} here. But then +we used a short @samp{@w{"<IMG SRC="} MyPrefix "/Image>"} here. But then browsers got smarter and tried to improve on speed by requesting the image and the HTML code at the same time. When doing this, the browser tries to build up a connection for the image request while the request for @@ -3122,7 +3136,7 @@ where it can be viewed by the user. It is probably better not to mix up so many different languages. The result is not very readable. Furthermore, the statistical part of the server does not take care of invalid input. -Among others, using negative variances will cause invalid results. +Among others, using negative variances causes invalid results. @node MAZE, MOBAGWHO, STATIST, Some Applications and Techniques @section MAZE: Walking Through a Maze In Virtual Reality @@ -3132,11 +3146,11 @@ Among others, using negative variances will cause invalid results. @quotation @cindex Perlis, Alan @i{In the long run, every program becomes rococo, and then rubble.}@* -Alan Perlis +@author Alan Perlis @end quotation By now, we know how to present arbitrary @samp{Content-type}s to a browser. -In this @value{SECTION}, our server will present a 3D world to our browser. +In this @value{SECTION}, our server presents a 3D world to our browser. The 3D world is described in a scene description language (VRML, Virtual Reality Modeling Language) that allows us to travel through a perspective view of a 2D maze with our browser. Browsers with a @@ -3147,7 +3161,7 @@ VRML. If you have never written any VRML code, have a look at the VRML FAQ. Presenting a static VRML scene is a bit trivial; in order to expose -@command{gawk}'s new capabilities, we will present a dynamically generated +@command{gawk}'s capabilities, we will present a dynamically generated VRML scene. The function @code{SetUpServer()} is very simple because it only sets the default HTML page and initializes the random number generator. As usual, the surrounding server lets you browse the maze. @@ -3282,8 +3296,8 @@ function MakeMaze(x, y) @{ @i{There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious -deficiencies.} @* -C. A. R. Hoare +deficiencies.} +@author C.A.R.@: Hoare @end quotation A @dfn{mobile agent} is a program that can be dispatched from a computer and @@ -3336,9 +3350,7 @@ process with a dedicated protocol specialized for receiving mobile agents. Our agent example abuses a common web server as a migration tool. So, it needs a universal CGI script on the receiving side (the web server). The receiving script is activated with a @code{POST} request when placed into a location like -@file{/httpd/cgi-bin/PostAgent.sh}. Make sure that the server system uses a -version of @command{gawk} that supports network access (Version 3.1 or later; -verify with @samp{gawk --version}). +@file{/httpd/cgi-bin/PostAgent.sh}. @example @c file eg/network/PostAgent.sh @@ -3488,7 +3500,7 @@ arrival at its new home site. One of the serious obstacles in implementing a framework for mobile agents is that it does not suffice to migrate the code. It is also necessary to migrate the state of execution of the agent. In contrast to @cite{Agent Tcl}, this program does not try to migrate the complete set -of variables. The following conventions are used: +of variables. The following conventions apply: @itemize @bullet @item @@ -3528,7 +3540,7 @@ standard output to avoid irritating the server. @end itemize The application-independent framework is now almost complete. What follows -is the @code{END} pattern that is executed when the mobile agent has +is the @code{END} pattern which executes when the mobile agent has finished reading its own code. First, it checks whether it is already running on a remote host or not. In case initialization has not yet taken place, it starts @code{MyInit()}. Otherwise (later, on a remote host), it @@ -3600,9 +3612,10 @@ is time to start the real work by appending the host's name to the result string, and reading line by line who is logged in on this host. A very annoying circumstance is the fact that the elements of @code{MOBVAR} cannot hold the newline character (@code{"\n"}). If they -did, migration of this string did not work because the string didn't +did, migration of this string would not work because the string wouldn't obey the syntax rule for a string in @command{gawk}. @code{SUBSEP} is used as a temporary replacement. + If the list of hosts to visit holds at least one more entry, the agent migrates to that place to go on working there. Otherwise, we replace the @code{SUBSEP}s @@ -3628,7 +3641,7 @@ Many solutions were suggested for this problem, but most of these were largely concerned with the movements of small green pieces of paper, which is odd because it wasn't the small green pieces of paper that were unhappy.} @* -Douglas Adams, @cite{The Hitch Hiker's Guide to the Galaxy} +@author Douglas Adams, @cite{The Hitch Hiker's Guide to the Galaxy} @end quotation @cindex @command{cron} utility @@ -3639,7 +3652,7 @@ Unix system users can write a list of tasks to be done each day, each week, twice a day, or just once. The list is entered into a file named @file{crontab}. For example, to distribute a newsletter on a daily basis this way, use @command{cron} for calling a script each day early -in the morning. +in the morning: @example # run at 8 am on weekdays, distribute the newsletter @@ -3892,7 +3905,7 @@ function Prediction() @{ At this point the hard work has been done: the array @code{predict} contains the predictions for all the ticker symbols. It is up to the -function @code{Report()} to find some nice words to introduce the +function @code{Report()} to find some nice words to present the desired information. @smallexample @@ -3974,8 +3987,11 @@ us about it! It is only for the sake of curiosity, of course. @code{:-)} @cindex BLAST, Basic Local Alignment Search Tool @cindex Hoare, C.A.R. @quotation -@i{Hoare's Law of Large Problems: Inside every large problem is a small - problem struggling to get out.} +@i{Inside every large problem is a small +problem struggling to get out.}@footnote{What C.A.R.@: Hoare +actually said was ``Inside every large program is a +small program struggling to get out.''} +@author With apologies to C.A.R.@: Hoare @end quotation Yahoo's database of stock market data is just one among the many large @@ -3994,7 +4010,9 @@ is a very long chain of four base nucleotides. It is the order of appearance (the sequence) of nucleotides which contains the information about the substance to be produced. Scientists in biotechnology often find a specific fragment, determine the nucleotide sequence, and need -to know where the sequence at hand comes from. This is where the large +to know where the sequence at hand comes from. + +This is where the large databases enter the game. At NCBI, databases store the knowledge about which sequences have ever been found and where they have been found. When the scientist sends his sequence to the BLAST service, the server @@ -4005,6 +4023,7 @@ the scientist. In order to make access simple, NCBI chose to offer their database service through popular Internet protocols. There are four basic ways to use the so-called BLAST services: +@c FIXME: Is all of this still true? @itemize @bullet @item The easiest way to use BLAST is through the web. Users may simply point @@ -4070,7 +4089,7 @@ K --> G T (keto) N --> A G C T (any) @end example Now you know the alphabet of nucleotide sequences. The last two lines -of the following example query show you such a sequence, which is obviously +of the following example query show such a sequence, which is obviously made up only of elements of the alphabet just described. Store this example query into a file named @file{protbase.request}. You are now ready to send it to the server with the demonstration client. @@ -4254,7 +4273,7 @@ book review on the Internet. @item -While Waterman's book can explain to you the algorithms employed internally +While Waterman's book explains the algorithms employed internally in the database search engines, most practitioners prefer to approach the subject differently. The applied side of Computational Biology is called Bioinformatics, and emphasizes the tools available for day-to-day @@ -4266,14 +4285,14 @@ books on Bioinformatics is The sequences @emph{gawk} and @emph{gnuawk} are in widespread use in the genetic material of virtually every earthly living being. Let us take this as a clear indication that the divine creator has intended -@command{gawk} to prevail over other scripting languages such as @command{perl}, -@command{tcl}, or @command{python} which are not even proper sequences. (:-) +@command{gawk} to prevail over other scripting languages such as @samp{perl}, +@samp{tcl}, or @samp{python} which are not even proper sequences. (:-) @end enumerate @node Links, GNU Free Documentation License, Some Applications and Techniques, Top @chapter Related Links -This section lists the URLs for various items discussed in this @value{CHAPTER}. +This section lists the URLs for various items discussed in this @value{DOCUMENT}. They are presented in the order in which they appear. @table @asis |