hn-classics/_stories/2003/10831379.md

1168 lines
39 KiB
Markdown
Raw Permalink Normal View History

---
created_at: '2016-01-03T17:39:29.000Z'
title: The Art of Unix Programming (2003)
url: http://www.catb.org/esr/writings/taoup/html/
author: lookupmobile
points: 43
story_text:
comment_text:
num_comments: 10
story_id:
story_title:
story_url:
parent_id:
created_at_i: 1451842769
_tags:
- story
- author_lookupmobile
- story_10831379
objectID: '10831379'
2018-06-08 12:05:27 +00:00
year: 2003
---
2018-02-23 18:19:40 +00:00
[Source](http://www.catb.org/esr/writings/taoup/html/ "Permalink to The Art of Unix Programming")
# The Art of Unix Programming
| ----- |
| The Art of Unix Programming |
| | | [Next][1] |
* * *
# The Art of Unix Programming
### Eric Steven Raymond
[ Thyrsus Enterprises][2]
`<[esr@thyrsus.com][3]>`
Copyright 2003 Eric S. Raymond
This book and its on-line version are distributed under the terms of the Creative Commons Attribution-NoDerivs 1.0 license, with the additional proviso that the right to publish it on paper for sale or other for-profit use is reserved to Pearson Education, Inc. A reference copy of this license may be found at <http://creativecommons.org/licenses/by-nd/1.0/legalcode>.
AIX, AS/400, DB/2, OS/2, System/360, MVS, VM/CMS, and IBM PC are trademarks of IBM. Alpha, DEC, VAX, HP-UX, PDP, TOPS-10, TOPS-20, VMS, and VT-100 are trademarks of Compaq. Amiga and AmigaOS are trademarks of Amiga, Inc. Apple, Macintosh, MacOS, Newton, OpenDoc, and OpenStep are trademarks of Apple Computers, Inc. ClearCase is a trademark of Rational Software, Inc. Ethernet is a trademark of 3COM, Inc. Excel, MS-DOS, Microsoft Windows and PowerPoint are trademarks of Microsoft, Inc. Java. J2EE, JavaScript, NeWS, and Solaris are trademarks of Sun Microsystems. SPARC is a trademark of SPARC international. Informix is a trademark of Informix software. Itanium is a trademark of Intel. Linux is a trademark of Linus Torvalds. Netscape is a trademark of AOL. PDF and PostScript are trademarks of Adobe, Inc. UNIX is a trademark of The Open Group.
The photograph of Ken and Dennis in [Chapter2][4] appears courtesy of Bell Labs/Lucent Technologies.
The epigraph on the Portability chapter is from the Bell System Technical Journal, v57 #6 part 2 (July-Aug. 1978) pp. 2021-2048 and is reproduced with the permission of Bell Labs/Lucent Technologies.
| ----- |
| **Revision History** |
| Revision 1.0 | 19 September 2003 | esr |
| This is the content that went to Addison-Wesley's printers. | | |
| Revision 0.4 | 5 February 2003 | esr |
| Release for public review. | | |
| Revision 0.3 | 22 January 2003 | esr |
| First eighteen-chapter draft. Manuscript walkthrough at Chapter 12. Limited release for early reviewers. | | |
| Revision 0.2 | 2 January 2003 | esr |
| First manuscript walkthrough at Chapter 7. Released to Dmitry Kirsanov at AW production. | | |
| Revision 0.1 | 16 November 2002 | esr |
| First DocBook draft, fifteen chapters. Languages rewritten to incorporate lots of feedback. Transparency, Modularity, Multiprogramming, Configuration, Interfaces, Documentation, and Open Source chapters released. Shipped to Mark Taub at AW. | | |
| Revision 0.0 | 1999 | esr |
| Public HTML draft, first four chapters only. | | |
* * *
## Dedication
To Ken Thompson and Dennis Ritchie, because you inspired me.
**Table of Contents**
[Preface][1]
:
[Who Should Read This Book][5]
[How to Use This Book][6]
[Related References][7]
[Conventions Used in This Book][8]
[Our Case Studies][9]
[Author's Acknowledgements][10]
I. [Context][11]
:
1\. [Philosophy][12]
:
[Culture? What Culture?][13]
[The Durability of Unix][14]
[The Case against Learning Unix Culture][15]
[What Unix Gets Wrong][16]
[What Unix Gets Right][17]
:
[Open-Source Software][18]
[Cross-Platform Portability and Open Standards][19]
[The Internet and the World Wide Web][20]
[The Open-Source Community][21]
[Flexibility All the Way Down][22]
[Unix Is Fun to Hack][23]
[The Lessons of Unix Can Be Applied Elsewhere][24]
[Basics of the Unix Philosophy][25]
:
[Rule of Modularity: Write simple parts connected by clean interfaces.][26]
[Rule of Clarity: Clarity is better than cleverness.][27]
[Rule of Composition: Design programs to be connected with other programs.][28]
[Rule of Separation: Separate policy from mechanism; separate interfaces from engines.][29]
[Rule of Simplicity: Design for simplicity; add complexity only where you must.][30]
[Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.][31]
[Rule of Transparency: Design for visibility to make inspection and debugging easier.][32]
[Rule of Robustness: Robustness is the child oftransparency and simplicity.][33]
[Rule of Representation: Fold knowledge into data, soprogram logic can be stupid and robust.][34]
[Rule of Least Surprise: In interface design, always do theleast surprising thing.][35]
[Rule of Silence: When a program has nothing surprising to say, it should say nothing.][36]
[Rule of Repair: Repair what you can — but when you must fail, fail noisily and as soon as possible.][37]
[Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.][38]
[Rule of Generation: Avoid hand-hacking; write programs to write programs when you can.][39]
[Rule of Optimization: Prototype before polishing. Get it working before you optimize it.][40]
[Rule of Diversity: Distrust all claims for one true way.][41]
[Rule of Extensibility: Design for the future, because it will be here sooner than you think.][42]
[The Unix Philosophy in One Lesson][43]
[Applying the Unix Philosophy][44]
[Attitude Matters Too][45]
2\. [History][46]
:
[Origins and History of Unix, 1969-1995][47]
:
[Genesis: 19691971][48]
[Exodus: 19711980][49]
[TCP/IP and the Unix Wars: 1980-1990][50]
[Blows against the Empire: 1991-1995][51]
[Origins and History of the Hackers, 1961-1995][52]
:
[At Play in the Groves of Academe: 1961-1980][53]
[Internet Fusion and the Free Software Movement: 1981-1991][54]
[Linux and the Pragmatist Reaction: 1991-1998][55]
[The Open-Source Movement: 1998 and Onward][56]
[The Lessons of Unix History][57]
3\. [Contrasts][58]
:
[The Elements of Operating-System Style][59]
:
[What Is the Operating System's Unifying Idea?][60]
[Multitasking Capability][61]
[Cooperating Processes][62]
[Internal Boundaries][63]
[File Attributes and Record Structures][64]
[Binary File Formats][65]
[Preferred User Interface Style][66]
[Intended Audience][67]
[Entry Barriers to Development][68]
[Operating-System Comparisons][69]
:
[VMS][70]
[MacOS][71]
[OS/2][72]
[Windows NT][73]
[BeOS][74]
[MVS][75]
[VM/CMS][76]
[Linux][77]
[What Goes Around, Comes Around][78]
II. [Design][79]
:
4\. [Modularity][80]
:
[Encapsulation and Optimal Module Size][81]
[Compactness and Orthogonality][82]
:
[Compactness][83]
[Orthogonality][84]
[The SPOT Rule][85]
[Compactness and the Strong Single Center][86]
[The Value of Detachment][87]
[Software Is a Many-Layered Thing][88]
:
[Top-Down versus Bottom-Up][89]
[Glue Layers][90]
[Case Study: C Considered as Thin Glue][91]
[Libraries][92]
:
[Case Study: GIMP Plugins][93]
[Unix and Object-Oriented Languages][94]
[Coding for Modularity][95]
5\. [Textuality][96]
:
[The Importance of Being Textual][97]
:
[Case Study: Unix Password File Format][98]
[Case Study: .newsrc Format][99]
[Case Study: The PNG Graphics File Format][100]
[Data File Metaformats][101]
:
[DSV Style][102]
[RFC 822 Format][103]
[Cookie-Jar Format][104]
[Record-Jar Format][105]
[XML][106]
[Windows INI Format][107]
[Unix Textual File Format Conventions][108]
[The Pros and Cons of File Compression][109]
[Application Protocol Design][110]
:
[Case Study: SMTP, the Simple Mail Transfer Protocol][111]
[Case Study: POP3, the Post Office Protocol][112]
[Case Study: IMAP, the Internet Message Access Protocol][113]
[Application Protocol Metaformats][114]
:
[The Classical Internet Application Metaprotocol][115]
[HTTP as a Universal Application Protocol][116]
[BEEP: Blocks Extensible Exchange Protocol][117]
[XML-RPC, SOAP, and Jabber][118]
6\. [Transparency][119]
:
[Studying Cases][120]
:
[Case Study: audacity][121]
[Case Study: fetchmail's -v option][122]
[Case Study: GCC][123]
[Case Study: kmail][124]
[Case Study: SNG][125]
[Case Study: The Terminfo Database][126]
[Case Study: Freeciv Data Files][127]
[Designing for Transparency and Discoverability][128]
:
[The Zen of Transparency][129]
[Coding for Transparency and Discoverability][130]
[Transparency and Avoiding Overprotectiveness][131]
[Transparency and Editable Representations][132]
[Transparency, Fault Diagnosis, and Fault Recovery][133]
[Designing for Maintainability][134]
7\. [Multiprogramming][135]
:
[Separating Complexity Control from Performance Tuning][136]
[Taxonomy of Unix IPC Methods][137]
:
[Handing off Tasks to Specialist Programs][138]
[Pipes, Redirection, and Filters][139]
[Wrappers][140]
[Security Wrappers and Bernstein Chaining][141]
[Slave Processes][142]
[Peer-to-Peer Inter-Process Communication][143]
[Problems and Methods to Avoid][144]
:
[Obsolescent Unix IPC Methods][145]
[Remote Procedure Calls][146]
[Threads — Threat or Menace?][147]
[Process Partitioning at the Design Level][148]
8\. [Minilanguages][149]
:
[Understanding the Taxonomy of Languages][150]
[Applying Minilanguages][151]
:
[Case Study: sng][152]
[Case Study: Regular Expressions][153]
[Case Study: Glade][154]
[Case Study: m4][155]
[Case Study: XSLT][156]
[Case Study: The Documenter's Workbench Tools][157]
[Case Study: fetchmail Run-Control Syntax][158]
[Case Study: awk][159]
[Case Study: PostScript][160]
[Case Study: bc and dc][161]
[Case Study: Emacs Lisp][162]
[Case Study: JavaScript][163]
[Designing Minilanguages][164]
:
[Choosing the Right Complexity Level][165]
[Extending and Embedding Languages][166]
[Writing a Custom Grammar][167]
[Macros — Beware!][168]
[Language or Application Protocol?][169]
9\. [Generation][170]
:
[Data-Driven Programming][171]
:
[Case Study: ascii][172]
[Case Study: Statistical Spam Filtering][173]
[Case Study: Metaclass Hacking in fetchmailconf][174]
[Ad-hoc Code Generation][175]
:
[Case Study: Generating Code for the ascii Displays][176]
[Case Study: Generating HTML Code for a Tabular List][177]
10\. [Configuration][178]
:
[What Should Be Configurable?][179]
[Where Configurations Live][180]
[Run-Control Files][181]
:
[Case Study: The .netrc File][182]
[Portability to Other Operating Systems][183]
[Environment Variables][184]
:
[System Environment Variables][185]
[User Environment Variables][186]
[When to Use Environment Variables][187]
[Portability to Other Operating Systems][188]
[Command-Line Options][189]
:
[The -a to -z of Command-Line Options][190]
[Portability to Other Operating Systems][191]
[How to Choose among the Methods][192]
:
[Case Study: fetchmail][193]
[Case Study: The XFree86 Server][194]
[On Breaking These Rules][195]
11\. [Interfaces][196]
:
[Applying the Rule of Least Surprise][197]
[History of Interface Design on Unix][198]
[Evaluating Interface Designs][199]
[Tradeoffs between CLI and Visual Interfaces][200]
:
[Case Study: Two Ways to Write a Calculator Program][201]
[Transparency, Expressiveness, and Configurability][202]
[Unix Interface Design Patterns][203]
:
[The Filter Pattern][204]
[The Cantrip Pattern][205]
[The Source Pattern][206]
[The Sink Pattern][207]
[The Compiler Pattern][208]
[The ed pattern][209]
[The Roguelike Pattern][210]
[The Separated Engine and Interface Pattern][211]
[The CLI Server Pattern][212]
[Language-Based Interface Patterns][213]
[Applying Unix Interface-Design Patterns][214]
:
[The Polyvalent-Program Pattern][215]
[The Web Browser as a Universal Front End][216]
[Silence Is Golden][217]
12\. [Optimization][218]
:
[Don't Just Do Something, Stand There!][219]
[Measure before Optimizing][220]
[Nonlocality Considered Harmful][221]
[Throughput vs. Latency][222]
:
[Batching Operations][223]
[Overlapping Operations][224]
[Caching Operation Results][225]
13\. [Complexity][226]
:
[Speaking of Complexity][227]
:
[The Three Sources of Complexity][228]
[Tradeoffs between Interface and Implementation Complexity][229]
[Essential, Optional, and Accidental Complexity][230]
[Mapping Complexity][231]
[When Simplicity Is Not Enough][232]
[A Tale of Five Editors][233]
:
[ed][234]
[vi][235]
[Sam][236]
[Emacs][237]
[Wily][238]
[The Right Size for an Editor][239]
:
[Identifying the Complexity Problems][240]
[Compromise Doesn't Work][241]
[Is Emacs an Argument against the Unix Tradition?][242]
[The Right Size of Software][243]
III. [Implementation][244]
:
14\. [Languages][245]
:
[Unix's Cornucopia of Languages][246]
[Why Not C?][247]
[Interpreted Languages and Mixed Strategies][248]
[Language Evaluations][249]
:
[C][250]
[C++][251]
[Shell][252]
[Perl][253]
[Tcl][254]
[Python][255]
[Java][256]
[Emacs Lisp][257]
[Trends for the Future][258]
[Choosing an X Toolkit][259]
15\. [Tools][260]
:
[A Developer-Friendly Operating System][261]
[Choosing an Editor][262]
:
[Useful Things to Know about vi][263]
[Useful Things to Know about Emacs][264]
[The Antireligious Choice: Using Both][265]
[Special-Purpose Code Generators][266]
:
[yacc and lex][267]
[Case Study: Glade][268]
[make: Automating Your Recipes][269]
:
[Basic Theory of make][270]
[make in Non-C/C++ Development][271]
[Utility Productions][272]
[Generating Makefiles][273]
[Version-Control Systems][274]
:
[Why Version Control?][275]
[Version Control by Hand][276]
[Automated Version Control][277]
[Unix Tools for Version Control][278]
[Runtime Debugging][279]
[Profiling][280]
[Combining Tools with Emacs][281]
:
[Emacs and make][282]
[Emacs and Runtime Debugging][283]
[Emacs and Version Control][284]
[Emacs and Profiling][285]
[Like an IDE, Only Better][286]
16\. [Reuse][287]
:
[The Tale of J. Random Newbie][288]
[Transparency as the Key to Reuse][289]
[From Reuse to Open Source][290]
[The Best Things in Life Are Open][291]
[Where to Look?][292]
[Issues in Using Open-Source Software][293]
[Licensing Issues][294]
:
[What Qualifies as Open Source][295]
[Standard Open-Source Licenses][296]
[When You Need a Lawyer][297]
IV. [Community][298]
:
17\. [Portability][299]
:
[Evolution of C][300]
:
[Early History of C][301]
[C Standards][302]
[Unix Standards][303]
:
[Standards and the Unix Wars][304]
[The Ghost at the Victory Banquet][305]
[Unix Standards in the Open-Source World][306]
[IETF and the RFC Standards Process][307]
[Specifications as DNA, Code as RNA][308]
[Programming for Portability][309]
:
[Portability and Choice of Language][310]
[Avoiding System Dependencies][311]
[Tools for Portability][312]
[Internationalization][313]
[Portability, Open Standards, and Open Source][314]
18\. [Documentation][315]
:
[Documentation Concepts][316]
[The Unix Style][317]
:
[The Large-Document Bias][318]
[Cultural Style][319]
[The Zoo of Unix Documentation Formats][320]
:
[troff and the Documenter's Workbench Tools][321]
[TeX][322]
[Texinfo][323]
[POD][324]
[HTML][325]
[DocBook][326]
[The Present Chaos and a Possible Way Out][327]
[DocBook][328]
:
[Document Type Definitions][329]
[Other DTDs][330]
[The DocBook Toolchain][331]
[Migration Tools][332]
[Editing Tools][333]
[Related Standards and Practices][334]
[SGML][335]
[XML-DocBook References][336]
[Best Practices for Writing Unix Documentation][337]
19\. [Open Source][338]
:
[Unix and Open Source][339]
[Best Practices for Working with Open-Source Developers][340]
:
[Good Patching Practice][341]
[Good Project- and Archive-Naming Practice][342]
[Good Development Practice][343]
[Good Distribution-Making Practice][344]
[Good Communication Practice][345]
[The Logic of Licenses: How to Pick One][346]
[Why You Should Use a Standard License][347]
[Varieties of Open-Source Licensing][348]
:
[MIT or X Consortium License][349]
[BSD Classic License][350]
[Artistic License][351]
[General Public License][352]
[Mozilla Public License][353]
20\. [Futures][354]
:
[Essence and Accident in Unix Tradition][355]
[Plan 9: The Way the Future Was][356]
[Problems in the Design of Unix][357]
:
[A Unix File Is Just a Big Bag of Bytes][358]
[Unix Support for GUIs Is Weak][359]
[File Deletion Is Forever][360]
[Unix Assumes a Static File System][361]
[The Design of Job Control Was Badly Botched][362]
[The Unix API Doesn't Use Exceptions][363]
[ioctl2 and fcntl2 Are an Embarrassment][364]
[The Unix Security Model May Be Too Primitive][365]
[Unix Has Too Many Different Kinds of Names][366]
[File Systems Might Be Considered Harmful][367]
[Towards a Global Internet Address Space][368]
[Problems in the Environment of Unix][369]
[Problems in the Culture of Unix][370]
[Reasons to Believe][371]
A. [Glossary of Abbreviations][372]
B. [References][373]
C. [Contributors][374]
D. [Rootless Root][375]
:
[Editor's Introduction][376]
[Master Foo and the Ten Thousand Lines][377]
[Master Foo and the Script Kiddie][378]
[Master Foo Discourses on the Two Paths][379]
[Master Foo and the Methodologist][380]
[Master Foo Discourses on the Graphical User Interface][381]
[Master Foo and the Unix Zealot][382]
[Master Foo Discourses on the Unix-Nature][383]
[Master Foo and the End User][384]
**List of Figures**
2.1. [The PDP-7.][385]
3.1. [Schematic history of timesharing.][386]
4.1. [Qualitative plot of defect count and density vs. module size.][387]
4.2. [Caller/callee relationships in GIMP with a plugin loaded.][388]
6.1. [Screen shot of audacity.][389]
6.2. [Screen shot of kmail.][390]
6.3. [Main window of a Freeciv game.][391]
8.1. [Taxonomy of languages.][392]
11.1. [The xcalc GUI.][393]
11.2. [Screen shot of the original Rogue game.][394]
11.3. [The Xcdroast GUI.][395]
11.4. [Caller/callee relationships in a polyvalent program.][396]
13.1. [Sources and kinds of complexity.][397]
18.1. [Processing structural documents.][398]
18.2. [Present-day XML-DocBook toolchain.][399]
18.3. [Future XML-DocBook toolchain with FOP.][400]
**List of Tables**
8.1. [Regular-expression examples.][401]
8.2. [Introduction to regular-expression operations.][402]
14.1. [Language choices.][403]
14.2. [Summary of X Toolkits.][404]
**List of Examples**
5.1. [Password file example.][405]
5.2. [A .newsrc example.][406]
5.3. [A fortune file example.][407]
5.4. [Basic data for three planets in a record-jar format.][408]
5.5. [An XML example.][409]
5.6. [A .INI file example.][410]
5.7. [An SMTP session example.][411]
5.8. [A POP3 example session.][412]
5.9. [An IMAP session example.][413]
6.1. [An example fetchmail -v transcript.][414]
6.2. [An SNG Example.][415]
7.1. [The pic2graph pipeline.][416]
8.1. [Glade Hello, World.][417]
8.2. [A sample m4 macro.][418]
8.3. [A sample XSLT program.][419]
8.4. [Taxonomy of languages — the pic source.][420]
8.5. [Synthetic example of a fetchmailrc.][421]
8.6. [RSA implementation using dc.][422]
9.1. [Example of fetchmailrc syntax.][423]
9.2. [Python structure dump of a fetchmail configuration.][424]
9.3. [copy_instance metaclass code.][425]
9.4. [Calling context for copy_instance.][426]
9.5. [ascii usage screen.][427]
9.6. [Desired output format for the star table.][428]
9.7. [Master form of the star table.][429]
10.1. [A .netrc example.][430]
10.2. [X configuration example.][431]
18.1. [groff1 markup example.][432]
18.2. [man markup example.][433]
19.1. [tar archive maker production.][434]
* * *
| ----- |
| | | [Next][1] |
| | | Preface |
[1]: http://www.catb.org/preface.html
[2]: http://www.catb.org/~esr/
[3]: mailto:esr%40thyrsus.com
[4]: http://www.catb.org/historychapter.html "Chapter2.History"
[5]: http://www.catb.org/pr01s01.html
[6]: http://www.catb.org/pr01s02.html
[7]: http://www.catb.org/pr01s03.html
[8]: http://www.catb.org/pr01s04.html
[9]: http://www.catb.org/pr01s05.html
[10]: http://www.catb.org/pr01s06.html
[11]: http://www.catb.org/context.html
[12]: http://www.catb.org/philosophychapter.html
[13]: http://www.catb.org/ch01s01.html
[14]: http://www.catb.org/ch01s02.html
[15]: http://www.catb.org/ch01s03.html
[16]: http://www.catb.org/ch01s04.html
[17]: http://www.catb.org/ch01s05.html
[18]: http://www.catb.org/ch01s05.html#id2808846
[19]: http://www.catb.org/ch01s05.html#id2872776
[20]: http://www.catb.org/ch01s05.html#id2872827
[21]: http://www.catb.org/ch01s05.html#id2872945
[22]: http://www.catb.org/ch01s05.html#id2873031
[23]: http://www.catb.org/ch01s05.html#id2873078
[24]: http://www.catb.org/ch01s05.html#id2873180
[25]: http://www.catb.org/ch01s06.html
[26]: http://www.catb.org/ch01s06.html#id2877537
[27]: http://www.catb.org/ch01s06.html#id2877610
[28]: http://www.catb.org/ch01s06.html#id2877684
[29]: http://www.catb.org/ch01s06.html#id2877777
[30]: http://www.catb.org/ch01s06.html#id2877917
[31]: http://www.catb.org/ch01s06.html#id2878022
[32]: http://www.catb.org/ch01s06.html#id2878054
[33]: http://www.catb.org/ch01s06.html#id2878145
[34]: http://www.catb.org/ch01s06.html#id2878263
[35]: http://www.catb.org/ch01s06.html#id2878339
[36]: http://www.catb.org/ch01s06.html#id2878450
[37]: http://www.catb.org/ch01s06.html#id2878538
[38]: http://www.catb.org/ch01s06.html#id2878666
[39]: http://www.catb.org/ch01s06.html#id2878742
[40]: http://www.catb.org/ch01s06.html#rule_of_optimization
[41]: http://www.catb.org/ch01s06.html#id2879078
[42]: http://www.catb.org/ch01s06.html#id2879112
[43]: http://www.catb.org/ch01s07.html
[44]: http://www.catb.org/ch01s08.html
[45]: http://www.catb.org/ch01s09.html
[46]: http://www.catb.org/historychapter.html
[47]: http://www.catb.org/ch02s01.html
[48]: http://www.catb.org/ch02s01.html#genesis
[49]: http://www.catb.org/ch02s01.html#id2879627
[50]: http://www.catb.org/ch02s01.html#id2880014
[51]: http://www.catb.org/ch02s01.html#id2886020
[52]: http://www.catb.org/hackers.html
[53]: http://www.catb.org/hackers.html#id2886621
[54]: http://www.catb.org/hackers.html#id2886828
[55]: http://www.catb.org/hackers.html#linux_reaction
[56]: http://www.catb.org/ch02s03.html
[57]: http://www.catb.org/ch02s04.html
[58]: http://www.catb.org/contrastchapter.html
[59]: http://www.catb.org/ch03s01.html
[60]: http://www.catb.org/ch03s01.html#id2892028
[61]: http://www.catb.org/ch03s01.html#id2892085
[62]: http://www.catb.org/ch03s01.html#id2892171
[63]: http://www.catb.org/ch03s01.html#id2888136
[64]: http://www.catb.org/ch03s01.html#id2888217
[65]: http://www.catb.org/ch03s01.html#id2888298
[66]: http://www.catb.org/ch03s01.html#id2888363
[67]: http://www.catb.org/ch03s01.html#id2888484
[68]: http://www.catb.org/ch03s01.html#id2888581
[69]: http://www.catb.org/ch03s02.html
[70]: http://www.catb.org/ch03s02.html#vms
[71]: http://www.catb.org/ch03s02.html#mac_os_contrast
[72]: http://www.catb.org/ch03s02.html#os_2
[73]: http://www.catb.org/ch03s02.html#nt_contrast
[74]: http://www.catb.org/ch03s02.html#beos
[75]: http://www.catb.org/ch03s02.html#mvs
[76]: http://www.catb.org/ch03s02.html#id2893777
[77]: http://www.catb.org/ch03s02.html#linux
[78]: http://www.catb.org/ch03s03.html
[79]: http://www.catb.org/design.html
[80]: http://www.catb.org/modularitychapter.html
[81]: http://www.catb.org/ch04s01.html
[82]: http://www.catb.org/ch04s02.html
[83]: http://www.catb.org/ch04s02.html#compactness
[84]: http://www.catb.org/ch04s02.html#orthogonality
[85]: http://www.catb.org/ch04s02.html#spot_rule
[86]: http://www.catb.org/ch04s02.html#id2895445
[87]: http://www.catb.org/ch04s02.html#id2899405
[88]: http://www.catb.org/ch04s03.html
[89]: http://www.catb.org/ch04s03.html#id2899552
[90]: http://www.catb.org/ch04s03.html#id2899777
[91]: http://www.catb.org/ch04s03.html#c_thin_glue
[92]: http://www.catb.org/ch04s04.html
[93]: http://www.catb.org/ch04s04.html#gimp_plugins
[94]: http://www.catb.org/unix_and_oo.html
[95]: http://www.catb.org/ch04s06.html
[96]: http://www.catb.org/textualitychapter.html
[97]: http://www.catb.org/ch05s01.html
[98]: http://www.catb.org/ch05s01.html#id2901332
[99]: http://www.catb.org/ch05s01.html#id2901494
[100]: http://www.catb.org/ch05s01.html#png
[101]: http://www.catb.org/ch05s02.html
[102]: http://www.catb.org/ch05s02.html#id2901882
[103]: http://www.catb.org/ch05s02.html#id2902039
[104]: http://www.catb.org/ch05s02.html#id2902164
[105]: http://www.catb.org/ch05s02.html#id2906931
[106]: http://www.catb.org/ch05s02.html#id2907018
[107]: http://www.catb.org/ch05s02.html#id2907263
[108]: http://www.catb.org/ch05s02.html#id2907428
[109]: http://www.catb.org/ch05s02.html#id2907903
[110]: http://www.catb.org/ch05s03.html
[111]: http://www.catb.org/ch05s03.html#id2908194
[112]: http://www.catb.org/ch05s03.html#id2908383
[113]: http://www.catb.org/ch05s03.html#id2908582
[114]: http://www.catb.org/ch05s04.html
[115]: http://www.catb.org/ch05s04.html#id2908835
[116]: http://www.catb.org/ch05s04.html#id2908915
[117]: http://www.catb.org/ch05s04.html#id2909217
[118]: http://www.catb.org/ch05s04.html#id2909294
[119]: http://www.catb.org/transparencychapter.html
[120]: http://www.catb.org/ch06s01.html
[121]: http://www.catb.org/ch06s01.html#audacity
[122]: http://www.catb.org/ch06s01.html#fetchmail_v
[123]: http://www.catb.org/ch06s01.html#id2909841
[124]: http://www.catb.org/ch06s01.html#id2909954
[125]: http://www.catb.org/ch06s01.html#id2910193
[126]: http://www.catb.org/ch06s01.html#id2910334
[127]: http://www.catb.org/ch06s01.html#id2914115
[128]: http://www.catb.org/ch06s02.html
[129]: http://www.catb.org/ch06s02.html#zen_of_transparency
[130]: http://www.catb.org/ch06s02.html#id2914509
[131]: http://www.catb.org/ch06s02.html#id2914680
[132]: http://www.catb.org/ch06s02.html#id2914758
[133]: http://www.catb.org/ch06s02.html#id2915107
[134]: http://www.catb.org/ch06s03.html
[135]: http://www.catb.org/multiprogramchapter.html
[136]: http://www.catb.org/ch07s01.html
[137]: http://www.catb.org/ch07s02.html
[138]: http://www.catb.org/ch07s02.html#id2915475
[139]: http://www.catb.org/ch07s02.html#plumbing
[140]: http://www.catb.org/ch07s02.html#id2921506
[141]: http://www.catb.org/ch07s02.html#id2921634
[142]: http://www.catb.org/ch07s02.html#id2922002
[143]: http://www.catb.org/ch07s02.html#id2922148
[144]: http://www.catb.org/ch07s03.html
[145]: http://www.catb.org/ch07s03.html#id2923376
[146]: http://www.catb.org/ch07s03.html#id2923675
[147]: http://www.catb.org/ch07s03.html#id2923889
[148]: http://www.catb.org/ch07s04.html
[149]: http://www.catb.org/minilanguageschapter.html
[150]: http://www.catb.org/ch08s01.html
[151]: http://www.catb.org/ch08s02.html
[152]: http://www.catb.org/ch08s02.html#id2924747
[153]: http://www.catb.org/ch08s02.html#regexps
[154]: http://www.catb.org/ch08s02.html#id2933450
[155]: http://www.catb.org/ch08s02.html#id2933775
[156]: http://www.catb.org/ch08s02.html#id2934034
[157]: http://www.catb.org/ch08s02.html#id2934197
[158]: http://www.catb.org/ch08s02.html#fetchmailrc
[159]: http://www.catb.org/ch08s02.html#awk
[160]: http://www.catb.org/ch08s02.html#id2935613
[161]: http://www.catb.org/ch08s02.html#id2935779
[162]: http://www.catb.org/ch08s02.html#emacs_lisp_study
[163]: http://www.catb.org/ch08s02.html#javascript
[164]: http://www.catb.org/ch08s03.html
[165]: http://www.catb.org/ch08s03.html#id2936413
[166]: http://www.catb.org/ch08s03.html#id2936650
[167]: http://www.catb.org/ch08s03.html#id2936912
[168]: http://www.catb.org/ch08s03.html#macroexpansion
[169]: http://www.catb.org/ch08s03.html#id2937424
[170]: http://www.catb.org/generationchapter.html
[171]: http://www.catb.org/ch09s01.html
[172]: http://www.catb.org/ch09s01.html#id2939746
[173]: http://www.catb.org/ch09s01.html#bayes_spam
[174]: http://www.catb.org/ch09s01.html#fetchmailconf
[175]: http://www.catb.org/ch09s02.html
[176]: http://www.catb.org/ch09s02.html#id2938615
[177]: http://www.catb.org/ch09s02.html#htmlgen
[178]: http://www.catb.org/configurationchapter.html
[179]: http://www.catb.org/ch10s01.html
[180]: http://www.catb.org/ch10s02.html
[181]: http://www.catb.org/ch10s03.html
[182]: http://www.catb.org/ch10s03.html#id2942210
[183]: http://www.catb.org/ch10s03.html#id2942358
[184]: http://www.catb.org/ch10s04.html
[185]: http://www.catb.org/ch10s04.html#id2942463
[186]: http://www.catb.org/ch10s04.html#id2942749
[187]: http://www.catb.org/ch10s04.html#id2942882
[188]: http://www.catb.org/ch10s04.html#id2947980
[189]: http://www.catb.org/ch10s05.html
[190]: http://www.catb.org/ch10s05.html#id2948149
[191]: http://www.catb.org/ch10s05.html#id2950162
[192]: http://www.catb.org/ch10s06.html
[193]: http://www.catb.org/ch10s06.html#fetchmail_environment
[194]: http://www.catb.org/ch10s06.html#id2950578
[195]: http://www.catb.org/ch10s07.html
[196]: http://www.catb.org/interfacechapter.html
[197]: http://www.catb.org/ch11s01.html
[198]: http://www.catb.org/ch11s02.html
[199]: http://www.catb.org/ch11s03.html
[200]: http://www.catb.org/ch11s04.html
[201]: http://www.catb.org/ch11s04.html#id2951734
[202]: http://www.catb.org/ch11s05.html
[203]: http://www.catb.org/ch11s06.html
[204]: http://www.catb.org/ch11s06.html#id2957637
[205]: http://www.catb.org/ch11s06.html#id2957916
[206]: http://www.catb.org/ch11s06.html#id2958032
[207]: http://www.catb.org/ch11s06.html#id2958116
[208]: http://www.catb.org/ch11s06.html#id2958199
[209]: http://www.catb.org/ch11s06.html#id2958336
[210]: http://www.catb.org/ch11s06.html#id2958491
[211]: http://www.catb.org/ch11s06.html#id2958899
[212]: http://www.catb.org/ch11s06.html#id2959821
[213]: http://www.catb.org/ch11s06.html#id2959928
[214]: http://www.catb.org/ch11s07.html
[215]: http://www.catb.org/ch11s07.html#id2960228
[216]: http://www.catb.org/ch11s08.html
[217]: http://www.catb.org/ch11s09.html
[218]: http://www.catb.org/optimizationchapter.html
[219]: http://www.catb.org/ch12s01.html
[220]: http://www.catb.org/ch12s02.html
[221]: http://www.catb.org/ch12s03.html
[222]: http://www.catb.org/ch12s04.html
[223]: http://www.catb.org/ch12s04.html#id2961306
[224]: http://www.catb.org/ch12s04.html#id2961372
[225]: http://www.catb.org/ch12s04.html#binary_caches
[226]: http://www.catb.org/complexitychapter.html
[227]: http://www.catb.org/ch13s01.html
[228]: http://www.catb.org/ch13s01.html#id2964646
[229]: http://www.catb.org/ch13s01.html#id2964843
[230]: http://www.catb.org/ch13s01.html#id2961759
[231]: http://www.catb.org/ch13s01.html#id2961870
[232]: http://www.catb.org/ch13s01.html#id2963237
[233]: http://www.catb.org/ch13s02.html
[234]: http://www.catb.org/ch13s02.html#id2963445
[235]: http://www.catb.org/ch13s02.html#vi_complexity
[236]: http://www.catb.org/ch13s02.html#id2963798
[237]: http://www.catb.org/ch13s02.html#emacs_editing
[238]: http://www.catb.org/ch13s02.html#id2967110
[239]: http://www.catb.org/ch13s03.html
[240]: http://www.catb.org/ch13s03.html#id2967267
[241]: http://www.catb.org/ch13s03.html#id2967642
[242]: http://www.catb.org/ch13s03.html#id2967765
[243]: http://www.catb.org/ch13s04.html
[244]: http://www.catb.org/implementation.html
[245]: http://www.catb.org/languageschapter.html
[246]: http://www.catb.org/ch14s01.html
[247]: http://www.catb.org/why_not_c.html
[248]: http://www.catb.org/ch14s03.html
[249]: http://www.catb.org/ch14s04.html
[250]: http://www.catb.org/ch14s04.html#c_language
[251]: http://www.catb.org/ch14s04.html#cc_language
[252]: http://www.catb.org/ch14s04.html#sh
[253]: http://www.catb.org/ch14s04.html#perl
[254]: http://www.catb.org/ch14s04.html#tcl
[255]: http://www.catb.org/ch14s04.html#python_language
[256]: http://www.catb.org/ch14s04.html#java
[257]: http://www.catb.org/ch14s04.html#emacs_lisp_language
[258]: http://www.catb.org/ch14s05.html
[259]: http://www.catb.org/ch14s06.html
[260]: http://www.catb.org/toolschapter.html
[261]: http://www.catb.org/ch15s01.html
[262]: http://www.catb.org/ch15s02.html
[263]: http://www.catb.org/ch15s02.html#vi_literacy
[264]: http://www.catb.org/ch15s02.html#id2979540
[265]: http://www.catb.org/ch15s02.html#id2979678
[266]: http://www.catb.org/ch15s03.html
[267]: http://www.catb.org/ch15s03.html#id2979797
[268]: http://www.catb.org/ch15s03.html#id2986324
[269]: http://www.catb.org/ch15s04.html
[270]: http://www.catb.org/ch15s04.html#id2986550
[271]: http://www.catb.org/ch15s04.html#id2986902
[272]: http://www.catb.org/ch15s04.html#id2987148
[273]: http://www.catb.org/ch15s04.html#id2987644
[274]: http://www.catb.org/ch15s05.html
[275]: http://www.catb.org/ch15s05.html#id2988357
[276]: http://www.catb.org/ch15s05.html#id2988464
[277]: http://www.catb.org/ch15s05.html#id2988503
[278]: http://www.catb.org/ch15s05.html#id2988625
[279]: http://www.catb.org/ch15s06.html
[280]: http://www.catb.org/ch15s07.html
[281]: http://www.catb.org/ch15s08.html
[282]: http://www.catb.org/ch15s08.html#id2989559
[283]: http://www.catb.org/ch15s08.html#id2989677
[284]: http://www.catb.org/ch15s08.html#id2989781
[285]: http://www.catb.org/ch15s08.html#id2989869
[286]: http://www.catb.org/ch15s08.html#id2989926
[287]: http://www.catb.org/reusechapter.html
[288]: http://www.catb.org/ch16s01.html
[289]: http://www.catb.org/ch16s02.html
[290]: http://www.catb.org/ch16s03.html
[291]: http://www.catb.org/ch16s04.html
[292]: http://www.catb.org/ch16s05.html
[293]: http://www.catb.org/ch16s06.html
[294]: http://www.catb.org/ch16s07.html
[295]: http://www.catb.org/ch16s07.html#id2991059
[296]: http://www.catb.org/ch16s07.html#id2993547
[297]: http://www.catb.org/ch16s07.html#id2993874
[298]: http://www.catb.org/community.html
[299]: http://www.catb.org/portabilitychapter.html
[300]: http://www.catb.org/c_evolution.html
[301]: http://www.catb.org/c_evolution.html#id2998213
[302]: http://www.catb.org/c_evolution.html#id2994334
[303]: http://www.catb.org/ch17s02.html
[304]: http://www.catb.org/ch17s02.html#id2994594
[305]: http://www.catb.org/ch17s02.html#id2999310
[306]: http://www.catb.org/ch17s02.html#id2999366
[307]: http://www.catb.org/ietf_process.html
[308]: http://www.catb.org/ch17s04.html
[309]: http://www.catb.org/ch17s05.html
[310]: http://www.catb.org/ch17s05.html#id3000303
[311]: http://www.catb.org/ch17s05.html#id3000882
[312]: http://www.catb.org/ch17s05.html#id3000984
[313]: http://www.catb.org/ch17s06.html
[314]: http://www.catb.org/ch17s07.html
[315]: http://www.catb.org/documentationchapter.html
[316]: http://www.catb.org/ch18s01.html
[317]: http://www.catb.org/ch18s02.html
[318]: http://www.catb.org/ch18s02.html#id3001392
[319]: http://www.catb.org/ch18s02.html#id3001522
[320]: http://www.catb.org/ch18s03.html
[321]: http://www.catb.org/ch18s03.html#id3001604
[322]: http://www.catb.org/ch18s03.html#id3001898
[323]: http://www.catb.org/ch18s03.html#id3002206
[324]: http://www.catb.org/ch18s03.html#id3002268
[325]: http://www.catb.org/ch18s03.html#id3002291
[326]: http://www.catb.org/ch18s03.html#id3002310
[327]: http://www.catb.org/ch18s04.html
[328]: http://www.catb.org/ch18s05.html
[329]: http://www.catb.org/ch18s05.html#id3006015
[330]: http://www.catb.org/ch18s05.html#id3006182
[331]: http://www.catb.org/ch18s05.html#db_toolchain
[332]: http://www.catb.org/ch18s05.html#id3006742
[333]: http://www.catb.org/ch18s05.html#id3007022
[334]: http://www.catb.org/ch18s05.html#id3007143
[335]: http://www.catb.org/ch18s05.html#id3007192
[336]: http://www.catb.org/ch18s05.html#id3007297
[337]: http://www.catb.org/ch18s06.html
[338]: http://www.catb.org/opensourcechapter.html
[339]: http://www.catb.org/ch19s01.html
[340]: http://www.catb.org/ch19s02.html
[341]: http://www.catb.org/ch19s02.html#patching
[342]: http://www.catb.org/ch19s02.html#naming
[343]: http://www.catb.org/ch19s02.html#develpractice
[344]: http://www.catb.org/ch19s02.html#distpractice
[345]: http://www.catb.org/ch19s02.html#communication
[346]: http://www.catb.org/ch19s03.html
[347]: http://www.catb.org/ch19s04.html
[348]: http://www.catb.org/ch19s05.html
[349]: http://www.catb.org/ch19s05.html#id3014860
[350]: http://www.catb.org/ch19s05.html#id3014890
[351]: http://www.catb.org/ch19s05.html#id3014963
[352]: http://www.catb.org/ch19s05.html#id3015011
[353]: http://www.catb.org/ch19s05.html#id3015063
[354]: http://www.catb.org/futurechapter.html
[355]: http://www.catb.org/ch20s01.html
[356]: http://www.catb.org/plan9.html
[357]: http://www.catb.org/ch20s03.html
[358]: http://www.catb.org/ch20s03.html#id3015538
[359]: http://www.catb.org/ch20s03.html#id3015724
[360]: http://www.catb.org/ch20s03.html#id3015838
[361]: http://www.catb.org/ch20s03.html#id3015895
[362]: http://www.catb.org/ch20s03.html#id3015943
[363]: http://www.catb.org/ch20s03.html#id3016077
[364]: http://www.catb.org/ch20s03.html#id3016155
[365]: http://www.catb.org/ch20s03.html#id3019078
[366]: http://www.catb.org/ch20s03.html#id3019113
[367]: http://www.catb.org/ch20s03.html#id3019140
[368]: http://www.catb.org/ch20s03.html#id3019193
[369]: http://www.catb.org/ch20s04.html
[370]: http://www.catb.org/ch20s05.html
[371]: http://www.catb.org/ch20s06.html
[372]: http://www.catb.org/apa.html
[373]: http://www.catb.org/apb.html
[374]: http://www.catb.org/apc.html
[375]: http://www.catb.org/unix_koans.html
[376]: http://www.catb.org/introduction.html
[377]: http://www.catb.org/ten-thousand.html
[378]: http://www.catb.org/script-kiddie.html
[379]: http://www.catb.org/two_paths.html
[380]: http://www.catb.org/methodology-consultant.html
[381]: http://www.catb.org/gui-programmer.html
[382]: http://www.catb.org/zealot.html
[383]: http://www.catb.org/unix-nature.html
[384]: http://www.catb.org/end-user.html
[385]: http://www.catb.org/ch02s01.html#pdp7
[386]: http://www.catb.org/ch03s02.html#os-history
[387]: http://www.catb.org/ch04s01.html#hatton
[388]: http://www.catb.org/ch04s04.html#libgimp
[389]: http://www.catb.org/ch06s01.html#id2909476
[390]: http://www.catb.org/ch06s01.html#id2910036
[391]: http://www.catb.org/ch06s01.html#id2914147
[392]: http://www.catb.org/ch08s01.html#taxonomy
[393]: http://www.catb.org/ch11s04.html#xcalc
[394]: http://www.catb.org/ch11s06.html#rogue
[395]: http://www.catb.org/ch11s06.html#id2959548
[396]: http://www.catb.org/ch11s07.html#id2960323
[397]: http://www.catb.org/ch13s01.html#complexity-sources
[398]: http://www.catb.org/ch18s05.html#docfig1
[399]: http://www.catb.org/ch18s05.html#docfig2
[400]: http://www.catb.org/ch18s05.html#docfig3
[401]: http://www.catb.org/ch08s02.html#regexp_table
[402]: http://www.catb.org/ch08s02.html#regexp_intro
[403]: http://www.catb.org/ch14s05.html#lang_usage
[404]: http://www.catb.org/ch14s06.html#x_toolkits
[405]: http://www.catb.org/ch05s01.html#passwd
[406]: http://www.catb.org/ch05s01.html#newsrc
[407]: http://www.catb.org/ch05s02.html#fortune
[408]: http://www.catb.org/ch05s02.html#planets
[409]: http://www.catb.org/ch05s02.html#xml_example
[410]: http://www.catb.org/ch05s02.html#ini_example
[411]: http://www.catb.org/ch05s03.html#smtp_example
[412]: http://www.catb.org/ch05s03.html#pop_example
[413]: http://www.catb.org/ch05s03.html#imap_example
[414]: http://www.catb.org/ch06s01.html#fetchmail_session
[415]: http://www.catb.org/ch06s01.html#SNG_Example
[416]: http://www.catb.org/ch07s02.html#pic2graph
[417]: http://www.catb.org/ch08s02.html#glade_example
[418]: http://www.catb.org/ch08s02.html#m4_macro
[419]: http://www.catb.org/ch08s02.html#xslt_example
[420]: http://www.catb.org/ch08s02.html#pic_source
[421]: http://www.catb.org/ch08s02.html#hogwarts
[422]: http://www.catb.org/ch08s02.html#rsa
[423]: http://www.catb.org/ch09s01.html#fetchmail_example
[424]: http://www.catb.org/ch09s01.html#conf_dump
[425]: http://www.catb.org/ch09s01.html#solution_code
[426]: http://www.catb.org/ch09s01.html#solution_caller
[427]: http://www.catb.org/ch09s02.html#ascii-splash
[428]: http://www.catb.org/ch09s02.html#star_list
[429]: http://www.catb.org/ch09s02.html#colon_table
[430]: http://www.catb.org/ch10s03.html#netrc
[431]: http://www.catb.org/ch10s06.html#X_config
[432]: http://www.catb.org/ch18s03.html#troffexample1
[433]: http://www.catb.org/ch18s03.html#man_example
[434]: http://www.catb.org/ch19s02.html#tar_trick