liw.fi

RecentChanges

Recent changes to this wiki:

diff --git a/sidebar.mdwn b/sidebar.mdwn
index b929106..48e137d 100644
--- a/sidebar.mdwn
+++ b/sidebar.mdwn
@@ -9,6 +9,7 @@
 * [Dimbola](http://dimbola.org/)
 * [Free Thursday](http://free-thursday.pieni.net/)
 * [Kalastuskievari](http://kalastuskievari.fi/)
+* [Koha](http://koha-community.org/)
 
 <hr />
 

diff --git a/links.mdwn b/links.mdwn
index 26839e0..80a5fd7 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -44,6 +44,7 @@ incarnation of that web page.
 [NZPUG](http://nzpug.org/)
 [Wellington.geek.nz](http://wellington.geek.nz/)
 [Thursday night curry](http://wellington.thursdaynightcurry.com/)
+[Python Edinburgh](http://www.pythonedinburgh.org/)
 
 **Upstreams:**
 [Sound Converter](http://soundconverter.berlios.de/)

diff --git a/links.mdwn b/links.mdwn
index ab2e6f5..26839e0 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -32,6 +32,8 @@ incarnation of that web page.
 [lars@catalyst](http://qa.debian.org/developer.php?login=lars%40catalyst.net.nz&comaint=yes)
 [Freedom Box](http://wiki.debian.org/FreedomBox)
 [Freedom Box at Alioth](https://alioth.debian.org/projects/freedombox/)
+[DEP5](http://dep.debian.net/deps/dep5)
+[DEP5 wiki](http://wiki.debian.org/Proposals/CopyrightFormat)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/sidebar.mdwn b/sidebar.mdwn
index 325fccd..b929106 100644
--- a/sidebar.mdwn
+++ b/sidebar.mdwn
@@ -5,6 +5,7 @@
 #### **See also**
 
 * [[My CV|cv]]
+* [Branchable](http://www.branchable.com/)
 * [Dimbola](http://dimbola.org/)
 * [Free Thursday](http://free-thursday.pieni.net/)
 * [Kalastuskievari](http://kalastuskievari.fi/)

diff --git a/swimming-upstream.mdwn b/swimming-upstream.mdwn
index 4982273..fdd1cdf 100644
--- a/swimming-upstream.mdwn
+++ b/swimming-upstream.mdwn
@@ -1,9 +1,6 @@
 [[!meta title="Swimming upstream"]]
 [[!tag talk]]
 
-Swimming upstream: Challenges in packaging Koha for Debian
-==========================================================
-
 This is the text of the talk I gave at Debconf10, 2010-08-07.
 See also: 
 

diff --git a/cv.mdwn b/cv.mdwn
index cdb39ed..e8de605 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -124,7 +124,8 @@ use, with AutoCAD.
     to about 1997. Wrote the 
     [Linux System Administrators' Guide](http://tldp.org/guides.html),
     since taken over by others.
-  - [Debian](http://www.debian.org/) development 1996-2009. Now retired.
+  - [Debian](http://www.debian.org/) development 1995- (with two periods
+    of retirement).
   - [Ubuntu](http://www.ubuntu.com/) development 2007-2009. Now retired.
 * Photography. I've been an amateur photographer since 2001, but do not
   currently publish my pictures anywhere.

diff --git a/swimming-upstream.mdwn b/swimming-upstream.mdwn
index 48e03ea..4982273 100644
--- a/swimming-upstream.mdwn
+++ b/swimming-upstream.mdwn
@@ -7,8 +7,8 @@ Swimming upstream: Challenges in packaging Koha for Debian
 This is the text of the talk I gave at Debconf10, 2010-08-07.
 See also: 
 
-* <http://wiki.debian.org/UpstreamGuide>
-* [[slides.pdf]]
+* <http://wiki.debian.org/UpstreamGuide> -- Debian wiki page for this
+* <http://files.liw.fi/swimming-upstream.pdf> -- slides (5.5 MiB)
 
 ---
 

diff --git a/swimming-upstream.mdwn b/swimming-upstream.mdwn
new file mode 100644
index 0000000..48e03ea
--- /dev/null
+++ b/swimming-upstream.mdwn
@@ -0,0 +1,318 @@
+[[!meta title="Swimming upstream"]]
+[[!tag talk]]
+
+Swimming upstream: Challenges in packaging Koha for Debian
+==========================================================
+
+This is the text of the talk I gave at Debconf10, 2010-08-07.
+See also: 
+
+* <http://wiki.debian.org/UpstreamGuide>
+* [[slides.pdf]]
+
+---
+
+I was a Debian developer for many years.
+Last year I decided to leave Debian,
+and see what else there is in the world.
+This is the story of what happened.
+
+In short, I have become an upstream developer instead. 
+For three months earlier this year I worked on a project called Koha. 
+This talk is about what I've learned about Debian from an upstream point
+of view, 
+and about upstream projects from a Debian point of view.
+
+I don't need to tell you about Debian.
+
+Koha is an integrated library management system.
+That's the kind of library that has books in it.
+Koha is used by many public and private libraries around the world.
+It was originally developed in New Zealand, 
+and has been free software since the beginning.
+Koha is now about ten years old,
+consists of thousands of lines of perl code,
+and is quite a mature product.
+
+I am going to use Koha as an example of an upstream project.
+My talk is not just about Koha,
+but about all kinds of upstream projects.
+
+The thing about building a Linux distribution like Debian is that it's
+not just taking a bunch of upstream code and compiling that.
+There's oh so much more to do.
+All the software has to be configured and tweaked and patched to work together.
+
+Packaging an old, mature, somewhat crufty program like Koha for
+Debian can be a bit of an undertaking.
+Debian has decided to do many things in a particular way,
+but so has Koha.
+It's like two middle-aged people who've been single for decades falling
+in love and moving in together.
+They both want it, but both will need to adapt, 
+and both will need to give up some of their little quirks.
+
+In this case, the Koha upstream project wanted to have Debian packages
+made for Koha.
+Many of the Koha developers prefer Debian as the platform on which to
+run Koha, but installation and upgrading from source was a sore point.
+Not just of Koha itself,
+but also of its dependencies.
+
+Koha is a web application,
+and that means it will need to integrate with at least a web server
+and a database engine.
+It is written in Perl,
+and relies on dozens of CPAN modules.
+
+The CPAN modules were the first stumbling block.
+Not all of them were packaged for Debian.
+In fact, dozens of them are missing from the Debian stable release.
+Even if the module is there, it is usually too old for Koha.
+
+Luckily, most of the missing modules were in squeeze.
+Five were missing.
+What should an upstream do in this situation?
+In the Koha case, 
+it was happily easy to make Debian packages for the missing CPAN modules, 
+so that's what I did.
+
+In general, it is probably not feasible for upstream to package
+missing dependencies themselves.
+It is also not sensible for upstreams to restrict themselves too much.
+There are a lot of things outside of Debian that will be very helpful
+for upstream development.
+If upstream can make use of yet another CPAN module,
+that can save them days, weeks, even years of coding.
+This is code re-use at its best.
+
+* Lessons: 
+  - upstream should avoid unpackaged dependencies, unless that's hard
+  - Debian should package everything so that upstream can
+    make use of the best tools for them
+
+I also joined the Debian pkg-perl team,
+who were very helpful in getting the packages in good shape,
+and kindly uploaded them into Debian.
+This was important so that Koha would not have to provide and maintain
+the packages outside of Debian.
+Doing that would have been entirely possible,
+but would have been more effort,
+and would certainly have led to duplicated effort,
+when other people did the same thing.
+As proof of that,
+for all five CPAN modules I packaged,
+the popcon count became nonzero within the first day, 
+even though nothing in Debian depended on them.
+People use CPAN a lot.
+
+* Lessons:
+  - CPAN makes it very easy to make Debian packages
+  - pkg-perl in Debian rocks (gregoa especially helped a lot)
+
+With those CPAN modules packaged, I was able to run the Koha test suite.
+This gave much confidence that Koha would actually work once installed.
+
+The next step was to make sure it could talk to the web server and
+the database engine.
+Specifically, Apache and MySQL.
+
+At this point, it turned out that most of the hard questions had already
+been discussed and solved within Debian.
+Equally importantly, 
+they had been documented in the web-apps policy
+and the database policy for Debian.
+Before my Koha work, I had no experience with these Debian policies,
+and I did not fully appreciate how helpful they are.
+
+The Debian policies, and the tools written to support the policies,
+made it very easy to make a rudimentary Koha package that would
+integrate with Apache and MySQL.
+
+* Lessons:
+  - upstream should have a test suite
+  - Debian Policy and sub-policies rock
+  - dbconfig-common: wow
+  - dh: wow
+
+Well, when I said it was really easy, I was simplifying things a bit.
+There's a feature in Koha that made it a little bit more work than
+should have been required.
+
+The Koha web application is divided into two parts:
+a public interface for library customers,
+and a private interface for library staff.
+For no good reason at all,
+Koha decided that these should be on different URLs.
+In order to have a Koha package that worked out of the box I had to
+use two different ports.
+That's ugly, and not without problems.
+
+I expect Koha to fix that in the future.
+It would be better if they did not require different URLs for the two sites,
+and instead had a single site.
+
+This is an example of the kind of thing upstreams do when they don't
+know what it means to build a distribution.
+They make design decisions in the dark.
+And the decisions make sense to them,
+and probably work fine from their perspective.
+The trick is to get them to see why Debian's point of view is right.
+
+* Lessons:
+  - upstreams will make design decisions that make sense for them,
+    but seem stupid for distros
+  - distros should work with upstreams to fix these things
+
+The next step was to make it possible to run multiple Koha instances
+on the same host.
+The Koha packaging work I was doing was funded by a New Zealand company, 
+Catalyst IT, 
+who will provide a hosted Koha solution with full freedom.
+This is much easier if they don't need to set up a new server for each 
+customer.
+
+Here I ran into some upstream problems.
+Koha comes with configuration file templates for Apache.
+I needed to butcher, er, tweak these a lot,
+to allow them to be easily adapted to multiple hosts.
+
+There were several other configuration files as well that needed tweaking.
+The files were in a bunch of different syntaxes, since they were for
+tools written by different projects.
+
+The result was a set of configuration file templates that are divorced
+from what upstream actually provides.
+When Koha makes changes to its own templates,
+the templates in the Debian package will have to be adapted.
+This is obviously an area that is likely to attract bugs.
+The fix is to port my changes to the upstream files,
+and I expect that to happen,
+but did not want to make those changes while Koha was preparing a release.
+
+* Lessons:
+  - configuration is tricky

(Diff truncated)
diff --git a/links.mdwn b/links.mdwn
index 3b32188..ab2e6f5 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -31,6 +31,7 @@ incarnation of that web page.
 [pkg-perl](http://wiki.debian.org/Teams/DebianPerlGroup/)
 [lars@catalyst](http://qa.debian.org/developer.php?login=lars%40catalyst.net.nz&comaint=yes)
 [Freedom Box](http://wiki.debian.org/FreedomBox)
+[Freedom Box at Alioth](https://alioth.debian.org/projects/freedombox/)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/links.mdwn b/links.mdwn
index 5245c2b..3b32188 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -30,6 +30,7 @@ incarnation of that web page.
 [KVM](http://wiki.debian.org/KVM)
 [pkg-perl](http://wiki.debian.org/Teams/DebianPerlGroup/)
 [lars@catalyst](http://qa.debian.org/developer.php?login=lars%40catalyst.net.nz&comaint=yes)
+[Freedom Box](http://wiki.debian.org/FreedomBox)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/rules.mdwn b/rules.mdwn
index 2b0bf9b..3bd2c5a 100644
--- a/rules.mdwn
+++ b/rules.mdwn
@@ -15,3 +15,5 @@ Gibbs, yay.
 9. Don't be late in telling you're late.
 10. If you cannot automate it, make a checklist out of it.
 11. Be careful what you reward, because you will get more of it.
+12. Be careful what you measure, because you will optimize for that.
+13. Don't debate with analogies.

diff --git a/links.mdwn b/links.mdwn
index fec3588..5245c2b 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -87,7 +87,7 @@ incarnation of that web page.
 [Python+gobject](http://web.archive.org/web/20080214201849/http://www.sicem.biz/personal/lgs/docs/gobject-python/gobject-tutorial.html)
 [GNOME platform](http://library.gnome.org/devel/platform-overview/stable/)
 [C-faq](http://c-faq.com/top.html)
-[K&amp;R2 answers](http://users.powernet.co.uk/eton/kandr2/index.html)
+[K&amp;R2 answers](http://clc-wiki.net/wiki/K%26R2_solutions)
 [The C10K problem](http://www.kegel.com/c10k.html)
 [Portland Pattern Repository](http://c2.com/cgi/wiki)
 [Pentomino](http://yucs.org/~gnivasch/pentomino/)

diff --git a/links.mdwn b/links.mdwn
index 429f8fb..fec3588 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -173,3 +173,4 @@ incarnation of that web page.
 [Pyramid Method](http://calnewport.com/blog/2009/06/03/the-pyramid-method-a-simple-strategy-for-becoming-exceptionally-good)
 [OnStartups Answers](http://answers.onstartups.com/)
 [Nerd handbook](http://www.randsinrepose.com/archives/2007/11/11/the_nerd_handbo.html)
+[Openpgp key checks](https://we.riseup.net/riseuplabs+paow/openpgp-best-practices#openpgp-key-checks)

Added a comment: finddup
diff --git a/dupfiles/comment_1_2802aca091e4b19878aedb50c165dcc5._comment b/dupfiles/comment_1_2802aca091e4b19878aedb50c165dcc5._comment
new file mode 100644
index 0000000..afe26a0
--- /dev/null
+++ b/dupfiles/comment_1_2802aca091e4b19878aedb50c165dcc5._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="https://getopenid.com/Tobu/"
+ subject="finddup"
+ date="2010-07-18T23:31:56Z"
+ content="""
+`finddup` is serving me well. It is in the `perforate` package.
+
+Typical use:
+
+    finddup -l -i -d ~/a -d ~/b
+
+-l to link, -i to ignore perms, -d to list several directories.
+
+A tricky case is unifying inodes that already have multiple hardlinks. If you haven't found all the inodes and relink the file, you can actually end up using more space.
+"""]]

diff --git a/obnam.mdwn b/obnam.mdwn
new file mode 100644
index 0000000..339b6c4
--- /dev/null
+++ b/obnam.mdwn
@@ -0,0 +1,6 @@
+[[!meta title="Obnam"]]
+[[!tag program]]
+
+Obnam is my backup application.
+The official home page is <http://braawi.org/obnam/>.
+This page exists here so that people who know Obnam is mine can easily find it.

diff --git a/release.mdwn b/release.mdwn
index 2bf22c7..a1ffd32 100644
--- a/release.mdwn
+++ b/release.mdwn
@@ -15,3 +15,4 @@
 1. Tag the revision in version control.
 1. Push version control.
 1. Update bug tracker. Push it if it is distributed.
+1. Announce on the relevant forums.

diff --git a/release.mdwn b/release.mdwn
index 35094cd..2bf22c7 100644
--- a/release.mdwn
+++ b/release.mdwn
@@ -14,3 +14,4 @@
 1. Build and upload for other architectures too, if relevant.
 1. Tag the revision in version control.
 1. Push version control.
+1. Update bug tracker. Push it if it is distributed.

diff --git a/links.mdwn b/links.mdwn
index 21d14cf..429f8fb 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -36,7 +36,7 @@ incarnation of that web page.
 [decss](http://mjr.iki.fi/decss/)
 [Driver check](http://kmuto.jp/debian/hcl/)
 
-**User/other groups:***
+**User/other groups:**
 [NZPUG](http://nzpug.org/)
 [Wellington.geek.nz](http://wellington.geek.nz/)
 [Thursday night curry](http://wellington.thursdaynightcurry.com/)

diff --git a/links.mdwn b/links.mdwn
index daadb84..21d14cf 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -149,8 +149,10 @@ incarnation of that web page.
 [Redoxx](http://www.redoxx.com/)
 [NZ public holidays](http://www.ers.dol.govt.nz/holidays_act_2003/dates/2010_13.html)
 
-**Places to visit:***
+**Places to visit:**
 [Guédelon](http://www.guedelon.fr/en/)
+[Grand Canyon](http://en.wikipedia.org/wiki/Grand_Canyon)
+[Canyonlands](http://en.wikipedia.org/wiki/Canyonlands)
 
 **Cooking:**
 [A No-Frills Kitchen Still Cooks](http://www.nytimes.com/2007/05/09/dining/09mini.html?ex=1336363200&amp;en=e39e14cf6af1b0bc&amp;ei=5090&amp;partner=rssuserland&amp;emc=rss)

diff --git a/links.mdwn b/links.mdwn
index 8e3c60b..daadb84 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -73,6 +73,7 @@ incarnation of that web page.
 **Other stores:**
 [Pukufirma Lynoure](http://www.lynoure.com/)
 [Rajala](http://www.rajala.fi/)
+[Paypal](https://www.paypal.com/)
 
 **Organizations:**
 [EFFI](http://www.effi.org/)

diff --git a/release.mdwn b/release.mdwn
index f878a11..35094cd 100644
--- a/release.mdwn
+++ b/release.mdwn
@@ -11,5 +11,6 @@
 1. Build again.
 1. Upload files.
   - `# dput code ../build-area/*.changes`
+1. Build and upload for other architectures too, if relevant.
 1. Tag the revision in version control.
 1. Push version control.

diff --git a/release.mdwn b/release.mdwn
new file mode 100644
index 0000000..f878a11
--- /dev/null
+++ b/release.mdwn
@@ -0,0 +1,15 @@
+[[!meta title="Software release checklist"]]
+[[!tag checklist]]
+
+1. Make sure everything is committed to version control.
+1. Run automatic tests.
+1. Update version number, `NEWS`, `debian/changelog`.
+1. Test-build upstream tarball, Debian packages, other release files.
+  - `# rm -rf ../build-area && bzr bd --native`
+1. Run `lintian` on Debian packages.
+1. Commit all release-time changes to version control.
+1. Build again.
+1. Upload files.
+  - `# dput code ../build-area/*.changes`
+1. Tag the revision in version control.
+1. Push version control.

diff --git a/links.mdwn b/links.mdwn
index 05930f8..8e3c60b 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -148,6 +148,9 @@ incarnation of that web page.
 [Redoxx](http://www.redoxx.com/)
 [NZ public holidays](http://www.ers.dol.govt.nz/holidays_act_2003/dates/2010_13.html)
 
+**Places to visit:***
+[Guédelon](http://www.guedelon.fr/en/)
+
 **Cooking:**
 [A No-Frills Kitchen Still Cooks](http://www.nytimes.com/2007/05/09/dining/09mini.html?ex=1336363200&amp;en=e39e14cf6af1b0bc&amp;ei=5090&amp;partner=rssuserland&amp;emc=rss)
 

diff --git a/btree.mdwn b/btree.mdwn
index 8641137..c946d0f 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -49,4 +49,5 @@ are your best hope.
 * Release tarballs and Debian packages:
   <http://code.liw.fi/debian/pool/main/p/python-btree/>
 * Bug tracking (SD): <http://code.liw.fi/btree/bugs/>
+* Blog entries: <http://blog.liw.fi/tag/btree/>
 * Copyright license: GNU GPL3 or later.

diff --git a/btree.mdwn b/btree.mdwn
index 246eb98..8641137 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -49,3 +49,4 @@ are your best hope.
 * Release tarballs and Debian packages:
   <http://code.liw.fi/debian/pool/main/p/python-btree/>
 * Bug tracking (SD): <http://code.liw.fi/btree/bugs/>
+* Copyright license: GNU GPL3 or later.

diff --git a/btree.mdwn b/btree.mdwn
index ee25e4c..246eb98 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -7,11 +7,11 @@ If you need to store and retrieve large amounts of data on disk,
 If you want to quickly look up data in memory, the Python
 `dict` class is probably what you need.
 However, if you want something for which neither is suitable,
-a B-tree might be helpful. It is, however, **pre-alpha** level
+a B-tree might be helpful. It is, however, **alpha** level
 software. It has never been used in a real application yet
 (unless you count [obnam](http://braawi.org/obnam/), the backup
 application the tree implementation was written for; obnam is
-also pre-alpha).
+also alpha).
 
 This is an implementation of particular kind of B-tree, based on research
 by Ohad Rodeh. See 
@@ -45,15 +45,7 @@ take care to create a new tree for further modifications, though.)
 Documentation is sparse. Docstrings and reading the code
 are your best hope.
 
-The code is available as a [bzr](http://bazaar.canonical.com/en/)
-branch:
-
-    bzr get http://code.liw.fi/btree/bzr/trunk/
-
-I will some day start making actual releases, but for now this is it.
-
-More stuff:
-
-* <http://code.liw.fi/btree/> &mdash; tarballs, etc.
-* <http://code.liw.fi/btree/bugs/> &mdash; [SD](http://syncwith.us/sd/)
-  bug repository for btree.
+* Version control: bzr get http://code.liw.fi/btree/bzr/trunk/
+* Release tarballs and Debian packages:
+  <http://code.liw.fi/debian/pool/main/p/python-btree/>
+* Bug tracking (SD): <http://code.liw.fi/btree/bugs/>

diff --git a/btree.mdwn b/btree.mdwn
index b618360..ee25e4c 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -36,6 +36,12 @@ does not decide where its nodes are stored: you provide a class that
 does that for it. I have two implementations of the `NodeStore` class,
 one for in-memory and one for on-disk storage.
 
+The tree attempts to guarantee this: all modifications you make will
+be safely stored in the node store when the btree.Forest.commit method
+is called. After that, unless you actually modify the committed tree
+yourself, it will be safe from further modifications. (You need to
+take care to create a new tree for further modifications, though.)
+
 Documentation is sparse. Docstrings and reading the code
 are your best hope.
 

diff --git a/btree.mdwn b/btree.mdwn
index 9b5fb09..b618360 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -19,11 +19,12 @@ by Ohad Rodeh. See
 for details on the data structure.
 This is the same data structure that [btrfs](http://btrfs.wiki.kernel.org/)
 uses.
-Note that my implementation probably differs from what the paper describes
-or what btrfs implements.
+Note that my implementation is independent from the btrfs one,
+and might differ from what the paper describes.
 
-The distinctive feature of this B-tree implementation is that a node is
-never modified. Instead, all updates are done by copy-on-write. Among
+The distinctive feature of this B-tree is that a node is
+never modified (sort-of). 
+Instead, all updates are done by copy-on-write. Among
 other things, this makes it easy to clone a tree, and modify only 
 the clone, while other processes access the original tree. This is
 utterly wonderful for my backup application, and that's the reason I wrote

diff --git a/btree.mdwn b/btree.mdwn
index ecbe9b5..9b5fb09 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -8,7 +8,10 @@ If you want to quickly look up data in memory, the Python
 `dict` class is probably what you need.
 However, if you want something for which neither is suitable,
 a B-tree might be helpful. It is, however, **pre-alpha** level
-software. It has never been used in a real application yet.
+software. It has never been used in a real application yet
+(unless you count [obnam](http://braawi.org/obnam/), the backup
+application the tree implementation was written for; obnam is
+also pre-alpha).
 
 This is an implementation of particular kind of B-tree, based on research
 by Ohad Rodeh. See 

diff --git a/ttystatus.mdwn b/ttystatus.mdwn
new file mode 100644
index 0000000..fa2514d
--- /dev/null
+++ b/ttystatus.mdwn
@@ -0,0 +1,20 @@
+[[!meta title="ttystatus: progress and status updates on terminals for Python"]]
+[[!tag program]]
+
+ttystatus is a Python library for showing progress reporting and status
+updates on terminals, for (Unix) command line programs. Output is 
+automatically adapted to the width of the terminal: truncated if it does
+not fit, and re-sized if the terminal size changes.
+
+Output is provided via widgets. Each widgets formats some data into
+a suitable form for output. It gets the data either via its initializer,
+or from key/value pairs maintained by the master object. The values are
+set by the user. Every time a value is updated, widgets get updated
+(although the terminal is only updated every so often to give user time
+to actually read the output).
+
+See example.py in the sources for an example of how to use the library.
+
+* bzr get http://code.liw.fi/ttystatus/bzr/trunk/
+
+Licenses under the GNU GPL version 3 or later.

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index b225aa4..76b252d 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -40,6 +40,7 @@ or e-mail me at liw@liw.fi. Thanks.
 * [Internet Archive](http://www.archive.org/details/feature_films)
 * [NerdTV](http://www.pbs.org/cringely/nerdtv/shows/)
 * [Patent Absurdity](http://patentabsurdity.com/)
+* [Pioneer One](http://vodo.net/pioneerone)
 * [the.scene](http://www.welcometothescene.com/)
 * [Sita Sings the Blues](http://www.sitasingstheblues.com/)
 * [Steal This Film](http://www.stealthisfilm.com/Part2/download.php)

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index f536b2b..b225aa4 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -17,6 +17,7 @@ or e-mail me at liw@liw.fi. Thanks.
 * [Projekti Lönnrot](http://www.lonnrot.net/) (in Finnish)
 * [World Digital Library](http://www.wdl.org/)
 * [Finnish Literature Society Digital Library](http://www.finlit.fi/kirjasto/digi/) (in Finnish)
+* [List of freely available programming books](http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books)
 
 # Bands, artists
 

diff --git a/links.mdwn b/links.mdwn
index ba8e6a7..05930f8 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -103,7 +103,7 @@ incarnation of that web page.
 [git tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
 [Test::More](http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm)
 [Devel::Cover](http://homepage.hispeed.ch/pjcj/testing_and_code_coverage/paper.html)
-[Python test tools taxonomy](http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy)
+[Python test tools taxonomy](http://packages.python.org/testing/)
 [SD](http://syncwith.us/sd/)
 [cil](http://github.com/andychilton/cil)
 

diff --git a/coverage-test-runner.mdwn b/coverage-test-runner.mdwn
index 2f92bce..792fc3b 100644
--- a/coverage-test-runner.mdwn
+++ b/coverage-test-runner.mdwn
@@ -39,7 +39,3 @@ option) any later version.
 
 * [trunk](http://code.liw.fi/coverage-test-runner/bzr/trunk/)
 * [trunk.debian](http://code.liw.fi/coverage-test-runner/bzr/trunk.debian/)
-
-# Bugs
-
-See the [[separate_bugs_page|bugs]].

diff --git a/hackingdoc.mdwn b/hackingdoc.mdwn
new file mode 100644
index 0000000..b08db02
--- /dev/null
+++ b/hackingdoc.mdwn
@@ -0,0 +1,26 @@
+[[!meta title="Checklist for HACKING or README"]]
+[[!tag checklist]]
+
+For many free software projects it would be good to have a short document
+explaining how to get started with modifying it. It is customary to put
+this information in the `README` file. Some people consider `README` to
+be more suitable for end-users or people installing from source, and
+so the name `HACKING` is also used.
+
+This is a checklist of things such a document might include.
+
+* How to build, for development, if it is differnet from normal builds.
+  (Normal build instructions should go into `README` or `INSTALL`.)
+* Canonical version control repositories, for people who get a tarball.
+* Any build dependencies needed, and possibly where to get them.
+* How to run automatic tests.
+* Any other helper tools for figuring out, e.g., how to run profiles and
+  performance tests.
+* How the source tree is laid out, and where to find the major components
+  of the program.
+* Where and how to send patches.
+* Coding style issues, if any are unusual.
+
+There may be more. If you can think of any, please add (this is a
+wiki, after all.) If you know of an existing checklist to replace
+this page, please add a link there.

diff --git a/links.mdwn b/links.mdwn
index 9fd4c20..ba8e6a7 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -107,6 +107,9 @@ incarnation of that web page.
 [SD](http://syncwith.us/sd/)
 [cil](http://github.com/andychilton/cil)
 
+**Cool devices:**
+[Tonido](http://www.futurenow.net.au/index.php/tonido-details)
+
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)
 [abuse.net relay tester](http://www.abuse.net/relay.html)

diff --git a/lru.mdwn b/lru.mdwn
new file mode 100644
index 0000000..ddc0534
--- /dev/null
+++ b/lru.mdwn
@@ -0,0 +1,15 @@
+[[!meta title="Least-recently-used cache in Python"]]
+[[!tag program]]
+
+A pure-Python implementation of an 
+[LRU cache](http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used).
+Basically, it is a mapping of keys to values with a maximum size
+(expressed in number of keys),
+which drops the key that has been unused for the longest time,
+if the number of keys grows too big.
+
+This implementation attempts to be reasonably fast, but in my hubris,
+I have not benchmarked it against any of the implementations found in
+PyPi. (Please do that and tell me if I'm an idiot.)
+
+* <http://code.liw.fi/python-lru/bzr/trunk/> &mdash; bzr branch

diff --git a/links.mdwn b/links.mdwn
index 3c8af43..9fd4c20 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -58,6 +58,7 @@ incarnation of that web page.
 [Damicon Kraa](http://www.damicon.fi/)
 [DSE](http://www.dse.co.nz/dse.shop/)
 [NiceGear](http://nicegear.co.nz/)
+[Harvey Norman](http://www.harveynorman.co.nz/)
 
 **Approved content sources:**
 [Equal Dreams](http://www.equaldreams.com/)

diff --git a/seivot.mdwn b/seivot.mdwn
index b56761a..b46f22f 100644
--- a/seivot.mdwn
+++ b/seivot.mdwn
@@ -4,5 +4,9 @@
 Seivot is a program I wrote with Richard Braakman to run simple
 benchmarks for backup programs.
 It is meant to help me develop [obnam](http://braawi.org/obnam/).
+You need Python, and my [genbackupdata](http://braawi.org/genbackupdata/)
+utility.
 
 It is licensed under the GPL, version 3 or later.
+
+* <http://code.liw.fi/seivot/bzr/trunk/> &mdash; bzr branch for the code.

diff --git a/seivot.mdwn b/seivot.mdwn
new file mode 100644
index 0000000..b56761a
--- /dev/null
+++ b/seivot.mdwn
@@ -0,0 +1,8 @@
+[[!meta title="seivot: backup benchmarking"]]
+[[!tag program]]
+
+Seivot is a program I wrote with Richard Braakman to run simple
+benchmarks for backup programs.
+It is meant to help me develop [obnam](http://braawi.org/obnam/).
+
+It is licensed under the GPL, version 3 or later.

diff --git a/links.mdwn b/links.mdwn
index cbe49c8..3c8af43 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -119,6 +119,7 @@ incarnation of that web page.
 [feed validator](http://feedvalidator.org/)
 [showmyip](http://www.showmyip.com/)
 [pagerank](http://www.prchecker.info/check_page_rank.php)
+[down?](http://downforeveryoneorjustme.com/)
 
 **Photography:**
 [photo.net](http://photo.net/)

removed
diff --git a/liw-by-soile-madrid.jpg b/liw-by-soile-madrid.jpg
deleted file mode 100644
index f3e598a..0000000
Binary files a/liw-by-soile-madrid.jpg and /dev/null differ

removed
diff --git a/gratis-content/discussion.mdwn b/gratis-content/discussion.mdwn
deleted file mode 100644
index e4258c4..0000000
--- a/gratis-content/discussion.mdwn
+++ /dev/null
@@ -1,2 +0,0 @@
-The [Kahvi Collective](http://kahvi.org/) is an excellent source of free techno/trance/ambient music.
---Michael

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index bef7382..f536b2b 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -30,6 +30,7 @@ or e-mail me at liw@liw.fi. Thanks.
 # Music, not directly from bands
 
 * [Jamendo](http://www.jamendo.com/)
+* [Kahvi Collective](http://kahvi.org/)
 
 # Videos, movies
 

removed
diff --git a/coverage-test-runner/bugs.mdwn b/coverage-test-runner/bugs.mdwn
deleted file mode 100644
index 21fcc15..0000000
--- a/coverage-test-runner/bugs.mdwn
+++ /dev/null
@@ -1,9 +0,0 @@
-[[!meta title="Bugs in CoverageTestRunner"]]
-
-See also bugs in the [Debian bug tracking system](http://bugs.debian.org/python-coverage-test-runner).
-
-[[!inline pages="xxx" feeds=no postform=yes 
-  rootpage="coverage-test-runner/bugs"
-  postformtext="Report new bug:"]]
-
-[[!inline pages="coverage-test-runner/bugs/* and !discussion"]]

removed
diff --git a/coverage-test-runner/bugs/debian-changelog-license-wording.mdwn b/coverage-test-runner/bugs/debian-changelog-license-wording.mdwn
deleted file mode 100644
index ce7060a..0000000
--- a/coverage-test-runner/bugs/debian-changelog-license-wording.mdwn
+++ /dev/null
@@ -1,11 +0,0 @@
-[[!meta title="debian/copyright license wording"]]
-
-When the first version of the Debian package was uploaded, its
-debian/copyright file was unclear as to which version of the GPL
-was intended as the first version that was OK. This is now fixed
-in the trunk.debian branch:
-
-    -License, or any later version. On Debian systems, you can find version 2
-    -of the license at /usr/share/common-licenses/GPL-2 .
-    +License, either version 2 or any later version. On Debian systems, you
-    +can find version 2 of the license at /usr/share/common-licenses/GPL-2 .

diff --git a/links.mdwn b/links.mdwn
index 4333cca..cbe49c8 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -57,6 +57,7 @@ incarnation of that web page.
 [Verkkokauppa](http://www.verkkokauppa.com/)
 [Damicon Kraa](http://www.damicon.fi/)
 [DSE](http://www.dse.co.nz/dse.shop/)
+[NiceGear](http://nicegear.co.nz/)
 
 **Approved content sources:**
 [Equal Dreams](http://www.equaldreams.com/)

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index b91b80c..bef7382 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -18,10 +18,11 @@ or e-mail me at liw@liw.fi. Thanks.
 * [World Digital Library](http://www.wdl.org/)
 * [Finnish Literature Society Digital Library](http://www.finlit.fi/kirjasto/digi/) (in Finnish)
 
-# Bands
+# Bands, artists
 
 * [Cantata Sangui](http://www.cantatasangui.com/)
 * [Severed Fifth](http://severedfifth.com/)
+* [Siberry, Jane](http://www.janesiberry.com/janesiberry/music.html)
 * [Turmion kätilöt](http://www.raharecords.com/)
 * [Viola](http://www.violamusicclub.com/)
 * [Wainas](http://www.wainas.net/)

diff --git a/links.mdwn b/links.mdwn
index f5efe3e..4333cca 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -103,6 +103,7 @@ incarnation of that web page.
 [Devel::Cover](http://homepage.hispeed.ch/pjcj/testing_and_code_coverage/paper.html)
 [Python test tools taxonomy](http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy)
 [SD](http://syncwith.us/sd/)
+[cil](http://github.com/andychilton/cil)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

diff --git a/btree.mdwn b/btree.mdwn
index bacbc88..ecbe9b5 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -44,5 +44,6 @@ I will some day start making actual releases, but for now this is it.
 
 More stuff:
 
+* <http://code.liw.fi/btree/> &mdash; tarballs, etc.
 * <http://code.liw.fi/btree/bugs/> &mdash; [SD](http://syncwith.us/sd/)
   bug repository for btree.

diff --git a/btree.mdwn b/btree.mdwn
index 1e78ee4..bacbc88 100644
--- a/btree.mdwn
+++ b/btree.mdwn
@@ -41,3 +41,8 @@ branch:
     bzr get http://code.liw.fi/btree/bzr/trunk/
 
 I will some day start making actual releases, but for now this is it.
+
+More stuff:
+
+* <http://code.liw.fi/btree/bugs/> &mdash; [SD](http://syncwith.us/sd/)
+  bug repository for btree.

diff --git a/links.mdwn b/links.mdwn
index de5ceb5..f5efe3e 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -102,6 +102,7 @@ incarnation of that web page.
 [Test::More](http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm)
 [Devel::Cover](http://homepage.hispeed.ch/pjcj/testing_and_code_coverage/paper.html)
 [Python test tools taxonomy](http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy)
+[SD](http://syncwith.us/sd/)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

diff --git a/links.mdwn b/links.mdwn
index 4906d72..de5ceb5 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -91,7 +91,6 @@ incarnation of that web page.
 [Kuhn UTF-8 test](http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt)
 [Hsieh hash](http://www.azillionmonkeys.com/qed/hash.html)
 [rsync](http://www.samba.org/rsync/tech_report/)
-[Tarkistusmerkkien laskentamenetelmi&auml;](http://koti.mbnet.fi/~thales/tarkmerk.htm)
 [hashes for content-based addressing](http://valerieaurora.org/monkey.html)
 [Name generator](http://online-generator.com/name-generator/project-name-generator.php)
 [Sqlite query language](http://www.sqlite.org/lang.html)

diff --git a/btree.mdwn b/btree.mdwn
new file mode 100644
index 0000000..1e78ee4
--- /dev/null
+++ b/btree.mdwn
@@ -0,0 +1,43 @@
+[[!meta title="Python B-tree library"]]
+[[!tag program]]
+
+**Disclaimer:** 
+If you need to store and retrieve large amounts of data on disk, 
+[SQLite](http://sqlite.org/) is probably what you're looking for.
+If you want to quickly look up data in memory, the Python
+`dict` class is probably what you need.
+However, if you want something for which neither is suitable,
+a B-tree might be helpful. It is, however, **pre-alpha** level
+software. It has never been used in a real application yet.
+
+This is an implementation of particular kind of B-tree, based on research
+by Ohad Rodeh. See 
+["B-trees, Shadowing, and Clones"](http://www.cs.tau.ac.il/~ohadrode/papers/btree_TOS.pdf) 
+for details on the data structure.
+This is the same data structure that [btrfs](http://btrfs.wiki.kernel.org/)
+uses.
+Note that my implementation probably differs from what the paper describes
+or what btrfs implements.
+
+The distinctive feature of this B-tree implementation is that a node is
+never modified. Instead, all updates are done by copy-on-write. Among
+other things, this makes it easy to clone a tree, and modify only 
+the clone, while other processes access the original tree. This is
+utterly wonderful for my backup application, and that's the reason I wrote
+btree in the first place.
+
+I have tried to keep the implementation generic and flexibile, so that
+you may use it in a variety of situations. For example, the tree itself
+does not decide where its nodes are stored: you provide a class that
+does that for it. I have two implementations of the `NodeStore` class,
+one for in-memory and one for on-disk storage.
+
+Documentation is sparse. Docstrings and reading the code
+are your best hope.
+
+The code is available as a [bzr](http://bazaar.canonical.com/en/)
+branch:
+
+    bzr get http://code.liw.fi/btree/bzr/trunk/
+
+I will some day start making actual releases, but for now this is it.

diff --git a/links.mdwn b/links.mdwn
index 6eee88b..4906d72 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -47,6 +47,7 @@ incarnation of that web page.
 [coverage.py](http://nedbatchelder.com/code/modules/coverage.html)
 [Dimbola](http://dimbola.org)
 [Makefiletab](http://www.whilefalse.com/gedit-makefiletab/index.en.html)
+[Koha](http://koha-community.org/)
 
 **People:**
 [Arno Wirzenius](http://www.iki.fi/arno.w/)

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index f4b066b..b91b80c 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -18,7 +18,6 @@ or e-mail me at liw@liw.fi. Thanks.
 * [World Digital Library](http://www.wdl.org/)
 * [Finnish Literature Society Digital Library](http://www.finlit.fi/kirjasto/digi/) (in Finnish)
 
-
 # Bands
 
 * [Cantata Sangui](http://www.cantatasangui.com/)
@@ -27,6 +26,10 @@ or e-mail me at liw@liw.fi. Thanks.
 * [Viola](http://www.violamusicclub.com/)
 * [Wainas](http://www.wainas.net/)
 
+# Music, not directly from bands
+
+* [Jamendo](http://www.jamendo.com/)
+
 # Videos, movies
 
 * [Big Buck Bunny](http://www.bigbuckbunny.org/)

diff --git a/dupfiles.mdwn b/dupfiles.mdwn
new file mode 100644
index 0000000..e367211
--- /dev/null
+++ b/dupfiles.mdwn
@@ -0,0 +1,21 @@
+[[!meta title="dupfiles: find and hardlink duplicate files"]]
+[[!tag program]]
+
+I needed to save some space, and my disk had Debian and Ubuntu mirrors. Most
+source packages are identical, so hardlinking the relevant files was a good
+way to save a few tens of gigabytes.
+
+The [fdupes](http://netdial.caribe.net/~adrian2/programs/fdupes.html) 
+program was the only tool I found for this that was packaged
+for Debian. Unfortunately, it can only list or delete duplicates, not
+hardlink them to each other.
+
+I started writing a program to parse fdupes output and do the hardlinking,
+but it evolved into a program that did everything.
+
+I named it dupfiles.
+
+    bzr get http://code.liw.fi/dupfiles/bzr/trunk/
+
+It has a test suite, but I don't know if it covers all cases. Probably
+not. Worked for me, but please be careful. Patches most welcome.

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index af9d078..f4b066b 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -33,6 +33,7 @@ or e-mail me at liw@liw.fi. Thanks.
 * [Code Rush](http://clickmovement.org/content/code-rush-download)
 * [Internet Archive](http://www.archive.org/details/feature_films)
 * [NerdTV](http://www.pbs.org/cringely/nerdtv/shows/)
+* [Patent Absurdity](http://patentabsurdity.com/)
 * [the.scene](http://www.welcometothescene.com/)
 * [Sita Sings the Blues](http://www.sitasingstheblues.com/)
 * [Steal This Film](http://www.stealthisfilm.com/Part2/download.php)

diff --git a/links.mdwn b/links.mdwn
index 5346ae6..6eee88b 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -29,6 +29,7 @@ incarnation of that web page.
 [debian.org](http://www.debian.org/)
 [KVM](http://wiki.debian.org/KVM)
 [pkg-perl](http://wiki.debian.org/Teams/DebianPerlGroup/)
+[lars@catalyst](http://qa.debian.org/developer.php?login=lars%40catalyst.net.nz&comaint=yes)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/rules.mdwn b/rules.mdwn
index e82ff31..2b0bf9b 100644
--- a/rules.mdwn
+++ b/rules.mdwn
@@ -14,3 +14,4 @@ Gibbs, yay.
   in the parts without tests.
 9. Don't be late in telling you're late.
 10. If you cannot automate it, make a checklist out of it.
+11. Be careful what you reward, because you will get more of it.

diff --git a/eoc.mdwn b/eoc.mdwn
new file mode 100644
index 0000000..765dc1e
--- /dev/null
+++ b/eoc.mdwn
@@ -0,0 +1,18 @@
+[[!meta title="Enemies of Carlotta"]]
+[[!tag program]]
+
+Many years ago I wrote a mailing list manager, called
+Enemies of Carlotta.
+
+I have pretty much stopped developing it. I still use it,
+and will fix any horrible problems should they occur, but
+otherwise don't expect me to do much.
+
+However, if you want to use it, please do. If you would like
+to take over development, please do.
+
+The current code is in bzr, you can get it via:
+
+    bzr get http://code.liw.fi/enemies-of-carlotta/bzr/trunk/
+
+Have fun.

diff --git a/links.mdwn b/links.mdwn
index 6707df0..5346ae6 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -45,6 +45,7 @@ incarnation of that web page.
 [moreutils](http://kitenet.net/~joey/code/moreutils/)
 [coverage.py](http://nedbatchelder.com/code/modules/coverage.html)
 [Dimbola](http://dimbola.org)
+[Makefiletab](http://www.whilefalse.com/gedit-makefiletab/index.en.html)
 
 **People:**
 [Arno Wirzenius](http://www.iki.fi/arno.w/)

diff --git a/links.mdwn b/links.mdwn
index 4a02dc8..6707df0 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -27,9 +27,6 @@ incarnation of that web page.
 
 **Debian:**
 [debian.org](http://www.debian.org/)
-[debian.fi](http://debian.fi/)
-[Manoj Python Policy](http://people.debian.org/~srivasta/manoj-policy/)
-[New Python Policy](http://wiki.debian.org/DebianPython/NewPolicy)
 [KVM](http://wiki.debian.org/KVM)
 [pkg-perl](http://wiki.debian.org/Teams/DebianPerlGroup/)
 
@@ -37,10 +34,8 @@ incarnation of that web page.
 [LWN](http://lwn.net/)
 [decss](http://mjr.iki.fi/decss/)
 [Driver check](http://kmuto.jp/debian/hcl/)
-[OpenWRT](http://openwrt.org/)
 
 **User/other groups:***
-[HUMBUG (Brisbane)](http://www.humbug.org.au/)
 [NZPUG](http://nzpug.org/)
 [Wellington.geek.nz](http://wellington.geek.nz/)
 [Thursday night curry](http://wellington.thursdaynightcurry.com/)
@@ -58,32 +53,27 @@ incarnation of that web page.
 **Computer stores:**
 [Verkkokauppa](http://www.verkkokauppa.com/)
 [Damicon Kraa](http://www.damicon.fi/)
-[linuxkauppa](http://www.linuxkauppa.fi/)
-[Mäkisen paja](http://www.atkkierratys.com/)
 [DSE](http://www.dse.co.nz/dse.shop/)
 
 **Approved content sources:**
 [Equal Dreams](http://www.equaldreams.com/)
 [Levyvirasto](http://levyvirasto.net/catalog/)
 [Meteli.net](http://meteli.net/)
-
-**Other stores:**
 [Heather Alexander](http://www.heatherlands.com/)
 [Amazon](http://www.amazon.com/)
 [Amazon UK](http://www.amazon.co.uk/)
-[Pukufirma Lynoure](http://www.lynoure.com/)
-[Rajala](http://www.rajala.fi/)
-[Ruohonjuuri](http://www.bosoy.fi/ruohonjuuri/index.html)
-[Varusteleka](http://www.varusteleka.fi/)
 [Fictionwise](https://www.fictionwise.com/)
 [Smashwords](http://www.smashwords.com/)
 
+**Other stores:**
+[Pukufirma Lynoure](http://www.lynoure.com/)
+[Rajala](http://www.rajala.fi/)
+
 **Organizations:**
 [EFFI](http://www.effi.org/)
 [IKI](http://www.iki.fi/index.html)
 [Burger Games](http://www.burgergames.com)
 [Vilhelm](http://vilhelm.fi/)
-[speedtarrat.fi](http://www.speedtarrat.fi/)
 
 **Programming:**
 [GNOME API](http://library.gnome.org/devel/)
@@ -97,9 +87,7 @@ incarnation of that web page.
 [Pentomino](http://yucs.org/~gnivasch/pentomino/)
 [Kuhn UTF-8 test](http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt)
 [Hsieh hash](http://www.azillionmonkeys.com/qed/hash.html)
-[Code Coverage Lessons](http://homepage.mac.com/hey.you/lessons.html)
 [rsync](http://www.samba.org/rsync/tech_report/)
-[zsync](http://zsync.moria.org.uk/)
 [Tarkistusmerkkien laskentamenetelmi&auml;](http://koti.mbnet.fi/~thales/tarkmerk.htm)
 [hashes for content-based addressing](http://valerieaurora.org/monkey.html)
 [Name generator](http://online-generator.com/name-generator/project-name-generator.php)
@@ -127,11 +115,6 @@ incarnation of that web page.
 [showmyip](http://www.showmyip.com/)
 [pagerank](http://www.prchecker.info/check_page_rank.php)
 
-**Hardware:**
-[UBCD](http://ubcd.sourceforge.net/)
-[CUPS/Foomatic for Brother P-touch](http://www.diku.dk/~panic/P-touch/)
-[QL550 on Linux](http://etc.nkadesign.com/Printers/QL550LabelPrinter)
-
 **Photography:**
 [photo.net](http://photo.net/)
 [dcraw](http://www.cybercom.net/~dcoffin/dcraw/)
@@ -139,8 +122,6 @@ incarnation of that web page.
 [RG](http://www.robgalbraith.com/)
 [TOP](http://theonlinephotographer.com/)
 [UPstrap](http://www.upstrap-pro.com/)
-[Argyll](http://www.argyllcms.com/)
-[kamerahuolto](http://www.kamerahuolto.fi)
 [Color management](http://photo.net/learn/digital-photography-workflow/color-management/)
 
 **Home office:**
@@ -157,9 +138,6 @@ incarnation of that web page.
 [Redoxx](http://www.redoxx.com/)
 [NZ public holidays](http://www.ers.dol.govt.nz/holidays_act_2003/dates/2010_13.html)
 
-**Politics:**
-[Edustajamme.fi](http://blogit.edustajamme.fi/)
-
 **Cooking:**
 [A No-Frills Kitchen Still Cooks](http://www.nytimes.com/2007/05/09/dining/09mini.html?ex=1336363200&amp;en=e39e14cf6af1b0bc&amp;ei=5090&amp;partner=rssuserland&amp;emc=rss)
 

diff --git a/links.mdwn b/links.mdwn
index 3bd7144..4a02dc8 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -143,11 +143,6 @@ incarnation of that web page.
 [kamerahuolto](http://www.kamerahuolto.fi)
 [Color management](http://photo.net/learn/digital-photography-workflow/color-management/)
 
-**Online photo printing:**
-[Tunnin kuva](http://www.tunninkuva.fi)
-[Fotonetti](http://www.fotonetti.fi)
-[Kuvaboxi](http://kuvaboxi.fi/)
-
 **Home office:**
 [Stefan Didak's home office](http://www.stefandidak.com/office/)
 [Mitch Haile](http://www.biscade.com/office/)

diff --git a/links.mdwn b/links.mdwn
index daa51c6..3bd7144 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -77,7 +77,6 @@ incarnation of that web page.
 [Varusteleka](http://www.varusteleka.fi/)
 [Fictionwise](https://www.fictionwise.com/)
 [Smashwords](http://www.smashwords.com/)
-[Cleanme](http://www.cleanme.co.nz/index.html)
 
 **Organizations:**
 [EFFI](http://www.effi.org/)

diff --git a/links.mdwn b/links.mdwn
index a1c3c46..daa51c6 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -12,15 +12,6 @@ incarnation of that web page.
 [Valuutat](http://www.bof.fi/Stats/default.aspx?r=/tilastot/valuuttakurssit/valuuttakurssit_today_fi)
 [SO](http://stackoverflow.com/)
 
-**Time tables:**
-[150A](http://aikataulut.ytv.fi/linjat/fi/s150.html)
-[165](http://aikataulut.ytv.fi/linjat/fi/s165.html)
-[65](http://aikataulut.ytv.fi/linjat/fi/e65.html)
-[Reittiopas](http://aikataulut.ytv.fi/reittiopas/fi/)
-[Aikataulut](http://aikataulut.ytv.fi/linjat/fi/)
-[matka.fi](http://www.matka.fi/haku/fi/)
-[liikenteeseen.fi](http://liikenteeseen.fi)
-
 **Books:**
 [Lspace](http://www.ie.lspace.org)
 [Bujold Nexus](http://www.dendarii.com/)

diff --git a/links.mdwn b/links.mdwn
index 0cbf607..a1c3c46 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -40,6 +40,7 @@ incarnation of that web page.
 [Manoj Python Policy](http://people.debian.org/~srivasta/manoj-policy/)
 [New Python Policy](http://wiki.debian.org/DebianPython/NewPolicy)
 [KVM](http://wiki.debian.org/KVM)
+[pkg-perl](http://wiki.debian.org/Teams/DebianPerlGroup/)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/links.mdwn b/links.mdwn
index 3853130..0cbf607 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -41,9 +41,6 @@ incarnation of that web page.
 [New Python Policy](http://wiki.debian.org/DebianPython/NewPolicy)
 [KVM](http://wiki.debian.org/KVM)
 
-**Ubuntu:**
-[PPA](https://launchpad.net/~liw/+archive)
-
 **Linux:**
 [LWN](http://lwn.net/)
 [decss](http://mjr.iki.fi/decss/)

diff --git a/links.mdwn b/links.mdwn
index 80a88c7..3853130 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -10,9 +10,7 @@ incarnation of that web page.
 
 **Frequent:**
 [Valuutat](http://www.bof.fi/Stats/default.aspx?r=/tilastot/valuuttakurssit/valuuttakurssit_today_fi)
-[Aukiolot](http://www.pty.fi/aukiolo2009.html)
-[Sää](http://weather.fi/Suomi/tasmasaa/Espoo)
-[Ukkoset](http://www.vaski.net/thunder/ukkonen2.htm)
+[SO](http://stackoverflow.com/)
 
 **Time tables:**
 [150A](http://aikataulut.ytv.fi/linjat/fi/s150.html)

diff --git a/links.mdwn b/links.mdwn
index e314184..80a88c7 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -44,16 +44,7 @@ incarnation of that web page.
 [KVM](http://wiki.debian.org/KVM)
 
 **Ubuntu:**
-[cj bugs](https://bugs.launchpad.net/ubuntu/+source/computer-janitor)
-[um bugs](https://bugs.launchpad.net/ubuntu/+source/update-manager)
-[liw's bugs](https://bugs.launchpad.net/~liw/+bugs)
-[liw's packages' bugs](https://bugs.launchpad.net/~liw/+packagebugs)
-[ubuntu@launchpad](https://bugs.launchpad.net/ubuntu)
-[ubuntu uploads](https://launchpad.net/ubuntu/jaunty/+queue)
-[foundations team bugs](http://qa.ubuntu.com/reports/team-assigned/ubuntu-foundations-assigned-bug-tasks.html)
 [PPA](https://launchpad.net/~liw/+archive)
-[KVM](https://help.ubuntu.com/community/KVM)
-[Debugging Crashes](https://wiki.ubuntu.com/DebuggingProgramCrash)
 
 **Linux:**
 [LWN](http://lwn.net/)

diff --git a/links.mdwn b/links.mdwn
index bb40ce5..e314184 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -134,6 +134,7 @@ incarnation of that web page.
 [git tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
 [Test::More](http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm)
 [Devel::Cover](http://homepage.hispeed.ch/pjcj/testing_and_code_coverage/paper.html)
+[Python test tools taxonomy](http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

diff --git a/links.mdwn b/links.mdwn
index dd4e941..bb40ce5 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -78,7 +78,6 @@ incarnation of that web page.
 [Jukka Rajala](http://www.jukkar.com/)
 
 **Computer stores:**
-[Ascent](http://www.ascent.co.nz/?x=1)
 [Verkkokauppa](http://www.verkkokauppa.com/)
 [Damicon Kraa](http://www.damicon.fi/)
 [linuxkauppa](http://www.linuxkauppa.fi/)
@@ -134,6 +133,7 @@ incarnation of that web page.
 [Meliae](http://jam-bazaar.blogspot.com/2009/11/memory-debugging-with-meliae.html)
 [git tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
 [Test::More](http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm)
+[Devel::Cover](http://homepage.hispeed.ch/pjcj/testing_and_code_coverage/paper.html)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

diff --git a/links.mdwn b/links.mdwn
index eaca5d3..dd4e941 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -133,6 +133,7 @@ incarnation of that web page.
 [Euler](http://projecteuler.net/index.php?section=about)
 [Meliae](http://jam-bazaar.blogspot.com/2009/11/memory-debugging-with-meliae.html)
 [git tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
+[Test::More](http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

diff --git a/links.mdwn b/links.mdwn
index a35464d..eaca5d3 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -83,6 +83,7 @@ incarnation of that web page.
 [Damicon Kraa](http://www.damicon.fi/)
 [linuxkauppa](http://www.linuxkauppa.fi/)
 [Mäkisen paja](http://www.atkkierratys.com/)
+[DSE](http://www.dse.co.nz/dse.shop/)
 
 **Approved content sources:**
 [Equal Dreams](http://www.equaldreams.com/)

diff --git a/links.mdwn b/links.mdwn
index 510097a..a35464d 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -41,6 +41,7 @@ incarnation of that web page.
 [debian.fi](http://debian.fi/)
 [Manoj Python Policy](http://people.debian.org/~srivasta/manoj-policy/)
 [New Python Policy](http://wiki.debian.org/DebianPython/NewPolicy)
+[KVM](http://wiki.debian.org/KVM)
 
 **Ubuntu:**
 [cj bugs](https://bugs.launchpad.net/ubuntu/+source/computer-janitor)

diff --git a/links.mdwn b/links.mdwn
index 9dd4b8c..510097a 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -34,6 +34,7 @@ incarnation of that web page.
 [Debugging Rules](http://www.debuggingrules.com/)
 [Producing OSS](http://www.producingoss.com/)
 [DAM](http://thedambook.com/)
+[Safari Online](http://my.safaribooksonline.com/mysafari)
 
 **Debian:**
 [debian.org](http://www.debian.org/)

diff --git a/links.mdwn b/links.mdwn
index 214de85..9dd4b8c 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -63,6 +63,7 @@ incarnation of that web page.
 [HUMBUG (Brisbane)](http://www.humbug.org.au/)
 [NZPUG](http://nzpug.org/)
 [Wellington.geek.nz](http://wellington.geek.nz/)
+[Thursday night curry](http://wellington.thursdaynightcurry.com/)
 
 **Upstreams:**
 [Sound Converter](http://soundconverter.berlios.de/)

diff --git a/links.mdwn b/links.mdwn
index c47c6f9..214de85 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -59,9 +59,10 @@ incarnation of that web page.
 [Driver check](http://kmuto.jp/debian/hcl/)
 [OpenWRT](http://openwrt.org/)
 
-**User groups:***
+**User/other groups:***
 [HUMBUG (Brisbane)](http://www.humbug.org.au/)
 [NZPUG](http://nzpug.org/)
+[Wellington.geek.nz](http://wellington.geek.nz/)
 
 **Upstreams:**
 [Sound Converter](http://soundconverter.berlios.de/)

diff --git a/rules.mdwn b/rules.mdwn
index ddc9a0d..e82ff31 100644
--- a/rules.mdwn
+++ b/rules.mdwn
@@ -13,3 +13,4 @@ Gibbs, yay.
 8. Aim for 100% test coverage. You'll never get there, but bugs mostly happen
   in the parts without tests.
 9. Don't be late in telling you're late.
+10. If you cannot automate it, make a checklist out of it.

diff --git a/links.mdwn b/links.mdwn
index 24d3642..c47c6f9 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -95,6 +95,7 @@ incarnation of that web page.
 [Varusteleka](http://www.varusteleka.fi/)
 [Fictionwise](https://www.fictionwise.com/)
 [Smashwords](http://www.smashwords.com/)
+[Cleanme](http://www.cleanme.co.nz/index.html)
 
 **Organizations:**
 [EFFI](http://www.effi.org/)

diff --git a/links.mdwn b/links.mdwn
index 8cfc9ac..24d3642 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -175,6 +175,7 @@ incarnation of that web page.
 [Onebag](http://www.onebag.com/)
 [Open Street Map](http://wiki.openstreetmap.org/index.php/Main_Page)
 [Redoxx](http://www.redoxx.com/)
+[NZ public holidays](http://www.ers.dol.govt.nz/holidays_act_2003/dates/2010_13.html)
 
 **Politics:**
 [Edustajamme.fi](http://blogit.edustajamme.fi/)

diff --git a/links.mdwn b/links.mdwn
index 6a986bb..8cfc9ac 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -74,6 +74,7 @@ incarnation of that web page.
 [Jukka Rajala](http://www.jukkar.com/)
 
 **Computer stores:**
+[Ascent](http://www.ascent.co.nz/?x=1)
 [Verkkokauppa](http://www.verkkokauppa.com/)
 [Damicon Kraa](http://www.damicon.fi/)
 [linuxkauppa](http://www.linuxkauppa.fi/)

diff --git a/links.mdwn b/links.mdwn
index cfafbae..6a986bb 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -125,6 +125,7 @@ incarnation of that web page.
 [EBS](http://www.joelonsoftware.com/items/2007/10/26.html)
 [Euler](http://projecteuler.net/index.php?section=about)
 [Meliae](http://jam-bazaar.blogspot.com/2009/11/memory-debugging-with-meliae.html)
+[git tutorial](http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)
 
 **Sysadmin:**
 [passwordless ssh](http://wiki.hands.com/howto/passphraseless-ssh/)

Re-worded #8 to be an actual rule. Thanks to Richard for pointing it out.
diff --git a/rules.mdwn b/rules.mdwn
index e34ddf9..ddc9a0d 100644
--- a/rules.mdwn
+++ b/rules.mdwn
@@ -4,12 +4,12 @@
 Gibbs, yay.
 
 1. Always copy and paste a URL.
-1. A will-do attitude trumps skills.
-1. Always ask the simple troubleshooting questions first.
-1. Externalize your memory: write things down, always carry a notebook.
-1. Measure, don't guess.
-1. Write flames, but don't send them.
-1. Always write unit tests for error handling.
-1. 100% test coverage is a fallacy, but bugs happen mostly in the parts 
-   without tests.
-1. Don't be late in telling you're late.
+2. A will-do attitude trumps skills.
+3. Always ask the simple troubleshooting questions first.
+4. Externalize your memory: write things down, always carry a notebook.
+5. Measure, don't guess.
+6. Write flames, but don't send them.
+7. Always write unit tests for error handling.
+8. Aim for 100% test coverage. You'll never get there, but bugs mostly happen
+  in the parts without tests.
+9. Don't be late in telling you're late.

diff --git a/rules.mdwn b/rules.mdwn
new file mode 100644
index 0000000..e34ddf9
--- /dev/null
+++ b/rules.mdwn
@@ -0,0 +1,15 @@
+[[!meta title="Rules"]]
+[[!tag article]]
+
+Gibbs, yay.
+
+1. Always copy and paste a URL.
+1. A will-do attitude trumps skills.
+1. Always ask the simple troubleshooting questions first.
+1. Externalize your memory: write things down, always carry a notebook.
+1. Measure, don't guess.
+1. Write flames, but don't send them.
+1. Always write unit tests for error handling.
+1. 100% test coverage is a fallacy, but bugs happen mostly in the parts 
+   without tests.
+1. Don't be late in telling you're late.

diff --git a/tag/talk.mdwn b/tag/talk.mdwn
new file mode 100644
index 0000000..d345936
--- /dev/null
+++ b/tag/talk.mdwn
@@ -0,0 +1,3 @@
+This tag is for talks and presentations I've given.
+
+[[!inline archive=yes feeds=no sort=title pages="link(tag/talk)"]]

diff --git a/linux-anecdotes.mdwn b/linux-anecdotes.mdwn
new file mode 100644
index 0000000..74b64b0
--- /dev/null
+++ b/linux-anecdotes.mdwn
@@ -0,0 +1,282 @@
+[[!meta title="Linux Anecdotes"]]
+[[!tag talk]]
+
+> A look at the history of Linux, as seen by a long
+> time Linux user.  The talk is a series of anecdotes,
+> shy of technical details, and sprinkled with personal
+> memories.
+> 
+> 27 April 1998
+> 
+> This talk was given at the 1998 Linux Expo.
+
+
+## Who I am and why I am here
+
+I seem to have acquired a little bit of reputation in the Linux community,
+despite my efforts in to stay quiet and invisible, so that I don't get
+so many questions from people having trouble with Linux.
+
+Part of my reputation is that I know Linux pretty well. That part is based
+on the time when I and Linus Torvalds---I assume you know Linus---shared
+an office at the University of Helsinki. In reality, I don't know Linux
+all that well. For example, my one stab at kernel programming resulted
+in a bug that took three years to track down and fix, and even then it
+was done by someone hacking OS/2. I'm referring to the sprintf function
+inside the kernel.
+
+I wrote sprintf in the summer of 1991. Linus needed some easy way to print
+messages from the kernel, and did not then know how to use the stdarg
+mechanism to implement variable argument lists to functions. I see
+some people in the audience shaking their heads. Yes, it's true. There
+was a time when Linus didn't know everything. Really. Trust me. I was
+there.
+
+Anyway, I wrote a simple sprintf for Linus, to show him how it was done,
+and he used in the Linux kernel, after some modification. The bug was in
+the handling of an asterisk as the width for an output field. I forgot
+to increment a pointer past the asterisk, so the code had no chance of
+working for this case. No chance at all. This was clear to anyone who
+tried it. Obviously, I didn't, which means that I probably shouldn't be
+employed to write software. In 1994, three years later, one Friedemann
+Baitinger noticed the bug, and sent me a patch.  He was using the
+sprintf while debugging a device driver he was writing for OS/2.
+
+Anyway, back to who I am. I've been a friend of Linus since before
+Linux even existed. We met as first-year students in 1988. When he
+started to write Linux, I naturally followed things with interest and
+some jealosy. Except for sprintf, I didn't really participate, since
+I'm not a hacker, just a wannabe. When Linux and its community grew, I
+took part in various non-technical things that needed doing. For
+example, I helped created the Linux Documentation Project, and
+co-moderated comp.os.linux.announce, also known as cola.
+
+My moderating cola is the reason I'm here. When I had been doing it
+for five years, that is, in last December, I decided to retire from it
+and found a successor. In my farewell note to the group, I jokingly
+said that I wouldn't mind getting a trip around the world, if anyone
+wanted to send me one. It happens that some people don't understand
+jokes, and it seems that Marc Ewing is one of them. He told me I would
+come here to give a talk and he wouldn't take no for an answer. If you
+feel bored now, you know whom to blame.
+
+
+## Linus the god
+
+You all know Linus, at least by reputation. The wonder-child. The
+coding wizard. The hacker god. Well, it wasn't always like that. What
+I'm about to say next may shock the most devout Linuxers in the audience,
+but that's all right. This is a free country, and anyway, I've been
+promised police protection.
+
+I've already told you that Linus didn't always know everything. I'm
+not saying he isn't omniscient now. After all, he might now be a god
+and I'm not lightning-proof. So I'm only going to talk about old
+times. I'm sure he'll forgive me that.
+
+Not only did Linus not know everything about C, he also didn't know
+anything about PC's. In fact, he didn't even have one when I first met
+him. When he bought his first PC, he didn't even start hacking it
+right away. Instead, he played computer games, especially one called
+something like Prince of Persia. I've never understood that part of him.
+I mean, what's a computer game worth if it doesn't simulate
+playing cards? No, give me solitaire, if you want me to play with a
+computer.
+
+Even a few years later, when Linux was already a success, Linus had
+this strange fascination for silly computer games, such as Doom and
+Quake. By then he'd already learned some social skills and knew that one
+just doesn't admit to liking computer games after the age of 12.
+So when he was playin Doom, he used to explain that he was
+debugging and stress testing memory management and the X server.
+
+When Linus decides to learn something, he really learns it, and usually
+quickly. This is why he may now be omniscient. I remember once when we
+were being questioned about some math home work. I happened to know Linus
+hadn't done it. But bold as he was even then, he claimed to have done
+them anyway. As luck would have it, the teacher wanted Linus to present
+his solution to the class. On the way to the blackboard, Linus read the
+problem, then stood in front of the board for a second or two, and went
+on to present a solution that the teacher couldn't understand. Linus
+can be quite annoying like that.
+
+Once, when Linus was abroad at some conference or another, he modified
+my shell setup scripts so that when I logged in, it looked as if I was
+using MS-DOS. That was fun, of course, but it begged for revenge. This
+happened while we were sharing an office at the university, so once
+when Linus went out to get something to drink or something, I created an
+alias for startx for him. My alias first ran the real startx, and then
+printed out a kernel `Oops' message. The first time Linus noticed this
+made him a bit worried, but he logged out and cleared the screen too fast
+to read it, but the second time made him really worried. I'd copied the
+`Oops' message from linux-kernel, and of course it didn't suit Linus's
+kernel at all. He had gotten as far as decoding the message by hand,
+and muttering something like ``Why is it crashing there? It can't crash
+there!'', when I burst out laughing and told him what I'd done. Linus
+was quite relieved and never tried any practical jokes on me again.
+
+
+## The early times
+
+Let's go back to the spring of 1991. In January, Linus bought a PC.
+He'd been using a Sinclair QL before that, which, like much British
+computer stuff, was ingenious and almost unusably different from
+everything else. Like every self-respecting hacker, Linus had written
+some software development tools of his own; an editor and an
+assembler, I think. He'd also modified the QL hardware a bit, to
+replace a broken keyboard, and to add a PC-compatible floppy drive.
+When he bought the PC, he wrote a device driver for the QL so he could
+move stuff from the QL to the PC.
+
+When he got up to speed with the PC, after having played
+enough Prince of Persia, he started learning about programming the PC.
+Especially assembly language programming, since only wimps use high
+level languages. I remember one day when he was quite proud for having
+written a strlen function in assembly. Gee, I was impressed.
+
+As I said, when Linus decides to learn, he really learns. A few weeks
+later he showed me two simple concurrent processes. One printed out
+A's as fast as it could, the other B's. That was much more fun to look
+at than his strlen, but not, I think, immediately as useful.
+
+As time progressed, Linus added keyboard and serial port drivers, so
+that he could use his modem from the PC. Normal people would have used
+one of the dozens of existing terminal emulators, but Linus had to
+write his own. After that, he spent a long time just reading netnews.
+Sorry, I mean of course that he was debugging his terminal emulation code
+by reading netnews. The emulator consisted of two processes, one reading
+the keyboard and writing to the serial port, the other reading the
+serial port and writing to the screen and emulating a terminal.
+
+At some point during this time Linus decided he wanted a Unix-like
+system at home, and the obvious choice back then was Minix, since it was
+the only thing he could afford. As it happened, Linus wasn't very
+happy with Minix, so he kept improving his terminal emulator, and
+modifying it to become more like an operating system. I guess we can
+conclude by now that he succeeded.
+
+The success of Linux wasn't automatic, and things might well have gone
+differently. For example, if the Hurd had been finished a few years
+ago, Linux probably wouldn't exist today. Or the BSD systems might
+have taken over the free operating system marketplace.
+
+However, things went as they did, and Linux prospered. The success has
+resulted in fame and also material rewards for rewards, including
+money. One of the first rewards wasn't money, but virtual
+beer. You may have heard the expression, since it is still used
+somewhat, but these days it is just a general good wish phrase.
+Originally, it had a very concrete meaning. Two guys from Oxford,
+England, calling themselves the Oxford Beer Trolls, wanted to buy
+Linus some beer, but since it was impractical to move either
+themselves, Linus, or the beer physically around, they asked me to
+receive the money via mail, and buy Linus beer with it, and that's
+what happened. So, virtual
+beer really means money, preferably money sent to me.
+
+Alas, people started sending Linus money directly. I'm not
+sure they did it out of gratitude, however, since they usually sent
+personal checks from the US. As Linus quickly learned, Finnish banks
+really, really hate checks. Especially personal checks. Particularly
+personal checks from the US. They invent all sorts of bureaucratic pit-falls
+and rules and fees to make it difficult and expensive to use checks.
+If you want to make trouble for a Finn, send him a personal check from
+the US. And that's not a joke.
+
+Linus also got some other stuff via mail. For example, a pair of 40
+megabyte hard disks. That was really nice, since it meant that Linus
+was finally able to keep some backups. Not that he did, of course.
+One of his well-known quotes is: "Backups are for wimps. Real men
+upload their data to an FTP site and have everyone else mirror it." He
+said that even after dialling his hard disk.
+
+At one point, Linus had implemented device files in /dev, and wanted to
+dial up the university computer and debug his terminal emulation code
+again. So he starts his terminal emulator program and tells it to use

(Diff truncated)
diff --git a/sidebar.mdwn b/sidebar.mdwn
index 8fe8a6e..325fccd 100644
--- a/sidebar.mdwn
+++ b/sidebar.mdwn
@@ -4,6 +4,7 @@
 
 #### **See also**
 
+* [[My CV|cv]]
 * [Dimbola](http://dimbola.org/)
 * [Free Thursday](http://free-thursday.pieni.net/)
 * [Kalastuskievari](http://kalastuskievari.fi/)

diff --git a/gratis-content.mdwn b/gratis-content.mdwn
index 519e3ad..af9d078 100644
--- a/gratis-content.mdwn
+++ b/gratis-content.mdwn
@@ -36,6 +36,7 @@ or e-mail me at liw@liw.fi. Thanks.
 * [the.scene](http://www.welcometothescene.com/)
 * [Sita Sings the Blues](http://www.sitasingstheblues.com/)
 * [Steal This Film](http://www.stealthisfilm.com/Part2/download.php)
+* [Valkaama](http://www.valkaama.com/)
 
 # Unsorted
 

diff --git a/tag.mdwn b/tag.mdwn
index a1fbeb4..1575299 100644
--- a/tag.mdwn
+++ b/tag.mdwn
@@ -1,3 +1,3 @@
 All tags used on this site:
 
-[[!pagestats pages="tag/*"]] [essay topics ](http://www.mightystudents.com/)
+[[!pagestats pages="tag/*"]]

diff --git a/tag.mdwn b/tag.mdwn
index 1575299..a1fbeb4 100644
--- a/tag.mdwn
+++ b/tag.mdwn
@@ -1,3 +1,3 @@
 All tags used on this site:
 
-[[!pagestats pages="tag/*"]]
+[[!pagestats pages="tag/*"]] [essay topics ](http://www.mightystudents.com/)

diff --git a/links.mdwn b/links.mdwn
index c087043..cfafbae 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -61,6 +61,7 @@ incarnation of that web page.
 
 **User groups:***
 [HUMBUG (Brisbane)](http://www.humbug.org.au/)
+[NZPUG](http://nzpug.org/)
 
 **Upstreams:**
 [Sound Converter](http://soundconverter.berlios.de/)

diff --git a/links.mdwn b/links.mdwn
index bf9a051..c087043 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -59,6 +59,9 @@ incarnation of that web page.
 [Driver check](http://kmuto.jp/debian/hcl/)
 [OpenWRT](http://openwrt.org/)
 
+**User groups:***
+[HUMBUG (Brisbane)](http://www.humbug.org.au/)
+
 **Upstreams:**
 [Sound Converter](http://soundconverter.berlios.de/)
 [moreutils](http://kitenet.net/~joey/code/moreutils/)

diff --git a/cv.mdwn b/cv.mdwn
index 7923ff3..cdb39ed 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -104,6 +104,8 @@ use, with AutoCAD.
   - [Sound Converter](http://soundconverter.berlios.de/), a GUI program
     to convert audio files to other formats. Now maintained and developed
     by Gautier Portet.
+  - Enemies of Carlotta, a mailing list manager. No longer actively
+    developed.
   - isutf8, part of [moreutils](http://kitenet.net/~joey/code/moreutils/),
     a tool for determining if a file is correctly UTF-8 encoded. Written
     to aid my ISO-8859-1 to Unicode transition.

diff --git a/links.mdwn b/links.mdwn
index 6e8f301..bf9a051 100644
--- a/links.mdwn
+++ b/links.mdwn
@@ -129,6 +129,7 @@ incarnation of that web page.
 [Tollef's free relay](http://freerelay.err.no/)
 [Taking care of your domain](http://www.ripe.net/ripe/docs/ripe-114.html)
 [self-signed certs](http://sial.org/howto/openssl/self-signed/)
+[iwantmyname](http://iwantmyname.com/)
 
 **General net:**
 [feed validator](http://feedvalidator.org/)

diff --git a/cv.mdwn b/cv.mdwn
index 47ba732..7923ff3 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -115,6 +115,8 @@ use, with AutoCAD.
   - [Obnam](http://braawi.org), a backup program.
 * Linux. I helped start its development in 1991, and have been
   part of the Linux world ever since.
+  - Wrote sprintf, used by kernel logging engine. This is my only kernel
+    code contribution.
   - Moderator of the Usenet newsgroup comp.os.linux.announce 1992-1997
   - Helped start and run the Linux Documentation Project, from 1992
     to about 1997. Wrote the 

diff --git a/cv.mdwn b/cv.mdwn
index 01d09d7..47ba732 100644
--- a/cv.mdwn
+++ b/cv.mdwn
@@ -117,7 +117,9 @@ use, with AutoCAD.
   part of the Linux world ever since.
   - Moderator of the Usenet newsgroup comp.os.linux.announce 1992-1997
   - Helped start and run the Linux Documentation Project, from 1992
-    to about 1997.
+    to about 1997. Wrote the 
+    [Linux System Administrators' Guide](http://tldp.org/guides.html),
+    since taken over by others.
   - [Debian](http://www.debian.org/) development 1996-2009. Now retired.
   - [Ubuntu](http://www.ubuntu.com/) development 2007-2009. Now retired.
 * Photography. I've been an amateur photographer since 2001, but do not

diff --git a/index.mdwn b/index.mdwn
index 048fb36..8b83474 100644
--- a/index.mdwn
+++ b/index.mdwn
@@ -10,6 +10,8 @@
 Welcome to my corner of cyberspace, where I display those parts of my
 persona that I wish the public to see.
 
+See my [[CV|cv]].
+
 This site is implemented as a [[!wikipedia Wiki]], using 
 [ikiwiki](http://ikiwiki.info).
 You may edit any page, but please use the discussion page for each

diff --git a/cv.mdwn b/cv.mdwn
new file mode 100644
index 0000000..01d09d7
--- /dev/null
+++ b/cv.mdwn
@@ -0,0 +1,140 @@
+[[!meta title="CV / Lars Wirzenius"]]
+
+## Contact information
+
+    Lars Wirzenius
+    Phone (Finland): +358 50 346 6626
+    Phone (NZ): +64212134174
+    E-mail: liw@liw.fi
+
+## Introduction
+
+I am a computer programmer, and have been programming since 1984.
+
+My main programming languages are C and Python. I know TDD, HTML, 
+TCP/IP, and many other acronyms.
+
+I am an expert in the Linux environment. Linux and Unix environments
+are the only ones I am looking to work in.
+
+I am strongly in favor of free or open source software. 
+I prefer to not use or develop proprietary software. I am looking
+for ways to earn a living and save the world developing free software. 
+I prefer working for a small company rather than a large one.
+
+## Work and training
+
+**Consultant 2005-current.** I've worked on variety of projects for
+several clients. In 2005-2006 I was under contract to improve the
+technical quality of the Debian operating system, and as part of
+that work developed [piuparts](http://piuparts.debian.org/), 
+a package testing tool for checking
+that packages can be installed, upgraded, and removed without 
+problems.
+
+In 2007-2009 I contracted to Canonical, Ltd. to
+do Ubuntu development. As part of that I developed the [Computer
+Janitor](https://launchpad.net/computer-janitor) 
+tool to find unnecessary packages, and do some configuration
+tweaks, such as adding or removing mount options to improve
+performance.
+
+**[Oliotalo](http://www.oliotalo.fi/) 2002-2004.** Oliotalo develops
+applications for machine to machine communication: embedded computers
+are attached to vehicles, waste collectors, or other such machines, and
+communicate wirelessly with a server. This allows remote monitoring and
+telemetry and improves logistics and lowers maintenance costs. I have
+designed and implemented the embedded Lisp interpreter
+[Hedgehog](http://hedgehog.oliotalo.fi/) with which the embedded
+computers are programmed in Oliotalo projects. Using Hedgehog, I have
+developed alone and with others several embedded applications. I have
+also been responsible for Linux system administration for the company.
+
+**pieni.net, 2001-** Started a miniature shell-server ISP on the
+side with two friends.
+
+**Akumiitti Telematics / Keko Technologies 2001-2002.**
+Keko developed a platform for machine to machine communication.
+I designed and implemented an embedded software platform, the KEKO
+Terminal. Keko went bankrupt just as the product was getting
+finished for its first release, but before the product could be used.
+
+**Wapit Ltd 1999-2001.** I was project and team leader for the
+[Kannel](http://www.kannel.org/), an SMS and WAP gateway. Kannel is a
+multithreaded, multiprocess server that can handle high traffic loads. I
+was responsible for architectural design, implementation, and project
+management. Wapit went bankrupt, but Kannel is still in commercial
+production use worldwide.
+
+**Helsinki University of Technology / CS laboratory / [HiBase
+project](http://hibase.cs.hut.fi/) 1997-1999.** HiBase was a research
+project to develop a main memory database and functional programming
+language. The project ended in 2001 when Nokia withdrew funding. I
+participated in its implementation by doing C programming and Linux
+system administration.
+
+**University of Helsinki / Department of Computer Science
+1993-1996.** I was a teaching assistant, helping students with
+homework and checking their answers. I gave one lectured course on
+C programming.
+
+**Translator examination board summer 1990.** I implemented a database
+of official translators with dBase IV.
+
+**University of Helsinki / Department of Computer Science 1988-2002.**
+Student, part-time studies from 1993 onwards on account of working full
+time. Not graduated.
+
+**Extor Oy summer 1988.** I made technical drawings, mainly for sales
+use, with AutoCAD.
+
+
+## Natural languages
+
+* Finnish: native language (mother's side)
+* Swedish: native language (father's side)
+* English: excellent
+* German: very poor
+
+
+## Hobbies
+
+* Free software, 1990-. I develop software as a hobby,
+  although I never publish most of it. Some exceptions:
+  - [Sound Converter](http://soundconverter.berlios.de/), a GUI program
+    to convert audio files to other formats. Now maintained and developed
+    by Gautier Portet.
+  - isutf8, part of [moreutils](http://kitenet.net/~joey/code/moreutils/),
+    a tool for determining if a file is correctly UTF-8 encoded. Written
+    to aid my ISO-8859-1 to Unicode transition.
+  - [CoverageTestRunner](http://code.liw.fi/coverage-test-runner/), 
+    runs Python unit tests and fails them if they
+    don't have full coverage (not counting explicitly excluded parts)
+  - [Dimbola](http://dimbola.org/), a new attempt at a photo manager
+    a la Adobe Lightroom
+  - [Obnam](http://braawi.org), a backup program.
+* Linux. I helped start its development in 1991, and have been
+  part of the Linux world ever since.
+  - Moderator of the Usenet newsgroup comp.os.linux.announce 1992-1997
+  - Helped start and run the Linux Documentation Project, from 1992
+    to about 1997.
+  - [Debian](http://www.debian.org/) development 1996-2009. Now retired.
+  - [Ubuntu](http://www.ubuntu.com/) development 2007-2009. Now retired.
+* Photography. I've been an amateur photographer since 2001, but do not
+  currently publish my pictures anywhere.
+* [Effi](http://effi.org/) is a political organization protecting
+  basic human freedoms; sister organization to the American EFF.
+  Board member 2009.
+* [Alter Ego ry](http://www.helsinki.fi/jarj/ae/) is the role-playing
+  assocation at the University of Helsinki. Board member 2000, 
+  listmaster 2001-2003.
+* [IKI ry](http://www.iki.fi/) is a non-profit association for 
+  providing permanent e-mail and web addresses. 
+  Board member 1996-1998, 2002.
+* OtaDATA ry is an assocation for people interested in computers.
+  Board member 1997, vice president 1998.
+* Usenet news [sfnet hierarchy](http://www.cs.tut.fi/sfnet/) 
+  co-ordinator 1995, in charge of deciding which groups to create.
+* [Spektrum rf](http://www.helsinki.fi/~fyl_spek/) is a student association
+  for computer science, math, physics, and chemistry students at the
+  University of Helsinki. Board member 1994, also other duties 1991-1995.

diff --git a/sidebar.mdwn b/sidebar.mdwn
index 1604789..8fe8a6e 100644
--- a/sidebar.mdwn
+++ b/sidebar.mdwn
@@ -7,3 +7,8 @@
 * [Dimbola](http://dimbola.org/)
 * [Free Thursday](http://free-thursday.pieni.net/)
 * [Kalastuskievari](http://kalastuskievari.fi/)
+
+<hr />
+
+All content on this site is copyrighted by
+Lars Wirzenius and possibly other authors (it's a wiki), and licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0 Unported License</a>.

Search

Wiki actions