Recent changes to this wiki:

typo
diff --git a/code/moreutils.mdwn b/code/moreutils.mdwn
index 65498ffb..1b6730b1 100644
--- a/code/moreutils.mdwn
+++ b/code/moreutils.mdwn
@@ -201,7 +201,7 @@ Here are some that have been suggested but not yet been included:
 
   <http://savannah.nongnu.org/projects/shuffle/> is a similar thing,
   which its author describes as "almost coreutil ready, but its memory
-  bound, a big nono". (Apparently coreutils 6 has a `shouf` and `sort
+  bound, a big nono". (Apparently coreutils 6 has a `shuf` and `sort
   --random-sort`.)
 
 * `mime`

Added a comment: Zephyr copilot blog
diff --git a/blog/entry/announcing_zephyr-copilot/comment_1_6b8764ca1f8c22c7213bf5cd663b4959._comment b/blog/entry/announcing_zephyr-copilot/comment_1_6b8764ca1f8c22c7213bf5cd663b4959._comment
new file mode 100644
index 00000000..af7fbf44
--- /dev/null
+++ b/blog/entry/announcing_zephyr-copilot/comment_1_6b8764ca1f8c22c7213bf5cd663b4959._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="maemalynn@a7c6e868d95133c17aca6d9ecaf1695fc271b78e"
+ nickname="maemalynn"
+ avatar="http://cdn.libravatar.org/avatar/7a6febef8adc15ec8936afbe92d080f5"
+ subject="Zephyr copilot blog"
+ date="2022-04-06T00:57:50Z"
+ content="""
+Hi there - I am the public relations manager for the Zephyr Project. I discovered your zephyr copilot blog and was wondering if you would like us to re-run it on the Zephyr website. We often re-run blogs and videos from the dev community. you can read other blogs here: https://www.zephyrproject.org/community/#blog. If this is approved, please send me an email at maemalynn@linuxfoundation.org with your approval and link to the blog and video. Thanks!
+"""]]

shorter
diff --git a/sm/mirror/index.html b/sm/mirror/index.html
index 2ffbb472..50ba2939 100644
--- a/sm/mirror/index.html
+++ b/sm/mirror/index.html
@@ -19,6 +19,6 @@
     </style>
   </head>
   <body>
-    <span class="flipH"><textarea cols=100 rows=50></textarea></span>
+    <span class="flipH"><textarea cols=100 rows=30></textarea></span>
   </body>
 </html>

shorter
diff --git a/sm/mirror/index.html b/sm/mirror/index.html
index be939679..2ffbb472 100644
--- a/sm/mirror/index.html
+++ b/sm/mirror/index.html
@@ -19,6 +19,6 @@
     </style>
   </head>
   <body>
-    <span class="flipH"><textarea cols=100 rows=100></textarea></span>
+    <span class="flipH"><textarea cols=100 rows=50></textarea></span>
   </body>
 </html>

add, for jerome
diff --git a/sm/mirror/index.html b/sm/mirror/index.html
new file mode 100644
index 00000000..be939679
--- /dev/null
+++ b/sm/mirror/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>mirror, mirror</title>
+    <style>
+      span {
+        display: inline-block;
+        margin: 40px;
+      }
+      .flipH {
+        transform: scale(-1, 1);
+        color: #1c87c9;
+        -moz-transform: scale(-1, 1);
+        -webkit-transform: scale(-1, 1);
+        -o-transform: scale(-1, 1);
+        -ms-transform: scale(-1, 1);
+        transform: scale(-1, 1);
+      }
+    </style>
+  </head>
+  <body>
+    <span class="flipH"><textarea cols=100 rows=100></textarea></span>
+  </body>
+</html>

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 6848e00a..94ba77fd 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -668,7 +668,7 @@ More often, I might want to do something like this:
 
 Now, vipe can *sort of* do this, by using either a here-string (`vipe <<< "" | wc -c`) or by pressing Ctrl-D as soon as vipe launches. I wondered if we could just skip the Ctrl-D step and have vipe detect when no stdin has been given to it; instead, jump straight into an empty vim document? - TR
 
-> Uhmm, "vipe </dev/null | datamash sum 1"? -DG
+> Uhmm, "`vipe </dev/null | datamash sum 1`"? -DG
 
 ## Vipe with arguments for editor commands involving whitespaces
 

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 65f6658b..6848e00a 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -668,6 +668,8 @@ More often, I might want to do something like this:
 
 Now, vipe can *sort of* do this, by using either a here-string (`vipe <<< "" | wc -c`) or by pressing Ctrl-D as soon as vipe launches. I wondered if we could just skip the Ctrl-D step and have vipe detect when no stdin has been given to it; instead, jump straight into an empty vim document? - TR
 
+> Uhmm, "vipe </dev/null | datamash sum 1"? -DG
+
 ## Vipe with arguments for editor commands involving whitespaces
 
 I sometimes want to use vipe while passing arguments to my editor (let’s say `vim +startinsert`).  That’s easy enough, I just need to run it with the EDITOR variable locally set to that.  But if the arguments contain whitespaces (for instance `vim -c 'norm o'`), this trick doesn’t work anymore, because the EDITOR variable is split on whitespaces.  For that purpose, it would be nice to check as a last case after EDITOR and VISUAL whether any arguments have been passed to vipe and, if that is the case, to set `@editor` to `@ARGV`.  We could then do `vipe vim -c 'norm o'` for those cases that require more flexibility. --Vej Kse

add mirror
diff --git a/talks.mdwn b/talks.mdwn
index 2a810cd4..af707053 100644
--- a/talks.mdwn
+++ b/talks.mdwn
@@ -126,5 +126,6 @@ by others.
 ## Houston Functional Programmers 2022
 
 * "Programming Arduinos with Haskell and NASA’s Copilot"
-  - [video on youtube](https://www.youtube.com/watch?v=l-luyVRgWVU)
+  - [video](https://www.youtube.com/watch?v=l-luyVRgWVU)
   - Covering [[code/arduino-copilot]], and also introducing [[code/zephyr-copilot]]
+  * [mirror](https://downloads.kitenet.net/talks/hfpug-arduino-copilot.mp4)

blog
diff --git a/blog/entry/announcing_zephyr-copilot.mdwn b/blog/entry/announcing_zephyr-copilot.mdwn
new file mode 100644
index 00000000..f2d5b431
--- /dev/null
+++ b/blog/entry/announcing_zephyr-copilot.mdwn
@@ -0,0 +1,53 @@
+I recently learned about the [Zephyr Project](https://zephyrproject.org/)
+which is a rather neat embedded OS for devices too small to run Linux.
+
+This led me to wondering if I could adapt arduino-copilot to target
+Zephyr, and so be able to program any of the 350+ boards it supports using
+Haskell.
+
+At the same time I had an opportunity to give a talk at the Houston
+Functional Programmers group. On February 1st I decided to 
+<a href="https://hfpug.org/event/joey-hess-programming-ardinos-with-haskell-and-nasas-copilot/">give
+that talk, about arduino-copilot</a>.
+
+That left 2 weeks to buy some hardware supported by Zephyr and port
+arduino-copilot to it. The result is 
+[zephyr-copilot](https://hackage.haskell.org/package/zephyr-copilot),
+and I was able to demo it during my talk.
+
+This example can be used with any of 293 different boards, and will
+blink an on-board LED:
+
+	module Examples.Blink.Demo where
+	
+	import Copilot.Zephyr.Board.Generic
+	
+	main :: IO ()
+	main = zephyr $ do
+	        led0 =: blinking
+	        delay =: MilliSeconds (constant 100)
+
+Doing much more than that needs a board specific module to set up GPIO
+pins etc. So far I only have written those for a couple of boards I have,
+but they are fairly easy to write. I'd be happy to help anyone who wants to
+contribute one.
+
+Due to the time constraints I have not implemented serial port support, or
+PWM or ADC yet, although all should be fairly easy. Zephyr also has no end
+of other capabilities, from networking to file systems to sensors, that
+could perhaps be supported in zephyr-copilot.
+
+My talk has now been published on [youtube](https://youtu.be/l-luyVRgWVU).
+I really enjoyed presenting again for the first time in 4 years(!), and 
+to a very nice group of people. Thanks to Claude Rubinson for his persistence
+in getting me to give a talk.
+
+----
+
+Development of zephyr-copilot was sponsored by Mark Reidenbach,
+Erik Bjäreholt, Jake Vosloo, and Graham Spencer
+[on Patreon](https://patreon.com/joeyh).
+
+[[!tag haskell]]
+[[!tag code/arduino-copilot]]
+[[!tag code/zephyr-copilot]]

add links
diff --git a/talks.mdwn b/talks.mdwn
index 304adfe3..2a810cd4 100644
--- a/talks.mdwn
+++ b/talks.mdwn
@@ -127,3 +127,4 @@ by others.
 
 * "Programming Arduinos with Haskell and NASA’s Copilot"
   - [video on youtube](https://www.youtube.com/watch?v=l-luyVRgWVU)
+  - Covering [[code/arduino-copilot]], and also introducing [[code/zephyr-copilot]]

add talk
diff --git a/talks.mdwn b/talks.mdwn
index f3c35e5b..304adfe3 100644
--- a/talks.mdwn
+++ b/talks.mdwn
@@ -122,3 +122,8 @@ by others.
 
 * "Secure Scuttlebutt lightning talk"
   - [video](https://downloads.kitenet.net/talks/secure-scuttlebutt-lightning-talk-libreplanet.webm)
+
+## Houston Functional Programmers 2022
+
+* "Programming Arduinos with Haskell and NASA’s Copilot"
+  - [video on youtube](https://www.youtube.com/watch?v=l-luyVRgWVU)

add
diff --git a/talks/arduino-copilot-hfpug.mdwn b/talks/arduino-copilot-hfpug.mdwn
index 3788331a..81c3a7ac 100644
--- a/talks/arduino-copilot-hfpug.mdwn
+++ b/talks/arduino-copilot-hfpug.mdwn
@@ -5,4 +5,5 @@ Links to pages used in this talk:
 <li><a href="https://copilot-language.github.io/">copilot</a>
 <li><a href="https://hackage.haskell.org/package/arduino-copilot">arduino-copilot</a>
 <li><a href="https://zephyrproject.org/">Zephyr Project</a>
+<li><a href="https://hackage.haskell.org/package/zephyr-copilot">zephyr-copilot</a>
 </ul>

remove non-functional link
diff --git a/talks/arduino-copilot-hfpug.mdwn b/talks/arduino-copilot-hfpug.mdwn
index fb0ccba8..3788331a 100644
--- a/talks/arduino-copilot-hfpug.mdwn
+++ b/talks/arduino-copilot-hfpug.mdwn
@@ -5,5 +5,4 @@ Links to pages used in this talk:
 <li><a href="https://copilot-language.github.io/">copilot</a>
 <li><a href="https://hackage.haskell.org/package/arduino-copilot">arduino-copilot</a>
 <li><a href="https://zephyrproject.org/">Zephyr Project</a>
-<li><a href="led0_boards/index.html">zephyr led0 boards</a>
 </ul>

add zephyr-copilot
diff --git a/code.mdwn b/code.mdwn
index 5e10ebe6..4f5bcda8 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -18,6 +18,7 @@ The stuff that's swapped into my local cache at the moment.
 [[fridge0]]
 [[haskell-filepath-bytestring]]
 [[arduino-copilot]]
+[[zephyr-copilot]]
 
 ## Less active projects
 
diff --git a/code/zephyr-copilot.mdwn b/code/zephyr-copilot.mdwn
new file mode 100644
index 00000000..77d18ccc
--- /dev/null
+++ b/code/zephyr-copilot.mdwn
@@ -0,0 +1,3 @@
+Embedded programming in haskell using the Copilot stream DSL and Zephyr
+
+<http://hackage.haskell.org/package/zephyr-copilot>

add
diff --git a/talks/arduino-copilot-hfpug.mdwn b/talks/arduino-copilot-hfpug.mdwn
new file mode 100644
index 00000000..fb0ccba8
--- /dev/null
+++ b/talks/arduino-copilot-hfpug.mdwn
@@ -0,0 +1,9 @@
+Links to pages used in this talk:
+
+<ul>
+<li><a href="https://haskellembedded.github.io/posts/2015-10-09-compiler-compilers.html">embedding Haskell</a>
+<li><a href="https://copilot-language.github.io/">copilot</a>
+<li><a href="https://hackage.haskell.org/package/arduino-copilot">arduino-copilot</a>
+<li><a href="https://zephyrproject.org/">Zephyr Project</a>
+<li><a href="led0_boards/index.html">zephyr led0 boards</a>
+</ul>

blog update
diff --git a/blog/entry/encountered_near_the_start_of_a_new_chapter.mdwn b/blog/entry/encountered_near_the_start_of_a_new_chapter.mdwn
new file mode 100644
index 00000000..d80d7693
--- /dev/null
+++ b/blog/entry/encountered_near_the_start_of_a_new_chapter.mdwn
@@ -0,0 +1 @@
+[[!img pics/protect_the_autumn_woods.jpg size=1000x]]

add
diff --git a/blog/pics/protect_the_autumn_woods.jpg b/blog/pics/protect_the_autumn_woods.jpg
new file mode 100644
index 00000000..2283aab7
Binary files /dev/null and b/blog/pics/protect_the_autumn_woods.jpg differ

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index fbb6c459..65f6658b 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -729,8 +729,13 @@ But not working
 Current workaround: 
 
 printf 'regex' >> /tmp/script.vim
+
 export EDITOR="vim -s /tmp/script.vim"
+
 ls -rt | vidir -
+
 export EDITOR="vi"
+
 rm /tmp/script.vim
+
 I know moreutils are not being maintained anymore just add this single feature to vidir. Please !!!

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index e73f0baf..fbb6c459 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -699,15 +699,17 @@ shebang and execing it on /dev/fd/n seeked appropriately.
 Let vidir use sorted file list ls -rt order into vim buffer.Currently it just randomly creates the file list buffer.
 
 Case 1 - 
-If we set EDITOR="vi -e -s" then,
+If we set EDITOR="vi" then,
 vidir << EOF
 :%s/string/replace/g
 EOF
 !!! IT WORKS !!! --> Non interactively
 
-Case 2 - I have a files whose rename requires a regex that works only on sorted order of files 
+Case 2 - 
+I have a files whose rename requires a regex that works only on sorted order of files 
 vidir does not consider sorted order of files and requires additional
-ls -rt | vidir - to be executed to edit filenames in sorted order.
+ls -rt | vidir - [Works but is interactive cannot be used for batch processing]
+to be executed to edit filenames in sorted order.
 
 But above doesn't allow for keystroke injection as in Case 1
 
@@ -724,8 +726,11 @@ Tried setting EDITOR="vim - -c 'command'"
 But not working
 
 
-Current workaround
-printf 'regex' >> script.vim
-export EDITOR="vim -s script.vim"
+Current workaround: 
+
+printf 'regex' >> /tmp/script.vim
+export EDITOR="vim -s /tmp/script.vim"
 ls -rt | vidir -
 export EDITOR="vi"
+rm /tmp/script.vim
+I know moreutils are not being maintained anymore just add this single feature to vidir. Please !!!

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 0cbb3766..e73f0baf 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -723,3 +723,9 @@ ls -rt | vim - -c ':%s/string/replace/g^[:wx'
 Tried setting EDITOR="vim - -c 'command'"
 But not working
 
+
+Current workaround
+printf 'regex' >> script.vim
+export EDITOR="vim -s script.vim"
+ls -rt | vidir -
+export EDITOR="vi"

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index a175469c..0cbb3766 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -715,9 +715,11 @@ eg. ls -rt | vidir - << EOF
 :%s/string/replace/g
 EOF
 !!! NOT WORKS !!! ---> As input is conflicted with heredoc
+
 ls -rt | vim - -c ':%s/string/replace/g^[:wx'
 
 !!!Above works!!!----> but how can we achieve it in vidir 
+
 Tried setting EDITOR="vim - -c 'command'"
 But not working
 

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index f5385c74..a175469c 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -695,6 +695,9 @@ shebang and execing it on /dev/fd/n seeked appropriately.
 (Local variables would be a small problem.) --[[Joey]]
 
 ##Feature suggestion: vidir ---> Use of vim command injection of macros and other keystrokes non interactively
+
+Let vidir use sorted file list ls -rt order into vim buffer.Currently it just randomly creates the file list buffer.
+
 Case 1 - 
 If we set EDITOR="vi -e -s" then,
 vidir << EOF

Bug / Feature
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index a7ebb031..f5385c74 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -712,4 +712,9 @@ eg. ls -rt | vidir - << EOF
 :%s/string/replace/g
 EOF
 !!! NOT WORKS !!! ---> As input is conflicted with heredoc
+ls -rt | vim - -c ':%s/string/replace/g^[:wx'
+
+!!!Above works!!!----> but how can we achieve it in vidir 
+Tried setting EDITOR="vim - -c 'command'"
+But not working
 

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 4f9b6561..a7ebb031 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -693,3 +693,23 @@ Quoting rum soaked space hobo:
 This could be done without shell support, by the goto command parsing the
 shebang and execing it on /dev/fd/n seeked appropriately.
 (Local variables would be a small problem.) --[[Joey]]
+
+##Feature suggestion: vidir ---> Use of vim command injection of macros and other keystrokes non interactively
+Case 1 - 
+If we set EDITOR="vi -e -s" then,
+vidir << EOF
+:%s/string/replace/g
+EOF
+!!! IT WORKS !!! --> Non interactively
+
+Case 2 - I have a files whose rename requires a regex that works only on sorted order of files 
+vidir does not consider sorted order of files and requires additional
+ls -rt | vidir - to be executed to edit filenames in sorted order.
+
+But above doesn't allow for keystroke injection as in Case 1
+
+eg. ls -rt | vidir - << EOF 
+:%s/string/replace/g
+EOF
+!!! NOT WORKS !!! ---> As input is conflicted with heredoc
+

calendar update
diff --git a/blog/archives/2022.mdwn b/blog/archives/2022.mdwn
new file mode 100644
index 00000000..cafbf490
--- /dev/null
+++ b/blog/archives/2022.mdwn
@@ -0,0 +1 @@
+[[!calendar type=year year=2022 pages="blog/entry/* and !*/Discussion"]]
diff --git a/blog/archives/2022/01.mdwn b/blog/archives/2022/01.mdwn
new file mode 100644
index 00000000..c342a7de
--- /dev/null
+++ b/blog/archives/2022/01.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=01 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(01) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/02.mdwn b/blog/archives/2022/02.mdwn
new file mode 100644
index 00000000..ec8dccee
--- /dev/null
+++ b/blog/archives/2022/02.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=02 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(02) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/03.mdwn b/blog/archives/2022/03.mdwn
new file mode 100644
index 00000000..87cf9f46
--- /dev/null
+++ b/blog/archives/2022/03.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=03 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(03) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/04.mdwn b/blog/archives/2022/04.mdwn
new file mode 100644
index 00000000..3d2c8e38
--- /dev/null
+++ b/blog/archives/2022/04.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=04 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(04) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/05.mdwn b/blog/archives/2022/05.mdwn
new file mode 100644
index 00000000..c7592210
--- /dev/null
+++ b/blog/archives/2022/05.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=05 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(05) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/06.mdwn b/blog/archives/2022/06.mdwn
new file mode 100644
index 00000000..96038a54
--- /dev/null
+++ b/blog/archives/2022/06.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=06 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(06) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/07.mdwn b/blog/archives/2022/07.mdwn
new file mode 100644
index 00000000..e552388d
--- /dev/null
+++ b/blog/archives/2022/07.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=07 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(07) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/08.mdwn b/blog/archives/2022/08.mdwn
new file mode 100644
index 00000000..4fb7b88d
--- /dev/null
+++ b/blog/archives/2022/08.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=08 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(08) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/09.mdwn b/blog/archives/2022/09.mdwn
new file mode 100644
index 00000000..005f7206
--- /dev/null
+++ b/blog/archives/2022/09.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=09 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(09) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/10.mdwn b/blog/archives/2022/10.mdwn
new file mode 100644
index 00000000..6d9ccbfc
--- /dev/null
+++ b/blog/archives/2022/10.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=10 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(10) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/11.mdwn b/blog/archives/2022/11.mdwn
new file mode 100644
index 00000000..017abb78
--- /dev/null
+++ b/blog/archives/2022/11.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=11 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(11) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2022/12.mdwn b/blog/archives/2022/12.mdwn
new file mode 100644
index 00000000..7aac60bf
--- /dev/null
+++ b/blog/archives/2022/12.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=12 year=2022 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(12) and creation_year(2022) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]

correction
diff --git a/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
index d58a60e6..a5d006fc 100644
--- a/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
+++ b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
@@ -9,7 +9,7 @@ patches, which are easy to deal with. Taking up basic maintenance of this
 package will be easy for you, if you feel like stepping forward.
 
 People still contribute ideas and code for new tools to add to moreutils.
-But I have not added any new tools to it since 2006. There is a big
+But I have not added any new tools to it since 2016. There is a big
 collections of ideas that I have done nothing with. The problem, I
 realized, is that "general-purpose new unix tool" is rather open-ended,
 and kind of problimatic. Picking new tools to add is an editorial process,

update
diff --git a/code/moreutils.mdwn b/code/moreutils.mdwn
index dece6601..65498ffb 100644
--- a/code/moreutils.mdwn
+++ b/code/moreutils.mdwn
@@ -26,8 +26,8 @@ which lets you do things like this:
 
     % sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
 
-There are lots more listed below, and I'm always interested to add
-more to the collection, as long as they're suitably general-purpose,
+There are lots more listed below, and the goal is to collect more,
+as long as they're suitably general-purpose,
 and don't duplicate other well-known tools.
 
 - chronic: runs a command quietly unless it fails

update
diff --git a/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
index 1022fab0..d58a60e6 100644
--- a/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
+++ b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
@@ -14,7 +14,7 @@ collections of ideas that I have done nothing with. The problem, I
 realized, is that "general-purpose new unix tool" is rather open-ended,
 and kind of problimatic. Picking new tools to add is an editorial process,
 or it becomes a mishmash of too many tools that are perhaps not general
-purpose. I am not a great editor, and so I tightened by requirements 
+purpose. I am not a great editor, and so I tightened my requirements 
 for "general-purpose" and "new" so far that I stopped adding anything.
 
 If you have ideas to solve that, or fearless good taste in curating a

blog update
diff --git a/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
new file mode 100644
index 00000000..1022fab0
--- /dev/null
+++ b/blog/entry/Volunteer_Responsibility_Amnesty_Day.mdwn
@@ -0,0 +1,42 @@
+Happy solstice, and happy
+[Volunteer Responsibility Amnesty Day](https://www.volunteeramnestyday.net/)!
+
+After my inventory of my [[code]] today, I have decided it's time to pass
+on [[code/moreutils]] to someone new.
+
+This project remains interesting to people, including me. People still send
+patches, which are easy to deal with. Taking up basic maintenance of this
+package will be easy for you, if you feel like stepping forward.
+
+People still contribute ideas and code for new tools to add to moreutils.
+But I have not added any new tools to it since 2006. There is a big
+collections of ideas that I have done nothing with. The problem, I
+realized, is that "general-purpose new unix tool" is rather open-ended,
+and kind of problimatic. Picking new tools to add is an editorial process,
+or it becomes a mishmash of too many tools that are perhaps not general
+purpose. I am not a great editor, and so I tightened by requirements 
+for "general-purpose" and "new" so far that I stopped adding anything.
+
+If you have ideas to solve that, or fearless good taste in curating a
+collection, this project is for you.
+
+The other reason it's less appealing to me is that unix tools as a whole
+are less appealing to me now. Now, as a functional programmer, I can
+get excited about actual general-purpose functional tools. And these are
+well curated and collected and can be shown to fit because the math says
+they do. Even a tiny Haskell function like this is really very
+interesting in how something so maximally trivial is actually usable in so
+many contexts.
+
+	id :: a -> a
+	id x = x
+
+Anyway, I am not dropping maintenance of moreutils unless and until someone
+steps up to take it on. As I said, it's easy. But I am laying down the
+burden of editorial responsibility and won't be thinking about adding new
+tools to it.
+
+----
+
+Thanks very much to Sumana Harihareswara for developing and promoting
+the amnesty day idea!

add news item for moreutils 0.67
diff --git a/code/moreutils/news/version_0.62.mdwn b/code/moreutils/news/version_0.62.mdwn
deleted file mode 100644
index a73ed226..00000000
--- a/code/moreutils/news/version_0.62.mdwn
+++ /dev/null
@@ -1,16 +0,0 @@
-moreutils 0.62 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * ts: Add -m option to use monotonic clock.
-     Thanks, Ben Leinweber
-   * ts: Added %.T format like %T but with hi-res.
-     Thanks, Matt Koscica
-   * pee: Ignore SIGPIPE and write errors caused by the command not
-     consuming all its input. Closes: #[697052](http://bugs.debian.org/697052)
-     Thanks, Ole Jørgen Brønner
-   * chronic: document return value semantics of -e option. Closes: #[867167](http://bugs.debian.org/867167)
-     Thanks, Daniel Shahaf
-   * vidir: reword man page to more explicit mention 'file' args.
-     Closes: #[885221](http://bugs.debian.org/885221)
-     Thanks, Daniel Shahaf
-   * pee: Don't buffer input, bringing behavior into line with tee.
-     Thanks, Sauerbeck Tilman"""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.67.mdwn b/code/moreutils/news/version_0.67.mdwn
new file mode 100644
index 00000000..f3386ec3
--- /dev/null
+++ b/code/moreutils/news/version_0.67.mdwn
@@ -0,0 +1,8 @@
+moreutils 0.67 released with [[!toggle text="these changes"]]
+[[!toggleable text="""  * README: Formalize that I am not adding new tools to moreutils,
+    and have not for a long while. This package needs someone new to
+    take over editorial responsibility.
+  * Makefile: Install man pages without executable bit.
+    Thanks, meator
+  * ifne.1: Improve example that pipes to mail to avoid escape
+    sequences."""]]
\ No newline at end of file

moreutils update
diff --git a/code.mdwn b/code.mdwn
index 7952338f..5e10ebe6 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -11,7 +11,6 @@ The stuff that's swapped into my local cache at the moment.
 [[myrepos|mr]]
 [[etckeeper]]
 [[ikiwiki]]
-[[moreutils]]
 [[ikiwiki-hosting]]
 [[shell-monad]]
 [[reactive-banana-automation]]
@@ -24,6 +23,7 @@ The stuff that's swapped into my local cache at the moment.
 
 In maintenance mode mostly, but I still have my hands in it somewhat.
 
+[[moreutils]]
 [[mpdtoys]]
 [[Words2Nums]]
 [[pdmenu]]
diff --git a/code/moreutils.mdwn b/code/moreutils.mdwn
index bb8410e0..dece6601 100644
--- a/code/moreutils.mdwn
+++ b/code/moreutils.mdwn
@@ -1,4 +1,4 @@
-moreutils is a growing collection of the unix tools that nobody thought to
+moreutils is a collection of the unix tools that nobody thought to
 write long ago when unix was young.
 
 It began when I [[blogged|blog/entry/unix_tools_vidir]]:
@@ -74,9 +74,12 @@ The git repository can be cloned from `git://git.joeyh.name/moreutils`
 
 ## Tools under consideration
 
