Mercurial > docs > unix-phil
annotate unix-phil.ms @ 62:ad7c253bdced default tip
modified macros for better page layout
author | meillo@marmaro.de |
---|---|
date | Sun, 18 Apr 2010 20:44:52 +0200 |
parents | 733f4fb03071 |
children |
rev | line source |
---|---|
49 | 1 .so style |
42 | 2 |
0 | 3 .TL |
42 | 4 .ps +4 |
6 | 5 Why the Unix Philosophy still matters |
0 | 6 .AU |
7 markus schnalke <meillo@marmaro.de> | |
8 .AB | |
1 | 9 .ti \n(.iu |
39 | 10 This paper explains the importance of the Unix Philosophy for software design. |
0 | 11 Today, few software designers are aware of these concepts, |
39 | 12 and thus a lot of modern software is more limited than necessary |
13 and makes less use of software leverage than possible. | |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
14 Knowing and following the guidelines of the Unix Philosophy makes software more valuable. |
0 | 15 .AE |
16 | |
2
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
17 .FS |
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
18 .ps -1 |
39 | 19 This paper was prepared for the ``Software Analysis'' seminar at University Ulm. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
20 Mentor was professor Franz Schweiggert. |
55 | 21 Handed in on 2010-04-16. |
39 | 22 You may retrieve this document from |
23 .CW \s-1http://marmaro.de/docs \ . | |
2
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
24 .FE |
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
25 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
26 .H 1 Introduction |
0 | 27 .LP |
40 | 28 The Unix Philosophy is the essence of how the Unix operating system, |
29 especially its toolchest, was designed. | |
57 | 30 It is not a limited set of fixed rules, |
40 | 31 but a loose set of guidelines which tell how to write software that |
57 | 32 suites Unix well. |
33 Actually, the Unix Philosophy describes what is common in typical Unix software. | |
40 | 34 The Wikipedia has an accurate definition: |
35 .[ | |
44 | 36 wikipedia |
37 unix philosophy | |
40 | 38 .] |
39 .QP | |
40 The \fIUnix philosophy\fP is a set of cultural norms and philosophical | |
41 approaches to developing software based on the experience of leading | |
42 developers of the Unix operating system. | |
3 | 43 .PP |
40 | 44 As there is no single definition of the Unix Philosophy, |
45 several people have stated their view on what it comprises. | |
1 | 46 Best known are: |
47 .IP \(bu | |
48 Doug McIlroy's summary: ``Write programs that do one thing and do it well.'' | |
49 .[ | |
44 | 50 mahoney |
51 oral history | |
1 | 52 .] |
53 .IP \(bu | |
54 Mike Gancarz' book ``The UNIX Philosophy''. | |
55 .[ | |
44 | 56 gancarz |
57 unix philosophy | |
1 | 58 .] |
59 .IP \(bu | |
60 Eric S. Raymond's book ``The Art of UNIX Programming''. | |
61 .[ | |
44 | 62 raymond |
63 art of unix programming | |
1 | 64 .] |
0 | 65 .LP |
1 | 66 These different views on the Unix Philosophy have much in common. |
40 | 67 Especially, the main concepts are similar in all of them. |
68 McIlroy's definition can surely be called the core of the Unix Philosophy, | |
57 | 69 but the fundamental idea behind it all is ``small is beautiful''. |
40 | 70 |
71 .PP | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
72 The Unix Philosophy explains how to design good software for Unix. |
57 | 73 Many concepts described here are based on Unix facilities. |
40 | 74 Other operating systems may not offer such facilities, |
57 | 75 hence it may not be possible to design software for such systems |
76 according to the Unix Philosophy. | |
41 | 77 .PP |
57 | 78 The Unix Philosophy has an idea of what the process of software development |
41 | 79 should look like, but large parts of the philosophy are quite independent |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
80 from a concrete development process. |
41 | 81 However, one will soon recognize that some development processes work well |
82 with the ideas of the Unix Philosophy and support them, while others are | |
83 at cross-purposes. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
84 Kent Beck's books about Extreme Programming are valuable supplemental |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
85 resources on this topic. |
40 | 86 .PP |
57 | 87 The question of how to actually write code and how the code should look |
88 in detail, are beyond the scope of this paper. | |
89 Kernighan and Pike's book ``The Practice of Programming'' | |
41 | 90 .[ |
44 | 91 kernighan pike |
92 practice of programming | |
41 | 93 .] |
57 | 94 covers this topic. |
95 Its point of view corresponds to the one espoused in this paper. | |
0 | 96 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
97 .H 1 "Importance of software design in general |
0 | 98 .LP |
57 | 99 Software design consists of planning how the internal structure |
100 and external interfaces of software should look. | |
39 | 101 It has nothing to do with visual appearance. |
57 | 102 If we were to compare a program to a car, then its color would not matter. |
39 | 103 Its design would be the car's size, its shape, the locations of doors, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
104 the passenger/space ratio, the available controls and instruments, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
105 and so forth. |
39 | 106 .PP |
57 | 107 Why should software be designed at all? |
108 It is accepted as general knowledge, | |
109 that even a bad plan is better than no plan. | |
110 Not designing software means programming without a plan. | |
111 This will surely lead to horrible results, | |
112 being horrible to use and horrible to maintain. | |
39 | 113 These two aspects are the visible ones. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
114 Often invisible though, are the wasted possible gains. |
39 | 115 Good software design can make these gains available. |
6 | 116 .PP |
57 | 117 A software's design deals with qualitative properties. |
39 | 118 Good design leads to good quality, and quality is important. |
57 | 119 Any car may be able to drive from point A to point B, |
120 but it depends on the qualitative decisions made in the design of the vehicle, | |
121 whether it is a good choice for passenger transport or not, | |
122 whether it is a good choice for a rough mountain area, | |
123 and whether the ride will be fun. | |
39 | 124 |
2
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
125 .PP |
57 | 126 Requirements for a piece of software are twofold: |
39 | 127 functional and non-functional. |
128 .IP \(bu | |
57 | 129 Functional requirements directly define the software's functions. |
39 | 130 They are the reason why software gets written. |
131 Someone has a problem and needs a tool to solve it. | |
132 Being able to solve the problem is the main functional goal. | |
57 | 133 This is the driving force behind all programming effort. |
6 | 134 Functional requirements are easier to define and to verify. |
39 | 135 .IP \(bu |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
136 Non-functional requirements are called \fIquality\fP requirements, too. |
57 | 137 The quality of software shows through the properties that are not directly |
138 related to the software's basic functions. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
139 Tools of bad quality often do solve the problems they were written for, |
57 | 140 but introduce problems and difficulties for usage and development later on. |
141 Qualitative aspects are often overlooked at first sight, | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
142 and are often difficult to define clearly and to verify. |
6 | 143 .PP |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
144 Quality is hardly interesting when software gets built initially, |
57 | 145 but it has a high impact on usability and maintenance of the software later. |
146 A short-sighted person might see the process of developing software as | |
147 one mainly concerned with building something up. | |
148 But, experience shows that building software the first time is | |
149 only a small portion of the overall work involved. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
150 Bug fixing, extending, rebuilding of parts \(en maintenance work \(en |
57 | 151 soon take a large part of the time spent on a software project. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
152 And of course, the time spent actually using the software. |
6 | 153 These processes are highly influenced by the software's quality. |
39 | 154 Thus, quality must not be neglected. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
155 However, the problem with quality is that you hardly ``stumble over'' |
39 | 156 bad quality during the first build, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
157 although this is the time when you should care about good quality most. |
6 | 158 .PP |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
159 Software design has little to do with the basic function of software \(en |
39 | 160 this requirement will get satisfied anyway. |
57 | 161 Software design is more about quality aspects. |
39 | 162 Good design leads to good quality, bad design to bad quality. |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
163 The primary functions of software will be affected modestly by bad quality, |
57 | 164 but good quality can provide a lot of additional benefits, |
165 even at places one never expected it. | |
2
fbd7baf6a61f
added content about sw design; some formating
meillo@marmaro.de
parents:
1
diff
changeset
|
166 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
167 The ISO/IEC\|9126-1 standard, part\|1, |
6 | 168 .[ |
44 | 169 iso product quality |
6 | 170 .] |
57 | 171 defines the quality model as consisting of: |
6 | 172 .IP \(bu |
173 .I Functionality | |
174 (suitability, accuracy, inter\%operability, security) | |
175 .IP \(bu | |
176 .I Reliability | |
177 (maturity, fault tolerance, recoverability) | |
178 .IP \(bu | |
179 .I Usability | |
180 (understandability, learnability, operability, attractiveness) | |
181 .IP \(bu | |
182 .I Efficiency | |
9 | 183 (time behavior, resource utilization) |
6 | 184 .IP \(bu |
185 .I Maintainability | |
23 | 186 (analyzability, changeability, stability, testability) |
6 | 187 .IP \(bu |
188 .I Portability | |
189 (adaptability, installability, co-existence, replaceability) | |
190 .LP | |
57 | 191 Good design can improve these properties in software; |
192 poorly designed software likely suffers in these areas. | |
7 | 193 .PP |
194 One further goal of software design is consistency. | |
57 | 195 Consistency eases understanding, using, and working on things. |
196 Consistent internal structure and consistent external interfaces | |
39 | 197 can be provided by good design. |
7 | 198 .PP |
39 | 199 Software should be well designed because good design avoids many |
57 | 200 problems during its lifetime. |
201 Also, because good design can offer much additional gain. | |
202 Indeed, much effort should be spent on good design to make software more valuable. | |
203 The Unix Philosophy provides a way to design software well. | |
7 | 204 It offers guidelines to achieve good quality and high gain for the effort spent. |
0 | 205 |
206 | |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
207 .H 1 "The Unix Philosophy |
4 | 208 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
209 The origins of the Unix Philosophy have already been introduced. |
8 | 210 This chapter explains the philosophy, oriented on Gancarz, |
55 | 211 .[ |
212 gancarz | |
213 unix philosophy | |
214 .] | |
8 | 215 and shows concrete examples of its application. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
216 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
217 .H 2 Pipes |
0 | 218 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
219 The following examples demonstrate how the Unix Philosophy is applied. |
4 | 220 Knowledge of using the Unix shell is assumed. |
221 .PP | |
222 Counting the number of files in the current directory: | |
41 | 223 .DS |
4 | 224 ls | wc -l |
225 .DE | |
226 The | |
227 .CW ls | |
228 command lists all files in the current directory, one per line, | |
229 and | |
230 .CW "wc -l | |
8 | 231 counts the number of lines. |
4 | 232 .PP |
8 | 233 Counting the number of files that do not contain ``foo'' in their name: |
41 | 234 .DS |
4 | 235 ls | grep -v foo | wc -l |
236 .DE | |
237 Here, the list of files is filtered by | |
238 .CW grep | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
239 to remove all lines that contain ``foo''. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
240 The rest equals the previous example. |
4 | 241 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
242 Finding the five largest entries in the current directory: |
41 | 243 .DS |
4 | 244 du -s * | sort -nr | sed 5q |
245 .DE | |
246 .CW "du -s * | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
247 returns the recursively summed sizes of all files in the current directory |
8 | 248 \(en no matter if they are regular files or directories. |
4 | 249 .CW "sort -nr |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
250 sorts the list numerically in reverse order (descending). |
4 | 251 Finally, |
252 .CW "sed 5q | |
253 quits after it has printed the fifth line. | |
254 .PP | |
255 The presented command lines are examples of what Unix people would use | |
256 to get the desired output. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
257 There are other ways to get the same output; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
258 it is the user's decision which way to go. |
14
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
259 .PP |
8 | 260 The examples show that many tasks on a Unix system |
4 | 261 are accomplished by combining several small programs. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
262 The connection between the programs is denoted by the pipe operator `|'. |
4 | 263 .PP |
264 Pipes, and their extensive and easy use, are one of the great | |
265 achievements of the Unix system. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
266 Pipes were possible in earlier operating systems, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
267 but never before have they been such a central part of the concept. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
268 In the early seventies when Doug McIlroy introduced pipes into the |
4 | 269 Unix system, |
270 ``it was this concept and notation for linking several programs together | |
271 that transformed Unix from a basic file-sharing system to an entirely new way of computing.'' | |
272 .[ | |
44 | 273 aughenbaugh |
274 unix oral history | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
275 .] |
4 | 276 .PP |
277 Being able to specify pipelines in an easy way is, | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
278 however, not enough by itself; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
279 it is only one half. |
4 | 280 The other is the design of the programs that are used in the pipeline. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
281 They need interfaces that allow them to be used in this way. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
282 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
283 .H 2 "Interface design |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
284 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
285 Unix is, first of all, simple \(en everything is a file. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
286 Files are sequences of bytes, without any special structure. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
287 Programs should be filters, which read a stream of bytes from standard input (stdin) |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
288 and write a stream of bytes to standard output (stdout). |
8 | 289 If the files \fIare\fP sequences of bytes, |
290 and the programs \fIare\fP filters on byte streams, | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
291 then there is exactly one data interface. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
292 Hence it is possible to combine programs in any desired way. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
293 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
294 Even a handful of small programs yields a large set of combinations, |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
295 and thus a large set of different functions. |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
296 This is leverage! |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
297 If the programs are orthogonal to each other \(en the best case \(en |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
298 then the set of different functions is greatest. |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
299 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
300 Programs can also have a separate control interface |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
301 in addition to their data interface. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
302 The control interface is often called the ``user interface'', |
11 | 303 because it is usually designed to be used by humans. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
304 The Unix Philosophy discourages the assumption that the user will be human. |
11 | 305 Interactive use of software is slow use of software, |
306 because the program waits for user input most of the time. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
307 Interactive software also requires the user to be in front of the computer, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
308 occupying his attention during usage. |
11 | 309 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
310 Now, back to the idea of combining several small programs |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
311 to perform a more specific function: |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
312 If these single tools were all interactive, |
11 | 313 how would the user control them? |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
314 It is not only a problem to control several programs at once |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
315 if they run at the same time; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
316 it is also very inefficient to have to control each program |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
317 when they are intended to act in concert. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
318 Hence, the Unix Philosophy discourages designing programs which demand |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
319 interactive use. |
11 | 320 The behavior of programs should be defined at invocation. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
321 This is done by specifying arguments to the program call |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
322 (command line switches). |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
323 Gancarz discusses this topic as ``avoid[ing] captive user interfaces''. |
46 | 324 .[ [ |
44 | 325 gancarz unix philosophy |
46 | 326 .], page 88 ff.] |
11 | 327 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
328 Non-interactive use is also an advantage for testing during development. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
329 Testing interactive programs is much more complicated |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
330 than testing non-interactive counterparts. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
331 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
332 .H 2 "The toolchest approach |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
333 .LP |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
334 A toolchest is a set of tools. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
335 Instead of one big tool for all tasks, there are many small tools, |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
336 each for one task. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
337 Difficult tasks are solved by combining several small, simple tools. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
338 .PP |
11 | 339 The Unix toolchest \fIis\fP a set of small, (mostly) non-interactive programs |
340 that are filters on byte streams. | |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
341 They are, to a large extent, unrelated in their function. |
11 | 342 Hence, the Unix toolchest provides a large set of functions |
343 that can be accessed by combining the programs in the desired way. | |
344 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
345 The act of software development benefits from small toolchest programs, too. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
346 Writing small programs is generally easier and less error-prone |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
347 than writing large programs. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
348 Hence, writing a large set of small programs is still easier and |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
349 less error-prone than writing one large program with all the |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
350 functionality included. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
351 If the small programs are combinable, then they offer even an even larger set |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
352 of functions than the single monolithic program. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
353 Hence, one gets two advantages out of writing small, combinable programs: |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
354 They are easier to write and they offer a greater set of functions through |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
355 combination. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
356 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
357 There are also two main drawbacks of the toolchest approach. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
358 First, one simple, standardized interface has to be sufficient. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
359 If one feels the need for more ``logic'' than a stream of bytes, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
360 then a different approach might be required. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
361 Also, a design where a stream of bytes is sufficient, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
362 might not be conceivable. |
8 | 363 By becoming more familiar with the ``Unix style of thinking'', |
364 developers will more often and easier find simple designs where | |
365 a stream of bytes is a sufficient interface. | |
366 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
367 The second drawback of the toolchest approach concerns the users. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
368 A toolchest is often more difficult to use because |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
369 it is necessary to become familiar with each tool and |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
370 be able to choose and use the right one in any given situation. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
371 Additionally, one needs to know how to combine the tools in a sensible way. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
372 The issue is similar to having a sharp knife \(en |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
373 it is a powerful tool in the hand of a master, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
374 but of no value in the hand of an unskilled person. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
375 However, learning single, small tools of a toolchest is often easier than |
8 | 376 learning a complex tool. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
377 The user will already have a basic understanding of an as yet unknown tool |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
378 if the tools of a toolchest have a common, consistent style. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
379 He will be able to transfer knowledge of one tool to another. |
8 | 380 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
381 This second drawback can be removed to a large extent |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
382 by adding wrappers around the basic tools. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
383 Novice users do not need to learn several tools if a professional wraps |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
384 complete command lines into a higher-level script. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
385 Note that the wrapper script still calls the small tools; |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
386 it is just like a skin around them. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
387 No complexity is added this way, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
388 but new programs can be created out of existing one with very little effort. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
389 .PP |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
390 A wrapper script for finding the five largest entries in the current directory |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
391 might look like this: |
41 | 392 .DS |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
393 #!/bin/sh |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
394 du -s * | sort -nr | sed 5q |
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
395 .DE |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
396 The script itself is just a text file that calls the commands |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
397 that a professional user would type in directly. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
398 It is probably beneficial to make the program flexible in regard to |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
399 the number of entries it prints: |
41 | 400 .DS |
8 | 401 #!/bin/sh |
402 num=5 | |
403 [ $# -eq 1 ] && num="$1" | |
404 du -sh * | sort -nr | sed "${num}q" | |
405 .DE | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
406 This script acts like the one before when called without an argument, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
407 but the user can also specify a numerical argument to define the number |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
408 of lines to print. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
409 One can surely imagine even more flexible versions; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
410 however, they will still rely on the external programs |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
411 which actually do the work. |
5
48f1f3465550
new content about interfaces and toolchests
meillo@marmaro.de
parents:
4
diff
changeset
|
412 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
413 .H 2 "A powerful shell |
8 | 414 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
415 The Unix shell provides the ability to combine small programs into large ones. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
416 But a powerful shell is a great feature in other ways, too; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
417 for instance, by being scriptable. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
418 Control statements are built into the shell |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
419 and the functions are the normal programs of the system. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
420 As the programs are already known, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
421 learning to program in the shell becomes easy. |
8 | 422 Using normal programs as functions in the shell programming language |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
423 is only possible because they are small and combinable tools in a toolchest style. |
8 | 424 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
425 The Unix shell encourages writing small scripts, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
426 by combining existing programs because it is so easy to do. |
8 | 427 This is a great step towards automation. |
428 It is wonderful if the effort to automate a task equals the effort | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
429 to do the task a second time by hand. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
430 If this holds, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
431 then the user will be happy to automate everything he does more than once. |
8 | 432 .PP |
433 Small programs that do one job well, standardized interfaces between them, | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
434 a mechanism to combine parts to larger parts, and an easy way to automate tasks |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
435 will inevitably produce software leverage, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
436 achieving multiple times the benefit of the initial investment. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
437 .PP |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
438 The shell also encourages rapid prototyping. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
439 Many well known programs started as quickly hacked shell scripts, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
440 and turned into ``real'' programs later written in C. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
441 Building a prototype first is a way to avoid the biggest problems |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
442 in application development. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
443 Fred Brooks explains in ``No Silver Bullet'': |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
444 .[ |
44 | 445 brooks |
446 no silver bullet | |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
447 .] |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
448 .QP |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
449 The hardest single part of building a software system is deciding precisely what to build. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
450 No other part of the conceptual work is so difficult as establishing the detailed |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
451 technical requirements, [...]. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
452 No other part of the work so cripples the resulting system if done wrong. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
453 No other part is more difficult to rectify later. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
454 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
455 Writing a prototype is a great method for becoming familiar with the requirements |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
456 and to run into real problems early. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
457 .[ [ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
458 gancarz |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
459 unix philosophy |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
460 .], page 28 f.] |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
461 .PP |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
462 Prototyping is often seen as a first step in building software. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
463 This is, of course, good. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
464 However, the Unix Philosophy has an \fIadditional\fP perspective on prototyping: |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
465 After having built the prototype, one might notice that the prototype is already |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
466 \fIgood enough\fP. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
467 Hence, no reimplementation in a more sophisticated programming language |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
468 might be of need, at least for the moment. |
23 | 469 Maybe later, it might be necessary to rewrite the software, but not now. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
470 By delaying further work, one keeps the flexibility to react on |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
471 changing requirements. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
472 Software parts that are not written will not miss the requirements. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
473 Well known is Gordon Bell's classic saying: |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
474 ``The cheapest, fastest, and most reliable components are those |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
475 that aren't there.'' |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
476 .\" FIXME: ref? |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
477 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
478 .H 2 "Worse is better |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
479 .LP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
480 The Unix Philosophy aims for the 90% solution; |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
481 others call it the ``Worse is better'' approach. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
482 Experience from real life projects shows: |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
483 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
484 (1) It is almost impossible to define the |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
485 requirements completely and correctly the first time. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
486 Hence one should not try to; one will fail anyway. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
487 .PP |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
488 (2) Requirements change during time. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
489 Hence it is best to delay requirement-based design decisions as long as possible. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
490 Software should be small and flexible as long as possible in order |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
491 to react to changing requirements. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
492 Shell scripts, for example, are more easily adjusted than C programs. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
493 .PP |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
494 (3) Maintenance work is hard work. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
495 Hence, one should keep the amount of code as small as possible; |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
496 it should only fulfill the \fIcurrent\fP requirements. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
497 Software parts that will be written in the future |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
498 do not need maintenance until that time. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
499 .PP |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
500 See Brooks' ``The Mythical Man-Month'' for reference. |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
501 .[ [ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
502 brooks |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
503 mythical man-month |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
504 .], page 115 ff.] |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
505 .PP |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
506 Starting with a prototype in a scripting language has several advantages: |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
507 .IP \(bu |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
508 As the initial effort is low, one will likely start right away. |
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
509 .IP \(bu |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
510 Real requirements can be identified quickly since working parts are |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
511 available sooner. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
512 .IP \(bu |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
513 When software is usable and valuable, it gets used, and thus tested. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
514 This ensures that problems will be found in the early stages of development. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
515 .IP \(bu |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
516 The prototype might be enough for the moment; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
517 thus, further work can be delayed until a time |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
518 when one knows about the requirements and problems more thoroughly. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
519 .IP \(bu |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
520 Implementing only the parts that are actually needed at the moment |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
521 introduces less programming and maintenance work. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
522 .IP \(bu |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
523 If the situation changes such that the software is not needed anymore, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
524 then less effort was spent on the project than it would have been |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
525 if a different approach had been taken. |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
526 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
527 .H 2 "Upgrowth and survival of software |
11 | 528 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
529 So far, \fIwriting\fP or \fIbuilding\fP software has been discussed. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
530 Although ``writing'' and ``building'' are just verbs, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
531 they do imply a specific view on the work process they describe. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
532 A better verb would be to \fI``grow''\fP. |
12 | 533 Creating software in the sense of the Unix Philosophy is an incremental process. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
534 It starts with an initial prototype, which evolves as requirements change. |
12 | 535 A quickly hacked shell script might become a large, sophisticated, |
13 | 536 compiled program this way. |
537 Its lifetime begins with the initial prototype and ends when the software is not used anymore. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
538 While alive, it will be extended, rearranged, rebuilt. |
12 | 539 Growing software matches the view that ``software is never finished. It is only released.'' |
46 | 540 .[ [ |
44 | 541 gancarz |
542 unix philosophy | |
46 | 543 .], page 26] |
12 | 544 .PP |
13 | 545 Software can be seen as being controlled by evolutionary processes. |
546 Successful software is software that is used by many for a long time. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
547 This implies that the software is necessary, useful, and better than the alternatives. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
548 Darwin describes ``the survival of the fittest.'' |
12 | 549 .[ |
44 | 550 darwin |
551 origin of species | |
12 | 552 .] |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
553 In relation to software, the most successful software is the fittest; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
554 the one that survives. |
13 | 555 (This may be at the level of one creature, or at the level of one species.) |
556 The fitness of software is affected mainly by four properties: | |
15 | 557 portability of code, portability of data, range of usability, and reusability of parts. |
13 | 558 .PP |
15 | 559 (1) |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
560 .I "``Portability of code'' |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
561 means using high-level programming languages, |
13 | 562 sticking to the standard, |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
563 .[ [ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
564 kernighan pike |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
565 practice of programming |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
566 .], chapter\|8] |
13 | 567 and avoiding optimizations that introduce dependencies on specific hardware. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
568 Hardware has a much shorter lifespan than software. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
569 By chaining software to specific hardware, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
570 its lifetime is limited to that of this hardware. |
13 | 571 In contrast, software should be easy to port \(en |
23 | 572 adaptation is the key to success. |
13 | 573 .PP |
15 | 574 (2) |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
575 .I "``Portability of data'' |
15 | 576 is best achieved by avoiding binary representations |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
577 to store data, since binary representations differ from machine to machine. |
23 | 578 Textual representation is favored. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
579 Historically, \s-1ASCII\s0 was the character set of choice; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
580 for the future, \s-1UTF\s0-8 might be the better way forward. |
13 | 581 Important is that it is a plain text representation in a |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
582 very common character set encoding. |
13 | 583 Apart from being able to transfer data between machines, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
584 readable data has the great advantage that humans are able to directly |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
585 read and edit it with text editors and other tools from the Unix toolchest. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
586 .[ [ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
587 gancarz |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
588 unix philosophy |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
589 .], page 56 ff.] |
12 | 590 .PP |
15 | 591 (3) |
592 A large | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
593 .I "``range of usability'' |
23 | 594 ensures good adaptation, and thus good survival. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
595 It is a special distinction when software becomes used in fields of endeavor, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
596 the original authors never imagined. |
13 | 597 Software that solves problems in a general way will likely be used |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
598 for many kinds of similar problems. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
599 Being too specific limits the range of usability. |
13 | 600 Requirements change through time, thus use cases change or even vanish. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
601 As a good example of this point, |
13 | 602 Allman identifies flexibility to be one major reason for sendmail's success: |
603 .[ | |
44 | 604 allman |
605 sendmail | |
13 | 606 .] |
607 .QP | |
608 Second, I limited myself to the routing function [...]. | |
609 This was a departure from the dominant thought of the time, [...]. | |
610 .QP | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
611 Third, the sendmail configuration file was flexible enough to adapt |
13 | 612 to a rapidly changing world [...]. |
613 .LP | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
614 Successful software adapts itself to the changing world. |
12 | 615 .PP |
15 | 616 (4) |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
617 .I "``Reusability of parts'' |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
618 goes one step further. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
619 Software may become obsolete and completely lose its field of action, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
620 but the constituent parts of the software may be general and independent enough |
13 | 621 to survive this death. |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
622 If software is built by combining small independent programs, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
623 then these parts are readily available for reuse. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
624 Who cares that the large program is a failure, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
625 if parts of it become successful instead? |
10
355ed69a34a8
more about the shell and worse is better (ch03)
meillo@marmaro.de
parents:
9
diff
changeset
|
626 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
627 .H 2 "Summary |
0 | 628 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
629 This chapter explained ideas central to the Unix Philosophy. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
630 For each of the ideas, the advantages they introduce were explained. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
631 The Unix Philosophy is a set of guidelines that help in the design of |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
632 more valuable software. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
633 From the viewpoint of a software developer or software designer, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
634 the Unix Philosophy provides answers to many software design problems. |
14
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
635 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
636 The various ideas comprising the Unix Philosophy are very interweaved |
14
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
637 and can hardly be applied independently. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
638 The most important messages are: |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
639 .I "``Keep it simple!''" , |
14
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
640 .I "``Do one thing well!''" , |
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
641 and |
59305c854751
rearrangements of headlines; summary (ch03)
meillo@marmaro.de
parents:
13
diff
changeset
|
642 .I "``Use software leverage!'' |
0 | 643 |
8 | 644 |
645 | |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
646 .H 1 "Case study: \s-1MH\s0 |
18 | 647 .LP |
30 | 648 The previous chapter introduced and explained the Unix Philosophy |
18 | 649 from a general point of view. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
650 The driving force was that of the guidelines; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
651 references to existing software were given only sparsely. |
18 | 652 In this and the next chapter, concrete software will be |
653 the driving force in the discussion. | |
654 .PP | |
23 | 655 This first case study is about the mail user agents (\s-1MUA\s0) |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
656 \s-1MH\s0 (``mail handler'') and its descendant \fInmh\fP |
23 | 657 (``new mail handler''). |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
658 .[ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
659 nmh website |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
660 .] |
23 | 661 \s-1MUA\s0s provide functions to read, compose, and organize mail, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
662 but (ideally) not to transfer it. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
663 In this document, the name \s-1MH\s0 will be used to include nmh. |
19 | 664 A distinction will only be made if differences between |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
665 \s-1MH\s0 and nmh are described. |
18 | 666 |
0 | 667 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
668 .H 2 "Historical background |
0 | 669 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
670 Electronic mail was available in Unix from a very early stage. |
30 | 671 The first \s-1MUA\s0 on Unix was \f(CWmail\fP, |
672 which was already present in the First Edition. | |
46 | 673 .[ [ |
44 | 674 salus |
675 quarter century of unix | |
46 | 676 .], page 41 f.] |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
677 It was a small program that either printed the user's mailbox file |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
678 or appended text to someone else's mailbox file, |
19 | 679 depending on the command line arguments. |
680 .[ | |
44 | 681 manual mail(1) |
19 | 682 .] |
683 It was a program that did one job well. | |
23 | 684 This job was emailing, which was very simple then. |
19 | 685 .PP |
23 | 686 Later, emailing became more powerful, and thus more complex. |
19 | 687 The simple \f(CWmail\fP, which knew nothing of subjects, |
688 independent handling of single messages, | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
689 and long-term email storage, was not powerful enough anymore. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
690 In 1978 at Berkeley, Kurt Shoens wrote \fIMail\fP (with a capital `M') |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
691 to provide additional functions for emailing. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
692 Mail was still one program, but was large and did several jobs. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
693 Its user interface was modeled after \fIed\fP. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
694 Ed is designed for humans, but is still scriptable. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
695 \fImailx\fP is the adaptation of Berkeley Mail for System V. |
19 | 696 .[ |
44 | 697 ritter |
698 mailx history | |
19 | 699 .] |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
700 Elm, pine, mutt, and a slew of graphical \s-1MUA\s0s |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
701 followed Mail's direction: |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
702 large, monolithic programs which included all emailing functions. |
19 | 703 .PP |
23 | 704 A different way was taken by the people of \s-1RAND\s0 Corporation. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
705 Initially, they also had used a monolithic mail system |
30 | 706 called \s-1MS\s0 (for ``mail system''). |
19 | 707 But in 1977, Stockton Gaines and Norman Shapiro |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
708 came up with a proposal for a new email system concept \(en |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
709 one that honored the Unix Philosophy. |
19 | 710 The concept was implemented by Bruce Borden in 1978 and 1979. |
711 This was the birth of \s-1MH\s0 \(en the ``mail handler''. | |
18 | 712 .PP |
713 Since then, \s-1RAND\s0, the University of California at Irvine and | |
19 | 714 at Berkeley, and several others have contributed to the software. |
18 | 715 However, it's core concepts remained the same. |
23 | 716 In the late 90s, when development of \s-1MH\s0 slowed down, |
19 | 717 Richard Coleman started with \fInmh\fP, the new mail handler. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
718 His goal was to improve \s-1MH\s0 especially in regard to |
23 | 719 the requirements of modern emailing. |
19 | 720 Today, nmh is developed by various people on the Internet. |
18 | 721 .[ |
44 | 722 ware |
723 rand history | |
18 | 724 .] |
725 .[ | |
44 | 726 peek |
727 mh | |
18 | 728 .] |
0 | 729 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
730 .H 2 "Contrasts to monolithic mail systems |
0 | 731 .LP |
19 | 732 All \s-1MUA\s0s are monolithic, except \s-1MH\s0. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
733 Although some very little known toolchest \s-1MUA\s0s might also exist, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
734 this statement reflects the situation pretty well. |
19 | 735 .PP |
30 | 736 Monolithic \s-1MUA\s0s gather all their functions in one program. |
737 In contrast, \s-1MH\s0 is a toolchest of many small tools \(en one for each job. | |
23 | 738 Following is a list of important programs of \s-1MH\s0's toolchest |
30 | 739 and their function. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
740 It gives an indication of what the toolchest looks like. |
19 | 741 .IP \(bu |
742 .CW inc : | |
30 | 743 incorporate new mail (this is how mail enters the system) |
19 | 744 .IP \(bu |
745 .CW scan : | |
746 list messages in folder | |
747 .IP \(bu | |
748 .CW show : | |
749 show message | |
750 .IP \(bu | |
751 .CW next\fR/\fPprev : | |
752 show next/previous message | |
753 .IP \(bu | |
754 .CW folder : | |
755 change current folder | |
756 .IP \(bu | |
757 .CW refile : | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
758 refile message into different folder |
19 | 759 .IP \(bu |
760 .CW rmm : | |
761 remove message | |
762 .IP \(bu | |
763 .CW comp : | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
764 compose new message |
19 | 765 .IP \(bu |
766 .CW repl : | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
767 reply to message |
19 | 768 .IP \(bu |
769 .CW forw : | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
770 forward message |
19 | 771 .IP \(bu |
772 .CW send : | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
773 send prepared message (this is how mail leaves the system) |
0 | 774 .LP |
19 | 775 \s-1MH\s0 has no special user interface like monolithic \s-1MUA\s0s have. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
776 The user does not leave the shell to run \s-1MH\s0; |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
777 instead he uses the various \s-1MH\s0 programs within the shell. |
23 | 778 Using a monolithic program with a captive user interface |
779 means ``entering'' the program, using it, and ``exiting'' the program. | |
780 Using toolchests like \s-1MH\s0 means running programs, | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
781 alone or in combination with others, also from other toolchests, |
23 | 782 without leaving the shell. |
30 | 783 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
784 .H 2 "Data storage |
30 | 785 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
786 \s-1MH\s0's mail storage consists of a hierarchy under the user's |
34 | 787 \s-1MH\s0 directory (usually \f(CW$HOME/Mail\fP), |
788 where mail folders are directories and mail messages are text files | |
789 within them. | |
790 Each mail folder contains a file \f(CW.mh_sequences\fP which lists | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
791 the public message sequences of that folder, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
792 for instance, the \fIunseen\fP sequence for new messages. |
34 | 793 Mail messages are text files located in a mail folder. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
794 The files contain the messages as they were received, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
795 and they are named by ascending numbers in each folder. |
19 | 796 .PP |
30 | 797 This mailbox format is called ``\s-1MH\s0'' after the \s-1MUA\s0. |
798 Alternatives are \fImbox\fP and \fImaildir\fP. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
799 In the mbox format, all messages are stored within one file. |
30 | 800 This was a good solution in the early days, when messages |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
801 were only a few lines of text deleted within a short period of time. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
802 Today, with single messages often including several megabytes |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
803 of attachments, this is a bad solution. |
30 | 804 Another disadvantage of the mbox format is that it is |
805 more difficult to write tools that work on mail messages, | |
806 because it is always necessary to first find and extract | |
807 the relevant message in the mbox file. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
808 With the \s-1MH\s0 mailbox format, each message is a separate file. |
30 | 809 Also, the problem of concurrent access to one mailbox is |
810 reduced to the problem of concurrent access to one message. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
811 The maildir format is generally similar to the \s-1MH\s0 format, |
30 | 812 but modified towards guaranteed reliability. |
813 This involves some complexity, unfortunately. | |
34 | 814 .PP |
815 Working with \s-1MH\s0's toolchest on mailboxes is much like | |
816 working with Unix' toolchest on directory trees: | |
817 \f(CWscan\fP is like \f(CWls\fP, | |
818 \f(CWshow\fP is like \f(CWcat\fP, | |
819 \f(CWfolder\fP is like \f(CWcd\fP and \f(CWpwd\fP, | |
820 \f(CWrefile\fP is like \f(CWmv\fP, | |
821 and \f(CWrmm\fP is like \f(CWrm\fP. | |
822 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
823 \s-1MH\s0 extends the context of processes in Unix by two more items |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
824 for its tools: |
34 | 825 .IP \(bu |
826 The current mail folder, which is similar to the current working directory. | |
827 For mail folders, \f(CWfolder\fP provides the corresponding functionality | |
828 of \f(CWcd\fP and \f(CWpwd\fP for directories. | |
829 .IP \(bu | |
830 Sequences, which are named sets of messages in a mail folder. | |
831 The current message, relative to a mail folder, is a special sequence. | |
832 It enables commands like \f(CWnext\fP and \f(CWprev\fP. | |
833 .LP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
834 In contrast to the general process context in Unix, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
835 which is maintained by the kernel, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
836 \s-1MH\s0's context must be maintained by the tools themselves. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
837 Usually there is one context per user, which resides in his |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
838 \f(CWcontext\fP file in the \s-1MH\s0 directory, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
839 but a user can have several contexts, too. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
840 Public sequences are an exception, as they belong to a mail folder, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
841 and reside in the \f(CW.mh_sequences\fP file there. |
34 | 842 .[ |
44 | 843 man page mh-profile mh-sequence |
34 | 844 .] |
20 | 845 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
846 .H 2 "Discussion of the design |
20 | 847 .LP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
848 This section discusses \s-1MH\s0 in regard to the tenets |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
849 of the Unix Philosophy that Gancarz identified. |
20 | 850 |
851 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
852 .B "Small is beautiful |
20 | 853 and |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
854 .B "do one thing well |
20 | 855 are two design goals that are directly visible in \s-1MH\s0. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
856 Gancarz actually uses \s-1MH\s0 in his book as example under the |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
857 headline ``Making \s-1UNIX\s0 Do One Thing Well'': |
46 | 858 .[ [ |
44 | 859 gancarz |
860 unix philosophy | |
46 | 861 .], page 125 ff.] |
20 | 862 .QP |
863 [\s-1MH\s0] consists of a series of programs which | |
864 when combined give the user an enormous ability | |
865 to manipulate electronic mail messages. | |
866 A complex application, it shows that not only is it | |
867 possible to build large applications from smaller | |
868 components, but also that such designs are actually preferable. | |
0 | 869 .LP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
870 The various programs of \s-1MH\s0 were relatively easy to write, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
871 because each one was small, limited to one function, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
872 and had clear boundaries. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
873 For the same reasons, they are also easy to maintain. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
874 Further more, the system can easily get extended: |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
875 One only needs to place a new program into the toolchest. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
876 This was done when \s-1MIME\s0 support was added |
20 | 877 (e.g. \f(CWmhbuild\fP). |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
878 Also, different programs can exist to do basically the same job |
20 | 879 in different ways (e.g. in nmh: \f(CWshow\fP and \f(CWmhshow\fP). |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
880 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
881 If someone needs a mail system with some additional |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
882 functionality that is not available anywhere yet, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
883 it is beneficial to expand a toolchest system like \s-1MH\s0. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
884 There he can add new functionality by simply adding additional |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
885 programs to the toolchest; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
886 he does not risk to break existing functionality by doing so. |
20 | 887 |
888 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
889 .B "Store data in flat text files" ; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
890 this principle was followed by \s-1MH\s0. |
34 | 891 This is not surprising, because email messages are already plain text. |
892 \s-1MH\s0 stores the messages as it receives them, | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
893 thus any other tool that works on \s-1RFC\s0\|2822 compliant mail |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
894 messages can operate |
34 | 895 on the messages in an \s-1MH\s0 mailbox. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
896 All other files \s-1MH\s0 uses are plain text as well. |
34 | 897 It is therefore possible and encouraged to use the text processing |
898 tools of Unix' toolchest to extend \s-1MH\s0's toolchest. | |
20 | 899 |
900 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
901 .B "Avoid captive user interfaces" . |
19 | 902 \s-1MH\s0 is perfectly suited for non-interactive use. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
903 It offers all functions directly, without captive user interfaces. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
904 If users want a graphical user interface, |
53
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
905 they can have it with \fIxmh\fP, \fIexmh\fP, |
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
906 or with the Emacs interface \fImh-e\fP. |
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
907 These are frontends for the \s-1MH\s0 toolchest. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
908 This means all email-related work is still done by \s-1MH\s0 tools, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
909 but the frontend calls the appropriate commands when the user |
53
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
910 clicks on buttons or pushes a key. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
911 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
912 Providing additional user interfaces in form of frontends is a good |
19 | 913 approach, because it does not limit the power of the backend itself. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
914 The frontend will only be able to make a subset of the |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
915 backend's power and flexibility available to the user, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
916 but if it is a separate program, |
20 | 917 then the missing parts can still be accessed at the backend directly. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
918 If it is integrated, then this will be much more difficult. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
919 An additional advantage is the ability to have different frontends |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
920 to the same backend. |
19 | 921 |
922 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
923 .B "Choose portability over efficiency |
20 | 924 and |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
925 .B "use shell scripts to increase leverage and portability" . |
20 | 926 These two tenets are indirectly, but nicely, demonstrated by |
30 | 927 Bolsky and Korn in their book about the Korn Shell. |
20 | 928 .[ |
44 | 929 bolsky korn |
930 korn shell | |
20 | 931 .] |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
932 Chapter\|18 of the book shows a basic implementation |
20 | 933 of a subset of \s-1MH\s0 in ksh scripts. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
934 This is just a demonstration, but a brilliant one. |
20 | 935 It shows how quickly one can implement such a prototype with shell scripts, |
936 and how readable they are. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
937 The implementation in scripting language may not be very fast, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
938 but it can be fast enough, and this is all that matters. |
20 | 939 By having the code in an interpreted language, like the shell, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
940 portability becomes a minor issue if we assume the interpreter |
20 | 941 to be widespread. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
942 .PP |
20 | 943 This demonstration also shows how easy it is to create single programs |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
944 of toolchest software. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
945 Eight tools (two of them having multiple names) and 16 functions |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
946 with supporting code are presented to the reader. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
947 The tools comprise less than 40 lines of ksh each, |
30 | 948 in total about 200 lines. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
949 The functions comprise less than 80 lines of ksh each, |
30 | 950 in total about 450 lines. |
20 | 951 Such small software is easy to write, easy to understand, |
952 and thus easy to maintain. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
953 A toolchest improves one's ability to only write some parts of a |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
954 program while still creating a working result. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
955 Expanding the toolchest, even without global changes, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
956 will likely be possible. |
20 | 957 |
958 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
959 .B "Use software leverage to your advantage |
20 | 960 and the lesser tenet |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
961 .B "allow the user to tailor the environment |
20 | 962 are ideally followed in the design of \s-1MH\s0. |
21 | 963 Tailoring the environment is heavily encouraged by the ability to |
30 | 964 directly define default options to programs. |
965 It is even possible to define different default options | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
966 depending on the name under which a program is called. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
967 Software leverage is heavily encouraged by the ease of |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
968 creating shell scripts that run a specific command line, |
30 | 969 built of several \s-1MH\s0 programs. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
970 There are few pieces of software that encourages users to tailor their |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
971 environment and to leverage the use of the software like \s-1MH\s0. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
972 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
973 Just to cite one example: |
23 | 974 One might prefer a different listing format for the \f(CWscan\fP |
21 | 975 program. |
30 | 976 It is possible to take one of the distributed format files |
21 | 977 or to write one yourself. |
978 To use the format as default for \f(CWscan\fP, a single line, | |
979 reading | |
980 .DS | |
981 scan: -form FORMATFILE | |
982 .DE | |
983 must be added to \f(CW.mh_profile\fP. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
984 If one wants this alternative format available as an additional command, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
985 instead of changing the default, he just needs to create a link to |
23 | 986 \f(CWscan\fP, for instance titled \f(CWscan2\fP. |
21 | 987 The line in \f(CW.mh_profile\fP would then start with \f(CWscan2\fP, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
988 as the option should only be in effect for a program that is invoked as |
21 | 989 \f(CWscan2\fP. |
20 | 990 |
991 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
992 .B "Make every program a filter |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
993 is hard to find implemented in \s-1MH\s0. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
994 The reason is that most of \s-1MH\s0's tools provide |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
995 basic file system operations for mailboxes. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
996 It is for the same reason because that \f(CWls\fP, \f(CWcp\fP, \f(CWmv\fP, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
997 and \f(CWrm\fP aren't filters neither. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
998 \s-1MH\s0 does not provide many filters itself, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
999 but it provides a basis upon which to write filters. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1000 An example would be a mail text highlighter, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1001 a program that makes use of a color terminal to display header lines, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1002 quotations, and signatures in distinct colors. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1003 The author's version of such a program is an awk script with 25 lines. |
21 | 1004 |
1005 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
1006 .B "Build a prototype as soon as possible |
21 | 1007 was again well followed by \s-1MH\s0. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1008 This tenet, of course, focuses on early development, which is a |
21 | 1009 long time ago for \s-1MH\s0. |
1010 But without following this guideline at the very beginning, | |
23 | 1011 Bruce Borden may have not convinced the management of \s-1RAND\s0 |
1012 to ever create \s-1MH\s0. | |
1013 In Bruce' own words: | |
46 | 1014 .[ [ |
44 | 1015 ware rand history |
46 | 1016 .], page 132] |
21 | 1017 .QP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1018 [...] but [Stockton Gaines and Norm Shapiro] were not able |
23 | 1019 to convince anyone that such a system would be fast enough to be usable. |
21 | 1020 I proposed a very short project to prove the basic concepts, |
1021 and my management agreed. | |
1022 Looking back, I realize that I had been very lucky with my first design. | |
1023 Without nearly enough design work, | |
1024 I built a working environment and some header files | |
1025 with key structures and wrote the first few \s-1MH\s0 commands: | |
1026 inc, show/next/prev, and comp. | |
1027 [...] | |
1028 With these three, I was able to convince people that the structure was viable. | |
1029 This took about three weeks. | |
0 | 1030 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1031 .H 2 "Problems |
0 | 1032 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1033 \s-1MH\s0 is not without its problems. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1034 There are two main problems: one is technical, the other pertains to human behavior. |
22 | 1035 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1036 \s-1MH\s0 is old and email today is quite different than it was in the time |
22 | 1037 when \s-1MH\s0 was designed. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1038 \s-1MH\s0 adapted to the changes fairly well, but it has its limitations. |
22 | 1039 \s-1MIME\s0 support and support for different character encodings |
1040 is available, but only on a moderate level. | |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1041 This comes from limited development resources. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1042 A larger and more active developer base could quickly remedy this. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1043 But \s-1MH\s0 is also limited by design, which is the larger problem. |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
1044 \s-1IMAP\s0, for example, conflicts with \s-1MH\s0's design to a large extent. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1045 These design conflicts are not easily solvable |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1046 and may require a redesign. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1047 \s-1IMAP\s0 may be too incompatible with the classic mail model, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1048 which \s-1MH\s0 covers, so \s-1MH\s0 may never support it well. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1049 (Using \s-1IMAP\s0 and a filesystem abstraction layer to only map |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1050 a remote directory into the local filesystem, is a different topic. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1051 \s-1IMAP\s0 support is seen as being able to access the special |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1052 mail features of the protocol.) |
22 | 1053 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1054 The other kind of problem relates to human habits. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1055 In this world, where almost all \s-1MUA\s0s are monolithic, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1056 it is very difficult to convince people to use a toolchest-style \s-1MUA\s0 |
22 | 1057 like \s-1MH\s0. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1058 These habits are so strong, that even people who understand the concept |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1059 and advantages of \s-1MH\s0 are reluctant to switch, |
30 | 1060 simply because \s-1MH\s0 is different. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1061 Unfortunately, the frontends to \s-1MH\s0, which could provide familiar |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1062 look and feel, are quite outdated and thus not very appealing in comparison |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1063 to the modern interfaces of many monolithic \s-1MUA\s0s. |
53
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
1064 One notable exception is \fImh-e\fP which provides an Emacs interface |
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
1065 to \s-1MH\s0. |
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
1066 \fIMh-e\fP looks much like \fImutt\fP or \fIpine\fP, |
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
1067 but it has buttons, menus, and graphical display capabilities. |
20 | 1068 |
53
14f5ff66ad8a
added notes about mh-e; fixed missing heading
meillo@marmaro.de
parents:
51
diff
changeset
|
1069 .H 2 "Summary |
20 | 1070 .LP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1071 \s-1MH\s0 is an \s-1MUA\s0 that follows the Unix Philosophy in its design. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1072 It consists of a toolchest of small tools, each of which does one job well. |
31 | 1073 The toolchest approach offers great flexibility to the user. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1074 It is possible to utilize the complete power of the Unix shell with \s-1MH\s0. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1075 This makes \s-1MH\s0 a very powerful mail system, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1076 and extending and customizing \s-1MH\s0 is easy and encouraged. |
31 | 1077 .PP |
1078 Apart from the user's perspective, \s-1MH\s0 is development-friendly. | |
1079 Its overall design follows clear rules. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1080 The single tools do only one job; thus they are easy to understand, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1081 write, and maintain. |
31 | 1082 They are all independent and do not interfere with the others. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1083 Automated testing of their function is a straightforward task. |
31 | 1084 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1085 It is sad, that \s-1MH\s0's dissimilarity to other \s-1MUA\s0s is its |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1086 largest problem, as this dissimilarity is also its largest advantage. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1087 Unfortunately, most people's habits are stronger |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1088 than the attraction of the clear design and the power \s-1MH\s0 offers. |
0 | 1089 |
8 | 1090 |
1091 | |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1092 .H 1 "Case study: uzbl |
32 | 1093 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1094 The last chapter focused on the \s-1MUA\s0 \s-1MH\s0, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1095 which is an old and established piece of software. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1096 This chapter covers uzbl, a fresh new project. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1097 Uzbl is a web browser that adheres to the Unix Philosophy. |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1098 Its name comes from the \fILolspeak\fP word for ``usable''; |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1099 both are pronounced in the same way. |
0 | 1100 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1101 .H 2 "Historical background |
0 | 1102 .LP |
32 | 1103 Uzbl was started by Dieter Plaetinck in April 2009. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1104 The idea was born in a thread on the Arch Linux forums. |
32 | 1105 .[ |
44 | 1106 arch linux forums |
1107 browser | |
32 | 1108 .] |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1109 After some discussion about the failures of well-known web browsers, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1110 Plaetinck (alias Dieter@be) came up with a rough proposal |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1111 of how a better web browser could look. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1112 In response to another member who asked if Plaetinck would write this |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1113 program because it sounded fantastic, Plaetinck replied: |
32 | 1114 ``Maybe, if I find the time ;-)''. |
1115 .PP | |
1116 Fortunately, he found the time. | |
1117 One day later, the first prototype was out. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1118 One week later, uzbl had its own website. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1119 .[ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1120 uzbl website |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1121 .] |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1122 One month after the initial code was presented, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1123 a mailing list was set up to coordinate and discuss further development, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1124 and a wiki was added to store documentation and scripts that cropped up |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1125 on the mailing list and elsewhere. |
32 | 1126 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1127 In the first year of uzbl's existence, it was heavily developed on various branches. |
32 | 1128 Plaetinck's task became more and more to only merge the best code from the |
1129 different branches into his main branch, and to apply patches. | |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1130 .[ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1131 lwn uzbl |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1132 .] |
32 | 1133 About once a month, Plaetinck released a new version. |
1134 In September 2009, he presented several forks of uzbl. | |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1135 .[ [ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1136 uzbl website |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1137 .], news archive] |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1138 Uzbl actually opened the field for a whole family of web browsers with |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1139 a similar design. |
32 | 1140 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1141 In July 2009, \fILinux Weekly News\fP published an interview with |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1142 Plaetinck about uzbl. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1143 .[ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1144 lwn uzbl |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1145 .] |
32 | 1146 In September 2009, the uzbl web browser was on \fISlashdot\fP. |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1147 .[ |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1148 slashdot uzbl |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1149 .] |
0 | 1150 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1151 .H 2 "Contrasts to other web browsers |
0 | 1152 .LP |
32 | 1153 Like most \s-1MUA\s0s are monolithic, but \s-1MH\s0 is a toolchest, |
1154 most web browsers are monolithic, but uzbl is a frontend to a toolchest. | |
1155 .PP | |
1156 Today, uzbl is divided into uzbl-core and uzbl-browser. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1157 Uzbl-core is, as its name indicates, the core of uzbl. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1158 It handles commands and events to interface with other programs, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1159 and displays webpages by using \fIwebkit\fP as its rendering engine. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1160 Uzbl-browser combines uzbl-core with a selection of handler scripts, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1161 a status bar, an event manager, yanking, pasting, page searching, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1162 zooming, and much more functionality, to form a ``complete'' web browser. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1163 In the following text, the term ``uzbl'' usually refers to uzbl-browser, |
32 | 1164 so uzbl-core is included. |
1165 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1166 Unlike most other web browsers, uzbl is mainly the mediator between |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1167 various tools that cover single jobs. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1168 Uzbl listens for commands on a named pipe (fifo), a Unix socket, |
35 | 1169 and on stdin, and it writes events to a Unix socket and to stdout. |
1170 Loading a webpage in a running uzbl instance requires only: | |
32 | 1171 .DS |
1172 echo 'uri http://example.org' >/path/to/uzbl-fifo | |
1173 .DE | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1174 The rendering of the webpage is done by libwebkit, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1175 around which uzbl-core is built. |
32 | 1176 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1177 Downloads, browsing history, bookmarks, and the like are not provided |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1178 by the core itself like they are in other web browsers. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1179 Uzbl-browser also only provides ``handler scripts'' which wrap |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1180 external applications to provide the actual functionality. |
32 | 1181 For instance, \fIwget\fP is used to download files and uzbl-browser |
1182 includes a script that calls wget with appropriate options in | |
1183 a prepared environment. | |
1184 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1185 Modern web browsers are proud to have addons, plugins, modules, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1186 and so forth. |
32 | 1187 This is their effort to achieve similar goals. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1188 But instead of using existing external programs, modern web browsers |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1189 include these functions. |
0 | 1190 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1191 .H 2 "Discussion of the design |
0 | 1192 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1193 This section discusses uzbl in regard to the Unix Philosophy, |
32 | 1194 as identified by Gancarz. |
1195 | |
1196 .PP | |
35 | 1197 .B "Make each program do one thing well" . |
1198 Uzbl tries to be a web browser and nothing else. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1199 The common definition of a web browser is highly influenced by |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1200 existing implementations of web browsers. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1201 But a web browser should be a program to browse the web, and nothing more. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1202 This is the one thing it should do. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1203 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1204 Web browsers should not, for instance, manage downloads; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1205 this is the job of download managers. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1206 A download manager is primary concerned with downloading files. |
35 | 1207 Modern web browsers provide download management only as a secondary feature. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1208 How could they do this job better than programs that exist only for |
35 | 1209 this very job? |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1210 And why would anyone want less than the best download manager available? |
32 | 1211 .PP |
35 | 1212 A web browser's job is to let the user browse the web. |
1213 This means, navigating through websites by following links. | |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1214 Rendering the \s-1HTML\s0 sources is a different job, too. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1215 In uzbl's case, this is covered by the webkit rendering engine. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1216 Handling audio and video content, PostScript, \s-1PDF\s0, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1217 and other such files are also not the job of a web browser. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1218 Such content should be handled by external programs |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1219 that were written to handle such data. |
35 | 1220 Uzbl strives to do it this way. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1221 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1222 Remember Doug McIlroy's words: |
35 | 1223 .I |
1224 ``Write programs that do one thing and do it well. | |
1225 Write programs to work together.'' | |
1226 .R | |
1227 .PP | |
1228 The lesser tenet | |
1229 .B "allow the user to tailor the environment | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1230 applies here as well. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1231 Previously, the question, ``Why would anyone want anything less than the |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1232 best program for the job?'' was put forward. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1233 But as personal preferences matter, it might be more important to ask: |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1234 ``Why would anyone want something other than his preferred program for |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1235 the job?'' |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1236 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1237 Users typically want one program for a specific job. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1238 Hence, whenever one wishes to download something, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1239 the same download manager should be used. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1240 More advanced users might want to use one download manager in a certain |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1241 situation and another in a different situation; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1242 they should be able to configure it this way. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1243 With uzbl, any download manager can be used. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1244 To switch to a different one, a single line in a small handler script |
35 | 1245 needs to be changed. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1246 Alternatively, it would be possible to query which download manager to use by |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1247 reading a global file or an environment variable in the handler script. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1248 Of course, uzbl can use a different handler script as well. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1249 This simply requires a one line change in uzbl's configuration file. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1250 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1251 Uzbl neither has its own download manager nor depends on a specific one; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1252 hence, uzbl's browsing abilities will not be crippled by having |
35 | 1253 a bad download manager. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1254 Uzbl's download capabilities will be as good as the best |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1255 download manager available on the system. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1256 Of course, this applies to all of the other supplementary tools, too. |
32 | 1257 |
1258 .PP | |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1259 .B "Use software leverage to your advantage" . |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1260 Uzbl is designed to be extended by external tools. |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1261 These external tools are usually wrapped by small handler shell scripts. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1262 Shell scripts form the basis for the glue which holds the various |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1263 parts together. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1264 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1265 The history mechanism of uzbl shall be presented as an example. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1266 Uzbl is configured to spawn a script to append an entry to the history |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1267 whenever the event of a fully loaded page occurs. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1268 The script to append the entry to the history is not much more than: |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1269 .DS |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1270 #!/bin/sh |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1271 file=/path/to/uzbl-history |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1272 echo `date +'%Y-%m-%d %H:%M:%S'`" $6 $7" >> $file |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1273 .DE |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1274 \f(CW$6\fP and \f(CW$7\fP expand to the \s-1URL\s0 and the page title, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1275 respectively. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1276 .PP |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1277 For loading an entry, a key is bound to spawn a load-from-history script. |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1278 The script reverses the history to have newer entries first, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1279 displays \fIdmenu\fP to let the user select an item, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1280 and then writes the selected \s-1URL\s0 into uzbl's command input pipe. |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1281 With error checking and corner case handling removed, |
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1282 the script looks like this: |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1283 .DS |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1284 #!/bin/sh |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1285 file=/path/to/uzbl-history |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1286 goto=`tac $file | dmenu | cut -d' ' -f 3` |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1287 echo "uri $goto" > $4 |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1288 .DE |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1289 \f(CW$4\fP expands to the path of the command input pipe of the current |
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1290 uzbl instance. |
32 | 1291 |
1292 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
1293 .B "Avoid captive user interfaces" . |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1294 One could say that uzbl, to a large extent, actually \fIis\fP |
36
4f2b2defbc8c
some rework and more about uzbl design (ch05)
meillo@marmaro.de
parents:
35
diff
changeset
|
1295 a captive user interface. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1296 But the difference from other web browsers is that uzbl is only |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1297 the captive user interface frontend (and the core of the backend). |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1298 Many parts of the backend are independent of uzbl. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1299 For some external programs, handler scripts are distributed with uzbl; |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1300 but arbitrary additional functionality can always be added if desired. |
37 | 1301 .PP |
1302 The frontend is captive \(en that is true. | |
1303 This is okay for the task of browsing the web, as this task is only relevant | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1304 to humans. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1305 Automated programs would \fIcrawl\fP the web, that means, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1306 read the source directly, including all semantics. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1307 The graphical representation is just for humans to understand the semantics |
37 | 1308 more intuitively. |
32 | 1309 |
1310 .PP | |
33
0bd43c4ad9f8
removed quotes and used bold instead of italic
meillo@marmaro.de
parents:
32
diff
changeset
|
1311 .B "Make every program a filter" . |
37 | 1312 Graphical web browsers are almost dead ends in the chain of information flow. |
1313 Thus it is difficult to see what graphical web browsers should filter. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1314 Graphical web browsers exist almost exclusively to be interactively used |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1315 by humans. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1316 The only case in which one might want to automate the rendering function is |
37 | 1317 to generate images of rendered webpages. |
1318 | |
1319 .PP | |
1320 .B "Small is beautiful" | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1321 is not easy to apply to a web browser because modern web technology |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1322 is very complex; hence, the rendering task is very complex. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1323 Unfortunately, modern web browsers ``have'' to consist of many thousand |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1324 lines of code, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1325 Using the toolchest approach and wrappers can help to split the browser |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1326 into several small parts, though. |
37 | 1327 .PP |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1328 As of March 2010, uzbl-core consists of about 3\,500 lines of C code. |
37 | 1329 The distribution includes another 3\,500 lines of Shell and Python code, |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1330 which are the handler scripts and plugins like one to provide a modal |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1331 interface. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1332 Further more, uzbl makes use of external tools like |
54
0a435d76b868
applied corrections by Dieter@be; and did spell checking
meillo@marmaro.de
parents:
53
diff
changeset
|
1333 \fIwget\fP and \fIsocat\fP. |
37 | 1334 Up to this point, uzbl looks pretty neat and small. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1335 The ugly part of uzbl is the rendering engine, webkit. |
37 | 1336 Webkit consists of roughly 400\,000 (!) lines of code. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1337 Unfortunately, small rendering engines are not feasible anymore |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1338 due to the nature of the modern web. |
35 | 1339 |
1340 .PP | |
1341 .B "Build a prototype as soon as possible" . | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1342 Plaetinck made his code public right from the beginning. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1343 Discussion and development was, and still is, open to everyone interested, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1344 and development versions of uzbl can be obtained very easily from the |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1345 code repository. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1346 Within the first year of uzbl's existence, a new version was released |
35 | 1347 more often than once a month. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1348 Different forks and branches arose introducing new features which were |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1349 then considered for merging into the main branch. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1350 The experiences with using prototypes influenced further development. |
35 | 1351 Actually, all development was community driven. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1352 Plaetinck says, three months after uzbl's birth: |
35 | 1353 ``Right now I hardly code anything myself for Uzbl. |
1354 I just merge in other people's code, ponder a lot, and lead the discussions.'' | |
1355 .[ | |
44 | 1356 lwn |
1357 uzbl | |
35 | 1358 .] |
32 | 1359 |
0 | 1360 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1361 .H 2 "Problems |
0 | 1362 .LP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1363 Similar to \s-1MH\s0, uzbl suffers from being different. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1364 It is sad, but people use what they know. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1365 Fortunately, uzbl's user interface can be made to look and feel very similar |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1366 to the one of the well known web browsers, |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1367 hiding the internal differences. |
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1368 But uzbl has to provide this similar look and feel to be accepted |
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1369 as a ``normal'' browser by ``normal'' users. |
37 | 1370 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1371 The more important problem here is the modern web. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1372 The modern web is simply broken. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1373 It has state in a state-less protocol, misuses technologies, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1374 and is helplessly overloaded. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1375 This results in rendering engines that ``must'' consist |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1376 of hundreds of thousands of lines of code. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1377 They also must combine and integrate many different technologies |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1378 to make our modern web accessible. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1379 This results, however, in a failing attempt to provide good usability. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1380 Website-to-image converters are almost impossible to run without |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1381 human interaction because of state in sessions, impossible |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1382 deep-linking, and ``unautomatable'' technologies. |
37 | 1383 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1384 The web was misused in order to attempt to fulfill all kinds of wishes. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1385 Now web browsers, and ultimately users, suffer from it. |
37 | 1386 |
8 | 1387 |
51 | 1388 .H 2 "Summary |
32 | 1389 .LP |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1390 ``Uzbl is a browser that adheres to the Unix Philosophy'', |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1391 is how uzbl is seen by its authors. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1392 Indeed, uzbl follows the Unix Philosophy in many ways. |
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1393 It consists of independent parts that work together, |
45
ade392f024aa
a lot of rework throughout the whole document
meillo@marmaro.de
parents:
44
diff
changeset
|
1394 while its core is mainly a mediator which glues the parts together. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1395 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1396 Software leverage is put to excellent use. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1397 External tools are used, independent tasks are separated out |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1398 to independent parts and glued together with small handler scripts. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1399 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1400 Since uzbl roughly consists of a set of tools and a bit of glue, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1401 anyone can put the parts together and expand it in any desired way. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1402 Flexibility and customization are properties that make it valuable |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1403 for advanced users, but may keep novice users from understanding |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1404 and using it. |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1405 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1406 But uzbl's main problem is the modern web, which makes it very difficult |
38
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1407 to design a sane web browser. |
3628e9649046
wrote uzbl summary and did several spell fixes
meillo@marmaro.de
parents:
37
diff
changeset
|
1408 Despite this bad situation, uzbl does a fairly good job. |
32 | 1409 |
8 | 1410 |
48
40caeb9e9b25
switched to new header macro; cleaned up CW
meillo@marmaro.de
parents:
47
diff
changeset
|
1411 .H 1 "Final thoughts |
0 | 1412 |
1413 .LP | |
50 | 1414 This paper explained why good design is important. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1415 It introduced the Unix Philosophy as a set of guidelines that encourage |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1416 good design in order to create good quality software. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1417 Then, real world software that was designed with the Unix Philosophy |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1418 in mind was discussed. |
50 | 1419 .PP |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1420 Throughout this paper, the aim was do explain \fIwhy\fP something |
50 | 1421 should be done the Unix way. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1422 Reasons were given to substantiate the claim that the Unix Philosophy |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1423 is a preferable way of designing software. |
50 | 1424 .PP |
1425 The Unix Philosophy is close to the software developer's point of view. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1426 Its main goal is taming the beast known as ``software complexity''. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1427 Hence it strives first and foremost for simplicity of software. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1428 It might appear that usability for humans is a minor goal, |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1429 but actually, the Unix Philosophy sees usability as a result of sound design. |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1430 Sound design does not need to be ultimately intuitive, |
50 | 1431 but it will provide a consistent way to access the enormous power |
1432 of software leverage. | |
1433 .PP | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1434 Being able to solve some specific concrete problem becomes less and less |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1435 important as there is software available for nearly every possible task |
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1436 today. |
50 | 1437 But the quality of software matters. |
1438 It is important that we have \fIgood\fP software. | |
1439 .sp | |
0 | 1440 .LP |
50 | 1441 .B "But why the Unix Philosophy? |
1442 .PP | |
1443 The largest problem of software development is the complexity involved. | |
1444 It is the only part of the job that computers cannot take over. | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1445 The Unix Philosophy fights complexity, as it is the main enemy. |
50 | 1446 .PP |
1447 On the other hand, | |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1448 the most unique advantage of software is its ability to leverage. |
50 | 1449 Current software still fails to make the best possible use of this ability. |
61
733f4fb03071
a huge bunch of improvements of my wordings by Andrew Antle
meillo@marmaro.de
parents:
57
diff
changeset
|
1450 The Unix Philosophy concentrates on exploiting this great opportunity. |
0 | 1451 |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1452 |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1453 .bp |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1454 .TL |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1455 References |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1456 .LP |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1457 .XS |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1458 .sp .5v |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1459 .B |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1460 References |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1461 .XE |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1462 .ev r |
42 | 1463 .nr PS -1 |
1464 .nr VS -1 | |
0 | 1465 .[ |
1466 $LIST$ | |
1467 .] | |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1468 .nr PS +1 |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1469 .nr VS +1 |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1470 .ev |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1471 |
42 | 1472 .bp |
47
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1473 .TL |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1474 Table of Contents |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1475 .LP |
b6ae4a8ab1d3
improved references and some minor design issues
meillo@marmaro.de
parents:
46
diff
changeset
|
1476 .PX no |