

Here is a list of the TOPICS covered in each lesson in the dMILL Network
Course for Clipper, followed by a list of the SKILLS taught in each lesson.


               Lesson 1.  Introduction to Multiple-User Programming

1.  Basic attributes of MS-DOS networks from a Clipper programmer's
    perspective.
2.  NetBIOS and the MS-DOS SHARE command.
3.  Sharing printers: selection and spooling.
4.  File and record resources: levels of access and sharing.
5.  Clipper commands to control levels of access and sharing of file and
    record resources.

                         Lesson 2.  Network Preconditions

6.  Preconditions: what they are and why we must live by them.
7.  Group A commands: direct support for preconditions.
8.  Group B commands: no direct support for preconditions.
9.  Group A commands requiring exclusive access, a file lock, or a record lock
    and their usage patterns.
10. Third party products: Handling resource contention and automatically
    converting single-user source code to multiple-user.

              Lesson 3.  Synchronization and Multiple-User Analysis

11. Concepts associated with concurrent processes and their synchronization.
12. How user programs communicate with each other on networks.
13. Semaphores and their use in synchronizing concurrent processes.
14. State-space analysis for analyzing multiple-user code.

                 Lesson 4.  Clipper Commands Requiring Semaphores

15. How to protect code resources with semaphores.
16. How to protect data resources with semaphores.
17. How to protect Group B commands and functions.
18. How to protect the various types of files upon which Group B commands and
    functions operate.
19. How to synchronize Group A and Group B commands with semaphores.
20. How to recover from semaphore table corruption.
21. How to determine when the costs of protecting Group B commands are
    justified.

                         Lesson 5.  Semaphore Programming

22. How to establish private user directories on the server to elegantly solve
    problems of configuration and temporary files.
23. How to use state space analysis to analyze, verify, or establish the
    correctness of multiple-user code and algorithms.
24. How to use name-and-value semaphores to synchronize PACK and concurrent
    APPEND FROM operations.
25. How to use test-and-set semaphore operations.
26. How to detect when semaphore batching is required, not required but
    desired, or prohibited.
27. How to use name-and-value semaphores to synchronize exclusive-use Group A
    commands with concurrent Group B operations on the same file.
28. How to detect whether Clipper supports concurrent APPEND FROM operations
    on a given network.

                  Lesson 6.  Semaphores and Third-Party Products

29. Third-party products (CLIPnet, NetLib, NOVLIB) which implement semaphores
    on Novell LANs using Novell facilities.
30. How to simulate locking and unlocking with NOVLIB semaphores.
31. How to debug, verify, audit, and profile a multiple-user application using
    the tracking, logging, and reporting options of the portable semaphore
    facility in the dMILL Network Kit.
32. How to determine whether Clipper's built-in function NetName() works on
    your network and how to simulate it if it does not work.
33. How to set multiple record locks with semaphores.
34. Review of the first six lessons.

                     Lesson 7.  Handling Resource Contention

35. The multiple-user programming techniques of notification, manual retry,
    automatic retry, retry delay, manual timeout, automatic timeout, and
    tracing.
36. The three methods for eliminating deadlock: detection, prevention, and
    avoidance.
37. How to choose and implement a method to eliminate deadlock.
38. Abnormal resolutions of deadlock and their countermeasures.
39. How to choose a good value for a retry delay.
40. How to design effective trace facilities.

               Lesson 8.  Network Replacements for the USE Command

41. The calling convention and services of four routines which substitute for
    the USE command in a multiple-user program, including:

    o  the NetUse() function from Clipper's Locks.PRG file

    o  Rick Spence's enhanced NetUse()

    o  the DA_USE procedure from dANALYST Gold

    o  the DA_USE procedure from the dMILL Network Kit

42. The limitations or extensions of these routines relative to the USE
    command.
43. Ergonomic principles in notification.
44. Software support for debugging, verifying, and profiling multiple-user
    applications.
45. Methods for handling denied resource requests.

                  Lesson 9.  Multiple-User Conversion Techniques

46. Permissions for file operations on the network and their effect on network
    administration and programming.
47. Differences between running applications locally or on stand-alone PCs
    versus running the applications from network disk drives.
48. Issues in converting applications from single-user to multiple-user,
    including: pathnames in file references, SET PATH TO, the MS-DOS PATH
    command, marking executables read-only, opening files with one routine,
    temporary files, and testing.
49. An APPEND FROM bug, a test for it, and a work-around.

                  Lesson 10.  Multiple-User Conversion Templates

50. Coding issues associated with Clipper's COMMIT command.
51. Code patterns to open a database exclusively and return it to shared use.
52. Code patterns to open a database in shared mode, lock it, and return it to
    shared use.
