blog

My blog.

Home

Source code

git clone https://projects.rickardlindberg.me/scm/blog.git

Website

https://blog.rickardlindberg.me

Recent events

2025-09-04 06:20 Rickard pushed to blog

commit 418bdaa2c2fa8b0ce4f57536d9ae30549847564c
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Aug 9 16:32:32 2025 +0200

    Remove spotify extra, unnecessary args.

diff --git a/posts/2025/07/07/newsletter-july/post.md b/posts/2025/07/07/newsletter-july/post.md
index c0df564..1089aca 100644
--- a/posts/2025/07/07/newsletter-july/post.md
+++ b/posts/2025/07/07/newsletter-july/post.md
@@ -30,5 +30,5 @@ in a reasonable amount of time. Brute force, tree searches seem to take too
 long. That was a bit disappointing, but I still had fun programming.
 
 If you are a fan of thrash metal, I can highly recommend my new favourite band
-[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ?si=9SbN6FGIQKOuktq85Tt1eg&nd=1&dlsi=787ef799b4324a28).
+[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ).
 Sooo good.

2025-08-09 16:26 Rickard pushed to blog

commit 1b544804a1e3c4f1efbf8f17063bd98175395399
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat Aug 9 16:26:15 2025 +0200

    Newsletter July 2025.

diff --git a/posts/2025/07/07/newsletter-july/post.md b/posts/2025/07/07/newsletter-july/post.md
new file mode 100644
index 0000000..c0df564
--- /dev/null
+++ b/posts/2025/07/07/newsletter-july/post.md
@@ -0,0 +1,34 @@
+---
+date: 2025-08-09 16:09:00
+title: Newsletter July 2025: Leisure programming
+tags: newsletter
+---
+
+This month I did some work on
+[Timeline](https://projects.rickardlindberg.me/timeline/). Since we moved part
+of the development over to [my own code hosting
+platform](https://projects.rickardlindberg.me/) we lost the ability to build
+the Windows installer. That had to be done manually on a Windows PC. I don't
+like manual and I don't own a Windows PC, so this month I experimented with
+building the Windows installer on
+Linux/[Wine](https://en.wikipedia.org/wiki/Wine_(software)). To my slight
+surprise, I think I got it working. We'll see if we get any error reports after
+the next release.
+
+While I spent some time improving the infrastructure for Timeline, I also fixed
+some minor issues and did some cleanup in the codebase. I was reminded that I
+enjoy programming. It doesn't have to be a new, shiny project that has hundreds
+of satisfied customers. I simply enjoy the craft of programming.
+
+This month I also played many rounds of
+[Solitaire](https://en.wikipedia.org/wiki/Klondike_(solitaire)). Mainly to relax
+with something that doesn't involve a screen. That triggered me to write a
+program that figures out if a given hand is solvable or not. Again I had fun
+programming this thing and finding good ways to represent cards and the rules
+of solitaire. However, I think it turned out that the problem is not solvable
+in a reasonable amount of time. Brute force, tree searches seem to take too
+long. That was a bit disappointing, but I still had fun programming.
+
+If you are a fan of thrash metal, I can highly recommend my new favourite band
+[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ?si=9SbN6FGIQKOuktq85Tt1eg&nd=1&dlsi=787ef799b4324a28).
+Sooo good.

2025-07-07 09:08 Rickard pushed to blog

commit e222ec25134d69f05300d7e04bab67f24ba9a3f2
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Mon Jul 7 09:07:00 2025 +0200

    Newsletter june 2025.

diff --git a/bib/simplepeter.md b/bib/simplepeter.md
new file mode 100644
index 0000000..fd51a1f
--- /dev/null
+++ b/bib/simplepeter.md
@@ -0,0 +1,6 @@
+---
+date: 2025-07-07 08:27:00
+title: Why Can't We Make Simple Software? - Peter van Hardenberg
+type: youtube
+link: https://youtu.be/czzAVuVz7u4
+---
diff --git a/posts/2025/07/07/newsletter-june/post.md b/posts/2025/07/07/newsletter-june/post.md
new file mode 100644
index 0000000..b4e771e
--- /dev/null
+++ b/posts/2025/07/07/newsletter-june/post.md
@@ -0,0 +1,19 @@
+---
+date: 2025-07-07 08:15:48
+title: Newsletter June 2025: Ink & Switch
+tags: newsletter
+---
+
+This month I watched the presentation [](bib:simplepeter). This introduced me
+to [Ink & Switch](https://www.inkandswitch.com):
+
+> An independent research lab exploring the future of tools for thought.
+>
+> We envision a new computer that amplifies human intelligence.
+
+This caught my interest because they mention [Doug
+Engelbart](https://en.wikipedia.org/wiki/Douglas_Engelbart) which I learned
+about from [Alan
+Kay](https://archive.rickardlindberg.me/writing/alan-kay-notes/). I have been
+inspired by Kay's work and perhaps Ink & Switch is doing work in the same vein
+that is worth keeping and eye on.

2025-06-01 08:22 Rickard pushed to blog

commit 47ea02ad8d656a26c2f70574ea8239a9fef772c9
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sun Jun 1 08:22:13 2025 +0200

    New post.

diff --git a/bib/kaylacked.md b/bib/kaylacked.md
new file mode 100644
index 0000000..624806d
--- /dev/null
+++ b/bib/kaylacked.md
@@ -0,0 +1,6 @@
+---
+date: 2025-05-31 10:25:00
+title: The little editor that could
+type: youtube
+link: https://youtu.be/GoyNMFccbow
+---
diff --git a/bib/lex467sweeny.md b/bib/lex467sweeny.md
new file mode 100644
index 0000000..d8388ef
--- /dev/null
+++ b/bib/lex467sweeny.md
@@ -0,0 +1,6 @@
+---
+date: 2025-05-31 10:27:00
+title: Tim Sweeney: Fortnite, Unreal Engine, and the Future of Gaming | Lex Fridman Podcast #467
+type: youtube
+link: https://youtu.be/477qF6QNSvc
+---
diff --git a/posts/2025/05/30/newsletter-may/post.md b/posts/2025/05/30/newsletter-may/post.md
new file mode 100644
index 0000000..16d69ed
--- /dev/null
+++ b/posts/2025/05/30/newsletter-may/post.md
@@ -0,0 +1,27 @@
+---
+date: 2025-06-01 08:21:00
+title: Newsletter May 2025: Podcasts and a new Blog
+tags: newsletter
+---
+
+This month I consumed some podcasts and Youtube videos related to programming.
+Here are my favourites:
+
+* Listening to [](bib:lex467sweeny) made me want to get into 3D graphics
+  programming. One project I have in mind, that I have thought about before, is
+  building a ray tracer.
+
+* I found the history lesson of the UNIX editor `ed` in [](bib:kaylacked)
+  interesting.
+
+* I got inspired when listening to [](bib:lex309carmack). Carmack has been part
+  of creating some amazing things with the use of programming. It inspired me
+  to do the same.
+
+* I listened to [](bib:lex48bjarne) because I enjoyed a previous Lex podcast,
+  and I needed something to entertain me during a long drive. C++ is a language
+  that I have actively avoided. After this podcast, I appreciate it a bit more.
+
+I also started working on a new blog. You can browse my posts/notes for this
+month at
+[blog.rickardlindberg.me/2025/05](https://blog.rickardlindberg.me/2025/05/).

2025-05-31 11:31 Rickard pushed to blog

commit 4b06edb6f318077d6ddaea34bc43845fe4e9d0a6
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 11:30:42 2025 +0200

    New post.

diff --git a/posts/2025/05/31/classes-as-a-bunch-of-independent-vms/post.md b/posts/2025/05/31/classes-as-a-bunch-of-independent-vms/post.md
new file mode 100644
index 0000000..1be80b0
--- /dev/null
+++ b/posts/2025/05/31/classes-as-a-bunch-of-independent-vms/post.md
@@ -0,0 +1,17 @@
+---
+date: 2025-05-31 11:22:08
+title: Classes as a Bunch of Independed VMs
+tags:
+---
+
+I want to explore what and object-oriented programming system looks like where
+each object is represented as a VM running on the host hardware.
+
+VMs should be independent of each other so that they can't crash each other.
+
+VMs should also be specialized for the work of the class/object. You will have
+different compilers for different types of classes/objects that compile those
+to VMs specialized in solving those problem.
+
+I'm not sure what the point of this would be. Other than exploring ideas that I
+think are interesting.

2025-05-31 11:18 Rickard pushed to blog

commit 1dabf21602346b1fb29f7db4a2f1670861d6794e
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 11:18:31 2025 +0200

    New post.

diff --git a/bib/lex309carmack.md b/bib/lex309carmack.md
new file mode 100644
index 0000000..aa84ee2
--- /dev/null
+++ b/bib/lex309carmack.md
@@ -0,0 +1,6 @@
+---
+date: 2025-05-31 10:27:00
+title: John Carmack: Doom, Quake, VR, AGI, Programming, Video Games, and Rockets | Lex Fridman Podcast #309 
+type: youtube
+link: https://youtu.be/I845O57ZSy4
+---
diff --git a/posts/2025/05/31/how-to-make-programs-come-alive/post.md b/posts/2025/05/31/how-to-make-programs-come-alive/post.md
new file mode 100644
index 0000000..9b4f74b
--- /dev/null
+++ b/posts/2025/05/31/how-to-make-programs-come-alive/post.md
@@ -0,0 +1,22 @@
+---
+date: 2025-05-31 10:45:52
+title: How to Make Programs Come Alive?
+tags:
+---
+
+In [](bib:lex309carmack), Carmack explains how he likes to run his programs
+through a debugger so that he can see what is going on.
+
+It was a very long time since I used a debugger. I find that they are not
+really needed and argue that unit testing decreases the need for a debugger.
+
+However, I think both debugging and unit testing are ways of making programs
+come alive. Instead of "blindly manipulating symbols", as Bret Victor puts it,
+you run the program with some input and observe that it does the right thing.
+
+Bret Victor has talked about how to make programming better than just blindly
+manipulating symbols. Alan Kay has talked about how CAD software has ways of
+simulating your models to ensure their correctness and asked why there is no
+equivalent in the software world.
+
+These topics interest me, and I want to study them more.

2025-05-31 10:04 Rickard pushed to blog

commit 9e7b0adfea7ce85c46111680e2580309932af19f
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 10:04:36 2025 +0200

    Summaries.

diff --git a/blog.py b/blog.py
index f73a15e..8dd47b9 100755
--- a/blog.py
+++ b/blog.py
@@ -104,12 +104,17 @@ class Index:
                 key=lambda post: post.date.date,
                 reverse=True,
             ):
+                if self.description.summary_number_of_words:
+                    summary = " " + post.body_summary(self.description.summary_number_of_words)
+                else:
+                    summary = ""
                 html_path = post.html_path(start=os.path.dirname(self.path))
                 ul.inner(
                     Tag("li").inner(
                         Tag("a", href=html_path).inner(
                             post.link_title()
-                        )
+                        ),
+                        summary,
                     )
                 )
             f.write(str(ul))
@@ -163,6 +168,7 @@ class Bib:
     def __init__(self, path, content):
         self.id = os.path.splitext(os.path.basename(path))[0]
         self.doc = HeaderDocument(content)
+        self.summary_number_of_words = 20
 
     @property
     def title(self):
@@ -331,6 +337,7 @@ class IndexDescription:
     def __init__(self, title, html_body=""):
         self.title = title
         self.html_body = html_body
+        self.summary_number_of_words = 20
 
 class Breadcrumb:
 

2025-05-31 09:59 Rickard pushed to blog

commit 877ee292aa0015a69f273cbbdb8fb26a224a3626
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 09:59:43 2025 +0200

    Better titles.

diff --git a/blog.py b/blog.py
index cbc6f1c..f73a15e 100755
--- a/blog.py
+++ b/blog.py
@@ -177,9 +177,15 @@ class Bib:
             ("../..", "Home"),
             ("..", "All Bibs"),
         ]).to_html()
-        pre = str(Tag("p").inner(
-            "Link: ",
-            Tag("a", href=self.link()).inner(self.link()),
+        pre = str(Tag("ul").inner(
+            Tag("li").inner(
+                "Type: ",
+                self.doc.header("type").strip(),
+            ),
+            Tag("li").inner(
+                "Link: ",
+                Tag("a", href=self.link()).inner(self.link()),
+            ),
         ))
         return breadcrumb + pre + self.html_body_body
     
@@ -216,13 +222,15 @@ class Posts:
         self.by_id[post.id()] = post
         self.add_to_index(
             "",
-            IndexDescription(title="All Posts"),
+            IndexDescription(
+                title="All Posts",
+            ),
             post,
         )
         self.add_to_index(
             post.index_y(),
             IndexDescription(
-                title=post.index_y(),
+                title=f"Posts {post.index_y()}",
                 html_body=Breadcrumb([
                     ("..", "Home"),
                 ]).to_html(),
@@ -232,7 +240,7 @@ class Posts:
         self.add_to_index(
             post.index_ym(),
             IndexDescription(
-                title=post.index_ym(),
+                title=f"Posts {post.index_ym()}",
                 html_body=Breadcrumb([
                     ("../..", "Home"),
                     ("..", y),
@@ -243,7 +251,7 @@ class Posts:
         self.add_to_index(
             post.index_ymd(),
             IndexDescription(
-                title=post.index_ymd(),
+                title=f"Posts {post.index_ymd()}",
                 html_body=Breadcrumb([
                     ("../../..", "Home"),
                     ("../..", y),
@@ -256,7 +264,7 @@ class Posts:
             self.add_to_index(
                 os.path.join("tags", tag),
                 IndexDescription(
-                    title=tag,
+                    title=f"Posts with tag {tag}",
                     html_body=Breadcrumb([
                         ("../..", "Home"),
                         ("..", "All Tags"),

commit ac4e2d4b8b585033057e8d0166671f73d4e97822
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 09:54:21 2025 +0200

    Reword.

diff --git a/bib/lex48bjarne.md b/bib/lex48bjarne.md
index b1d835c..1649787 100644
--- a/bib/lex48bjarne.md
+++ b/bib/lex48bjarne.md
@@ -6,4 +6,4 @@ link: https://youtu.be/uTxRF5ag27A
 ---
 
 I listened to this because I enjoyed a previous Lex podcast, and I needed
-something to entertain me during a long car ride.
+something to entertain me during a long drive.

2025-05-31 09:40 Rickard pushed to blog

commit 8e405d232e281dfeb0ae2f55bbf78b717d0fedf1
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 09:40:26 2025 +0200

    Better titles for breadcrumb.

diff --git a/blog.py b/blog.py
index 86cc3e4..cbc6f1c 100755
--- a/blog.py
+++ b/blog.py
@@ -212,6 +212,7 @@ class Posts:
         return self.by_id[post_id]
 
     def append(self, post):
+        y, m, d = post.date.ymd_list()
         self.by_id[post.id()] = post
         self.add_to_index(
             "",
@@ -234,7 +235,7 @@ class Posts:
                 title=post.index_ym(),
                 html_body=Breadcrumb([
                     ("../..", "Home"),
-                    ("..", post.index_y()),
+                    ("..", y),
                 ]).to_html(),
             ),
             post,
@@ -245,8 +246,8 @@ class Posts:
                 title=post.index_ymd(),
                 html_body=Breadcrumb([
                     ("../../..", "Home"),
-                    ("../..", post.index_y()),
-                    ("..", post.index_ym()),
+                    ("../..", y),
+                    ("..", m),
                 ]).to_html(),
             ),
             post,

2025-05-31 09:37 Rickard pushed to blog

commit be6bafb1911e03c5b7313469a601cc14b4a8eab4
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date:   Sat May 31 09:37:43 2025 +0200

    More breadcrumbs.

diff --git a/blog.py b/blog.py
index 674d2c4..86cc3e4 100755
--- a/blog.py
+++ b/blog.py
@@ -173,11 +173,15 @@ class Bib:
 
     @property
     def html_body(self):
+        breadcrumb = Breadcrumb([
+            ("../..", "Home"),
+            ("..", "All Bibs"),
+        ]).to_html()
         pre = str(Tag("p").inner(
             "Link: ",
             Tag("a", href=self.link()).inner(self.link()),
         ))
-        return pre + self.html_body_body
+        return breadcrumb + pre + self.html_body_body
     
     @property
     def html_body_body(self):
@@ -209,14 +213,62 @@ class Posts:
 
     def append(self, post):
         self.by_id[post.id()] = post
-        self.add_to_index("", IndexDescription(title="All Posts"), post)
-        self.add_to_index(post.index_y(), IndexDescription(title=post.index_y()), post)
-        self.add_to_index(post.index_ym(), IndexDescription(title=post.index_ym()), post)
-        self.add_to_index(post.index_ymd(), IndexDescription(title=post.index_ymd()), post)
+        self.add_to_index(
+            "",
+            IndexDescription(title="All Posts"),
+            post,
+        )
+        self.add_to_index(
+            post.index_y(),
+            IndexDescription(
+                title=post.index_y(),
+                html_body=Breadcrumb([
+                    ("..", "Home"),
+                ]).to_html(),
+            ),
+            post,
+        )
+        self.add_to_index(
+            post.index_ym(),
+            IndexDescription(
+                title=post.index_ym(),
+                html_body=Breadcrumb([
+                    ("../..", "Home"),
+                    ("..", post.index_y()),
+                ]).to_html(),
+            ),
+            post,
+        )
+        self.add_to_index(
+            post.index_ymd(),
+            IndexDescription(
+                title=post.index_ymd(),
+                html_body=Breadcrumb([
+                    ("../../..", "Home"),
+                    ("../..", post.index_y()),
+                    ("..", post.index_ym()),
+                ]).to_html(),
+            ),
+            post,
+        )
         for tag in post.tags:
-            self.add_to_index(os.path.join("tags", tag), IndexDescription(title=tag), post)
+            self.add_to_index(
+                os.path.join("tags", tag),
+                IndexDescription(
+                    title=tag,
+                    html_body=Breadcrumb([
+                        ("../..", "Home"),
+                        ("..", "All Tags"),
+                    ]).to_html(),
+                ),
+                post,
+            )
         for bib in post.bibs:
-            self.add_to_index(os.path.join("bibs", bib), self.bibs.get(bib), post)
+            self.add_to_index(
+                os.path.join("bibs", bib),
+                self.bibs.get(bib),
+                post,
+            )
 
     def get_indices(self):
         yield from self.indices.values()
@@ -267,9 +319,9 @@ class Posts:
 
 class IndexDescription:
 
-    def __init__(self, title):
+    def __init__(self, title, html_body=""):
         self.title = title
-        self.html_body = ""
+        self.html_body = html_body
 
 class Breadcrumb: