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