Recent changes to this wiki:

add news item for github-backup 1.20160522
diff --git a/code/github-backup/news/version_1.20150618.mdwn b/code/github-backup/news/version_1.20150618.mdwn
deleted file mode 100644
index 6b77b0d..0000000
--- a/code/github-backup/news/version_1.20150618.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-github-backup 1.20150618 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Fix broken configure script."""]]
\ No newline at end of file
diff --git a/code/github-backup/news/version_1.20160522.mdwn b/code/github-backup/news/version_1.20160522.mdwn
new file mode 100644
index 0000000..fb4a64b
--- /dev/null
+++ b/code/github-backup/news/version_1.20160522.mdwn
@@ -0,0 +1,12 @@
+github-backup 1.20160522 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Work around git weirdness in handling of relative path to GIT\_INDEX\_FILE
+     when in a subdirectory of the repository.
+   * Various updates to internal git and utility libraries shared
+     with git-annex.
+   * debian: Add lintian overrides for rpath.
+   * debian: Bump standards-version.
+   * Makefile: Pass LDFLAGS, CFLAGS, and CPPFLAGS through ghc and on to
+     ld, cc, and cpp. This lets the Debian package build with various
+     hardening options. Although their benefit to a largely haskell program
+     is unknown."""]]
\ No newline at end of file

yay, new pristine-tar maintainer
diff --git a/code.mdwn b/code.mdwn
index 4f13c93..a00686f 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -42,6 +42,7 @@ people have taken them on.
 [[debconf]]
 [[dpkg-repack]]
 [[os-prober]]
+[[pristine-tar]]
 [[devscripts]]
 [[pentium-builder]]
 [[apt-src]]
@@ -51,7 +52,6 @@ These need new maintainers, stat!
 
 [[debmirror]]
 [[sleepd]]
-[[pristine-tar]]
 [[alien]]
 [[nslu2-utils]]
 [[ticker]]
diff --git a/code/pristine-tar.mdwn b/code/pristine-tar.mdwn
index 9f54d66..d7153ff 100644
--- a/code/pristine-tar.mdwn
+++ b/code/pristine-tar.mdwn
@@ -10,11 +10,8 @@ the source code, thus allowing the original tarball to be extracted from
 revision control.
 
 pristine-tar is available in git at
-`git://git.joeyh.name/pristine-tar/`
+`http://anonscm.debian.org/cgit/collab-maint/pristine-tar.git`
 
 It's also in Debian.
 
-[[!sidebar content="""
-<a href="http://flattr.com/thing/39934/pristine-tar" target="_blank">
-<img src="http://api.flattr.com/button/button-static-50x60.png" alt="Flattr this" title="Flattr this" border="0" /></a>
-"""]]
+(I am no longer maintaining pristine-tar, it has a new maintainer now.)

Added a comment: git snapshot?
diff --git a/blog/entry/our_beautiful_fake_histories/comment_5_175f17e67d1dbb21824dad77bf3606c6._comment b/blog/entry/our_beautiful_fake_histories/comment_5_175f17e67d1dbb21824dad77bf3606c6._comment
new file mode 100644
index 0000000..b21e849
--- /dev/null
+++ b/blog/entry/our_beautiful_fake_histories/comment_5_175f17e67d1dbb21824dad77bf3606c6._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="jeremy@9671a7e35b1a900e0188905cecb40ee1e209025a"
+ nickname="jeremy"
+ subject="git snapshot?"
+ date="2016-05-20T10:18:12Z"
+ content="""
+That's why I threw this together;
+https://github.com/lakeman/git-snapshot
+
+The best of both worlds. Add it to your make process to preserve the contents of your working folder, while leaving your HEAD commit alone so you can keep trying to write a more beautiful history.
+
+Never used it myself, and it definitely needs more work to be useful in the real world.
+"""]]

update
diff --git a/code/wmbattery.mdwn b/code/wmbattery.mdwn
index 6c6b206..06cef76 100644
--- a/code/wmbattery.mdwn
+++ b/code/wmbattery.mdwn
@@ -23,8 +23,10 @@ some improvements in wmbattery:
 * Support for getting battery status from the sonypi driver instead of APM, for some Sony laptops that do not have apm support.
 * Can make its own estimatess of time remaining or time until full charge, even if APM does not.
 
-`wmbattery` is available as a Debian package or in git
-(`git://git.joeyh.name/zzattic/wmbattery`).
+I have passed on maintenance of wmbattery to Doug Torrance,
+and it has a new home page here: <http://windowmaker.org/dockapps/?name=wmbattery>
+
+(My old and no longer maintained git repository: `git://git.joeyh.name/zzattic/wmbattery`)
 
 I posted some 
 [[thoughts_and_history_about_wmbattery|blog/entry/ten_years_of_free_software_--_part_7_wmbattery]]

update
diff --git a/code/kaxxt/discussion.mdwn b/code/kaxxt/discussion.mdwn
index 96aa739..80acfb7 100644
--- a/code/kaxxt/discussion.mdwn
+++ b/code/kaxxt/discussion.mdwn
@@ -10,5 +10,5 @@ ashbb
 
 > I don't know. :) My gut feeling is either the larger pyramid will, or the
 > laser will have spread out and both matching pyramids can combine to
-> catch it. In the latter case, we now have a way to split the beam
-> into two, which could get interesting... --[[Joey]]
+> catch it. In the latter case, the two pyramids can direct the now-split
+> beam to two different places. --[[Joey]]

comment
diff --git a/code/kaxxt/discussion.mdwn b/code/kaxxt/discussion.mdwn
index 55e4cb3..96aa739 100644
--- a/code/kaxxt/discussion.mdwn
+++ b/code/kaxxt/discussion.mdwn
@@ -7,3 +7,8 @@ Hi. I have a question about the advanced example.
 - Which yellow pyramid, small or medium, will catch the laser?
 
 ashbb
+
+> I don't know. :) My gut feeling is either the larger pyramid will, or the
+> laser will have spread out and both matching pyramids can combine to
+> catch it. In the latter case, we now have a way to split the beam
+> into two, which could get interesting... --[[Joey]]

fix
diff --git a/code/kaxxt.mdwn b/code/kaxxt.mdwn
index e66eec6..a1e85b2 100644
--- a/code/kaxxt.mdwn
+++ b/code/kaxxt.mdwn
@@ -1,6 +1,6 @@
 [[!meta title="Kaxxt (on Ice) # prototype"]]
 