-Here are some that are under consideration but have not yet been included.
-Feel free to suggest others. I also welcome feedback on which of these to
-include.
+This collection is closed at this time for suggestions of
+additional tools to add to it. If you would like to take up editorial
+responsibility for adding tools, as well as take over maintenance of
+moreutils, please contact me.
+
+Here are some that have been suggested but not yet been included:
 
 * dirempty/exists
 

Revert "Added a comment: daylight savings time idiocy"
spam
This reverts commit 202284bc39ffdb065a7dfd79f2010c6db5ed938d.
diff --git a/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment b/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment
deleted file mode 100644
index 2bdc80e8..00000000
--- a/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment
+++ /dev/null
@@ -1,10 +0,0 @@
-[[!comment format=mdwn
- username="xulongbin2020@4bf95255fe4785fa8a17af695bfb34b667ad0fab"
- nickname="xulongbin2020"
- avatar="http://cdn.libravatar.org/avatar/68760e9508af92c9352be6a4e19a8bc5"
- subject="daylight savings time idiocy"
- date="2021-11-22T02:54:58Z"
- content="""
-[Drive](https://tireer.com/) to the street and enjoy the comfortable daylight
-
-"""]]

Added a comment: daylight savings time idiocy
diff --git a/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment b/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment
new file mode 100644
index 00000000..2bdc80e8
--- /dev/null
+++ b/blog/entry/daylight_savings_time_idiocy/comment_1_385745c6afd22be09dc046bf3faf9045._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="xulongbin2020@4bf95255fe4785fa8a17af695bfb34b667ad0fab"
+ nickname="xulongbin2020"
+ avatar="http://cdn.libravatar.org/avatar/68760e9508af92c9352be6a4e19a8bc5"
+ subject="daylight savings time idiocy"
+ date="2021-11-22T02:54:58Z"
+ content="""
+[Drive](https://tireer.com/) to the street and enjoy the comfortable daylight
+
+"""]]

