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.