53. Code patterns to open a database in shared mode, lock a record, and return
    it to shared use.
54. Multiple-user coding issues associated with Clipper's SET RELATION
    command.
55. Coding issues associated with the open mode of database index files.
56. Code patterns to PACK, REINDEX, or ZAP a database.



          Skills You Get From The dMILL Network Kit for Clipper

               Lesson 1.  Introduction to Multiple-User Programming

 1.  Define "MS-DOS network."
 2.  Briefly define and describe the network layer of the operating
     environment which enhances MS-DOS with the ability to support the sharing
     of information among several networked users.
 3.  Identify the lowest version of MS-DOS which you can use on a network.
 4.  Define the purpose of NetBIOS and say under what conditions it is
     required.
 5.  Define the purpose of the MS-DOS SHARE command and say under what
     conditions it is required.
 6.  Define the term resource contention.
 7.  State whether printer control on the network should be uncoupled, loosely
     coupled, or tightly coupled to an application's code.
 8.  Define the terms spooling, spooler, and spool file.
 9.  Describe the issues which arise when you use several forms on a shared
     printer.
10.  List the three levels of access that Clipper gives to database files.
11.  List the two levels of access that Clipper gives to database records.
12.  List the Clipper commands and functions which support multiple-user
     programming.
13.  List the Clipper commands which require a database to be in exclusive
     use.
14.  Describe a recommended strategy for the use of SET EXCLUSIVE OFF versus
     the SHARED keyword in the USE command.
15.  Describe a recommended strategy for the use of SET INDEX TO versus the
     INDEX keyword in the USE command.
16.  Say how to lock a record in Clipper.
17.  Name three ways to lock multiple records in Clipper.
18.  State the difference between UNLOCK and UNLOCK ALL.
19.  Describe the purpose and use of Clipper's NetErr() function.
20.  Describe a way to identify network users with unique codes if NetName()
     returns blanks.
21.  Describe the purpose and use of Clipper's COMMIT command.

                         Lesson 2.  Network Preconditions

22.  Define the term precondition.
23.  Describe the difference between Group A and Group B commands and
     functions.
24.  List the four different preconditions which apply to Group A commands.
25.  List the Group A commands which require exclusive database access.
26.  Describe the usage pattern for such commands.
27.  Explain why INDEX ON should always be used in preference to REINDEX.
28.  List the Group A commands which require exclusive database access or a
     file lock of a shared database.
29.  Describe the usage pattern for such commands.
30.  List the Group A commands which require exclusive database access, a file
     lock, or a record lock.
31.  Describe the usage pattern for such commands.
32.  Name the Buzzwords International product which can automatically convert
     seven code patterns for Group A commands from their single-user to their
     multiple-user forms.
33.  Describe the relationship between dANALYST Gold and the dMILL Network Kit
     for Clipper.

               Lesson 3.  Synchronization and Multiple-User Analysis

34.  Define these terms: single tasking, multitasking, uniprocessing,
     multiprocessing, simultaneous processes, concurrent processes,
     synchronization, serialization, semaphores, protection, and deadlock.
35.  Describe the communication paths on a network between clients and
     servers.
36.  Describe how a client accesses a server directory.
37.  Describe the serialization method of synchronizing concurrent processes
     and indicate when it is applicable.
38.  Describe the "wait" and "signal" method of synchronizing concurrent
     processes.
39.  List the two attributes that all semaphores possess.
40.  List the two actions that one can always apply to semaphores.
41.  Describe the use of semaphores to protect code or data resources.
42.  Describe a method for determining all possible states of a multiple-user
     computer system.
43.  Describe state-space analysis and its application to verifying or
     developing synchronized multiple-user code.

                 Lesson 4.  Clipper Commands Requiring Semaphores

44.  Give the definition of Group B commands and functions.
45.  List Group B commands and functions.
46.  Identify the protected code in Listings 8.1 and 8.2.
47.  Give an example of protecting a code resource.
48.  Give an example of protecting a data resource.
49.  List the file types upon which Group B commands and functions operate.
50.  Give an example of protecting a .MEM file with a semaphore.
51.  Justify or attack the idea that semaphores will always become available
     when we wait for them.
52.  Give an example of Group A and B commands which interact, using PACK as
     the Group A command and APPEND FROM as the Group B command.
53.  Describe how to synchronize PACK with APPEND FROM using semaphores,
     assuming that APPEND FROM commands do not execute concurrently.
54.  Describe the effect on other applications if a program terminates
     abnormally when it has semaphores open.