scroll server removed
diff --git a/code/scroll.mdwn b/code/scroll.mdwn
index b95868c0..46f3e3b9 100644
--- a/code/scroll.mdwn
+++ b/code/scroll.mdwn
@@ -10,12 +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 is a demo server!
-
-* US <http://us.scroll.joeyh.name:4242/>
-
 ## build `scroll` from source
 
 [Git repository](https://git.joeyh.name/index.cgi/scroll.git/)

comment
diff --git a/blog/entry/removing_everything_from_github/comment_5_f9052e39da1e68de3f40a5fee439c62a._comment b/blog/entry/removing_everything_from_github/comment_5_f9052e39da1e68de3f40a5fee439c62a._comment
new file mode 100644
index 00000000..654db771
--- /dev/null
+++ b/blog/entry/removing_everything_from_github/comment_5_f9052e39da1e68de3f40a5fee439c62a._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2021-11-04T15:11:06Z"
+ content="""
+I have a copy *somewhere* but I'm sure the TOS has changed in the meantime.
+
+It's Github's problem that they have a TOS that you automatically "accept"
+before you can see it. I am not going to try to help them fix that problem,
+beyond pointing it out.
+"""]]

Added a comment: 404 Link
diff --git a/blog/entry/removing_everything_from_github/comment_4_f5cd88d02f98ac09767218a38b0bcbc9._comment b/blog/entry/removing_everything_from_github/comment_4_f5cd88d02f98ac09767218a38b0bcbc9._comment
new file mode 100644
index 00000000..f6bb24ae
--- /dev/null
+++ b/blog/entry/removing_everything_from_github/comment_4_f5cd88d02f98ac09767218a38b0bcbc9._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="zoobab"
+ avatar="http://cdn.libravatar.org/avatar/013af8141b57ad888fdf41b435406347"
+ subject="404 Link"
+ date="2021-11-03T16:24:19Z"
+ content="""
+The Link to \"See also: PDF of Github TOS that can be read without being forced to first accept Github's TOS\" is giving a 404 error.
+
+Any copy of the document somewhere?
+ 
+"""]]

ugh
diff --git a/todo.mdwn b/todo.mdwn
index fc948287..b769b848 100644
--- a/todo.mdwn
+++ b/todo.mdwn
@@ -6,7 +6,5 @@ bring myself to add "keep todo list up to date" to my todo list.
 * code  
   Will not be tracked here, see TODO files in individual software
   packages.
-* video  
-  Will not be tracked here, thanks to Netflix.
 * life  
   Will not be tracked here, but see my [[blog]]..

add podcasts
diff --git a/links/technical.mdwn b/links/technical.mdwn
index 8a8ecd2e..2948624f 100644
--- a/links/technical.mdwn
+++ b/links/technical.mdwn
@@ -4,6 +4,7 @@
 [[vcshome]]  
 [[offgrid]]  
 [[talks]]  
+[[podcasts]]  
 [[screencasts]]  
 [[rfcs|rfc]]  
 [[boxen]]  
