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