Mercurial > docs > master
comparison discussion.roff @ 171:346ff7e201f5
Applied suggestions by Boris.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Tue, 10 Jul 2012 16:49:03 +0200 |
parents | f4ffe121a0a2 |
children | 4c7db172fb59 |
comparison
equal
deleted
inserted
replaced
170:97461b0b34d2 | 171:346ff7e201f5 |
---|---|
4 mmh project. | 4 mmh project. |
5 It is structured along the goals set for the project. | 5 It is structured along the goals set for the project. |
6 The concrete work undertaken | 6 The concrete work undertaken |
7 is described in the examples of how the general goals were achieved. | 7 is described in the examples of how the general goals were achieved. |
8 The discussion compares the current version of mmh with the state of | 8 The discussion compares the current version of mmh with the state of |
9 nmh just before the mmh project started, i.e. Fall 2011. | 9 nmh just before the mmh project started, i.e. fall 2011. |
10 Current changes of nmh will be mentioned only as side notes. | 10 Current changes of nmh will be mentioned only as side notes. |
11 .\" XXX where do I discuss the parallel development of nmh? | 11 .\" XXX where do I discuss the parallel development of nmh? |
12 | 12 |
13 | 13 |
14 | 14 |
43 to be beaten by projects that focus only on integrating existing mail | 43 to be beaten by projects that focus only on integrating existing mail |
44 components to create a homogeneous system. | 44 components to create a homogeneous system. |
45 .P | 45 .P |
46 The limiting resource in the community development of Free Software | 46 The limiting resource in the community development of Free Software |
47 is usually man power. | 47 is usually man power. |
48 .\" XXX FIXME ref! | |
48 If the development power is spread over a large development area, | 49 If the development power is spread over a large development area, |
49 it becomes even more difficult to compete with the specialists in the | 50 it becomes even more difficult to compete with the specialists in the |
50 various fields. | 51 various fields. |
51 The concrete situation for MH-based mail systems is even tougher, | 52 The concrete situation for MH-based mail systems is even tougher, |
52 given their small and aged community, concerning both developers and users. | 53 given their small and aged community, concerning both developers and users. |
187 Later, the essential complexity of email increased. | 188 Later, the essential complexity of email increased. |
188 (Essential complexity is the complexity defined by the problem itself.\0 | 189 (Essential complexity is the complexity defined by the problem itself.\0 |
189 .[[ | 190 .[[ |
190 brooks no silver bullet | 191 brooks no silver bullet |
191 .]]) | 192 .]]) |
192 Email systems reacted to this change: They grew. | 193 Email systems reacted to this change: they grew. |
193 RFCs started to introduce the concept of mail agents to separate the | 194 RFCs started to introduce the concept of mail agents to separate the |
194 various tasks because they became more extensive and new tasks appeared. | 195 various tasks because they became more extensive and new tasks appeared. |
195 As the mail systems grew even more, parts were split off. | 196 As the mail systems grew even more, parts were split off. |
196 For instance, a POP server was included in the original MH; | 197 For instance, a POP server was included in the original MH; |
197 it was removed in nmh. | 198 it was removed in nmh. |
204 that covers the field. | 205 that covers the field. |
205 Today, this is a reasonable exchange. | 206 Today, this is a reasonable exchange. |
206 .P | 207 .P |
207 .\" XXX ueberleitung ??? | 208 .\" XXX ueberleitung ??? |
208 Functionality can be added in three different ways: | 209 Functionality can be added in three different ways: |
209 .BU | 210 .LI 1 |
210 Implementing the function in the project itself. | 211 Implementing the function in the project itself. |
211 .BU | 212 .LI 2 |
212 Depending on a library that provides the function. | 213 Depending on a library that provides the function. |
213 .BU | 214 .LI 3 |
214 Depending on a program that provides the function. | 215 Depending on a program that provides the function. |
215 .P | 216 .LP |
216 .\" XXX Rework sentence | 217 .\" XXX Rework sentence |
217 While implementing the function in the project itself leads to the | 218 While implementing the function in the project itself leads to the |
218 largest increase in code size and requires the most maintenance | 219 largest increase in code size and requires the most maintenance |
219 and development work, | 220 and development work, |
220 it increases the project's independence of other software the most. | 221 it increases the project's independence of other software the most. |
600 .P | 601 .P |
601 Customization is a double-edged sword. | 602 Customization is a double-edged sword. |
602 It allows better suiting setups, but not for free. | 603 It allows better suiting setups, but not for free. |
603 There is the cost of code complexity to be able to customize. | 604 There is the cost of code complexity to be able to customize. |
604 There is the cost of less tested setups, because there are | 605 There is the cost of less tested setups, because there are |
605 more possible setups and especially corner-cases. | 606 more possible setups and especially corner cases. |
606 Additionally, there is the cost of choice itself. | 607 Additionally, there is the cost of choice itself. |
607 The code complexity directly affects the developers. | 608 The code complexity directly affects the developers. |
608 Less tested code affects both, users and developers. | 609 Less tested code affects both, users and developers. |
609 The problem of choice affects the users, for once by having to choose, | 610 The problem of choice affects the users, for once by having to choose, |
610 but also by more complex interfaces that require more documentation. | 611 but also by more complex interfaces that require more documentation. |
754 and | 755 and |
755 .Ev PAGER | 756 .Ev PAGER |
756 if they are set. | 757 if they are set. |
757 Today, mmh determines the editor to use in the following order, | 758 Today, mmh determines the editor to use in the following order, |
758 taking the first available and non-empty item: | 759 taking the first available and non-empty item: |
759 .IP (1) | 760 .LI 1 |
760 Environment variable | 761 Environment variable |
761 .Ev MMHEDITOR | 762 .Ev MMHEDITOR |
762 .IP (2) | 763 .LI 2 |
763 Profile entry | 764 Profile entry |
764 .Pe Editor | 765 .Pe Editor |
765 .IP (3) | 766 .LI 3 |
766 Environment variable | 767 Environment variable |
767 .Ev VISUAL | 768 .Ev VISUAL |
768 .IP (4) | 769 .LI 4 |
769 Environment variable | 770 Environment variable |
770 .Ev EDITOR | 771 .Ev EDITOR |
771 .IP (5) | 772 .LI 5 |
772 Command | 773 Command |
773 .Pn vi . | 774 .Pn vi . |
774 .P | 775 .LP |
775 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b | 776 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b |
776 .P | 777 .P |
777 The pager to use is determined in a similar order, | 778 The pager to use is determined in a similar order, |
778 also taking the first available and non-empty item: | 779 also taking the first available and non-empty item: |
779 .IP (1) | 780 .LI 1 |
780 Environment variable | 781 Environment variable |
781 .Ev MMHPAGER | 782 .Ev MMHPAGER |
782 .IP (2) | 783 .LI 2 |
783 Profile entry | 784 Profile entry |
784 .Pe Pager | 785 .Pe Pager |
785 (replaces | 786 (replaces |
786 .Pe moreproc ) | 787 .Pe moreproc ) |
787 .IP (3) | 788 .LI 3 |
788 Environment variable | 789 Environment variable |
789 .Ev PAGER | 790 .Ev PAGER |
790 .IP (4) | 791 .LI 4 |
791 Command | 792 Command |
792 .Pn more . | 793 .Pn more . |
793 .P | 794 .LP |
794 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e | 795 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e |
795 .P | 796 .P |
796 By respecting the | 797 By respecting the |
797 .Ev VISUAL /\c | 798 .Ev VISUAL /\c |
798 .Ev EDITOR | 799 .Ev EDITOR |
987 | 988 |
988 | 989 |
989 | 990 |
990 .H2 "Command Line Switches | 991 .H2 "Command Line Switches |
991 .P | 992 .P |
992 The command line switches of MH tools follow the X Window style. | 993 The command line switches of MH tools is similar to the X Window style. |
994 .\" XXX ref | |
993 They are words, introduced by a single dash. | 995 They are words, introduced by a single dash. |
994 For example: | 996 For example: |
995 .Cl "-truncate" . | 997 .Cl "-truncate" . |
996 Every program in mmh has two generic switches: | 998 Every program in mmh has two generic switches: |
997 .Sw -help , | 999 .Sw -help , |
1460 .Sw -mmdf | 1462 .Sw -mmdf |
1461 switches. | 1463 switches. |
1462 .Sw -mbox | 1464 .Sw -mbox |
1463 is the sole behavior now. | 1465 is the sole behavior now. |
1464 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 | 1466 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 |
1465 In the same go, | 1467 Further rework in both tools made the |
1466 .Pn packf | |
1467 and | |
1468 .Pn rcvpack | |
1469 were reworked and their | |
1470 .Sw -file | 1468 .Sw -file |
1471 switch became unnecessary. | 1469 switch unnecessary. |
1472 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e | 1470 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e |
1473 | 1471 |
1474 .BU | 1472 .BU |
1475 Mmh's tools will no longer clear the screen (\c | 1473 Mmh's tools will no longer clear the screen (\c |
1476 .Pn scan 's | 1474 .Pn scan 's |
2139 mode. | 2137 mode. |
2140 In mmh, | 2138 In mmh, |
2141 .Sw -auto | 2139 .Sw -auto |
2142 is not dangerous anymore. | 2140 is not dangerous anymore. |
2143 Two changes were necessary: | 2141 Two changes were necessary: |
2144 .BU | 2142 .LI 1 |
2145 Any directory path is removed from the proposed filename. | 2143 Any directory path is removed from the proposed filename. |
2146 Thus, the files are always stored in the expected directory. | 2144 Thus, the files are always stored in the expected directory. |
2147 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb | 2145 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb |
2148 .BU | 2146 .LI 2 |
2149 Tar files are not extracted automatically any more. | 2147 Tar files are not extracted automatically any more. |
2150 Thus, the rest of the file system will not be touched. | 2148 Thus, the rest of the file system will not be touched. |
2151 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 | 2149 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 |
2152 .LP | 2150 .LP |
2153 Now, the outcome of mmh's | 2151 Now, the outcome of mmh's |
2406 .Fn pgpkeys . | 2404 .Fn pgpkeys . |
2407 Unless public keys are found for all recipients, | 2405 Unless public keys are found for all recipients, |
2408 .Pn send | 2406 .Pn send |
2409 will refuse to encrypt and send it. | 2407 will refuse to encrypt and send it. |
2410 Currently, messages with hidden (BCC) recipients can not be encrypted. | 2408 Currently, messages with hidden (BCC) recipients can not be encrypted. |
2411 This corner-case requires a more complex solution. | 2409 This work is pending because it requires a structurally more complex |
2412 Covering it is left to do. | 2410 approach. |
2413 .P | 2411 .P |
2414 The integrated message signing and encrypting support is one of the | 2412 The integrated message signing and encrypting support is one of the |
2415 most recent features in mmh. | 2413 most recent features in mmh. |
2416 Feedback from users and the experience I will gather myself | 2414 Feedback from users and the experience I will gather myself |
2417 will direct the further development of the facility. | 2415 will direct the further development of the facility. |
2472 .Fn draft | 2470 .Fn draft |
2473 in the MH directory, which is treated special. | 2471 in the MH directory, which is treated special. |
2474 On composing a message, this draft file was used. | 2472 On composing a message, this draft file was used. |
2475 When starting to compose another message before the former one was sent, | 2473 When starting to compose another message before the former one was sent, |
2476 the user had to decide among: | 2474 the user had to decide among: |
2477 .BU | 2475 .LI 1 |
2478 Using the old draft to finish and send it before starting with a new one. | 2476 Using the old draft to finish and send it before starting with a new one. |
2479 .BU | 2477 .LI 2 |
2480 Discarding the old draft and replacing it with a new one. | 2478 Discarding the old draft and replacing it with a new one. |
2481 .BU | 2479 .LI 3 |
2482 Preserving the old draft by refiling it to a folder. | 2480 Preserving the old draft by refiling it to a folder. |
2483 .P | 2481 .LP |
2484 It was only possible to work in alternation on multiple drafts. | 2482 It was only possible to work in alternation on multiple drafts. |
2485 Therefore, the current draft needed to be refiled to a folder and | 2483 Therefore, the current draft needed to be refiled to a folder and |
2486 another one re-used for editing. | 2484 another one re-used for editing. |
2487 Working on multiple drafts at the same time was impossible. | 2485 Working on multiple drafts at the same time was impossible. |
2488 The usual approach of switching to a different MH context did not | 2486 The usual approach of switching to a different MH context did not |
2507 It is the more powerful and more natural concept. | 2505 It is the more powerful and more natural concept. |
2508 The draft folder is a folder like any other folder in MH. | 2506 The draft folder is a folder like any other folder in MH. |
2509 Its messages can be listed like any other messages. | 2507 Its messages can be listed like any other messages. |
2510 A draft message is no longer a special case. | 2508 A draft message is no longer a special case. |
2511 Tools do not need special switches to work on the draft message. | 2509 Tools do not need special switches to work on the draft message. |
2512 Hence corner-cases were removed. | 2510 Hence corner cases were removed. |
2513 .P | 2511 .P |
2514 The trivial part of the work was activating the draft folder with a | 2512 The trivial part of the work was activating the draft folder with a |
2515 default name. | 2513 default name. |
2516 I chose the name | 2514 I chose the name |
2517 .Fn +drafts | 2515 .Fn +drafts |
2541 Yet, one draft-related switch remained. | 2539 Yet, one draft-related switch remained. |
2542 .Pn comp | 2540 .Pn comp |
2543 still has | 2541 still has |
2544 .Sw -[no]use | 2542 .Sw -[no]use |
2545 for switching between two modes: | 2543 for switching between two modes: |
2546 .BU | 2544 .LI 1 |
2547 .Sw -use | 2545 .Sw -use |
2548 to modify an existing draft. | 2546 to modify an existing draft. |
2549 .BU | 2547 .LI 2 |
2550 .Sw -nouse | 2548 .Sw -nouse |
2551 to compose a new draft, possibly taking some existing message as template. | 2549 to compose a new draft, possibly taking some existing message as template. |
2552 .P | 2550 .LP |
2553 In either case, the behavior of | 2551 In either case, the behavior of |
2554 .Pn comp | 2552 .Pn comp |
2555 is deterministic. | 2553 is deterministic. |
2556 .P | 2554 .P |
2557 .Pn send | 2555 .Pn send |
2812 Quoting the original message in the reply. | 2810 Quoting the original message in the reply. |
2813 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 | 2811 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 |
2814 .BU | 2812 .BU |
2815 Forwarding messages using MIME. | 2813 Forwarding messages using MIME. |
2816 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 | 2814 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 |
2817 .P | 2815 .LP |
2818 In consequence, a setup with a profile that defines only the path to the | 2816 In consequence, a setup with a profile that defines only the path to the |
2819 mail storage, is already convenient to use. | 2817 mail storage, is already convenient to use. |
2820 Again, Paul Vixie's ``edginess'' call supports the direction I took: | 2818 Again, Paul Vixie's ``edginess'' call supports the direction I took: |
2821 ``the `main branch' should just be modern''. | 2819 ``the `main branch' should just be modern''. |
2822 .[ | 2820 .[ |
3078 .Sw -number | 3076 .Sw -number |
3079 switch is only necessary in combination with | 3077 switch is only necessary in combination with |
3080 .Sw -delete , | 3078 .Sw -delete , |
3081 but not with | 3079 but not with |
3082 .Sw -list . | 3080 .Sw -list . |
3083 In the former case it is even necessary. | 3081 .P |
3084 .P | 3082 Trying to fix these problems on the surface would not have solved |
3085 Trying to fix these problems on the surface would not have solved it truly. | 3083 them truly, as they originate from a discrepance between the semantic |
3086 The problems discovered originate from a discrepance between the semantic | |
3087 structure of the problem and the structure implemented in the program. | 3084 structure of the problem and the structure implemented in the program. |
3088 Such structural differences can not be cured on the surface. | 3085 Such structural differences can not be cured on the surface. |
3089 They need to be solved by adjusting the structure of the implementation | 3086 They need to be solved by adjusting the structure of the implementation |
3090 to the structure of the problem. | 3087 to the structure of the problem. |
3091 .P | 3088 .P |
3103 .Sw -delete | 3100 .Sw -delete |
3104 introduce modes of operation. | 3101 introduce modes of operation. |
3105 Historically, | 3102 Historically, |
3106 .Pn anno | 3103 .Pn anno |
3107 had only one operation mode: adding header fields. | 3104 had only one operation mode: adding header fields. |
3108 With the extension, it got two moder modes: | 3105 With the extension, it got two more modes: |
3109 listing and deleting header fields. | 3106 listing and deleting header fields. |
3110 The structure of the code changes did not pay respect to this | 3107 The structure of the code changes did not pay respect to this |
3111 fundamental change to | 3108 fundamental change to |
3112 .Pn anno 's | 3109 .Pn anno 's |
3113 behavior. | 3110 behavior. |
3166 | 3163 |
3167 | 3164 |
3168 .U3 "Path Conversion | 3165 .U3 "Path Conversion |
3169 .P | 3166 .P |
3170 Four kinds of path names can appear in MH: | 3167 Four kinds of path names can appear in MH: |
3171 .IP (1) | 3168 .LI 1 |
3172 Absolute Unix directory paths, like | 3169 Absolute Unix directory paths, like |
3173 .Fn /etc/passwd . | 3170 .Fn /etc/passwd . |
3174 .IP (2) | 3171 .LI 2 |
3175 Relative Unix directory paths, like | 3172 Relative Unix directory paths, like |
3176 .Fn ./foo/bar . | 3173 .Fn ./foo/bar . |
3177 .IP (3) | 3174 .LI 3 |
3178 Absolute MH folder paths, like | 3175 Absolute MH folder paths, like |
3179 .Fn +friends/phil . | 3176 .Fn +friends/phil . |
3180 .IP (4) | 3177 .LI 4 |
3181 Relative MH folder paths, like | 3178 Relative MH folder paths, like |
3182 .Fn @subfolder . | 3179 .Fn @subfolder . |
3183 .P | 3180 .LP |
3184 The last type, relative MH folder paths, are hardly documented. | 3181 The last type, relative MH folder paths, are hardly documented. |
3185 Nonetheless, they are useful for large mail storages. | 3182 Nonetheless, they are useful for large mail storages. |
3186 The current mail folder is specified as `\c | 3183 The current mail folder is specified as `\c |
3187 .Fn @ ', | 3184 .Fn @ ', |
3188 just like the current directory is specified as `\c | 3185 just like the current directory is specified as `\c |
3204 char *m_mailpath(char *); | 3201 char *m_mailpath(char *); |
3205 char *m_maildir(char *); | 3202 char *m_maildir(char *); |
3206 VE | 3203 VE |
3207 .P | 3204 .P |
3208 My investigation provides the following description: | 3205 My investigation provides the following description: |
3209 .BU | 3206 .LI 1 |
3210 The second parameter of | 3207 The second parameter of |
3211 .Fu path() | 3208 .Fu path() |
3212 defines the type of path given as first parameter. | 3209 defines the type of path given as first parameter. |
3213 Directory paths are converted to absolute directory paths. | 3210 Directory paths are converted to absolute directory paths. |
3214 Folder paths are converted to absolute folder paths. | 3211 Folder paths are converted to absolute folder paths. |
3215 Folder paths must not include a leading `@' character. | 3212 Folder paths must not include a leading `@' character. |
3216 Leading plus characters are preserved. | 3213 Leading plus characters are preserved. |
3217 The result is a pointer to newly allocated memory. | 3214 The result is a pointer to newly allocated memory. |
3218 .BU | 3215 .LI 2 |
3219 .Fu pluspath() | 3216 .Fu pluspath() |
3220 is a convenience-wrapper to | 3217 is a convenience-wrapper to |
3221 .Fu path() , | 3218 .Fu path() , |
3222 to convert folder paths only. | 3219 to convert folder paths only. |
3223 This function can not be used for directory paths. | 3220 This function can not be used for directory paths. |
3224 An empty string parameter causes a buffer overflow. | 3221 An empty string parameter causes a buffer overflow. |
3225 .BU | 3222 .LI 3 |
3226 .Fu m_mailpath() | 3223 .Fu m_mailpath() |
3227 converts directory paths to absolute directory paths. | 3224 converts directory paths to absolute directory paths. |
3228 The characters `+' or `@' at the beginning of the path name are | 3225 The characters `+' or `@' at the beginning of the path name are |
3229 treated literal, i.e. as the first character of a relative directory path. | 3226 treated literal, i.e. as the first character of a relative directory path. |
3230 Hence, this function can not be used for folder paths. | 3227 Hence, this function can not be used for folder paths. |
3231 In any case, the result is an absolute directory path. | 3228 In any case, the result is an absolute directory path. |
3232 The result is a pointer to newly allocated memory. | 3229 The result is a pointer to newly allocated memory. |
3233 .BU | 3230 .LI 4 |
3234 .Fu m_maildir() | 3231 .Fu m_maildir() |
3235 returns the parameter unchanged if it is an absolute directory path | 3232 returns the parameter unchanged if it is an absolute directory path |
3236 or begins with the entry `.' or `..'. | 3233 or begins with the entry `.' or `..'. |
3237 All other strings are prepended with the current working directory. | 3234 All other strings are prepended with the current working directory. |
3238 Hence, this functions can not be used for folder paths. | 3235 Hence, this functions can not be used for folder paths. |
3267 prefixed with a dot character. | 3264 prefixed with a dot character. |
3268 In consequence, the dot character could no longer be an alias for the | 3265 In consequence, the dot character could no longer be an alias for the |
3269 current message. | 3266 current message. |
3270 .Ci cff0e16925e7edbd25b8b9d6d4fbdf03e0e60c01 | 3267 .Ci cff0e16925e7edbd25b8b9d6d4fbdf03e0e60c01 |
3271 Third, I created three new functions to replace the previous mess: | 3268 Third, I created three new functions to replace the previous mess: |
3272 .BU | 3269 .LI 1 |
3273 .Fu expandfol() | 3270 .Fu expandfol() |
3274 converts folder paths to absolute folder paths, | 3271 converts folder paths to absolute folder paths, |
3275 without the leading plus character. | 3272 without the leading plus character. |
3276 Directory paths are simply passed through. | 3273 Directory paths are simply passed through. |
3277 This function is to be used for folder paths only, thus the name. | 3274 This function is to be used for folder paths only, thus the name. |
3278 The result is a pointer to static memory. | 3275 The result is a pointer to static memory. |
3279 .BU | 3276 .LI 2 |
3280 .Fu expanddir() | 3277 .Fu expanddir() |
3281 converts directory paths to absolute directory paths. | 3278 converts directory paths to absolute directory paths. |
3282 Folder paths are treated as relative directory paths. | 3279 Folder paths are treated as relative directory paths. |
3283 This function is to be used for directory paths only, thus the name. | 3280 This function is to be used for directory paths only, thus the name. |
3284 The result is a pointer to static memory. | 3281 The result is a pointer to static memory. |
3285 .BU | 3282 .LI 3 |
3286 .Fu toabsdir() | 3283 .Fu toabsdir() |
3287 converts any type of path to an absolute directory path. | 3284 converts any type of path to an absolute directory path. |
3288 This is the function of choice for path conversion. | 3285 This is the function of choice for path conversion. |
3289 Absolute directory paths are the most general representation of a | 3286 Absolute directory paths are the most general representation of a |
3290 path name. | 3287 path name. |
3483 when you run mh commands in a script, you want all the defaults to be | 3480 when you run mh commands in a script, you want all the defaults to be |
3484 what the man page says. | 3481 what the man page says. |
3485 when you run a command by hand, then you want your own defaults... | 3482 when you run a command by hand, then you want your own defaults... |
3486 .QE | 3483 .QE |
3487 .LP | 3484 .LP |
3488 Yet, I consider this explanation short-sighted. | 3485 Yet, I consider this explanation shortsighted. |
3489 We should rather regard theses two cases as just two different MH setups, | 3486 We should rather regard theses two cases as just two different MH setups, |
3490 based on two different profiles. | 3487 based on two different profiles. |
3491 Mapping such problems on the concepts of switching between different | 3488 Mapping such problems on the concepts of switching between different |
3492 profiles, solves them once for all. | 3489 profiles, solves them once for all. |
3493 .P | 3490 .P |
3743 as well. | 3740 as well. |
3744 As the mail storage and the configuration were not separated sensibly | 3741 As the mail storage and the configuration were not separated sensibly |
3745 in the first place, I did it now. | 3742 in the first place, I did it now. |
3746 .P | 3743 .P |
3747 Personal mmh data is grouped by type, resulting in two distinct parts: | 3744 Personal mmh data is grouped by type, resulting in two distinct parts: |
3748 The mail storage and the configuration. | 3745 the mail storage and the configuration. |
3749 In mmh, the mail storage directory still contains all the messages, | 3746 In mmh, the mail storage directory still contains all the messages, |
3750 but, in exception of public sequences files, nothing else. | 3747 but, in exception of public sequences files, nothing else. |
3751 In difference to nmh, the auxiliary configuration files are no longer | 3748 In difference to nmh, the auxiliary configuration files are no longer |
3752 located there. | 3749 located there. |
3753 Therefore, the directory is no longer called the user's \fIMH directory\fP | 3750 Therefore, the directory is no longer called the user's \fIMH directory\fP |
3923 This saved the need to execute these programs with | 3920 This saved the need to execute these programs with |
3924 .Fu fork() | 3921 .Fu fork() |
3925 and | 3922 and |
3926 .Fu exec() , | 3923 .Fu exec() , |
3927 two expensive system calls. | 3924 two expensive system calls. |
3928 Whereis this approach improved the time performance, | 3925 Whereas this approach improved the time performance, |
3929 it interweaved the source code. | 3926 it interwove the source code. |
3930 Core functionalities were not encapsulated into programs but into | 3927 Core functionalities were not encapsulated into programs but into |
3931 function, which were then wrapped by programs. | 3928 function, which were then wrapped by programs. |
3932 For example, | 3929 For example, |
3933 .Fn uip/annosbr.c | 3930 .Fn uip/annosbr.c |
3934 included the function | 3931 included the function |
3967 but the code reader needed to read all of the code first to know which | 3964 but the code reader needed to read all of the code first to know which |
3968 parts were used. | 3965 parts were used. |
3969 .P | 3966 .P |
3970 As I have read a lot in the code base during the last two years, | 3967 As I have read a lot in the code base during the last two years, |
3971 I learned about the easy and the difficult parts. | 3968 I learned about the easy and the difficult parts. |
3972 Code is easy to understand if: | 3969 Code is easy to understand if the influenced code area is small |
3973 .BU | 3970 and its boundaries are strictly defined. |
3974 The influenced code area is small. | 3971 Further more, the code needs to solve the problem in a straight-forward way. |
3975 .BU | |
3976 The boundaries are strictly defined. | |
3977 .BU | |
3978 The code is written straight-forward. | |
3979 .P | 3972 .P |
3980 .\" XXX move this paragraph somewhere else? | 3973 .\" XXX move this paragraph somewhere else? |
3981 Reading | 3974 Reading |
3982 .Pn rmm 's | 3975 .Pn rmm 's |
3983 source code in | 3976 source code in |
4107 By changing the command line interfaces of tools, it is | 4100 By changing the command line interfaces of tools, it is |
4108 the developer's job to adjust the invocations of these tools as well. | 4101 the developer's job to adjust the invocations of these tools as well. |
4109 As this is a manual task and regression tests, which could detect such | 4102 As this is a manual task and regression tests, which could detect such |
4110 problems, are not available yet, it is prone to errors. | 4103 problems, are not available yet, it is prone to errors. |
4111 These errors will not be detected at compile time but at run time. | 4104 These errors will not be detected at compile time but at run time. |
4112 Installing regression tests is a task left to do. | 4105 Installing regression tests is a pending task. |
4113 In the best case, a uniform way of invoking tools from other tools | 4106 In the best case, a uniform way of invoking tools from other tools |
4114 can be developed to allow automated testing at compile time. | 4107 can be developed to allow automated testing at compile time. |
4115 | 4108 |
4116 | 4109 |
4117 .ig | 4110 .ig |