55.  Describe countermeasures for these effects.
56.  Describe the recovery duties of the programmer or network administrator
     when a program fails when it has semaphores open.
57.  Describe how to analyze the costs and benefits of protecting against a
     failure to establish the preconditions of Group B commands.  Say under
     what circumstances can you justify such protection.

                         Lesson 5.  Semaphore Programming

58.  Describe a network management convention which permits each user to have
     a private directory on a server.
59.  Explain how such directories solve problems associated with temporary
     files.
60.  Describe a situation where users PACK a database in exclusive use but
     APPEND FROM that database concurrently.
61.  Construct a state space table for this group of users.
62.  Say which state transitions in the table can be eliminated because they
     are logically impossible for all algorithms.
63.  Say whether Clipper supports concurrent APPEND FROM operations on all
     networks.
64.  Describe the transitions in the state table which your algorithm must
     avoid.
65.  Using semaphores with both names and values, specify an algorithm which
     implements all of the allowed state transitions and none of the
     prohibited ones.
66.  Describe the purpose and action of a "test-and-set" semaphore routine.
67.  Code the algorithm using the semaphore routines in the dMILL Network Kit
     for Clipper.
68.  Describe the semaphore concepts of waiting and signaling and how they can
     be used to analyze the correctness of multiple-user code.
69.  Apply these concepts to analyze the correctness of the multiple-user code
     you wrote to synchronize PACK with APPEND FROM.
70.  Describe the concept of batching semaphore operations and say why it is
     needed.
71.  Give two examples which show the need for semaphore batching.
72.  Describe how to modify your algorithm for synchronizing PACK with APPEND
     FROM to permit only one concurrent APPEND FROM.
73.  Describe how to synchronize PACK, REINDEX, or ZAP with non-concurrent
     executions of Group B commands using a name-only semaphore.
74.  Describe how to synchronize PACK, REINDEX, or ZAP with concurrent
     executions of Group B commands using a name-and-value semaphore.
75.  Say how to detect whether Clipper supports concurrent APPEND FROM
     operations on a given network (Listing 9.7).

                  Lesson 6.  Semaphores and Third-Party Products

76.  Name three products which implement semaphores on Novell LANs using
     either Novell semaphores or Novell logical locks.
77.  Explain the difference between a Novell semaphore and a Novell logical
     lock.
78.  List the names and uses of the semaphore routines in CLIPnet.
79.  List the names and uses of the semaphore routines in NetLib.
80.  List the names and uses of the semaphore routines in NOVLIB.
81.  Code a simulation of a semaphore locking routine using NOVLIB semaphore
     routines.
82.  Code a simulation of a semaphore unlocking routine using NOVLIB semaphore
     routines.
83.  Describe the semaphore tracking facility in the dMILL Network Kit.
84.  Describe the semaphore logging (historical recording) facility in the
     dMILL Network Kit.
85.  List the names and uses of the semaphore routines in the dMILL Network
     Kit.
86.  Characterize and contrast the printed documentation in CLIPnet, The dMILL
     Network Kit, NetLib, and NOVLIB.
                                                                    TM
87.  Give an equation which summarizes David Millican's docusoftware
     concept.
88.  Describe some issues connected with having multiple-user applications
     implemented in different xBASE dialects share resources and how the
     semaphore facility in the dMILL Network Kit can help to overcome some of
     the problems.
89.  Describe a test to determine whether Clipper's built-in function
     NetName() works on your network.
90.  Tell how to simulate NetName() on networks where it is not supported.
91.  Describe a way to set multiple record locks with semaphores.

                      Lesson 7.  Handling Resource Contention

92.  Describe the following multiple-user programming techniques:
     notification, manual retry, automatic retry, retry delay, manual timeout,
     automatic timeout, and tracing.
93.  Describe a technique to display screen text in the currently defined
     alternate colors.
94.  Describe the following methods of eliminating deadlock: detection,
     prevention, and avoidance.
95.  Which methods of eliminating deadlock can be used with Clipper?
96.  Describe some programming pitfalls associated with deadlock prevention.
97.  Identify the ways in which deadlock avoidance is better than deadlock
     prevention.
98.  List the possible outcomes of resource contention when automatic timeout
     is used.
99.  List some abnormal resolutions of deadlock.
100. List some countermeasures for abnormal resolutions of deadlock.
101. State the IBM discovery from the 1970s about how long a user maintains
     concentration on the current task when waiting for a response from the
     computer.
102. Specify and justify a good value for a retry delay.
103. List some of the issues involved in designing trace facilities.

                Lesson 8.  Network Replacements for the USE Command

104. Describe the calling convention, services, and critical limitations of
     the NetUse() function bundled with Clipper versions Summer '87 and 5.0.