-[[!inline feeds=no pagenames="code/kaxxt/introduction code/kaxxt/what_you_need how_to_play
+[[!inline feeds=no pagenames="code/kaxxt/introduction code/kaxxt/what_you_need code/kaxxt/how_to_play
 code/kaxxt/pyramid_power code/kaxxt/stack_overflows code/kaxxt/hacks code/kaxxt/strategy code/kaxxt/feedback code/kaxxt/TODO" template=bareinlinepage]]
 
 ----

fix
diff --git a/code/kaxxt.mdwn b/code/kaxxt.mdwn
index 3ea4614..e66eec6 100644
--- a/code/kaxxt.mdwn
+++ b/code/kaxxt.mdwn
@@ -1,7 +1,7 @@
 [[!meta title="Kaxxt (on Ice) # prototype"]]
 
-[[!inline feeds=no pages="introduction what_you_need how_to_play
-pyramid_power stack_overflows hacks strategy feedback TODO" template=bareinlinepage]]
+[[!inline feeds=no pagenames="code/kaxxt/introduction code/kaxxt/what_you_need how_to_play
+code/kaxxt/pyramid_power code/kaxxt/stack_overflows code/kaxxt/hacks code/kaxxt/strategy code/kaxxt/feedback code/kaxxt/TODO" template=bareinlinepage]]
 
 ----
 

fix
diff --git a/code/kaxxt.mdwn b/code/kaxxt.mdwn
index 8799d7b..3ea4614 100644
--- a/code/kaxxt.mdwn
+++ b/code/kaxxt.mdwn
@@ -1,6 +1,6 @@
 [[!meta title="Kaxxt (on Ice) # prototype"]]
 
-[[!inline feeds=no pagenames="introduction what_you_need how_to_play
+[[!inline feeds=no pages="introduction what_you_need how_to_play
 pyramid_power stack_overflows hacks strategy feedback TODO" template=bareinlinepage]]
 
 ----

comment
diff --git a/blog/entry/introducing_mr/comment_2_0dba26c2182b424028c4002b0daa627c._comment b/blog/entry/introducing_mr/comment_2_0dba26c2182b424028c4002b0daa627c._comment
new file mode 100644
index 0000000..3301978
--- /dev/null
+++ b/blog/entry/introducing_mr/comment_2_0dba26c2182b424028c4002b0daa627c._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2016-05-12T18:47:52Z"
+ content="""
+<http://myrepos.branchable.com/todo/>
+"""]]

Added a comment: Issue tracker
diff --git a/blog/entry/introducing_mr/comment_1_835eb504d7e0d6a6542e6af07e6a1217._comment b/blog/entry/introducing_mr/comment_1_835eb504d7e0d6a6542e6af07e6a1217._comment
new file mode 100644
index 0000000..5363fa3
--- /dev/null
+++ b/blog/entry/introducing_mr/comment_1_835eb504d7e0d6a6542e6af07e6a1217._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://jakoblog.de/"
+ nickname="jakob"
+ subject="Issue tracker"
+ date="2016-05-12T15:11:27Z"
+ content="""
+Where can users contribute bug reports and feature requests? In particular I miss
+
+    mr unregister repository # remove repository from .mrconfig
+    mr unregister --missing  # remove all deleted repositories from .mrconfig
+
+    mr register *            # register multiple repositories
+
+
+    
+"""]]

add news item for github-backup 1.20160511
diff --git a/code/github-backup/news/version_1.20150617.mdwn b/code/github-backup/news/version_1.20150617.mdwn
deleted file mode 100644
index 464e357..0000000
--- a/code/github-backup/news/version_1.20150617.mdwn
+++ /dev/null
@@ -1,6 +0,0 @@
-github-backup 1.20150617 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Add missing build deps for windows to cabal file.
-     Thanks, Jeff Segal.
-   * Various updates to internal git and utility libraries shared
-     with git-annex."""]]
\ No newline at end of file
diff --git a/code/github-backup/news/version_1.20160511.mdwn b/code/github-backup/news/version_1.20160511.mdwn
new file mode 100644
index 0000000..45896fa
--- /dev/null
+++ b/code/github-backup/news/version_1.20160511.mdwn
@@ -0,0 +1,4 @@
+github-backup 1.20160511 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix build with directory-1.2.6.2.
+   * github-backup.cabal: Add Setup-Depends."""]]
\ No newline at end of file

blog update
diff --git a/blog/entry/my_Shuttleworth_Foundation_flash_grant.mdwn b/blog/entry/my_Shuttleworth_Foundation_flash_grant.mdwn
new file mode 100644
index 0000000..2d6d395
--- /dev/null
+++ b/blog/entry/my_Shuttleworth_Foundation_flash_grant.mdwn
@@ -0,0 +1,31 @@
+Six months ago I received a 
+[small grant from the Shuttleworth Foundation](https://shuttleworthfoundation.org/flashgrants/)
+with no strings attached other than I should write this blog post about it.
+That was a nice surprise.
+
+The main thing that ended up being supported by the grant was work on
+[Propellor](https://propellor.branchable.com/), my configuration management
+system that is configured by writing Haskell code. I made 11 releases
+of Propellor in the grant period, with some improvements from me, and lots 
+more from other contributors. The biggest feature that I added to
+Propellor was [[LetsEncrypt support|letsencrypt_support_in_propellor]].
+
+More important than features is making Propellor prevent more classes of
+mistakes, by creative use of the type system. The biggest improvement
+in this area was
+[[type checking the OSes of Propellor properties|type_safe_multi-OS_Propellor]],
+so Propellor can reject host configurations that combine eg, Linux-only
+and FreeBSD-only properties.
+
+Turns out that the same groundwork needed for that is also what's needed
+to get Propellor to do type-level port conflict detection. I have 
+[a branch underway](http://propellor.branchable.com/todo/type_level_port_conflict_detection/)
+that does that, although it's not quite done yet.
+
+The grant also funded some of my work on git-annex. My main funding for
+git-annex doesn't cover development of the git-annex assistant, so the
+grant filled in that gap, particularly in updating the assistant to support
+[[the git-annex v6 repo format|git-annex_v6]].
+
+I've very happy to have received this grant, and with the things it enabled
+me to work on.
diff --git a/code/realtime/design.mdwn b/code/realtime/design.mdwn
index 3f7382a..eaedc43 100644
--- a/code/realtime/design.mdwn
+++ b/code/realtime/design.mdwn
@@ -221,3 +221,61 @@ that its owner has a lot of control over.
 Programming tech could be a similar roguelike minigame to having a
 conversation with an actor. This would basically build up a finite state
 machine that is used to drive the tech.
+
+## user interface
+
+Limit UI to work on lowest common demoninator systems:
+
+* 80x25
+* ascii
+* colors for emphasis but not sole indication of what's where
+
+While this is a rouguelike, it's not one that uses a ton of special keys.
+Movement is via arrow keys. Selection of actions is through menus.
+Have a left-side menu that's always present, and tab switches focus
+between the viewport and the menu.
+
+      scrolling                      date  
+      message                        date  
+      area                           date  
+      [M]ore    ###################|date|###
+      [I]nventy #                          #
+      [B]obble  #                          #
+      [ ]       #                          #
+      [ ]       #             @            #
+      [ ]       #                          #
+      [P]hone   #                          #
+      [ ]       #                          #
+                ########|Region name|#######
+
+Menu items have hotkeys for easy selection (without needing to tab to
+the menu).
+
+The scrolling message area is at least 3 lines tall, and grows to occupy
+any spare lines in the screen. The "[M] more" menu item shows up
+when more than its height in messages are added in a turn.
+
+Each message is dated, and there's also a current date display.
+
+Messages could also contain prompts for additional actions that can only be
+performed shortly after the message appears. These would use a similar UI to
+menu items, so the message area and menu area kind of blur together.
+For example:
+
+    He doesn't seem swayed by your arguments.       20 May 2166
+    [B]ribe him, or [A]rgue on?
+                ###################################|20 May 2166]##
+    [I]nventory #                                                #
+
+The user interface should also work in tablet mode; clicks on menu items
+select them, and clicks around the @ move the @ toward the click.
+
+Some things may prompt for text (eg names); if so a default should always
+be provided so tablet users don't need to enter text.
+
+When prompting for a number, eg how long to bobble up for, do it using a
+menu of reasonable choices with perhaps an "other ..."
+
+## funding
+
+Kickstarter?

updates^
diff --git a/code/realtime/design.mdwn b/code/realtime/design.mdwn
index 208c3e9..3f7382a 100644
--- a/code/realtime/design.mdwn
+++ b/code/realtime/design.mdwn
@@ -6,7 +6,7 @@ _Marooned in Realtime_.
 ## Goal
 
 Convince the bobbled remainders of humanity to unify and re-make
-a civilization.
+a civilization, instead of dispersing off into the future.
 
 ## Intro
 
@@ -17,16 +17,6 @@ compared to many others who started nearer to that point.
 
 ## Setting
 
-### Region
-
-The roguelike map should cover a relatively small region. Many bobbles have
-ended up here due to historial reasons (perhaps because the area has a
-stable geography). Around a dozen bobbles should fit on the screen.
-
-Topography: The region will often be a coastline, or contain a river, or be a
-valley in mountains. These large-scale features will be displayed in the
-region.
-
 ### Compounds
 
                           ...
@@ -43,20 +33,64 @@ per room. Avoids needing map generation, etc. Each room has a name
 (storeroom, kitchen, etc), and appropriate starting contents. Center room
 is always control room.
 
+### Region
+
+The roguelike map should cover a relatively small region. Many bobbles have
+ended up here due to historial reasons (perhaps because the area has a
+stable geography). Around a dozen bobbles should fit on the screen.
+
+Topography: The region will often be a coastline, or contain a river, or be a
+valley in mountains. These large-scale features will be displayed in the
+region, along with the bobbles and perhaps other things (ruins, etc) in it.
+
+      #######################################################################
+      #            ^ ^                          ~~~                         #
+      #          ^ ^ ^                         ~~~                          #
+      #           ^ ^ ^                       ~~~                           #
+      #            ^  ^            ...        ~~~                           #
+      #     .        ^            .....      ~~~                            #
+      #    .C.     ^ ^  ^         ..B..     ~~~                           ^ #
+      #     .       ^ ^ ^         .....     ~~~                         ^  ^#
+      #            ^ ^  ^          ...      ~~~                        ^ ^  #
+      #            ^ ^ ^                   ~~~                        ^ ^ ^ #
+      #           ^ ^ ^   ...             ~~~                       ^ ^     #
+      #         ^ ^      .....          ~~~                        ^ ^ ^    #
+      #        ^ ^ ^    .......       ~~~    ...                  ^ ^ ^     #
+      #   ^^ ^ ^ ^ ^    ...A...     ~~~     .....      .        ^ ^  ^      #
+      #  ^  ^ ^ ^ ^     .......   ~~~       ..@..     .D.      ^ ^ ^^       #
+      #  ^ ^ ^           .....    ~~~       .....      .      ^ ^ ^^        #
+      #   ^ ^             ...    ~~~         ...               ^ ^          #
+      #   ^  ^                   ~~~                            ^ ^         #
+      #   ^ ^                   ~~~                              ^ ^        #
+      #######################################################################
+
+Here the player @ can easily visit D, but the river (~) blocks easy access 
+to A and B. And, C is isolated from everything by the mountians (^).
+
+Bobbles can get stuck in a an ocean, or underground, and will then be
+unable to unbobble until time changes the topography, or until rescued.
+(Safety mechanisms immediately re-bobble when in such a situation.) A
+bobble in a river should reroute the river around it.
+
 ### World / Universe
 
-Avoid needing to generate a full consistent world map (or more),
-but other bobbles can be located in other settings, and bobbles
-can be moved (by appropriate tech). 
+There's not a single region; other bobbles can be located in other regions,
+and bobbles can be moved (by appropriate tech). 
 
 ### Inter region movement
 
+Regions have names, which start as some general description of their
+contents such as "verdant river valley" for the above, or eg, "ruins of
+Smithville". The user can rename a region. Each region's name must be unique.
+
 When the user moves outside the local region, query where they're going,
 and let them try to travel there, but in an abstract, non-roguelike manner.
 For example, attempt to walk to some other known region, which may take
 months or years (game time). Or, fly to other region, which may take
-minures. Or, explore for X days looking for a region containing a lake,
-river, mountain, coast, etc.
+minutes. Or, explore for X days looking for a region containing a lake,
+river, mountain, coast, etc. This avoids needing a full considtent world
+map connecting regions, which would be pretty hard to implement and
+represent. It also allows regions to not all be on earth.
 
 With sufficient tech, it's possible to move an entire compound, or a 
 bobble to another region. Same inter-region movement applies.
@@ -69,7 +103,7 @@ regions.
 Game time is key. The game clock starts 100 years in the future from when
 the user runs the game. Bobbling can move it forward in arbitrary leaps.
 Movement within a region moves it forward in minutes or hours. Inter-region
-movement in minutes to mutiple years.
+movement in minutes (with tech) to mutiple years.
 
 Age is the most important stat. Reach old age, die, and game is over,
 win or lose. Tech can of course extend lifespans, somewhat.
@@ -103,21 +137,17 @@ tech allows fine-tuning this.
 * Bobble-in-bobble? I forget if the book allowed this, offensively,
   and/or defensively.
 
-### tech
-
-Tech tree, items with abilities, seems good enough.
-
-### actors
+## actors
 
 A massive part of the game.
 
 (Any way to have multiple player characters? Seems sorta doable; the game
 in multiplayer could be played turn-based, with whichever player is
-furthest back in time being able to act. When players reach the same time,
-they can interact. But, this would require other goals for other players,
-unless cooperative play makes sense. If a player decides their goal is to
-go forward until the sun explodes, they're probably kind of out of the rest
-of the game.)
+furthest back in time being able to act, and when players are at the same
+point in time they could move around in their regions, and can interact.
+But, this would require other goals for other players, unless cooperative
+play makes sense. If a player decides their goal is to go forward until the
+sun explodes, they're probably kind of out of the rest of the game.)
 
 actors have:
 
@@ -133,7 +163,7 @@ actors have:
 * A shorterm goal. ("kill so-and-so", "take such-and-such", "explore region
   for a week)")
 * Trust levels for every other actor, which change as circumstances change.
-* Value placed on every other actor, which change as circumstances change.
+* Value placed on every other actor, which changes as circumstances change.
   (Ie, might not trust someone much, but highly value them for whatever
   reason.)
 * Alliances and agreements with other actors. 
@@ -157,7 +187,7 @@ How to implement this stuff? I want scenarios like:
   `min (B is due to unbobble next) (100 years)`, and if B is unbobbled then,
   will go out to steal from them.
 
-## conversation system
+### conversation system
 
 Crazy idea: Make having a conversation with an actor be a roguelike
 minigame. Items could represent conversational gambits, and rooms topics of
@@ -175,3 +205,19 @@ You destroy the Flawed Argument with your +2 Logic!
 You trip over an emotional mine. It explodes! Movement is difficult.
 The self-forfulling prophecy grabs you. You are being crushed!
 
+### tech
+
+Tech tree, from relatively prosiac items, up to items produced very near
+the singularity. The power increases exponentially.
+
+Some tech items just grant abilities, like the ability to tell when a
+bobble will pop, or the ability to move quickly between regions, have
+telepresense, move bobbles up to a certian size, or destroy other tech.
+
+Other tech needs to be programmable, so it can be used when its owner is
+bobbled, or in a different region. Such tech is kind of an actor, just one
+that its owner has a lot of control over.
+
+Programming tech could be a similar roguelike minigame to having a
+conversation with an actor. This would basically build up a finite state
+machine that is used to drive the tech.

Added a comment: Super promising.
diff --git a/blog/entry/propelling_disk_images/comment_2_806790fb58cec5e9b4c77883c0c388c4._comment b/blog/entry/propelling_disk_images/comment_2_806790fb58cec5e9b4c77883c0c388c4._comment
new file mode 100644
index 0000000..23f137b
--- /dev/null
+++ b/blog/entry/propelling_disk_images/comment_2_806790fb58cec5e9b4c77883c0c388c4._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="frederik@ffbea6a549cb3f460d110386c0f634c1ddc6a68a"
+ nickname="frederik"
+ subject="Super promising."
+ date="2016-04-20T14:03:22Z"
+ content="""
+A year ago, I used d-i preseeding to accomplish a [headless install of a Lime2 board](http://www.vanrenterghem.biz/Linux/Installing_Debian_on_Lime2.shtml). I now have a Micro ordered - I don't suppose you implemented that u-boot setup yet? Either way, great stuff.
+
+-- Frederik
+"""]]

Added a comment: mairix 0.23+git20131125-0.5
diff --git a/blog/entry/moving_my_email_archives_and_packages_to_git-annex/comment_1_53c142df8db7b68f10d89d500a330dc4._comment b/blog/entry/moving_my_email_archives_and_packages_to_git-annex/comment_1_53c142df8db7b68f10d89d500a330dc4._comment
new file mode 100644
index 0000000..2c8539e
--- /dev/null
+++ b/blog/entry/moving_my_email_archives_and_packages_to_git-annex/comment_1_53c142df8db7b68f10d89d500a330dc4._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ subject="mairix 0.23+git20131125-0.5"
+ date="2016-04-15T23:02:07Z"
+ content="""
+The version of mairix incoming to Debian unstable has been patched so that including `follow_mbox_symlinks` in your `.mairixrc` will restore mairix following symlinks to mboxes.
+"""]]

add news item for moreutils 0.59
diff --git a/code/moreutils/news/version_0.54.mdwn b/code/moreutils/news/version_0.54.mdwn
deleted file mode 100644
index fd13712..0000000
--- a/code/moreutils/news/version_0.54.mdwn
+++ /dev/null
@@ -1,5 +0,0 @@
-moreutils 0.54 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * vidir: Fix bug in handling filenames that share a common
-     prefix when renaming. Closes: #[654326](http://bugs.debian.org/654326)
-     Thanks, Kushal Kumaran"""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.59.mdwn b/code/moreutils/news/version_0.59.mdwn
new file mode 100644
index 0000000..1d39e7b
--- /dev/null
+++ b/code/moreutils/news/version_0.59.mdwn
@@ -0,0 +1,10 @@
+moreutils 0.59 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Makefile: add DOCBOOKXSL setting.
+     Thanks, Kevin Bullock
+   * parallel: include signal.h to fix warning when building with clang
+     Thanks, Kevin Bullock
+   * chronic: Added -v option for more verbose output.
+     Thanks, Tomas Mudrunka
+   * chronic: Added -e option to display any stderr.
+     Thanks, Tomas Mudrunka"""]]
\ No newline at end of file

switching to git.joeyh.name
diff --git a/blog/entry/a_programmable_alarm_clock_using_systemd.mdwn b/blog/entry/a_programmable_alarm_clock_using_systemd.mdwn
index e5b9148..687981d 100644
--- a/blog/entry/a_programmable_alarm_clock_using_systemd.mdwn
+++ b/blog/entry/a_programmable_alarm_clock_using_systemd.mdwn
@@ -1,5 +1,5 @@
 I've taught my laptop to wake up at 7:30 in the morning. When it does, it
-will run [whatever's in my ~/bin/goodmorning script](http://git.kitenet.net/?p=joey/home.git;a=blob;f=bin/goodmorning;h=567f50f0595c6111bc416c0e5b2dd1de09214790;hb=HEAD). Then, if the lid is
+will run [whatever's in my ~/bin/goodmorning script](http://git.joeyh.name/?p=joey/home.git;a=blob;f=bin/goodmorning;h=567f50f0595c6111bc416c0e5b2dd1de09214790;hb=HEAD). Then, if the lid is
 still closed, it will go back to sleep again.
 
 So, it's a programmable alarm clock that doesn't need the laptop to be left
diff --git a/blog/entry/announcing_etckeeper.mdwn b/blog/entry/announcing_etckeeper.mdwn
index 4e3b0bc..6fdb6fc 100644
--- a/blog/entry/announcing_etckeeper.mdwn
+++ b/blog/entry/announcing_etckeeper.mdwn
@@ -34,7 +34,7 @@ so I can't upload packages, but both it and metastore can be built from git
 easily enough:
 
 	git clone git://git.hardeman.nu/metastore.git; cd metastore; dpkg-buildpackage
-	git clone git://git.kitenet.net/etckeeper; cd etckeeper; dpkg-buildpackage
+	git clone git://git.joeyh.name/etckeeper; cd etckeeper; dpkg-buildpackage
 
 (Update: Now uploaded to unstable.)
 
diff --git a/blog/entry/announcing_olduse.net.mdwn b/blog/entry/announcing_olduse.net.mdwn
index 66030d7..9d017b2 100644
--- a/blog/entry/announcing_olduse.net.mdwn
+++ b/blog/entry/announcing_olduse.net.mdwn
@@ -51,7 +51,7 @@ Usenet's flowering.
   12 hours. When I realized I also needed an A-News to B-News converter,
   I knew it was worth it to have done things right, because that took
   only 43 more lines, and worked 100% on the first run!
-  My code repository for olduse.net is [here](http://git.kitenet.net/?p=oldusenet.git;a=summary).
+  My code repository for olduse.net is [here](http://git.joeyh.name/?p=oldusenet.git;a=summary).
 
 ----
 
diff --git a/blog/entry/cpan_purity_tester.mdwn b/blog/entry/cpan_purity_tester.mdwn
index c94ef79..5c87a73 100644
--- a/blog/entry/cpan_purity_tester.mdwn
+++ b/blog/entry/cpan_purity_tester.mdwn
@@ -1,6 +1,6 @@
 # CPAN Purity tester
 
-<a href="http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/cpan-purity">Here</a>'s a fairly
+<a href="http://git.joeyh.name/?p=joey/home.git;a=blob_plain;f=bin/cpan-purity">Here</a>'s a fairly
 sweet perl hack that I just wrote. Test how much of a the guts of a program
 comes from sweet, delicious <a href="http://cpan.org/">CPAN</a>, and how
 much is nasty perl code you wrote. 
diff --git a/blog/entry/dadagoogoo.mdwn b/blog/entry/dadagoogoo.mdwn
index 555f4ba..0235e5c 100644
--- a/blog/entry/dadagoogoo.mdwn
+++ b/blog/entry/dadagoogoo.mdwn
@@ -32,8 +32,8 @@ manage some kind of sense at length too:
 
 This was accomplished using only 99 lines of code.
 I imported the datasets into Xapian databases using
-[this program](http://git.kitenet.net/?p=joey/src.git;a=blob;f=misc/googlengrams/populate.pl).
-And [this program](http://git.kitenet.net/?p=joey/src.git;a=blob;f=misc/googlengrams/dadagoogoo.pl) is the text generator.
+[this program](http://git.joeyh.name/?p=joey/src.git;a=blob;f=misc/googlengrams/populate.pl).
+And [this program](http://git.joeyh.name/?p=joey/src.git;a=blob;f=misc/googlengrams/dadagoogoo.pl) is the text generator.
 
 I threw out the metadata, to keep the Xapian databases of reasonable
 size. By which I mean, only a dozen gigabytes. It might be interesting
diff --git a/blog/entry/dbus_reconnection.mdwn b/blog/entry/dbus_reconnection.mdwn
index f8cedc9..8f81124 100644
--- a/blog/entry/dbus_reconnection.mdwn
+++ b/blog/entry/dbus_reconnection.mdwn
@@ -1,7 +1,7 @@
 [Julien](http://blog.technologeek.org/2008/06/07/112), dbus and hal make
 handling server reconnection correctly Hard, or impossible, in my limited
 experience. This information is what I can remember based on 
-[git logs](http://git.kitenet.net/?p=wmbattery.git;a=blobdiff;f=simplehal.c;h=77da060ed3a1377ddeca48acfc9dfbed912b8e9b;hp=f345b9a3995e2b37e6c3c80079311b8fe5a08a60;hb=2b47eca8b1e1c87656f67f1f30f45ef6afface7a;hpb=e48d2d48acbaa547052f2b90e332752445802bd4)
+[git logs](http://git.joeyh.name/?p=wmbattery.git;a=blobdiff;f=simplehal.c;h=77da060ed3a1377ddeca48acfc9dfbed912b8e9b;hp=f345b9a3995e2b37e6c3c80079311b8fe5a08a60;hb=2b47eca8b1e1c87656f67f1f30f45ef6afface7a;hpb=e48d2d48acbaa547052f2b90e332752445802bd4)
 from when I beat my brains against this particular wall for a few days.
 
 You'd think you could check for an exception after calling
diff --git a/blog/entry/fall_back_day.mdwn b/blog/entry/fall_back_day.mdwn
index 3009b1c..84a7c7e 100644
--- a/blog/entry/fall_back_day.mdwn
+++ b/blog/entry/fall_back_day.mdwn
@@ -3,11 +3,11 @@ time, money, and even lives. So instead of pointing to new
 indicators of that, I'll post some daylight related code today, since
 daylight just got very scarce.
 
-[Here's](http://git.kitenet.net/?p=joey/home.git;a=blob;f=bin/sunrise;h=844cde4dc3d8050fc2192548da2da1c49406a6a8;hb=da102bec5ea1fa2ac2c9256d933d2cc16a71dcd2)
+[Here's](http://git.joeyh.name/?p=joey/home.git;a=blob;f=bin/sunrise;h=844cde4dc3d8050fc2192548da2da1c49406a6a8;hb=da102bec5ea1fa2ac2c9256d933d2cc16a71dcd2)
 my old sunrise/sunset program. Install under either name and it'll
 print the time of sunrise or sunset. Implemented as an insane `remind` script.
 
-[Here's](http://git.kitenet.net/?p=joey/home.git;a=blob;f=bin/sunrise;h=2650184ca01d495a4e45bac1a88f923a837d102c;hb=49a58adb36a22c476c5497d5d031eb8725ac3d76)
+[Here's](http://git.joeyh.name/?p=joey/home.git;a=blob;f=bin/sunrise;h=2650184ca01d495a4e45bac1a88f923a837d102c;hb=49a58adb36a22c476c5497d5d031eb8725ac3d76)
 my new version of the same thing, featuring a spiffier output and saner
 implementation:
 
diff --git a/blog/entry/file_set_split_utility.mdwn b/blog/entry/file_set_split_utility.mdwn
index 5189e2a..48e5f8f 100644
--- a/blog/entry/file_set_split_utility.mdwn
+++ b/blog/entry/file_set_split_utility.mdwn
@@ -47,6 +47,6 @@ I'm currently using gafitter, although oddly not using its GA mode, but its
 simple packing mode (because I want to keep subdirs on the same dvd). The
 script I use to split out a dvd worth of stuff with gafitter and burn it
 with growisofs can be downloaded from my repo
-[here](http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/dvdarchive;hb=HEAD).
+[here](http://git.joeyh.name/?p=joey/home.git;a=blob_plain;f=bin/dvdarchive;hb=HEAD).
 
 [[discussion]]
diff --git a/blog/entry/git_transitions.mdwn b/blog/entry/git_transitions.mdwn
index 3c93d4a..dbc2b3e 100644
--- a/blog/entry/git_transitions.mdwn
+++ b/blog/entry/git_transitions.mdwn
@@ -1,4 +1,4 @@
-I've been moving [some things](http://git.kitenet.net/) to git. My blog is the
+I've been moving [some things](http://git.joeyh.name/) to git. My blog is the
 first thing that really benefitted from distributed revision control though,
 since I can use [[code/ikiwiki]] with git to have a mirror/branch of the blog
 on my laptop. That worked out quite nicely. I've described the setup
diff --git a/blog/entry/haskell_and_xmonad.mdwn b/blog/entry/haskell_and_xmonad.mdwn
index 43617f4..5c60b32 100644
--- a/blog/entry/haskell_and_xmonad.mdwn
+++ b/blog/entry/haskell_and_xmonad.mdwn
@@ -27,7 +27,7 @@ Anyway, I know more than enough Haskell now to configure
 evening, I especially like:
 
 * Being able to compile
-  [my xmonad.hs](http://git.kitenet.net/?p=joey/home-plus.git;a=blob;f=.xmonad/xmonad.hs;hb=HEAD)
+  [my xmonad.hs](http://git.joeyh.name/?p=joey/home-plus.git;a=blob;f=.xmonad/xmonad.hs;hb=HEAD)
   and rely on Haskell's type checking to make sure I wrote it correctly
   and it will work.
 * Xmonad's [integration with gnome](http://www.haskell.org/haskellwiki/Xmonad/Using_xmonad_in_Gnome).
@@ -52,7 +52,7 @@ evening, I especially like:
   </pre>
   (And it wasn't too hard to enhance this with a special-purpose grid
   layout for the workspace I run pidgin on.)
-* That [my xmonad.hs](http://git.kitenet.net/?p=joey/home-plus.git;a=blob;f=.xmonad/xmonad.hs;hb=HEAD)
+* That [my xmonad.hs](http://git.joeyh.name/?p=joey/home-plus.git;a=blob;f=.xmonad/xmonad.hs;hb=HEAD)
   is small, easy to understand, and doesn't contain any
   boilerplate beyond `main = xmonad $ gnomeConfig`.
 * It lets me muck about with doing something real with Haskell without
diff --git a/blog/entry/introducing_mr.mdwn b/blog/entry/introducing_mr.mdwn
index d8bfdf9..059c30d 100644
--- a/blog/entry/introducing_mr.mdwn
+++ b/blog/entry/introducing_mr.mdwn
@@ -30,7 +30,7 @@ directory, but inside the repositories it checks out.
 Here's my current `~/.mrconfig` file.
 
 	[src/mr]
-	checkout = git clone ssh://git.kitenet.net/srv/git/kitenet.net/mr
+	checkout = git clone ssh://git.joeyh.name/srv/git.joeyh.name/mr
 
 	[src/linux-2.6]
 	checkout = git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
@@ -41,7 +41,7 @@ Here's my current `~/.mrconfig` file.
 	# A merge of the upstream dpkg git repo and my own personal branch.
 	checkout = git clone git://git.debian.org/git/dpkg/dpkg.git && \
 	        cd dpkg && \
-	        git remote add kite ssh://kitenet.net/srv/git/kitenet.net/dpkg && \
+	        git remote add kite ssh://kitenet.net/srv/git.joeyh.name/dpkg && \
 	        git fetch kite && \
 	        git checkout -b sourcev3 kite/sourcev3
 	update = git pull origin master && git pull kite sourcev3
diff --git a/blog/entry/introducing_propellor.mdwn b/blog/entry/introducing_propellor.mdwn
index 97f6f28..cb8fd46 100644
--- a/blog/entry/introducing_propellor.mdwn
+++ b/blog/entry/introducing_propellor.mdwn
@@ -15,7 +15,7 @@ debconf, which claims to be the "Debian Configuration Management system"..
 But I didn't understand configuration management back then either.)
 
 So, propellor makes some perhaps wacky choices. The least of these
-is that it's built from [a git repository](http://git.kitenet.net/?p=propellor.git;a=summary)
+is that it's built from [a git repository](http://git.joeyh.name/?p=propellor.git;a=summary)
 that any (theoretical) other users will fork and modify; a cron job can
 re-make it from time to time and pull down configuration changes, or
 *something* can be run to push changes.
diff --git a/blog/entry/linux_radio_recorder.mdwn b/blog/entry/linux_radio_recorder.mdwn
index a9913d2..27e55f7 100644
--- a/blog/entry/linux_radio_recorder.mdwn
+++ b/blog/entry/linux_radio_recorder.mdwn
@@ -2,10 +2,10 @@ I dug up an old radio and threw this together tonight. It's been done
 before, but the scripts out there seemed overly complex and didn't use
 alsa. Here's how I did it:
 
-* [radiorecord](http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/radiorecord;hb=HEAD)
+* [radiorecord](http://git.joeyh.name/?p=joey/home.git;a=blob_plain;f=bin/radiorecord;hb=HEAD)
   is a shell script to record a given number of minutes from
   the radio to an ogg file.
-* [crontab](http://git.kitenet.net/?p=joey/cron.git;a=blob_plain;f=joey/dragon.kitenet.net;hb=HEAD)
+* [crontab](http://git.joeyh.name/?p=joey/cron.git;a=blob_plain;f=joey/dragon.kitenet.net;hb=HEAD)
   to schedule when to record shows
 
 Of course, this assumes that the station doesn't move shows around and that
diff --git a/blog/entry/local_rsync_accelerator.mdwn b/blog/entry/local_rsync_accelerator.mdwn
index 78e3cb3..d0685a4 100644
--- a/blog/entry/local_rsync_accelerator.mdwn
+++ b/blog/entry/local_rsync_accelerator.mdwn
@@ -33,7 +33,7 @@ on a typical home NAS, with a slow (arm) CPU, the picture changes
 entirely -- now the checksum overhead is unbearable, while the IO overhead
 is minimal.
 
-So, [here's local-rsync](http://git.kitenet.net/?p=joey/home.git;a=blob;f=bin/local-rsync;hb=0bed147834aef4efe8650d731f9160fb41b16014).

(Diff truncated)
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index b229326..c6766eb 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -68,6 +68,8 @@ I think this would be usefull as hell for debuging cron scripts. I have currentl
 > I think this would be a reasonable default behavior. Patches accepted.
 > --[[Joey]] 
 
+>> I just realized that this would be usefull as separate wrapper tool that can be used by chronic. --Tomas Mudrunka
+
 ## poptail and peeif
 
 I just finished two utilities that might be general purpose enough for the collection.  They're on github here:

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index e2d642d..b229326 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -39,6 +39,8 @@ I'd would really appreciate this feature. I am trying to write my scripts to ret
 > don't exit nonzero on error are somehow practicing good hygene in their
 > output to stderr. --[[Joey]]
 
+>> In fact such scripts do not usually output to stderr themselves. But they may just call some (well written) binararies that output to stderr or exit nonzero. However the script itself exits zero after such fail, because it didn't expected binary to fail and it's not handler properly. At least i think this is the case. --Tomas Mudrunka
+
 ### verbose mode for distidguishing output streams and return code
 
 Another feature that might be interresting in chronic would be distinguishing between stdout and stderr in output.

update
diff --git a/code/moreutils.mdwn b/code/moreutils.mdwn
index b7cd109..d02a7a5 100644
--- a/code/moreutils.mdwn
+++ b/code/moreutils.mdwn
@@ -32,6 +32,7 @@ and don't duplicate other well-known tools.
 
 - chronic: runs a command quietly unless it fails
 - combine: combine the lines in two files using boolean operations
+- errno: look up errno names and descriptions
 - ifdata: get network interface info without parsing ifconfig output
 - ifne: run a program if the standard input is not empty
 - isutf8: check if a file or standard input is utf-8
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index ceba4c1..e2d642d 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -30,6 +30,15 @@ I'd would really appreciate this feature. I am trying to write my scripts to ret
 
 -- Tomas Mudrunka
 
+> I'd proabably be willing to merge a patch adding -e, but making it the
+> default would break existing uses of chronic.
+> 
+> I don't like the filtering out whitespace idea.
+> 
+> I'm somewhat dubious about the idea that scripts so badly written they
+> don't exit nonzero on error are somehow practicing good hygene in their
+> output to stderr. --[[Joey]]
+
 ### verbose mode for distidguishing output streams and return code
 
 Another feature that might be interresting in chronic would be distinguishing between stdout and stderr in output.
@@ -54,6 +63,9 @@ I think this would be usefull as hell for debuging cron scripts. I have currentl
 
 -- Tomas Mudrunka
 
+> I think this would be a reasonable default behavior. Patches accepted.
+> --[[Joey]] 
+
 ## poptail and peeif
 
 I just finished two utilities that might be general purpose enough for the collection.  They're on github here:
@@ -74,6 +86,8 @@ How about giving errno program some more love and just mentioning it on the proj
 
 Thanks
 
+> Thanks, done --[[Joey]]
+
 ## dc
 
 You are sick of doing ls | wc -l
@@ -175,7 +189,7 @@ tree using ansi colors and the md5sum if it is a file <= 100 MB.
     -r-x ug- 20120322-1859 /usr/bin/X a7ac83a4031da58dab3a88e9dd247f51
 
 It needs ruby. Tested & developed under Ubuntu 12.04 with Ruby 1.8.
-
+ 
 License GPLv3.
 
 I would be glad if you embed it into moreutils. Please send a note if you are interested.

move some things out of the propellor feed
diff --git a/blog/entry/how_I_wrote_init_by_accident.mdwn b/blog/entry/how_I_wrote_init_by_accident.mdwn
index 946a2ac..ba21253 100644
--- a/blog/entry/how_I_wrote_init_by_accident.mdwn
+++ b/blog/entry/how_I_wrote_init_by_accident.mdwn
@@ -53,5 +53,5 @@ If that does happen, perhaps I'll eventually be able to remove 2 lines of code
 from propellor.
 
 [[!meta title="how I wrote init by accident"]]
-[[!tag propellor]]
+[[!tag code/propellor]]
 [[!tag haskell]]
diff --git a/blog/entry/then_and_now.mdwn b/blog/entry/then_and_now.mdwn
index 597b7e7..242d684 100644
--- a/blog/entry/then_and_now.mdwn
+++ b/blog/entry/then_and_now.mdwn
@@ -62,4 +62,4 @@ of code, [[propellor_is_d-i_2.0]]); indeed I'm just adding generic useful stuff
 and building further stuff out of it without any particular end goal. Perhaps
 that's the real difference.
 
-[[!tag propellor]]
+[[!tag code/propellor]]
diff --git a/blog/entry/using_a_debian_package_as_the_remote_for_a_local_config_repo.mdwn b/blog/entry/using_a_debian_package_as_the_remote_for_a_local_config_repo.mdwn
index 1e4ed59..4c02901 100644
--- a/blog/entry/using_a_debian_package_as_the_remote_for_a_local_config_repo.mdwn
+++ b/blog/entry/using_a_debian_package_as_the_remote_for_a_local_config_repo.mdwn
@@ -76,4 +76,4 @@ somewhere in /usr, and check them into a new empty repository as part of the
 generation of the upstream/master branch.
 
 [[!meta title="using a debian package as the remote for a local config repo"]]
-[[!tag propellor]]
+[[!tag code/propellor]]

fix tag
diff --git a/blog/entry/type_safe_multi-OS_Propellor.mdwn b/blog/entry/type_safe_multi-OS_Propellor.mdwn
index f211610..fce26bb 100644
--- a/blog/entry/type_safe_multi-OS_Propellor.mdwn
+++ b/blog/entry/type_safe_multi-OS_Propellor.mdwn
@@ -190,4 +190,4 @@ system questions.
 Also thanks to the Shuttleworth foundation, which funded this work
 by way of a Flash Grant.
 
-[[!tag code/propellor haskell]]
+[[!tag propellor haskell]]

tyo
diff --git a/blog/entry/type_safe_multi-OS_Propellor.mdwn b/blog/entry/type_safe_multi-OS_Propellor.mdwn
index c3d9ae6..f211610 100644
--- a/blog/entry/type_safe_multi-OS_Propellor.mdwn
+++ b/blog/entry/type_safe_multi-OS_Propellor.mdwn
@@ -93,7 +93,7 @@ aptUpgraded = property "apt upgraded" (apt "upgrade" `requires` apt "update")
 pkgUpgraded :: Property FreeBSD
 pkgUpgraded = property "pkg upgraded" (pkg "upgrade")
 	
-upgraded :: UnixLike
+upgraded :: Property UnixLike
 upgraded = (aptUpgraded `pickOS` pkgUpgraded)
 	`describe` "OS upgraded"
 """]]

layout
diff --git a/blog/entry/type_safe_multi-OS_Propellor.mdwn b/blog/entry/type_safe_multi-OS_Propellor.mdwn
index cad4ee0..c3d9ae6 100644
--- a/blog/entry/type_safe_multi-OS_Propellor.mdwn
+++ b/blog/entry/type_safe_multi-OS_Propellor.mdwn
@@ -8,11 +8,10 @@ the type checker should tell them they're asking for something that can't
 fly.
 
 [[!format haskell """
-	-- Is this a Debian or a FreeBSD host? I can't remember, let's
-	-- use both package managers!
-	host "example.com" $ props
-		& aptUpgraded
-		& pkgUpgraded
+-- Is this a Debian or a FreeBSD host? I can't remember, let's use both package managers!
+host "example.com" $ props
+	& aptUpgraded
+	& pkgUpgraded
 """]]
 
 As of propellor 3.0.0 ([in git now](http://source.propellor.branchable.com/?p=source.git;a=commitdiff;h=a1655d24bbb1db9caccdf93eae8110d746389ae2);
@@ -21,7 +20,9 @@ to be released soon), the type checker will catch such mistakes.
 Also, it's really easy to combine two OS-specific properties into a
 property that supports both OS's:
 
-	upgraded = aptUpgraded `pickOS` pkgUpgraded
+[[!format haskell """
+upgraded = aptUpgraded `pickOS` pkgUpgraded
+"""]]
 
 ### type level lists and functions
 
@@ -31,9 +32,9 @@ types describing the type, and I couldn't find a better name.) This list
 can contain one or more OS's targeted by the property:
 
 [[!format haskell """
-	aptUpgraded :: Property (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish ])
+aptUpgraded :: Property (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish ])
 
-	pkgUpgraded :: Property (MetaTypes '[ 'Targeting 'OSFreeBSD ])
+pkgUpgraded :: Property (MetaTypes '[ 'Targeting 'OSFreeBSD ])
 """]]
 
 In Haskell type-level lists and other DataKinds are indicated by the
@@ -42,9 +43,9 @@ aliases and type operators, which let the same types be expressed
 more cleanly:
 
 [[!format haskell """
-	aptUpgraded :: Property (Debian + Buntish)
+aptUpgraded :: Property (Debian + Buntish)
 
-	pkgUpgraded :: Property FreeBSD
+pkgUpgraded :: Property FreeBSD
 """]]
 
 Whenever two properties are combined, their metatypes are combined
@@ -86,15 +87,15 @@ As shown here, `pickOS` makes a property that
 decides which of two properties to use based on the host's OS.
 
 [[!format haskell """
-	aptUpgraded :: Property DebianLike
-	aptUpgraded = property "apt upgraded" (apt "upgrade" `requires` apt "update")
+aptUpgraded :: Property DebianLike
+aptUpgraded = property "apt upgraded" (apt "upgrade" `requires` apt "update")
 
-	pkgUpgraded :: Property FreeBSD
-	pkgUpgraded = property "pkg upgraded" (pkg "upgrade")
+pkgUpgraded :: Property FreeBSD
+pkgUpgraded = property "pkg upgraded" (pkg "upgrade")
 	
-	upgraded :: UnixLike
-	upgraded = (aptUpgraded `pickOS` pkgUpgraded)
-		`describe` "OS upgraded"
+upgraded :: UnixLike
+upgraded = (aptUpgraded `pickOS` pkgUpgraded)
+	`describe` "OS upgraded"
 """]]
 
 Any number of OS's can be chained this way, to build a property that
@@ -133,11 +134,11 @@ figure out all the types without some help.
 A simple example of this problem is as follows.
 
 [[!format haskell """
-	foo :: Property UnixLike
-	foo = p `requires` bar
-	  where
-		p = property "foo" $ do
-			...
+foo :: Property UnixLike
+foo = p `requires` bar
+  where
+	p = property "foo" $ do
+		...
 """]]
  
 The type checker will complain that "The type variable ‘metatypes1’ is
@@ -162,9 +163,11 @@ hackage, it still seems to
 Also, using `ensureProperty`, which runs one property inside the action
 of another property, got complicated by the need to pass it a type witness.
 
-	foo = Property Debian
-	foo = property' $ \witness -> do
-		ensureProperty witness (aptInstall "foo")
+[[!format haskell """
+foo = Property Debian
+foo = property' $ \witness -> do
+	ensureProperty witness (aptInstall "foo")
+"""]]
 
 That witness is used to type check that the inner property targets
 every OS that the outer property targets. I think it might be possible

publish
diff --git a/blog/entry/type_safe_multi-OS_Propellor.mdwn b/blog/entry/type_safe_multi-OS_Propellor.mdwn
index c96f7a9..cad4ee0 100644
--- a/blog/entry/type_safe_multi-OS_Propellor.mdwn
+++ b/blog/entry/type_safe_multi-OS_Propellor.mdwn
@@ -5,7 +5,7 @@ FreeBSD, and others on both.
 
 The user shouldn't need to worry about making a mistake like this;
 the type checker should tell them they're asking for something that can't
-work.
+fly.
 
 [[!format haskell """
 	-- Is this a Debian or a FreeBSD host? I can't remember, let's
@@ -15,12 +15,17 @@ work.
 		& pkgUpgraded
 """]]
 
-As of propellor 3.0.0 (to be released soon; in git now), that will fail to
-build.
+As of propellor 3.0.0 ([in git now](http://source.propellor.branchable.com/?p=source.git;a=commitdiff;h=a1655d24bbb1db9caccdf93eae8110d746389ae2);
+to be released soon), the type checker will catch such mistakes.
+
+Also, it's really easy to combine two OS-specific properties into a
+property that supports both OS's:
+
+	upgraded = aptUpgraded `pickOS` pkgUpgraded
 
 ### type level lists and functions
 
-To make that fail to build, I used type-level lists. A property has a
+The magick making this work is type-level lists. A property has a
 metatypes list as part of its type. (So called because it's additional
 types describing the type, and I couldn't find a better name.) This list
 can contain one or more OS's targeted by the property:
@@ -47,8 +52,8 @@ using a type-level function. Combining `aptUpgraded` and `pkgUpgraded`
 will yield a metatypes that targets no OS's, since they have none in
 common. So will fail to type check.
 
-My implementation of the metatypes lists is over 200 lines of code that
-consists entirely of types and type families. It includes a basic
+My implementation of the metatypes lists is hundreds of lines of
+code, consisting entirely of types and type families. It includes a basic
 implementation of singletons, and is portable back to ghc 7.6 to support
 Debian stable. While it takes some contortions to support such an old
 version of ghc, it's pretty awesome that the ghc in Debian stable supports
@@ -86,7 +91,7 @@ decides which of two properties to use based on the host's OS.
 
 	pkgUpgraded :: Property FreeBSD
 	pkgUpgraded = property "pkg upgraded" (pkg "upgrade")
-
+	
 	upgraded :: UnixLike
 	upgraded = (aptUpgraded `pickOS` pkgUpgraded)
 		`describe` "OS upgraded"
@@ -173,11 +178,13 @@ I know most readers stop reading at "monad". So, I'll stop writing. ;)
 
 ### thanks
 
-Thanks to David Miani who answered my first tentative question that led
-down this path, with a big hunk of code.
+Thanks to David Miani who answered my first tentative question with
+a big hunk of example code that got me on the right track.
 
 Also to many other people who answered increasingly esoteric Haskell type
 system questions.
 
 Also thanks to the Shuttleworth foundation, which funded this work
 by way of a Flash Grant.
+
+[[!tag code/propellor haskell]]

blog update
diff --git a/blog/entry/type_safe_multi-OS_Propellor.mdwn b/blog/entry/type_safe_multi-OS_Propellor.mdwn
new file mode 100644
index 0000000..c96f7a9
--- /dev/null
+++ b/blog/entry/type_safe_multi-OS_Propellor.mdwn
@@ -0,0 +1,183 @@
+Propellor was recently ported to FreeBSD, by Evan Cofsky. This new feature
+led me down a two week long rabbit hole to make it type safe. In particular,
+Propellor needed to be taught that some properties work on Debian, others on
+FreeBSD, and others on both.
+
+The user shouldn't need to worry about making a mistake like this;
+the type checker should tell them they're asking for something that can't
+work.
+
+[[!format haskell """
+	-- Is this a Debian or a FreeBSD host? I can't remember, let's
+	-- use both package managers!
+	host "example.com" $ props
+		& aptUpgraded
+		& pkgUpgraded
+"""]]
+
+As of propellor 3.0.0 (to be released soon; in git now), that will fail to
+build.
+
+### type level lists and functions
+
+To make that fail to build, I used type-level lists. A property has a
+metatypes list as part of its type. (So called because it's additional
+types describing the type, and I couldn't find a better name.) This list
+can contain one or more OS's targeted by the property:
+
+[[!format haskell """
+	aptUpgraded :: Property (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish ])
+
+	pkgUpgraded :: Property (MetaTypes '[ 'Targeting 'OSFreeBSD ])
+"""]]
+
+In Haskell type-level lists and other DataKinds are indicated by the
+`'` if you have not seen that before. There are some convenience
+aliases and type operators, which let the same types be expressed
+more cleanly:
+
+[[!format haskell """
+	aptUpgraded :: Property (Debian + Buntish)
+
+	pkgUpgraded :: Property FreeBSD
+"""]]
+
+Whenever two properties are combined, their metatypes are combined
+using a type-level function. Combining `aptUpgraded` and `pkgUpgraded`
+will yield a metatypes that targets no OS's, since they have none in
+common. So will fail to type check.
+
+My implementation of the metatypes lists is over 200 lines of code that
+consists entirely of types and type families. It includes a basic
+implementation of singletons, and is portable back to ghc 7.6 to support
+Debian stable. While it takes some contortions to support such an old
+version of ghc, it's pretty awesome that the ghc in Debian stable supports
+this stuff.
+
+### extending beyond targeted OS's
+
+Before this change, Propellor's Property type had already been slightly
+refined, tagging them with `HasInfo` or `NoInfo`, as described
+in [[making_propellor_safer_with_GADTs_and_type_families]]. I needed to
+keep that `HasInfo` in the type of properties.
+
+But, it seemed unnecessary verbose to have types like `Property NoInfo Debian`.
+Especially if I want to add even more information to Property
+types later. `Property NoInfo Debian NoPortsOpen` would be a real mouthful to
+need to write for every property.
+
+Luckily I now have this handy type-level list. So, I can shove more
+types into it, so `Property (HasInfo + Debian)` is used where necessary,
+and `Property Debian` can be used everywhere else.
+
+Since I can add more types to the type-level list, without affecting
+other properties, I expect to be able to implement type-level port
+conflict detection next. Should be fairly easy to do without changing
+the API except for properties that use ports.
+
+### singletons
+
+As shown here, `pickOS` makes a property that 
+decides which of two properties to use based on the host's OS.
+
+[[!format haskell """
+	aptUpgraded :: Property DebianLike
+	aptUpgraded = property "apt upgraded" (apt "upgrade" `requires` apt "update")
+
+	pkgUpgraded :: Property FreeBSD
+	pkgUpgraded = property "pkg upgraded" (pkg "upgrade")
+
+	upgraded :: UnixLike
+	upgraded = (aptUpgraded `pickOS` pkgUpgraded)
+		`describe` "OS upgraded"
+"""]]
+
+Any number of OS's can be chained this way, to build a property that
+is super-portable out of simple little non-portable properties.
+This is a sweet combinator!
+
+Singletons are types that are inhabited by a single value.
+This lets the value be inferred from the type, which came in handy
+in building the `pickOS` property combinator.
+
+Its implementation needs to be able to look at each of the properties at
+runtime, to compare the OS's they target with the actial OS of the host.
+That's done by stashing a target list value inside a property. The target
+list value is inferred from the type of the property, thanks to singletons,
+and so does not need to be passed in to `property`. That saves
+keyboard time and avoids mistakes.
+
+### is it worth it?
+
+It's important to consider whether more complicated types are a net
+benefit. Of course, opinions vary widely on that question in general!
+But let's consider it in light of my main goals for Propellor:
+
+1. Help save the user from pushing a broken configuration to their machines
+   at a time when they're down in the trenches dealing with some urgent
+   problem at 3 am.
+2. Advance the state of the art in configuration management by
+   taking advantage of the state of the art in strongly typed haskell.
+
+This change definitely meets both criteria. But there is a tradeoff;
+it got a little bit harder to write new propellor properties. Not only do
+new properties need to have their type set to target appropriate systems,
+but the more polymorphic code is, the more likely the type checker can't
+figure out all the types without some help.
+
+A simple example of this problem is as follows.
+
+[[!format haskell """
+	foo :: Property UnixLike
+	foo = p `requires` bar
+	  where
+		p = property "foo" $ do
+			...
+"""]]
+ 
+The type checker will complain that "The type variable ‘metatypes1’ is
+ambiguous". Problem is that it can't infer the type of `p` because many
+different types could be combined with the `bar` property and all would
+yield a `Property UnixLike`. The solution is simply to add a type signature
+like `p :: Property UnixLike`
+
+Since this only affects creating new properties, and not combining existing
+properties (which have known types), it seems like a reasonable tradeoff.
+
+### things to improve later
+
+There are a few warts that I'm willing to live with for now...
+
+Currently, `Property (HasInfo + Debian)` is different than `Property (Debian +
+HasInfo)`, but they should really be considered to be the same type. That is, I
+need type-level sets, not lists. While there's a type level sets library for
+hackage, it still seems to 
+[require a specific order of the set items when writing down a type signature](https://github.com/dorchard/type-level-sets/issues/5).
+
+Also, using `ensureProperty`, which runs one property inside the action
+of another property, got complicated by the need to pass it a type witness.
+
+	foo = Property Debian
+	foo = property' $ \witness -> do
+		ensureProperty witness (aptInstall "foo")
+
+That witness is used to type check that the inner property targets
+every OS that the outer property targets. I think it might be possible
+to store the witness in the monad, and have ensureProperty read it, but
+it might complicate the type of the monad too much, since it would
+have to be parameterized on the type of the witness.
+
+Oh no, I mentioned monads. While type level lists and type functions and
+generally bending the type checker to my will is all well and good,
+I know most readers stop reading at "monad". So, I'll stop writing. ;)
+
+### thanks
+
+Thanks to David Miani who answered my first tentative question that led
+down this path, with a big hunk of code.
+
+Also to many other people who answered increasingly esoteric Haskell type
+system questions.
+
+Also thanks to the Shuttleworth foundation, which funded this work
+by way of a Flash Grant.

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 3ffb4ba..ceba4c1 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -26,7 +26,7 @@ I am not sure, but this probably should not trigger if stderr contains only whit
 
 Also maybe you can just make this default and use -e to disable it and do the legacy behavior, it's up to you.
 
-I'd would really appreciate this feature. I am trying to write my scripts to return proper code, however i often use 3rd party scripts without proper exit codes and i can't or don't want to change them.
+I'd would really appreciate this feature. I am trying to write my scripts to return proper code, however i often use 3rd party scripts without proper exit codes and i can't or don't want to change them. Such scripts usualy output lots of stdout when everything is OK, but only way to tell that something went wrong is when they output something to stderr. That would be my usecase.
 
 -- Tomas Mudrunka
 

Feature proposals for chronic
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index d98c4ee..3ffb4ba 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -1,6 +1,59 @@
 Feel free to edit this page to suggest tools to add, or make any other
 comments --[[Joey]]
 
+## chronic
+
+### triggering by non-empty stderr output
+
+chronic is now triggered by program returning nonzero exit code. however it's quite often that i encounter scripts that don't return error exit code, but they still output errors on stderr.
+
+I'd like to have chronic to be able to setup in way that would trigger output by nonzero output to stderr.
+
+I suggest parameter -e to do this. (e stands for error)
+
+Like:
+
+    chronic bash -c 'ls /nonexistent_file; echo hello; exit 0' #no output
+    chronic -e bash -c 'ls /nonexistent_file; echo hello; exit 0' #output
+
+You may say that i could simply do
+
+    bash -c 'ls /nonexistent_file; echo hello; exit 0' > /dev/null
+
+to achieve the same, but it's not the case as it does throw the stdout away. i'd like to see nothing if there's no stderr and exit code 0. if there's non-zero exit code or stderr then i want to see both. stdout and stderr.
+
+I am not sure, but this probably should not trigger if stderr contains only whitespace characters. It should need at least one printable.
+
+Also maybe you can just make this default and use -e to disable it and do the legacy behavior, it's up to you.
+
+I'd would really appreciate this feature. I am trying to write my scripts to return proper code, however i often use 3rd party scripts without proper exit codes and i can't or don't want to change them.
+
+-- Tomas Mudrunka
+
+### verbose mode for distidguishing output streams and return code
+
+Another feature that might be interresting in chronic would be distinguishing between stdout and stderr in output.
+I suggest -v as verbose
+
+    chronic bash -c 'echo foo 1>&2; echo -n bar; echo baz 1>&2; exit 23' #outputs:
+    foo
+    barbaz
+
+    chronic -v bash -c 'echo foo 1>&2; echo -n bar; echo baz 1>&2; exit 23' #outputs:
+    E: foo
+    O: bar
+    E: baz
+    R: 23
+
+Also note it adds newline to output when output stream changes in middle of line. Just to make sure that "E: " or "O: " is at the beginning of line.
+E: identifies stderr output, O: identifies standart output and R: identifies return code.
+
+This should also work in combination with proposed -e, like chronic -ve something...
+
+I think this would be usefull as hell for debuging cron scripts. I have currently troubles with such debugging.
+
+-- Tomas Mudrunka
+
 ## poptail and peeif
 
 I just finished two utilities that might be general purpose enough for the collection.  They're on github here:

add news item for github-backup 1.20160319
diff --git a/code/github-backup/news/version_1.20141222.mdwn b/code/github-backup/news/version_1.20141222.mdwn
deleted file mode 100644
index b429657..0000000
--- a/code/github-backup/news/version_1.20141222.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-github-backup 1.20141222 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added gitriddance(1), a utility to close all issues and pull requests,
-     for repos that don't want to be bothered with GitHub's proprietary
-     issue tracker.
-   * gitriddance depends on github 0.13.1, which has bug fixes
-     for posting comments.
-   * Various updates to internal git and utility libraries shared with git-annex."""]]
\ No newline at end of file
diff --git a/code/github-backup/news/version_1.20160319.mdwn b/code/github-backup/news/version_1.20160319.mdwn
new file mode 100644
index 0000000..ca3efaf
--- /dev/null
+++ b/code/github-backup/news/version_1.20160319.mdwn
@@ -0,0 +1,6 @@
+github-backup 1.20160319 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Update to github-0.14.1.
+     Building with old versions is not supported due to the massive API
+     changes in this version of the github library.
+   * Added support for oath tokens."""]]
\ No newline at end of file

update
diff --git a/trips/2016/boston.mdwn b/trips/2016/boston.mdwn
index 6f827a7..5e40ebb 100644
--- a/trips/2016/boston.mdwn
+++ b/trips/2016/boston.mdwn
@@ -1,7 +1,7 @@
 I'm visiting Boston, 16-20 March. 
 
 * Match 16th [Boston Haskell](http://www.meetup.com/Boston-Haskell/)
-* Match 17th afternoon hin a coffee house, dinner at [Asmara](http://www.asmararestaurantboston.com/) 5pm
+* Match 17th afternoon in a coffee house, dinner at [Asmara](http://www.asmararestaurantboston.com/) 5pm, [Anne Leckie book signing](http://www.pandemoniumbooks.com/event/ann-leckie-author-event)/board gaming 7 pm
 * March 18th [SpinachCon](https://libreplanet.org/wiki/Event:LibrePlanet/LibrePlanet/3-18-2016_-Event_1)
 * March 18th Free Software Foundation open house at their offices, ~6pm
 * March 19th-20th [LibrePlanet](https://www.libreplanet.org/2016/)

typoski
diff --git a/trips/2016/boston.mdwn b/trips/2016/boston.mdwn
index 28a8128..6f827a7 100644
--- a/trips/2016/boston.mdwn
+++ b/trips/2016/boston.mdwn
@@ -3,7 +3,7 @@ I'm visiting Boston, 16-20 March.
 * Match 16th [Boston Haskell](http://www.meetup.com/Boston-Haskell/)
 * Match 17th afternoon hin a coffee house, dinner at [Asmara](http://www.asmararestaurantboston.com/) 5pm
 * March 18th [SpinachCon](https://libreplanet.org/wiki/Event:LibrePlanet/LibrePlanet/3-18-2016_-Event_1)
-* March 18th Free Softeware open house at their offices, ~6pm
+* March 18th Free Software Foundation open house at their offices, ~6pm
 * March 19th-20th [LibrePlanet](https://www.libreplanet.org/2016/)
 
 Would be pleased to get together with friends, users of my software, etc at

add
diff --git a/trips/2016/boston.mdwn b/trips/2016/boston.mdwn
new file mode 100644
index 0000000..28a8128
--- /dev/null
+++ b/trips/2016/boston.mdwn
@@ -0,0 +1,10 @@
+I'm visiting Boston, 16-20 March. 
+
+* Match 16th [Boston Haskell](http://www.meetup.com/Boston-Haskell/)
+* Match 17th afternoon hin a coffee house, dinner at [Asmara](http://www.asmararestaurantboston.com/) 5pm
+* March 18th [SpinachCon](https://libreplanet.org/wiki/Event:LibrePlanet/LibrePlanet/3-18-2016_-Event_1)
+* March 18th Free Softeware open house at their offices, ~6pm
+* March 19th-20th [LibrePlanet](https://www.libreplanet.org/2016/)
+
+Would be pleased to get together with friends, users of my software, etc at
+any of these times. Say Hi when you see me, or shoot me an email.

scroll servers working again
diff --git a/code/scroll.mdwn b/code/scroll.mdwn
index 08e5eb1..9741937 100644
--- a/code/scroll.mdwn
+++ b/code/scroll.mdwn
@@ -10,7 +10,6 @@ challenge. It is written in Haskell.
 
 BTW, `scroll` is also a functional unix file pager, like `less` or `more`.
 
-<!-- 
 ## play `scroll`
 
 For a quick play on the web, there are two demo servers up!
@@ -20,7 +19,6 @@ For a quick play on the web, there are two demo servers up!
 
 For deeper exploration, I recommend using telnet instead. Login and
 password for telnet are both "scroll".
--->
 
 ## install `scroll`
 

jetring new maintainer
diff --git a/code.mdwn b/code.mdwn
index be531de..4f13c93 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -45,6 +45,7 @@ people have taken them on.
 [[devscripts]]
 [[pentium-builder]]
 [[apt-src]]
+[[jetring]]
 
 These need new maintainers, stat!
 
@@ -52,7 +53,6 @@ These need new maintainers, stat!
 [[sleepd]]
 [[pristine-tar]]
 [[alien]]
-[[jetring]]
 [[nslu2-utils]]
 [[ticker]]
 

response
diff --git a/blog/entry/letsencrypt_support_in_propellor/comment_3_86c4651e907e40c41458377e1c99dfbd._comment b/blog/entry/letsencrypt_support_in_propellor/comment_3_86c4651e907e40c41458377e1c99dfbd._comment
new file mode 100644
index 0000000..7cb6ec6
--- /dev/null
+++ b/blog/entry/letsencrypt_support_in_propellor/comment_3_86c4651e907e40c41458377e1c99dfbd._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2016-03-02T17:16:51Z"
+ content="""
+There's a more generalized property to add additional domains.
+
+	letsEncrypt' :: AgreeTOS -> Domain -> [Domain] -> WebRoot -> Property NoInfo
+"""]]

Added a comment: Multiple domains?
diff --git a/blog/entry/letsencrypt_support_in_propellor/comment_2_64d4fd22bdbcf4e7328fafd0dc23ffc3._comment b/blog/entry/letsencrypt_support_in_propellor/comment_2_64d4fd22bdbcf4e7328fafd0dc23ffc3._comment
new file mode 100644
index 0000000..c8585a8
--- /dev/null
+++ b/blog/entry/letsencrypt_support_in_propellor/comment_2_64d4fd22bdbcf4e7328fafd0dc23ffc3._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="NicolasPouillard"
+ subject="Multiple domains?"
+ date="2016-03-02T16:14:19Z"
+ content="""
+I'm glad to see the support of letsencrypt into propellor, so far I've rolled my own scripts calling the docker image...
+
+What about having support for multiple domains?
+"""]]

Added a comment: staging environment
diff --git a/blog/entry/letsencrypt_support_in_propellor/comment_1_888380c796ccb5fbc093cf984b89320e._comment b/blog/entry/letsencrypt_support_in_propellor/comment_1_888380c796ccb5fbc093cf984b89320e._comment
new file mode 100644
index 0000000..c696c03
--- /dev/null
+++ b/blog/entry/letsencrypt_support_in_propellor/comment_1_888380c796ccb5fbc093cf984b89320e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="mithrandi@311efa1b2b5c4999c2edae7da06fb825899e8a82"
+ nickname="mithrandi"
+ subject="staging environment"
+ date="2016-03-02T06:19:09Z"
+ content="""
+You can use the Let's Encrypt staging environment for testing; it generates certificates signed by a different untrusted CA, so they're not usable \"for real\", but you don't have to deal with the extreme rate limits the main environment imposes. I think use of the staging environment can be activated by passing \"--staging\" to the main client.
+"""]]

Added a comment: Documentation driven development
diff --git a/blog/entry/documentation_first/comment_1_1c4e9b6fdac008e8eafd813da145baa9._comment b/blog/entry/documentation_first/comment_1_1c4e9b6fdac008e8eafd813da145baa9._comment
new file mode 100644
index 0000000..fb0a885
--- /dev/null
+++ b/blog/entry/documentation_first/comment_1_1c4e9b6fdac008e8eafd813da145baa9._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://fanf.livejournal.com/"
+ subject="Documentation driven development"
+ date="2016-02-27T19:19:28Z"
+ content="""
+I often work in a similar way for similar reasons. I have seen it called \"documentation driven development\" by analogy with test driven development.
+
+I have also found that when I don't write the documentation first, I often find when writing it that the code is stupid in one way or another and needs fixing so that the documentation makes sense.
+"""]]

format
diff --git a/blog/entry/documentation_first.mdwn b/blog/entry/documentation_first.mdwn
index 52eb995..41a1467 100644
--- a/blog/entry/documentation_first.mdwn
+++ b/blog/entry/documentation_first.mdwn
@@ -1,5 +1,5 @@
 I write documentation first and code second. I've mentioned this from time
-to time ([[previously|on_not_coding_late]]),
+to time ([[previously|on_not_coding_late]],
 [[previously|screencasts/git-annex_coding_in_haskell]]) but a reader
 pointed out that I've never really explained why I work that way.
 
@@ -28,7 +28,7 @@ down than I did when I started. Hopefully you do too.
 
 [1] I'll often write a bug report down even if I have found the bug myself
     and am going to fix it myself on the same day.
-    [example](http://git-annex.branchable.com/bugs/checksum_loads_whole_file_into_memory/) 
+    ([example](http://git-annex.branchable.com/bugs/checksum_loads_whole_file_into_memory/))
     This is one place where it's
     nice to have bug reports as files in the same repository as the code,
     so that the bug report can be included in the commit fixing it. Often

blog update
diff --git a/blog/entry/documentation_first.mdwn b/blog/entry/documentation_first.mdwn
new file mode 100644
index 0000000..52eb995
--- /dev/null
+++ b/blog/entry/documentation_first.mdwn
@@ -0,0 +1,40 @@
+I write documentation first and code second. I've mentioned this from time
+to time ([[previously|on_not_coding_late]]),
+[[previously|screencasts/git-annex_coding_in_haskell]]) but a reader
+pointed out that I've never really explained why I work that way.
+
+It's a way to make my thinking more concrete without diving all the way
+into the complexities of the code right away. So sometimes, what I write
+down is design documentation, and sometimes it's notes on a bug report[1],
+but if what I'm working on is user-visible, I start by writing down the end
+user documentation.
+
+Writing things down lets me interact with them as words on a page, which
+are more concrete than muddled thoughts in the head, and much easier to
+edit and reason about. Code constrains to existing structures; a blank page
+frees you to explore and build up new ideas. It's the essay writing
+process, applied to software development, with a side effect of making sure
+everything is documented.
+
+Also, end-user documentation is best when it doesn't assume that the user
+has any prior knowledge. The point in time when I'm closest to
+perfect lack of knowledge about something is before I've built it[2].
+So, that's the best time to document it.
+
+I understand what I'm trying to tell you better now that I've written it
+down than I did when I started. Hopefully you do too.
+
+----
+
+[1] I'll often write a bug report down even if I have found the bug myself
+    and am going to fix it myself on the same day.
+    [example](http://git-annex.branchable.com/bugs/checksum_loads_whole_file_into_memory/) 
+    This is one place where it's
+    nice to have bug reports as files in the same repository as the code,
+    so that the bug report can be included in the commit fixing it. Often
+    the bug report has lots of details that don't need to go into the
+    commit message, but explain more about my evolving thinking about
+    a problem.
+
+[2] Technically I'm even more clueless ten years later when I've totally
+    forgotten whatever, but it's not practical to wait. ;-)

add news item for moreutils 0.58
diff --git a/code/moreutils/news/version_0.53.mdwn b/code/moreutils/news/version_0.53.mdwn
deleted file mode 100644
index 4a86bd2..0000000
--- a/code/moreutils/news/version_0.53.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-moreutils 0.53 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Orphaned the Debian package."""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.58.mdwn b/code/moreutils/news/version_0.58.mdwn
new file mode 100644
index 0000000..6d5ada3
--- /dev/null
+++ b/code/moreutils/news/version_0.58.mdwn
@@ -0,0 +1,6 @@
+moreutils 0.58 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * OpenBSD compile fix.
+     Thanks, Michael Reed.
+   * ts: Quiet perl's complaints about utf-8. Closes: #[812143](http://bugs.debian.org/812143)
+     Thanks, Nicolas Schier."""]]
\ No newline at end of file

Added a comment: Getting around Ubuntu's trademark
diff --git a/blog/entry/trademark_nonsense/comment_6_3320d63b6da885ff774d94a9abc2195f._comment b/blog/entry/trademark_nonsense/comment_6_3320d63b6da885ff774d94a9abc2195f._comment
new file mode 100644
index 0000000..8408e31
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_6_3320d63b6da885ff774d94a9abc2195f._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="caperry@40a07a9612621584a3984809ad431b99549f4c14"
+ nickname="caperry"
+ subject="Getting around Ubuntu's trademark"
+ date="2016-02-20T18:29:52Z"
+ content="""
+From the IP policy on their site <http://www.ubuntu.com/legal/terms-and-policies/intellectual-property-policy> : \"You will require Canonical’s permission to use: (i) any mark ending with the letters UBUNTU or BUNTU which is sufficiently similar to the Trademarks or any other confusingly similar mark, and (ii) any Trademark in a domain name or URL or for merchandising purposes.\"
+
+Because of this I don't think a \"*buntu\" will work because it is \"sufficiently similar\" to their trademarks, sadly. This is part of why CentOS uses/used \"PNAELV\": to avoid saying \"RedHat\" (However now that RedHat owns CentOS I don't think that is as much of an issue now). I don't have a good solution, but I'll contribute PSALV: Prominent South African Linux Vendor.
+"""]]

Added a comment: buntish?
diff --git a/blog/entry/trademark_nonsense/comment_5_302f163080b8144d612132cda4a1aefb._comment b/blog/entry/trademark_nonsense/comment_5_302f163080b8144d612132cda4a1aefb._comment
new file mode 100644
index 0000000..63e1cf7
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_5_302f163080b8144d612132cda4a1aefb._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://svario.it/gioele"
+ nickname="gioele"
+ subject="buntish?"
+ date="2016-02-20T11:55:16Z"
+ content="""
+Maybe \"buntish\" instead of \"*buntu\" or \"foobuntu\"?
+"""]]

Added a comment
diff --git a/blog/entry/trademark_nonsense/comment_4_2020d2987c818b62bdcfef1007afbf94._comment b/blog/entry/trademark_nonsense/comment_4_2020d2987c818b62bdcfef1007afbf94._comment
new file mode 100644
index 0000000..f139503
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_4_2020d2987c818b62bdcfef1007afbf94._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://hands.com/~phil/"
+ subject="comment 4"
+ date="2016-02-20T08:13:34Z"
+ content="""
+Yes, I'd already taken that into account. I was estimating (very roughly) the number of affected packages as 4000, and using BlackDuck's figures of 45% GPL to halve that to 2000 as an upper limit, and their 25% BSD figure to give a lower limit of 1000 packages -- none of these numbers stand up to close scrutiny.
+
+"""]]

comment
diff --git a/blog/entry/trademark_nonsense/comment_3_bbd1c15822e4173b64e7758fce68e473._comment b/blog/entry/trademark_nonsense/comment_3_bbd1c15822e4173b64e7758fce68e473._comment
new file mode 100644
index 0000000..d56b945
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_3_bbd1c15822e4173b64e7758fce68e473._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2016-02-19T21:11:52Z"
+ content="""
+Phil, mentions in GPL software are not affected. Because it would be a GPL
+violation if Canonical's IP policy required that, and so they changed it.
+So, you can probably filter that 2000 down by half or more again.
+"""]]

Added a comment: There are quite a few more...
diff --git a/blog/entry/trademark_nonsense/comment_2_845be6dd836ca562d1c6bc33993c27fb._comment b/blog/entry/trademark_nonsense/comment_2_845be6dd836ca562d1c6bc33993c27fb._comment
new file mode 100644
index 0000000..b64b948
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_2_845be6dd836ca562d1c6bc33993c27fb._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="http://hands.com/~phil/"
+ subject="There are quite a few more..."
+ date="2016-02-19T20:54:28Z"
+ content="""
+There seem to be about [4000 packages containing
+\"buntu\"](https://codesearch.debian.net/perpackage-results/buntu/2/)
+(since that's 1200+ pages, with about 3 packages per page).
+I guess about half are GPL-ed, which would leave as many as 2000 to be
+concerned about.
+
+Some of the things included are URLs in launchpad, and email addresses,
+which will of course be rendered somewhat useless by changing them.
+
+Under the circumstances, changing them still seems like the right thing
+to do, in order to protect our grand-children (and beyond) from their
+overbearing parent.
+
+Until we can be confident that these strings will never be used as a
+weapon, their presence probably needs to become a Debian policy violation.
+"""]]

title
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index faff255..cf3d09b 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -1,3 +1,5 @@
+[[!meta title="Ubuntu trademark nonsense"]]
+
 > Canonical appear to require that you remove all trademarks entirely even if
 > using them wouldn't be a violation of trademark law.
 

typo
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index 0ee79f4..faff255 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -21,7 +21,7 @@ old, to prevent exposing users to this trademark nonsense?
 	14
 
 Most of the code in git-annex, ikiwiki, and etckeeper is licensed under the GPL
-or AGPL, and so Canonical's IP policy propbably does not require that anyone
+or AGPL, and so Canonical's IP policy probably does not require that anyone
 basing a distribution on Ubuntu strip all references to "Ubuntu" from 
 them. But then, there's Propellor:
 

Added a comment: *buntu
diff --git a/blog/entry/trademark_nonsense/comment_1_9702863145f8a58dca555d0ec4bd533a._comment b/blog/entry/trademark_nonsense/comment_1_9702863145f8a58dca555d0ec4bd533a._comment
new file mode 100644
index 0000000..e4d5925
--- /dev/null
+++ b/blog/entry/trademark_nonsense/comment_1_9702863145f8a58dca555d0ec4bd533a._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="alan.christopher.jenkins@a53b5c6056bc7d7b09e181c23cc2ec8362fa7abe"
+ nickname="alan.christopher.jenkins"
+ subject="*buntu"
+ date="2016-02-19T19:55:05Z"
+ content="""
+*buntu is clearly the correct choice; it matches all the official flavours including Mythbuntu :).  However CentOS use an acronym PNAELV - I don't know how seriously but I don't think they're ever more specific.  That's a more recent & specific example than the UNIX(R) wars.
+
+My creativity is failing.  SABDFL OS?  It sounds a bit too pointed, but I think the analogy with Debian is very neat :-P.
+"""]]

debootstrap
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index fb3641a..0ee79f4 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -53,5 +53,11 @@ it and preventing that and other Canonical trademarks from slipping back in
 later. Alternatively, I'd be happy to re-license all Debconf code that
 I wrote under the AGPL-3+.
 
+Update: Another package that comes to mind is Debootstrap, which is also
+BSD licensed. Of course it contains "Ubuntu" in lots of places, since it
+is how Ubuntu systems are built. I'm no longer an active developer of 
+Debootstrap, but I hope its current developers carefully consider how
+this trademark nonsense affects it.
+
 PS: Shall we use "*buntu" as the, erm, canonical trademark-free spelling
 of "Ubuntu"? Seems most reasonable, unless Canonical has trademarked that too.

update
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index 17c72de..fb3641a 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -43,7 +43,8 @@ in a Haskell program and would have to skip including Propellor. That's not
 good for Propellor getting wide distribution either.
 
 **I think I've convinced myself it would be for the best to remove all
-references to "Ubuntu" from Propellor.**
+references to "Ubuntu" from Propellor.**  
+[done](http://source.propellor.branchable.com/?p=source.git;a=commitdiff;h=90219e30615e09779469ceae272cf41943d43585)
 
 Similarly, Debconf is BSD licensed. I originally wrote it, but it's now
 maintained by Colin Watson, who works for Canonical. If I were still

speling
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index 627fdc6..17c72de 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -6,7 +6,7 @@
 Each time Matthew brings this up, and as evidence
 [continues](http://mjg59.dreamwidth.org/38467.html) to
 [mount](https://mjg59.dreamwidth.org/37113.html) that Canonical either actually
-intends their IP policy to be read that way, or is intenionally keeping the
+intends their IP policy to be read that way, or is intentionally keeping the
 situation unclear to FUD derivatives, I start wondering about references to
 Ubuntu in my software.
 

typo
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
index 1cca1a6..627fdc6 100644
--- a/blog/entry/trademark_nonsense.mdwn
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -37,7 +37,7 @@ Ubuntu in documentation, but contains *code* that uses that trademark:
 
 So, if an Ubuntu-derived distribution has to remove "Ubuntu" from Propellor,
 they'd end up with a Propellor that either differs from upstream, or that
-can't be used to manage Ubuntu systems. Neither choice good for users. Probably
+can't be used to manage Ubuntu systems. Neither choice is good for users. Probably
 most small derived distributions would not have expertise to patch data types
 in a Haskell program and would have to skip including Propellor. That's not
 good for Propellor getting wide distribution either.

blog update
diff --git a/blog/entry/trademark_nonsense.mdwn b/blog/entry/trademark_nonsense.mdwn
new file mode 100644
index 0000000..1cca1a6
--- /dev/null
+++ b/blog/entry/trademark_nonsense.mdwn
@@ -0,0 +1,56 @@
+> Canonical appear to require that you remove all trademarks entirely even if
+> using them wouldn't be a violation of trademark law.
+
+-- [Matthew Garrett](http://mjg59.dreamwidth.org/39913.html)
+
+Each time Matthew brings this up, and as evidence
+[continues](http://mjg59.dreamwidth.org/38467.html) to
+[mount](https://mjg59.dreamwidth.org/37113.html) that Canonical either actually
+intends their IP policy to be read that way, or is intenionally keeping the
+situation unclear to FUD derivatives, I start wondering about references to
+Ubuntu in my software.
+
+Should such references be removed, or obscured, like "U*NIX" in software of
+old, to prevent exposing users to this trademark nonsense?
+
+	joey@darkstar:~/src/git-annex>git grep -i ubuntu |wc -l
+	457
+	joey@darkstar:~/src/ikiwiki>git grep -i ubuntu |wc -l
+	80
+	joey@darkstar:~/src/etckeeper>git grep -i ubuntu |wc -l
+	14
+
+Most of the code in git-annex, ikiwiki, and etckeeper is licensed under the GPL
+or AGPL, and so Canonical's IP policy propbably does not require that anyone
+basing a distribution on Ubuntu strip all references to "Ubuntu" from 
+them. But then, there's Propellor:
+
+	joey@darkstar:~/src/propellor>git grep -i ubuntu |wc -l
+	10
+
+Propellor is BSD licensed. It's in Ubuntu universe. It not only references
+Ubuntu in documentation, but contains *code* that uses that trademark:
+
+	data Distribution
+	        = Debian DebianSuite
+        	| Ubuntu Release
+
+So, if an Ubuntu-derived distribution has to remove "Ubuntu" from Propellor,
+they'd end up with a Propellor that either differs from upstream, or that
+can't be used to manage Ubuntu systems. Neither choice good for users. Probably
+most small derived distributions would not have expertise to patch data types
+in a Haskell program and would have to skip including Propellor. That's not
+good for Propellor getting wide distribution either.
+
+**I think I've convinced myself it would be for the best to remove all
+references to "Ubuntu" from Propellor.**
+
+Similarly, Debconf is BSD licensed. I originally wrote it, but it's now
+maintained by Colin Watson, who works for Canonical. If I were still
+maintaining Debconf, I'd be looking at removing all instances of "Ubuntu" from
+it and preventing that and other Canonical trademarks from slipping back in
+later. Alternatively, I'd be happy to re-license all Debconf code that
+I wrote under the AGPL-3+.
+
+PS: Shall we use "*buntu" as the, erm, canonical trademark-free spelling
+of "Ubuntu"? Seems most reasonable, unless Canonical has trademarked that too.

add news item for github-backup 1.20160207
diff --git a/code/github-backup/news/version_1.20141204.mdwn b/code/github-backup/news/version_1.20141204.mdwn
deleted file mode 100644
index 4d9fef2..0000000
--- a/code/github-backup/news/version_1.20141204.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-github-backup 1.20141204 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Fix broken argument parser for the username|organization parameter.
-     Closes: #[772043](http://bugs.debian.org/772043)"""]]
\ No newline at end of file
diff --git a/code/github-backup/news/version_1.20160207.mdwn b/code/github-backup/news/version_1.20160207.mdwn
new file mode 100644
index 0000000..2d7fd4e
--- /dev/null
+++ b/code/github-backup/news/version_1.20160207.mdwn
@@ -0,0 +1,10 @@
+github-backup 1.20160207 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Switch to using https instead of git:// for a secure transport.
+     Note that existing git:// remotes will continue to be used.
+     Thanks, Robin Schneider.
+   * Add upper bound on github dependency, as version 0.14 has large API
+     changes and can't be used yet.
+   * Various updates to internal git and utility libraries shared
+     with git-annex.
+   * Silence build warnings with ghc 7.10."""]]
\ No newline at end of file

update
diff --git a/blog/entry/letsencrypt_support_in_propellor.mdwn b/blog/entry/letsencrypt_support_in_propellor.mdwn
index 2592c40..01c52b6 100644
--- a/blog/entry/letsencrypt_support_in_propellor.mdwn
+++ b/blog/entry/letsencrypt_support_in_propellor.mdwn
@@ -8,22 +8,29 @@ nice to have some alternatives packaged in Debian.)
 
 I ended up implementing this:
 
-	letsEncrypt :: AgreeTOS -> Domain -> WebRoot -> CertInstaller -> Property NoInfo
+	letsEncrypt :: AgreeTOS -> Domain -> WebRoot -> Property NoInfo
 
-The interesting part of that is the `CertInstaller`, which is passed the
-certificate files that letsencrypt generates, and is responsible for making
-the web server (or whatever) use them.
+This property just makes the certificate available, it does not configure
+the web server to use it. This avoids relying on the letsencrypt client's
+apache config munging, which is probably useful for many people, but not
+those of us using configuration management systems. And so avoids most of
+the complicated magic that the letsencrypt client has a reputation for.
 
-This avoids relying on the letsencrypt client's apache config munging,
-which is probably useful for many people, but not those of us using
-configuration management systems. And so avoids most of the complicated
-magic that the letsencrypt client has a reputation for.
-
-And, this API lets other propellor properties integrate with letsencrypt
-by providing a `CertInstaller` of their own. Like this property, which 
-sets up apache to serve a https website, using letsencrypt to get
+Instead, any property that wants to use the certificate can just
+use leteencrypt to get it and set up the server when it makes a change to
 the certificate:
 
+	letsEncrypt (LetsEncrypt.AgreeTOS (Just "me@my.domain")) "example.com" "/var/www"
+		`onChange` setupthewebserver
+
+(Took me a while to notice I could use `onChange` like that,
+and so divorce the cert generation/renewal from the server setup. 
+`onChange` is awesome! This blog post has been updated accordingly.)
+
+In practice, the http site has to be brought up first, and then
+letsencrypt run, and then the cert installed and the https site brought up
+using it. That dance is automated by this property:
+
 	Apache.httpsVirtualHost "example.com" "/var/www"
 		(LetsEncrypt.AgreeTOS (Just "me@my.domain"))
 
@@ -54,8 +61,8 @@ is not available when your certificate needs to be renewed.
 What I've done in propellor to handle renewal is, it runs letsencrypt every
 time, with the --keep-until-expiring option. If this fails, propellor will
 report a failure. As long as propellor is run periodically by a cron job,
-this should result in multiple failure reports being sent (for 30 days I think)
-before a cert expires without getting renewed. But, I have not been able
-to test this.
+this should result in multiple failure reports being sent (for 30 days I
+think) before a cert expires without getting renewed. But, I have not been
+able to test this.
 
 [[!tag propellor]]

typowq
diff --git a/blog/entry/letsencrypt_support_in_propellor.mdwn b/blog/entry/letsencrypt_support_in_propellor.mdwn
index 70f2358..2592c40 100644
--- a/blog/entry/letsencrypt_support_in_propellor.mdwn
+++ b/blog/entry/letsencrypt_support_in_propellor.mdwn
@@ -25,7 +25,7 @@ sets up apache to serve a https website, using letsencrypt to get
 the certificate:
 
 	Apache.httpsVirtualHost "example.com" "/var/www"
-		(LetsEncrypt.AgreeTos (Just "me@my.domain"))
+		(LetsEncrypt.AgreeTOS (Just "me@my.domain"))
 
 That's about as simple a configuration as I can imagine for such a website!
 

typo
diff --git a/blog/entry/letsencrypt_support_in_propellor.mdwn b/blog/entry/letsencrypt_support_in_propellor.mdwn
index e949796..70f2358 100644
--- a/blog/entry/letsencrypt_support_in_propellor.mdwn
+++ b/blog/entry/letsencrypt_support_in_propellor.mdwn
@@ -55,7 +55,7 @@ What I've done in propellor to handle renewal is, it runs letsencrypt every
 time, with the --keep-until-expiring option. If this fails, propellor will
 report a failure. As long as propellor is run periodically by a cron job,
 this should result in multiple failure reports being sent (for 30 days I think)
-before an cert expires without getting renewed. But, I have not been able
+before a cert expires without getting renewed. But, I have not been able
 to test this.
 
 [[!tag propellor]]

blog update
diff --git a/blog/entry/letsencrypt_support_in_propellor.mdwn b/blog/entry/letsencrypt_support_in_propellor.mdwn
new file mode 100644
index 0000000..e949796
--- /dev/null
+++ b/blog/entry/letsencrypt_support_in_propellor.mdwn
@@ -0,0 +1,61 @@
+I've integrated letsencrypt into propellor today. 
+
+I'm using the reference letsencrypt client. While I've seen complaints that
+it has a lot of dependencies and is too complicated, it seemed to only need
+to pull in a few packages, and use only a few megabytes of disk space, and
+it has fewer options than `ls` does. So seems fine. (Although it would be
+nice to have some alternatives packaged in Debian.)
+
+I ended up implementing this:
+
+	letsEncrypt :: AgreeTOS -> Domain -> WebRoot -> CertInstaller -> Property NoInfo
+
+The interesting part of that is the `CertInstaller`, which is passed the
+certificate files that letsencrypt generates, and is responsible for making
+the web server (or whatever) use them.
+
+This avoids relying on the letsencrypt client's apache config munging,
+which is probably useful for many people, but not those of us using
+configuration management systems. And so avoids most of the complicated
+magic that the letsencrypt client has a reputation for.
+
+And, this API lets other propellor properties integrate with letsencrypt
+by providing a `CertInstaller` of their own. Like this property, which 
+sets up apache to serve a https website, using letsencrypt to get
+the certificate:
+
+	Apache.httpsVirtualHost "example.com" "/var/www"
+		(LetsEncrypt.AgreeTos (Just "me@my.domain"))
+
+That's about as simple a configuration as I can imagine for such a website!
+
+----
+
+The two parts of letsencrypt that *are* complicated are not the fault of
+the client really. Those are renewal and rate limiting.
+
+I'm currently rate limited for the next week because I asked letsencrypt
+for several certificates for a domain, as I was learning how to use it and
+integrating it into propellor. So I've not quite managed to fully test
+everything. That's annoying. I also worry that rate limiting could hit at
+an inopportune time once I'm relying on letsencrypt. It's especially
+problimatic that it only allows 5 certs for subdomains of a given domain
+per week. What if I use a lot of subdomains?
+
+Renewal is complicated mostly because there's no good way to test it. You
+set up your cron job, or whatever, and wait three months, and hopefully it
+worked. Just as likely, you got something wrong, and your website breaks.
+Maybe letsencrypt could offer certificates that will only last an hour,
+or a day, for use when testing renewal.
+
+Also, what if something goes wrong with renewal? Perhaps letsencrypt.org
+is not available when your certificate needs to be renewed.
+
+What I've done in propellor to handle renewal is, it runs letsencrypt every
+time, with the --keep-until-expiring option. If this fails, propellor will
+report a failure. As long as propellor is run periodically by a cron job,
+this should result in multiple failure reports being sent (for 30 days I think)
+before an cert expires without getting renewed. But, I have not been able
+to test this.
+
+[[!tag propellor]]

Added a comment: congratulations
diff --git a/blog/entry/git-annex_v6/comment_1_f6a94e3ccc64b9feceb72c29d2911475._comment b/blog/entry/git-annex_v6/comment_1_f6a94e3ccc64b9feceb72c29d2911475._comment
new file mode 100644
index 0000000..7e7680c
--- /dev/null
+++ b/blog/entry/git-annex_v6/comment_1_f6a94e3ccc64b9feceb72c29d2911475._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ subject="congratulations"
+ date="2016-01-23T21:45:50Z"
+ content="""
+git annex v6 is a great idea. while i still have to use and test it, i find it admirable that you went through the trouble of evaluating a competing approach to the similar problem space, adopt and even extend it in your own project. this is the true hacker spirit at work, and while it's unfortunate that the implementation isn't directly compatible with LFS (it couldn't, since it's decentralised) or that github didn't consider using git-annex for its implementation (it's a commercial silo after all), it is great that the ideas are percolating around like this. it will hopefully make both projects better. :)
+
+thanks again for git-annex!
+"""]]

correct blog entry typo
diff --git a/blog/entry/git-annex_v6.mdwn b/blog/entry/git-annex_v6.mdwn
index ca12992..8e5527f 100644
--- a/blog/entry/git-annex_v6.mdwn
+++ b/blog/entry/git-annex_v6.mdwn
@@ -55,7 +55,7 @@ git-lfs downloads all the files in the work tree. It doesn't have
 facilities for dropping the content of some files to free up space,
 or for configuring a repository to only want to get a subset of files
 in the first place. On the other hand, git-annex has excellent support for
-alll those things, and this comes largely for free from its decentralized
+all those things, and this comes largely for free from its decentralized
 design.
 
 If git has showed us anything, it's perhaps that a little added complexity

update
diff --git a/links/interviews.mdwn b/links/interviews.mdwn
index 71c7121..5d05897 100644
--- a/links/interviews.mdwn
+++ b/links/interviews.mdwn
@@ -6,5 +6,5 @@
 [2015: Life after Debian](http://zgrimshell.github.io/posts/interviews-with-floss-developers-joey-hess.html)  
 > "I want to build worthwhile things that might last."
 
-[2016: Linux Weekly News interview](http://lwn.net/Articles/672352/)  
+[2016: Linux Weekly News](http://lwn.net/Articles/672352/)  
 > "I still see myself as a beginner, and certainly not an exemplar."

lwn interview
diff --git a/links/interviews.mdwn b/links/interviews.mdwn
index 894e877..71c7121 100644
--- a/links/interviews.mdwn
+++ b/links/interviews.mdwn
@@ -5,3 +5,6 @@
 
 [2015: Life after Debian](http://zgrimshell.github.io/posts/interviews-with-floss-developers-joey-hess.html)  
 > "I want to build worthwhile things that might last."
+
+[2016: Linux Weekly News interview](http://lwn.net/Articles/672352/)  
+> "I still see myself as a beginner, and certainly not an exemplar."

blog update
diff --git a/blog/entry/git-annex_v6.mdwn b/blog/entry/git-annex_v6.mdwn
new file mode 100644
index 0000000..ca12992
--- /dev/null
+++ b/blog/entry/git-annex_v6.mdwn
@@ -0,0 +1,98 @@
+Version 6 of git-annex, released last week, adds a major new feature;
+support for unlocked large files that can be edited as usual and committed
+using regular git commands.
+
+For example:
+
+	git init
+	git annex init --version=6
+	mv ~/foo.iso .
+	git add foo.iso
+	git commit -m "added hundreds of megabytes to git annex (not git)"
+	git remote add origin ssh://sever/dir
+	git annex sync origin --content # uploads foo.iso
+
+Compare that with how git-annex has worked from the beginning, where
+`git annex add` is used to add a file, and then the file is locked,
+preventing further modifications of it. That is still a very useful way to
+use git-annex for many kinds of files, and is still supported of course.
+Indeed, you can easily switch files back and forth between being locked and
+unlocked.
+
+This new unlocked file mode uses git's smudge/clean filters, and I was
+busy developing it all through December. It started out playing
+catch-up with [git-lfs](https://github.com/github/git-lfs) somewhat, but
+has significantly surpassed it now in several ways.
+
+So, if you had tried git-annex before, but found it didn't meet your needs, 
+you may want to [give it another look](https://git-annex.branchable.com/tips/unlocked_files/) now.
+
+-----
+
+Now a few thoughts on git-annex vs git-lfs, and different tradeoffs made by
+them.
+
+After trying it out, my feeling is that git-lfs brings an admirable
+simplicity to using git with large files. File contents are automatically
+uploaded to the server when a git branch is pushed, and downloaded when a
+branch is merged, and after setting it up, the user may not need to change
+their git workflow at all to use git-lfs.
+
+But there are some serious costs to that simplicity. git-lfs is a
+centralized system. This is especially problimatic when dealing with large
+files. Being a decentralized system, git-annex has a lot more flexability,
+like transferring large file contents peer-to-peer over a LAN, and being
+able to choose where large quantities of data are stored (maybe in S3,
+maybe on a local archive disk, etc).
+
+The price git-annex pays for this flexability is you have to configure it,
+and run some additional commands. And, it has to keep track of what content
+is located where, since it can't assume the answer is "in the central server".
+
+The simplicity of git-lfs also means that the user doesn't have much
+control over what files are present in their checkout of a repository.
+git-lfs downloads all the files in the work tree. It doesn't have
+facilities for dropping the content of some files to free up space,
+or for configuring a repository to only want to get a subset of files
+in the first place. On the other hand, git-annex has excellent support for
+alll those things, and this comes largely for free from its decentralized
+design.
+
+If git has showed us anything, it's perhaps that a little added complexity
+to support a fully distributed system won't prevent people using it. Even
+if many of them end up using it in a mostly centralized way. And that being
+decentralized can have benefits beyond the obvious ones.
+
+-----
+
+Oh yeah, one other advantage of git-annex over git-lfs. It can use half
+as much disk space!
+
+A clone of a git-lfs repository contains one copy of each file in the work
+tree. Since the user can edit that file at any time, or checking out a
+different branch can delete the file, it also stashes a copy inside
+`.git/lfs/objects/`.
+
+One of the main reasons git-annex used locked files, from the very
+beginning, was to avoid that second copy. A second local copy of a large
+file can be too expensive to put up with. When I added unlocked files in
+git-annex v6, I found it needed a second copy of them, same as git-lfs
+does. That's the default behavior. But, I decided to complicate 
+git-annex with a config setting:
+
+	git config annex.thin true
+	git annex fix
+
+Run those two commands, and now only one copy is needed for unlocked files!
+How's it work? Well, it comes down to hard links. But there is a tradeoff here,
+which is why this is not the default: When you edit a file, no local backup is
+preserved of its old content. So you have to make sure to let git-annex
+upload files to another repository before editing them or the old version
+could get lost. So it's a tradeoff, and maybe it could be improved.
+(Only thin out a file after a copy has been uploaded?)
+
+This adds a small amount of complexity to git-annex, but I feel it's well
+worth it to let unlocked files use half the disk space. If the git-lfs
+developers are reading this, that would probably be my first suggestion
+for a feature to consider adding to git-lfs. I hope for more opportunities
+to catch-up to git-lfs in turn.

update identify of someone referenced
diff --git a/svnhome.mdwn b/svnhome.mdwn
index 7890b26..9bce5de 100644
--- a/svnhome.mdwn
+++ b/svnhome.mdwn
@@ -238,8 +238,8 @@ This article, which is based on my earlier [[cvshome]] article, was
 originally published at 
 <a href="http://www.onlamp.com/pub/a/onlamp/2005/01/06/svn_homedir.html">OnLamp.com</a>.
 
-Scott Scriven uses svn for his home directory a similar way, so you
-might want to read <a href="http://toykeeper.net/tutorials/svnhome">his
+Selene Scriven uses svn for her home directory a similar way, so you
+might want to read <a href="http://toykeeper.net/tutorials/svnhome">her
 article</a> for more details and a different perspective on some things.
 
 There's a mailing list for people who use version control for their home

calendar update
diff --git a/blog/archives/2016.mdwn b/blog/archives/2016.mdwn
new file mode 100644
index 0000000..df72b76
--- /dev/null
+++ b/blog/archives/2016.mdwn
@@ -0,0 +1 @@
+[[!calendar type=year year=2016 pages="blog/entry/* and !*/Discussion"]]
diff --git a/blog/archives/2016/01.mdwn b/blog/archives/2016/01.mdwn
new file mode 100644
index 0000000..d903789
--- /dev/null
+++ b/blog/archives/2016/01.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=01 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(01) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/02.mdwn b/blog/archives/2016/02.mdwn
new file mode 100644
index 0000000..4835108
--- /dev/null
+++ b/blog/archives/2016/02.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=02 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(02) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/03.mdwn b/blog/archives/2016/03.mdwn
new file mode 100644
index 0000000..4c32245
--- /dev/null
+++ b/blog/archives/2016/03.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=03 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(03) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/04.mdwn b/blog/archives/2016/04.mdwn
new file mode 100644
index 0000000..5f1b62a
--- /dev/null
+++ b/blog/archives/2016/04.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=04 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(04) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/05.mdwn b/blog/archives/2016/05.mdwn
new file mode 100644
index 0000000..2c7c6ea
--- /dev/null
+++ b/blog/archives/2016/05.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=05 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(05) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/06.mdwn b/blog/archives/2016/06.mdwn
new file mode 100644
index 0000000..4cf8ac3
--- /dev/null
+++ b/blog/archives/2016/06.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=06 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(06) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/07.mdwn b/blog/archives/2016/07.mdwn
new file mode 100644
index 0000000..2fbcb76
--- /dev/null
+++ b/blog/archives/2016/07.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=07 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(07) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/08.mdwn b/blog/archives/2016/08.mdwn
new file mode 100644
index 0000000..970a6e7
--- /dev/null
+++ b/blog/archives/2016/08.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=08 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(08) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/09.mdwn b/blog/archives/2016/09.mdwn
new file mode 100644
index 0000000..bb038a1
--- /dev/null
+++ b/blog/archives/2016/09.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=09 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(09) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/10.mdwn b/blog/archives/2016/10.mdwn
new file mode 100644
index 0000000..2ea043a
--- /dev/null
+++ b/blog/archives/2016/10.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=10 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(10) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/11.mdwn b/blog/archives/2016/11.mdwn
new file mode 100644
index 0000000..dfff527
--- /dev/null
+++ b/blog/archives/2016/11.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=11 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(11) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2016/12.mdwn b/blog/archives/2016/12.mdwn
new file mode 100644
index 0000000..83f89d1
--- /dev/null
+++ b/blog/archives/2016/12.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=12 year=2016 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(12) and creation_year(2016) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]

fix url
diff --git a/code/wmbattery.mdwn b/code/wmbattery.mdwn
index d589207..c01d83e 100644
--- a/code/wmbattery.mdwn
+++ b/code/wmbattery.mdwn
@@ -24,7 +24,7 @@ some improvements in wmbattery:
 * Can make its own estimatess of time remaining or time until full charge, even if APM does not.
 
 `wmbattery` is available as a Debian package or in git
-(`git://git.kitenet.net/wmbattery`).
+(`git://git.kitenet.net/zzattic/wmbattery`).
 
 I posted some 
 [[thoughts_and_history_about_wmbattery|blog/entry/ten_years_of_free_software_--_part_7_wmbattery]]

update
diff --git a/code/realtime/design.mdwn b/code/realtime/design.mdwn
index 35689fd..208c3e9 100644
--- a/code/realtime/design.mdwn
+++ b/code/realtime/design.mdwn
@@ -162,7 +162,8 @@ How to implement this stuff? I want scenarios like:
 Crazy idea: Make having a conversation with an actor be a roguelike
 minigame. Items could represent conversational gambits, and rooms topics of
 conversation. Monsters and locked rooms would be the actor resisting your
-advances. Goal being to get to an exit that convinces the actor that you're
+advances. A pet equivilant could be the actor's growing agreement.
+Goal being to get to an exit that convinces the actor that you're
 right, or that makes the actor like you, etc.
 
 Some weapons might be logic-based, others appealing emotionally, etc.

idea
diff --git a/code/realtime/design.mdwn b/code/realtime/design.mdwn
index ba25653..35689fd 100644
--- a/code/realtime/design.mdwn
+++ b/code/realtime/design.mdwn
@@ -156,3 +156,21 @@ How to implement this stuff? I want scenarios like:
   then they'll bobble until 
   `min (B is due to unbobble next) (100 years)`, and if B is unbobbled then,
   will go out to steal from them.
+
+## conversation system
+
+Crazy idea: Make having a conversation with an actor be a roguelike
+minigame. Items could represent conversational gambits, and rooms topics of
+conversation. Monsters and locked rooms would be the actor resisting your
+advances. Goal being to get to an exit that convinces the actor that you're
+right, or that makes the actor like you, etc.
+
+Some weapons might be logic-based, others appealing emotionally, etc.
+Different monsters would be more and less affected by different kinds of
+weapons.
+
+The Qualm hits!
+You destroy the Flawed Argument with your +2 Logic!
+You trip over an emotional mine. It explodes! Movement is difficult.
+The self-forfulling prophecy grabs you. You are being crushed!
+

Added a comment: A growing trend?
diff --git a/blog/entry/dealing_with_dialup/comment_5_aa28fd5f282b29ebdd55679cc2a9e54e._comment b/blog/entry/dealing_with_dialup/comment_5_aa28fd5f282b29ebdd55679cc2a9e54e._comment
new file mode 100644
index 0000000..6385111
--- /dev/null
+++ b/blog/entry/dealing_with_dialup/comment_5_aa28fd5f282b29ebdd55679cc2a9e54e._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="yrogerg64"
+ subject="A growing trend?"
+ date="2015-12-21T05:21:53Z"
+ content="""
+I wonder if perhaps a trend is developing where users are becoming web weary and are looking for content and not fluff.  In addition to using text based browsers, I have been using Google Transcoder in FF to scrape the fluff or utilizing a user agent changer addon in FF to navigate mobile versions of some sites.  There seems to be a small but noticable resurgence of the Gopher protocol which is quite dialup friendly.  Who knows what the future brings?
+"""]]

add news item for scroll 1.20151219
diff --git a/code/scroll/news/version_1.20151219.mdwn b/code/scroll/news/version_1.20151219.mdwn
new file mode 100644
index 0000000..739a89e
--- /dev/null
+++ b/code/scroll/news/version_1.20151219.mdwn
@@ -0,0 +1,4 @@
+scroll 1.20151219 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix copyright statement; scroll is GPL2+
+   * Fix to build under ghc 7.10."""]]
\ No newline at end of file

add
diff --git a/code/pdmenu/thankyou.png b/code/pdmenu/thankyou.png
new file mode 100644
index 0000000..394f682
Binary files /dev/null and b/code/pdmenu/thankyou.png differ

fix link to deleted script
diff --git a/blog/entry/local_rsync_accelerator.mdwn b/blog/entry/local_rsync_accelerator.mdwn
index 7f88d44..78e3cb3 100644
--- a/blog/entry/local_rsync_accelerator.mdwn
+++ b/blog/entry/local_rsync_accelerator.mdwn
@@ -33,7 +33,7 @@ on a typical home NAS, with a slow (arm) CPU, the picture changes
 entirely -- now the checksum overhead is unbearable, while the IO overhead
 is minimal.
 
-So, [here's local-rsync](http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/local-rsync).
+So, [here's local-rsync](http://git.kitenet.net/?p=joey/home.git;a=blob;f=bin/local-rsync;hb=0bed147834aef4efe8650d731f9160fb41b16014).
 It takes all the same options as rsync, with the caveat that
 SOURCE and DEST must be the first two options, and must be local
 directories.

add
diff --git a/code/realtime/design.mdwn b/code/realtime/design.mdwn
new file mode 100644
index 0000000..ba25653
--- /dev/null
+++ b/code/realtime/design.mdwn
@@ -0,0 +1,158 @@
+Realtime
+
+A roguelike game that's a fan-fiction/simulation of Vernor Vinge's
+_Marooned in Realtime_.
+
+## Goal
+
+Convince the bobbled remainders of humanity to unify and re-make
+a civilization.
+
+## Intro
+
+You somehow made it into a small compound, with bobble generator and
+supplies, and have just bobbled forward 100 years as the game begins, past
+the singularity. This gives you a relatively low starting tech level
+compared to many others who started nearer to that point.
+
+## Setting
+
+### Region
+
+The roguelike map should cover a relatively small region. Many bobbles have
+ended up here due to historial reasons (perhaps because the area has a
+stable geography). Around a dozen bobbles should fit on the screen.
+
+Topography: The region will often be a coastline, or contain a river, or be a
+valley in mountains. These large-scale features will be displayed in the
+region.
+
+### Compounds
+
+                          ...
+                         .....
+                        .......          ...
+                        ...@...         .....      .
+                        .......         ..@..     .@.    @
+                         .....          .....      .
+                          ...            ...
+
+Each bobble surrounds a circular compound. Or, in the case of personal
+bobble generators, a single cell. The scale within a compound is one cell
+per room. Avoids needing map generation, etc. Each room has a name
+(storeroom, kitchen, etc), and appropriate starting contents. Center room
+is always control room.
+
+### World / Universe
+
+Avoid needing to generate a full consistent world map (or more),
+but other bobbles can be located in other settings, and bobbles
+can be moved (by appropriate tech). 
+
+### Inter region movement
+
+When the user moves outside the local region, query where they're going,
+and let them try to travel there, but in an abstract, non-roguelike manner.
+For example, attempt to walk to some other known region, which may take
+months or years (game time). Or, fly to other region, which may take
+minures. Or, explore for X days looking for a region containing a lake,
+river, mountain, coast, etc.
+
+With sufficient tech, it's possible to move an entire compound, or a 
+bobble to another region. Same inter-region movement applies.
+
+Other tech (ie, self-bobbling satellites) allows telepresence across
+regions.
+
+## Time
+
+Game time is key. The game clock starts 100 years in the future from when
+the user runs the game. Bobbling can move it forward in arbitrary leaps.
+Movement within a region moves it forward in minutes or hours. Inter-region
+movement in minutes to mutiple years.
+
+Age is the most important stat. Reach old age, die, and game is over,
+win or lose. Tech can of course extend lifespans, somewhat.
+
+As years progress, regions change.
+
+* climate (ice ages, volcanic events, winding down of anthromorphic global
+  warming after the singularity, etc)
+* geologic change (mountains erode to hills, are uplifted; rivers change
+  course, dry up or widen)
+* in deep time, orbit changes, moon becomes further (IIRC), etc
+
+If someone gets stuck without a bobble generator, they're marooned in
+realtime of course. If they can last until a bobble in their region opens,
+they can hitch a ride.
+
+### Movement in time
+
+Each time a bobble is formed, its controller (the player or a actor) decides
+how long it should last. This is just an amount of time. But, more advanced
+tech allows fine-tuning this.
+
+* Examine a bobble, and you can tell when it will pop. So go forward to
+  that time.
+* When your bobble pops, tech can quickly scan for danger and re-bobble
+  forward some amount. Complex algorythms possible (go forward 2, 4, 8, or
+  more randomly).
+* Bobbled probes can be released that unbobble just before the main bobble,
+  do arbitrary analysis, and have info waiting when the main bobble pops.
+  For example, follow another compound as it pops and re-bobbles.
+* Bobble-in-bobble? I forget if the book allowed this, offensively,
+  and/or defensively.
+
+### tech
+
+Tech tree, items with abilities, seems good enough.
+
+### actors
+
+A massive part of the game.
+
+(Any way to have multiple player characters? Seems sorta doable; the game
+in multiplayer could be played turn-based, with whichever player is
+furthest back in time being able to act. When players reach the same time,
+they can interact. But, this would require other goals for other players,
+unless cooperative play makes sense. If a player decides their goal is to
+go forward until the sun explodes, they're probably kind of out of the rest
+of the game.)
+
+actors have:
+
+* A name.
+* A location.
+* An age.
+* A lifespan.
+* Control of some tech, often including a compound and bobbler.
+* A longterm goal. ("unify and re-make a civilization", 
+  "go forward until the sun explodes", 
+  "steal all the tech I can to become mighty",
+  "kill the hated others", "record and explore every hundred years", etc)
+* A shorterm goal. ("kill so-and-so", "take such-and-such", "explore region
+  for a week)")
+* Trust levels for every other actor, which change as circumstances change.
+* Value placed on every other actor, which change as circumstances change.
+  (Ie, might not trust someone much, but highly value them for whatever
+  reason.)
+* Alliances and agreements with other actors. 
+  - Deciding when to unboble together.
+  - Giving access to compound for visits.
+  - Trading/giving items.
+  - Up to and including sharing a compound with others, one of whom is
+    elected leader.
+* A satisfaction level; if things are not working well, goal may change.
+
+How to implement this stuff? I want scenarios like:
+
+* A highly values B, and trusts C. C bobbles the compund with B outside.
+  Now A distrusts C, and has a goal of overthrowing C and 
+  finding out what happened to B.
+* A trusts D. D steals from A. Now A distrusts and disvalues D and has
+  a shortterm goal (for their next N turns) of stealing from D. So,
+  A's shortterm goal makes them want to unbobble when D does.
+  If A's longterm goal is "record and explore every hundred years",
+  then they'll bobble until 
+  `min (B is due to unbobble next) (100 years)`, and if B is unbobbled then,
+  will go out to steal from them.

comment
diff --git a/blog/entry/please_build_a_haskell_to_perl_compiler/comment_3_89a0f1a421e98ef11acd625706c2e08b._comment b/blog/entry/please_build_a_haskell_to_perl_compiler/comment_3_89a0f1a421e98ef11acd625706c2e08b._comment
new file mode 100644
index 0000000..717774f
--- /dev/null
+++ b/blog/entry/please_build_a_haskell_to_perl_compiler/comment_3_89a0f1a421e98ef11acd625706c2e08b._comment
@@ -0,0 +1,43 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-12-13T20:11:58Z"
+ content="""
+Here's an attempt at manually compiling this haskell code:
+
+	main = let s = f 'a' in putStr s
+	  where f d = d : f d
+
+As perl:
+
+	sub f ($) {
+	        my $d=shift;
+	        mkList($d, thunk(\&f,$d)); # d : f d
+	}
+	my $s = thunk(\&f,'a');
+	force(putStr($s);
+	
+	# IO monad would make actual implementation be in terms of (>>=),
+	# since putStr (h:t) = putChar h >>= \_ -> putStr t
+	# but, we can fake it like this:
+	sub putStr ($) {
+        	my $l=force(shift());
+	        print headList($l);
+	        thunk(\&putStr, tailList($l));
+	}
+
+I think that's fairly similarly to how Fay works, although it's been
+a while since I looked at Fay. 
+
+The use of thunk() gets us laziness. The implementation of force() needs
+some trickiness to avoid blowing the perl stack (perhaps using goto),
+since it may need to repeatedly force a thunk that yields a thunk,
+as happens with "force(putStrLn($s))".
+
+Perl's GC can't handle cyclic data structures (can javascript's?).
+In f(), $d captures the input value, and it will remain
+referenced until the returned list is freed. But, there's no cyclic data
+structure at the perl level, just a list object consisting of $d and a
+thunk (which consists of a reference to f() and $d). So, I think perl's GC can
+handle that.
+"""]]

add news item for filters 2.55
diff --git a/code/filters/news/version_2.49.mdwn b/code/filters/news/version_2.49.mdwn
deleted file mode 100644
index e1fb03c..0000000
--- a/code/filters/news/version_2.49.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-filters 2.49 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * scottish: Fix typo. Closes: #[688905](http://bugs.debian.org/688905)
-   * lolcat: New filter."""]]
\ No newline at end of file
diff --git a/code/filters/news/version_2.55.mdwn b/code/filters/news/version_2.55.mdwn
new file mode 100644
index 0000000..b1e6905
--- /dev/null
+++ b/code/filters/news/version_2.55.mdwn
@@ -0,0 +1,8 @@
+filters 2.55 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix build warnings.
+     Thanks, Marius Gavrilescu.
+   * scramble: Fix missing free and improve error handling.
+     Thanks, Marius Gavrilescu
+   * A few other minor fixes.
+   * Update urls."""]]
\ No newline at end of file

add
diff --git a/blog.mdwn b/blog.mdwn
index 46bb66a..c3c8d8f 100644
--- a/blog.mdwn
+++ b/blog.mdwn
@@ -10,7 +10,7 @@ actions=yes]]
 <a href="http://flattr.com/thing/39887/Joey-Hesss-blog" target="_blank">
 <img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
 
-[[!img pics/shuttleworth.jpg size=150x]]
+[[!img pics/shuttleworth.jpg size=150x link=shuttleworth-flash-grant]]
 
 [[!calendar pages="blog/entry/* and !blog/entry/*/* and !*/Discussion"]]
 
diff --git a/shuttleworth-flash-grant.mdwn b/shuttleworth-flash-grant.mdwn
new file mode 100644
index 0000000..db48bd2
--- /dev/null
+++ b/shuttleworth-flash-grant.mdwn
@@ -0,0 +1,3 @@
+In November 2015 I received a
+[Flash Grant](https://shuttleworthfoundation.org/flashgrants/)
+from the ShuttleWorth foundation.

reog
diff --git a/blog.mdwn b/blog.mdwn
index 19cdffa..46bb66a 100644
--- a/blog.mdwn
+++ b/blog.mdwn
@@ -10,6 +10,8 @@ actions=yes]]
 <a href="http://flattr.com/thing/39887/Joey-Hesss-blog" target="_blank">
 <img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
 
+[[!img pics/shuttleworth.jpg size=150x]]
+
 [[!calendar pages="blog/entry/* and !blog/entry/*/* and !*/Discussion"]]
 
 [[!calendar pages="blog/entry/* and !blog/entry/*/* and !*/Discussion" year=-1]]
@@ -40,6 +42,4 @@ Other feeds:
 Recent [chatter](https://identi.ca/joeyh):
 [[!inline pages="internal(grep/identi.ca_posts/*)" template="microblog" show=5 feeds=no]]
 
-[[!img pics/shuttleworth.jpg size=150x]]
-
 """]]

larger
diff --git a/blog.mdwn b/blog.mdwn
index 666a01e..19cdffa 100644
--- a/blog.mdwn
+++ b/blog.mdwn
@@ -40,6 +40,6 @@ Other feeds:
 Recent [chatter](https://identi.ca/joeyh):
 [[!inline pages="internal(grep/identi.ca_posts/*)" template="microblog" show=5 feeds=no]]
 
-[[!img pics/shuttleworth.jpg size=100x]]
+[[!img pics/shuttleworth.jpg size=150x]]
 
 """]]

add
diff --git a/blog.mdwn b/blog.mdwn
index ed4c232..666a01e 100644
--- a/blog.mdwn
+++ b/blog.mdwn
@@ -40,4 +40,6 @@ Other feeds:
 Recent [chatter](https://identi.ca/joeyh):
 [[!inline pages="internal(grep/identi.ca_posts/*)" template="microblog" show=5 feeds=no]]
 
+[[!img pics/shuttleworth.jpg size=100x]]
+
 """]]
diff --git a/blog/pics/shuttleworth.jpg b/blog/pics/shuttleworth.jpg
new file mode 100644
index 0000000..33a2b2b
Binary files /dev/null and b/blog/pics/shuttleworth.jpg differ

poll vote (too long for me)
diff --git a/blog/entry/watch_me_code_for_half_an_hour.mdwn b/blog/entry/watch_me_code_for_half_an_hour.mdwn
index 08c9033..543b3af 100644
--- a/blog/entry/watch_me_code_for_half_an_hour.mdwn
+++ b/blog/entry/watch_me_code_for_half_an_hour.mdwn
@@ -14,7 +14,7 @@ Not shown is the hour I spent the next day changing the "optimize"
 subcommand implemented here into "--auto" options that can be passed to
 [[code/git-annex]]'s get and drop commands.
 
-[[!poll 45 "watched it all, liked it" 8 "watched some, boring" 3 "too long for me" 15 "too haskell for me" 12 "not interested"]]
+[[!poll 45 "watched it all, liked it" 8 "watched some, boring" 4 "too long for me" 15 "too haskell for me" 12 "not interested"]]
 
 [[!meta title="watch me program for half an hour"]]
 [[!tag haskell]]

Add question about using it for external directories
diff --git a/code/etckeeper/discussion.mdwn b/code/etckeeper/discussion.mdwn
index e1d111f..7e9d21a 100644
--- a/code/etckeeper/discussion.mdwn
+++ b/code/etckeeper/discussion.mdwn
@@ -244,3 +244,7 @@ I looked at the post-invoke hook that etckeeper puts in /etc/apt/apt.conf.d, but
 ---
 
 There is some odd behavior when doing a rebase with a reword. The .etckeeper file gets conflicts (could be because of http://git.661346.n2.nabble.com/rebase-i-reword-runs-pre-commit-hook-with-curious-results-td7244648.html). This is easy to work-around with a manual `etckeeper pre-commit` before `git rebase --continue` but I wonder if the pre-commit hook can be modified to make this work seamlessly?
+
+---
+I would like to use awesome etckeeper not only for /etc, but also for tracking python code at /usr/lib/python2.7/dist-packages/. In my specific situation people sometimes log in to servers and change code there on the fly. Should I just add one line 'etckeeper commit -d /usr/lib/python2.7/dist-packages/ "daily autocommit" >/dev/null' in cron job here https://github.com/joeyh/etckeeper/blob/master/debian/cron.daily#L15 ? What else should I think about when using etckeeper for two dirs?
+

update
diff --git a/code/concurrent-output.mdwn b/code/concurrent-output.mdwn
index 26b6c9b..dee5240 100644
--- a/code/concurrent-output.mdwn
+++ b/code/concurrent-output.mdwn
@@ -1,19 +1,14 @@
 Haskell library to let multiple threads and external processes
 concurrently output to the console, without it getting all garbled up.
 
-[concurrent-output](http://hackage.haskell.org/package/concurrent-output)
-
-Provides a simple interface for writing concurrent programs that
-need to output a lot of status messages to the console, or display
-multiple progress bars for different activities at the same time,
-or concurrently run external commands that output to the console.
-
 Built on top of that is a way of defining multiple output regions,
 which are automatically laid out on the screen and can be individually
-updated. Can be used for progress displays etc.
+updated by concurrent threads. Can be used for progress displays etc.
+
+[concurrent-output on Hackage](http://hackage.haskell.org/package/concurrent-output)
 
 [[demo2.gif]]
 
 [[aptdemo.gif]]
 
-Used by: [[git-annex]] [[propellor]]
+Used by: [[git-annex]] [[propellor]] [etc](http://packdeps.haskellers.com/reverse/concurrent-output)

Suppress sponge warnings for stdout?
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 22f7279..d98c4ee 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -475,3 +475,26 @@ would break into a different cluster whenever the time from one line to the next
 It would be nice to show both stdin and stderr, and distinguish them.  (Otherwise one needs 2>&1 to combine stdin and stderr.)  But that could alternatively be done with a colorizer, which would be a good separate tool to have.
 
 I'd like to have environment variable TS_FORMAT to avoid typing custom format every time I use ts. Default is very inconvenient to read for non-native english speaker; I personally almost always use '%H:%M:%S'.
+
+## Suppress sponge warnings for stdout?
+
+I have the following two scripts:
+
+*foo.py*:
+
+    #!/usr/bin/env python
+
+    import subprocess
+    subprocess.call(("bar.sh"))
+
+*bar.sh*:
+
+    #!/bin/bash
+
+    cat /usr/share/dict/words | sponge | less
+
+Running foo.py and then immediately exiting 'less' by pressing 'q' causes sponge to print an error:
+
+    error writing buffer to output file: Broken pipe
+
+Curiously, running bar.sh directly doesn't have this problem.  I'm not sure what Python is doing to the execution environment to cause this, but would you consider changing write_buff_out to suppress its warning spew if it's writing to stdout?

update
diff --git a/code/concurrent-output/discussion.mdwn b/code/concurrent-output/discussion.mdwn
index 897a4cc..57df5fb 100644
--- a/code/concurrent-output/discussion.mdwn
+++ b/code/concurrent-output/discussion.mdwn
@@ -4,3 +4,6 @@ Hm... this doesn't appear to work on OSX (in iTerm, at least). I wonder what's g
 > sequences for cursor movement. I've tested it on several terminals on
 > Linux, but have no access to OSX. It also works on Windows due to the
 > portability layer in ansi-terminal. --[[Joey]]
+
+> > Version 1.6.1 avoids using some ANSI codes that are not widely
+> > supported, and I think will work on OSX. --[[Joey]]

response
diff --git a/code/concurrent-output/discussion.mdwn b/code/concurrent-output/discussion.mdwn
index 660331f..897a4cc 100644
--- a/code/concurrent-output/discussion.mdwn
+++ b/code/concurrent-output/discussion.mdwn
@@ -1 +1,6 @@
 Hm... this doesn't appear to work on OSX (in iTerm, at least). I wonder what's going on.
+
+> concurrent-output should work on terminals that support ANSI escape
+> sequences for cursor movement. I've tested it on several terminals on
+> Linux, but have no access to OSX. It also works on Windows due to the
+> portability layer in ansi-terminal. --[[Joey]]

diff --git a/code/concurrent-output/discussion.mdwn b/code/concurrent-output/discussion.mdwn
new file mode 100644
index 0000000..660331f
--- /dev/null
+++ b/code/concurrent-output/discussion.mdwn
@@ -0,0 +1 @@
+Hm... this doesn't appear to work on OSX (in iTerm, at least). I wonder what's going on.

update
diff --git a/code/concurrent-output.mdwn b/code/concurrent-output.mdwn
index 7cc2095..26b6c9b 100644
--- a/code/concurrent-output.mdwn
+++ b/code/concurrent-output.mdwn
@@ -15,3 +15,5 @@ updated. Can be used for progress displays etc.
 [[demo2.gif]]
 
 [[aptdemo.gif]]
+
+Used by: [[git-annex]] [[propellor]]

hmm
diff --git a/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment b/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment
index 4b0d19e..51b59b9 100644
--- a/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment
+++ b/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment
@@ -25,5 +25,8 @@ Implementation of that approach using console-regions:
 		writeTVar counter 0
 		return todisplay
 
-Well, that's 10% of the LoC budget gone. ;)
+Edit: Hmm, looking at that, it doesn't quite work. Since the STM transaction
+reads from the counter and then modifies it, when concurrent-output asks STM
+to `retry` in order to wait for changes, it will immediately re-run the
+action, since a value it looked at has changed. So, dunno..
 """]]

mv
diff --git a/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment b/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment
deleted file mode 100644
index 4b0d19e..0000000
--- a/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment
+++ /dev/null
@@ -1,29 +0,0 @@
-[[!comment format=mdwn
- username="joey"
- subject="""comment 1"""
- date="2015-11-04T15:20:55Z"
- content="""
-Recursion would indeed be where something so simple becomes problimatic.
-
-One way to limit iterations would be to make a cell have a counter. When
-the cell calculates its value, it increments the counter and bails if
-there's been too much calculation. The counter is reset to 0 once the cell
-is successfully displayed.
-
-Implementation of that approach using console-regions:
-
-	cell <- newConsoleRegion
-	counter <- newTVar 0
-	setConsoleRegion cell = do
-		n <- readTVar counter
-		if n > 100
-			then return "ERROR" -- or the current value or whatever
-			else do
-				modifyTVar' counter (+)
-				-- look at other cells here
-	tuneDisplay cell $ \todisplay -> do
-		writeTVar counter 0
-		return todisplay
-
-Well, that's 10% of the LoC budget gone. ;)
-"""]]
diff --git a/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment b/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment
new file mode 100644
index 0000000..4b0d19e
--- /dev/null
+++ b/blog/entry/STM_Region_contents/comment_3_de694db1218a83dcf6430c90e6502fd9._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-11-04T15:20:55Z"
+ content="""
+Recursion would indeed be where something so simple becomes problimatic.
+
+One way to limit iterations would be to make a cell have a counter. When
+the cell calculates its value, it increments the counter and bails if
+there's been too much calculation. The counter is reset to 0 once the cell
+is successfully displayed.
+
+Implementation of that approach using console-regions:
+
+	cell <- newConsoleRegion
+	counter <- newTVar 0
+	setConsoleRegion cell = do
+		n <- readTVar counter
+		if n > 100
+			then return "ERROR" -- or the current value or whatever
+			else do
+				modifyTVar' counter (+)
+				-- look at other cells here
+	tuneDisplay cell $ \todisplay -> do
+		writeTVar counter 0
+		return todisplay
+
+Well, that's 10% of the LoC budget gone. ;)
+"""]]

response
diff --git a/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment b/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment
new file mode 100644
index 0000000..4b0d19e
--- /dev/null
+++ b/blog/entry/STM_Region_contents/comment_1_de694db1218a83dcf6430c90e6502fd9._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-11-04T15:20:55Z"
+ content="""
+Recursion would indeed be where something so simple becomes problimatic.
+
+One way to limit iterations would be to make a cell have a counter. When
+the cell calculates its value, it increments the counter and bails if
+there's been too much calculation. The counter is reset to 0 once the cell
+is successfully displayed.
+
+Implementation of that approach using console-regions:
+
+	cell <- newConsoleRegion
+	counter <- newTVar 0
+	setConsoleRegion cell = do
+		n <- readTVar counter
+		if n > 100
+			then return "ERROR" -- or the current value or whatever
+			else do
+				modifyTVar' counter (+)
+				-- look at other cells here
+	tuneDisplay cell $ \todisplay -> do
+		writeTVar counter 0
+		return todisplay
+
+Well, that's 10% of the LoC budget gone. ;)
+"""]]

Added a comment
diff --git a/blog/entry/STM_Region_contents/comment_2_85e8f64fe21e8504f967922208f69b3e._comment b/blog/entry/STM_Region_contents/comment_2_85e8f64fe21e8504f967922208f69b3e._comment
new file mode 100644
index 0000000..aec6b76
--- /dev/null
+++ b/blog/entry/STM_Region_contents/comment_2_85e8f64fe21e8504f967922208f69b3e._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="Jon"
+ subject="comment 2"
+ date="2015-11-04T11:39:14Z"
+ content="""
+Very cool. Reading you and Joachim having so much fun with Haskell encourages me to spend more time with it myself.
+"""]]