From 36227f09dd96ee54e13f581f2286e6594d8c2136 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 8 Feb 2026 22:39:32 +0200 Subject: Update content for html --- ...010-05-07-lazy-evaluation-with-standard-ml.html | 123 +++++++++++++++++++++ ...010-05-07-lazy-evaluation-with-standarn-ml.html | 123 --------------------- .../2022-05-27-perl-is-still-a-great-choice.html | 2 +- gemfeed/2022-09-30-after-a-bad-nights-sleep.html | 4 +- ...-03-16-the-pragmatic-programmer-book-notes.html | 2 +- ...03-25-gemtexter-2.0.0-lets-gemtext-again-2.html | 2 +- ...4-01-never-split-the-difference-book-notes.html | 2 +- ...3-05-06-the-obstacle-is-the-way-book-notes.html | 2 +- ...17-career-guide-and-soft-skills-book-notes.html | 26 ++--- gemfeed/2023-11-11-mind-management-book-notes.html | 2 +- .../2024-05-01-slow-productivity-book-notes.html | 2 +- ...2024-06-23-terminal-multiplexing-with-tmux.html | 8 +- .../2024-07-07-the-stoic-challenge-book-notes.html | 2 +- gemfeed/2024-10-24-staff-engineer-book-notes.html | 2 +- ...5-04-05-f3s-kubernetes-with-freebsd-part-4.html | 18 +-- gemfeed/2025-04-19-when-book-notes.html | 2 +- ...6-07-a-monks-guide-to-happiness-book-notes.html | 2 +- ...5-07-14-f3s-kubernetes-with-freebsd-part-6.html | 8 +- ...1-02-the-courage-to-be-disliked-book-notes.html | 2 +- ...tmux-popup-editor-for-cursor-agent-prompts.html | 2 +- gemfeed/atom.xml | 56 +++++----- gemfeed/index.html | 4 +- 22 files changed, 198 insertions(+), 198 deletions(-) create mode 100644 gemfeed/2010-05-07-lazy-evaluation-with-standard-ml.html delete mode 100644 gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html (limited to 'gemfeed') diff --git a/gemfeed/2010-05-07-lazy-evaluation-with-standard-ml.html b/gemfeed/2010-05-07-lazy-evaluation-with-standard-ml.html new file mode 100644 index 00000000..641d8c0c --- /dev/null +++ b/gemfeed/2010-05-07-lazy-evaluation-with-standard-ml.html @@ -0,0 +1,123 @@ + + + + +Lazy Evaluation with Standard ML + + + + + +

+Home | Markdown | Gemini +

+

Lazy Evaluation with Standard ML