105. Describe the calling convention, services, and critical limitations of
     the NetUse() function in Rick Spence's Clipper Programming Guide, 2nd
     Edition.
106. Describe the calling convention, services, and limitations of the DA_USE
     procedure bundled with dANALYST Gold.
107. Describe the method used by the dANALYST Gold procedure DA_USE to handle
     denied resource requests and state why it is problematic.
108. Describe the calling convention and services of the DA_USE procedure
     bundled with the dMILL Network Kit for Clipper.
109. Describe the way that this procedure handles the keywords: NEW, SHARED,
     and READONLY.
110. Describe the ergonomic features of this routine's notification method.
111. List and describe the memvars which control the behavior of routines in
     the software component of the dMILL Network Kit for Clipper.
112. Describe the verification and debugging support in the routines in the
     software component of the dMILL Network Kit for Clipper.
113. Describe the Kit's method for handling denied resource requests and why
     it is preferable to using BEGIN SEQUENCE ... END.

                  Lesson 9.  Multiple-User Conversion Techniques

114. Describe the concept of permissions for network users.
115. A given network may group permissions; for example, it may be that a user
     who can erase a file in a network directory can also create files in that
     directory and vice versa.  Assume that a network does not group
     permissions and list as many separate permissions as possible.
116. Describe the role that permissions play in setting up a user on the
     network.
117. Describe the difference between executing applications from local versus
     network directories.
118. Describe the resources typically shared by multiple-user xBASE
     applications.
119. Describe the three modes of file access in multiple-user xBASE
     applications.
120. Describe xBASE commands which control the printer.
121. Describe a method to control network printers from inside an application.
122. Describe the two types of work involved in converting a single-user
     application to its multiple-user form.
123. Describe the modification of pathnames in file references and in SET PATH
     TO in converting a single-user application to its multiple-user form.
124. Name the MS-DOS command which is used to set file attributes.
125. Name reasons for marking executable files (including overlay files) as
     read-only.
126. Give sample batch files for running applications on the network.
127. Say why you might change the PATH statement in a user's AutoExec.BAT file
     when you put them on the network.
128. Describe the motivation for opening all files with one routine.
129. Describe a method for handling temporary files on the network.
130. Name the problem that exists with APPEND FROM on some networks.
131. Describe the motivation for running several small test programs in the
     course of developing a multiple-user application.

                  Lesson 10.  Multiple-User Conversion Templates

132. Describe the difference between Clipper's COMMIT command under MS-DOS
     version 3.3 or later versus earlier versions.
133. Describe the simulation of COMMIT under MS-DOS 3.3 using MS-DOS 3.2 or
     earlier using the (1) USE command, (2) the dMILL Network Kit's DA_USE
     procedure with default handling of denied resource requests, and (3)
     DA_USE with custom handling.
134. Describe the code patterns for opening a database exclusively and
     returning it to shared use using (1) USE command, (2) the dMILL Network
     Kit's DA_USE procedure with default handling of denied resource requests,
     and (3) DA_USE with custom handling.
135. Describe the code patterns for opening a database in shared mode, locking
     it, and returning it to shared use using (1) USE command and FLock(), (2)
     the dMILL Network Kit's DA_FLock and DA_USE routines with default
     handling of denied resource requests, and (3) DA_FLock and DA_USE with
     custom handling.
136. Say whether RLock() applies to records in databases related with SET
     RELATION, and if not, how to lock all related records at once.
137. Name the dMILL Network Kit routine used to open a database file.
138. Name the dMILL Network Kit routine used to append a blank record.
139. Name the dMILL Network Kit routine used to PACK a database.
140. Name the dMILL Network Kit routine used to REINDEX a database.
141. Name the dMILL Network Kit routine used to ZAP a database.
142. Name the dMILL Network Kit routine used to lock a shared database.
143. Name the dMILL Network Kit routine used to lock a record in a shared
     database.
144. Describe the relation of the open mode of a database to the open mode of
     its index files.
145. What part of an index file is locked when you lock and update a record?
146. List the single-user and multiple-user code patterns for opening files
     with DA_USE.
147. List the single-user and multiple-user code patterns for locking files
     with DA_FLock.
148. List the single-user and multiple-user code patterns for locking records
     with DA_RLock.
149. Say why you should qualify field names if you use dANALYST Gold to
     convert the seven standard patterns.
150. List the single-user and multiple-user code patterns for packing files
     with DmPack_DB.
151. List the single-user and multiple-user code patterns to REINDEX files
     with DmReindex.
152. List the single-user and multiple-user code patterns to ZAP files with
     DmZAP_DB.

<END OF LIST>
