Software Development Documentation

The Art of Unix Programming

Recursive Make Considered Harmful This paper talks about the build process for large projects, and some of the pitfalls when using Make (local copy).

UNIX Security

Secure Programming for Linux and Unix HOWTO

Secure Portability (local copy)

Setuid Demystified (local copy)
The murky issue of changing process identity: revising "setuid demystified" (local copy)

Linux Programming Resources

Linux Kernel Newbies

Basic X Concepts


Implementing AF-independent applications

Lessons in Packaging Linux Applications

The Common Gateway Interface

Computer Programming Algorithms Directory


PLEAC The Programming Language Examples Alike Cookbook, a suite of common programming problems solved in various programming languages.

Assembly Language

The Art of Assembly Language Programming (local copy of AoA/Linux).


Recommended C Style and Coding Standards

How to Write Shared Libraries
Good Practices in Library Design, Implementation, and Maintenance

The Glib Object system


Industrial Strength C++ (local copy).


Dive Into Python, Python for experienced programmers (local copy).

Style Guide for Python Code


git distributed version control system

A Visual Git Reference
git merge vs. rebase
Changing history, or How to Git pretty


Push existing local repository into newly created remote one

git remote add origin
git push --set-upstream origin --all

Migrate repository to new server

git clone --mirror
cd example.git
git remote set-url origin
git push --mirror

Maintain upstream branch

Add upstream repository
git remote add upstream
git fetch upstream
Optionally add upstream branch
git checkout -b upstream upstream/master
git config branch.upstream.remote origin
Update upstream branch (pull upstream master into upstream branch)
git checkout upstream
git pull upstream master

Make branch identical to another

git merge --strategy=ours branch
git diff --binary branch | git apply --reverse --index
git commit --amend

Remove unreferenced objects

git gc --aggressive --prune=now

Get list of commit hashes starting at the initial one

git log --topo-order --reverse --pretty='format:%H'


The Joel Test: 12 Steps to Better Code

ASCII and Unicode quotation marks