+
+Published at 2010-05-07T08:17:59+01:00
+
+
+      _____|~~\_____      _____________
+  _-~               \    |    \
+  _-    | )     \    |__/   \   \
+  _-         )   |   |  |     \  \
+  _-    | )     /    |--|      |  |
+ __-_______________ /__/_______|  |_________
+(                |----         |  |
+ `---------------'--\\\\      .`--'          -Glyde-
+                              `||||
+
+
+In contrast to Haskell, Standard SML does not use lazy evaluation by default but an eager evaluation.
+
+https://en.wikipedia.org/wiki/Eager_evaluation
+https://en.wikipedia.org/wiki/Lazy_evaluation
+
+
+You can solve specific problems with lazy evaluation easier than with eager evaluation. For example, you might want to list the number Pi or another infinite list of something. With the help of lazy evaluation, each element of the list is calculated when it is accessed first, but not earlier.
+
+

Emulating lazy evaluation in SML


+
+However, it is possible to emulate lazy evaluation in most eager evaluation languages. This is how it is done with Standard ML (with some play with an infinite list of natural number tuples filtering out 0 elements):
+
+
+type ’a lazy = unit -> ’a;
+
+fun force (f:’a lazy) = f ();
+fun delay x = (fn () => x) : ’a lazy;
+
+datatype ’a sequ = NIL | CONS of ’a * ’a sequ lazy;
+
+fun first 0 s = []
+  | first n NIL = []
+  | first n (CONS (i,r)) = i :: first (n-1) (force r);
+
+fun filters p NIL = NIL
+  | filters p (CONS (x,r)) =
+      if p x
+          then CONS (x, fn () => filters p (force r))
+      else
+          filters p (force r);
+
+fun nat_pairs () =
+    let
+        fun from_pair (x,0) =
+              CONS ((x,0), fn () => from_pair (0,x+1))
+          | from_pair (up,dn) =
+              CONS ((up,dn), fn () => from_pair (up+1,dn-1))
+        in from_pair (0,0)
+    end;
+
+(* Test
+val test = first 10 (nat_pairs ())
+*)
+
+fun nat_pairs_not_null () =
+    filters (fn (x,y) => x > 0 andalso y > 0) (nat_pairs ());
+
+(* Test
+val test = first 10 (nat_pairs_not_null ());
+*)
+
+
+http://smlnj.org/
+
+

Real laziness with Haskell


+
+As Haskell already uses lazy evaluation by default, there is no need to construct a new data type. Lists in Haskell are lazy by default. You will notice that the code is also much shorter and easier to understand than the SML version.
+
+
+{- Just to make it look like the ML example -}
+first = take
+filters = filter
+
+{- Implementation -}
+nat_pairs = from_pair 0 0
+    where
+        from_pair x 0 = [x,0] : from_pair 0 (x+1)
+        from_pair up dn = [up,dn] : from_pair (up+1) (dn-1)
+
+{- Test:
+first 10 nat_pairs
+-}
+
+nat_pairs_not_null = filters (\[x,y] -> x > 0 && y > 0) nat_pairs
+
+{- Test:
+first 10 nat_pairs_not_null
+-}
+
+
+http://www.haskell.org/
+
+E-Mail your comments to paul@nospam.buetow.org :-)
+
+Back to the main site
+ + + diff --git a/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html b/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html deleted file mode 100644 index c525ed7f..00000000 --- a/gemfeed/2010-05-07-lazy-evaluation-with-standarn-ml.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - -Lazy Evaluation with Standard ML - - - - - -

-Home | Markdown | Gemini -

-

Lazy Evaluation with Standard ML


-
-Published at 2010-05-07T08:17:59+01:00
-
-
-      _____|~~\_____      _____________
-  _-~               \    |    \
-  _-    | )     \    |__/   \   \
-  _-         )   |   |  |     \  \
-  _-    | )     /    |--|      |  |
- __-_______________ /__/_______|  |_________
-(                |----         |  |
- `---------------'--\\\\      .`--'          -Glyde-
-                              `||||
-
-
-In contrast to Haskell, Standard SML does not use lazy evaluation by default but an eager evaluation.
-
-https://en.wikipedia.org/wiki/Eager_evaluation
-https://en.wikipedia.org/wiki/Lazy_evaluation
-
-
-You can solve specific problems with lazy evaluation easier than with eager evaluation. For example, you might want to list the number Pi or another infinite list of something. With the help of lazy evaluation, each element of the list is calculated when it is accessed first, but not earlier.
-
-

Emulating lazy evaluation in SML


-
-However, it is possible to emulate lazy evaluation in most eager evaluation languages. This is how it is done with Standard ML (with some play with an infinite list of natural number tuples filtering out 0 elements):
-
-
-type ’a lazy = unit -> ’a;
-
-fun force (f:’a lazy) = f ();
-fun delay x = (fn () => x) : ’a lazy;
-
-datatype ’a sequ = NIL | CONS of ’a * ’a sequ lazy;
-
-fun first 0 s = []
-  | first n NIL = []
-  | first n (CONS (i,r)) = i :: first (n-1) (force r);
-
-fun filters p NIL = NIL
-  | filters p (CONS (x,r)) =
-      if p x
-          then CONS (x, fn () => filters p (force r))
-      else
-          filters p (force r);
-
-fun nat_pairs () =
-    let
-        fun from_pair (x,0) =
-              CONS ((x,0), fn () => from_pair (0,x+1))
-          | from_pair (up,dn) =
-              CONS ((up,dn), fn () => from_pair (up+1,dn-1))
-        in from_pair (0,0)
-    end;
-
-(* Test
-val test = first 10 (nat_pairs ())
-*)
-
-fun nat_pairs_not_null () =
-    filters (fn (x,y) => x > 0 andalso y > 0) (nat_pairs ());
-
-(* Test
-val test = first 10 (nat_pairs_not_null ());
-*)
-
-
-http://smlnj.org/
-
-

Real laziness with Haskell


-
-As Haskell already uses lazy evaluation by default, there is no need to construct a new data type. Lists in Haskell are lazy by default. You will notice that the code is also much shorter and easier to understand than the SML version.
-
-
-{- Just to make it look like the ML example -}
-first = take
-filters = filter
-
-{- Implementation -}
-nat_pairs = from_pair 0 0
-    where
-        from_pair x 0 = [x,0] : from_pair 0 (x+1)
-        from_pair up dn = [up,dn] : from_pair (up+1) (dn-1)
-
-{- Test:
-first 10 nat_pairs
--}
-
-nat_pairs_not_null = filters (\[x,y] -> x > 0 && y > 0) nat_pairs
-
-{- Test:
-first 10 nat_pairs_not_null
--}
-
-
-http://www.haskell.org/
-
-E-Mail your comments to paul@nospam.buetow.org :-)
-
-Back to the main site
- - - diff --git a/gemfeed/2022-05-27-perl-is-still-a-great-choice.html b/gemfeed/2022-05-27-perl-is-still-a-great-choice.html index 2172314b..cd17d661 100644 --- a/gemfeed/2022-05-27-perl-is-still-a-great-choice.html +++ b/gemfeed/2022-05-27-perl-is-still-a-great-choice.html @@ -130,7 +130,7 @@ Here are some reasons why not to chose Perl and look for "better" alternatives:


Introduction



-In the previous posts, we set up a WireGuard mesh network. In the future, we will also setting up a Kubernetes cluster. Kubernetes workloads often require persistent storage for databases, configuration files, and application data. Local storage on each node has significant limitations:
+In the previous posts, we set up a WireGuard mesh network. In the future, we will also set up a Kubernetes cluster. Kubernetes workloads often require persistent storage for databases, configuration files, and application data. Local storage on each node has significant limitations:


-The FreeBSD VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases, hows zrepl's flexibility in handling different datasets with varying replication needs.
+The FreeBSD VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases how zrepl's flexibility in handling different datasets with varying replication needs.

Furthermore:


Configuring zrepl on f1 (sink)



diff --git a/gemfeed/2025-11-02-the-courage-to-be-disliked-book-notes.html b/gemfeed/2025-11-02-the-courage-to-be-disliked-book-notes.html index 294f2fdf..9a616fa8 100644 --- a/gemfeed/2025-11-02-the-courage-to-be-disliked-book-notes.html +++ b/gemfeed/2025-11-02-the-courage-to-be-disliked-book-notes.html @@ -141,7 +141,7 @@ 2024-07-07 "The Stoic Challenge" book notes
2024-05-01 "Slow Productivity" book notes
2023-11-11 "Mind Management" book notes
-2023-07-17 "Software Developmers Career Guide and Soft Skills" book notes
+2023-07-17 "Software Developers Career Guide and Soft Skills" book notes
2023-05-06 "The Obstacle is the Way" book notes
2023-04-01 "Never split the difference" book notes
2023-03-16 "The Pragmatic Programmer" book notes
diff --git a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html index e525a93d..42199650 100644 --- a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html +++ b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html @@ -92,7 +92,7 @@ bind-key e run-shell -b "tmux display-message -p '#{pane_id}'
Prefilled prompt text

-And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with proper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.

Update 2026-02-08: This functionality has been integrated into the hexai project (https://codeberg.org/snonux/hexai) with proper multi-agent support for Cursor Agent, Claude Code CLI, and Ampcode. The hexai version includes unit tests, configuration files, and better agent detection. While still experimental, it's more robust than this shell script. See the hexai-tmux-edit command for details.

diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index c3a52b63..e3b7b285 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,6 +1,6 @@ - 2026-02-08T18:17:43+02:00 + 2026-02-08T22:37:47+02:00 foo.zone feed To be in the .zone! @@ -99,7 +99,7 @@ bind-key e run-shell -b "tmux display-message -p '#{pane_id}'
Prefilled prompt text

-And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with proper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.

Update 2026-02-08: This functionality has been integrated into the hexai project (https://codeberg.org/snonux/hexai) with proper multi-agent support for Cursor Agent, Claude Code CLI, and Ampcode. The hexai version includes unit tests, configuration files, and better agent detection. While still experimental, it's more robust than this shell script. See the hexai-tmux-edit command for details.

@@ -3614,7 +3614,7 @@ spec: 2024-07-07 "The Stoic Challenge" book notes
2024-05-01 "Slow Productivity" book notes
2023-11-11 "Mind Management" book notes
-2023-07-17 "Software Developmers Career Guide and Soft Skills" book notes
+2023-07-17 "Software Developers Career Guide and Soft Skills" book notes
2023-05-06 "The Obstacle is the Way" book notes
2023-04-01 "Never split the difference" book notes
2023-03-16 "The Pragmatic Programmer" book notes
@@ -7126,7 +7126,7 @@ content = "{CODE}" f3s: Kubernetes with FreeBSD - Part 6: Storage https://foo.zone/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.html - 2025-07-13T16:44:29+03:00, last updated: 27.01.2026 + 2025-07-13T16:44:29+03:00, last updated Tue 27 Jan 10:09:08 EET 2026 Paul Buetow aka snonux paul@dev.buetow.org @@ -7136,7 +7136,7 @@ content = "{CODE}"

f3s: Kubernetes with FreeBSD - Part 6: Storage



-Published at 2025-07-13T16:44:29+03:00, last updated: 27.01.2026
+Published at 2025-07-13T16:44:29+03:00, last updated Tue 27 Jan 10:09:08 EET 2026

This is the sixth blog post about the f3s series for self-hosting demands in a home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution used on FreeBSD-based physical machines.

@@ -7209,7 +7209,7 @@ content = "{CODE}"

Introduction



-In the previous posts, we set up a WireGuard mesh network. In the future, we will also setting up a Kubernetes cluster. Kubernetes workloads often require persistent storage for databases, configuration files, and application data. Local storage on each node has significant limitations:
+In the previous posts, we set up a WireGuard mesh network. In the future, we will also set up a Kubernetes cluster. Kubernetes workloads often require persistent storage for databases, configuration files, and application data. Local storage on each node has significant limitations:

  • No data sharing: Pods (once we run Kubernetes) on different nodes can't access the same data
  • @@ -7623,13 +7623,13 @@ EOF
  • f0_to_f1_nfsdata: Replicates NFS data every minute for faster failover recovery
  • f0_to_f1_freebsd: Replicates FreeBSD VM every ten minutes (less critical)

-The FreeBSD VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases, hows zrepl's flexibility in handling different datasets with varying replication needs.
+The FreeBSD VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases how zrepl's flexibility in handling different datasets with varying replication needs.

Furthermore:

  • We're specifically replicating zdata/enc/nfsdata instead of the entire zdata/enc dataset. This dedicated dataset will contain all the data we later want to expose via NFS, keeping a clear separation between replicated NFS data and other local encrypted data.
  • -
  • The send: encrypted: false option turns off ZFS native encryption for the replication stream. Since we're using a WireGuard tunnel between f0 and f1, the data is already encrypted in transit. Disabling ZFS stream encryption reduces CPU overhead and improves replication performance.
  • +
  • We use send: encrypted: true to keep the replication stream encrypted. While WireGuard already encrypts in transit, this provides additional protection. For reduced CPU overhead, you could set encrypted: false since the tunnel is secure.

Configuring zrepl on f1 (sink)



@@ -10303,7 +10303,7 @@ http://www.gnu.org/software/src-highlite --> 2024-07-07 "The Stoic Challenge" book notes
2024-05-01 "Slow Productivity" book notes
2023-11-11 "Mind Management" book notes
-2023-07-17 "Software Developmers Career Guide and Soft Skills" book notes
+2023-07-17 "Software Developers Career Guide and Soft Skills" book notes
2023-05-06 "The Obstacle is the Way" book notes
2023-04-01 "Never split the difference" book notes