diff --git a/podcasts.mdwn b/podcasts.mdwn
new file mode 100644
index 00000000..d22f2867
--- /dev/null
+++ b/podcasts.mdwn
@@ -0,0 +1,27 @@
+I've guested on some podcasts.
+
+(See also [[talks]].)
+
+## 2021
+
+[CoRecursive](https://corecursive.com/leaving-debian/)
+[mirror](https://downloads.kitenet.net/podcasts/corecursive.mp3)  
+Adam's interview drew me out about leaving Debian but also the old days.
+
+In a way this is a followup to the
+[previous episode](https://corecursive.com/remote-developer/), which interviewed
+Paul Lutris about programming in a cabin in the 70's.
+
+## 2019
+
+[LibreLounge](https://librelounge.org/episodes/episode-14-secure-scuttlebutt-with-joey-hess.html) 
+[mirror](https://downloads.kitenet.net/podcasts/librelounge.mp3)  
+on Secure Scuttlebutt -- I didn't want to talk about a me project,
+and it was good to discuss about a project and community I admire, without
+being personally invested in developing.
+
+## 2013
+
+[GitMinutes](http://episodes.gitminutes.com/2013/07/gitminutes-16-joey-hess-on-git-annex.html)
+[mirror](https://downloads.kitenet.net/podcasts/gitminutes.mp3)  
+on git-annex and related stuff.
diff --git a/talks.mdwn b/talks.mdwn
index ed39dabe..f3c35e5b 100644
--- a/talks.mdwn
+++ b/talks.mdwn
@@ -2,6 +2,8 @@ I've not been good at keeping slides and papers from conference talks that
 I've done online, so this is incomplete, and mostly links to files hosted
 by others.
 
+(See also [[podcasts]].)
+
 ## DebConf 2, Toronto, Canada
 
 [[pics/debconf/2/joey.hess_small.jpg]] 

correct date
diff --git a/talks.mdwn b/talks.mdwn
index aa770a1a..ed39dabe 100644
--- a/talks.mdwn
+++ b/talks.mdwn
@@ -116,7 +116,7 @@ by others.
   - Correction: The other propellor developer in the audience of this talk,
     who I referred to as "Simon", was actually Sean Whitton.
 
-## Libreplanet 2017, MIT
+## Libreplanet 2018, MIT
 
 * "Secure Scuttlebutt lightning talk"
   - [video](https://downloads.kitenet.net/talks/secure-scuttlebutt-lightning-talk-libreplanet.webm)

ocracode
diff --git a/ocracode.mdwn b/ocracode.mdwn
index d690e571..295f06b2 100644
--- a/ocracode.mdwn
+++ b/ocracode.mdwn
@@ -118,3 +118,4 @@ describe your camping trip to Ocracoke.
 * [[2015|ocracode/2015]]
 * [[2016|ocracode/2016]]
 * [[2018|ocracode/2018]]
+* [[2021|ocracode/2021]]
diff --git a/ocracode/2021.mdwn b/ocracode/2021.mdwn
new file mode 100644
index 00000000..0b717b79
--- /dev/null
+++ b/ocracode/2021.mdwn
@@ -0,0 +1,3 @@
+OBX1.1 P1 L74.5 SC7+++++db-c-- U2(solo, no dining tent)
+T0f0b0 R1 Bm+n+b------ F-u-- SC-----s+++++g0
+H-f0i1 V+++++s+++++m1 E++++r+

add news item for moreutils 0.66
diff --git a/code/moreutils/news/version_0.61.mdwn b/code/moreutils/news/version_0.61.mdwn
deleted file mode 100644
index 56e22de2..00000000
--- a/code/moreutils/news/version_0.61.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-moreutils 0.61 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * chronic: Flush output more often to better preserve stdout,err ordering.
-     Thanks, Miroslav Šustek"""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.66.mdwn b/code/moreutils/news/version_0.66.mdwn
new file mode 100644
index 00000000..a9ec2829
--- /dev/null
+++ b/code/moreutils/news/version_0.66.mdwn
@@ -0,0 +1,7 @@
+moreutils 0.66 released with [[!toggle text="these changes"]]
+[[!toggleable text="""  * vipe: When no output is piped into vipe, and stdin is connected to
+    the terminal, don't read from stdin before opening the editor.
+    This allows eg: vipe | command
+    Thanks, Florian Pensec
+  * chronic: With -v, flush stdout after printing "STDERR" header.
+    Thanks, Adam Sjøgren"""]]
\ No newline at end of file

typo
diff --git a/ocracode.mdwn b/ocracode.mdwn
index 4586ea4a..d690e571 100644
--- a/ocracode.mdwn
+++ b/ocracode.mdwn
@@ -116,5 +116,5 @@ describe your camping trip to Ocracoke.
 * [[2011|blog/entry/summer_trips_wrapup]]
 * [[2014|blog/entry/laptop_death]]
 * [[2015|ocracode/2015]]
-* [[2015|ocracode/2016]]
+* [[2016|ocracode/2016]]
 * [[2018|ocracode/2018]]

update
diff --git a/code.mdwn b/code.mdwn
index 372efe68..7952338f 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -6,7 +6,6 @@ occasionally basic websites about my software.
 The stuff that's swapped into my local cache at the moment.
 
 [[git-annex]]
-[[debug-me]]
 [[propellor]]
 [[concurrent-output]]
 [[myrepos|mr]]
@@ -20,8 +19,6 @@ The stuff that's swapped into my local cache at the moment.
 [[fridge0]]
 [[haskell-filepath-bytestring]]
 [[arduino-copilot]]
-[[virtual-hallway-track]]
-[[quarantimer]]
 
 ## Less active projects
 
@@ -40,6 +37,9 @@ In maintenance mode mostly, but I still have my hands in it somewhat.
 [[haskell-libmodbus]]
 [[haskell-git-lfs]]
 [[haskell-mountpoints]]
+[[virtual-hallway-track]]
+[[quarantimer]]
+[[debug-me]]
 
 ## Past projects
 

removed
diff --git a/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment b/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment
deleted file mode 100644
index 193ef017..00000000
--- a/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment
+++ /dev/null
@@ -1,15 +0,0 @@
-[[!comment format=mdwn
- username="how@6dc5c67e7c81beffa3f4cf8697e9d80467201f4d"
- nickname="how"
- avatar="http://cdn.libravatar.org/avatar/2c57c54ce9f3b5cc232815f081263a1a"
- subject="Now there's an alternative: Inventaire.io"
- date="2021-08-19T09:38:39Z"
- content="""
-A couple of free software have been developed since: 
-
-[Inventaire.io](https://inventaire.io) uses WikiData and other sources to create an inventory of books. It's AGPL software. Developers are currently working on ActivityPub federation. Although the software is 7 years old already, it remains quite experimental, with a lot of attention to detail and a slow development pace.
-
-While Inventaire is geared toward publishers, another free software is more inclined to serve the readers: [bookwyrm](https://bookwyrm.social/). Bookwyrm also supports ActivityPub. Both projects are very complementary and I hope they will continue working in a complementary fashion, one towards professionals, the other towards readers and social features. They both have fantastic and welcoming communities.
-
-Inventaire.io has good funding so far but bookwyrm could get some help.
-"""]]

Added a comment: Now there's an alternative: Inventaire.io
diff --git a/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_10_4723d6cc2f64111b491a2972ef7512b5._comment b/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_10_4723d6cc2f64111b491a2972ef7512b5._comment
new file mode 100644
index 00000000..cb565920
--- /dev/null
+++ b/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_10_4723d6cc2f64111b491a2972ef7512b5._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="how@6dc5c67e7c81beffa3f4cf8697e9d80467201f4d"
+ nickname="how"
+ avatar="http://cdn.libravatar.org/avatar/2c57c54ce9f3b5cc232815f081263a1a"
+ subject="Now there's an alternative: Inventaire.io"
+ date="2021-08-19T09:39:05Z"
+ content="""
+A couple of free software have been developed since: 
+
+[Inventaire.io](https://inventaire.io) uses WikiData and other sources to create an inventory of books. It's AGPL software. Developers are currently working on ActivityPub federation. Although the software is 7 years old already, it remains quite experimental, with a lot of attention to detail and a slow development pace.
+
+While Inventaire is geared toward publishers, another free software is more inclined to serve the readers: [bookwyrm](https://bookwyrm.social/). Bookwyrm also supports ActivityPub. Both projects are very complementary and I hope they will continue working in a complementary fashion, one towards professionals, the other towards readers and social features. They both have fantastic and welcoming communities.
+
+Inventaire.io has good funding so far but bookwyrm could get some help.
+"""]]

Added a comment: Now there's an alternative: Inventaire.io
diff --git a/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment b/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment
new file mode 100644
index 00000000..193ef017
--- /dev/null
+++ b/blog/entry/Goodreads_vs_LibraryThing_vs_Free_software/comment_9_c6ba59edecc01c294d628168bcfba6d1._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="how@6dc5c67e7c81beffa3f4cf8697e9d80467201f4d"
+ nickname="how"
+ avatar="http://cdn.libravatar.org/avatar/2c57c54ce9f3b5cc232815f081263a1a"
+ subject="Now there's an alternative: Inventaire.io"
+ date="2021-08-19T09:38:39Z"
+ content="""
+A couple of free software have been developed since: 
+
+[Inventaire.io](https://inventaire.io) uses WikiData and other sources to create an inventory of books. It's AGPL software. Developers are currently working on ActivityPub federation. Although the software is 7 years old already, it remains quite experimental, with a lot of attention to detail and a slow development pace.
+
+While Inventaire is geared toward publishers, another free software is more inclined to serve the readers: [bookwyrm](https://bookwyrm.social/). Bookwyrm also supports ActivityPub. Both projects are very complementary and I hope they will continue working in a complementary fashion, one towards professionals, the other towards readers and social features. They both have fantastic and welcoming communities.
+
+Inventaire.io has good funding so far but bookwyrm could get some help.
+"""]]

diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 1ea644ee..4f9b6561 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -619,6 +619,8 @@ It would be nice to show both stdin and stderr, and distinguish them.  (Otherwis
 
 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'.
 
+It would be helpful for performance testing to have an option to include the current instantaneous CPU load along with the time.  A specific example is for output from make.  Graphing the load average over time would help identify where a long and complex build is failing to parallelize.
+
 ## Suppress sponge warnings for stdout?
 
 I have the following two scripts:

comment
diff --git a/blog/entry/a_bitter_pill_for_Microsoft_Copilot/comment_1_ea49114a1317037ae8909c0ee7a45b59._comment b/blog/entry/a_bitter_pill_for_Microsoft_Copilot/comment_1_ea49114a1317037ae8909c0ee7a45b59._comment
new file mode 100644
index 00000000..e3c6c87c
--- /dev/null
+++ b/blog/entry/a_bitter_pill_for_Microsoft_Copilot/comment_1_ea49114a1317037ae8909c0ee7a45b59._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2021-07-10T16:44:54Z"
+ content="""
+Forgot to mention that extensions can be enabled in the cabal file. Since
+Copilot operates on a per file basis, that will prevent it from realizing
+that an extension is needed by the code it absorbed.
+"""]]

themeing
diff --git a/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
index df2b1e80..f01b8903 100644
--- a/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
+++ b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
@@ -7,7 +7,9 @@ of related languages. A lot of smart people have, just for fun, thought of ways
 to write Haskell programs that do different things depending on the extensions
 that are enabled. (See: [Wait, what language is this?](https://codegolf.stackexchange.com/questions/153744/wait-what-language-is-this))
 
-I've long wished for an AI to put me out of work programming. I always imagined
+I've long wished for an AI to put me out of work programming. Or better,
+that I could collaborate with. Haskell's type checker is the closest I've
+seen to that but it doesn't understand what I want. I always imagined
 I'd support citizenship a full, general AI capable of that. I did not imagine
 that the first real attempt would be the product of a rent optimisation
 corporate AI, that throws all our hard work in a hopper, and deploys enough

tighten
diff --git a/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
index da80edb0..df2b1e80 100644
--- a/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
+++ b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
@@ -3,11 +3,9 @@
 These blackberries are so sweet and just out there in the commons,
 free for the taking. While picking a gallon this morning, I was thinking about
 how neat it is that Haskell is not one programming language, but a vast number
-of related languages, depending on what extensions are enabled.
-
-A lot of smart people have, just for fun, thought of ways to write
-programs that do different things depending on the extensions that are enabled.
-(See: [Wait, what language is this?](https://codegolf.stackexchange.com/questions/153744/wait-what-language-is-this))
+of related languages. A lot of smart people have, just for fun, thought of ways
+to write Haskell programs that do different things depending on the extensions
+that are enabled. (See: [Wait, what language is this?](https://codegolf.stackexchange.com/questions/153744/wait-what-language-is-this))
 
 I've long wished for an AI to put me out of work programming. I always imagined
 I'd support citizenship a full, general AI capable of that. I did not imagine

blog update
diff --git a/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
new file mode 100644
index 00000000..da80edb0
--- /dev/null
+++ b/blog/entry/a_bitter_pill_for_Microsoft_Copilot.mdwn
@@ -0,0 +1,32 @@
+[[!img blog/pics/blackberrypill.jpg]]
+
+These blackberries are so sweet and just out there in the commons,
+free for the taking. While picking a gallon this morning, I was thinking about
+how neat it is that Haskell is not one programming language, but a vast number
+of related languages, depending on what extensions are enabled.
+
+A lot of smart people have, just for fun, thought of ways to write
+programs that do different things depending on the extensions that are enabled.
+(See: [Wait, what language is this?](https://codegolf.stackexchange.com/questions/153744/wait-what-language-is-this))
+
+I've long wished for an AI to put me out of work programming. I always imagined
+I'd support citizenship a full, general AI capable of that. I did not imagine
+that the first real attempt would be the product of a rent optimisation
+corporate AI, that throws all our hard work in a hopper, and deploys enough
+lawyers to muddy the question of whether that violates our copyrights.
+
+Perhaps it's time to think about non-copyright mitigations. Here is an easy
+way, for Haskell developers. Pick an extension and add code that loops
+when it's not enabled. Or when it is enabled. Or when the wrong combination
+of extensions are enabled.
+
+	{-# LANGUAGE NumDecimals #-}
+	
+	main :: IO ()
+	main = if show(1e1) /= "10" then main else do
+
+I will deploy this mitigation in my code
+[where I consider it appropriate](https://git.joeyh.name/index.cgi/haskell-git-lfs.git/commit/?id=881f6eae2dd0dbf8c505556208cc8b95c8529c55).
+I will not be making my code do anything worse than looping, but of course
+this method could be used to make Microsoft Copilot generate code that
+is as problimatic as necessary.
diff --git a/blog/pics/blackberrypill.jpg b/blog/pics/blackberrypill.jpg
new file mode 100644
index 00000000..89f3fd20
Binary files /dev/null and b/blog/pics/blackberrypill.jpg differ

Added a comment: Speeding up process search
diff --git a/blog/entry/typed_pipes_in_every_shell/comment_4_29f2acf6d0b2ec5c8c5432fdabde65f0._comment b/blog/entry/typed_pipes_in_every_shell/comment_4_29f2acf6d0b2ec5c8c5432fdabde65f0._comment
new file mode 100644
index 00000000..425b70c2
--- /dev/null
+++ b/blog/entry/typed_pipes_in_every_shell/comment_4_29f2acf6d0b2ec5c8c5432fdabde65f0._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="matthias@998429660ee544056066fffc14b294681c311c3e"
+ nickname="matthias"
+ avatar="http://cdn.libravatar.org/avatar/a73ad583d743a0d6e67e1f599de18bd3"
+ subject="Speeding up process search"
+ date="2021-06-21T19:32:14Z"
+ content="""
+It'd be very nice if the kernel had /proc/PID/children/ subdirectories. Can't be too difficult to add, it has …/task/ after all.
+"""]]

Added a comment: Speeding up process discovery
diff --git a/blog/entry/typed_pipes_in_every_shell/comment_3_dc632144ca4b16b89bfdd2d1bf8426e7._comment b/blog/entry/typed_pipes_in_every_shell/comment_3_dc632144ca4b16b89bfdd2d1bf8426e7._comment
new file mode 100644
index 00000000..66e52cff
--- /dev/null
+++ b/blog/entry/typed_pipes_in_every_shell/comment_3_dc632144ca4b16b89bfdd2d1bf8426e7._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="eual.jp@2e1d6a677a5714dec466ee99fd08b8ac5c649203"
+ nickname="eual.jp"
+ avatar="http://cdn.libravatar.org/avatar/7cf94c7218b74a36b40b1241e5c6649f"
+ subject="Speeding up process discovery"
+ date="2021-06-17T19:26:19Z"
+ content="""
+> The shell will have started the processes close together in time, so the pids are probably nearby. So look at the previous pid, and the next pid, and fan outward.
+
+The shell will have put all the processes of the pipeline into a single process group, so this can be sped up a bit more by calling getpgid() on a process before examining its fds.
+"""]]

comment
diff --git a/blog/entry/typed_pipes_in_every_shell/comment_2_deb4396438b2554edc60cd5d649601b8._comment b/blog/entry/typed_pipes_in_every_shell/comment_2_deb4396438b2554edc60cd5d649601b8._comment
new file mode 100644
index 00000000..fee4eb95
--- /dev/null
+++ b/blog/entry/typed_pipes_in_every_shell/comment_2_deb4396438b2554edc60cd5d649601b8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2021-06-17T03:50:38Z"
+ content="""
+[Hacker news thread](https://news.ycombinator.com/item?id=27535357)
+with some prior art.
+"""]]

typo
diff --git a/blog/entry/typed_pipes_in_every_shell.mdwn b/blog/entry/typed_pipes_in_every_shell.mdwn
index a00e1cad..b91565be 100644
--- a/blog/entry/typed_pipes_in_every_shell.mdwn
+++ b/blog/entry/typed_pipes_in_every_shell.mdwn
@@ -71,7 +71,7 @@ anywhere, and can be an already existing file, or can be created as needed
 (eg in `/run`). Once it discovers the pid at the other end of a
 pipe, `typed` first looks at `/proc/$pid/cmdline` to see if it's
 also running `typed`. If it is, it looks at its open file handles
-to find the first ".typed" file. It may need to wait for it the file handle
+to find the first ".typed" file. It may need to wait for the file handle
 to get opened, which is why it needs to verify the pid is running `typed`.
 
 There also needs to be a way for `typed` to learn the type of the command

Added a comment: typed pipes in every shell
diff --git a/blog/entry/typed_pipes_in_every_shell/comment_1_4138d2ea085d2e427feb418d2e2dc561._comment b/blog/entry/typed_pipes_in_every_shell/comment_1_4138d2ea085d2e427feb418d2e2dc561._comment
new file mode 100644
index 00000000..1f8ee770
--- /dev/null
+++ b/blog/entry/typed_pipes_in_every_shell/comment_1_4138d2ea085d2e427feb418d2e2dc561._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="pat_h@0f535fd2d30d15c990d56577345d982db4898b50"
+ nickname="pat_h"
+ avatar="http://cdn.libravatar.org/avatar/23a9770617997c6c3fec045860695f4d"
+ subject="typed pipes in every shell "
+ date="2021-06-17T03:13:19Z"
+ content="""
+Wow, this is really clever!
+
+I think the /proc dancing is a strong argument to implement \"typed\" as a shell command (in the shell itself), because otherwise performance will probably drop in shell scripts with a lot of simple calls.
+"""]]

blog update
diff --git a/blog/entry/typed_pipes_in_every_shell.mdwn b/blog/entry/typed_pipes_in_every_shell.mdwn
new file mode 100644
index 00000000..a00e1cad
--- /dev/null
+++ b/blog/entry/typed_pipes_in_every_shell.mdwn
@@ -0,0 +1,105 @@
+Powershell and nushell take unix piping beyond raw streams of text to
+structured or typed data. Is it possible to keep a traditional shell
+like bash and still get typed pipes?
+
+I think it is possible, and I'm now surprised noone seems to have done it
+yet. This is a fairly detailed design for how to do it. I've not
+implemented it yet. RFC.
+
+Let's start with a command called `typed`. You can use it in a pipeline
+like this:
+
+	typed foo | typed bar | typed baz
+
+What `typed` does is discover the types of the commands to its left and its
+right, while communicating the type of the command it runs back to them.
+Then it checks if the types match, and runs the command, communicating the
+type information to it. Pipes are unidirectional, so it may seem hard
+to discover the type to the right, but I'll explain how it can be done
+in a minute.
+
+Now suppose that foo generates json, and bar filters structured data of a
+variety of types, and baz consumes csv and pretty-prints a table. Then bar
+will be informed that its input is supposed to be json, and that its output
+should be csv. If bar didn't support json, `typed foo` and `typed bar`
+would both fail with a type error.
+
+Writing "typed" in front of everything is annoying. But it can be made a
+shell alias like "t". It also possible to wrap programs using `typed`:
+
+	cat >~/bin/foo <<EOF
+	#/usr/bin/typed /usr/bin/foo
+	EOF
+
+Or program could import a library that uses `typed`, so it
+natively supports being used in typed pipelines. I'll explain one way to
+make such a library later on, once some more details are clear.
+
+Which gets us back to a nice simple pipeline, now automatically typed.
+
+	foo | bar | baz
+
+If one of the commands is not actually typed, the other ones in the pipe will
+treat it as having a raw stream of text as input or output.
+Which will sometimes result in a type error (yay, I love type errors!), 
+but in other cases can do something useful.
+
+	find | bar | baz
+	# type error, bar expected json or csv
+	
+	foo | bar | less
+	# less displays csv 
+
+So how does `typed` discover the types of the commands to the left and
+right? That's the hard part. It has to start by finding the pids to its
+left and right. There is no really good way to do that, but on Linux, it
+can be done: Look at what `/proc/self/fd/0` and `/proc/self/fd/1` link to,
+which contains the unique identifiers of the pipes. Then look at other
+processes' `fd/0` and `fd/1` to find matching pipe identifiers. (It's also
+possible to do this on OSX, I believe. I don't know about BSDs.)
+
+Searching through all processes would be a bit expensive (around 15 ms with
+an average number of processes), but there's a nice optimisation: 
+The shell will have started the processes close together in time, so the
+pids are probably nearby. So look at the previous pid, and the next
+pid, and fan outward. Also, check `isatty` to detect the beginning and end
+of the pipeline and avoid scanning all the processes in those cases.
+
+To indicate the type of the command it will run, `typed` simply opens
+a file with an extension of ".typed". The file can be located
+anywhere, and can be an already existing file, or can be created as needed
+(eg in `/run`). Once it discovers the pid at the other end of a
+pipe, `typed` first looks at `/proc/$pid/cmdline` to see if it's
+also running `typed`. If it is, it looks at its open file handles
+to find the first ".typed" file. It may need to wait for it the file handle
+to get opened, which is why it needs to verify the pid is running `typed`.
+
+There also needs to be a way for `typed` to learn the type of the command
+it will run. Reading `/usr/share/typed/$command.typed` is one way.
+Or it can be specified at the command line, which is useful for wrapper scripts:
+
+	cat >~/bin/bar <<EOF
+	#/usr/bin/typed --type="JSON | CSV" --output-type="JSON | CSV" /usr/bin/bar
+	EOF
+
+And `typed` communicates the type information to the command that it runs.
+This way a command like `bar` can know what format its input should be in,
+and what format  to use as output. This might be done with environment
+variables, eg `INPUT_TYPE=JSON` and `OUTPUT_TYPE=CSV`
+
+I think that's everything `typed` needs, except for the syntax of types and
+how the type checking works. Which I should probably not try to think up
+off the cuff. I used Haskell ADT syntax in the example above, but don't
+think that's necessarily the right choice.
+
+Finally, here's how to make a library that lets a program natively support
+being used in a typed pipeline. It's a bit tricky, because it has to run
+`typed`, because `typed` checks `/proc/$pid/cmdline` as detailed above. So,
+check an environment variable. When not set yet, set it, and exec `typed`,
+passing it the path to the program, which it will re-exec. This should
+be done before program does anything else.
+
+----
+
+This work was sponsored by Mark Reidenbach
+[on Patreon](https://patreon.com/joeyh). 

Added a comment: Finding the latest article...
diff --git a/blog/entry/the_end_of_the_olduse.net_exhibit/comment_2_dc1c9160f83de22f97180525e9e9bea4._comment b/blog/entry/the_end_of_the_olduse.net_exhibit/comment_2_dc1c9160f83de22f97180525e9e9bea4._comment
new file mode 100644
index 00000000..84abde24
--- /dev/null
+++ b/blog/entry/the_end_of_the_olduse.net_exhibit/comment_2_dc1c9160f83de22f97180525e9e9bea4._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="julien@0a33f67f99c7d8be390b11e085e13fca36d31275"
+ nickname="julien"
+ avatar="http://cdn.libravatar.org/avatar/1cd73330eac202e2bd7180c54a53a9e7"
+ subject="Finding the latest article..."
+ date="2021-05-30T09:09:47Z"
+ content="""
+    % telnet nntp.olduse.net 119
+    200 Leafnode NNTP Daemon, version 1.11.11 running at kitenet.net (my fqdn: kite.kitenet.net)
+    NEWNEWS
+    500 NEWNEWS is meaningless for this server
+
+Would have been pretty useful though, for clearing your last challenge :-)
+"""]]

Added a comment: All good things come to an end
diff --git a/blog/entry/the_end_of_the_olduse.net_exhibit/comment_1_42a4c2aa3b7a69ae0e5070f07ec6b167._comment b/blog/entry/the_end_of_the_olduse.net_exhibit/comment_1_42a4c2aa3b7a69ae0e5070f07ec6b167._comment
new file mode 100644
index 00000000..d20d3bac
--- /dev/null
+++ b/blog/entry/the_end_of_the_olduse.net_exhibit/comment_1_42a4c2aa3b7a69ae0e5070f07ec6b167._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="julien@0a33f67f99c7d8be390b11e085e13fca36d31275"
+ nickname="julien"
+ avatar="http://cdn.libravatar.org/avatar/1cd73330eac202e2bd7180c54a53a9e7"
+ subject="All good things come to an end"
+ date="2021-05-30T09:04:40Z"
+ content="""
+Many thanks for having run that news server!
+Greatly appreciated.
+Take care of you, and enjoy your future projects :)
+Julien ÉLIE
+"""]]

blog update
diff --git a/blog/entry/the_end_of_the_olduse.net_exhibit.mdwn b/blog/entry/the_end_of_the_olduse.net_exhibit.mdwn
new file mode 100644
index 00000000..6b22d1e0
--- /dev/null
+++ b/blog/entry/the_end_of_the_olduse.net_exhibit.mdwn
@@ -0,0 +1,68 @@
+Ten years ago [[I began|blog/entry/announcing_olduse.net]] 
+the [olduse.net](https://olduse.net/) exhibit,
+spooling out Usenet history in real time with a 30 year delay.
+My archive has reached its end, and ten years is
+more than long enough to keep running something you cobbled together
+overnight way back when. So, this is the end for olduse.net.
+
+The site will continue running for another week or so, to give you time to
+read the last posts. Find the very last one, if you can!
+
+The source code used to run it, and the content of the website have
+themselves been archived up for posterity at 
+[The Internet Archive](https://archive.org/details/olduse.net).
+
+Sometime in 2022, a spammer will purchase the domain, but not find it to be
+of much value.
+
+The Utzoo archives that underlay it have currently sadly
+been [censored off the Internet](https://archive.org/details/utzoo-wiseman-usenet-archive)
+by someone. This will be unsuccessful; by now they have spread and many
+copies will live on.
+
+----
+
+I [[told a lie|blog/entry/announcing_olduse.net]] ten years ago.
+
+> You can post to olduse.net, but it won't show up for at least 30 years.
+
+Actually, those posts drop *right now*! Here are the followups
+to 30-year-old Usenet posts that I've accumulated over the past decade.
+
+Mike replied in 2011 to JPM's post in 1981 on fa.arms-d
+["Re: CBS Reports"](https://olduse.net/replies/14046-1307820987-1)
+
+> A greeting from the future:
+> I actually watched this yesterday (2011-06-10) after reading about it here.
+
+Christian Brandt replied in 2011 to schrieb phyllis's post in 1981 on the "comments" newsgroup
+["Re: thank you rrg"](https://olduse.net/replies/560-1307400023-1)
+
+>  Funny, it will be four years until you post the first subnet post i
+> ever read and another eight years until my own first subnet post shows up.
+
+Bernard Peek replied in 2012 to mark's post in 1982 on net.sf-lovers
+["Re: luke - vader relationship"](https://olduse.net/replies/7680-1353081388-1)
+
+> > i suggest that darth vader is luke skywalker's mother.
+> 
+> You may be on to something there.
+
+Martijn Dekker replied in 2012 to henry's post in 1982 on the "test" newsgroup
+["Re: another boring test message"](https://olduse.net/replies/19312-1335487318-1)
+
+trentbuck replied in 2012 to dwl's post in 1982 on the "net.jokes" newsgroup
+["Re: A child hood poem"](https://olduse.net/replies/24930-1354145783-1)
+
+Eveline replied in 2013 to a post in 1983 on net.jokes.q
+["Re: A couple"](https://olduse.net/replies/18258-1346155593-1)
+
+> Ha!
+
+Bill Leary replied in 2015 to Darin Johnson's post in 1985 on net.games.frp
+["Re: frp & artwork"](https://olduse.net/replies/11119-1424043158-1)
+
+Frederick Smith replied in 2021 to David Hoopes's post in 1990 on trial.rec.metalworking
+["Re: Is this group still active?"](https://olduse.net/replies/4161133-1614850471-1)
+
+[[!tag usenet oldusenet]]
diff --git a/code.mdwn b/code.mdwn
index 3edc653e..372efe68 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -8,7 +8,6 @@ The stuff that's swapped into my local cache at the moment.
 [[git-annex]]
 [[debug-me]]
 [[propellor]]
-[[keysafe]]
 [[concurrent-output]]
 [[myrepos|mr]]
 [[etckeeper]]
@@ -81,6 +80,7 @@ These are dead and buried.
 [[satutils]]
 [[mooix]]
 [[rootsync]]
+[[keysafe]]
 
 ## Misc
 
diff --git a/contact.mdwn b/contact.mdwn
index b8bea0b0..28c38fd0 100644
--- a/contact.mdwn
+++ b/contact.mdwn
@@ -1,6 +1,6 @@
 * email: <id@joeyh.name>
 * gpg key: [[E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7|pubkeys/gpg.asc]]
-* irc: joeyh (irc.oftc.net or irc.freenode.net)
+* irc: joeyh (irc.oftc.net or irc.libera.chat)
 * mastodon: <a href="https://octodon.social/@joeyh">@joeyh@octodon.social</a>
 * scuttlebutt: @BCM6DHYJvWzwWi1lFl2tjDXjaqyZAEmJH5ZONSpXhtc=.ed2551
 * some ways to send me a "thank you" for my work, if you're so inclined: [[thanks]]

update
diff --git a/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment b/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment
index e03ab252..3a181492 100644
--- a/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment
+++ b/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment
@@ -3,5 +3,9 @@
  subject="""comment 2"""
  date="2021-05-13T03:47:18Z"
  content="""
-Fiction no more: <https://www.theguardian.com/us-news/2021/may/12/ohio-coronavirus-vaccine-lottery-1-million>
+Fiction no more: 
+
+<https://www.theguardian.com/us-news/2021/may/12/ohio-coronavirus-vaccine-lottery-1-million>
+
+<https://www.wlwt.com/article/kentucky-lottery-gives-away-up-to-225000-tickets-in-exchange-for-covid-19-vaccine-shots/36389485>
 """]]

comment
diff --git a/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment b/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment
new file mode 100644
index 00000000..e03ab252
--- /dev/null
+++ b/blog/entry/heres_your_shot/comment_2_b6e0caeb3722c57f61e1716da3c139c6._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2021-05-13T03:47:18Z"
+ content="""
+Fiction no more: <https://www.theguardian.com/us-news/2021/may/12/ohio-coronavirus-vaccine-lottery-1-million>
+"""]]

comment
diff --git a/blog/entry/heres_your_shot/comment_1_4205cdae2a8e9266faf499755c0dfef7._comment b/blog/entry/heres_your_shot/comment_1_4205cdae2a8e9266faf499755c0dfef7._comment
new file mode 100644
index 00000000..3db8fbfd
--- /dev/null
+++ b/blog/entry/heres_your_shot/comment_1_4205cdae2a8e9266faf499755c0dfef7._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2021-05-04T23:57:50Z"
+ content="""
+Since some people were confused by this, it's (currently) fiction.
+"""]]

fix number
diff --git a/blog/entry/heres_your_shot.mdwn b/blog/entry/heres_your_shot.mdwn
index 07cbb727..734cf890 100644
--- a/blog/entry/heres_your_shot.mdwn
+++ b/blog/entry/heres_your_shot.mdwn
@@ -7,7 +7,7 @@ Waiting out the 15 minutes in observation, I look at the card.
 
 <pre>
 Moderna COVID-19/22 vaccine booster
-3/21/2025              lot #5829123
+3/21/2025              lot #5829126
 
   🇺🇸 NOT A VACCINE PASSPORT 🇺🇸
 

fix
diff --git a/blog/entry/heres_your_shot.mdwn b/blog/entry/heres_your_shot.mdwn
index fe32fd1d..07cbb727 100644
--- a/blog/entry/heres_your_shot.mdwn
+++ b/blog/entry/heres_your_shot.mdwn
@@ -29,6 +29,4 @@ The message on mine becomes clear: 1 month free Amazon Prime
 
 Ah well.
 
-[[!tag fiction]]
-
 [[!meta title="here's your shot"]]

blog update
diff --git a/blog/entry/heres_your_shot.mdwn b/blog/entry/heres_your_shot.mdwn
new file mode 100644
index 00000000..fe32fd1d
--- /dev/null
+++ b/blog/entry/heres_your_shot.mdwn
@@ -0,0 +1,34 @@
+The nurse releases my shoulder and drops the needle in a sharps bin, slaps
+on a smiley bandaid. "And we're done!"  Her cheeryness seems genuine but a
+little strained. There was a long line. "You're all boosted, and here's
+your vaccine card."
+
+Waiting out the 15 minutes in observation, I look at the card.
+
+<pre>
+Moderna COVID-19/22 vaccine booster
+3/21/2025              lot #5829123
+
+  🇺🇸 NOT A VACCINE PASSPORT 🇺🇸
+
+(Tear at perforated line.)
+- - - - - - - - - - - - - - - - - -
+
+Here's your shot at
+$$ ONE HUNDRED MILLION $$
+
+       Scratch
+       and win
+</pre>
+
+I bite my nails, when I'm not wearing this mask. So I scrub inneffectively
+at the grainy silver box. Not like the woman across from me, three kids in
+tow, who's zipping through her sheaf of scratchers.
+
+The message on mine becomes clear: 1 month free Amazon Prime
+
+Ah well.
+
+[[!tag fiction]]
+
+[[!meta title="here's your shot"]]

poll vote (I haven't tried it, but want to)
diff --git a/code/kaxxt/feedback.mdwn b/code/kaxxt/feedback.mdwn
index 855ebca3..b6af9e61 100644
--- a/code/kaxxt/feedback.mdwn
+++ b/code/kaxxt/feedback.mdwn
@@ -1,4 +1,4 @@
 Whatdayathink? Please vote in the poll, or post your
 experiences/questions to [[/code/Kaxxt/Discussion]].
 
-[[!poll 4 "I tried it, liked it." 0 "I tried it, needs work." 12 "I haven't tried it, but want to" 3 "I don't plan to try it"]]
+[[!poll 4 "I tried it, liked it." 0 "I tried it, needs work." 13 "I haven't tried it, but want to" 3 "I don't plan to try it"]]

suggestion
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index c46ebf60..1ea644ee 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -669,3 +669,25 @@ Now, vipe can *sort of* do this, by using either a here-string (`vipe <<< "" | w
 ## Vipe with arguments for editor commands involving whitespaces
 
 I sometimes want to use vipe while passing arguments to my editor (let’s say `vim +startinsert`).  That’s easy enough, I just need to run it with the EDITOR variable locally set to that.  But if the arguments contain whitespaces (for instance `vim -c 'norm o'`), this trick doesn’t work anymore, because the EDITOR variable is split on whitespaces.  For that purpose, it would be nice to check as a last case after EDITOR and VISUAL whether any arguments have been passed to vipe and, if that is the case, to set `@editor` to `@ARGV`.  We could then do `vipe vim -c 'norm o'` for those cases that require more flexibility. --Vej Kse
+
+## goto
+
+Quoting rum soaked space hobo:
+
+> It is a fun bit of trivia that pre-Bourne shell, as in Ken Thompson's rough
+> hack at a shell, had no flow-control statements built in. It had some basic
+> one-line ternary logic operators I think, but it was extremely limited. So if
+> you wanted to branch somewhere else in your script, you had to shell out to
+> /bin/goto.
+> 
+> Yes, that's right. You forked a subprocess which would run goto and the parent
+> process would resume from the new location.
+> 
+> How, you ask? Well, the subprocess would inherit all file descriptors,
+> including the fd for the script itself. All it needed to do was seek() that;
+> and when it exited, the parent would drop the needle where the subprocess had
+> left it and play the chosen tune.
+
+This could be done without shell support, by the goto command parsing the
+shebang and execing it on /dev/fd/n seeked appropriately.
+(Local variables would be a small problem.) --[[Joey]]

replace url that is dying soon
diff --git a/blog/entry/quarantimer.mdwn b/blog/entry/quarantimer.mdwn
index 8c15cac3..cb53e18b 100644
--- a/blog/entry/quarantimer.mdwn
+++ b/blog/entry/quarantimer.mdwn
@@ -11,7 +11,7 @@ in different stages of quarantine, and I am quickly losing track of how
 long things have been in quarantine. If you have the same problem,
 here is a solution:
 
-<https://quarantimer.app/>
+[[code/quarantimer]]
 
 Open it on your mobile device, and you can take photos of each thing,
 select the kind of surfaces it has, and it will track the quarantine time

spel
diff --git a/code/quarantimer.mdwn b/code/quarantimer.mdwn
index 929ed9c5..b65b45a5 100644
--- a/code/quarantimer.mdwn
+++ b/code/quarantimer.mdwn
@@ -2,7 +2,7 @@ Coronavirus quarantine timer. It was built on a weekend and
 made available during the covid-19 pandemic, from March 23 2020 to March
 15th 2021.
 
-Transmission by formites was eventually found to be uncommon, so
+Transmission by fomites was eventually found to be uncommon, so
 the quarantimer probably didn't accomplish much beyond helping some
 people's peace of mind. In all it was used by 173 people, to track
 401 objects.

code
diff --git a/code/quarantimer.mdwn b/code/quarantimer.mdwn
index e26b2ae9..929ed9c5 100644
--- a/code/quarantimer.mdwn
+++ b/code/quarantimer.mdwn
@@ -7,4 +7,7 @@ the quarantimer probably didn't accomplish much beyond helping some
 people's peace of mind. In all it was used by 173 people, to track
 401 objects.
 
+Implemented in Haskell using the servant webserver, the code
+is available at <https://git.joeyh.name/index.cgi/quarantimer.git/>
+
 [[!img code/quarantimer/screenshot.png]]

update
diff --git a/code/quarantimer.mdwn b/code/quarantimer.mdwn
index a0b9cdd8..e26b2ae9 100644
--- a/code/quarantimer.mdwn
+++ b/code/quarantimer.mdwn
@@ -1,5 +1,10 @@
-Coronavirus quarantine timer
+Coronavirus quarantine timer. It was built on a weekend and 
+made available during the covid-19 pandemic, from March 23 2020 to March
+15th 2021.
 
-<https://quarantimer.app/>
+Transmission by formites was eventually found to be uncommon, so
+the quarantimer probably didn't accomplish much beyond helping some
+people's peace of mind. In all it was used by 173 people, to track
+401 objects.
 
 [[!img code/quarantimer/screenshot.png]]

add news item for mpdtoys 0.26
diff --git a/code/mpdtoys/news/version_0.21.mdwn b/code/mpdtoys/news/version_0.21.mdwn
deleted file mode 100644
index a6a55ee4..00000000
--- a/code/mpdtoys/news/version_0.21.mdwn
+++ /dev/null
@@ -1,5 +0,0 @@
-mpdtoys 0.21 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * mpinsert: Fix another utf-8 encoding problem. Closes: #[549986](http://bugs.debian.org/549986)
-   * mpinsert: Avoid printing uninitialized value warning when
-     it fails to add any songs and -n is used."""]]
\ No newline at end of file
diff --git a/code/mpdtoys/news/version_0.26.mdwn b/code/mpdtoys/news/version_0.26.mdwn
new file mode 100644
index 00000000..534e56c4
--- /dev/null
+++ b/code/mpdtoys/news/version_0.26.mdwn
@@ -0,0 +1,10 @@
+mpdtoys 0.26 released with [[!toggle text="these changes"]]
+[[!toggleable text="""  * Removed the debian directory from the upstream package, added
+    CHANGELOG, LICENSE, and GPL files.
+  * mpload: Deal with volume or potentially other settings not being set
+    when eg, nothing has been played yet, and avoid crashing.
+    Thanks, Tomas Janousek for the patch.
+  * mpstore: Preserve random state when snapshotting.
+    Thanks, Tomas Janousek for the patch.
+  * mplength: Only add times when they are defined
+    Thanks, Ryan Kavanagh for the patch."""]]
\ No newline at end of file

fix link
diff --git a/code/mpdtoys.mdwn b/code/mpdtoys.mdwn
index 5f1326f7..a7323666 100644
--- a/code/mpdtoys.mdwn
+++ b/code/mpdtoys.mdwn
@@ -10,7 +10,7 @@ current song finishes, emulating a skipping record, and editing the
 playlist in a text editor.
 
 The mpdtoys are available in git at `git://git.joeyh.name/mpdtoys`, or
-[in gitweb](http://git.joeyh.name/?p=mpdtoys.git).
+[in gitweb](https://git.joeyh.name/index.cgi/mpdtoys.git).
 
 ## News
 

fix address
diff --git a/contact.mdwn b/contact.mdwn
index 881208e4..b8bea0b0 100644
--- a/contact.mdwn
+++ b/contact.mdwn
@@ -1,6 +1,6 @@
 * email: <id@joeyh.name>
 * gpg key: [[E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7|pubkeys/gpg.asc]]
 * irc: joeyh (irc.oftc.net or irc.freenode.net)
-* mastodon: <a href="https://octodon.social/@joeyh">@joeyh@mastodon.social</a>
+* mastodon: <a href="https://octodon.social/@joeyh">@joeyh@octodon.social</a>
 * scuttlebutt: @BCM6DHYJvWzwWi1lFl2tjDXjaqyZAEmJH5ZONSpXhtc=.ed2551
 * some ways to send me a "thank you" for my work, if you're so inclined: [[thanks]]

add gpg pubkey export
exported with --export-options export-minimal to avoid it being massive
diff --git a/contact.mdwn b/contact.mdwn
index 55f22e7e..881208e4 100644
--- a/contact.mdwn
+++ b/contact.mdwn
@@ -1,5 +1,5 @@
 * email: <id@joeyh.name>
-* gpg key: E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7
+* gpg key: [[E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7|pubkeys/gpg.asc]]
 * irc: joeyh (irc.oftc.net or irc.freenode.net)
 * mastodon: <a href="https://octodon.social/@joeyh">@joeyh@mastodon.social</a>
 * scuttlebutt: @BCM6DHYJvWzwWi1lFl2tjDXjaqyZAEmJH5ZONSpXhtc=.ed2551
diff --git a/pubkeys/gpg.asc b/pubkeys/gpg.asc
new file mode 100644
index 00000000..d1ec79a0
--- /dev/null
+++ b/pubkeys/gpg.asc
@@ -0,0 +1,122 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+DEdm4TZWb69EVME3hOUEUC8S5M9nWsuW
+=7fhP
+-----END PGP PUBLIC KEY BLOCK-----

move
diff --git a/bitcoin b/pubkeys/bitcoin
similarity index 100%
rename from bitcoin
rename to pubkeys/bitcoin
diff --git a/thanks.mdwn b/thanks.mdwn
index c2ac1124..3007baa0 100644
--- a/thanks.mdwn
+++ b/thanks.mdwn
@@ -5,6 +5,6 @@ more tangible options:
 * paypal joey@kitenet.net
 * [support me on Patreon](https://patreon.com/joeyh) or [Liberapay](https://liberapay.com/joeyh/)
 * [My Amazon wishlist](http://www.amazon.com/gp/registry/registry.html/104-5960215-8415137?ie=UTF8&type=wishlist&id=H9MGKNPCYVS2)
-* bitcoin address: <a href="bitcoin:[[!inline raw=yes pages=bitcoin]]">[[!inline raw=yes pages=bitcoin]]</a>  
+* bitcoin address: <a href="bitcoin:[[!inline raw=yes pages=pubkeys/bitcoin]]">[[!inline raw=yes pages=pubkeys/bitcoin]]</a>  
   (Due to the excessive CO2 use of bitcoin transactions, I currently prefer
   not to use bitcoin though.)

remove old unlinked page
diff --git a/shuttleworth-flash-grant.mdwn b/shuttleworth-flash-grant.mdwn
deleted file mode 100644
index db48bd23..00000000
--- a/shuttleworth-flash-grant.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-In November 2015 I received a
-[Flash Grant](https://shuttleworthfoundation.org/flashgrants/)
-from the ShuttleWorth foundation.

fix some links
diff --git a/code/bin.mdwn b/code/bin.mdwn
index d4a64454..3db312a6 100644
--- a/code/bin.mdwn
+++ b/code/bin.mdwn
@@ -10,7 +10,7 @@ and `vipe` from [[moreutils]], or `svnpath`, `debcommit`, `bts`,
 program that grew up in my `bin`. I think there's some useful stuff in
 there still.
 
-You can browse my bin at <http://git.joeyh.name/?p=joey/home.git;a=tree;f=bin>.
+You can browse my bin at <https://git.joeyh.name/index.cgi/joey/home.git/tree/bin>
 
 ## async
 
diff --git a/contact.mdwn b/contact.mdwn
index 0ba240a2..55f22e7e 100644
--- a/contact.mdwn
+++ b/contact.mdwn
@@ -1,5 +1,5 @@
 * email: <id@joeyh.name>
-* gpg key: [E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7](http://pgp.cs.uu.nl/stats/2512E3C7.html)
+* gpg key: E85A 5F63 B31D 24C1 EBF0  D81C C910 D922 2512 E3C7
 * irc: joeyh (irc.oftc.net or irc.freenode.net)
 * mastodon: <a href="https://octodon.social/@joeyh">@joeyh@mastodon.social</a>
 * scuttlebutt: @BCM6DHYJvWzwWi1lFl2tjDXjaqyZAEmJH5ZONSpXhtc=.ed2551

Fix link rot on https://joeyh.name/code/moreutils/
Some of the links on this page had stopped working.
diff --git a/code/moreutils.mdwn b/code/moreutils.mdwn
index f9db7a81..bb8410e0 100644
--- a/code/moreutils.mdwn
+++ b/code/moreutils.mdwn
@@ -112,7 +112,7 @@ include.
 
   Run it once to store a file's hash, and the second time it'll check
   whether the file has changed.
-  <http://blog.steve.org.uk/the_traffic_is_waiting_outside.html>
+  <https://blog.steve.fi/the_traffic_is_waiting_outside.html>
 
 * tmp
 
@@ -170,7 +170,7 @@ include.
 
   adds up numbers from stdin
 
-  Already available in [numutils](http://suso.suso.org/programs/num-utils/).
+  Already available in [numutils](https://suso.suso.org/programs/num-utils/index.phtml).
   RFP bug filed.
 
 * todist
@@ -179,7 +179,7 @@ include.
   and how many time it occurs in the input
   <http://baruch.ev-en.org/files/todist>
 
-  More suitable for [numutils](http://suso.suso.org/programs/num-utils/),
+  More suitable for [numutils](https://suso.suso.org/programs/num-utils/index.phtml),
   which can probably do it already. RFP bug filed.
 
 * tostats
@@ -188,7 +188,7 @@ include.
   numbers: average, stddev, min, max, mid point
   <http://baruch.ev-en.org/files/tostats>
 
-  More suitable for [numutils](http://suso.suso.org/programs/num-utils/),
+  More suitable for [numutils](https://suso.suso.org/programs/num-utils/index.phtml),
   which can probably do it already. RFP bug filed.
 
 * unsort

add news item for moreutils 0.65
diff --git a/code/moreutils/news/version_0.60.mdwn b/code/moreutils/news/version_0.60.mdwn
deleted file mode 100644
index 51cfb602..00000000
--- a/code/moreutils/news/version_0.60.mdwn
+++ /dev/null
@@ -1,16 +0,0 @@
-moreutils 0.60 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * New implementation of isutf8 by Julien Palard.
-     - Noncharacters (ending with 0xFFFF and 0xFFFE) were considered
-       invalid when encoded in utf8, according to the unicode standard
-       they are valid: "However, they are not illegal in interchange, nor
-       does their presence cause Unicode text to be ill-formed."
-     - \xf4\xbf\xbf\xbf was considered valid UTF8, which is not: after
-       0xF4 the following byte should be between 80 and 8F.
-     - This implementation does not try to decode the stream, so it checks
-       it faster.
-     - Add --list option. Closes: #[691330](http://bugs.debian.org/691330)
-   * Support bullding in Cygwin.
-     Thanks, StalkR
-   * OSX build fix.
-     Thanks, Tony Kelman."""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.65.mdwn b/code/moreutils/news/version_0.65.mdwn
new file mode 100644
index 00000000..db3f679e
--- /dev/null
+++ b/code/moreutils/news/version_0.65.mdwn
@@ -0,0 +1,6 @@
+moreutils 0.65 released with [[!toggle text="these changes"]]
+[[!toggleable text="""  * vipe: Added --suffix option.
+    Thanks, Pål Grønås Drange.
+  * ifdata: fail when -ph is given but no hwaddr is available
+    (Closes: #[386755](http://bugs.debian.org/386755))
+    Thanks, Nicolas Schier"""]]
\ No newline at end of file

calendar update
diff --git a/blog/archives/2021.mdwn b/blog/archives/2021.mdwn
new file mode 100644
index 00000000..1eebcc79
--- /dev/null
+++ b/blog/archives/2021.mdwn
@@ -0,0 +1 @@
+[[!calendar type=year year=2021 pages="blog/entry/* and !*/Discussion"]]
diff --git a/blog/archives/2021/01.mdwn b/blog/archives/2021/01.mdwn
new file mode 100644
index 00000000..6048324a
--- /dev/null
+++ b/blog/archives/2021/01.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=01 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(01) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/02.mdwn b/blog/archives/2021/02.mdwn
new file mode 100644
index 00000000..ec2fdf1e
--- /dev/null
+++ b/blog/archives/2021/02.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=02 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(02) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/03.mdwn b/blog/archives/2021/03.mdwn
new file mode 100644
index 00000000..25e578d7
--- /dev/null
+++ b/blog/archives/2021/03.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=03 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(03) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/04.mdwn b/blog/archives/2021/04.mdwn
new file mode 100644
index 00000000..a224c880
--- /dev/null
+++ b/blog/archives/2021/04.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=04 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(04) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/05.mdwn b/blog/archives/2021/05.mdwn
new file mode 100644
index 00000000..99baae74
--- /dev/null
+++ b/blog/archives/2021/05.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=05 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(05) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/06.mdwn b/blog/archives/2021/06.mdwn
new file mode 100644
index 00000000..81c254c9
--- /dev/null
+++ b/blog/archives/2021/06.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=06 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(06) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/07.mdwn b/blog/archives/2021/07.mdwn
new file mode 100644
index 00000000..0d557166
--- /dev/null
+++ b/blog/archives/2021/07.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=07 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(07) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/08.mdwn b/blog/archives/2021/08.mdwn
new file mode 100644
index 00000000..fa5b8913
--- /dev/null
+++ b/blog/archives/2021/08.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=08 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(08) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/09.mdwn b/blog/archives/2021/09.mdwn
new file mode 100644
index 00000000..5e0ec7fb
--- /dev/null
+++ b/blog/archives/2021/09.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=09 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(09) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/10.mdwn b/blog/archives/2021/10.mdwn
new file mode 100644
index 00000000..35cc407f
--- /dev/null
+++ b/blog/archives/2021/10.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=10 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(10) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/11.mdwn b/blog/archives/2021/11.mdwn
new file mode 100644
index 00000000..894e5afa
--- /dev/null
+++ b/blog/archives/2021/11.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=11 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(11) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2021/12.mdwn b/blog/archives/2021/12.mdwn
new file mode 100644
index 00000000..efa6afbd
--- /dev/null
+++ b/blog/archives/2021/12.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=12 year=2021 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(12) and creation_year(2021) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]

Added a comment: possible alternative
diff --git a/blog/entry/Withrawing_github-backup/comment_1_5957ae3181a86f570c4d0ff9411fc911._comment b/blog/entry/Withrawing_github-backup/comment_1_5957ae3181a86f570c4d0ff9411fc911._comment
new file mode 100644
index 00000000..e6cd3d8f
--- /dev/null
+++ b/blog/entry/Withrawing_github-backup/comment_1_5957ae3181a86f570c4d0ff9411fc911._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="joeyh-blog@f6e9305deee9ae4319f63c174bfcff937660ebf1"
+ nickname="joeyh-blog"
+ avatar="http://cdn.libravatar.org/avatar/b1e9724ebb36533ee9b0aaa1e59fa3eb"
+ subject="possible alternative"
+ date="2020-12-30T15:00:44Z"
+ content="""
+I don't think that there is no need to backup content from Github anymore - in contrary, developers are aware that Github can change their policies at any time and if that happens, their content might be gone, so they do make a backup.
+
+Now that you announced github-backup as withdrawn, I can recommend another tool which seems to aim for the same target as yours: [python-github-backup](https://github.com/josegonzalez/python-github-backup). It seems to do the job of backing up the metadata quite nicely.
+
+I use it in conjunction with a more basic approach of cloning/pulling each repository itself like this:
+
+    function doBackup {
+        URL=$1
+        REPO=$(echo $URL | sed -e 's#^.*/##g' -e 's#.git$##')
+        
+        if [ -d $TARGET_REPOS/$REPO ]; then
+            cd $TARGET_REPOS/$REPO
+            git pull --all >/dev/null
+        else
+            echo \"cloning $REPO\"
+            cd $TARGET_REPOS
+            git clone $URL >/dev/null
+        fi
+    }
+    curl -s 'https://api.github.com/users/mathisdt/repos?type=owner&per_page=500' \
+        | grep -Eo '\"git_url\": \"[^\"]+\"' \
+        | sed -e 's#\"git_url\": ##' -e 's#\"##g' \
+        | while read url; do doBackup $url; done
+
+Hope to help!
+
+Mathis Dirksen-Thedens
+"""]]

link to code for backlinks
diff --git a/blog/entry/Withrawing_github-backup.mdwn b/blog/entry/Withrawing_github-backup.mdwn
index 2d01c7e2..e12622d4 100644
--- a/blog/entry/Withrawing_github-backup.mdwn
+++ b/blog/entry/Withrawing_github-backup.mdwn
@@ -1,4 +1,4 @@
-I am no longer maintaining [github-backup](http://github-backup.branchable.com/).
+I am no longer maintaining [[code/github-backup]].
 I'll contine hosting its website and git repo for the time being, but it needs
 a new maintainer if it's going to survive.
 

blog update
diff --git a/blog/entry/Withrawing_github-backup.mdwn b/blog/entry/Withrawing_github-backup.mdwn
new file mode 100644
index 00000000..2d01c7e2
--- /dev/null
+++ b/blog/entry/Withrawing_github-backup.mdwn
@@ -0,0 +1,26 @@
+I am no longer maintaining [github-backup](http://github-backup.branchable.com/).
+I'll contine hosting its website and git repo for the time being, but it needs
+a new maintainer if it's going to survive.
+
+I don't really think it needs to survive. If the farce of youtube-dl being
+removed from github, thus losing access to all its issues and pull
+requests, taught us anything, it's that having that happen does not make
+many people reconsider their dependence on github. (Not even youtube-dl it
+turns out, which is back on there.) Clearly people don't generally
+have any interest in backing that stuff up.
+
+As far as the git repositories on Github, they are getting archived very
+effectively by [softwareheritage.org](https://softwareheritage.org/)
+which vaccumes up all git repositories from Github. Which points to a
+problem, because the same can't be said for git repositories not hosted on
+Github. There's a
+[form to submit them](https://archive.softwareheritage.org/save/)
+but the submissions often get hung up needing manual review, and it doesn't
+seem to pull in new commits actively if at all, based on the few git
+repositories I've had archived there so far.
+
+That seems like something it might be worth building some software to manage.
+But it's also just another case of Github's mass bending reality around it;
+the average Github user doesn't care about this and still gets archived;
+the average self-hosting git user may care about this slightly more, but most
+won't get archived, even if that software did get built.

stopping maintaining github-backup
diff --git a/code.mdwn b/code.mdwn
index ab93e7c5..3edc653e 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -36,7 +36,6 @@ In maintenance mode mostly, but I still have my hands in it somewhat.
 [[brainfuck-monad]]
 [[zxcvbn-c]]
 [[scroll]]
-[[github-backup]]
 [[http-client-restricted]]
 [[scuttlebutt-types]]
 [[haskell-libmodbus]]
@@ -71,6 +70,7 @@ These need new maintainers, stat!
 [[sleepd]]
 [[nslu2-utils]]
 [[ticker]]
+[[github-backup]]
 
 These are dead and buried.
 

correction
diff --git a/offgrid/internet.mdwn b/offgrid/internet.mdwn
index bd27d7c9..870395e5 100644
--- a/offgrid/internet.mdwn
+++ b/offgrid/internet.mdwn
@@ -6,7 +6,7 @@ latency to geosynchronous orbit does not make it easy to carry on a
 conversation.
 
 The real problem with the satellite internet is not the speed, but that
-it's a real power hog. I've measured it somewhere between 30 and 60 watts
+it's a real power hog. It uses 70 to 80 watts 
 depending on what it's doing (transmitting uses more power).
 
 I have so far not been able to power it using direct DC, which I use for

not available on https
diff --git a/offgrid/photovoltaic.mdwn b/offgrid/photovoltaic.mdwn
index 27b0a59b..49ea65fc 100644
--- a/offgrid/photovoltaic.mdwn
+++ b/offgrid/photovoltaic.mdwn
@@ -27,4 +27,4 @@ to run everything.
 Total cost of my PV system was around $3000 in 2017. ($2000 after tax
 rebates.) Lithium upgrade cost that amount again.
 
-[Graphs of my PV data are here](https://house.joeyh.name/).
+[Graphs of my PV data are here](http://house.joeyh.name/).

update
diff --git a/offgrid.mdwn b/offgrid.mdwn
index 3bbd4466..b8566a54 100644
--- a/offgrid.mdwn
+++ b/offgrid.mdwn
@@ -1,5 +1,5 @@
 My house is entirely offgrid and has an unusually small energy footprint,
-with only 1100 watts of solar power and only 4 golf cart batteries.
+with only 1100 watts of solar power and a minimum of batteries.
 
 I got here kind of by accident, see [[my_offgrid_story]].
 
diff --git a/offgrid/fridge.mdwn b/offgrid/fridge.mdwn
index 5c297600..ab5e7421 100644
--- a/offgrid/fridge.mdwn
+++ b/offgrid/fridge.mdwn
@@ -1,5 +1,5 @@
 Since I have a [[photovoltaic]] system with a purposefully
-undersized battery bank, refridgeration was a challenge. I succeeded.
+undersized battery bank, refrigeration was a challenge. I succeeded.
 
 My fridge does not run from battery at all, only when the sun is shining.
 It's computer controlled and quite complex, so for more about how it works,
diff --git a/offgrid/photovoltaic.mdwn b/offgrid/photovoltaic.mdwn
index ee645dfa..27b0a59b 100644
--- a/offgrid/photovoltaic.mdwn
+++ b/offgrid/photovoltaic.mdwn
@@ -12,17 +12,19 @@ IronRidge XR100 rails.
 The charge controller is a Tracer4215BN. A modbus to usb adapter lets the
 house's computer read data from it.
 
-The batteries are 4 golf cart batteries. That's not a lot, it's sized to
-get me through about 12 hours overnight. Since batteries are the part of a
-PV system that wears out and has to be replaced, I want to minimize the
-number I use as much as possible.
+Since batteries are the part of a PV system that wears out and has to be
+replaced, I want to minimize the number I use as much as possible.
+I used 4 golf cart batteries for a number of years. I have now upgraded
+to 2 lithium ion Battleborn batteries, which can store enough power to get
+the house through 3 rainy days without much energy conservation.
 
 The solar panels produce as little as 140 watt-hours on the rainiest days,
-which is a lean day and limits my use of the more power hungry stuff, but
-no problem from time to time. On a typical cloudy day they'll produce
-500+ watt-hours, which is all that I need to run everything.
+so after 3 rainy days, my use of the more power hungry stuff is limited,
+but this is no problem from time to time. On a typical cloudy day 
+the solar panels still produce 500+ watt-hours, which is all that I need
+to run everything.
 
 Total cost of my PV system was around $3000 in 2017. ($2000 after tax
-rebates.)
+rebates.) Lithium upgrade cost that amount again.
 
 [Graphs of my PV data are here](https://house.joeyh.name/).

avoid hotlinking to image that is no longer available, a description is
fine
diff --git a/blog/entry/snowdrift.mdwn b/blog/entry/snowdrift.mdwn
index 78c60aef..48f7f8d1 100644
--- a/blog/entry/snowdrift.mdwn
+++ b/blog/entry/snowdrift.mdwn
@@ -15,10 +15,8 @@ crowdfunding pitch for. That's why I was excited to find
 [Snowdrift.coop](https://snowdrift.coop/), which has a unique approach.
 
 Imagine going to a web page for a free software project that you care
-about, and seeing this button:
-
-<img src="https://snowdrift.coop/static/img/intro/pledge-button-draft.png"
-alt="1283 patrons will donate MORE when you pledge">
+about, and seeing this in a button: 
+"1283 current patrons will donate MORE when you pledge"
 
 That's a lot stronger incentive than some paypal donation button or flattr
 link! The details of how it works are explained on 

stumbled on this.. that's my old apartment!
diff --git a/pics/linuxworld/1/fearknghtbrd3.jpg b/pics/linuxworld/1/fearknghtbrd3.jpg
new file mode 100644
index 00000000..5940406c
Binary files /dev/null and b/pics/linuxworld/1/fearknghtbrd3.jpg differ

Improvement suggestion for vipe (arguments with whitespaces)
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index 1785edfc..c46ebf60 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -665,3 +665,7 @@ More often, I might want to do something like this:
     vipe | datamash sum 1
 
 Now, vipe can *sort of* do this, by using either a here-string (`vipe <<< "" | wc -c`) or by pressing Ctrl-D as soon as vipe launches. I wondered if we could just skip the Ctrl-D step and have vipe detect when no stdin has been given to it; instead, jump straight into an empty vim document? - TR
+
+## Vipe with arguments for editor commands involving whitespaces
+
+I sometimes want to use vipe while passing arguments to my editor (let’s say `vim +startinsert`).  That’s easy enough, I just need to run it with the EDITOR variable locally set to that.  But if the arguments contain whitespaces (for instance `vim -c 'norm o'`), this trick doesn’t work anymore, because the EDITOR variable is split on whitespaces.  For that purpose, it would be nice to check as a last case after EDITOR and VISUAL whether any arguments have been passed to vipe and, if that is the case, to set `@editor` to `@ARGV`.  We could then do `vipe vim -c 'norm o'` for those cases that require more flexibility. --Vej Kse