Sorry

This feed does not validate.

In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://davorg.theplanetarium.org/atom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom">
  3.  <title>planet davorg</title>
  4.  <link rel="alternate" href="https://davorg.theplanetarium.org/" type="text/html"/>
  5.  <subtitle>Aggregating Dave's stuff</subtitle>
  6.  <author>
  7.    <name>Dave Cross</name>
  8.    <email>dave@theplanetarium.org</email>
  9.  </author>
  10.  <updated>2025-06-16T06:12:24Z</updated>
  11.  <link rel="self" href="https://davorg.theplanetarium.org/" type="application/atom+xml"/>
  12.  <id>https://davorg.theplanetarium.org/</id>
  13.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  14.    <id>tag:github.com,2008:PushEvent/50928236051</id>
  15.    <published>2025-06-16T00:35:40Z</published>
  16.    <updated>2025-06-16T00:35:40Z</updated>
  17.    <link type="text/html" rel="alternate" href="https://github.com/davorg/uptime/compare/7fe452f128...760020d1dd"/>
  18.    <title type="html">davorg pushed to master in davorg/uptime</title>
  19.    <author>
  20.      <name>davorg</name>
  21.      <email>dave@davecross.co.uk</email>
  22.      <uri>https://github.com/davorg</uri>
  23.    </author>
  24.    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/24642?s=30&amp;v=4"/>
  25.    <content type="html">&lt;div class="push js-feed-item-view" data-hydro-view="{&amp;quot;event_type&amp;quot;:&amp;quot;news_feed.event.view&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;event&amp;quot;:{&amp;quot;repo_id&amp;quot;:567308850,&amp;quot;actor_id&amp;quot;:24642,&amp;quot;public&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;PushEvent&amp;quot;,&amp;quot;target_id&amp;quot;:null,&amp;quot;id&amp;quot;:50928236051,&amp;quot;additional_details_shown&amp;quot;:false,&amp;quot;grouped&amp;quot;:false},&amp;quot;event_group&amp;quot;:null,&amp;quot;org_id&amp;quot;:null,&amp;quot;target_type&amp;quot;:&amp;quot;event&amp;quot;,&amp;quot;user_id&amp;quot;:null,&amp;quot;feed_card&amp;quot;:{&amp;quot;card_retrieved_id&amp;quot;:&amp;quot;fd7023d8-cd41-44f1-83cd-c898ab8a2caf&amp;quot;},&amp;quot;originating_url&amp;quot;:&amp;quot;https://github.com/davorg.atom&amp;quot;}}" data-hydro-view-hmac="544901ae443a5e2f83a6fd21829f7b8452fffa833efe817d2514283cf0c31df7"&gt;&lt;div class="body"&gt;
  26. &lt;!-- push --&gt;
  27. &lt;div class="d-flex flex-items-baseline py-4"&gt;
  28.  &lt;div class="d-flex flex-column width-full"&gt;
  29.    &lt;div class="color-fg-muted"&gt;
  30.      &lt;span class="mr-2"&gt;&lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=64&amp;amp;v=4" width="32" height="32" alt="@davorg"&gt;&lt;/a&gt;&lt;/span&gt;
  31.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg" rel="noreferrer"&gt;davorg&lt;/a&gt;
  32.      
  33.      pushed to
  34.        &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  35.        in
  36.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg/uptime" rel="noreferrer"&gt;davorg/uptime&lt;/a&gt;
  37.      &lt;span&gt;
  38.        · &lt;relative-time tense="past" datetime="2025-06-16T00:35:40Z" data-view-component="true"&gt;June 16, 2025 00:35&lt;/relative-time&gt;
  39.      &lt;/span&gt;
  40.  
  41.        &lt;div class="Box p-3 mt-2 color-shadow-medium color-bg-overlay"&gt;
  42.          &lt;span&gt;1 commit to&lt;/span&gt;
  43.          &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  44.  
  45.          &lt;div class="commits "&gt;
  46.            &lt;ul class="list-style-none"&gt;
  47.                &lt;li class="d-flex flex-items-baseline"&gt;
  48.                  &lt;span&gt;
  49.                    &lt;a class="d-inline-block" href="/upptime-bot" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/73812536?s=32&amp;amp;v=4" width="16" height="16" alt="@upptime-bot"&gt;&lt;/a&gt;
  50.                  &lt;/span&gt;
  51.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/uptime/commit/760020d1ddb1cf364d2eac2cecbb0feaf5783b3e" rel="noreferrer"&gt;760020d&lt;/a&gt;&lt;/code&gt;
  52.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  53.                    &lt;blockquote&gt;
  54.                      🍱 Update graphs [skip ci]
  55.                    &lt;/blockquote&gt;
  56.                  &lt;/div&gt;
  57.                &lt;/li&gt;
  58.  
  59.  
  60.            &lt;/ul&gt;
  61.          &lt;/div&gt;
  62.        &lt;/div&gt;
  63.    &lt;/div&gt;
  64.  &lt;/div&gt;
  65. &lt;/div&gt;
  66. &lt;/div&gt;&lt;/div&gt;</content>
  67.  </entry>
  68.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  69.    <id>tag:github.com,2008:PushEvent/50927840496</id>
  70.    <published>2025-06-16T00:10:14Z</published>
  71.    <updated>2025-06-16T00:10:14Z</updated>
  72.    <link type="text/html" rel="alternate" href="https://github.com/davorg/uptime/compare/ebe2b355d0...7fe452f128"/>
  73.    <title type="html">davorg pushed to master in davorg/uptime</title>
  74.    <author>
  75.      <name>davorg</name>
  76.      <email>dave@davecross.co.uk</email>
  77.      <uri>https://github.com/davorg</uri>
  78.    </author>
  79.    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/24642?s=30&amp;v=4"/>
  80.    <content type="html">&lt;div class="push js-feed-item-view" data-hydro-view="{&amp;quot;event_type&amp;quot;:&amp;quot;news_feed.event.view&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;event&amp;quot;:{&amp;quot;repo_id&amp;quot;:567308850,&amp;quot;actor_id&amp;quot;:24642,&amp;quot;public&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;PushEvent&amp;quot;,&amp;quot;target_id&amp;quot;:null,&amp;quot;id&amp;quot;:50927840496,&amp;quot;additional_details_shown&amp;quot;:false,&amp;quot;grouped&amp;quot;:false},&amp;quot;event_group&amp;quot;:null,&amp;quot;org_id&amp;quot;:null,&amp;quot;target_type&amp;quot;:&amp;quot;event&amp;quot;,&amp;quot;user_id&amp;quot;:null,&amp;quot;feed_card&amp;quot;:{&amp;quot;card_retrieved_id&amp;quot;:&amp;quot;f483defb-16c7-4cc4-ac23-0deca6b60f9e&amp;quot;},&amp;quot;originating_url&amp;quot;:&amp;quot;https://github.com/davorg.atom&amp;quot;}}" data-hydro-view-hmac="c36fb097e8c6abcd681f2091245063a49908ebb6ff348eb172553ca6b1d48593"&gt;&lt;div class="body"&gt;
  81. &lt;!-- push --&gt;
  82. &lt;div class="d-flex flex-items-baseline py-4"&gt;
  83.  &lt;div class="d-flex flex-column width-full"&gt;
  84.    &lt;div class="color-fg-muted"&gt;
  85.      &lt;span class="mr-2"&gt;&lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=64&amp;amp;v=4" width="32" height="32" alt="@davorg"&gt;&lt;/a&gt;&lt;/span&gt;
  86.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg" rel="noreferrer"&gt;davorg&lt;/a&gt;
  87.      
  88.      pushed to
  89.        &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  90.        in
  91.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg/uptime" rel="noreferrer"&gt;davorg/uptime&lt;/a&gt;
  92.      &lt;span&gt;
  93.        · &lt;relative-time tense="past" datetime="2025-06-16T00:10:14Z" data-view-component="true"&gt;June 16, 2025 00:10&lt;/relative-time&gt;
  94.      &lt;/span&gt;
  95.  
  96.        &lt;div class="Box p-3 mt-2 color-shadow-medium color-bg-overlay"&gt;
  97.          &lt;span&gt;2 commits to&lt;/span&gt;
  98.          &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  99.  
  100.          &lt;div class="commits "&gt;
  101.            &lt;ul class="list-style-none"&gt;
  102.                &lt;li class="d-flex flex-items-baseline"&gt;
  103.                  &lt;span&gt;
  104.                    &lt;a class="d-inline-block" href="/upptime-bot" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/73812536?s=32&amp;amp;v=4" width="16" height="16" alt="@upptime-bot"&gt;&lt;/a&gt;
  105.                  &lt;/span&gt;
  106.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/uptime/commit/7fe452f12857f3a435a0c5a1f96cd69c94dfce09" rel="noreferrer"&gt;7fe452f&lt;/a&gt;&lt;/code&gt;
  107.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  108.                    &lt;blockquote&gt;
  109.                      🗃️ Update status summary [skip ci] [upptime]
  110.                    &lt;/blockquote&gt;
  111.                  &lt;/div&gt;
  112.                &lt;/li&gt;
  113.                &lt;li class="d-flex flex-items-baseline"&gt;
  114.                  &lt;span&gt;
  115.                    &lt;a class="d-inline-block" href="/upptime-bot" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/73812536?s=32&amp;amp;v=4" width="16" height="16" alt="@upptime-bot"&gt;&lt;/a&gt;
  116.                  &lt;/span&gt;
  117.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/uptime/commit/9f5020a8c96fc2d624ca421eb8e9203e8a00c76e" rel="noreferrer"&gt;9f5020a&lt;/a&gt;&lt;/code&gt;
  118.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  119.                    &lt;blockquote&gt;
  120.                      📝 Update summary in README [skip ci] [upptime]
  121.                    &lt;/blockquote&gt;
  122.                  &lt;/div&gt;
  123.                &lt;/li&gt;
  124.  
  125.  
  126.            &lt;/ul&gt;
  127.          &lt;/div&gt;
  128.        &lt;/div&gt;
  129.    &lt;/div&gt;
  130.  &lt;/div&gt;
  131. &lt;/div&gt;
  132. &lt;/div&gt;&lt;/div&gt;</content>
  133.  </entry>
  134.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  135.    <id>tag:github.com,2008:PushEvent/50927029086</id>
  136.    <published>2025-06-15T23:01:36Z</published>
  137.    <updated>2025-06-15T23:01:36Z</updated>
  138.    <link type="text/html" rel="alternate" href="https://github.com/davorg/uptime/compare/28116ce961...ebe2b355d0"/>
  139.    <title type="html">davorg pushed to master in davorg/uptime</title>
  140.    <author>
  141.      <name>davorg</name>
  142.      <email>dave@davecross.co.uk</email>
  143.      <uri>https://github.com/davorg</uri>
  144.    </author>
  145.    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/24642?s=30&amp;v=4"/>
  146.    <content type="html">&lt;div class="push js-feed-item-view" data-hydro-view="{&amp;quot;event_type&amp;quot;:&amp;quot;news_feed.event.view&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;event&amp;quot;:{&amp;quot;repo_id&amp;quot;:567308850,&amp;quot;actor_id&amp;quot;:24642,&amp;quot;public&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;PushEvent&amp;quot;,&amp;quot;target_id&amp;quot;:null,&amp;quot;id&amp;quot;:50927029086,&amp;quot;additional_details_shown&amp;quot;:false,&amp;quot;grouped&amp;quot;:false},&amp;quot;event_group&amp;quot;:null,&amp;quot;org_id&amp;quot;:null,&amp;quot;target_type&amp;quot;:&amp;quot;event&amp;quot;,&amp;quot;user_id&amp;quot;:null,&amp;quot;feed_card&amp;quot;:{&amp;quot;card_retrieved_id&amp;quot;:&amp;quot;4ab73cbc-1cbd-4403-9133-0dab0e1a4771&amp;quot;},&amp;quot;originating_url&amp;quot;:&amp;quot;https://github.com/davorg.atom&amp;quot;}}" data-hydro-view-hmac="9e832f4761a30f4125633e6ac0036874c0c04e06220f9379a30dd40d94cdaca0"&gt;&lt;div class="body"&gt;
  147. &lt;!-- push --&gt;
  148. &lt;div class="d-flex flex-items-baseline py-4"&gt;
  149.  &lt;div class="d-flex flex-column width-full"&gt;
  150.    &lt;div class="color-fg-muted"&gt;
  151.      &lt;span class="mr-2"&gt;&lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=64&amp;amp;v=4" width="32" height="32" alt="@davorg"&gt;&lt;/a&gt;&lt;/span&gt;
  152.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg" rel="noreferrer"&gt;davorg&lt;/a&gt;
  153.      
  154.      pushed to
  155.        &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  156.        in
  157.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg/uptime" rel="noreferrer"&gt;davorg/uptime&lt;/a&gt;
  158.      &lt;span&gt;
  159.        · &lt;relative-time tense="past" datetime="2025-06-15T23:01:36Z" data-view-component="true"&gt;June 15, 2025 23:01&lt;/relative-time&gt;
  160.      &lt;/span&gt;
  161.  
  162.        &lt;div class="Box p-3 mt-2 color-shadow-medium color-bg-overlay"&gt;
  163.          &lt;span&gt;2 commits to&lt;/span&gt;
  164.          &lt;a class="branch-name" href="/davorg/uptime/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  165.  
  166.          &lt;div class="commits "&gt;
  167.            &lt;ul class="list-style-none"&gt;
  168.                &lt;li class="d-flex flex-items-baseline"&gt;
  169.                  &lt;span&gt;
  170.                    &lt;a class="d-inline-block" href="/upptime-bot" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/73812536?s=32&amp;amp;v=4" width="16" height="16" alt="@upptime-bot"&gt;&lt;/a&gt;
  171.                  &lt;/span&gt;
  172.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/uptime/commit/ebe2b355d0873bb06615b663898a1a34fcd22f80" rel="noreferrer"&gt;ebe2b35&lt;/a&gt;&lt;/code&gt;
  173.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  174.                    &lt;blockquote&gt;
  175.                      🟩 Aphra is up (200 in 208 ms) [skip ci] [upptime]
  176.                    &lt;/blockquote&gt;
  177.                  &lt;/div&gt;
  178.                &lt;/li&gt;
  179.                &lt;li class="d-flex flex-items-baseline"&gt;
  180.                  &lt;span&gt;
  181.                    &lt;a class="d-inline-block" href="/upptime-bot" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/73812536?s=32&amp;amp;v=4" width="16" height="16" alt="@upptime-bot"&gt;&lt;/a&gt;
  182.                  &lt;/span&gt;
  183.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/uptime/commit/7584cc1855c9fa7f8c8a398b14ab66a8cc91fac3" rel="noreferrer"&gt;7584cc1&lt;/a&gt;&lt;/code&gt;
  184.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  185.                    &lt;blockquote&gt;
  186.                      🟩 Klortho is up (200 in 682 ms) [skip ci] [upptime]
  187.                    &lt;/blockquote&gt;
  188.                  &lt;/div&gt;
  189.                &lt;/li&gt;
  190.  
  191.  
  192.                &lt;li class="f6 mt-2"&gt;
  193.                  &lt;a class="Link--secondary" href="/davorg/uptime/compare/28116ce961...ebe2b355d0" rel="noreferrer"&gt;10 more commits »&lt;/a&gt;
  194.                &lt;/li&gt;
  195.            &lt;/ul&gt;
  196.          &lt;/div&gt;
  197.        &lt;/div&gt;
  198.    &lt;/div&gt;
  199.  &lt;/div&gt;
  200. &lt;/div&gt;
  201. &lt;/div&gt;&lt;/div&gt;</content>
  202.  </entry>
  203.  <entry>
  204.    <title>The Little Mermaid, 2023 - ★★★</title>
  205.    <link rel="alternate" href="https://letterboxd.com/realdavorg/film/the-little-mermaid-2023/" type="text/html"/>
  206.    <content type="xhtml">
  207.      <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="https://a.ltrbxd.com/resized/film-poster/3/7/9/5/9/1/379591-the-little-mermaid-0-600-0-900-crop.jpg?v=2baa748592"/></p> <p>Watched on Sunday June 15, 2025.</p> </div>
  208.    </content>
  209.    <author>
  210.      <name>Dave Cross</name>
  211.    </author>
  212.    <id>letterboxd-watch-917532998</id>
  213.    <published>2025-06-16T08:09:47+12:00</published>
  214.    <updated>2025-06-16T08:09:47+12:00</updated>
  215.  </entry>
  216.  <entry>
  217.    <title>Fontaines D.C. - Favourite</title>
  218.    <link rel="alternate" href="https://www.last.fm/music/Fontaines+D.C./_/Favourite" type="text/html"/>
  219.    <content type="xhtml">
  220.      <div xmlns="http://www.w3.org/1999/xhtml">
  221.        <a href="https://www.last.fm/music/Fontaines+D.C."> Fontaines D.C.</a>
  222.      </div>
  223.    </content>
  224.    <id>https://www.last.fm/music/Fontaines+D.C./_/Favourite</id>
  225.    <published>2025-06-15T17:52:00Z</published>
  226.    <updated>2025-06-15T17:52:00Z</updated>
  227.  </entry>
  228.  <entry>
  229.    <title>Wolf Alice - Don’t Delete the Kisses</title>
  230.    <link rel="alternate" href="https://www.last.fm/music/Wolf+Alice/_/Don%E2%80%99t+Delete+the+Kisses" type="text/html"/>
  231.    <content type="xhtml">
  232.      <div xmlns="http://www.w3.org/1999/xhtml">
  233.        <a href="https://www.last.fm/music/Wolf+Alice"> Wolf Alice</a>
  234.      </div>
  235.    </content>
  236.    <id>https://www.last.fm/music/Wolf+Alice/_/Don%E2%80%99t+Delete+the+Kisses</id>
  237.    <published>2025-06-15T17:48:00Z</published>
  238.    <updated>2025-06-15T17:48:00Z</updated>
  239.  </entry>
  240.  <entry>
  241.    <title>Nation of Language - Weak In Your Light</title>
  242.    <link rel="alternate" href="https://www.last.fm/music/Nation+of+Language/_/Weak+In+Your+Light" type="text/html"/>
  243.    <content type="xhtml">
  244.      <div xmlns="http://www.w3.org/1999/xhtml">
  245.        <a href="https://www.last.fm/music/Nation+of+Language"> Nation of Language</a>
  246.      </div>
  247.    </content>
  248.    <id>https://www.last.fm/music/Nation+of+Language/_/Weak+In+Your+Light</id>
  249.    <published>2025-06-15T17:43:00Z</published>
  250.    <updated>2025-06-15T17:43:00Z</updated>
  251.  </entry>
  252.  <entry>
  253.    <title>Lola Young - Messy</title>
  254.    <link rel="alternate" href="https://www.last.fm/music/Lola+Young/_/Messy" type="text/html"/>
  255.    <content type="xhtml">
  256.      <div xmlns="http://www.w3.org/1999/xhtml">
  257.        <a href="https://www.last.fm/music/Lola+Young"> Lola Young</a>
  258.      </div>
  259.    </content>
  260.    <id>https://www.last.fm/music/Lola+Young/_/Messy</id>
  261.    <published>2025-06-15T17:39:00Z</published>
  262.    <updated>2025-06-15T17:39:00Z</updated>
  263.  </entry>
  264.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  265.    <id>tag:trakt.tv,2005:Episode/3716286/10958213295</id>
  266.    <published>2025-06-15T12:32:13Z</published>
  267.    <updated>2025-06-15T12:32:13Z</updated>
  268.    <link rel="alternate" type="text/html" href="https://trakt.tv/episodes/3716286"/>
  269.    <title>Plebs  5x08 "The Wedding"</title>
  270.    <summary>Jason's brother Darius is getting married and Marcus desperately wants to hire out the Crown and Toga for the occasion, while Grumio offers his services as wedding planner.</summary>
  271.    <content type="html">&lt;img src="https://walter-r2.trakt.tv/images/episodes/003/716/286/screenshots/thumb/0bbc98e33c.jpg" /&gt;Jason&amp;#39;s brother Darius is getting married and Marcus desperately wants to hire out the Crown and Toga for the occasion, while Grumio offers his services as wedding planner.</content>
  272.    <media:content url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/medium/9c8eca2af6.jpg"/>
  273.    <media:thumbnail url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/thumb/9c8eca2af6.jpg"/>
  274.    <author>
  275.      <name>davorg</name>
  276.    </author>
  277.  </entry>
  278.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  279.    <id>tag:trakt.tv,2005:Episode/3716285/10958164365</id>
  280.    <published>2025-06-15T12:08:17Z</published>
  281.    <updated>2025-06-15T12:08:17Z</updated>
  282.    <link rel="alternate" type="text/html" href="https://trakt.tv/episodes/3716285"/>
  283.    <title>Plebs  5x07 "The New Flat"</title>
  284.    <summary>The boys face uncertainty when Landlord evicts them without notice from their flat. Marcus hopes his parents, who are visiting for the weekend, will help him onto the property ladder.</summary>
  285.    <content type="html">&lt;img src="https://walter-r2.trakt.tv/images/episodes/003/716/285/screenshots/thumb/975107976d.jpg" /&gt;The boys face uncertainty when Landlord evicts them without notice from their flat. Marcus hopes his parents, who are visiting for the weekend, will help him onto the property ladder.</content>
  286.    <media:content url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/medium/9c8eca2af6.jpg"/>
  287.    <media:thumbnail url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/thumb/9c8eca2af6.jpg"/>
  288.    <author>
  289.      <name>davorg</name>
  290.    </author>
  291.  </entry>
  292.  <entry>
  293.    <title>LCD Soundsystem - I Can Change</title>
  294.    <link rel="alternate" href="https://www.last.fm/music/LCD+Soundsystem/_/I+Can+Change" type="text/html"/>
  295.    <content type="xhtml">
  296.      <div xmlns="http://www.w3.org/1999/xhtml">
  297.        <a href="https://www.last.fm/music/LCD+Soundsystem"> LCD Soundsystem</a>
  298.      </div>
  299.    </content>
  300.    <id>https://www.last.fm/music/LCD+Soundsystem/_/I+Can+Change</id>
  301.    <published>2025-06-15T11:40:00Z</published>
  302.    <updated>2025-06-15T11:40:00Z</updated>
  303.  </entry>
  304.  <entry>
  305.    <title>A Slice of Perl</title>
  306.    <link rel="alternate" href="https://perlhacks.com/2025/06/a-slice-of-perl/" type="text/html"/>
  307.    <content type="html">&lt;p&gt;Earlier this week, I &lt;a href="https://www.reddit.com/r/perl/comments/1l91s65/failed_a_perl_interview_because_the_interviewer/"&gt;read a post&lt;/a&gt; from someone who failed a job interview because they used a &lt;strong&gt;hash slice&lt;/strong&gt; in some sample code and the interviewer didn’t believe it would work.&lt;/p&gt;
  308. &lt;p&gt;That’s not just wrong — it’s a &lt;em&gt;teachable moment&lt;/em&gt;. Perl has several kinds of slices, and they’re all powerful tools for writing expressive, concise, idiomatic code. If you&amp;#8217;re not familiar with them, you&amp;#8217;re missing out on one of Perl&amp;#8217;s secret superpowers.&lt;/p&gt;
  309. &lt;p&gt;In this post, I’ll walk through all the main types of slices in Perl — from the basics to the modern conveniences added in recent versions — using a consistent, real-world-ish example. Whether you’re new to slices or already slinging &lt;code&gt;%hash{...}&lt;/code&gt; like a pro, I hope you’ll find something useful here.&lt;/p&gt;
  310. &lt;hr /&gt;
  311. &lt;h2&gt;The Scenario&lt;/h2&gt;
  312. &lt;p&gt;Let’s imagine you’re writing code to manage employees in a company. You’ve got an array of employee names and a hash of employee details.&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @employees = qw(alice bob carol dave eve);
  313.  
  314. my %details = (
  315.  alice =&amp;gt; 'Engineering',
  316.  bob   =&amp;gt; 'Marketing',
  317.  carol =&amp;gt; 'HR',
  318.  dave  =&amp;gt; 'Engineering',
  319.  eve   =&amp;gt; 'Sales',
  320. );&lt;/pre&gt;&lt;p&gt;We’ll use these throughout to demonstrate each kind of slice.&lt;/p&gt;
  321. &lt;hr /&gt;
  322. &lt;h2&gt;1. List Slices&lt;/h2&gt;
  323. &lt;p&gt;List slices are slices from a &lt;em&gt;literal list&lt;/em&gt;. They let you pick multiple values from a list in a single operation:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @subset = (qw(alice bob carol dave eve))[1, 3];
  324. # @subset = ('bob', 'dave')&lt;/pre&gt;&lt;p&gt;You can also destructure directly:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my ($employee1, $employee2) = (qw(alice bob carol))[0, 2];
  325. # $employee1 = 'alice', $employee2 = 'carol'&lt;/pre&gt;&lt;p&gt;Simple, readable, and no loop required.&lt;/p&gt;
  326. &lt;hr /&gt;
  327. &lt;h2&gt;2. Array Slices&lt;/h2&gt;
  328. &lt;p&gt;Array slices are just like list slices, but from an array variable:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @subset = @employees[0, 2, 4];
  329. # @subset = ('alice', 'carol', 'eve')&lt;/pre&gt;&lt;p&gt;You can also assign &lt;em&gt;into&lt;/em&gt; an array slice to update multiple elements:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;@employees[1, 3] = ('beatrice', 'daniel');
  330. # @employees = ('alice', 'beatrice', 'carol', 'daniel', 'eve')&lt;/pre&gt;&lt;p&gt;Handy for bulk updates without writing explicit loops.&lt;/p&gt;
  331. &lt;hr /&gt;
  332. &lt;h2&gt;3. Hash Slices&lt;/h2&gt;
  333. &lt;p&gt;This is where some people start to raise eyebrows — but hash slices are perfectly valid Perl and incredibly useful.&lt;/p&gt;
  334. &lt;p&gt;Let’s grab departments for a few employees:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @departments = @details{'alice', 'carol', 'eve'};
  335. # @departments = ('Engineering', 'HR', 'Sales')&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;@&lt;/code&gt; sigil here indicates that we’re asking for a &lt;em&gt;list&lt;/em&gt; of values, even though &lt;code&gt;%details&lt;/code&gt; is a hash.&lt;/p&gt;
  336. &lt;p&gt;You can assign into a hash slice just as easily:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;@details{'bob', 'carol'} = ('Support', 'Legal');&lt;/pre&gt;&lt;p&gt;This kind of bulk update is especially useful when processing structured data or transforming API responses.&lt;/p&gt;
  337. &lt;hr /&gt;
  338. &lt;h2&gt;4. Index/Value Array Slices (Perl 5.20+)&lt;/h2&gt;
  339. &lt;p&gt;Starting in &lt;strong&gt;Perl 5.20&lt;/strong&gt;, you can use &lt;code&gt;%array[...]&lt;/code&gt; to return index/value pairs — a very elegant way to extract and preserve positions in a single step.&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @indexed = %employees[1, 3];
  340. # @indexed = (1 =&amp;gt; 'bob', 3 =&amp;gt; 'dave')&lt;/pre&gt;&lt;p&gt;You get a flat list of index/value pairs. This is particularly helpful when mapping or reordering data based on array positions.&lt;/p&gt;
  341. &lt;p&gt;You can even delete from an array this way:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @removed = delete %employees[0, 4];
  342. # @removed = (0 =&amp;gt; 'alice', 4 =&amp;gt; 'eve')&lt;/pre&gt;&lt;p&gt;And afterwards you&amp;#8217;ll have this:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;# @employees = (undef, 'bob', 'carol', 'dave', undef)&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
  343. &lt;h2&gt;5. Key/Value Hash Slices (Perl 5.20+)&lt;/h2&gt;
  344. &lt;p&gt;The final type of slice — also added in Perl 5.20 — is the &lt;code&gt;%hash{...}&lt;/code&gt; key/value slice. This returns a flat list of key/value pairs, perfect for passing to functions that expect key/value lists.&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my @kv = %details{'alice', 'dave'};
  345. # @kv = ('alice', 'Engineering', 'dave', 'Engineering')&lt;/pre&gt;&lt;p&gt;You can construct a new hash from this easily:&lt;/p&gt;&lt;pre class="urvanov-syntax-highlighter-plain-tag"&gt;my %engineering = (%details{'alice', 'dave'});&lt;/pre&gt;&lt;p&gt;This avoids intermediate looping and makes your code clear and declarative.&lt;/p&gt;
  346. &lt;hr /&gt;
  347. &lt;h2&gt;Summary: Five Flavours of Slice&lt;/h2&gt;
  348. &lt;table&gt;
  349. &lt;thead&gt;
  350. &lt;tr&gt;
  351. &lt;th&gt;Type&lt;/th&gt;
  352. &lt;th&gt;Syntax&lt;/th&gt;
  353. &lt;th&gt;Returns&lt;/th&gt;
  354. &lt;th&gt;Added in&lt;/th&gt;
  355. &lt;/tr&gt;
  356. &lt;/thead&gt;
  357. &lt;tbody&gt;
  358. &lt;tr&gt;
  359. &lt;td&gt;List slice&lt;/td&gt;
  360. &lt;td&gt;&lt;code&gt;(list)[@indices]&lt;/code&gt;&lt;/td&gt;
  361. &lt;td&gt;Values&lt;/td&gt;
  362. &lt;td&gt;Ancient&lt;/td&gt;
  363. &lt;/tr&gt;
  364. &lt;tr&gt;
  365. &lt;td&gt;Array slice&lt;/td&gt;
  366. &lt;td&gt;&lt;code&gt;@array[@indices]&lt;/code&gt;&lt;/td&gt;
  367. &lt;td&gt;Values&lt;/td&gt;
  368. &lt;td&gt;Ancient&lt;/td&gt;
  369. &lt;/tr&gt;
  370. &lt;tr&gt;
  371. &lt;td&gt;Hash slice&lt;/td&gt;
  372. &lt;td&gt;&lt;code&gt;@hash{@keys}&lt;/code&gt;&lt;/td&gt;
  373. &lt;td&gt;Values&lt;/td&gt;
  374. &lt;td&gt;Ancient&lt;/td&gt;
  375. &lt;/tr&gt;
  376. &lt;tr&gt;
  377. &lt;td&gt;Index/value array slice&lt;/td&gt;
  378. &lt;td&gt;&lt;code&gt;%array[@indices]&lt;/code&gt;&lt;/td&gt;
  379. &lt;td&gt;Index-value pairs&lt;/td&gt;
  380. &lt;td&gt;Perl 5.20&lt;/td&gt;
  381. &lt;/tr&gt;
  382. &lt;tr&gt;
  383. &lt;td&gt;Key/value hash slice&lt;/td&gt;
  384. &lt;td&gt;&lt;code&gt;%hash{@keys}&lt;/code&gt;&lt;/td&gt;
  385. &lt;td&gt;Key-value pairs&lt;/td&gt;
  386. &lt;td&gt;Perl 5.20&lt;/td&gt;
  387. &lt;/tr&gt;
  388. &lt;/tbody&gt;
  389. &lt;/table&gt;
  390. &lt;hr /&gt;
  391. &lt;h2&gt;Final Thoughts&lt;/h2&gt;
  392. &lt;p&gt;If someone tells you that &lt;code&gt;@hash{...}&lt;/code&gt; or &lt;code&gt;%array[...]&lt;/code&gt; doesn’t work — they&amp;#8217;re either out of date or mistaken. These forms are standard, powerful, and idiomatic Perl.&lt;/p&gt;
  393. &lt;p&gt;Slices make your code cleaner, clearer, and more concise. They let you express what you want directly, without boilerplate. And yes — they’re perfectly interview-appropriate.&lt;/p&gt;
  394. &lt;p&gt;So next time you&amp;#8217;re reaching for a loop to pluck a few values from a hash or an array, pause and ask: &lt;em&gt;could this be a slice?&lt;/em&gt;&lt;/p&gt;
  395. &lt;p&gt;If the answer’s yes — go ahead and slice away.&lt;/p&gt;&lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/06/a-slice-of-perl/"&gt;A Slice of Perl&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;</content>
  396.    <summary type="xhtml">
  397.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Earlier this week, I read a post from someone who failed a job interview because they used a hash slice in some sample code and the interviewer didn’t believe it would work. That’s not just wrong — it’s a teachable moment. Perl has several kinds of slices, and they’re all powerful tools for writing expressive, […]</p>
  398. <p>The post <a href="https://perlhacks.com/2025/06/a-slice-of-perl/">A Slice of Perl</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  399.    </summary>
  400.    <author>
  401.      <name>Dave Cross</name>
  402.    </author>
  403.    <id>https://perlhacks.com/?p=2326</id>
  404.    <published>2025-06-15T11:39:47Z</published>
  405.    <updated>2025-06-15T11:39:47Z</updated>
  406.    <category term="Programming"/>
  407.    <category term="array"/>
  408.    <category term="hash"/>
  409.    <category term="list"/>
  410.    <category term="programming"/>
  411.    <category term="slice"/>
  412.  </entry>
  413.  <entry>
  414.    <title>A Slice of Perl</title>
  415.    <link rel="alternate" href="https://dev.to/davorg/a-slice-of-perl-4a51" type="text/html"/>
  416.    <content type="html">&lt;p&gt;Earlier this week, I &lt;a href="https://www.reddit.com/r/perl/comments/1l91s65/failed_a_perl_interview_because_the_interviewer/" rel="noopener noreferrer"&gt;read a post&lt;/a&gt; from someone who failed a job interview because they used a &lt;strong&gt;hash slice&lt;/strong&gt; in some sample code and the interviewer didn’t believe it would work.&lt;/p&gt;
  417.  
  418. &lt;p&gt;That’s not just wrong — it’s a &lt;em&gt;teachable moment&lt;/em&gt;. Perl has several kinds of slices, and they’re all powerful tools for writing expressive, concise, idiomatic code. If you’re not familiar with them, you’re missing out on one of Perl’s secret superpowers.&lt;/p&gt;
  419.  
  420. &lt;p&gt;In this post, I’ll walk through all the main types of slices in Perl — from the basics to the modern conveniences added in recent versions — using a consistent, real-world-ish example. Whether you’re new to slices or already slinging &lt;code&gt;%hash{...}&lt;/code&gt; like a pro, I hope you’ll find something useful here.&lt;/p&gt;
  421.  
  422.  
  423.  
  424.  
  425. &lt;h2&gt;
  426.  
  427.  
  428.  The Scenario
  429. &lt;/h2&gt;
  430.  
  431. &lt;p&gt;Let’s imagine you’re writing code to manage employees in a company. You’ve got an array of employee names and a hash of employee details.&lt;br&gt;
  432. &lt;/p&gt;
  433.  
  434. &lt;div class="highlight js-code-highlight"&gt;
  435. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @employees = qw(alice bob carol dave eve);
  436.  
  437. my %details = (
  438.  alice =&amp;gt; 'Engineering',
  439.  bob =&amp;gt; 'Marketing',
  440.  carol =&amp;gt; 'HR',
  441.  dave =&amp;gt; 'Engineering',
  442.  eve =&amp;gt; 'Sales',
  443. );
  444. &lt;/code&gt;&lt;/pre&gt;
  445.  
  446. &lt;/div&gt;
  447.  
  448.  
  449.  
  450. &lt;p&gt;We’ll use these throughout to demonstrate each kind of slice.&lt;/p&gt;
  451.  
  452.  
  453.  
  454.  
  455. &lt;h2&gt;
  456.  
  457.  
  458.  1. List Slices
  459. &lt;/h2&gt;
  460.  
  461. &lt;p&gt;List slices are slices from a &lt;em&gt;literal list&lt;/em&gt;. They let you pick multiple values from a list in a single operation:&lt;br&gt;
  462. &lt;/p&gt;
  463.  
  464. &lt;div class="highlight js-code-highlight"&gt;
  465. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @subset = (qw(alice bob carol dave eve))[1, 3];
  466. # @subset = ('bob', 'dave')
  467. &lt;/code&gt;&lt;/pre&gt;
  468.  
  469. &lt;/div&gt;
  470.  
  471.  
  472.  
  473. &lt;p&gt;You can also destructure directly:&lt;br&gt;
  474. &lt;/p&gt;
  475.  
  476. &lt;div class="highlight js-code-highlight"&gt;
  477. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my ($employee1, $employee2) = (qw(alice bob carol))[0, 2];
  478. # $employee1 = 'alice', $employee2 = 'carol'
  479. &lt;/code&gt;&lt;/pre&gt;
  480.  
  481. &lt;/div&gt;
  482.  
  483.  
  484.  
  485. &lt;p&gt;Simple, readable, and no loop required.&lt;/p&gt;
  486.  
  487.  
  488.  
  489.  
  490. &lt;h2&gt;
  491.  
  492.  
  493.  2. Array Slices
  494. &lt;/h2&gt;
  495.  
  496. &lt;p&gt;Array slices are just like list slices, but from an array variable:&lt;br&gt;
  497. &lt;/p&gt;
  498.  
  499. &lt;div class="highlight js-code-highlight"&gt;
  500. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @subset = @employees[0, 2, 4];
  501. # @subset = ('alice', 'carol', 'eve')
  502. &lt;/code&gt;&lt;/pre&gt;
  503.  
  504. &lt;/div&gt;
  505.  
  506.  
  507.  
  508. &lt;p&gt;You can also assign &lt;em&gt;into&lt;/em&gt; an array slice to update multiple elements:&lt;br&gt;
  509. &lt;/p&gt;
  510.  
  511. &lt;div class="highlight js-code-highlight"&gt;
  512. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;@employees[1, 3] = ('beatrice', 'daniel');
  513. # @employees = ('alice', 'beatrice', 'carol', 'daniel', 'eve')
  514. &lt;/code&gt;&lt;/pre&gt;
  515.  
  516. &lt;/div&gt;
  517.  
  518.  
  519.  
  520. &lt;p&gt;Handy for bulk updates without writing explicit loops.&lt;/p&gt;
  521.  
  522.  
  523.  
  524.  
  525. &lt;h2&gt;
  526.  
  527.  
  528.  3. Hash Slices
  529. &lt;/h2&gt;
  530.  
  531. &lt;p&gt;This is where some people start to raise eyebrows — but hash slices are perfectly valid Perl and incredibly useful.&lt;/p&gt;
  532.  
  533. &lt;p&gt;Let’s grab departments for a few employees:&lt;br&gt;
  534. &lt;/p&gt;
  535.  
  536. &lt;div class="highlight js-code-highlight"&gt;
  537. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @departments = @details{'alice', 'carol', 'eve'};
  538. # @departments = ('Engineering', 'HR', 'Sales')
  539. &lt;/code&gt;&lt;/pre&gt;
  540.  
  541. &lt;/div&gt;
  542.  
  543.  
  544.  
  545. &lt;p&gt;The &lt;code&gt;@&lt;/code&gt; sigil here indicates that we’re asking for a &lt;em&gt;list&lt;/em&gt; of values, even though &lt;code&gt;%details&lt;/code&gt; is a hash.&lt;/p&gt;
  546.  
  547. &lt;p&gt;You can assign into a hash slice just as easily:&lt;br&gt;
  548. &lt;/p&gt;
  549.  
  550. &lt;div class="highlight js-code-highlight"&gt;
  551. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;@details{'bob', 'carol'} = ('Support', 'Legal');
  552. &lt;/code&gt;&lt;/pre&gt;
  553.  
  554. &lt;/div&gt;
  555.  
  556.  
  557.  
  558. &lt;p&gt;This kind of bulk update is especially useful when processing structured data or transforming API responses.&lt;/p&gt;
  559.  
  560.  
  561.  
  562.  
  563. &lt;h2&gt;
  564.  
  565.  
  566.  4. Index/Value Array Slices (Perl 5.20+)
  567. &lt;/h2&gt;
  568.  
  569. &lt;p&gt;Starting in &lt;strong&gt;Perl 5.20&lt;/strong&gt; , you can use &lt;code&gt;%array[...]&lt;/code&gt; to return index/value pairs — a very elegant way to extract and preserve positions in a single step.&lt;br&gt;
  570. &lt;/p&gt;
  571.  
  572. &lt;div class="highlight js-code-highlight"&gt;
  573. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @indexed = %employees[1, 3];
  574. # @indexed = (1 =&amp;gt; 'bob', 3 =&amp;gt; 'dave')
  575. &lt;/code&gt;&lt;/pre&gt;
  576.  
  577. &lt;/div&gt;
  578.  
  579.  
  580.  
  581. &lt;p&gt;You get a flat list of index/value pairs. This is particularly helpful when mapping or reordering data based on array positions.&lt;/p&gt;
  582.  
  583. &lt;p&gt;You can even delete from an array this way:&lt;br&gt;
  584. &lt;/p&gt;
  585.  
  586. &lt;div class="highlight js-code-highlight"&gt;
  587. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @removed = delete %employees[0, 4];
  588. # @removed = (0 =&amp;gt; 'alice', 4 =&amp;gt; 'eve')
  589. &lt;/code&gt;&lt;/pre&gt;
  590.  
  591. &lt;/div&gt;
  592.  
  593.  
  594.  
  595. &lt;p&gt;And afterwards you’ll have this:&lt;br&gt;
  596. &lt;/p&gt;
  597.  
  598. &lt;div class="highlight js-code-highlight"&gt;
  599. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;# @employees = (undef, 'bob', 'carol', 'dave', undef)
  600. &lt;/code&gt;&lt;/pre&gt;
  601.  
  602. &lt;/div&gt;
  603.  
  604.  
  605.  
  606. &lt;h2&gt;
  607.  
  608.  
  609.  5. Key/Value Hash Slices (Perl 5.20+)
  610. &lt;/h2&gt;
  611.  
  612. &lt;p&gt;The final type of slice — also added in Perl 5.20 — is the &lt;code&gt;%hash{...}&lt;/code&gt; key/value slice. This returns a flat list of key/value pairs, perfect for passing to functions that expect key/value lists.&lt;br&gt;
  613. &lt;/p&gt;
  614.  
  615. &lt;div class="highlight js-code-highlight"&gt;
  616. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my @kv = %details{'alice', 'dave'};
  617. # @kv = ('alice', 'Engineering', 'dave', 'Engineering')
  618. &lt;/code&gt;&lt;/pre&gt;
  619.  
  620. &lt;/div&gt;
  621.  
  622.  
  623.  
  624. &lt;p&gt;You can construct a new hash from this easily:&lt;br&gt;
  625. &lt;/p&gt;
  626.  
  627. &lt;div class="highlight js-code-highlight"&gt;
  628. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;my %engineering = (%details{'alice', 'dave'});
  629. &lt;/code&gt;&lt;/pre&gt;
  630.  
  631. &lt;/div&gt;
  632.  
  633.  
  634.  
  635. &lt;p&gt;This avoids intermediate looping and makes your code clear and declarative.&lt;/p&gt;
  636.  
  637.  
  638.  
  639.  
  640. &lt;h2&gt;
  641.  
  642.  
  643.  Summary: Five Flavours of Slice
  644. &lt;/h2&gt;
  645.  
  646. &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  647. &lt;thead&gt;
  648. &lt;tr&gt;
  649. &lt;th&gt;Type&lt;/th&gt;
  650. &lt;th&gt;Syntax&lt;/th&gt;
  651. &lt;th&gt;Returns&lt;/th&gt;
  652. &lt;th&gt;Added in&lt;/th&gt;
  653. &lt;/tr&gt;
  654. &lt;/thead&gt;
  655. &lt;tbody&gt;
  656. &lt;tr&gt;
  657. &lt;td&gt;List slice&lt;/td&gt;
  658. &lt;td&gt;&lt;code&gt;(list)[@indices]&lt;/code&gt;&lt;/td&gt;
  659. &lt;td&gt;Values&lt;/td&gt;
  660. &lt;td&gt;Ancient&lt;/td&gt;
  661. &lt;/tr&gt;
  662. &lt;tr&gt;
  663. &lt;td&gt;Array slice&lt;/td&gt;
  664. &lt;td&gt;&lt;code&gt;@array[@indices]&lt;/code&gt;&lt;/td&gt;
  665. &lt;td&gt;Values&lt;/td&gt;
  666. &lt;td&gt;Ancient&lt;/td&gt;
  667. &lt;/tr&gt;
  668. &lt;tr&gt;
  669. &lt;td&gt;Hash slice&lt;/td&gt;
  670. &lt;td&gt;&lt;code&gt;@hash{@keys}&lt;/code&gt;&lt;/td&gt;
  671. &lt;td&gt;Values&lt;/td&gt;
  672. &lt;td&gt;Ancient&lt;/td&gt;
  673. &lt;/tr&gt;
  674. &lt;tr&gt;
  675. &lt;td&gt;Index/value array slice&lt;/td&gt;
  676. &lt;td&gt;&lt;code&gt;%array[@indices]&lt;/code&gt;&lt;/td&gt;
  677. &lt;td&gt;Index-value pairs&lt;/td&gt;
  678. &lt;td&gt;Perl 5.20&lt;/td&gt;
  679. &lt;/tr&gt;
  680. &lt;tr&gt;
  681. &lt;td&gt;Key/value hash slice&lt;/td&gt;
  682. &lt;td&gt;&lt;code&gt;%hash{@keys}&lt;/code&gt;&lt;/td&gt;
  683. &lt;td&gt;Key-value pairs&lt;/td&gt;
  684. &lt;td&gt;Perl 5.20&lt;/td&gt;
  685. &lt;/tr&gt;
  686. &lt;/tbody&gt;
  687. &lt;/table&gt;&lt;/div&gt;
  688.  
  689.  
  690.  
  691.  
  692. &lt;h2&gt;
  693.  
  694.  
  695.  Final Thoughts
  696. &lt;/h2&gt;
  697.  
  698. &lt;p&gt;If someone tells you that &lt;code&gt;@hash{...}&lt;/code&gt; or &lt;code&gt;%array[...]&lt;/code&gt; doesn’t work — they’re either out of date or mistaken. These forms are standard, powerful, and idiomatic Perl.&lt;/p&gt;
  699.  
  700. &lt;p&gt;Slices make your code cleaner, clearer, and more concise. They let you express what you want directly, without boilerplate. And yes — they’re perfectly interview-appropriate.&lt;/p&gt;
  701.  
  702. &lt;p&gt;So next time you’re reaching for a loop to pluck a few values from a hash or an array, pause and ask: &lt;em&gt;could this be a slice?&lt;/em&gt;&lt;/p&gt;
  703.  
  704. &lt;p&gt;If the answer’s yes — go ahead and slice away.&lt;/p&gt;
  705.  
  706.  
  707.  
  708.  
  709. &lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/06/a-slice-of-perl/" rel="noopener noreferrer"&gt;A Slice of Perl&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com" rel="noopener noreferrer"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;
  710.  
  711. </content>
  712.    <author>
  713.      <name>Dave Cross</name>
  714.    </author>
  715.    <id>https://dev.to/davorg/a-slice-of-perl-4a51</id>
  716.    <published>2025-06-15T11:39:47Z</published>
  717.    <updated>2025-06-15T11:39:47Z</updated>
  718.    <category term="programming"/>
  719.    <category term="perl"/>
  720.    <category term="variables"/>
  721.    <category term="slices"/>
  722.  </entry>
  723.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  724.    <id>tag:github.com,2008:PushEvent/50916303505</id>
  725.    <published>2025-06-15T10:03:33Z</published>
  726.    <updated>2025-06-15T10:03:33Z</updated>
  727.    <link type="text/html" rel="alternate" href="https://github.com/davorg/mirroryear/compare/7cd638de9d...5fe9192086"/>
  728.    <title type="html">davorg pushed to master in davorg/mirroryear</title>
  729.    <author>
  730.      <name>davorg</name>
  731.      <email>dave@davecross.co.uk</email>
  732.      <uri>https://github.com/davorg</uri>
  733.    </author>
  734.    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/24642?s=30&amp;v=4"/>
  735.    <content type="html">&lt;div class="push js-feed-item-view" data-hydro-view="{&amp;quot;event_type&amp;quot;:&amp;quot;news_feed.event.view&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;event&amp;quot;:{&amp;quot;repo_id&amp;quot;:399442251,&amp;quot;actor_id&amp;quot;:24642,&amp;quot;public&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;PushEvent&amp;quot;,&amp;quot;target_id&amp;quot;:null,&amp;quot;id&amp;quot;:50916303505,&amp;quot;additional_details_shown&amp;quot;:false,&amp;quot;grouped&amp;quot;:false},&amp;quot;event_group&amp;quot;:null,&amp;quot;org_id&amp;quot;:null,&amp;quot;target_type&amp;quot;:&amp;quot;event&amp;quot;,&amp;quot;user_id&amp;quot;:null,&amp;quot;feed_card&amp;quot;:{&amp;quot;card_retrieved_id&amp;quot;:&amp;quot;764a9d4c-33e3-42dc-9f49-b5945f583218&amp;quot;},&amp;quot;originating_url&amp;quot;:&amp;quot;https://github.com/davorg.atom&amp;quot;}}" data-hydro-view-hmac="2adcc1b20ccb77ea97c0ac5496f6f08bbd26ccffa3b8c7c1d35e63d3a533d023"&gt;&lt;div class="body"&gt;
  736. &lt;!-- push --&gt;
  737. &lt;div class="d-flex flex-items-baseline py-4"&gt;
  738.  &lt;div class="d-flex flex-column width-full"&gt;
  739.    &lt;div class="color-fg-muted"&gt;
  740.      &lt;span class="mr-2"&gt;&lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=64&amp;amp;v=4" width="32" height="32" alt="@davorg"&gt;&lt;/a&gt;&lt;/span&gt;
  741.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg" rel="noreferrer"&gt;davorg&lt;/a&gt;
  742.      
  743.      pushed to
  744.        &lt;a class="branch-name" href="/davorg/mirroryear/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  745.        in
  746.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg/mirroryear" rel="noreferrer"&gt;davorg/mirroryear&lt;/a&gt;
  747.      &lt;span&gt;
  748.        · &lt;relative-time tense="past" datetime="2025-06-15T10:03:33Z" data-view-component="true"&gt;June 15, 2025 10:03&lt;/relative-time&gt;
  749.      &lt;/span&gt;
  750.  
  751.        &lt;div class="Box p-3 mt-2 color-shadow-medium color-bg-overlay"&gt;
  752.          &lt;span&gt;1 commit to&lt;/span&gt;
  753.          &lt;a class="branch-name" href="/davorg/mirroryear/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  754.  
  755.          &lt;div class="commits pusher-is-only-committer"&gt;
  756.            &lt;ul class="list-style-none"&gt;
  757.                &lt;li class="d-flex flex-items-baseline"&gt;
  758.                  &lt;span&gt;
  759.                    &lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=32&amp;amp;v=4" width="16" height="16" alt="@davorg"&gt;&lt;/a&gt;
  760.                  &lt;/span&gt;
  761.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/mirroryear/commit/5fe91920868257a6de9520f75e48b17dfc762009" rel="noreferrer"&gt;5fe9192&lt;/a&gt;&lt;/code&gt;
  762.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  763.                    &lt;blockquote&gt;
  764.                      Sopt using jQuery
  765.                    &lt;/blockquote&gt;
  766.                  &lt;/div&gt;
  767.                &lt;/li&gt;
  768.  
  769.  
  770.            &lt;/ul&gt;
  771.          &lt;/div&gt;
  772.        &lt;/div&gt;
  773.    &lt;/div&gt;
  774.  &lt;/div&gt;
  775. &lt;/div&gt;
  776. &lt;/div&gt;&lt;/div&gt;</content>
  777.  </entry>
  778.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  779.    <id>tag:github.com,2008:PushEvent/50916195776</id>
  780.    <published>2025-06-15T09:55:38Z</published>
  781.    <updated>2025-06-15T09:55:38Z</updated>
  782.    <link type="text/html" rel="alternate" href="https://github.com/davorg/mirroryear/compare/b2231ed099...7cd638de9d"/>
  783.    <title type="html">davorg pushed to master in davorg/mirroryear</title>
  784.    <author>
  785.      <name>davorg</name>
  786.      <email>dave@davecross.co.uk</email>
  787.      <uri>https://github.com/davorg</uri>
  788.    </author>
  789.    <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/24642?s=30&amp;v=4"/>
  790.    <content type="html">&lt;div class="push js-feed-item-view" data-hydro-view="{&amp;quot;event_type&amp;quot;:&amp;quot;news_feed.event.view&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;event&amp;quot;:{&amp;quot;repo_id&amp;quot;:399442251,&amp;quot;actor_id&amp;quot;:24642,&amp;quot;public&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;PushEvent&amp;quot;,&amp;quot;target_id&amp;quot;:null,&amp;quot;id&amp;quot;:50916195776,&amp;quot;additional_details_shown&amp;quot;:false,&amp;quot;grouped&amp;quot;:false},&amp;quot;event_group&amp;quot;:null,&amp;quot;org_id&amp;quot;:null,&amp;quot;target_type&amp;quot;:&amp;quot;event&amp;quot;,&amp;quot;user_id&amp;quot;:null,&amp;quot;feed_card&amp;quot;:{&amp;quot;card_retrieved_id&amp;quot;:&amp;quot;e96ddfa5-eeaf-4a92-b1d8-ee02d8b7a730&amp;quot;},&amp;quot;originating_url&amp;quot;:&amp;quot;https://github.com/davorg.atom&amp;quot;}}" data-hydro-view-hmac="d54505c464cc0c1e851021fadbc77bb4e859176bc581837774aa85c7568e418d"&gt;&lt;div class="body"&gt;
  791. &lt;!-- push --&gt;
  792. &lt;div class="d-flex flex-items-baseline py-4"&gt;
  793.  &lt;div class="d-flex flex-column width-full"&gt;
  794.    &lt;div class="color-fg-muted"&gt;
  795.      &lt;span class="mr-2"&gt;&lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=64&amp;amp;v=4" width="32" height="32" alt="@davorg"&gt;&lt;/a&gt;&lt;/span&gt;
  796.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg" rel="noreferrer"&gt;davorg&lt;/a&gt;
  797.      
  798.      pushed to
  799.        &lt;a class="branch-name" href="/davorg/mirroryear/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  800.        in
  801.      &lt;a class="Link--primary no-underline wb-break-all" href="/davorg/mirroryear" rel="noreferrer"&gt;davorg/mirroryear&lt;/a&gt;
  802.      &lt;span&gt;
  803.        · &lt;relative-time tense="past" datetime="2025-06-15T09:55:38Z" data-view-component="true"&gt;June 15, 2025 09:55&lt;/relative-time&gt;
  804.      &lt;/span&gt;
  805.  
  806.        &lt;div class="Box p-3 mt-2 color-shadow-medium color-bg-overlay"&gt;
  807.          &lt;span&gt;2 commits to&lt;/span&gt;
  808.          &lt;a class="branch-name" href="/davorg/mirroryear/tree/master" rel="noreferrer"&gt;master&lt;/a&gt;
  809.  
  810.          &lt;div class="commits pusher-is-only-committer"&gt;
  811.            &lt;ul class="list-style-none"&gt;
  812.                &lt;li class="d-flex flex-items-baseline"&gt;
  813.                  &lt;span&gt;
  814.                    &lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=32&amp;amp;v=4" width="16" height="16" alt="@davorg"&gt;&lt;/a&gt;
  815.                  &lt;/span&gt;
  816.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/mirroryear/commit/7cd638de9d09b5f7f9689a4cb8a2fcebb761746d" rel="noreferrer"&gt;7cd638d&lt;/a&gt;&lt;/code&gt;
  817.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  818.                    &lt;blockquote&gt;
  819.                      Switch to CDN versions of Bootstrap and jQuery
  820.                    &lt;/blockquote&gt;
  821.                  &lt;/div&gt;
  822.                &lt;/li&gt;
  823.                &lt;li class="d-flex flex-items-baseline"&gt;
  824.                  &lt;span&gt;
  825.                    &lt;a class="d-inline-block" href="/davorg" rel="noreferrer"&gt;&lt;img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/24642?s=32&amp;amp;v=4" width="16" height="16" alt="@davorg"&gt;&lt;/a&gt;
  826.                  &lt;/span&gt;
  827.                  &lt;code&gt;&lt;a class="mr-1" href="/davorg/mirroryear/commit/8bf4bfdaffa70a4ababaf8f0d3ec449da3413acd" rel="noreferrer"&gt;8bf4bfd&lt;/a&gt;&lt;/code&gt;
  828.                  &lt;div class="dashboard-break-word lh-condensed"&gt;
  829.                    &lt;blockquote&gt;
  830.                      Split CSS and JS into separate files
  831.                    &lt;/blockquote&gt;
  832.                  &lt;/div&gt;
  833.                &lt;/li&gt;
  834.  
  835.  
  836.            &lt;/ul&gt;
  837.          &lt;/div&gt;
  838.        &lt;/div&gt;
  839.    &lt;/div&gt;
  840.  &lt;/div&gt;
  841. &lt;/div&gt;
  842. &lt;/div&gt;&lt;/div&gt;</content>
  843.  </entry>
  844.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  845.    <id>tag:trakt.tv,2005:Episode/3716284/10956395162</id>
  846.    <published>2025-06-14T21:07:46Z</published>
  847.    <updated>2025-06-14T21:07:46Z</updated>
  848.    <link rel="alternate" type="text/html" href="https://trakt.tv/episodes/3716284"/>
  849.    <title>Plebs  5x06 "The Dig"</title>
  850.    <summary>The boys begin an archaeological dig in their bar after Grumio unearths an old brooch whilst sitting on the loo.</summary>
  851.    <content type="html">&lt;img src="https://walter-r2.trakt.tv/images/episodes/003/716/284/screenshots/thumb/f944069d0c.jpg" /&gt;The boys begin an archaeological dig in their bar after Grumio unearths an old brooch whilst sitting on the loo.</content>
  852.    <media:content url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/medium/9c8eca2af6.jpg"/>
  853.    <media:thumbnail url="https://walter-r2.trakt.tv/images/shows/000/046/697/posters/thumb/9c8eca2af6.jpg"/>
  854.    <author>
  855.      <name>davorg</name>
  856.    </author>
  857.  </entry>
  858.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  859.    <id>tag:trakt.tv,2005:Episode/951440/10956328629</id>
  860.    <published>2025-06-14T20:38:39Z</published>
  861.    <updated>2025-06-14T20:38:39Z</updated>
  862.    <link rel="alternate" type="text/html" href="https://trakt.tv/episodes/951440"/>
  863.    <title>Doctor Who  1x09 "The Empty Child (1)"</title>
  864.    <summary>After chasing an unexplained capsule through time, the TARDIS lands in London, during an air raid. Rose investigates when a small child wearing a gasmask, standing on a rooftop, continuously calls out for his mummy. After floating above the city on a barrage balloon, Rose is swept off her feet by another time traveller – Captain Jack Harkness. Meanwhile, The Doctor follows a teenaged girl to a meeting of the homeless children of the Blitz. Here, the child in the gasmask is terrorising them with a parade of strange events, constantly asking for his mother.</summary>
  865.    <content type="html">&lt;img src="https://walter-r2.trakt.tv/images/episodes/000/951/440/screenshots/thumb/6d63beb6c7.jpg" /&gt;After chasing an unexplained capsule through time, the TARDIS lands in London, during an air raid. Rose investigates when a small child wearing a gasmask, standing on a rooftop, continuously calls out for his mummy. After floating above the city on a barrage balloon, Rose is swept off her feet by another time traveller – Captain Jack Harkness. Meanwhile, The Doctor follows a teenaged girl to a meeting of the homeless children of the Blitz. Here, the child in the gasmask is terrorising them with a parade of strange events, constantly asking for his mother.</content>
  866.    <media:content url="https://walter-r2.trakt.tv/images/shows/000/056/872/posters/medium/52aa44cf70.jpg"/>
  867.    <media:thumbnail url="https://walter-r2.trakt.tv/images/shows/000/056/872/posters/thumb/52aa44cf70.jpg"/>
  868.    <author>
  869.      <name>davorg</name>
  870.    </author>
  871.  </entry>
  872.  <entry xmlns:media="http://search.yahoo.com/mrss/">
  873.    <id>tag:trakt.tv,2005:Episode/951439/10956258151</id>
  874.    <published>2025-06-14T20:00:07Z</published>
  875.    <updated>2025-06-14T20:00:07Z</updated>
  876.    <link rel="alternate" type="text/html" href="https://trakt.tv/episodes/951439"/>
  877.    <title>Doctor Who  1x08 "Father's Day"</title>
  878.    <summary>Rose requests a trip back to the day her father, Pete Tyler, died. Reluctantly, the Doctor agrees, but he realises he has made a mistake, when Rose saves Pete from being run over by a car. This has now changed the timeline, and Reapers are transposing themselves all over the Universe. However, this time, the Doctor doesn't have a plan…</summary>
  879.    <content type="html">&lt;img src="https://walter-r2.trakt.tv/images/episodes/000/951/439/screenshots/thumb/e73e67fea4.jpg" /&gt;Rose requests a trip back to the day her father, Pete Tyler, died. Reluctantly, the Doctor agrees, but he realises he has made a mistake, when Rose saves Pete from being run over by a car. This has now changed the timeline, and Reapers are transposing themselves all over the Universe. However, this time, the Doctor doesn&amp;#39;t have a plan…</content>
  880.    <media:content url="https://walter-r2.trakt.tv/images/shows/000/056/872/posters/medium/52aa44cf70.jpg"/>
  881.    <media:thumbnail url="https://walter-r2.trakt.tv/images/shows/000/056/872/posters/thumb/52aa44cf70.jpg"/>
  882.    <author>
  883.      <name>davorg</name>
  884.    </author>
  885.  </entry>
  886.  <entry>
  887.    <title>Snow White, 2025 - ★½</title>
  888.    <link rel="alternate" href="https://letterboxd.com/realdavorg/film/snow-white-2025/" type="text/html"/>
  889.    <content type="xhtml">
  890.      <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="https://a.ltrbxd.com/resized/film-poster/3/7/9/5/9/0/379590-disneys-snow-white-0-600-0-900-crop.jpg?v=150e421404"/></p> <p>Watched on Friday June 13, 2025.</p> </div>
  891.    </content>
  892.    <author>
  893.      <name>Dave Cross</name>
  894.    </author>
  895.    <id>letterboxd-watch-915421263</id>
  896.    <published>2025-06-14T07:50:36+12:00</published>
  897.    <updated>2025-06-14T07:50:36+12:00</updated>
  898.  </entry>
  899.  <entry>
  900.    <title>Echo Valley, 2025 - ★★★</title>
  901.    <link rel="alternate" href="https://letterboxd.com/realdavorg/film/echo-valley/" type="text/html"/>
  902.    <content type="xhtml">
  903.      <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="https://a.ltrbxd.com/resized/film-poster/9/8/9/1/2/2/989122-echo-valley-0-600-0-900-crop.jpg?v=f9d454a5a6"/></p> <p>Watched on Tuesday June 10, 2025.</p> </div>
  904.    </content>
  905.    <author>
  906.      <name>Dave Cross</name>
  907.    </author>
  908.    <id>letterboxd-watch-913009560</id>
  909.    <published>2025-06-11T09:47:02+12:00</published>
  910.    <updated>2025-06-11T09:47:02+12:00</updated>
  911.  </entry>
  912.  <entry>
  913.    <title>Blue Velvet, 1986 - ★★★★</title>
  914.    <link rel="alternate" href="https://letterboxd.com/realdavorg/film/blue-velvet/1/" type="text/html"/>
  915.    <content type="xhtml">
  916.      <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="https://a.ltrbxd.com/resized/film-poster/5/1/3/5/9/51359-blue-velvet-0-600-0-900-crop.jpg?v=b0ee3c20f6"/></p> <p>Watched on Monday June 9, 2025.</p> </div>
  917.    </content>
  918.    <author>
  919.      <name>Dave Cross</name>
  920.    </author>
  921.    <id>letterboxd-watch-912157395</id>
  922.    <published>2025-06-10T09:50:41+12:00</published>
  923.    <updated>2025-06-10T09:50:41+12:00</updated>
  924.  </entry>
  925.  <entry>
  926.    <title>They Live, 1988 - ★★★½</title>
  927.    <link rel="alternate" href="https://letterboxd.com/realdavorg/film/they-live/" type="text/html"/>
  928.    <content type="xhtml">
  929.      <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="https://a.ltrbxd.com/resized/film-poster/4/7/7/9/8/47798-they-live-0-600-0-900-crop.jpg?v=816bf826a0"/></p> <p>Watched on Sunday June 8, 2025.</p> </div>
  930.    </content>
  931.    <author>
  932.      <name>Dave Cross</name>
  933.    </author>
  934.    <id>letterboxd-watch-911041553</id>
  935.    <published>2025-06-09T08:17:10+12:00</published>
  936.    <updated>2025-06-09T08:17:10+12:00</updated>
  937.  </entry>
  938.  <entry>
  939.    <title>Generating Content with ChatGPT</title>
  940.    <link rel="alternate" href="https://perlhacks.com/2025/06/generating-content-with-chatgpt/" type="text/html"/>
  941.    <content type="xhtml">
  942.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Back in January, I wrote a blog post about adding JSON-LD to your web pages to make it easier for Google to understand what they were about. The example I used was my <a href="https://readabooker.com/">ReadABooker</a> site, which encourages people to read more Booker Prize shortlisted novels (and to do so by buying them using my Amazon Associate links).</p>
  943. <p>I’m slightly sad to report that in the five months since I implemented that change, visits to the website have remained pretty much static and I have yet to make my fortune from Amazon kickbacks. But that’s ok, we just use it as an excuse to learn more about SEO and to apply more tweaks to the website.</p>
  944. <p>I’ve been using the most excellent <a href="https://ahrefs.com/">ARefs</a> site to get information about how good the on-page SEO is for many of my sites. Every couple of weeks, ARefs crawls the site and will give me a list of suggestions of things I can improve. And for a long time, I had been putting off dealing with one of the biggest issues – because it seemed so difficult.</p>
  945. <p>The site didn’t have enough text on it. You could get lists of Booker years, authors and books. And, eventually, you’d end up on a book page where, hopefully, you’d be tempted to buy a book. But the book pages were pretty bare – just the title, author, year they were short-listed and an image of the cover. Oh, and the all-important “Buy from Amazon” button. AHrefs was insistent that I needed more text (at least a hundred words) on a page in order for Google to take an interest in it. And given that my database of Booker books included hundreds of books by hundreds of authors, that seemed like a big job to take on.</p>
  946. <p>But, a few days ago, I saw a solution to that problem – I could ask ChatGPT for the text.</p>
  947. <p>I wrote <a href="https://perlhacks.com/2025/04/finding-cool-stuff-with-chatgpt/">a blog post in April about generating a daily-updating website</a> using ChatGPT. This would be similar, but instead of writing the text directly to a Jekyll website, I’d write it to the database and add it to the templates that generate the website.</p>
  948. <p>Adapting the code was very quick. Here’s <a href="https://github.com/davorg/readabooker/blob/main/bin/describe_book">the finished version for the book blurbs</a>.</p><pre class="urvanov-syntax-highlighter-plain-tag">#!/usr/bin/env perl
  949.  
  950. use strict;
  951. use warnings;
  952.  
  953. use builtin qw[trim];
  954. use feature 'say';
  955.  
  956. use OpenAPI::Client::OpenAI;
  957. use Time::Piece;
  958. use Encode qw[encode];
  959.  
  960. use Booker::Schema;
  961.  
  962. my $sch = Booker::Schema-&gt;get_schema;
  963.  
  964. my $count = 0;
  965. my $books = $sch-&gt;resultset('Book');
  966.  
  967. while ($count &lt; 20 and my $book = $books-&gt;next) {
  968.  next if defined $book-&gt;blurb;
  969.  ++$count;
  970.  my $blurb = describe_title($book);
  971.  $book-&gt;update({ blurb =&gt; $blurb });
  972. }
  973.  
  974. sub describe_title {
  975.  my ($book) = @_;
  976.  
  977.  my ($title, $author) = ($book-&gt;title, $book-&gt;author-&gt;name);
  978.  
  979.  my $debug = 1;
  980.  
  981.  my $api_key = $ENV{"OPENAI_API_KEY"} or die "OPENAI_API_KEY is not set\n";
  982.  
  983.  my $client = OpenAPI::Client::OpenAI-&gt;new;
  984.  
  985.  my $prompt = join " ",
  986.    'Produce a 100-200 word description for the book',
  987.    "'$title' by $author",
  988.    'Do not mention the fact that the book was short-listed for (or won)',
  989.    'the Booker Prize';
  990.  
  991.  my $res = $client-&gt;createChatCompletion({
  992.    body =&gt; {
  993.      model =&gt; 'gpt-4o',
  994.      # model =&gt; 'gpt-4.1-nano',
  995.      messages =&gt; [
  996.          { role =&gt; 'system', content =&gt; 'You are someone who knows a lot about popular literature.' },
  997.          { role =&gt; 'user', content =&gt; $prompt },
  998.      ],
  999.      temperature =&gt; 1.0,
  1000.    },
  1001.  });
  1002.  
  1003.  my $text = $res-&gt;res-&gt;json-&gt;{choices}[0]{message}{content};
  1004.  $text = encode('UTF-8', $text);
  1005.  
  1006.  say $text if $debug;
  1007.  
  1008.  return $text;
  1009. }</pre><p>There are a couple of points to note:</p>
  1010. <ol>
  1011. <li>I have DBIC classes to deal with the database interaction, so that’s all really simple. Before running this code, I added new columns to the relevant tables and re-ran my process for generating the DBIC classes</li>
  1012. <li>I put a throttle on the processing, so each run would only update twenty books – I slightly paranoid about using too many requests and annoying OpenAI. That wasn’t a problem at all</li>
  1013. <li>The hardest thing (not that it was very hard at all) was to tweak the prompt to give me exactly what I wanted</li>
  1014. </ol>
  1015. <p>I then produced <a href="https://github.com/davorg/readabooker/blob/main/bin/describe_person">a similar program that did the same thing for authors</a>. It’s similar enough that the next time I  need something like this, I’ll spend some time turning it into a generic program.</p>
  1016. <p>I then added the new database fields to the <a href="https://github.com/davorg/readabooker/blob/main/src/title/title.html.tt">book</a> and <a href="https://github.com/davorg/readabooker/blob/main/src/author/author.html.tt">author</a> templates and re-published the site. You can see the results in, for example, the pages for <a href="https://readabooker.com/author/salman-rushdie/">Salman Rushie</a> and <a href="https://readabooker.com/title/midnights-children/"><em>Midnight’s Children</em></a>.</p>
  1017. <p>I had one more slight concern going into this project. I pay for access to the ChatGPT API. I usually have about $10 in my pre-paid account and I really had no idea how much this was going to cost me. I needed have worried. Here’s a graph showing the bump in my API usage on the day I ran the code for all books and authors:</p>
  1018. <figure id="attachment_2319" aria-describedby="caption-attachment-2319" style="width: 234px" class="wp-caption alignleft"><a href="https://perlhacks.com/wp-content/uploads/2025/06/Screenshot-2025-06-08-183234.png"><img fetchpriority="high" decoding="async" class="size-medium wp-image-2319" src="https://perlhacks.com/wp-content/uploads/2025/06/Screenshot-2025-06-08-183234-234x300.png" alt="ChatGPT API usage" width="234" height="300" srcset="https://perlhacks.com/wp-content/uploads/2025/06/Screenshot-2025-06-08-183234-234x300.png 234w, https://perlhacks.com/wp-content/uploads/2025/06/Screenshot-2025-06-08-183234.png 306w" sizes="(max-width: 234px) 100vw, 234px"/></a><figcaption id="caption-attachment-2319" class="wp-caption-text">ChatGPT API usage</figcaption></figure>
  1019. <p>But you can also see that my total costs for the month so far are $0.01!</p>
  1020. <p>So, all-in-all, I call that a success and I’ll be using similar techniques to generate content for some other websites.</p><p>The post <a href="https://perlhacks.com/2025/06/generating-content-with-chatgpt/">Generating Content with ChatGPT</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1021.    </content>
  1022.    <summary type="xhtml">
  1023.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Back in January, I wrote a blog post about adding JSON-LD to your web pages to make it easier for Google to understand what they were about. The example I used was my ReadABooker site, which encourages people to read more Booker Prize shortlisted novels (and to do so by buying them using my Amazon […]</p>
  1024. <p>The post <a href="https://perlhacks.com/2025/06/generating-content-with-chatgpt/">Generating Content with ChatGPT</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1025.    </summary>
  1026.    <author>
  1027.      <name>Dave Cross</name>
  1028.    </author>
  1029.    <id>https://perlhacks.com/?p=2318</id>
  1030.    <published>2025-06-08T17:40:04Z</published>
  1031.    <updated>2025-06-08T17:40:04Z</updated>
  1032.    <category term="Programming"/>
  1033.    <category term="ai"/>
  1034.    <category term="chatgpt"/>
  1035.    <category term="programing"/>
  1036.  </entry>
  1037.  <entry>
  1038.    <title>Generating Content with ChatGPT</title>
  1039.    <link rel="alternate" href="https://dev.to/davorg/generating-content-with-chatgpt-2lh0" type="text/html"/>
  1040.    <content type="html">&lt;p&gt;Back in January, I wrote a blog post about adding JSON-LD to your web pages to make it easier for Google to understand what they were about. The example I used was my &lt;a href="https://readabooker.com/" rel="noopener noreferrer"&gt;ReadABooker&lt;/a&gt; site, which encourages people to read more Booker Prize shortlisted novels (and to do so by buying them using my Amazon Associate links).&lt;/p&gt;
  1041.  
  1042. &lt;p&gt;I’m slightly sad to report that in the five months since I implemented that change, visits to the website have remained pretty much static and I have yet to make my fortune from Amazon kickbacks. But that’s ok, we just use it as an excuse to learn more about SEO and to apply more tweaks to the website.&lt;/p&gt;
  1043.  
  1044. &lt;p&gt;I’ve been using the most excellent &lt;a href="https://ahrefs.com/" rel="noopener noreferrer"&gt;ARefs&lt;/a&gt; site to get information about how good the on-page SEO is for many of my sites. Every couple of weeks, ARefs crawls the site and will give me a list of suggestions of things I can improve. And for a long time, I had been putting off dealing with one of the biggest issues – because it seemed so difficult.&lt;/p&gt;
  1045.  
  1046. &lt;p&gt;The site didn’t have enough text on it. You could get lists of Booker years, authors and books. And, eventually, you’d end up on a book page where, hopefully, you’d be tempted to buy a book. But the book pages were pretty bare – just the title, author, year they were short-listed and an image of the cover. Oh, and the all-important “Buy from Amazon” button. AHrefs was insistent that I needed more text (at least a hundred words) on a page in order for Google to take an interest in it. And given that my database of Booker books included hundreds of books by hundreds of authors, that seemed like a big job to take on.&lt;/p&gt;
  1047.  
  1048. &lt;p&gt;But, a few days ago, I saw a solution to that problem – I could ask ChatGPT for the text.&lt;/p&gt;
  1049.  
  1050. &lt;p&gt;I wrote &lt;a href="https://dev.to/davorg/finding-cool-stuff-with-chatgpt-47gp"&gt;a blog post in April about generating a daily-updating website&lt;/a&gt; using ChatGPT. This would be similar, but instead of writing the text directly to a Jekyll website, I’d write it to the database and add it to the templates that generate the website.&lt;/p&gt;
  1051.  
  1052. &lt;p&gt;Adapting the code was very quick. Here’s &lt;a href="https://github.com/davorg/readabooker/blob/main/bin/describe_book" rel="noopener noreferrer"&gt;the finished version for the book blurbs&lt;/a&gt;.&lt;br&gt;
  1053. &lt;/p&gt;
  1054.  
  1055. &lt;div class="highlight js-code-highlight"&gt;
  1056. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/env perl
  1057.  
  1058. use strict;
  1059. use warnings;
  1060.  
  1061. use builtin qw[trim];
  1062. use feature 'say';
  1063.  
  1064. use OpenAPI::Client::OpenAI;
  1065. use Time::Piece;
  1066. use Encode qw[encode];
  1067.  
  1068. use Booker::Schema;
  1069.  
  1070. my $sch = Booker::Schema-&amp;gt;get_schema;
  1071.  
  1072. my $count = 0;
  1073. my $books = $sch-&amp;gt;resultset('Book');
  1074.  
  1075. while ($count &amp;lt; 20 and my $book = $books-&amp;gt;next) {
  1076.  next if defined $book-&amp;gt;blurb;
  1077.  ++$count;
  1078.  my $blurb = describe_title($book);
  1079.  $book-&amp;gt;update({ blurb =&amp;gt; $blurb });
  1080. }
  1081.  
  1082. sub describe_title {
  1083.  my ($book) = @_;
  1084.  
  1085.  my ($title, $author) = ($book-&amp;gt;title, $book-&amp;gt;author-&amp;gt;name);
  1086.  
  1087.  my $debug = 1;
  1088.  
  1089.  my $api_key = $ENV{"OPENAI_API_KEY"} or die "OPENAI_API_KEY is not set\n";
  1090.  
  1091.  my $client = OpenAPI::Client::OpenAI-&amp;gt;new;
  1092.  
  1093.  my $prompt = join " ",
  1094.    'Produce a 100-200 word description for the book',
  1095.    "'$title' by $author",
  1096.    'Do not mention the fact that the book was short-listed for (or won)',
  1097.    'the Booker Prize';
  1098.  
  1099.  my $res = $client-&amp;gt;createChatCompletion({
  1100.    body =&amp;gt; {
  1101.      model =&amp;gt; 'gpt-4o',
  1102.      # model =&amp;gt; 'gpt-4.1-nano',
  1103.      messages =&amp;gt; [
  1104.          { role =&amp;gt; 'system', content =&amp;gt; 'You are someone who knows a lot about popular literature.' },
  1105.          { role =&amp;gt; 'user', content =&amp;gt; $prompt },
  1106.      ],
  1107.      temperature =&amp;gt; 1.0,
  1108.    },
  1109.  });
  1110.  
  1111.  my $text = $res-&amp;gt;res-&amp;gt;json-&amp;gt;{choices}[0]{message}{content};
  1112.  $text = encode('UTF-8', $text);
  1113.  
  1114.  say $text if $debug;
  1115.  
  1116.  return $text;
  1117. }
  1118. &lt;/code&gt;&lt;/pre&gt;
  1119.  
  1120. &lt;/div&gt;
  1121.  
  1122.  
  1123.  
  1124. &lt;p&gt;There are a couple of points to note:&lt;/p&gt;
  1125.  
  1126. &lt;ol&gt;
  1127. &lt;li&gt;I have DBIC classes to deal with the database interaction, so that’s all really simple. Before running this code, I added new columns to the relevant tables and re-ran my process for generating the DBIC classes&lt;/li&gt;
  1128. &lt;li&gt;I put a throttle on the processing, so each run would only update twenty books – I slightly paranoid about using too many requests and annoying OpenAI. That wasn’t a problem at all&lt;/li&gt;
  1129. &lt;li&gt;The hardest thing (not that it was very hard at all) was to tweak the prompt to give me exactly what I wanted&lt;/li&gt;
  1130. &lt;/ol&gt;
  1131.  
  1132. &lt;p&gt;I then produced &lt;a href="https://github.com/davorg/readabooker/blob/main/bin/describe_person" rel="noopener noreferrer"&gt;a similar program that did the same thing for authors&lt;/a&gt;. It’s similar enough that the next time I  need something like this, I’ll spend some time turning it into a generic program.&lt;/p&gt;
  1133.  
  1134. &lt;p&gt;I then added the new database fields to the &lt;a href="https://github.com/davorg/readabooker/blob/main/src/title/title.html.tt" rel="noopener noreferrer"&gt;book&lt;/a&gt; and &lt;a href="https://github.com/davorg/readabooker/blob/main/src/author/author.html.tt" rel="noopener noreferrer"&gt;author&lt;/a&gt; templates and re-published the site. You can see the results in, for example, the pages for &lt;a href="https://readabooker.com/author/salman-rushdie/" rel="noopener noreferrer"&gt;Salman Rushie&lt;/a&gt; and &lt;a href="https://readabooker.com/title/midnights-children/" rel="noopener noreferrer"&gt;&lt;em&gt;Midnight’s Children&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
  1135.  
  1136. &lt;p&gt;I had one more slight concern going into this project. I pay for access to the ChatGPT API. I usually have about $10 in my pre-paid account and I really had no idea how much this was going to cost me. I needed have worried. Here’s a graph showing the bump in my API usage on the day I ran the code for all books and authors:&lt;/p&gt;
  1137.  
  1138. &lt;p&gt;&lt;a href="https://perlhacks.com/wp-content/uploads/2025/06/Screenshot-2025-06-08-183234.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl9qyd9mntfor30m9y42.png" alt="ChatGPT API usage" width="234" height="300"&gt;&lt;/a&gt;&lt;/p&gt;
  1139.  
  1140. &lt;p&gt;But you can also see that my total costs for the month so far are $0.01!&lt;/p&gt;
  1141.  
  1142. &lt;p&gt;So, all-in-all, I call that a success and I’ll be using similar techniques to generate content for some other websites.&lt;/p&gt;
  1143.  
  1144.  
  1145.  
  1146.  
  1147. &lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/06/generating-content-with-chatgpt/" rel="noopener noreferrer"&gt;Generating Content with ChatGPT&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com" rel="noopener noreferrer"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;
  1148.  
  1149. </content>
  1150.    <author>
  1151.      <name>Dave Cross</name>
  1152.    </author>
  1153.    <id>https://dev.to/davorg/generating-content-with-chatgpt-2lh0</id>
  1154.    <published>2025-06-08T17:40:04Z</published>
  1155.    <updated>2025-06-08T17:40:04Z</updated>
  1156.    <category term="programming"/>
  1157.    <category term="ai"/>
  1158.    <category term="chatgpt"/>
  1159.    <category term="programing"/>
  1160.  </entry>
  1161.  <entry>
  1162.    <title>Deploying Dancer Apps – The Next Generation</title>
  1163.    <link rel="alternate" href="https://perlhacks.com/2025/05/deploying-dancer-apps-the-next-generation/" type="text/html"/>
  1164.    <content type="xhtml">
  1165.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Last summer, I wrote a couple of posts about my lightweight, roll-your-own approach to deploying PSGI (Dancer) web apps:</p>
  1166. <ul>
  1167. <li><a href="https://perlhacks.com/2024/05/deploying-dancer-apps/" target="_new" rel="noopener">Deploying Dancer Apps</a></li>
  1168. <li><a href="https://perlhacks.com/2024/08/deploying-dancer-apps-addendum/" target="_new" rel="noopener">Deploying Dancer Apps: Addendum</a></li>
  1169. </ul>
  1170. <p>In those posts, I described how I avoided heavyweight deployment tools by writing a small, custom Perl script (<code data-start="750" data-end="763">app_service</code>) to start and manage them. It was minimal, transparent, and easy to replicate.</p>
  1171. <p>It also wasn’t great.</p>
  1172. <h3>What Changed?</h3>
  1173. <p>The system mostly worked, but it had a number of growing pains:</p>
  1174. <ul>
  1175. <li>It didn’t integrate with the host operating system in a meaningful way.</li>
  1176. <li>Services weren’t resilient — no automatic restarts on failure.</li>
  1177. <li>There was no logging consolidation, no dependency management (e.g., waiting for the network), and no visibility in tools like <code data-start="1261" data-end="1272">systemctl</code>.</li>
  1178. <li data-start="1274" data-end="1348">If a service crashed, I’d usually find out via <code>curl</code>, not <code>journalctl</code>.</li>
  1179. </ul>
  1180. <p>As I started running more apps, this ad-hoc approach became harder to justify. It was time to grow up.</p>
  1181. <h3>Enter <code>psgi-systemd-deploy</code></h3>
  1182. <p>So today (with some help from ChatGPT) I wrote <a class="" href="https://github.com/davorg/psgi-systemd-deploy" target="_new" rel="noopener">psgi-systemd-deploy</a> — a simple, declarative deployment tool for PSGI apps that integrates directly with <code data-start="1651" data-end="1660">systemd</code>. It generates <code>.service</code> files for your apps from environment-specific config and handles all the fiddly bits (paths, ports, logging, restart policies, etc.) with minimal fuss.</p>
  1183. <p>Key benefits:</p>
  1184. <ul>
  1185. <li style="list-style-type: none;">
  1186. <ul>
  1187. <li><strong>Declarative config</strong> via <code>.deploy.env</code></li>
  1188. <li><strong>Optional <code>.env</code> file</strong> support for application-specific settings</li>
  1189. <li><strong>Environment-aware templating</strong> using <code>envsubst</code></li>
  1190. <li><strong>No lock-in</strong> — it just writes <code>systemd</code> units you can inspect and manage yourself</li>
  1191. </ul>
  1192. </li>
  1193. </ul>
  1194. <ul>
  1195. <li><strong>Safe</strong> — supports a <code>--dry-run</code> mode so you can preview changes before deploying</li>
  1196. <li><strong>Convenient</strong> — includes a <code>run_all</code> helper script for managing all your deployed apps with one command</li>
  1197. </ul>
  1198. <h3>A Real-World Example</h3>
  1199. <p>You may know about my <a href="https://lineofsuccession.co.uk/">Line of Succession web site</a> (<a href="https://talks.davecross.co.uk/talk/im-a-republican-honest/">introductory talk</a>). This is one of the Dancer apps I’ve been talking about. To deploy it, I wrote a <code>.deploy.env</code> file that looks like this:</p><pre class="urvanov-syntax-highlighter-plain-tag">WEBAPP_SERVICE_NAME=succession
  1200. WEBAPP_DESC="British Line of Succession"
  1201. WEBAPP_WORKDIR=/opt/succession
  1202. WEBAPP_USER=succession
  1203. WEBAPP_GROUP=psacln
  1204. WEBAPP_PORT=2222
  1205. WEBAPP_WORKER_COUNT=5
  1206. WEBAPP_APP_PRELOAD=1</pre><p>And optionally a <code>.env</code> file for app-specific settings (e.g., database credentials). Then I run:</p><pre class="urvanov-syntax-highlighter-plain-tag">$ /path/to/psgi-systemd-deploy/deploy.sh</pre><p>And that’s it. The app is now a first-class <code>systemd</code> service, automatically started on boot and restartable with <code>systemctl</code>.</p>
  1207. <h3>Managing All Your Apps with <code>run_all</code></h3>
  1208. <p>Once you’ve deployed several PSGI apps using <code>psgi-systemd-deploy</code>, you’ll probably want an easy way to manage them all at once. That’s where the <code>run_all</code> script comes in.</p>
  1209. <p>It’s a simple but powerful wrapper around <code>systemctl</code> that automatically discovers all deployed services by scanning for <code>.deploy.env</code> files. That means no need to hard-code service names or paths — it just works, based on the configuration you’ve already provided.</p>
  1210. <p>Here’s how you might use it:</p><pre class="urvanov-syntax-highlighter-plain-tag"># Restart all PSGI apps
  1211. $ run_all restart
  1212.  
  1213. # Show current status
  1214. $ run_all status
  1215.  
  1216. # Stop them all (e.g., for maintenance)
  1217. $ run_all stop</pre><p>And if you want machine-readable output for scripting or monitoring, there’s a <code>--json</code> flag:</p><pre class="urvanov-syntax-highlighter-plain-tag">$ run_all --json is-active | jq .
  1218. [
  1219.  {
  1220.    "service": "succession.service",
  1221.    "action": "is-active",
  1222.    "status": 0,
  1223.    "output": "active"
  1224.  },
  1225.  {
  1226.    "service": "klortho.service",
  1227.    "action": "is-active",
  1228.    "status": 0,
  1229.    "output": "active"
  1230.  }
  1231. ]</pre><p>Under the hood, <code>run_all</code> uses the same environment-driven model as the rest of the system — no surprises, no additional config files. It’s just a lightweight helper that understands your layout and automates the boring bits.</p>
  1232. <p>It’s not a replacement for <code data-start="1406" data-end="1417">systemctl</code>, but it makes common tasks across many services far more convenient — especially during development, deployment, or server reboots.</p>
  1233. <h3>A Clean Break</h3>
  1234. <p>The goal of <code>psgi-systemd-deploy</code> isn’t to replace Docker, K8s, or full-featured PaaS systems. It’s for the rest of us — folks running VPSes or bare-metal boxes where PSGI apps just need to run reliably and predictably under the OS’s own tools.</p>
  1235. <p>If you’ve been rolling your own init scripts, cron jobs, or <code>nohup</code>-based hacks, give it a look. It’s clean, simple, and reliable — and a solid step up from duct tape.</p>
  1236. <p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;"/> <a class="" href="https://github.com/davorg/psgi-systemd-deploy" target="_new" rel="noopener">View the code on GitHub</a></p><p>The post <a href="https://perlhacks.com/2025/05/deploying-dancer-apps-the-next-generation/">Deploying Dancer Apps – The Next Generation</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1237.    </content>
  1238.    <summary type="xhtml">
  1239.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Last summer, I wrote a couple of posts about my lightweight, roll-your-own approach to deploying PSGI (Dancer) web apps: Deploying Dancer Apps Deploying Dancer Apps: Addendum In those posts, I described how I avoided heavyweight deployment tools by writing a small, custom Perl script (app_service) to start and manage them. It was minimal, transparent, and easy […]</p>
  1240. <p>The post <a href="https://perlhacks.com/2025/05/deploying-dancer-apps-the-next-generation/">Deploying Dancer Apps – The Next Generation</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1241.    </summary>
  1242.    <author>
  1243.      <name>Dave Cross</name>
  1244.    </author>
  1245.    <id>https://perlhacks.com/?p=2314</id>
  1246.    <published>2025-05-30T15:45:04Z</published>
  1247.    <updated>2025-05-30T15:45:04Z</updated>
  1248.    <category term="Web"/>
  1249.    <category term="dancer"/>
  1250.    <category term="systemd"/>
  1251.    <category term="web"/>
  1252.    <category term="wev dev"/>
  1253.  </entry>
  1254.  <entry>
  1255.    <title>Deploying Dancer Apps – The Next Generation</title>
  1256.    <link rel="alternate" href="https://dev.to/davorg/deploying-dancer-apps-the-next-generation-3nc8" type="text/html"/>
  1257.    <content type="html">&lt;p&gt;Last summer, I wrote a couple of posts about my lightweight, roll-your-own approach to deploying PSGI (Dancer) web apps:&lt;/p&gt;
  1258.  
  1259. &lt;ul&gt;
  1260. &lt;li&gt;&lt;a href="https://dev.to/davorg/deploying-dancer-apps-c0l"&gt;Deploying Dancer Apps&lt;/a&gt;&lt;/li&gt;
  1261. &lt;li&gt;&lt;a href="https://dev.to/davorg/deploying-dancer-apps-addendum-4a32"&gt;Deploying Dancer Apps: Addendum&lt;/a&gt;&lt;/li&gt;
  1262. &lt;/ul&gt;
  1263.  
  1264. &lt;p&gt;In those posts, I described how I avoided heavyweight deployment tools by writing a small, custom Perl script (&lt;code&gt;app_service&lt;/code&gt;) to start and manage them. It was minimal, transparent, and easy to replicate.&lt;/p&gt;
  1265.  
  1266. &lt;p&gt;It also wasn’t great.&lt;/p&gt;
  1267.  
  1268. &lt;h3&gt;
  1269.  
  1270.  
  1271.  What Changed?
  1272. &lt;/h3&gt;
  1273.  
  1274. &lt;p&gt;The system mostly worked, but it had a number of growing pains:&lt;/p&gt;
  1275.  
  1276. &lt;ul&gt;
  1277. &lt;li&gt;It didn’t integrate with the host operating system in a meaningful way.&lt;/li&gt;
  1278. &lt;li&gt;Services weren’t resilient — no automatic restarts on failure.&lt;/li&gt;
  1279. &lt;li&gt;There was no logging consolidation, no dependency management (e.g., waiting for the network), and no visibility in tools like &lt;code&gt;systemctl&lt;/code&gt;.&lt;/li&gt;
  1280. &lt;li&gt;If a service crashed, I’d usually find out via &lt;code&gt;curl&lt;/code&gt;, not &lt;code&gt;journalctl&lt;/code&gt;.&lt;/li&gt;
  1281. &lt;/ul&gt;
  1282.  
  1283. &lt;p&gt;As I started running more apps, this ad-hoc approach became harder to justify. It was time to grow up.&lt;/p&gt;
  1284.  
  1285. &lt;h3&gt;
  1286.  
  1287.  
  1288.  Enter &lt;code&gt;psgi-systemd-deploy&lt;/code&gt;
  1289. &lt;/h3&gt;
  1290.  
  1291. &lt;p&gt;So today (with some help from ChatGPT) I wrote &lt;a href="https://github.com/davorg/psgi-systemd-deploy" rel="noopener noreferrer"&gt;psgi-systemd-deploy&lt;/a&gt; — a simple, declarative deployment tool for PSGI apps that integrates directly with &lt;code&gt;systemd&lt;/code&gt;. It generates &lt;code&gt;.service&lt;/code&gt; files for your apps from environment-specific config and handles all the fiddly bits (paths, ports, logging, restart policies, etc.) with minimal fuss.&lt;/p&gt;
  1292.  
  1293. &lt;p&gt;Key benefits:&lt;/p&gt;
  1294.  
  1295. &lt;ul&gt;
  1296. &lt;li&gt;&lt;ul&gt;
  1297. &lt;li&gt;
  1298. &lt;strong&gt;Declarative config&lt;/strong&gt; via &lt;code&gt;.deploy.env&lt;/code&gt;
  1299. &lt;/li&gt;
  1300. &lt;li&gt;
  1301. &lt;strong&gt;Optional &lt;code&gt;.env&lt;/code&gt; file&lt;/strong&gt; support for application-specific settings&lt;/li&gt;
  1302. &lt;li&gt;
  1303. &lt;strong&gt;Environment-aware templating&lt;/strong&gt; using &lt;code&gt;envsubst&lt;/code&gt;
  1304. &lt;/li&gt;
  1305. &lt;li&gt;
  1306. &lt;strong&gt;No lock-in&lt;/strong&gt; — it just writes &lt;code&gt;systemd&lt;/code&gt; units you can inspect and manage yourself&lt;/li&gt;
  1307. &lt;/ul&gt;&lt;/li&gt;
  1308. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Safe&lt;/strong&gt; — supports a &lt;code&gt;--dry-run&lt;/code&gt; mode so you can preview changes before deploying&lt;/p&gt;&lt;/li&gt;
  1309. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Convenient&lt;/strong&gt; — includes a &lt;code&gt;run_all&lt;/code&gt; helper script for managing all your deployed apps with one command&lt;/p&gt;&lt;/li&gt;
  1310. &lt;/ul&gt;
  1311.  
  1312. &lt;h3&gt;
  1313.  
  1314.  
  1315.  A Real-World Example
  1316. &lt;/h3&gt;
  1317.  
  1318. &lt;p&gt;You may know about my &lt;a href="https://lineofsuccession.co.uk/" rel="noopener noreferrer"&gt;Line of Succession web site&lt;/a&gt; (&lt;a href="https://talks.davecross.co.uk/talk/im-a-republican-honest/" rel="noopener noreferrer"&gt;introductory talk&lt;/a&gt;). This is one of the Dancer apps I’ve been talking about. To deploy it, I wrote a &lt;code&gt;.deploy.env&lt;/code&gt; file that looks like this:&lt;br&gt;
  1319. &lt;/p&gt;
  1320.  
  1321. &lt;div class="highlight js-code-highlight"&gt;
  1322. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;WEBAPP_SERVICE_NAME=succession
  1323. WEBAPP_DESC="British Line of Succession"
  1324. WEBAPP_WORKDIR=/opt/succession
  1325. WEBAPP_USER=succession
  1326. WEBAPP_GROUP=psacln
  1327. WEBAPP_PORT=2222
  1328. WEBAPP_WORKER_COUNT=5
  1329. WEBAPP_APP_PRELOAD=1
  1330. &lt;/code&gt;&lt;/pre&gt;
  1331.  
  1332. &lt;/div&gt;
  1333.  
  1334.  
  1335.  
  1336. &lt;p&gt;And optionally a &lt;code&gt;.env&lt;/code&gt; file for app-specific settings (e.g., database credentials). Then I run:&lt;br&gt;
  1337. &lt;/p&gt;
  1338.  
  1339. &lt;div class="highlight js-code-highlight"&gt;
  1340. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ /path/to/psgi-systemd-deploy/deploy.sh
  1341. &lt;/code&gt;&lt;/pre&gt;
  1342.  
  1343. &lt;/div&gt;
  1344.  
  1345.  
  1346.  
  1347. &lt;p&gt;And that’s it. The app is now a first-class &lt;code&gt;systemd&lt;/code&gt; service, automatically started on boot and restartable with &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;
  1348.  
  1349. &lt;h3&gt;
  1350.  
  1351.  
  1352.  Managing All Your Apps with &lt;code&gt;run_all&lt;/code&gt;
  1353. &lt;/h3&gt;
  1354.  
  1355. &lt;p&gt;Once you’ve deployed several PSGI apps using &lt;code&gt;psgi-systemd-deploy&lt;/code&gt;, you’ll probably want an easy way to manage them all at once. That’s where the &lt;code&gt;run_all&lt;/code&gt; script comes in.&lt;/p&gt;
  1356.  
  1357. &lt;p&gt;It’s a simple but powerful wrapper around &lt;code&gt;systemctl&lt;/code&gt; that automatically discovers all deployed services by scanning for &lt;code&gt;.deploy.env&lt;/code&gt; files. That means no need to hard-code service names or paths — it just works, based on the configuration you’ve already provided.&lt;/p&gt;
  1358.  
  1359. &lt;p&gt;Here’s how you might use it:&lt;br&gt;
  1360. &lt;/p&gt;
  1361.  
  1362. &lt;div class="highlight js-code-highlight"&gt;
  1363. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Restart all PSGI apps
  1364. $ run_all restart
  1365.  
  1366. # Show current status
  1367. $ run_all status
  1368.  
  1369. # Stop them all (e.g., for maintenance)
  1370. $ run_all stop
  1371. &lt;/code&gt;&lt;/pre&gt;
  1372.  
  1373. &lt;/div&gt;
  1374.  
  1375.  
  1376.  
  1377. &lt;p&gt;And if you want machine-readable output for scripting or monitoring, there’s a &lt;code&gt;--json&lt;/code&gt; flag:&lt;br&gt;
  1378. &lt;/p&gt;
  1379.  
  1380. &lt;div class="highlight js-code-highlight"&gt;
  1381. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ run_all --json is-active | jq .
  1382. [
  1383.  {
  1384.    "service": "succession.service",
  1385.    "action": "is-active",
  1386.    "status": 0,
  1387.    "output": "active"
  1388.  },
  1389.  {
  1390.    "service": "klortho.service",
  1391.    "action": "is-active",
  1392.    "status": 0,
  1393.    "output": "active"
  1394.  }
  1395. ]
  1396. &lt;/code&gt;&lt;/pre&gt;
  1397.  
  1398. &lt;/div&gt;
  1399.  
  1400.  
  1401.  
  1402. &lt;p&gt;Under the hood, &lt;code&gt;run_all&lt;/code&gt; uses the same environment-driven model as the rest of the system — no surprises, no additional config files. It’s just a lightweight helper that understands your layout and automates the boring bits.&lt;/p&gt;
  1403.  
  1404. &lt;p&gt;It’s not a replacement for &lt;code&gt;systemctl&lt;/code&gt;, but it makes common tasks across many services far more convenient — especially during development, deployment, or server reboots.&lt;/p&gt;
  1405.  
  1406. &lt;h3&gt;
  1407.  
  1408.  
  1409.  A Clean Break
  1410. &lt;/h3&gt;
  1411.  
  1412. &lt;p&gt;The goal of &lt;code&gt;psgi-systemd-deploy&lt;/code&gt; isn’t to replace Docker, K8s, or full-featured PaaS systems. It’s for the rest of us — folks running VPSes or bare-metal boxes where PSGI apps just need to run reliably and predictably under the OS’s own tools.&lt;/p&gt;
  1413.  
  1414. &lt;p&gt;If you’ve been rolling your own init scripts, cron jobs, or &lt;code&gt;nohup&lt;/code&gt;-based hacks, give it a look. It’s clean, simple, and reliable — and a solid step up from duct tape.&lt;/p&gt;
  1415.  
  1416. &lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvofisouymgrtjlmza73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvofisouymgrtjlmza73.png" alt="➡" width="72" height="72"&gt;&lt;/a&gt; &lt;a href="https://github.com/davorg/psgi-systemd-deploy" rel="noopener noreferrer"&gt;View the code on GitHub&lt;/a&gt;&lt;/p&gt;
  1417.  
  1418. &lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/05/deploying-dancer-apps-the-next-generation/" rel="noopener noreferrer"&gt;Deploying Dancer Apps – The Next Generation&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com" rel="noopener noreferrer"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;
  1419.  
  1420. </content>
  1421.    <author>
  1422.      <name>Dave Cross</name>
  1423.    </author>
  1424.    <id>https://dev.to/davorg/deploying-dancer-apps-the-next-generation-3nc8</id>
  1425.    <published>2025-05-30T15:45:04Z</published>
  1426.    <updated>2025-05-30T15:45:04Z</updated>
  1427.    <category term="dancer"/>
  1428.    <category term="systemd"/>
  1429.    <category term="web"/>
  1430.  </entry>
  1431.  <entry>
  1432.    <title>Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter</title>
  1433.    <link rel="alternate" href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/" type="text/html"/>
  1434.    <content type="xhtml">
  1435.      <div xmlns="http://www.w3.org/1999/xhtml"><p class="" data-start="218" data-end="484">Like most developers, I have a mental folder labelled <strong data-start="272" data-end="324">“useful little tools I’ll probably never build.”</strong> Small utilities, quality-of-life scripts, automations — they’d save time, but not enough to justify the overhead of building them. So they stay stuck in limbo.</p>
  1436. <p class="" data-start="486" data-end="568">That changed when I started using AI as a regular part of my development workflow.</p>
  1437. <p class="" data-start="570" data-end="892">Now, when I hit one of those recurring minor annoyances — something just frictiony enough to slow me down — I open a ChatGPT tab. Twenty minutes later, I usually have a working solution. Not always perfect, but almost always 90% of the way there. And once that initial burst of momentum is going, finishing it off is easy.</p>
  1438. <p class="" data-start="894" data-end="985">It’s not quite mind-reading. But it <em data-start="930" data-end="934">is</em> like having a superpowered pair programmer on tap.</p>
  1439. <h2 class="" data-start="992" data-end="1006">The Problem</h2>
  1440. <p class="" data-start="1008" data-end="1309">Obviously, I do a lot of Perl development. When working on a Perl project, it’s common to have one or more <code data-start="1114" data-end="1120">lib/</code> directories in the repo that contain the project’s modules. To run test scripts or local tools, I often need to set the <code data-start="1241" data-end="1251">PERL5LIB</code> environment variable so that Perl can find those modules.</p>
  1441. <p class="" data-start="1311" data-end="1466">But I’ve got a lot of Perl projects — often nested in folders like <code data-start="1378" data-end="1385">~/git</code>, and sometimes with extra <code data-start="1412" data-end="1418">lib/</code> directories for testing or shared code.  And I switch between them frequently. Typing:</p>
  1442. <p/><pre class="urvanov-syntax-highlighter-plain-tag">export PERL5LIB=lib</pre><p/>
  1443. <p class="" data-start="1501" data-end="1645">…over and over gets boring fast. And worse, if you forget to do it, your test script breaks with a misleading “Can’t locate Foo/Bar.pm” error.</p>
  1444. <p class="" data-start="1647" data-end="1670">What I wanted was this:</p>
  1445. <ul data-start="1672" data-end="2086">
  1446. <li class="" data-start="1672" data-end="1796">
  1447. <p class="" data-start="1674" data-end="1796">Every time I <code data-start="1687" data-end="1691">cd</code> into a directory, if there are any valid <code data-start="1733" data-end="1739">lib/</code> subdirectories beneath it, set <code data-start="1771" data-end="1781">PERL5LIB</code> automatically.</p>
  1448. </li>
  1449. <li class="" data-start="1797" data-end="1858">
  1450. <p class="" data-start="1799" data-end="1858">Only include <code data-start="1812" data-end="1818">lib/</code> dirs that actually contain <code data-start="1846" data-end="1851">.pm</code> files.</p>
  1451. </li>
  1452. <li class="" data-start="1859" data-end="1942">
  1453. <p class="" data-start="1861" data-end="1942">Skip junk like <code data-start="1876" data-end="1885">.vscode</code>, <code data-start="1887" data-end="1894">blib</code>, and old release folders like <code data-start="1925" data-end="1941">MyModule-1.23/</code>.</p>
  1454. </li>
  1455. <li class="" data-start="1943" data-end="2023">
  1456. <p class="" data-start="1945" data-end="2023">Don’t scan the entire world if I <code data-start="1978" data-end="1988">cd ~/git</code>, which contains hundreds of repos.</p>
  1457. </li>
  1458. <li class="" data-start="2024" data-end="2086">
  1459. <p class="" data-start="2026" data-end="2086">Show me what it’s doing, and let me test it in dry-run mode.</p>
  1460. </li>
  1461. </ul>
  1462. <h2 class="" data-start="2093" data-end="2108">The Solution</h2>
  1463. <p class="" data-start="2110" data-end="2290">With ChatGPT, I built a drop-in Bash function in about half an hour that does exactly that. It’s now saved as <a class="" href="https://github.com/davorg/perl5lib_auto" target="_new" rel="noopener" data-start="2220" data-end="2281"><code data-start="2221" data-end="2239">perl5lib_auto.sh</code></a>, and it:</p>
  1464. <ul data-start="2292" data-end="2789">
  1465. <li class="" data-start="2292" data-end="2353">
  1466. <p class="" data-start="2294" data-end="2353">Wraps <code data-start="2300" data-end="2306">cd()</code> to trigger a scan after every directory change</p>
  1467. </li>
  1468. <li class="" data-start="2354" data-end="2425">
  1469. <p class="" data-start="2356" data-end="2425">Finds all qualifying <code data-start="2377" data-end="2383">lib/</code> directories beneath the current directory</p>
  1470. </li>
  1471. <li class="" data-start="2426" data-end="2560">
  1472. <p class="" data-start="2428" data-end="2460">Filters them using simple rules:</p>
  1473. <ul data-start="2463" data-end="2560">
  1474. <li class="" data-start="2463" data-end="2489">
  1475. <p class="" data-start="2465" data-end="2489">Must contain <code data-start="2478" data-end="2483">.pm</code> files</p>
  1476. </li>
  1477. <li class="" data-start="2492" data-end="2560">
  1478. <p class="" data-start="2494" data-end="2560">Must not be under <code data-start="2512" data-end="2522">.vscode/</code>, <code data-start="2524" data-end="2532">.blib/</code>, or versioned build folders</p>
  1479. </li>
  1480. </ul>
  1481. </li>
  1482. <li class="" data-start="2561" data-end="2628">
  1483. <p class="" data-start="2563" data-end="2628">Excludes specific top-level directories (like <code data-start="2609" data-end="2616">~/git</code>) by default</p>
  1484. </li>
  1485. <li class="" data-start="2629" data-end="2686">
  1486. <p class="" data-start="2631" data-end="2686">Lets you configure everything via environment variables</p>
  1487. </li>
  1488. <li class="" data-start="2687" data-end="2735">
  1489. <p class="" data-start="2689" data-end="2735">Offers <code data-start="2696" data-end="2705">verbose</code>, <code data-start="2707" data-end="2716">dry-run</code>, and <code data-start="2722" data-end="2729">force</code> modes</p>
  1490. </li>
  1491. <li class="" data-start="2736" data-end="2789">
  1492. <p class="" data-start="2738" data-end="2789">Can append to or overwrite your existing <code data-start="2779" data-end="2789">PERL5LIB</code></p>
  1493. </li>
  1494. </ul>
  1495. <p class="" data-start="2791" data-end="2896">You drop it in your <code data-start="2811" data-end="2822">~/.bashrc</code> (or wherever you like), and your shell just becomes a little bit smarter.</p>
  1496. <h2 data-start="2791" data-end="2896">Usage Example</h2>
  1497. <p/><pre class="urvanov-syntax-highlighter-plain-tag">source ~/bin/perl5lib_auto.sh
  1498.  
  1499. cd ~/code/MyModule
  1500. # =&gt; PERL5LIB set to: /home/user/code/MyModule/lib
  1501.  
  1502. PERL5LIB_VERBOSE=1 cd ~/code/AnotherApp
  1503. # =&gt; [PERL5LIB] Found 2 eligible lib dir(s):
  1504. # =&gt;   /home/user/code/AnotherApp/lib
  1505. # =&gt;   /home/user/code/AnotherApp/t/lib
  1506. # =&gt; PERL5LIB set to: /home/user/code/AnotherApp/lib:/home/user/code/AnotherApp/t/lib</pre><p>You can also set environment variables to customise behaviour:</p><pre class="urvanov-syntax-highlighter-plain-tag">export PERL5LIB_EXCLUDE_DIRS="$HOME/git:$HOME/legacy"
  1507. export PERL5LIB_EXCLUDE_PATTERNS=".vscode:blib"
  1508. export PERL5LIB_LIB_CAP=5
  1509. export PERL5LIB_APPEND=1</pre><p/>
  1510. <p class="" data-start="3516" data-end="3545">Or simulate what it would do:</p>
  1511. <p/><pre class="urvanov-syntax-highlighter-plain-tag">PERL5LIB_DRYRUN=1 cd ~/code/BigProject</pre><p/>
  1512. <h2 class="" data-start="3604" data-end="3622">Try It Yourself</h2>
  1513. <p class="" data-start="3624" data-end="3663">The full script is available on GitHub:</p>
  1514. <p class="" data-start="3665" data-end="3750"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;"/> <a class="" href="https://github.com/davorg/perl5lib_auto" target="_new" rel="noopener" data-start="3668" data-end="3750">https://github.com/davorg/perl5lib_auto</a></p>
  1515. <p class="" data-start="3752" data-end="3824">I’d love to hear how you use it — or how you’d improve it. Feel free to:</p>
  1516. <ul data-start="3825" data-end="3957">
  1517. <li class="" data-start="3825" data-end="3842">
  1518. <p class="" data-start="3827" data-end="3842"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;"/> Star the repo</p>
  1519. </li>
  1520. <li class="" data-start="3843" data-end="3883">
  1521. <p class="" data-start="3845" data-end="3883"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f41b.png" alt="🐛" class="wp-smiley" style="height: 1em; max-height: 1em;"/> Open issues for suggestions or bugs</p>
  1522. </li>
  1523. <li class="" data-start="3884" data-end="3957">
  1524. <p class="" data-start="3886" data-end="3957"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f500.png" alt="🔀" class="wp-smiley" style="height: 1em; max-height: 1em;"/> Send pull requests with fixes, improvements, or completely new ideas</p>
  1525. </li>
  1526. </ul>
  1527. <p class="" data-start="3959" data-end="4172">It’s a small tool, but it’s already saved me a surprising amount of friction. If you’re a Perl hacker who jumps between projects regularly, give it a try — and maybe give AI co-coding a try too while you’re at it.</p>
  1528. <p data-start="3959" data-end="4172">What useful little utilities have you written with help from an AI pair-programmer?</p><p>The post <a href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/">Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1529.    </content>
  1530.    <summary type="xhtml">
  1531.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Like most developers, I have a mental folder labelled “useful little tools I’ll probably never build.” Small utilities, quality-of-life scripts, automations — they’d save time, but not enough to justify the overhead of building them. So they stay stuck in limbo. That changed when I started using AI as a regular part of my development […]</p>
  1532. <p>The post <a href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/">Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1533.    </summary>
  1534.    <author>
  1535.      <name>Dave Cross</name>
  1536.    </author>
  1537.    <id>https://perlhacks.com/?p=2309</id>
  1538.    <published>2025-05-14T16:22:11Z</published>
  1539.    <updated>2025-05-14T16:22:11Z</updated>
  1540.    <category term="Programming"/>
  1541.    <category term="AI-Assisted Development"/>
  1542.    <category term="Developer Productivity"/>
  1543.    <category term="perl"/>
  1544.    <category term="Shell Scripting"/>
  1545.  </entry>
  1546.  <entry>
  1547.    <title>Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter</title>
  1548.    <link rel="alternate" href="https://dev.to/davorg/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter-5ccp" type="text/html"/>
  1549.    <content type="html">&lt;p&gt;Like most developers, I have a mental folder labelled &lt;strong&gt;“useful little tools I’ll probably never build.”&lt;/strong&gt; Small utilities, quality-of-life scripts, automations — they’d save time, but not enough to justify the overhead of building them. So they stay stuck in limbo.&lt;/p&gt;
  1550.  
  1551. &lt;p&gt;That changed when I started using AI as a regular part of my development workflow.&lt;/p&gt;
  1552.  
  1553. &lt;p&gt;Now, when I hit one of those recurring minor annoyances — something just frictiony enough to slow me down — I open a ChatGPT tab. Twenty minutes later, I usually have a working solution. Not always perfect, but almost always 90% of the way there. And once that initial burst of momentum is going, finishing it off is easy.&lt;/p&gt;
  1554.  
  1555. &lt;p&gt;It’s not quite mind-reading. But it &lt;em&gt;is&lt;/em&gt; like having a superpowered pair programmer on tap.&lt;/p&gt;
  1556.  
  1557. &lt;h2&gt;
  1558.  
  1559.  
  1560.  The Problem
  1561. &lt;/h2&gt;
  1562.  
  1563. &lt;p&gt;Obviously, I do a lot of Perl development. When working on a Perl project, it’s common to have one or more &lt;code&gt;lib/&lt;/code&gt; directories in the repo that contain the project’s modules. To run test scripts or local tools, I often need to set the &lt;code&gt;PERL5LIB&lt;/code&gt; environment variable so that Perl can find those modules.&lt;/p&gt;
  1564.  
  1565. &lt;p&gt;But I’ve got a lot of Perl projects — often nested in folders like &lt;code&gt;~/git&lt;/code&gt;, and sometimes with extra &lt;code&gt;lib/&lt;/code&gt; directories for testing or shared code.  And I switch between them frequently. Typing:&lt;br&gt;
  1566. &lt;/p&gt;
  1567.  
  1568. &lt;div class="highlight js-code-highlight"&gt;
  1569. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PERL5LIB=lib
  1570. &lt;/code&gt;&lt;/pre&gt;
  1571.  
  1572. &lt;/div&gt;
  1573.  
  1574.  
  1575.  
  1576. &lt;p&gt;…over and over gets boring fast. And worse, if you forget to do it, your test script breaks with a misleading “Can’t locate Foo/Bar.pm” error.&lt;/p&gt;
  1577.  
  1578. &lt;p&gt;What I wanted was this:&lt;/p&gt;
  1579.  
  1580. &lt;ul&gt;
  1581. &lt;li&gt;&lt;p&gt;Every time I &lt;code&gt;cd&lt;/code&gt; into a directory, if there are any valid &lt;code&gt;lib/&lt;/code&gt; subdirectories beneath it, set &lt;code&gt;PERL5LIB&lt;/code&gt; automatically.&lt;/p&gt;&lt;/li&gt;
  1582. &lt;li&gt;&lt;p&gt;Only include &lt;code&gt;lib/&lt;/code&gt; dirs that actually contain &lt;code&gt;.pm&lt;/code&gt; files.&lt;/p&gt;&lt;/li&gt;
  1583. &lt;li&gt;&lt;p&gt;Skip junk like &lt;code&gt;.vscode&lt;/code&gt;, &lt;code&gt;blib&lt;/code&gt;, and old release folders like &lt;code&gt;MyModule-1.23/&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
  1584. &lt;li&gt;&lt;p&gt;Don’t scan the entire world if I &lt;code&gt;cd ~/git&lt;/code&gt;, which contains hundreds of repos.&lt;/p&gt;&lt;/li&gt;
  1585. &lt;li&gt;&lt;p&gt;Show me what it’s doing, and let me test it in dry-run mode.&lt;/p&gt;&lt;/li&gt;
  1586. &lt;/ul&gt;
  1587.  
  1588. &lt;h2&gt;
  1589.  
  1590.  
  1591.  The Solution
  1592. &lt;/h2&gt;
  1593.  
  1594. &lt;p&gt;With ChatGPT, I built a drop-in Bash function in about half an hour that does exactly that. It’s now saved as &lt;a href="https://github.com/davorg/perl5lib_auto" rel="noopener noreferrer"&gt;&lt;code&gt;perl5lib_auto.sh&lt;/code&gt;&lt;/a&gt;, and it:&lt;/p&gt;
  1595.  
  1596. &lt;ul&gt;
  1597. &lt;li&gt;&lt;p&gt;Wraps &lt;code&gt;cd()&lt;/code&gt; to trigger a scan after every directory change&lt;/p&gt;&lt;/li&gt;
  1598. &lt;li&gt;&lt;p&gt;Finds all qualifying &lt;code&gt;lib/&lt;/code&gt; directories beneath the current directory&lt;/p&gt;&lt;/li&gt;
  1599. &lt;li&gt;&lt;p&gt;Filters them using simple rules:&lt;/p&gt;&lt;/li&gt;
  1600. &lt;li&gt;&lt;p&gt;Excludes specific top-level directories (like &lt;code&gt;~/git&lt;/code&gt;) by default&lt;/p&gt;&lt;/li&gt;
  1601. &lt;li&gt;&lt;p&gt;Lets you configure everything via environment variables&lt;/p&gt;&lt;/li&gt;
  1602. &lt;li&gt;&lt;p&gt;Offers &lt;code&gt;verbose&lt;/code&gt;, &lt;code&gt;dry-run&lt;/code&gt;, and &lt;code&gt;force&lt;/code&gt; modes&lt;/p&gt;&lt;/li&gt;
  1603. &lt;li&gt;&lt;p&gt;Can append to or overwrite your existing &lt;code&gt;PERL5LIB&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
  1604. &lt;/ul&gt;
  1605.  
  1606. &lt;p&gt;You drop it in your &lt;code&gt;~/.bashrc&lt;/code&gt; (or wherever you like), and your shell just becomes a little bit smarter.&lt;/p&gt;
  1607.  
  1608. &lt;h2&gt;
  1609.  
  1610.  
  1611.  Usage Example
  1612. &lt;/h2&gt;
  1613.  
  1614.  
  1615.  
  1616. &lt;div class="highlight js-code-highlight"&gt;
  1617. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;source ~/bin/perl5lib_auto.sh
  1618.  
  1619. cd ~/code/MyModule
  1620. # =&amp;gt; PERL5LIB set to: /home/user/code/MyModule/lib
  1621.  
  1622. PERL5LIB_VERBOSE=1 cd ~/code/AnotherApp
  1623. # =&amp;gt; [PERL5LIB] Found 2 eligible lib dir(s):
  1624. # =&amp;gt; /home/user/code/AnotherApp/lib
  1625. # =&amp;gt; /home/user/code/AnotherApp/t/lib
  1626. # =&amp;gt; PERL5LIB set to: /home/user/code/AnotherApp/lib:/home/user/code/AnotherApp/t/lib
  1627. &lt;/code&gt;&lt;/pre&gt;
  1628.  
  1629. &lt;/div&gt;
  1630.  
  1631.  
  1632.  
  1633. &lt;p&gt;You can also set environment variables to customise behaviour:&lt;br&gt;
  1634. &lt;/p&gt;
  1635.  
  1636. &lt;div class="highlight js-code-highlight"&gt;
  1637. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PERL5LIB_EXCLUDE_DIRS="$HOME/git:$HOME/legacy"
  1638. export PERL5LIB_EXCLUDE_PATTERNS=".vscode:blib"
  1639. export PERL5LIB_LIB_CAP=5
  1640. export PERL5LIB_APPEND=1
  1641. &lt;/code&gt;&lt;/pre&gt;
  1642.  
  1643. &lt;/div&gt;
  1644.  
  1645.  
  1646.  
  1647. &lt;p&gt;Or simulate what it would do:&lt;br&gt;
  1648. &lt;/p&gt;
  1649.  
  1650. &lt;div class="highlight js-code-highlight"&gt;
  1651. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;PERL5LIB_DRYRUN=1 cd ~/code/BigProject
  1652. &lt;/code&gt;&lt;/pre&gt;
  1653.  
  1654. &lt;/div&gt;
  1655.  
  1656.  
  1657.  
  1658. &lt;h2&gt;
  1659.  
  1660.  
  1661.  Try It Yourself
  1662. &lt;/h2&gt;
  1663.  
  1664. &lt;p&gt;The full script is available on GitHub:&lt;/p&gt;
  1665.  
  1666. &lt;ul&gt;
  1667. &lt;li&gt;👉 &lt;a href="https://github.com/davorg/perl5lib_auto" rel="noopener noreferrer"&gt;https://github.com/davorg/perl5lib_auto&lt;/a&gt;
  1668. &lt;/li&gt;
  1669. &lt;/ul&gt;
  1670.  
  1671. &lt;p&gt;I’d love to hear how you use it — or how you’d improve it. Feel free to:&lt;/p&gt;
  1672.  
  1673. &lt;ul&gt;
  1674. &lt;li&gt;&lt;p&gt;⭐ Star the repo&lt;/p&gt;&lt;/li&gt;
  1675. &lt;li&gt;&lt;p&gt;🐛 Open issues for suggestions or bugs&lt;/p&gt;&lt;/li&gt;
  1676. &lt;li&gt;&lt;p&gt;🔀 Send pull requests with fixes, improvements, or completely new ideas&lt;/p&gt;&lt;/li&gt;
  1677. &lt;/ul&gt;
  1678.  
  1679. &lt;p&gt;It’s a small tool, but it’s already saved me a surprising amount of friction. If you’re a Perl hacker who jumps between projects regularly, give it a try — and maybe give AI co-coding a try too while you’re at it.&lt;/p&gt;
  1680.  
  1681. &lt;p&gt;What useful little utilities have you written with help from an AI pair-programmer?&lt;/p&gt;
  1682.  
  1683.  
  1684.  
  1685.  
  1686. &lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/" rel="noopener noreferrer"&gt;Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com" rel="noopener noreferrer"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;
  1687.  
  1688. </content>
  1689.    <author>
  1690.      <name>Dave Cross</name>
  1691.    </author>
  1692.    <id>https://dev.to/davorg/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter-5ccp</id>
  1693.    <published>2025-05-14T16:22:11Z</published>
  1694.    <updated>2025-05-14T16:22:11Z</updated>
  1695.    <category term="programming"/>
  1696.    <category term="aiassisteddev"/>
  1697.    <category term="devproductivity"/>
  1698.    <category term="perl"/>
  1699.  </entry>
  1700.  <entry>
  1701.    <title>Reformating images with App::BlurFill</title>
  1702.    <link rel="alternate" href="https://perlhacks.com/2025/05/reformating-images-with-appblurfill/" type="text/html"/>
  1703.    <content type="xhtml">
  1704.      <div xmlns="http://www.w3.org/1999/xhtml"><p>You might know that I publish books about Perl at <a href="https://perlschool.com/">Perl School</a>. What you might now know is that I also publish more general technical books at <a href="https://claphamtechpress.com/">Clapham Technical Press</a>. If you scroll down to the bottom of that page, you’ll see a list of the books that I’ve published. You’ll also see evidence of the problem I’ve been solving this morning.</p>
  1705. <p>Books tend to have covers that are in a portrait aspect ratio. But the template I’m using to display them requires images in a landscape aspect ratio. This is a common enough problem. And, of course, we’ve developed a common way of getting around it. You’ll see it on that page. We create a larger version of the image (large enough to fill the width of where the image is displayed), apply some level of Gaussian blur to the image and insert a new copy of the image over that. So we get our original image with a tastefully blurred background which echoes the colour of the image. ChatGPT tells me this is called a “Blurred Fill”.</p>
  1706. <p>So that’s all good. But as I’m publishing more books, I need to create these images on a pretty regular basis. And, of course, if I do something more than three or four times, I will want to automate.</p>
  1707. <p>A while ago, I wrote a simple program called “<a href="https://github.com/davorg/claphamtechpress/blob/master/bin/blur">blur</a>” that used <a href="https://metacpan.org/pod/Imager">Imager</a> to apply the correct transformations to an image. But this morning, I decided I should really make that program a bit more useful. And release it to CPAN. So that’s what I’ve been doing.</p>
  1708. <h2>The Problem</h2>
  1709. <p>Adjusting images to fit various aspect ratios without losing essential content or introducing unsightly borders is a frequent challenge. Manually creating a blurred background for each image is time-consuming and inefficient, especially when dealing with multiple images or integrating into automated workflows.</p>
  1710. <h2>The Solution: App::BlurFill</h2>
  1711. <p><a href="https://metacpan.org/pod/App::BlurFill"><strong>App::BlurFill</strong></a> is a Perl module and CLI tool designed to streamline the process of creating images with blurred backgrounds. It takes an input image and generates a new image where the original is centred over a blurred version of itself, adjusted to the specified dimensions.</p>
  1712. <h2>How It Works</h2>
  1713. <ol>
  1714. <li><strong>Input</strong>: Provide the source image along with the desired width and height.</li>
  1715. <li><strong>Processing:</strong>
  1716. <ul>
  1717. <li>The tool creates a blurred version of the original image to serve as the background.</li>
  1718. <li>It then overlays the original image, centred, onto this background.</li>
  1719. </ul>
  1720. </li>
  1721. <li><strong>Output:</strong> A new image file with the specified dimensions, combining the original image and its blurred background.</li>
  1722. </ol>
  1723. <h2>Installation and Usage</h2>
  1724. <p>Install via CPAN:</p><pre class="urvanov-syntax-highlighter-plain-tag">cpanm App::BlurFill</pre><p>Then to use the CLI tool:</p><pre class="urvanov-syntax-highlighter-plain-tag">blurfill --width=800 --height=600 input.jpg</pre><p>This command will generate <code>input_blur.jpg</code> with the specified dimensions.</p>
  1725. <h2>Web API</h2>
  1726. <p>App::BlurFill also includes a web interface built with Dancer2. You can start the web server and send POST requests with an image file to receive the processed image in response.</p>
  1727. <p>Example using <code>curl</code>:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -OJ -X POST http://localhost:5000/blur -F "image=@input.jpg"</pre><p>The response will be the new image file, ready for use.</p>
  1728. <h2>Under the Hood</h2>
  1729. <p>App::BlurFill is written in Perl 5.40, using the new <a href="https://perldoc.perl.org/perlclass">perlclass</a> feature. It makes use of the <code>Imager</code> module for image processing tasks. Currently, it supports JPG, PNG and GIF.</p>
  1730. <h2>What’s Next?</h2>
  1731. <p>Future enhancements may include:</p>
  1732. <ul>
  1733. <li>Support for modern image formats like WebP.</li>
  1734. <li>More customisation options.</li>
  1735. <li>A Docker container to make it easier to set up and use.</li>
  1736. <li>Maybe a hosted version. Maybe it’s even a business idea.</li>
  1737. </ul>
  1738. <p>App::Blurred aims to simplify the task of creating visually consistent images across various platforms and devices. Feedback and contributions are welcome to help improve its functionality and usability.</p>
  1739. <p>Please let me know if you find it useful or if there are extra features you would find useful.</p>
  1740. <p>Oh, and why not buy some <a href="https://claphamtechpress.com/">Clapham Technical Press</a> books!</p>
  1741. <p><strong>Update:</strong> I forgot to include a link to the GitHub repository. It’s at https://github.com/davorg-cpan/app-blurfill</p><p>The post <a href="https://perlhacks.com/2025/05/reformating-images-with-appblurfill/">Reformating images with App::BlurFill</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1742.    </content>
  1743.    <summary type="xhtml">
  1744.      <div xmlns="http://www.w3.org/1999/xhtml"><p>You might know that I publish books about Perl at Perl School. What you might now know is that I also publish more general technical books at Clapham Technical Press. If you scroll down to the bottom of that page, you’ll see a list of the books that I’ve published. You’ll also see evidence of […]</p>
  1745. <p>The post <a href="https://perlhacks.com/2025/05/reformating-images-with-appblurfill/">Reformating images with App::BlurFill</a> first appeared on <a href="https://perlhacks.com">Perl Hacks</a>.</p></div>
  1746.    </summary>
  1747.    <author>
  1748.      <name>Dave Cross</name>
  1749.    </author>
  1750.    <id>https://perlhacks.com/?p=2303</id>
  1751.    <published>2025-05-11T12:38:22Z</published>
  1752.    <updated>2025-05-11T12:38:22Z</updated>
  1753.    <category term="CPAN"/>
  1754.    <category term="blur fill"/>
  1755.    <category term="cpan"/>
  1756.    <category term="images"/>
  1757.  </entry>
  1758.  <entry>
  1759.    <title>Reformating images with App::BlurFill</title>
  1760.    <link rel="alternate" href="https://dev.to/davorg/reformating-images-with-appblurfill-4c0g" type="text/html"/>
  1761.    <content type="html">&lt;p&gt;You might know that I publish books about Perl at &lt;a href="https://perlschool.com/" rel="noopener noreferrer"&gt;Perl School&lt;/a&gt;. What you might now know is that I also publish more general technical books at &lt;a href="https://claphamtechpress.com/" rel="noopener noreferrer"&gt;Clapham Technical Press&lt;/a&gt;. If you scroll down to the bottom of that page, you’ll see a list of the books that I’ve published. You’ll also see evidence of the problem I’ve been solving this morning.&lt;/p&gt;
  1762.  
  1763. &lt;p&gt;Books tend to have covers that are in a portrait aspect ratio. But the template I’m using to display them requires images in a landscape aspect ratio. This is a common enough problem. And, of course, we’ve developed a common way of getting around it. You’ll see it on that page. We create a larger version of the image (large enough to fill the width of where the image is displayed), apply some level of Gaussian blur to the image and insert a new copy of the image over that. So we get our original image with a tastefully blurred background which echoes the colour of the image. ChatGPT tells me this is called a “Blurred Fill”.&lt;/p&gt;
  1764.  
  1765. &lt;p&gt;So that’s all good. But as I’m publishing more books, I need to create these images on a pretty regular basis. And, of course, if I do something more than three or four times, I will want to automate.&lt;/p&gt;
  1766.  
  1767. &lt;p&gt;A while ago, I wrote a simple program called “&lt;a href="https://github.com/davorg/claphamtechpress/blob/master/bin/blur" rel="noopener noreferrer"&gt;blur&lt;/a&gt;” that used &lt;a href="https://metacpan.org/pod/Imager" rel="noopener noreferrer"&gt;Imager&lt;/a&gt; to apply the correct transformations to an image. But this morning, I decided I should really make that program a bit more useful. And release it to CPAN. So that’s what I’ve been doing.&lt;/p&gt;
  1768.  
  1769. &lt;h2&gt;
  1770.  
  1771.  
  1772.  The Problem
  1773. &lt;/h2&gt;
  1774.  
  1775. &lt;p&gt;Adjusting images to fit various aspect ratios without losing essential content or introducing unsightly borders is a frequent challenge. Manually creating a blurred background for each image is time-consuming and inefficient, especially when dealing with multiple images or integrating into automated workflows.&lt;/p&gt;
  1776.  
  1777. &lt;h2&gt;
  1778.  
  1779.  
  1780.  The Solution: App::BlurFill
  1781. &lt;/h2&gt;
  1782.  
  1783. &lt;p&gt;&lt;a href="https://metacpan.org/pod/App::BlurFill" rel="noopener noreferrer"&gt;&lt;strong&gt;App::BlurFill&lt;/strong&gt;&lt;/a&gt; is a Perl module and CLI tool designed to streamline the process of creating images with blurred backgrounds. It takes an input image and generates a new image where the original is centred over a blurred version of itself, adjusted to the specified dimensions.&lt;/p&gt;
  1784.  
  1785. &lt;h2&gt;
  1786.  
  1787.  
  1788.  How It Works
  1789. &lt;/h2&gt;
  1790.  
  1791. &lt;ol&gt;
  1792. &lt;li&gt;
  1793. &lt;strong&gt;Input&lt;/strong&gt; : Provide the source image along with the desired width and height.&lt;/li&gt;
  1794. &lt;li&gt;
  1795. &lt;strong&gt;Processing:&lt;/strong&gt;
  1796.  
  1797. &lt;ul&gt;
  1798. &lt;li&gt;The tool creates a blurred version of the original image to serve as the background.&lt;/li&gt;
  1799. &lt;li&gt;It then overlays the original image, centred, onto this background.&lt;/li&gt;
  1800. &lt;/ul&gt;
  1801. &lt;/li&gt;
  1802. &lt;li&gt;
  1803. &lt;strong&gt;Output:&lt;/strong&gt; A new image file with the specified dimensions, combining the original image and its blurred background.&lt;/li&gt;
  1804. &lt;/ol&gt;
  1805.  
  1806. &lt;h2&gt;
  1807.  
  1808.  
  1809.  Installation and Usage
  1810. &lt;/h2&gt;
  1811.  
  1812. &lt;p&gt;Install via CPAN:&lt;br&gt;
  1813. &lt;/p&gt;
  1814.  
  1815. &lt;div class="highlight js-code-highlight"&gt;
  1816. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;cpanm App::BlurFill
  1817. &lt;/code&gt;&lt;/pre&gt;
  1818.  
  1819. &lt;/div&gt;
  1820.  
  1821.  
  1822.  
  1823. &lt;p&gt;Then to use the CLI tool:&lt;br&gt;
  1824. &lt;/p&gt;
  1825.  
  1826. &lt;div class="highlight js-code-highlight"&gt;
  1827. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;blurfill --width=800 --height=600 input.jpg
  1828. &lt;/code&gt;&lt;/pre&gt;
  1829.  
  1830. &lt;/div&gt;
  1831.  
  1832.  
  1833.  
  1834. &lt;p&gt;This command will generate &lt;code&gt;input_blur.jpg&lt;/code&gt; with the specified dimensions.&lt;/p&gt;
  1835.  
  1836. &lt;h2&gt;
  1837.  
  1838.  
  1839.  Web API
  1840. &lt;/h2&gt;
  1841.  
  1842. &lt;p&gt;App::BlurFill also includes a web interface built with Dancer2. You can start the web server and send POST requests with an image file to receive the processed image in response.&lt;/p&gt;
  1843.  
  1844. &lt;p&gt;Example using &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
  1845. &lt;/p&gt;
  1846.  
  1847. &lt;div class="highlight js-code-highlight"&gt;
  1848. &lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -OJ -X POST http://localhost:5000/blur -F "image=@input.jpg"
  1849. &lt;/code&gt;&lt;/pre&gt;
  1850.  
  1851. &lt;/div&gt;
  1852.  
  1853.  
  1854.  
  1855. &lt;p&gt;The response will be the new image file, ready for use.&lt;/p&gt;
  1856.  
  1857. &lt;h2&gt;
  1858.  
  1859.  
  1860.  Under the Hood
  1861. &lt;/h2&gt;
  1862.  
  1863. &lt;p&gt;App::BlurFill is written in Perl 5.40, using the new &lt;a href="https://perldoc.perl.org/perlclass" rel="noopener noreferrer"&gt;perlclass&lt;/a&gt; feature. It makes use of the &lt;code&gt;Imager&lt;/code&gt; module for image processing tasks. Currently, it supports JPG, PNG and GIF.&lt;/p&gt;
  1864.  
  1865. &lt;h2&gt;
  1866.  
  1867.  
  1868.  What’s Next?
  1869. &lt;/h2&gt;
  1870.  
  1871. &lt;p&gt;Future enhancements may include:&lt;/p&gt;
  1872.  
  1873. &lt;ul&gt;
  1874. &lt;li&gt;Support for modern image formats like WebP.&lt;/li&gt;
  1875. &lt;li&gt;More customisation options.&lt;/li&gt;
  1876. &lt;li&gt;A Docker container to make it easier to set up and use.&lt;/li&gt;
  1877. &lt;li&gt;Maybe a hosted version. Maybe it’s even a business idea.&lt;/li&gt;
  1878. &lt;/ul&gt;
  1879.  
  1880. &lt;p&gt;App::Blurred aims to simplify the task of creating visually consistent images across various platforms and devices. Feedback and contributions are welcome to help improve its functionality and usability.&lt;/p&gt;
  1881.  
  1882. &lt;p&gt;Please let me know if you find it useful or if there are extra features you would find useful.&lt;/p&gt;
  1883.  
  1884. &lt;p&gt;Oh, and why not buy some &lt;a href="https://claphamtechpress.com/" rel="noopener noreferrer"&gt;Clapham Technical Press&lt;/a&gt; books!&lt;/p&gt;
  1885.  
  1886. &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I forgot to include a link to the GitHub repository. It's at &lt;a href="https://github.com/davorg-cpan/app-blurfill" rel="noopener noreferrer"&gt;https://github.com/davorg-cpan/app-blurfill&lt;/a&gt;&lt;/p&gt;
  1887.  
  1888.  
  1889.  
  1890.  
  1891. &lt;p&gt;The post &lt;a href="https://perlhacks.com/2025/05/reformating-images-with-appblurfill/" rel="noopener noreferrer"&gt;Reformating images with App::BlurFill&lt;/a&gt; first appeared on &lt;a href="https://perlhacks.com" rel="noopener noreferrer"&gt;Perl Hacks&lt;/a&gt;.&lt;/p&gt;
  1892.  
  1893. </content>
  1894.    <author>
  1895.      <name>Dave Cross</name>
  1896.    </author>
  1897.    <id>https://dev.to/davorg/reformating-images-with-appblurfill-4c0g</id>
  1898.    <published>2025-05-11T12:38:22Z</published>
  1899.    <updated>2025-05-11T12:38:22Z</updated>
  1900.    <category term="cpan"/>
  1901.    <category term="images"/>
  1902.    <category term="blurfill"/>
  1903.  </entry>
  1904.  <entry>
  1905.    <title>The Bible Says So: What We Get Right (and Wrong) About Scripture’s Most Controversial Issues</title>
  1906.    <link rel="alternate" href="https://www.goodreads.com/review/show/7548453713?utm_medium=api&amp;utm_source=rss" type="text/html"/>
  1907.    <content type="xhtml">
  1908.      <div xmlns="http://www.w3.org/1999/xhtml">
  1909.      
  1910.      <a href="https://www.goodreads.com/book/show/217872710-the-bible-says-so?utm_medium=api&amp;utm_source=rss"><img alt="The Bible Says So: What We Get Right (and Wrong) About Scripture’s Most Controversial Issues" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1726721586l/217872710._SY75_.jpg"/></a><br/>
  1911.                                      author: Daniel McClellan<br/>
  1912.                                      name: David<br/>
  1913.                                      average rating: 4.60<br/>
  1914.                                      book published: <br/>
  1915.                                      rating: 0<br/>
  1916.                                      read at: <br/>
  1917.                                      date added: 2025/05/06<br/>
  1918.                                      shelves: currently-reading<br/>
  1919.                                      review: <br/><br/>
  1920.                                      
  1921.    </div>
  1922.    </content>
  1923.    <id>https://www.goodreads.com/review/show/7548453713?utm_medium=api&amp;utm_source=rss</id>
  1924.    <published>2025-05-06T13:30:30-07:00</published>
  1925.    <updated>2025-05-06T13:30:30-07:00</updated>
  1926.  </entry>
  1927.  <entry>
  1928.    <title>Building a website in a day — with help from ChatGPT</title>
  1929.    <link rel="alternate" href="https://davorg.medium.com/building-a-website-in-a-day-with-help-from-chatgpt-b87780d287d9?source=rss-3781feb8a4f4------2" type="text/html"/>
  1930.    <content type="html">&lt;h3&gt;Building a website in a day — with help from ChatGPT&lt;/h3&gt;&lt;figure&gt;&lt;img alt="" src="https://cdn-images-1.medium.com/max/909/0*l-ixlfAyPNXpsOXN.png" /&gt;&lt;/figure&gt;&lt;p&gt;A few days ago, I looked at an unused domain I owned — &lt;a href="https://balham.org"&gt;balham.org&lt;/a&gt; — and thought: &lt;em&gt;“There must be a way to make this useful… and maybe even make it pay for itself.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;So I set myself a challenge: &lt;strong&gt;one day to build something genuinely useful.&lt;/strong&gt; A site that served a real audience (people in and around Balham), that was fun to build, and maybe could be turned into a small revenue stream.&lt;/p&gt;&lt;p&gt;It was also a great excuse to get properly stuck into &lt;strong&gt;Jekyll&lt;/strong&gt; and the &lt;strong&gt;Minimal Mistakes&lt;/strong&gt; theme — both of which I’d dabbled with before, but never used in anger. And, crucially, I wasn’t working alone: I had &lt;strong&gt;ChatGPT&lt;/strong&gt; as a development assistant, sounding board, researcher, and occasional bug-hunter.&lt;/p&gt;&lt;h3&gt;The Idea&lt;/h3&gt;&lt;p&gt;Balham is a reasonably affluent, busy part of south west London. It’s full of restaurants, cafés, gyms, independent shops, and people looking for things to do. It also has a surprisingly rich local history — from Victorian grandeur to Blitz-era tragedy.&lt;/p&gt;&lt;p&gt;I figured the site could be structured around three main pillars:&lt;/p&gt;&lt;p&gt;Throw in a curated homepage and maybe a blog later, and I had the bones of a useful site. The kind of thing that people would find via Google or get sent a link to by a friend.&lt;/p&gt;&lt;h3&gt;The Stack&lt;/h3&gt;&lt;p&gt;I wanted something static, fast, and easy to deploy. My toolchain ended up being:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Jekyll&lt;/strong&gt; for the site generator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Minimal Mistakes&lt;/strong&gt; as the theme&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt; for hosting&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Custom YAML data files&lt;/strong&gt; for businesses and events&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; for everything from content generation to Liquid loops&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The site is 100% static, with no backend, no databases, no CMS. It builds automatically on GitHub push, and is entirely hosted via GitHub Pages.&lt;/p&gt;&lt;h3&gt;Step by Step: Building It&lt;/h3&gt;&lt;p&gt;I gave us about six solid hours to build something real. Here’s what we did (“we” meaning me + ChatGPT):&lt;/p&gt;&lt;h3&gt;1. Domain Setup and Scaffolding&lt;/h3&gt;&lt;p&gt;The domain was already pointed at GitHub Pages, and I had a basic “Hello World” site in place. We cleared that out, set up a fresh Jekyll repo, and added a _config.yml that pointed at the Minimal Mistakes remote theme. No cloning or submodules.&lt;/p&gt;&lt;h3&gt;2. Basic Site Structure&lt;/h3&gt;&lt;p&gt;We decided to create four main pages:&lt;/p&gt;&lt;p&gt;We used the layout: single layout provided by Minimal Mistakes, and created custom permalinks so URLs were clean and extension-free.&lt;/p&gt;&lt;h3&gt;3. The Business Directory&lt;/h3&gt;&lt;p&gt;This was built from scratch using a YAML data file (_data/businesses.yml). ChatGPT gathered an initial list of 20 local businesses (restaurants, shops, pubs, etc.), checked their status, and added details like name, category, address, website, and a short description.&lt;/p&gt;&lt;p&gt;In the template, we looped over the list, rendered sections with conditional logic (e.g., don’t output the website link if it’s empty), and added anchor IDs to each entry so we could link to them directly from the homepage.&lt;/p&gt;&lt;h3&gt;4. The Events Page&lt;/h3&gt;&lt;p&gt;Built exactly the same way, but using _data/events.yml. To keep things realistic, we seeded a small number of example events and included a note inviting people to email us with new submissions.&lt;/p&gt;&lt;h3&gt;5. Featured Listings&lt;/h3&gt;&lt;p&gt;We wanted the homepage to show a curated set of businesses and events. So we created a third data file, _data/featured.yml, which just listed the &lt;em&gt;names&lt;/em&gt; of the featured entries. Then in the homepage template, we used where and slugify to match names and pull in the full record from businesses.yml or events.yml. Super DRY.&lt;/p&gt;&lt;h3&gt;6. Map and Media&lt;/h3&gt;&lt;p&gt;We added a map of Balham as a hero image, styled responsively. Later we created a .responsive-inline-image class to embed supporting images on the history page without overwhelming the layout.&lt;/p&gt;&lt;h3&gt;7. History Section with Real Archival Images&lt;/h3&gt;&lt;p&gt;This turned out to be one of the most satisfying parts. We wrote five paragraphs covering key moments in Balham’s development — Victorian expansion, Du Cane Court, The Priory, the Blitz, and modern growth.&lt;/p&gt;&lt;p&gt;Then we sourced five CC-licensed or public domain images (from Wikimedia Commons and Geograph) to match each paragraph. Each was wrapped in a &amp;lt;figure&amp;gt; with proper attribution and a consistent CSS class. The result feels polished and informative.&lt;/p&gt;&lt;h3&gt;8. Metadata, SEO, and Polish&lt;/h3&gt;&lt;p&gt;We went through all the basics:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Custom title and description in front matter for each page&lt;/li&gt;&lt;li&gt;Open Graph tags and Twitter cards via site config&lt;/li&gt;&lt;li&gt;A branded favicon using RealFaviconGenerator&lt;/li&gt;&lt;li&gt;Added robots.txt, sitemap.xml, and a hand-crafted humans.txt&lt;/li&gt;&lt;li&gt;Clean URLs, no .html extensions&lt;/li&gt;&lt;li&gt;Anchored IDs for deep linking&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;9. Analytics and Search Console&lt;/h3&gt;&lt;p&gt;We added GA4 tracking using Minimal Mistakes’ built-in support, and verified the domain with Google Search Console. A sitemap was submitted, and indexing kicked in within minutes.&lt;/p&gt;&lt;h3&gt;10. Accessibility and Performance&lt;/h3&gt;&lt;p&gt;We ran Lighthouse and WAVE tests. Accessibility came out at 100%. Performance dipped slightly due to Google Fonts and image size, but we did our best to optimise without sacrificing aesthetics.&lt;/p&gt;&lt;h3&gt;11. Footer CTA&lt;/h3&gt;&lt;p&gt;We added a site-wide footer call-to-action inviting people to email us with suggestions for businesses or events. This makes the site feel alive and participatory, even without a backend form.&lt;/p&gt;&lt;h3&gt;What Worked Well&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ChatGPT as co-pilot&lt;/strong&gt;: I could ask it for help with Liquid templates, CSS, content rewrites, and even bug-hunting. It let me move fast without getting bogged down in docs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Minimal Mistakes&lt;/strong&gt;: It really is an excellent theme. Clean, accessible, flexible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data-driven content&lt;/strong&gt;: Keeping everything in YAML meant templates stayed simple, and the whole site is easy to update.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Staying focused&lt;/strong&gt;: We didn’t try to do everything. Four pages, one day, good polish.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;What’s Next?&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Add category filtering to the directory&lt;/li&gt;&lt;li&gt;Improve the OG/social card image&lt;/li&gt;&lt;li&gt;Add structured JSON-LD for individual events and businesses&lt;/li&gt;&lt;li&gt;Explore monetisation: affiliate links, sponsored listings, local partnerships&lt;/li&gt;&lt;li&gt;Start some blog posts or “best of Balham” roundups&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Final Thoughts&lt;/h3&gt;&lt;p&gt;This started as a fun experiment: could I monetise an unused domain &lt;em&gt;and&lt;/em&gt; finally learn Jekyll properly?&lt;/p&gt;&lt;p&gt;What I ended up with is a genuinely useful local resource — one that looks good, loads quickly, and has room to grow.&lt;/p&gt;&lt;p&gt;If you’re sitting on an unused domain, and you’ve got a free day and a chatbot at your side — you might be surprised what you can build.&lt;/p&gt;&lt;p&gt;Oh, and one final thing — obviously you can also get ChatGPT to write a blog post talking about the project :-)&lt;/p&gt;&lt;p&gt;&lt;em&gt;Originally published at &lt;/em&gt;&lt;a href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html"&gt;&lt;em&gt;https://blog.dave.org.uk&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on March 23, 2025.&lt;/em&gt;&lt;/p&gt;&lt;img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=b87780d287d9" width="1" height="1" alt=""&gt;</content>
  1931.    <author>
  1932.      <name>Dave Cross</name>
  1933.    </author>
  1934.    <id>https://medium.com/p/b87780d287d9</id>
  1935.    <published>2025-03-23T12:49:36Z</published>
  1936.    <updated>2025-03-23T12:54:12.382000Z</updated>
  1937.    <category term="chatgpt"/>
  1938.    <category term="ai"/>
  1939.    <category term="tech-tools"/>
  1940.    <category term="website-building"/>
  1941.    <category term="web-development"/>
  1942.  </entry>
  1943.  <entry>
  1944.    <title>Building a website in a day — with help from ChatGPT</title>
  1945.    <link rel="alternate" href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html" type="text/html"/>
  1946.    <content type="xhtml">
  1947.      <div xmlns="http://www.w3.org/1999/xhtml"><p data-pm-slice="1 1 []">A few days ago, I looked at an unused domain I owned — <a href="https://balham.org">balham.org</a> — and thought: <em>“There must be a way to make this useful… and maybe even make it pay for itself.”</em></p>
  1948. <p>So I set myself a challenge: <strong>one day to build something genuinely useful.</strong> A site that served a real audience (people in and around Balham), that was fun to build, and maybe could be turned into a small revenue stream.</p>
  1949. <p>It was also a great excuse to get properly stuck into <strong>Jekyll</strong> and the <strong>Minimal Mistakes</strong> theme — both of which I’d dabbled with before, but never used in anger. And, crucially, I wasn’t working alone: I had <strong>ChatGPT</strong> as a development assistant, sounding board, researcher, and occasional bug-hunter.</p>
  1950. <h2>The Idea</h2>
  1951. <p>Balham is a reasonably affluent, busy part of south west London. It’s full of restaurants, cafés, gyms, independent shops, and people looking for things to do. It also has a surprisingly rich local history — from Victorian grandeur to Blitz-era tragedy.</p>
  1952. <p>I figured the site could be structured around three main pillars:</p>
  1953. <ul data-spread="false">
  1954. <li>A <strong>directory of local businesses</strong></li>
  1955. <li>A <strong>list of upcoming events</strong></li>
  1956. <li>A <strong>local history section</strong></li>
  1957. </ul>
  1958. <p>Throw in a curated homepage and maybe a blog later, and I had the bones of a useful site. The kind of thing that people would find via Google or get sent a link to by a friend.</p>
  1959. <h2>The Stack</h2>
  1960. <p>I wanted something static, fast, and easy to deploy. My toolchain ended up being:</p>
  1961. <ul data-spread="false">
  1962. <li><strong>Jekyll</strong> for the site generator</li>
  1963. <li><strong>Minimal Mistakes</strong> as the theme</li>
  1964. <li><strong>GitHub Pages</strong> for hosting</li>
  1965. <li><strong>Custom YAML data files</strong> for businesses and events</li>
  1966. <li><strong>ChatGPT</strong> for everything from content generation to Liquid loops</li>
  1967. </ul>
  1968. <p>The site is 100% static, with no backend, no databases, no CMS. It builds automatically on GitHub push, and is entirely hosted via GitHub Pages.</p>
  1969. <h2>Step by Step: Building It</h2>
  1970. <p>I gave us about six solid hours to build something real. Here’s what we did (“we” meaning me + ChatGPT):</p>
  1971. <h3>1. Domain Setup and Scaffolding</h3>
  1972. <p>The domain was already pointed at GitHub Pages, and I had a basic “Hello World” site in place. We cleared that out, set up a fresh Jekyll repo, and added a <code>_config.yml</code> that pointed at the Minimal Mistakes remote theme. No cloning or submodules.</p>
  1973. <h3>2. Basic Site Structure</h3>
  1974. <p>We decided to create four main pages:</p>
  1975. <ul data-spread="false">
  1976. <li>Homepage (<code>index.md</code>)</li>
  1977. <li>Directory (<code>directory/index.md</code>)</li>
  1978. <li>Events (<code>events/index.md</code>)</li>
  1979. <li>History (<code>history/index.md</code>)</li>
  1980. </ul>
  1981. <p>We used the <code>layout: single</code> layout provided by Minimal Mistakes, and created custom permalinks so URLs were clean and extension-free.</p>
  1982. <h3>3. The Business Directory</h3>
  1983. <p>This was built from scratch using a YAML data file (<code>_data/businesses.yml</code>). ChatGPT gathered an initial list of 20 local businesses (restaurants, shops, pubs, etc.), checked their status, and added details like name, category, address, website, and a short description.</p>
  1984. <p>In the template, we looped over the list, rendered sections with conditional logic (e.g., don’t output the website link if it’s empty), and added anchor IDs to each entry so we could link to them directly from the homepage.</p>
  1985. <h3>4. The Events Page</h3>
  1986. <p>Built exactly the same way, but using <code>_data/events.yml</code>. To keep things realistic, we seeded a small number of example events and included a note inviting people to email us with new submissions.</p>
  1987. <h3>5. Featured Listings</h3>
  1988. <p>We wanted the homepage to show a curated set of businesses and events. So we created a third data file, <code>_data/featured.yml</code>, which just listed the <em>names</em> of the featured entries. Then in the homepage template, we used <code>where</code> and <code>slugify</code> to match names and pull in the full record from <code>businesses.yml</code> or <code>events.yml</code>. Super DRY.</p>
  1989. <h3>6. Map and Media</h3>
  1990. <p>We added a map of Balham as a hero image, styled responsively. Later we created a <code>.responsive-inline-image</code> class to embed supporting images on the history page without overwhelming the layout.</p>
  1991. <h3>7. History Section with Real Archival Images</h3>
  1992. <p>This turned out to be one of the most satisfying parts. We wrote five paragraphs covering key moments in Balham’s development — Victorian expansion, Du Cane Court, The Priory, the Blitz, and modern growth.</p>
  1993. <p>Then we sourced five CC-licensed or public domain images (from Wikimedia Commons and Geograph) to match each paragraph. Each was wrapped in a <code>&lt;figure&gt;</code> with proper attribution and a consistent CSS class. The result feels polished and informative.</p>
  1994. <h3>8. Metadata, SEO, and Polish</h3>
  1995. <p>We went through all the basics:</p>
  1996. <ul data-spread="false">
  1997. <li>Custom <code>title</code> and <code>description</code> in front matter for each page</li>
  1998. <li>Open Graph tags and Twitter cards via site config</li>
  1999. <li>A branded favicon using RealFaviconGenerator</li>
  2000. <li>Added <code>robots.txt</code>, <code>sitemap.xml</code>, and a hand-crafted <code>humans.txt</code></li>
  2001. <li>Clean URLs, no <code>.html</code> extensions</li>
  2002. <li>Anchored IDs for deep linking</li>
  2003. </ul>
  2004. <h3>9. Analytics and Search Console</h3>
  2005. <p>We added GA4 tracking using Minimal Mistakes’ built-in support, and verified the domain with Google Search Console. A sitemap was submitted, and indexing kicked in within minutes.</p>
  2006. <h3>10. Accessibility and Performance</h3>
  2007. <p>We ran Lighthouse and WAVE tests. Accessibility came out at 100%. Performance dipped slightly due to Google Fonts and image size, but we did our best to optimise without sacrificing aesthetics.</p>
  2008. <h3>11. Footer CTA</h3>
  2009. <p>We added a site-wide footer call-to-action inviting people to email us with suggestions for businesses or events. This makes the site feel alive and participatory, even without a backend form.</p>
  2010. <h2>What Worked Well</h2>
  2011. <ul data-spread="false">
  2012. <li><strong>ChatGPT as co-pilot</strong>: I could ask it for help with Liquid templates, CSS, content rewrites, and even bug-hunting. It let me move fast without getting bogged down in docs.</li>
  2013. <li><strong>Minimal Mistakes</strong>: It really is an excellent theme. Clean, accessible, flexible.</li>
  2014. <li><strong>Data-driven content</strong>: Keeping everything in YAML meant templates stayed simple, and the whole site is easy to update.</li>
  2015. <li><strong>Staying focused</strong>: We didn’t try to do everything. Four pages, one day, good polish.</li>
  2016. </ul>
  2017. <h2>What’s Next?</h2>
  2018. <ul data-spread="false">
  2019. <li>Add category filtering to the directory</li>
  2020. <li>Improve the OG/social card image</li>
  2021. <li>Add structured JSON-LD for individual events and businesses</li>
  2022. <li>Explore monetisation: affiliate links, sponsored listings, local partnerships</li>
  2023. <li>Start some blog posts or “best of Balham” roundups</li>
  2024. </ul>
  2025. <h2>Final Thoughts</h2>
  2026. <p>This started as a fun experiment: could I monetise an unused domain <em>and</em> finally learn Jekyll properly?</p>
  2027. <p>What I ended up with is a genuinely useful local resource — one that looks good, loads quickly, and has room to grow.</p>
  2028. <p>If you’re sitting on an unused domain, and you’ve got a free day and a chatbot at your side — you might be surprised what you can build.</p>
  2029. <div>
  2030. <hr/>
  2031. </div>
  2032. <p>Oh, and one final thing – obviously you can also get ChatGPT to write a blog post talking about the project :-)</p>
  2033. <p>The post <a href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html">Building a website in a day — with help from ChatGPT</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2034. </div>
  2035.    </content>
  2036.    <summary type="xhtml">
  2037.      <div xmlns="http://www.w3.org/1999/xhtml"><p>A few days ago, I looked at an unused domain I owned — balham.org — and thought: “There must be a way to make this useful… and maybe even make it pay for itself.” So I set myself a challenge: one day to build something genuinely useful. A site that served a real audience (people… <a class="more-link" href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html">Continue reading <span class="screen-reader-text">Building a website in a day — with help from ChatGPT</span></a></p>
  2038. <p>The post <a href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html">Building a website in a day — with help from ChatGPT</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2039. </div>
  2040.    </summary>
  2041.    <author>
  2042.      <name>Dave Cross</name>
  2043.    </author>
  2044.    <id>https://blog.dave.org.uk/?p=3960</id>
  2045.    <published>2025-03-23T12:48:55Z</published>
  2046.    <updated>2025-03-23T12:48:55Z</updated>
  2047.    <category term="web"/>
  2048.    <category term="ai"/>
  2049.    <category term="chatgpt"/>
  2050.    <category term="tech tools"/>
  2051.    <category term="web development"/>
  2052.    <category term="website building"/>
  2053.  </entry>
  2054.  <entry>
  2055.    <title>How I build websites in 2025</title>
  2056.    <link rel="alternate" href="https://davorg.medium.com/how-i-build-websites-in-2025-7a3599b02349?source=rss-3781feb8a4f4------2" type="text/html"/>
  2057.    <content type="html">&lt;figure&gt;&lt;img alt="" src="https://cdn-images-1.medium.com/max/968/0*NAKTS9Vg_DhIajRX.png" /&gt;&lt;/figure&gt;&lt;p&gt;I built and launched &lt;a href="https://websiteguide.davecross.co.uk/"&gt;a new website&lt;/a&gt; yesterday. It wasn’t what I planned to do, but the idea popped into my head while I was drinking my morning coffee on Clapham Common and it seemed to be the kind of thing I could complete in a day — so I decided to put my original plans on hold and built it instead.&lt;/p&gt;&lt;p&gt;The website is aimed at small business owners who think they need a website (or want to update their existing one) but who know next to nothing about web development and can easily fall prey to the many cowboy website companies that seem to dominate the “making websites for small companies” section of our industries. The site is structured around a number of questions you can ask a potential website builder to try and weed out the dodgier elements.&lt;/p&gt;&lt;p&gt;I’m not really in that sector of our industry. But while writing the content for that site, it occurred to me that some people might be interested in the tools I use to build sites like this.&lt;/p&gt;&lt;h3&gt;Content&lt;/h3&gt;&lt;p&gt;I generally build websites about topics that I’m interested in and, therefore, know a fair bit about. But I probably don’t know everything about these subjects. So I’ll certainly brainstorm some ideas with ChatGPT. And, once I’ve written something, I’ll usually run it through ChatGPT again to proofread it. I consider myself a pretty good writer, but it’s embarrassing how often ChatGPT catches obvious errors.&lt;/p&gt;&lt;p&gt;I’ve used DALL-E (via ChatGPT) for a lot of image generation. This weekend, I subscribed to &lt;a href="https://www.midjourney.com/"&gt;Midjourney&lt;/a&gt; because I heard it was better at generating images that include text. So far, that seems to be accurate.&lt;/p&gt;&lt;h3&gt;Technology&lt;/h3&gt;&lt;p&gt;I don’t write much raw HTML these days. I’ll generally write in Markdown and use a static site generator to turn that into a real website. This weekend I took the easy route and used &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; with the &lt;a href="https://mmistakes.github.io/minimal-mistakes/"&gt;Minimal Mistakes&lt;/a&gt; theme. Honestly, I don’t love Jekyll, but it integrates well with GitHub Pages and I can usually get it to do what I want — with a combination of help from ChatGPT and reading the &lt;a href="https://github.com/mmistakes/minimal-mistakes"&gt;source code&lt;/a&gt;. I’m (slowly) building my own Static Site Generator ( &lt;a href="https://aphra.perlhacks.com/"&gt;Aphra&lt;/a&gt;) in Perl. But, to be honest, I find that when I use it I can easily get distracted by adding new features rather than getting the site built.&lt;/p&gt;&lt;p&gt;As I’ve hinted at, if I’m building a static site (and, it’s surprising how often that’s the case), it will be hosted on &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt;. It’s not really aimed at end-users, but I know to you use it pretty well now. This weekend, I used the default mechanism that regenerates the site (using Jekyll) on every commit. But if I’m using Aphra or a custom site generator, I know I can use &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; to build and deploy the site.&lt;/p&gt;&lt;p&gt;If I’m writing actual HTML, then I’m old-skool enough to still use &lt;a href="https://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt; for CSS. There’s probably something better out there now, but I haven’t tried to work out what it is (feel free to let me know in the comments).&lt;/p&gt;&lt;p&gt;For a long while, I used jQuery to add Javascript to my pages — until someone was kind enough to tell me that vanilla Javascript had mostly caught up and jQuery was no longer necessary. I understand Javascript. And with help from &lt;a href="https://github.com/features/copilot"&gt;GitHub Copilot&lt;/a&gt;, I can usually get it doing what I want pretty quickly.&lt;/p&gt;&lt;h3&gt;SEO&lt;/h3&gt;&lt;p&gt;Many years ago, I spent a couple of years working in the SEO group at Zoopla. So, now, I can’t think about building a website without considering SEO.&lt;/p&gt;&lt;p&gt;I quickly lose interest in the content side of SEO. Figuring out what my keywords are and making sure they’re scattered through the content at the correct frequency, feels like it stifles my writing (maybe that’s an area where ChatGPT can help) but I enjoy Technical SEO. So I like to make sure that all of my pages contain the correct structured data (usually &lt;a href="https://json-ld.org/"&gt;JSON-LD&lt;/a&gt;). I also like to ensure my sites all have useful &lt;a href="https://ogp.me/"&gt;OpenGraph&lt;/a&gt; headers. This isn’t really SEO, I guess, but these headers control what people see when they share content on social media. So by making that as attractive as possible (a useful title and description, an attractive image) it encourages more sharing, which increases your site’s visibility and, in around about way, improves SEO.&lt;/p&gt;&lt;p&gt;I like to register all of my sites with &lt;a href="https://ahrefs.com/"&gt;Ahrefs&lt;/a&gt; — they will crawl my sites periodically and send me a long list of SEO improvements I can make.&lt;/p&gt;&lt;h3&gt;Monitoring&lt;/h3&gt;&lt;p&gt;I add &lt;a href="https://analytics.google.com/"&gt;Google Analytics&lt;/a&gt; to all of my sites. That’s still the best way to find out how popular your site it and where your traffic is coming from. I used to be quite proficient with Universal Analytics, but I must admit I haven’t fully got the hang of Google Analytics 4 yet-so I’m probably only scratching the surface of what it can do.&lt;/p&gt;&lt;p&gt;I also register all of my sites with &lt;a href="https://search.google.com/search-console/about"&gt;Google Search Console&lt;/a&gt;. That shows me information about how my site appears in the Google Search Index. I also link that to Google Analytics — so GA also knows what searches brought people to my sites.&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;I think that covers everything-though I’ve probably forgotten something. It might sound like a lot, but once you get into a rhythm, adding these extra touches doesn’t take long. And the additional insights you gain make it well worth the effort.&lt;/p&gt;&lt;p&gt;If you’ve built a website recently, I’d love to hear about your approach. What tools and techniques do you swear by? Are there any must-have features or best practices I’ve overlooked? Drop a comment below or get in touch-I’m always keen to learn new tricks and refine my process. And if you’re a small business owner looking for guidance on choosing a web developer, check out my new site-it might just save you from a costly mistake!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Originally published at &lt;/em&gt;&lt;a href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html"&gt;&lt;em&gt;https://blog.dave.org.uk&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on March 16, 2025.&lt;/em&gt;&lt;/p&gt;&lt;img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=7a3599b02349" width="1" height="1" alt=""&gt;</content>
  2058.    <author>
  2059.      <name>Dave Cross</name>
  2060.    </author>
  2061.    <id>https://medium.com/p/7a3599b02349</id>
  2062.    <published>2025-03-16T16:37:52Z</published>
  2063.    <updated>2025-03-17T09:12:57.817000Z</updated>
  2064.    <category term="website-building"/>
  2065.    <category term="tech-tools"/>
  2066.    <category term="web-development"/>
  2067.  </entry>
  2068.  <entry>
  2069.    <title>How I build websites in 2025</title>
  2070.    <link rel="alternate" href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html" type="text/html"/>
  2071.    <content type="xhtml">
  2072.      <div xmlns="http://www.w3.org/1999/xhtml"><p>I built and launched <a href="https://websiteguide.davecross.co.uk/">a new website</a> yesterday. It wasn’t what I planned to do, but the idea popped into my head while I was drinking my morning coffee on Clapham Common and it seemed to be the kind of thing I could complete in a day – so I decided to put my original plans on hold and built it instead.</p>
  2073. <p>The website is aimed at small business owners who think they need a website (or want to update their existing one) but who know next to nothing about web development and can easily fall prey to the many cowboy website companies that seem to dominate the “making websites for small companies” section of our industries. The site is structured around a number of questions you can ask a potential website builder to try and weed out the dodgier elements.</p>
  2074. <p>I’m not really in that sector of our industry. But while writing the content for that site, it occurred to me that some people might be interested in the tools I use to build sites like this.</p>
  2075. <h2>Content</h2>
  2076. <p>I generally build websites about topics that I’m interested in and, therefore, know a fair bit about. But I probably don’t know everything about these subjects. So I’ll certainly brainstorm some ideas with ChatGPT. And, once I’ve written something, I’ll usually run it through ChatGPT again to proofread it. I consider myself a pretty good writer, but it’s embarrassing how often ChatGPT catches obvious errors.</p>
  2077. <p>I’ve used DALL-E (via ChatGPT) for a lot of image generation. This weekend, I subscribed to <a href="https://www.midjourney.com/">Midjourney</a> because I heard it was better at generating images that include text. So far, that seems to be accurate.</p>
  2078. <h2>Technology</h2>
  2079. <p>I don’t write much raw HTML these days. I’ll generally write in Markdown and use a static site generator to turn that into a real website. This weekend I took the easy route and used <a href="https://jekyllrb.com/">Jekyll</a> with the <a href="https://mmistakes.github.io/minimal-mistakes/">Minimal Mistakes</a> theme. Honestly, I don’t love Jekyll, but it integrates well with GitHub Pages and I can usually get it to do what I want – with a combination of help from ChatGPT and reading the <a href="https://github.com/mmistakes/minimal-mistakes">source code</a>. I’m (slowly) building my own Static Site Generator (<a href="https://aphra.perlhacks.com/">Aphra</a>) in Perl. But, to be honest, I find that when I use it I can easily get distracted by adding new features rather than getting the site built.</p>
  2080. <p>As I’ve hinted at, if I’m building a static site (and, it’s surprising how often that’s the case), it will be hosted on <a href="https://pages.github.com/">GitHub Pages</a>. It’s not really aimed at end-users, but I know how to use it pretty well now. This weekend, I used the default mechanism that regenerates the site (using Jekyll) on every commit. But if I’m using Aphra or a custom site generator, I know I can use <a href="https://github.com/features/actions">GitHub Actions</a> to build and deploy the site.</p>
  2081. <p>If I’m writing actual HTML, then I’m old-skool enough to still use <a href="https://getbootstrap.com/">Bootstrap</a> for CSS. There’s probably something better out there now, but I haven’t tried to work out what it is (feel free to let me know in the comments).</p>
  2082. <p>For a long while, I used jQuery to add Javascript to my pages – until someone was kind enough to tell me that vanilla Javascript had mostly caught up and jQuery was no longer necessary. I understand Javascript. And with help from <a href="https://github.com/features/copilot">GitHub Copilot</a>, I can usually get it doing what I want pretty quickly.</p>
  2083. <h2>SEO</h2>
  2084. <p>Many years ago, I spent a couple of years working in the SEO group at Zoopla. So, now, I can’t think about building a website without considering SEO.</p>
  2085. <p>I quickly lose interest in the content side of SEO. Figuring out what my keywords are and making sure they’re scattered through the content at the correct frequency, feels like it stifles my writing (maybe that’s an area where ChatGPT can help) but I enjoy Technical SEO. So I like to make sure that all of my pages contain the correct structured data (usually <a href="https://json-ld.org/">JSON-LD</a>). I also like to ensure my sites all have useful <a href="https://ogp.me/">OpenGraph</a> headers. This isn’t really SEO, I guess, but these headers control what people see when they share content on social media. So by making that as attractive as possible (a useful title and description, an attractive image) it encourages more sharing, which increases your site’s visibility and, in around about way, improves SEO.</p>
  2086. <p>I like to register all of my sites with <a href="https://ahrefs.com/">Ahrefs</a> – they will crawl my sites periodically and send me a long list of SEO improvements I can make.</p>
  2087. <h2>Monitoring</h2>
  2088. <p>I add <a href="https://analytics.google.com/">Google Analytics</a> to all of my sites. That’s still the best way to find out how popular your site it and where your traffic is coming from. I used to be quite proficient with Universal Analytics, but I must admit I haven’t fully got the hang of Google Analytics 4 yet—so I’m probably only scratching the surface of what it can do.</p>
  2089. <p>I also register all of my sites with <a href="https://search.google.com/search-console/about">Google Search Console</a>. That shows me information about how my site appears in the Google Search Index. I also link that to Google Analytics – so GA also knows what searches brought people to my sites.</p>
  2090. <h2>Conclusion</h2>
  2091. <p>I think that covers everything—though I’ve probably forgotten something. It might sound like a lot, but once you get into a rhythm, adding these extra touches doesn’t take long. And the additional insights you gain make it well worth the effort.</p>
  2092. <p>If you’ve built a website recently, I’d love to hear about your approach. What tools and techniques do you swear by? Are there any must-have features or best practices I’ve overlooked? Drop a comment below or get in touch—I’m always keen to learn new tricks and refine my process. And if you’re a small business owner looking for guidance on choosing a web developer, check out my new site—it might just save you from a costly mistake!</p>
  2093. <p>The post <a href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html">How I build websites in 2025</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2094. </div>
  2095.    </content>
  2096.    <summary type="xhtml">
  2097.      <div xmlns="http://www.w3.org/1999/xhtml"><p>I built and launched a new website yesterday. It wasn’t what I planned to do, but the idea popped into my head while I was drinking my morning coffee on Clapham Common and it seemed to be the kind of thing I could complete in a day – so I decided to put my original… <a class="more-link" href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html">Continue reading <span class="screen-reader-text">How I build websites in 2025</span></a></p>
  2098. <p>The post <a href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html">How I build websites in 2025</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2099. </div>
  2100.    </summary>
  2101.    <author>
  2102.      <name>Dave Cross</name>
  2103.    </author>
  2104.    <id>https://blog.dave.org.uk/?p=3955</id>
  2105.    <published>2025-03-16T16:36:54Z</published>
  2106.    <updated>2025-03-16T16:36:54Z</updated>
  2107.    <category term="web"/>
  2108.    <category term="tech tools"/>
  2109.    <category term="web development"/>
  2110.    <category term="website building"/>
  2111.  </entry>
  2112.  <entry>
  2113.    <title>Picturehouse Film Club</title>
  2114.    <link rel="alternate" href="https://davorg.medium.com/picturehouse-film-club-decfd2f39474?source=rss-3781feb8a4f4------2" type="text/html"/>
  2115.    <content type="html">&lt;div class="medium-feed-item"&gt;&lt;p class="medium-feed-image"&gt;&lt;a href="https://davorg.medium.com/picturehouse-film-club-decfd2f39474?source=rss-3781feb8a4f4------2"&gt;&lt;img src="https://cdn-images-1.medium.com/max/1792/1*K96DJROjtoHktnEH3ynV5w.png" width="1792"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="medium-feed-snippet"&gt;I&amp;#x2019;ve been a member of Picturehouse Cinemas for something approaching twenty years. It costs about &amp;#xA3;60 a year and for that, you get five&amp;#x2026;&lt;/p&gt;&lt;p class="medium-feed-link"&gt;&lt;a href="https://davorg.medium.com/picturehouse-film-club-decfd2f39474?source=rss-3781feb8a4f4------2"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content>
  2116.    <author>
  2117.      <name>Dave Cross</name>
  2118.    </author>
  2119.    <id>https://medium.com/p/decfd2f39474</id>
  2120.    <published>2024-12-31T16:08:25Z</published>
  2121.    <updated>2024-12-31T16:08:25.189000Z</updated>
  2122.    <category term="picture-house"/>
  2123.    <category term="2024"/>
  2124.    <category term="film-club"/>
  2125.    <category term="film"/>
  2126.    <category term="clapham"/>
  2127.  </entry>
  2128.  <entry>
  2129.    <title>Picturehouse Film Club</title>
  2130.    <link rel="alternate" href="https://blog.dave.org.uk/2024/12/picturehouse-film-club.html" type="text/html"/>
  2131.    <content type="xhtml">
  2132.      <div xmlns="http://www.w3.org/1999/xhtml"><p>I’ve been a member of Picturehouse Cinemas for something approaching twenty years. It costs about £60 a year and for that, you get five free tickets and discounts on your tickets and snacks. I’ve often wondered whether it’s worth paying for, but in the last couple of years, they’ve added an extra feature that makes it well worth the cost. It’s called Film Club and every week they have two curated screenings that members can see for just £1. On Sunday lunchtime, there’s a screening of an older film, and on a weekday evening (usually Wednesday at the Clapham Picturehouse), they show something new. I’ve got into the habit of seeing most of these screenings.</p>
  2133. <p>For most of the year, I’ve been considering a monthly post about the films I’ve seen at Film Club, but I’ve never got around to it. So, instead, you get an end-of-year dump of the almost eighty films I’ve seen.</p>
  2134. <ol>
  2135. <li><em><strong>Under the Skin</strong></em> [4 stars] 2024-01-14<br/>
  2136. Starting with an old(ish) favourite. The last time I saw this was a free preview for Picturehouse members, ten years ago. It’s very much a film that people love or hate. I love it. The book is great too (but very different)</li>
  2137. <li><em><strong>Go West</strong></em> [3.5] 2024-01-21<br/>
  2138. They often show old films as mini-festivals of connected films. This was the first of a short series of Buster Keaton films. I hadn’t seen any of them. <em>Go West</em> was a film where I could appreciate the technical aspects, but I wasn’t particularly entertained</li>
  2139. <li><em><strong>Godzilla Minus One</strong></em> [3] 2024-01-23<br/>
  2140. Around this time, I’d been watching a few of the modern Godzilla films from the “Monsterverse”. I hadn’t really been enjoying them. But this, unrelated, film was far more enjoyable</li>
  2141. <li><em><strong>Steamboat Bill, Jr</strong></em>. [4] 2024-01-28<br/>
  2142. Back with Buster Keaton. I enjoyed this one far more.</li>
  2143. <li><em><strong>American Fiction</strong></em> [4] 2024-01-30<br/>
  2144. Sometimes they’ll show an Oscar contender. I ended up having seen seven of the ten Best Picture nominees before the ceremony – which is far higher than my usual rate. I really enjoyed this one</li>
  2145. <li><strong><em>The Zone of Interest</em></strong> [3] 2024-02-03<br/>
  2146. Another Oscar contender. I think I wasn’t really in the mood for this. I was tired and found it hard to follow. I should rewatch it at some point.</li>
  2147. <li><em><strong>The General</strong></em> [4] 2024-02-11<br/>
  2148. More Buster Keaton. I really enjoyed this one – my favourite of the three I watched. I could very easily see myself going down a rabbit hole of obsessing over all of his films</li>
  2149. <li><em><strong>Perfect Days</strong></em> [3.5] 2024-02-15<br/>
  2150. A film about the life of a toilet cleaner in Tokyo. But written and directed by Wim Wenders – so far better than that description makes it sound</li>
  2151. <li><em><strong>Wicked Little Letters</strong></em> [4] 2024-02-20<br/>
  2152. I thought this would be more popular than it was. But it vanished pretty much without a trace. It’s a really nice little film about swearing</li>
  2153. <li><em><strong>Nosferatu the Vampyre</strong></em> [3.5] 2024-02-25<br/>
  2154. The Sunday screenings often give me a chance to catch up with old classics that I haven’t seen before. This was one example. This was the 1979 Werner Herzog version. I should track down the 1922 original before watching the new version early next year</li>
  2155. <li><em><strong>Four Daughters</strong></em> [3.5] 2024-02-29<br/>
  2156. Because the screenings cost £1, I see everything – no matter what the subject matter is. This is an example of a film I probably wouldn’t have seen without Film Club. But it was a really interesting film about a Tunisian woman who lost two of her daughters when they joined Islamic State</li>
  2157. <li><em><strong>The Persian Version</strong></em> [3.5] 2024-03-07<br/>
  2158. Another film that I would have missed out on without Film Club. It’s an interesting look into the lives of Iranians in America</li>
  2159. <li><strong><em>Girlhood</em></strong> [3] 2024-03-10<br/>
  2160. This was the start of another short season of related films. This time it was films made by women about the lives of women and girls. This one was about girl gangs in Paris</li>
  2161. <li><em><strong>Still Walking</strong></em> [3] 2024-03-16<br/>
  2162. A Japanese family get together to commemorate the death of the eldest son. Things happen, but nothing changes</li>
  2163. <li><em><strong>Zola</strong></em> [3.5] 2024-03-17<br/>
  2164. I had never heard of this film before, but really enjoyed it. It’s the true story of a stripper who goes on a road trip to Florida and gets involved in… stuff</li>
  2165. <li><em><strong>Late Night with the Devil</strong></em> [3.5] 2024-03-19<br/>
  2166. I thought this was clever. A horror film that takes place on the set of a late-night chat show. Things go horribly wrong</li>
  2167. <li><em><strong>Set It Off</strong></em> [3.5] 2024-03-24<br/>
  2168. A pretty standard heist film. But the protagonists are a group of black women. I enjoyed it</li>
  2169. <li><em><strong>Disco Boy</strong></em> [2] 2024-03-27<br/>
  2170. I really didn’t get this film at all</li>
  2171. <li><em><strong>Girls Trip</strong></em> [3.5] 2024-03-31<br/>
  2172. Another women’s road trip film. It was fun, but I can’t remember much of it now</li>
  2173. <li><em><strong>The Salt of the Earth</strong></em> [3] 2024-04-07<br/>
  2174. A documentary about the work of photographer Sebastião Salgado. He was in some bad wars and saw some bad shit</li>
  2175. <li><em><strong>The Teachers’ Lounge</strong></em> [3.5] 2024-04-10<br/>
  2176. Another film that got an Oscar nod. A well-made drama about tensions in the staff room of a German school.</li>
  2177. <li><em><strong>Do the Right Thing</strong></em> [4] 2024-04-14<br/>
  2178. I had never seen a Spike Lee film. How embarrassing is that? This was really good (but you all knew that)</li>
  2179. <li><em><strong>Sometimes I Think About Dying</strong></em> [3] 2024-04-17<br/>
  2180. I really wanted to like this. It was well-made. Daisy Ridley is a really good actress. But it didn’t really go anywhere and completely failed to grip me</li>
  2181. <li><em><strong>The Trouble with Jessica</strong></em> [4] 2024-04-22<br/>
  2182. Another film that deserved to be more successful than it was. Some great comedy performances by a strong cast.</li>
  2183. <li><em><strong>Rope</strong></em> [4.5] 2024-04-28<br/>
  2184. A chance to see a favourite film on the big screen for the first time. It’s regarded as a classic for good reason</li>
  2185. <li><em><strong>Blackbird Blackbird Blackberry</strong></em> [3] 2024-04-30<br/>
  2186. Another film that I just wouldn’t have considered if it wasn’t part of the Film Club programme. I had visited Tbilisi a year earlier, so it was interesting to see a film that was made in Georgia. But, ultimately, it didn’t really grip me</li>
  2187. <li><em><strong>The Cars That Ate Paris</strong></em> [3] 2024-05-12<br/>
  2188. Another old classic that I had never seen. It’s a bit like a precursor to Mad Max. I’m glad I’ve seen it, but I won’t be rushing to rewatch it</li>
  2189. <li><em><strong>Victoria</strong></em> [3.5] 2024-05-19<br/>
  2190. This was a lot of fun. The story of one night in the life of a Spanish woman living in Berlin. Lots of stuff happens. It’s over two hours long and was shot in a single, continuous take</li>
  2191. <li><em><strong>The Beast</strong></em> [3.5] 2024-05-22<br/>
  2192. This was interesting. So interesting that I rewatched it when it appeared on Mubi a few months ago. I’m not sure I can explain it all, but I’ll be rewatching again at some point (and probably revising my score upwards)</li>
  2193. <li><em><strong>Eyes Wide Shut</strong></em> [4] 2024-05-26<br/>
  2194. I hadn’t seen this for maybe twenty-five years. And I don’t think I ever saw it in a cinema. It’s better than I remember</li>
  2195. <li><em><strong>Rosalie</strong></em> [3.5] 2024-05-28<br/>
  2196. A film about a bearded lady in 19th-century France. I kid you not. It’s good</li>
  2197. <li><em><strong>All About My Mother</strong></em> [3.5] 2024-06-02<br/>
  2198. Years ago, I went through a phase of watching loads of Almodóvar films. I was sure I’d seen this one, but I didn’t remember it at all. It’s good though</li>
  2199. <li><em><strong><i><b>Àma</b></i> Gloria</strong></em> [3] 2024-06-04<br/>
  2200. I misunderstood the trailer for this and was on the edge of my seat throughout waiting for a disaster to happen. But, ultimately, it was a nice film about a young girl visiting her old nanny in Cape Verde</li>
  2201. <li><em><strong>Full Metal Jacket</strong></em> [3.5] 2024-06-09<br/>
  2202. This really wasn’t as good as I remembered it. Everyone remembers the training camp stuff, but half of the film happens in-country – and that’s all rather dull</li>
  2203. <li><em><strong>Sasquatch Sunset</strong></em> [2] 2024-06-11<br/>
  2204. I wanted to like this. It would have made a funny two-minute SNL sketch. But it really didn’t work when stretched to ninety minutes</li>
  2205. <li><em><strong>Being John Malkovich</strong></em> [4] 2024-06-16<br/>
  2206. Still great</li>
  2207. <li><em><strong>Green Border</strong></em> [4] 2024-06-19<br/>
  2208. A lot of the films I’ve seen at Film Club in previous years seem to be about people crossing borders illegally. This one was about the border between Belarus and Poland. It was very depressing – but very good</li>
  2209. <li><em><strong>Attack the Block</strong></em> [4] 2024-06-23<br/>
  2210. Another old favourite that it was great to see on the big screen</li>
  2211. <li><em><strong>The 400 Blows</strong></em> [3] 2024-06-30<br/>
  2212. The French New Wave is a huge hole in my knowledge of cinema, so I was glad to have an opportunity to start putting that right. This, however, really didn’t grip me</li>
  2213. <li><em><strong>Bye Bye Tiberias</strong></em> [2.5] 2024-07-02<br/>
  2214. Hiam Abbass (who you might know as Marcia in <a href="https://en.wikipedia.org/wiki/Succession_(TV_series)"><em>Succession</em></a>) left her native Palestine in the 80s to live in Paris. This is a documentary following a visit she made back to her family. It didn’t really go anywhere</li>
  2215. <li><em><strong>Breathless</strong></em> [3] 2024-07-07<br/>
  2216. More French New Wave. I like this more than <em>The 400 Blows</em> – but not much more</li>
  2217. <li><em><strong>After Hours</strong></em> [4] 2024-07-13<br/>
  2218. Another old favourite from  the 80s that I had never seen on the big screen. It’s still great</li>
  2219. <li><strong><em>What Ever Happened to Baby Jane?</em></strong> [2.5] 2024-07-14<br/>
  2220. This was an object lesson in the importance of judging a film in its context. I know this is a great film, but watching it in the 21st century just didn’t have the impact that watching it in the early 60s would have had</li>
  2221. <li><em><strong>Crossing</strong></em> [3.5] 2024-07-16<br/>
  2222. A Georgian woman travels to Istanbul to try to find her niece. We learn a lot about the gay and trans communities in the city. I enjoyed this a lot</li>
  2223. <li><em><strong>American Gigolo</strong></em> [3] 2024-07-28<br/>
  2224. Something else that I had never seen. And, to be honest, I don’t think I had really missed much</li>
  2225. <li><em><strong>Dìdi (弟弟)</strong></em> [3.5] 2024-07-31<br/>
  2226. Nice little story about a Taiwanese teen growing up in California</li>
  2227. <li><em><strong>I Saw the TV Glow</strong></em> [4] 2024-08-05<br/>
  2228. I imagine this will be on many “best films of the year” lists. It’s a very strange film about two teens and their obsession with a TV show that closely resembles <em>Buffy the Vampire Slayer</em>.</li>
  2229. <li><strong><em>Hollywoodgate</em></strong> [2.5] 2024-08-13<br/>
  2230. I really wanted to like this. An Egyptian filmmaker manages to get permission to film a Taliban group that takes over an American base in Afghanistan. But, ultimately, don’t let him film anything interesting and the film is a bit of a disappointment</li>
  2231. <li><strong><em>Beverly Hills Cop</em></strong> [1] 2024-08-18<br/>
  2232. I had never seen this before. And I wish I still hadn’t. One of the worst films I’ve seen in a very long time</li>
  2233. <li><em><strong>Excalibur</strong></em> [4] 2024-08-25<br/>
  2234. Another old favourite that I hadn’t seen on the big screen for a very long time. This is the film that gave me an obsession with watching any film that’s based on Arthurian legend, no matter how bad (and a lot of them are very, very bad)</li>
  2235. <li><strong><em>The Quiet Girl</em></strong> [3.5] 2024-09-01<br/>
  2236. A young Irish girl is sent away to spend the summer with distant relations. She comes to realise that life doesn’t have to be as grim as it usually is for her</li>
  2237. <li><em><strong>Lee</strong></em> [3.5] 2024-09-04<br/>
  2238. A really good biopic about the American photographer Lee Miller. Kate Winslet is really good as Miller</li>
  2239. <li><em><strong>The Queen of My Dreams</strong></em> [3.5] 2024-09-11<br/>
  2240. Another film that I wouldn’t have seen without Film Club. A Canadian Pakistani lesbian woman visits Pakistan and learns about some of the cultural pressures that shaped her mother. It’s a lovely film</li>
  2241. <li><em><strong>My Own Private Idaho</strong></em> [2] 2024-09-15<br/>
  2242. Another film that I had never seen before. Some nice acting by Keanu Reeves and River Phoenix, but this really didn’t interest me</li>
  2243. <li><em><strong>Girls Will Be Girls</strong></em> [3.5] 2024-09-17<br/>
  2244. A coming-of-age film about a teenage girl in India. I enjoyed this</li>
  2245. <li><em><strong>The Shape of Water</strong></em> [3.5] 2024-09-22<br/>
  2246. I don’t think I’ve seen this since the year it was released (and won the Best Picture Oscar). I still enjoyed it, but I didn’t think it held up as well as I expected it to</li>
  2247. <li><em><strong>The Banshees of Inisherin</strong></em> [3.5] 2024-09-29<br/>
  2248. I’d seen this on TV, but you need to see it on a big screen to get the full effect. I’m sure you all know how good it is</li>
  2249. <li><em><strong>The Full Monty</strong></em> [3] 2024-10-06<br/>
  2250. I never understood why this was so much more popular than <em>Brassed Off</em> which is, to me at least, a far better example of the “British worker fish out of water” genre (that’s not a genre, is it?) I guess it’s the soundtrack and the slightly Beryl Cook overtones – the British love a bit of smut</li>
  2251. <li><em><strong>Timestalker</strong></em> [2.5] 2024-10-08<br/>
  2252. I really wanted to like this. But if just didn’t grab me. I’ll try it again at some point</li>
  2253. <li><em><strong>Nomadland</strong></em> [3] 2024-10-13<br/>
  2254. Another Best Picture Oscar winner. And it’s another one where I can really see how important and well-made it is – but it just doesn’t do anything for me</li>
  2255. <li><em><strong>The Apprentice</strong></em> [4] 2024-10-17<br/>
  2256. I don’t know why Trump was so against this film. I thought he came out of this far more positively than I expected. But it seemed to barely get a release. It has still picked up a few (well-deserved) nominations though</li>
  2257. <li><em><strong>Little Miss Sunshine</strong></em> [4] 2024-10-20<br/>
  2258. Another old favourite. I loved seeing this again</li>
  2259. <li><strong><em>Stoker</em></strong> [3] 2024-10-27<br/>
  2260. I had never seen this before. I can’t quite put my finger on it, but I didn’t really enjoy it</li>
  2261. <li><em><strong>Anora</strong></em> [4] 2024-10-29<br/>
  2262. This was probably the best film I saw this year. Well, certainly the best new film. It’s getting a lot of awards buzz. I hope it does well</li>
  2263. <li><em><strong>(500) Days of Summer</strong></em> [4] 2024-11-03<br/>
  2264. I don’t think I had seen this since soon after it was released. It was great to see it again</li>
  2265. <li><em><strong>Bird</strong></em> [3] 2024-11-05<br/>
  2266. This was slightly strange. I’ve seen a few films about the grimness of life on council estates. But this one threw in a bit of magical realism that didn’t really work for me</li>
  2267. <li><em><strong>Sideways</strong></em> [3.5] 2024-11-10<br/>
  2268. Another film I hadn’t watched for far too long</li>
  2269. <li><em><strong>Sunshine</strong></em> [4] 2024-11-17<br/>
  2270. This is one of my favourite recent(ish) scifi films. I saw it on the Science Museum’s IMAX screen in 2023, but I wasn’t going to skip the chance to see it again</li>
  2271. <li><em><strong>Conclave</strong></em> [3.5] 2024-11-19<br/>
  2272. Occasionally, this series gives you a chance to see something that’s going to be up for plenty of awards. This was a good example. I enjoyed it</li>
  2273. <li><em><strong>The Grand Budapest Hotel</strong></em> [4] 2024-11-24<br/>
  2274. I’ve been slightly disappointed with a few recent Wes Anderson films, so it was great to have the opportunity to see one of his best back on the big screen</li>
  2275. <li><em><strong>The Universal Theory</strong></em> [4] 2024-11-26<br/>
  2276. I knew nothing about this going into it. And it was a fabulous film. Mysteries and quantum physics in  the Swiss Alps. And all filmed in black and white. This didn’t get the coverage it deserved.</li>
  2277. <li><strong><em>Home Alone</em></strong> [2] 2024-12-08<br/>
  2278. I thought I had never seen this before. But apparently I logged watching it many years ago. I know everyone loves it, but I couldn’t see the point</li>
  2279. <li><strong><em>The Apartment</em></strong> [4] 2024-12-15<br/>
  2280. This was interesting. I have a background quest to watch all of the Best Picture Oscar winners and I hadn’t seen this one. I knew absolutely nothing about it. I thought it was really good</li>
  2281. <li><strong><em>The Taste of Things</em></strong> [3.5] 2024-12-21<br/>
  2282. A film that I didn’t get to see earlier in the year. It’s largely about cooking in a late-nineteenth century French country kitchen. It would make an interesting watch alongside <em>The Remains of the Day</em></li>
  2283. <li><strong><em>Christmas Eve in Miller’s Point</em></strong> [2] 2024-12-24<br/>
  2284. I didn’t understand this at all. It went nowhere and said nothing interesting. A large family meets up for their traditional Christmas Eve. No-one enjoys themself</li>
  2285. <li><strong><em>La Chimera</em></strong> [2] 2024-12-29<br/>
  2286. And finishing on a bit of a low. I don’t understand why this got so many good reviews. Maybe I just wasn’t in the right mood for it. Something about criminals looking for ancient relics in Italy</li>
  2287. </ol>
  2288. <p>The post <a href="https://blog.dave.org.uk/2024/12/picturehouse-film-club.html">Picturehouse Film Club</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2289. </div>
  2290.    </content>
  2291.    <summary type="xhtml">
  2292.      <div xmlns="http://www.w3.org/1999/xhtml"><p>I’ve been a member of Picturehouse Cinemas for something approaching twenty years. It costs about £60 a year and for that, you get five free tickets and discounts on your tickets and snacks. I’ve often wondered whether it’s worth paying for, but in the last couple of years, they’ve added an extra feature that makes… <a class="more-link" href="https://blog.dave.org.uk/2024/12/picturehouse-film-club.html">Continue reading <span class="screen-reader-text">Picturehouse Film Club</span></a></p>
  2293. <p>The post <a href="https://blog.dave.org.uk/2024/12/picturehouse-film-club.html">Picturehouse Film Club</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2294. </div>
  2295.    </summary>
  2296.    <author>
  2297.      <name>Dave Cross</name>
  2298.    </author>
  2299.    <id>https://blog.dave.org.uk/?p=3947</id>
  2300.    <published>2024-12-31T16:05:13Z</published>
  2301.    <updated>2024-12-31T16:05:13Z</updated>
  2302.    <category term="film"/>
  2303.    <category term="2024"/>
  2304.    <category term="clapham"/>
  2305.    <category term="film club"/>
  2306.    <category term="picturehouse"/>
  2307.  </entry>
  2308.  <entry>
  2309.    <title>Royal Titles Decoded: What Makes a Prince or Princess? — Line of Succession Blog</title>
  2310.    <link rel="alternate" href="https://medium.com/line-of-succession/royal-titles-decoded-what-makes-a-prince-or-princess-line-of-succession-blog-ff8cbe15a1cc?source=rss-3781feb8a4f4------2" type="text/html"/>
  2311.    <content type="html">&lt;h3&gt;Royal Titles Decoded: What Makes a Prince or Princess? — Line of Succession Blog&lt;/h3&gt;&lt;figure&gt;&lt;img alt="Letters Patent issued by George V in 1917" src="https://cdn-images-1.medium.com/max/768/1*0Mri416usTFwznC_oH68sw.jpeg" /&gt;&lt;/figure&gt;&lt;p&gt;Royal titles in the United Kingdom carry a rich tapestry of history, embodying centuries of tradition while adapting to the changing landscape of the modern world. This article delves into the structure of these titles, focusing on significant changes made during the 20th and 21st centuries, and how these rules affect current royals.&lt;/p&gt;&lt;h4&gt;The Foundations: Letters Patent of 1917&lt;/h4&gt;&lt;p&gt;The framework for today’s royal titles was significantly shaped by the Letters Patent issued by King George V in 1917. This document was pivotal in redefining who in the royal family would be styled with “His or Her Royal Highness” (HRH) and as a prince or princess. Specifically, the 1917 Letters Patent restricted these styles to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The sons and daughters of a sovereign.&lt;/li&gt;&lt;li&gt;The male-line grandchildren of a sovereign.&lt;/li&gt;&lt;li&gt;The eldest living son of the eldest son of the Prince of Wales.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This move was partly in response to the anti-German sentiment of World War I, aiming to streamline the monarchy and solidify its British identity by reducing the number of royals with German titles.&lt;/p&gt;&lt;p&gt;Notice that the definitions talk about “a sovereign”, not “the sovereign”. This means that when the sovereign changes, no-one will lose their royal title (for example, Prince Andrew is still the son of &lt;em&gt;a&lt;/em&gt; sovereign, even though he is no longer the son of &lt;em&gt;the&lt;/em&gt; sovereign). However, people can gain royal titles when the sovereign changes — we will see examples below.&lt;/p&gt;&lt;h4&gt;Extension by George VI in 1948&lt;/h4&gt;&lt;p&gt;Understanding the implications of the existing rules as his family grew, King George VI issued a new Letters Patent in 1948 to extend the style of HRH and prince/princess to the children of the future queen, Princess Elizabeth (later Queen Elizabeth II). This was crucial as, without this adjustment, Princess Elizabeth’s children would not automatically have become princes or princesses because they were not male-line grandchildren of the monarch. This ensured that Charles and Anne were born with princely status, despite being the female-line grandchildren of a monarch.&lt;/p&gt;&lt;h4&gt;The Modern Adjustments: Queen Elizabeth II’s 2012 Update&lt;/h4&gt;&lt;p&gt;Queen Elizabeth II’s update to the royal titles in 2012 before the birth of Prince William’s children was another significant modification. The Letters Patent of 2012 decreed that all the children of the eldest son of the Prince of Wales would hold the title of HRH and be styled as prince or princess, not just the eldest son. This move was in anticipation of changes brought about by the Succession to the Crown Act of 2013, which ended the system of male primogeniture, ensuring that the firstborn child of the Prince of Wales, regardless of gender, would be the direct heir to the throne. Without this change, there could have been a situation where Prince William’s first child (and the heir to the throne) was a daughter who wasn’t a princess, whereas her eldest (but younger) brother would have been a prince.&lt;/p&gt;&lt;h4&gt;Impact on Current Royals&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Children of Princess Anne&lt;/strong&gt;: When Anne married Captain Mark Phillips in 1973, he was offered an earldom but declined it. Consequently, their children, Peter Phillips and Zara Tindall, were not born with any titles. This decision reflects Princess Anne’s preference for her children to have a more private life, albeit still active within the royal fold.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Children of Prince Edward&lt;/strong&gt;: Initially, Prince Edward’s children were styled as children of an earl, despite his being a son of the sovereign. Recently, his son James assumed the courtesy title Earl of Wessex, which Prince Edward will inherit in due course from Prince Philip’s titles. His daughter, Lady Louise Windsor, was also styled in line with Edward’s wish for a lower-profile royal status for his children.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Children of Prince Harry:&lt;/strong&gt; When Archie and Lilibet were born, they were not entitled to princely status or HRH. They were great-grandchildren of the monarch and, despite the Queen’s adjustments in 2012, their cousins — George, Charlotte and Louis — were the only great-grandchildren of the monarch with those titles. When their grandfather became king, they became male-line grandchildren of a monarch and, hence, a prince and a princess. It took a while for those changes to be reflected on the royal family website. This presumably gave the royal household time to reflect on the effect of the children’s parents withdrawing from royal life and moving to the USA.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Special Titles: Prince of Wales and Princess Royal&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Prince of Wales&lt;/strong&gt;: Historically granted to the heir apparent, this title is not automatic and needs to be specifically bestowed by the monarch. Prince Charles was created Prince of Wales in 1958, though he had been the heir apparent since 1952. Prince William, on the other hand, received the title in 2022 — just a day after the death of Queen Elizabeth II.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Princess Royal&lt;/strong&gt;: This title is reserved for the sovereign’s eldest daughter but is not automatically reassigned when the previous holder passes away or when a new eldest daughter is born. Queen Elizabeth II was never Princess Royal because her aunt, Princess Mary, held the title during her lifetime. Princess Anne currently holds this title, having received it in 1987.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;The Fade of Titles: Distant Royals&lt;/h4&gt;&lt;p&gt;As the royal family branches out, descendants become too distanced from the throne, removing their entitlement to HRH and princely status. For example, the Duke of Gloucester, Duke of Kent, Prince Michael of Kent and Princess Alexandra all have princely status as male-line grandchildren of George V. Their children are all great-grandchildren of a monarch and, therefore, do not all have royal styles or titles. This reflects a natural trimming of the royal family tree, focusing the monarchy’s public role on those directly in line for succession.&lt;/p&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;p&gt;The evolution of British royal titles reflects both adherence to deep-rooted traditions and responsiveness to modern expectations. These titles not only delineate the structure and hierarchy within the royal family but also adapt to changes in societal norms and the legal landscape, ensuring the British monarchy remains both respected and relevant in the contemporary era.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Originally published at &lt;/em&gt;&lt;a href="https://blog.lineofsuccession.co.uk/2024/04/royal-titles-decoded-what-makes-a-prince-or-princess/"&gt;&lt;em&gt;https://blog.lineofsuccession.co.uk&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on April 25, 2024.&lt;/em&gt;&lt;/p&gt;&lt;img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=ff8cbe15a1cc" width="1" height="1" alt=""&gt;&lt;hr&gt;&lt;p&gt;&lt;a href="https://medium.com/line-of-succession/royal-titles-decoded-what-makes-a-prince-or-princess-line-of-succession-blog-ff8cbe15a1cc"&gt;Royal Titles Decoded: What Makes a Prince or Princess? — Line of Succession Blog&lt;/a&gt; was originally published in &lt;a href="https://medium.com/line-of-succession"&gt;Line of Succession&lt;/a&gt; on Medium, where people are continuing the conversation by highlighting and responding to this story.&lt;/p&gt;</content>
  2312.    <author>
  2313.      <name>Dave Cross</name>
  2314.    </author>
  2315.    <id>https://medium.com/p/ff8cbe15a1cc</id>
  2316.    <published>2024-04-25T13:38:00Z</published>
  2317.    <updated>2024-04-25T13:44:22.543000Z</updated>
  2318.  </entry>
  2319.  <entry>
  2320.    <title>The Tourist</title>
  2321.    <link rel="alternate" href="https://davorg.medium.com/the-tourist-41ea5faabeae?source=rss-3781feb8a4f4------2" type="text/html"/>
  2322.    <content type="html">&lt;figure&gt;&lt;img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jMwOTwfFuoyypgvaDZuDkQ.png" /&gt;&lt;figcaption&gt;The view of the planet [AI-generated image]&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Changing rooms are the same all over the galaxy and this one really played to the stereotype. The lights flickered that little bit more than you’d want them to, a sizeable proportion of the lockers wouldn’t lock and the whole room needed a good clean. It didn’t fit with the eye-watering amount of money we had all paid for the tour.&lt;/p&gt;&lt;p&gt;There were a dozen or so of us changing from our normal clothes into outfits that had been supplied by the tour company — outfits that were supposed to render us invisible when we reached our destination. Not invisible in the “bending light rays around you” way, they would just make us look enough like the local inhabitants that no-one would give us a second glance.&lt;/p&gt;&lt;p&gt;Appropriate changing room etiquette was followed. Everyone was either looking at the floor or into their locker to avoid eye contact with anyone else. People talked in lowered voices to people they had come with. People who, like me, had come alone were silent. I picked up on some of the quiet conversations — they were about the unusual flora and fauna of our location and the unique event we were here to see.&lt;/p&gt;&lt;p&gt;Soon, we had all changed and were ushered into a briefing room where our guide told us many things we already knew. She had slides explaining the physics behind the phenomenon and was at great pains to emphasise the uniqueness of the event. No other planet in the galaxy had been found that met all of the conditions for what we were going to see. She went through the history of tourism to this planet — decades of uncontrolled visits followed by the licensing of a small number of carefully vetted companies like the one we were travelling with.&lt;/p&gt;&lt;p&gt;She then turned to more practical matters. She reiterated that our outfits would allow us to pass for locals, but that we should do all we could to avoid any interactions with the natives. She also reminded us that we should only look at the event through the equipment that we would be issued with on our way down to the planet.&lt;/p&gt;&lt;p&gt;Through a window in the briefing room a planet, our destination, hung in space. Beyond the planet, its star could also be seen.&lt;/p&gt;&lt;p&gt;An hour or so later, we were on the surface of the planet. We were deposited at the top of a grassy hill on the edge of a large crowd of the planet’s inhabitants. Most of us were of the same basic body shape as the quadruped locals and, at first glance at least, passed for them. A few of us were less lucky and had to stay in the vehicles to avoid suspicion.&lt;/p&gt;&lt;p&gt;The timing of the event was well understood and the company had dropped us off early enough that we were able to find a good viewing spot but late enough that we didn’t have long to wait. We had been milling around for half an hour or so when a palpable moment of excitement passed through the crowd and everyone looked to the sky.&lt;/p&gt;&lt;p&gt;Holding the equipment I had been given to my eyes I could see what everyone else had noticed. A small bite seemed to have been taken from the bottom left of the planet’s sun. As we watched, the bite got larger and larger as the planet’s satellite moved in front of the star. The satellite appeared to be a perfect circle, but at the last minute — just before it covered the star completely — it became obvious that the edge wasn’t smooth as gaps between irregularities on the surface (mountains, I suppose) allowed just a few points of light through.&lt;/p&gt;&lt;p&gt;And then the satellite covered the sun and the atmosphere changed completely. The world turned dark and all conversations stopped. All of the local animals went silent. It was magical.&lt;/p&gt;&lt;p&gt;My mind went back to the slides explaining the phenomenon. Obviously, the planet’s satellite and star weren’t the same size, but their distance from the planet exactly balanced their difference in size so they appeared the same size in the sky. And the complex interplay of orbits meant that on rare occasions like this, the satellite would completely and exactly cover the star.&lt;/p&gt;&lt;p&gt;That was what we were there for. This was what was unique about this planet. No other planet in the galaxy had a star and a satellite that appeared exactly the same size in the sky. This is what made the planet the most popular tourist spot in the galaxy.&lt;/p&gt;&lt;p&gt;Ten minutes later, it was over. The satellite continued on its path and the star was gradually uncovered. Our guide bundled us into the transport and back up to our spaceship.&lt;/p&gt;&lt;p&gt;Before leaving the vicinity of the planet, our pilot found three locations in space where the satellite and the star lined up in the same way and created fake eclipses for those of us who had missed taking photos of the real one.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Originally published at &lt;/em&gt;&lt;a href="https://blog.dave.org.uk/2024/04/the-tourist.html"&gt;&lt;em&gt;https://blog.dave.org.uk&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on April 7, 2024.&lt;/em&gt;&lt;/p&gt;&lt;img src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=41ea5faabeae" width="1" height="1" alt=""&gt;</content>
  2323.    <author>
  2324.      <name>Dave Cross</name>
  2325.    </author>
  2326.    <id>https://medium.com/p/41ea5faabeae</id>
  2327.    <published>2024-04-07T09:46:53Z</published>
  2328.    <updated>2024-04-10T17:33:33.321000Z</updated>
  2329.    <category term="astronomy"/>
  2330.    <category term="short-story"/>
  2331.    <category term="writing"/>
  2332.    <category term="fiction"/>
  2333.  </entry>
  2334.  <entry>
  2335.    <title>The Tourist</title>
  2336.    <link rel="alternate" href="https://blog.dave.org.uk/2024/04/the-tourist.html" type="text/html"/>
  2337.    <content type="xhtml">
  2338.      <div xmlns="http://www.w3.org/1999/xhtml"><p><span style="font-weight: 400;">Changing rooms are the same all over the galaxy and this one really played to the stereotype. The lights flickered that little bit more than you’d want them to, a sizeable proportion of the lockers wouldn’t lock and the whole room needed a good clean. It didn’t fit with the eye-watering amount of money we had all paid for the tour.</span></p>
  2339. <p><span style="font-weight: 400;">There were a dozen or so of us changing from our normal clothes into outfits that had been supplied by the tour company – outfits that were supposed to render us invisible when we reached our destination. Not invisible in the “bending light rays around you” way, they would just make us look enough like the local inhabitants that no-one would give us a second glance.</span></p>
  2340. <p><span style="font-weight: 400;">Appropriate changing room etiquette was followed. Everyone was either looking at the floor or into their locker to avoid eye contact with anyone else. People talked in lowered voices to people they had come with. People who, like me, had come alone were silent. I picked up on some of the quiet conversations – they were about the unusual flora and fauna of our location and the unique event we were here to see.</span></p>
  2341. <p><span style="font-weight: 400;">Soon, we had all changed and were ushered into a briefing room where our guide told us many things we already knew. She had slides explaining the physics behind the phenomenon and was at great pains to emphasise the uniqueness of the event. No other planet in the galaxy had been found that met all of the conditions for what we were going to see. She went through the history of tourism to this planet – decades of uncontrolled visits followed by the licensing of a small number of carefully vetted companies like the one we were travelling with.</span></p>
  2342. <p><span style="font-weight: 400;">She then turned to more practical matters. She reiterated that our outfits would allow us to pass for locals, but that we should do all we could to avoid any interactions with the natives. She also reminded us that we should only look at the event through the equipment that we would be issued with on our way down to the planet.</span></p>
  2343. <p><span style="font-weight: 400;">Through a window in the briefing room a planet, our destination, hung in space. Beyond the planet, its star could also be seen.</span></p>
  2344. <p><span style="font-weight: 400;">An hour or so later, we were on the surface of the planet. We were deposited at the top of a grassy hill on the edge of a large crowd of the planet’s inhabitants. Most of us were of the same basic body shape as the quadruped locals and, at first glance at least, passed for them. A few of us were less lucky and had to stay in the vehicles to avoid suspicion.</span></p>
  2345. <p><span style="font-weight: 400;">The timing of the event was well understood and the company had dropped us off early enough that we were able to find a good viewing spot but late enough that we didn’t have long to wait. We had been milling around for half an hour or so when a palpable moment of excitement passed through the crowd and everyone looked to the sky.</span></p>
  2346. <p><span style="font-weight: 400;">Holding the equipment I had been given to my eyes I could see what everyone else had noticed. A small bite seemed to have been taken from the bottom left of the planet’s sun. As we watched, the bite got larger and larger as the planet’s satellite moved in front of the star. The satellite appeared to be a perfect circle, but at the last minute – just before it covered the star completely – it became obvious that the edge wasn’t smooth as gaps between irregularities on the surface (mountains, I suppose) allowed just a few points of light through.</span></p>
  2347. <p><span style="font-weight: 400;">And then the satellite covered the sun and the atmosphere changed completely. The world turned dark and all conversations stopped. All of the local animals went silent. It was magical.</span></p>
  2348. <p><span style="font-weight: 400;">My mind went back to the slides explaining the phenomenon. Obviously, the planet’s satellite and star weren’t the same size, but their distance from the planet exactly balanced their difference in size so they appeared the same size in the sky. And the complex interplay of orbits meant that on rare occasions like this, the satellite would completely and exactly cover the star.</span></p>
  2349. <p><span style="font-weight: 400;">That was what we were there for. This was what was unique about this planet. No other planet in the galaxy had a star and a satellite that appeared exactly the same size in the sky. This is what made the planet the most popular tourist spot in the galaxy.</span></p>
  2350. <p><span style="font-weight: 400;">Ten minutes later, it was over. The satellite continued on its path and the star was gradually uncovered. Our guide bundled us into the transport and back up to our spaceship.</span></p>
  2351. <p><span style="font-weight: 400;">Before leaving the vicinity of the planet, our pilot found three locations in space where the satellite and the star lined up in the same way and created fake eclipses for those of us who had missed taking photos of the real one.</span></p>
  2352. <p>The post <a href="https://blog.dave.org.uk/2024/04/the-tourist.html">The Tourist</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2353. </div>
  2354.    </content>
  2355.    <summary type="xhtml">
  2356.      <div xmlns="http://www.w3.org/1999/xhtml"><p>Changing rooms are the same all over the galaxy and this one really played to the stereotype. The lights flickered that little bit more than you’d want them to, a sizeable proportion of the lockers wouldn’t lock and the whole room needed a good clean. It didn’t fit with the eye-watering amount of money we… <a class="more-link" href="https://blog.dave.org.uk/2024/04/the-tourist.html">Continue reading <span class="screen-reader-text">The Tourist</span></a></p>
  2357. <p>The post <a href="https://blog.dave.org.uk/2024/04/the-tourist.html">The Tourist</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2358. </div>
  2359.    </summary>
  2360.    <author>
  2361.      <name>Dave Cross</name>
  2362.    </author>
  2363.    <id>https://blog.dave.org.uk/?p=3931</id>
  2364.    <published>2024-04-07T09:46:27Z</published>
  2365.    <updated>2024-04-07T09:46:27Z</updated>
  2366.    <category term="writing"/>
  2367.    <category term="astronomy"/>
  2368.    <category term="fiction"/>
  2369.    <category term="tourism"/>
  2370.  </entry>
  2371.  <entry>
  2372.    <title>2023 in Gigs</title>
  2373.    <link rel="alternate" href="https://blog.dave.org.uk/2023/12/2023-in-gigs.html" type="text/html"/>
  2374.    <content type="html">
  2375. &lt;p&gt;I really thought that 2023 would be the year I got back into the swing of seeing gigs. But, somehow I ended up seeing even fewer than I did in 2022 &amp;#8211; 12, when I saw 16 the previous year. Sometimes, I look at &lt;a href="https://martinbelam.com/category/music/gig-reviews/"&gt;Martin&amp;#8217;s monthly gig round-ups&lt;/a&gt; and wonder what I&amp;#8217;m doing with my life!&lt;/p&gt;
  2376.  
  2377.  
  2378.  
  2379. &lt;p&gt;I normally list my ten favourite gigs of the year, but it would be rude to miss just two gigs from the list, so here are all twelve gigs I saw this year &amp;#8211; in, as always, chronological order.&lt;/p&gt;
  2380.  
  2381.  
  2382.  
  2383. &lt;ul class="wp-block-list"&gt;
  2384. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40810079-john-grant-at-st-jamess-church-piccadilly"&gt;&lt;strong&gt;John Grant (supported by The Faultress) at St. James&amp;#8217;s Church&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;John Grant has become one of those artists I try to see whenever they pass through London. And this was a particularly special night as he was playing an acoustic set in one of the most atmospheric venues in London. The evening was only slightly marred by the fact I arrived too late to get a decent seat and ended up not being able to see anything.&lt;/li&gt;
  2385.  
  2386.  
  2387.  
  2388. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40660413-hannah-peel-at-kings-place"&gt;&lt;strong&gt;Hannah Peel at Kings Place&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Hannah Peel was the artist in residence at Kings Place for a few months during the year and played three gigs during that time. This was the first of them &amp;#8211; where she played her recent album, &lt;em&gt;Fir Wave&lt;/em&gt;, in its entirety. A very laid-back and thoroughly enjoyable evening.&lt;/li&gt;
  2389.  
  2390.  
  2391.  
  2392. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40792448-orbital-at-eventim-apollo"&gt;&lt;strong&gt;Orbital at the Eventim Apollo&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;I&amp;#8217;ve been meaning to get around to seeing Orbital for many years. This show was originally planned to be at the Brixton Academy but as that venue is currently closed, it was relocated to Hammersmith. To be honest, this evening was slightly hampered by the fact I don&amp;#8217;t know as much of their work as I thought I did and it was all a bit samey. I ended up leaving before the encore.&lt;/li&gt;
  2393.  
  2394.  
  2395.  
  2396. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40755436-duran-duran-at-o2"&gt;&lt;strong&gt;Duran Duran (supported by Jake Shears) at the O2 Arena&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Continuing my quest to see all of the bands I was listening to in the 80s (and, simultaneously, ticking off the one visit to the O2 that I allow myself each year). I really enjoyed the nostalgia of seeing Duran Duran but, to be honest, I think I enjoyed Jake Shears more &amp;#8211; and it was the Scissor Sisters I was listening to on the way home.&lt;/li&gt;
  2397.  
  2398.  
  2399.  
  2400. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40662722-hannah-peel-at-kings-place"&gt;&lt;strong&gt;Hannah Peel and Beibei Wang at Kings Place&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Even in a year where I only see a few gigs, I still manage to see artists more than once. This was the second of Hannah Peel&amp;#8217;s artist-in-residence shows. She appeared with Chinese percussionist Beibei Wang in a performance that was completely spontaneous and unrehearsed. Honestly, some parts were more successful than others, but it was certainly an interesting experience.&lt;/li&gt;
  2401.  
  2402.  
  2403.  
  2404. &lt;li&gt;&lt;strong&gt;Songs from Summerisle at the Barbican Hall&lt;/strong&gt;&lt;br&gt;&lt;em&gt;The Wicker Man&lt;/em&gt; is one of my favourite films, so I jumped at the chance to see the songs from the soundtrack performed live. But unfortunately, the evening was a massive disappointment. The band sounded like they had met just before the show and, while they all obviously knew the songs, they hadn&amp;#8217;t rehearsed them together. Maybe they were going for a rustic feel &amp;#8211; but, to me, it just sounded unprofessional.&lt;/li&gt;
  2405.  
  2406.  
  2407.  
  2408. &lt;li&gt;&lt;a href="https://www.songkick.com/concerts/40752925-belle-and-sebastian-at-roundhouse"&gt;&lt;strong&gt;Belle and Sebastian at the Roundhouse&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Another act that I try to see as often as possible. I know some people see Belle and Sebastian as the most &lt;em&gt;Guardian&lt;/em&gt;-reader band ever &amp;#8211; but I love them. This show saw them on top form.&lt;/li&gt;
  2409.  
  2410.  
  2411.  
  2412. &lt;li&gt;&lt;strong&gt;&lt;a href="https://www.songkick.com/concerts/40880411-jon-anderson-at-o2-shepherds-bush-empire"&gt;Jon Anderson and the Paul Green Rock Academy at the Shepherds Bush Empire&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;I&amp;#8217;ve seen Yes play live a few times in the last ten years or so and, to be honest, it can sometimes be a bit over-serious and dull. In this show, Jon Anderson sang a load of old Yes songs with a group of teenagers from the Paul Green Rock Academy (the school that &lt;em&gt;School of Rock&lt;/em&gt; was based on) and honestly, the teenagers brought such a feeling of fun to the occasion that it was probably the best Yes-related show that I&amp;#8217;ve seen.&lt;/li&gt;
  2413.  
  2414.  
  2415.  
  2416. &lt;li&gt;&lt;strong&gt;&lt;a href="https://www.songkick.com/concerts/41093083-john-grant-at-barbican-centre"&gt;John Grant and Richard Hawley at the Barbican Hall&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;Another repeated act &amp;#8211; my second time seeing John Grant in a year. This was something different as he was playing a selection of Patsy Cline songs. I don&amp;#8217;t listen to Patsy Cline much, but I knew a few more of the songs than I expected to. This was a bit lower-key than I was expecting.&lt;/li&gt;
  2417.  
  2418.  
  2419.  
  2420. &lt;li&gt;&lt;strong&gt;&lt;a href="https://www.songkick.com/concerts/40765146-peter-hook-and-the-light-at-eventim-apollo"&gt;Peter Hook and the Light at the Eventim Apollo&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;I&amp;#8217;ve been planning to see Peter Hook and the Light for a couple of years. There was a show I had tickets for in 2020, but it was postponed because of COVID and when it was rescheduled, I was unable to go, so I cancelled my ticket and got a refund. So I was pleased to get another chance. And this show had them playing both of the &lt;em&gt;Substance &lt;/em&gt;albums (Joy Division and New Order). I know New Order still play some Joy Division songs in their sets, but this is probably the best chance I&amp;#8217;ll have to see some deep Joy Division cuts played live. I really enjoyed this show.&lt;/li&gt;
  2421.  
  2422.  
  2423.  
  2424. &lt;li&gt;&lt;strong&gt;&lt;a href="https://www.songkick.com/concerts/41086395-heaven-17-at-o2-shepherds-bush-empire"&gt;Heaven 17 at the Shepherds Bush Empire&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;It seems I see Heaven 17 live most years and they usually appear on my &amp;#8220;best of&amp;#8221; lists. This show was celebrating the fortieth anniversary of their album &lt;em&gt;The Luxury Gap&lt;/em&gt; &amp;#8211; so that got played in full, alongside many other Heaven 17 and Human League songs. A thoroughly enjoyable night.&lt;/li&gt;
  2425.  
  2426.  
  2427.  
  2428. &lt;li&gt;&lt;strong&gt;&lt;a href="https://www.songkick.com/concerts/41519083-afro-celt-sound-system-official-at-roundhouse"&gt;The Imagined Village and Afro-Celt Sound System at the Roundhouse&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;I&amp;#8217;ve seen both The Imagined Village and the Afro-Celts live once before. And they were two of the best gigs I&amp;#8217;ve ever seen. I pretty much assumed that the death of Simon Emmerson (who was an integral part of both bands) earlier in 2023 would mean that both bands would stop performing. But this show was a tribute to Emmerson and the bands both reformed to celebrate his work. This was probably my favourite gig of the year. That&amp;#8217;s The Imagined Village (featuring two Carthys, dour Coppers and Billy Bragg) in the photo at the top of this post.&lt;/li&gt;
  2429. &lt;/ul&gt;
  2430.  
  2431.  
  2432.  
  2433. &lt;p&gt;So, what&amp;#8217;s going to happen in 2024. I wonder if I&amp;#8217;ll get back into the habit of going to more shows. I only have a ticket for one gig next year &amp;#8211; They Might Be Giants playing &lt;em&gt;Flood &lt;/em&gt;in November (a show that was postponed from this year). I guess we&amp;#8217;ll see. Tune in this time next year to see what happened.&lt;/p&gt;
  2434. &lt;p&gt;The post &lt;a href="https://blog.dave.org.uk/2023/12/2023-in-gigs.html"&gt;2023 in Gigs&lt;/a&gt; appeared first on &lt;a href="https://blog.dave.org.uk"&gt;Davblog&lt;/a&gt;.&lt;/p&gt;
  2435. </content>
  2436.    <summary type="xhtml">
  2437.      <div xmlns="http://www.w3.org/1999/xhtml"><p>I really thought that 2023 would be the year I got back into the swing of seeing gigs. But, somehow I ended up seeing even fewer than I did in 2022 – 12, when I saw 16 the previous year. Sometimes, I look at Martin’s monthly gig round-ups and wonder what I’m doing with my… <a class="more-link" href="https://blog.dave.org.uk/2023/12/2023-in-gigs.html">Continue reading <span class="screen-reader-text">2023 in Gigs</span></a></p>
  2438. <p>The post <a href="https://blog.dave.org.uk/2023/12/2023-in-gigs.html">2023 in Gigs</a> appeared first on <a href="https://blog.dave.org.uk">Davblog</a>.</p>
  2439. </div>
  2440.    </summary>
  2441.    <author>
  2442.      <name>Dave Cross</name>
  2443.    </author>
  2444.    <id>https://blog.dave.org.uk/?p=3923</id>
  2445.    <published>2023-12-31T13:47:25Z</published>
  2446.    <updated>2023-12-31T13:47:25Z</updated>
  2447.    <category term="music"/>
  2448.    <category term="2023"/>
  2449.    <category term="gigs"/>
  2450.    <category term="review"/>
  2451.    <category term="year in gigs"/>
  2452.  </entry>
  2453.  <entry>
  2454.    <title>Ratio: The Simple Codes Behind the Craft of Everyday Cooking (1) (Ruhlman's Ratios)</title>
  2455.    <link rel="alternate" href="https://www.goodreads.com/review/show/5328005075?utm_medium=api&amp;utm_source=rss" type="text/html"/>
  2456.    <content type="xhtml">
  2457.      <div xmlns="http://www.w3.org/1999/xhtml">
  2458.      
  2459.      <a href="https://www.goodreads.com/book/show/3931154-ratio?utm_medium=api&amp;utm_source=rss"><img alt="Ratio: The Simple Codes Behind the Craft of Everyday Cooking (1) (Ruhlman's Ratios)" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1348460187l/3931154._SY75_.jpg"/></a><br/>
  2460.                                      author: Michael Ruhlman<br/>
  2461.                                      name: David<br/>
  2462.                                      average rating: 4.06<br/>
  2463.                                      book published: 2009<br/>
  2464.                                      rating: 0<br/>
  2465.                                      read at: <br/>
  2466.                                      date added: 2023/02/06<br/>
  2467.                                      shelves: currently-reading<br/>
  2468.                                      review: <br/><br/>
  2469.                                      
  2470.    </div>
  2471.    </content>
  2472.    <id>https://www.goodreads.com/review/show/5328005075?utm_medium=api&amp;utm_source=rss</id>
  2473.    <published>2023-02-06T14:03:05-08:00</published>
  2474.    <updated>2023-02-06T14:03:05-08:00</updated>
  2475.  </entry>
  2476.  <entry xmlns:flickr="urn:flickr:user" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2477.    <title>Goodbye Vivienne</title>
  2478.    <link rel="alternate" type="text/html" href="https://www.flickr.com/photos/davorg/52595592514/"/>
  2479.    <id>tag:flickr.com,2005:/photo/52595592514</id>
  2480.    <published>2022-12-30T09:15:29Z</published>
  2481.    <updated>2022-12-30T09:15:29Z</updated>
  2482.    <flickr:date_taken>2022-12-30T09:15:29-08:00</flickr:date_taken>
  2483.    <dc:date.Taken>2022-12-30T09:15:29-08:00</dc:date.Taken>
  2484.    <content type="html"> &lt;p&gt;&lt;a href="https://www.flickr.com/people/davorg/"&gt;Dave Cross&lt;/a&gt; posted a photo:&lt;/p&gt;
  2485. &lt;p&gt;&lt;a href="https://www.flickr.com/photos/davorg/52595592514/" title="Goodbye Vivienne"&gt;&lt;img src="https://live.staticflickr.com/65535/52595592514_49586513b2_m.jpg" width="240" height="240" alt="Goodbye Vivienne" /&gt;&lt;/a&gt;&lt;/p&gt;
  2486.  
  2487. &lt;p&gt;via Instagram &lt;a href="https://instagr.am/p/CmyT_MSNR3-/" rel="noreferrer nofollow"&gt;instagr.am/p/CmyT_MSNR3-/&lt;/a&gt;&lt;/p&gt;
  2488. </content>
  2489.    <author>
  2490.      <name>Dave Cross</name>
  2491.      <uri>https://www.flickr.com/people/davorg/</uri>
  2492.      <flickr:nsid>39021241@N00</flickr:nsid>
  2493.      <flickr:buddyicon>https://farm5.staticflickr.com/4759/buddyicons/39021241@N00.jpg?1516110776#39021241@N00</flickr:buddyicon>
  2494.    </author>
  2495.    <link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc-sa/2.0/deed.en"/>
  2496.    <link rel="enclosure" type="image/jpeg" href="https://live.staticflickr.com/65535/52595592514_49586513b2_b.jpg"/>
  2497.    <category term="ifttt" scheme="https://www.flickr.com/photos/tags/"/>
  2498.    <category term="instagram" scheme="https://www.flickr.com/photos/tags/"/>
  2499.    <displaycategories>
  2500.            </displaycategories>
  2501.    </entry>
  2502.  <entry xmlns:flickr="urn:flickr:user" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2503.    <title>Low sun on Clapham Common this morning</title>
  2504.    <link rel="alternate" type="text/html" href="https://www.flickr.com/photos/davorg/52593755903/"/>
  2505.    <id>tag:flickr.com,2005:/photo/52593755903</id>
  2506.    <published>2022-12-29T10:40:20Z</published>
  2507.    <updated>2022-12-29T10:40:20Z</updated>
  2508.    <flickr:date_taken>2022-12-29T10:40:20-08:00</flickr:date_taken>
  2509.    <dc:date.Taken>2022-12-29T10:40:20-08:00</dc:date.Taken>
  2510.    <content type="html"> &lt;p&gt;&lt;a href="https://www.flickr.com/people/davorg/"&gt;Dave Cross&lt;/a&gt; posted a photo:&lt;/p&gt;
  2511. &lt;p&gt;&lt;a href="https://www.flickr.com/photos/davorg/52593755903/" title="Low sun on Clapham Common this morning"&gt;&lt;img src="https://live.staticflickr.com/65535/52593755903_ec090ddc46_m.jpg" width="240" height="240" alt="Low sun on Clapham Common this morning" /&gt;&lt;/a&gt;&lt;/p&gt;
  2512.  
  2513. &lt;p&gt;via Instagram &lt;a href="https://instagr.am/p/Cmv4y1eNiPn/" rel="noreferrer nofollow"&gt;instagr.am/p/Cmv4y1eNiPn/&lt;/a&gt;&lt;/p&gt;
  2514. </content>
  2515.    <author>
  2516.      <name>Dave Cross</name>
  2517.      <uri>https://www.flickr.com/people/davorg/</uri>
  2518.      <flickr:nsid>39021241@N00</flickr:nsid>
  2519.      <flickr:buddyicon>https://farm5.staticflickr.com/4759/buddyicons/39021241@N00.jpg?1516110776#39021241@N00</flickr:buddyicon>
  2520.    </author>
  2521.    <link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc-sa/2.0/deed.en"/>
  2522.    <link rel="enclosure" type="image/jpeg" href="https://live.staticflickr.com/65535/52593755903_ec090ddc46_b.jpg"/>
  2523.    <category term="ifttt" scheme="https://www.flickr.com/photos/tags/"/>
  2524.    <category term="instagram" scheme="https://www.flickr.com/photos/tags/"/>
  2525.    <displaycategories>
  2526.            </displaycategories>
  2527.    </entry>
  2528.  <entry xmlns:flickr="urn:flickr:user" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2529.    <title>There are about a dozen parakeets in this tree. I can hear them and (occasionally) see them</title>
  2530.    <link rel="alternate" type="text/html" href="https://www.flickr.com/photos/davorg/52593496674/"/>
  2531.    <id>tag:flickr.com,2005:/photo/52593496674</id>
  2532.    <published>2022-12-29T10:40:17Z</published>
  2533.    <updated>2022-12-29T10:40:17Z</updated>
  2534.    <flickr:date_taken>2022-12-29T10:40:17-08:00</flickr:date_taken>
  2535.    <dc:date.Taken>2022-12-29T10:40:17-08:00</dc:date.Taken>
  2536.    <content type="html"> &lt;p&gt;&lt;a href="https://www.flickr.com/people/davorg/"&gt;Dave Cross&lt;/a&gt; posted a photo:&lt;/p&gt;
  2537. &lt;p&gt;&lt;a href="https://www.flickr.com/photos/davorg/52593496674/" title="There are about a dozen parakeets in this tree. I can hear them and (occasionally) see them"&gt;&lt;img src="https://live.staticflickr.com/65535/52593496674_6b0a00304d_m.jpg" width="240" height="240" alt="There are about a dozen parakeets in this tree. I can hear them and (occasionally) see them" /&gt;&lt;/a&gt;&lt;/p&gt;
  2538.  
  2539. &lt;p&gt;via Instagram &lt;a href="https://instagr.am/p/Cmv4rUAta58/" rel="noreferrer nofollow"&gt;instagr.am/p/Cmv4rUAta58/&lt;/a&gt;&lt;/p&gt;
  2540. </content>
  2541.    <author>
  2542.      <name>Dave Cross</name>
  2543.      <uri>https://www.flickr.com/people/davorg/</uri>
  2544.      <flickr:nsid>39021241@N00</flickr:nsid>
  2545.      <flickr:buddyicon>https://farm5.staticflickr.com/4759/buddyicons/39021241@N00.jpg?1516110776#39021241@N00</flickr:buddyicon>
  2546.    </author>
  2547.    <link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc-sa/2.0/deed.en"/>
  2548.    <link rel="enclosure" type="image/jpeg" href="https://live.staticflickr.com/65535/52593496674_6b0a00304d_b.jpg"/>
  2549.    <category term="ifttt" scheme="https://www.flickr.com/photos/tags/"/>
  2550.    <category term="instagram" scheme="https://www.flickr.com/photos/tags/"/>
  2551.    <displaycategories>
  2552.            </displaycategories>
  2553.    </entry>
  2554.  <entry xmlns:flickr="urn:flickr:user" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2555.    <title>Sunrise on Clapham Common</title>
  2556.    <link rel="alternate" type="text/html" href="https://www.flickr.com/photos/davorg/52589267684/"/>
  2557.    <id>tag:flickr.com,2005:/photo/52589267684</id>
  2558.    <published>2022-12-27T12:12:03Z</published>
  2559.    <updated>2022-12-27T12:12:03Z</updated>
  2560.    <flickr:date_taken>2022-12-27T12:12:03-08:00</flickr:date_taken>
  2561.    <dc:date.Taken>2022-12-27T12:12:03-08:00</dc:date.Taken>
  2562.    <content type="html"> &lt;p&gt;&lt;a href="https://www.flickr.com/people/davorg/"&gt;Dave Cross&lt;/a&gt; posted a photo:&lt;/p&gt;
  2563. &lt;p&gt;&lt;a href="https://www.flickr.com/photos/davorg/52589267684/" title="Sunrise on Clapham Common"&gt;&lt;img src="https://live.staticflickr.com/65535/52589267684_b2cf79a732_m.jpg" width="240" height="240" alt="Sunrise on Clapham Common" /&gt;&lt;/a&gt;&lt;/p&gt;
  2564.  
  2565. &lt;p&gt;via Instagram &lt;a href="https://instagr.am/p/Cmq759NtKtE/" rel="noreferrer nofollow"&gt;instagr.am/p/Cmq759NtKtE/&lt;/a&gt;&lt;/p&gt;
  2566. </content>
  2567.    <author>
  2568.      <name>Dave Cross</name>
  2569.      <uri>https://www.flickr.com/people/davorg/</uri>
  2570.      <flickr:nsid>39021241@N00</flickr:nsid>
  2571.      <flickr:buddyicon>https://farm5.staticflickr.com/4759/buddyicons/39021241@N00.jpg?1516110776#39021241@N00</flickr:buddyicon>
  2572.    </author>
  2573.    <link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc-sa/2.0/deed.en"/>
  2574.    <link rel="enclosure" type="image/jpeg" href="https://live.staticflickr.com/65535/52589267684_b2cf79a732_b.jpg"/>
  2575.    <category term="ifttt" scheme="https://www.flickr.com/photos/tags/"/>
  2576.    <category term="instagram" scheme="https://www.flickr.com/photos/tags/"/>
  2577.    <displaycategories>
  2578.            </displaycategories>
  2579.    </entry>
  2580.  <entry xmlns:flickr="urn:flickr:user" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2581.    <title>Brixton Academy</title>
  2582.    <link rel="alternate" type="text/html" href="https://www.flickr.com/photos/davorg/52566997229/"/>
  2583.    <id>tag:flickr.com,2005:/photo/52566997229</id>
  2584.    <published>2022-12-16T11:16:52Z</published>
  2585.    <updated>2022-12-16T11:16:52Z</updated>
  2586.    <flickr:date_taken>2022-12-16T11:16:52-08:00</flickr:date_taken>
  2587.    <dc:date.Taken>2022-12-16T11:16:52-08:00</dc:date.Taken>
  2588.    <content type="html"> &lt;p&gt;&lt;a href="https://www.flickr.com/people/davorg/"&gt;Dave Cross&lt;/a&gt; posted a photo:&lt;/p&gt;
  2589. &lt;p&gt;&lt;a href="https://www.flickr.com/photos/davorg/52566997229/" title="Brixton Academy"&gt;&lt;img src="https://live.staticflickr.com/65535/52566997229_4108602407_m.jpg" width="240" height="240" alt="Brixton Academy" /&gt;&lt;/a&gt;&lt;/p&gt;
  2590.  
  2591. &lt;p&gt;via Instagram &lt;a href="https://instagr.am/p/CmOfgfLtwL_/" rel="noreferrer nofollow"&gt;instagr.am/p/CmOfgfLtwL_/&lt;/a&gt;&lt;/p&gt;
  2592. </content>
  2593.    <author>
  2594.      <name>Dave Cross</name>
  2595.      <uri>https://www.flickr.com/people/davorg/</uri>
  2596.      <flickr:nsid>39021241@N00</flickr:nsid>
  2597.      <flickr:buddyicon>https://farm5.staticflickr.com/4759/buddyicons/39021241@N00.jpg?1516110776#39021241@N00</flickr:buddyicon>
  2598.    </author>
  2599.    <link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc-sa/2.0/deed.en"/>
  2600.    <link rel="enclosure" type="image/jpeg" href="https://live.staticflickr.com/65535/52566997229_4108602407_b.jpg"/>
  2601.    <category term="ifttt" scheme="https://www.flickr.com/photos/tags/"/>
  2602.    <category term="instagram" scheme="https://www.flickr.com/photos/tags/"/>
  2603.    <displaycategories>
  2604.            </displaycategories>
  2605.    </entry>
  2606.  <entry>
  2607.    <title>S.</title>
  2608.    <link rel="alternate" href="https://www.goodreads.com/review/show/4481423010?utm_medium=api&amp;utm_source=rss" type="text/html"/>
  2609.    <content type="xhtml">
  2610.      <div xmlns="http://www.w3.org/1999/xhtml">
  2611.      
  2612.      <a href="https://www.goodreads.com/book/show/17860739-s?utm_medium=api&amp;utm_source=rss"><img alt="S." src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1378767595l/17860739._SY75_.jpg"/></a><br/>
  2613.                                      author: J.J. Abrams<br/>
  2614.                                      name: David<br/>
  2615.                                      average rating: 3.86<br/>
  2616.                                      book published: 2013<br/>
  2617.                                      rating: 0<br/>
  2618.                                      read at: <br/>
  2619.                                      date added: 2022/01/16<br/>
  2620.                                      shelves: currently-reading<br/>
  2621.                                      review: <br/><br/>
  2622.                                      
  2623.    </div>
  2624.    </content>
  2625.    <id>https://www.goodreads.com/review/show/4481423010?utm_medium=api&amp;utm_source=rss</id>
  2626.    <published>2022-01-16T14:03:01-08:00</published>
  2627.    <updated>2022-01-16T14:03:01-08:00</updated>
  2628.  </entry>
  2629.  <entry>
  2630.    <title>The Introvert Entrepreneur</title>
  2631.    <link rel="alternate" href="https://www.goodreads.com/review/show/3162730028?utm_medium=api&amp;utm_source=rss" type="text/html"/>
  2632.    <content type="xhtml">
  2633.      <div xmlns="http://www.w3.org/1999/xhtml">
  2634.      
  2635.      <a href="https://www.goodreads.com/book/show/24970944-the-introvert-entrepreneur?utm_medium=api&amp;utm_source=rss"><img alt="The Introvert Entrepreneur" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1533022525l/24970944._SY75_.jpg"/></a><br/>
  2636.                                      author: Beth Buelow<br/>
  2637.                                      name: David<br/>
  2638.                                      average rating: 3.37<br/>
  2639.                                      book published: 2015<br/>
  2640.                                      rating: 0<br/>
  2641.                                      read at: <br/>
  2642.                                      date added: 2020/01/27<br/>
  2643.                                      shelves: currently-reading<br/>
  2644.                                      review: <br/><br/>
  2645.                                      
  2646.    </div>
  2647.    </content>
  2648.    <id>https://www.goodreads.com/review/show/3162730028?utm_medium=api&amp;utm_source=rss</id>
  2649.    <published>2020-01-27T02:49:21-08:00</published>
  2650.    <updated>2020-01-27T02:49:21-08:00</updated>
  2651.  </entry>
  2652.  <entry>
  2653.    <title>Measuring the Quality of Your Perl Code</title>
  2654.    <link rel="alternate" href="https://www.slideshare.net/slideshow/measuring-the-quality-of-your-perl-code-162990735/162990735" type="text/html"/>
  2655.    <content type="html">
  2656.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/measuringthequalityofyourperlcode-190811142319-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; Some thoughts on ways to measure the quality of Perl code (and, hence, get a basis for improving it)
  2657.      </content>
  2658.    <summary type="html">
  2659.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/measuringthequalityofyourperlcode-190811142319-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; Some thoughts on ways to measure the quality of Perl code (and, hence, get a basis for improving it)
  2660.      </summary>
  2661.    <author>
  2662.      <name>davorg@slideshare.net(davorg)</name>
  2663.    </author>
  2664.    <id>https://www.slideshare.net/slideshow/measuring-the-quality-of-your-perl-code-162990735/162990735</id>
  2665.    <published>2019-08-11T14:23:19Z</published>
  2666.    <updated>2019-08-11T14:23:19Z</updated>
  2667.  </entry>
  2668.  <entry>
  2669.    <title>Apollo 11 at 50 - A Simple Twitter Bot</title>
  2670.    <link rel="alternate" href="https://www.slideshare.net/slideshow/apollo-11-at-50-a-simple-twitter-bot/162989812" type="text/html"/>
  2671.    <content type="html">
  2672.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/apollo-190811141300-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; How (and why) I spent 90 minutes writing a Twitterbot that tweeted the Apollo 11 mission timeline (shifted by 50 years)
  2673.      </content>
  2674.    <summary type="html">
  2675.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/apollo-190811141300-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; How (and why) I spent 90 minutes writing a Twitterbot that tweeted the Apollo 11 mission timeline (shifted by 50 years)
  2676.      </summary>
  2677.    <author>
  2678.      <name>davorg@slideshare.net(davorg)</name>
  2679.    </author>
  2680.    <id>https://www.slideshare.net/slideshow/apollo-11-at-50-a-simple-twitter-bot/162989812</id>
  2681.    <published>2019-08-11T14:13:00Z</published>
  2682.    <updated>2019-08-11T14:13:00Z</updated>
  2683.  </entry>
  2684.  <entry>
  2685.    <title>Monoliths, Balls of Mud and Silver Bullets</title>
  2686.    <link rel="alternate" href="https://www.slideshare.net/slideshow/monoliths-balls-of-mud-and-silver-bullets-162989542/162989542" type="text/html"/>
  2687.    <content type="html">
  2688.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/monoliths-190811141027-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; A talk from the European Perl Conference 2019 (but not about Perl)
  2689.      </content>
  2690.    <summary type="html">
  2691.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/monoliths-190811141027-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; A talk from the European Perl Conference 2019 (but not about Perl)
  2692.      </summary>
  2693.    <author>
  2694.      <name>davorg@slideshare.net(davorg)</name>
  2695.    </author>
  2696.    <id>https://www.slideshare.net/slideshow/monoliths-balls-of-mud-and-silver-bullets-162989542/162989542</id>
  2697.    <published>2019-08-11T14:10:27Z</published>
  2698.    <updated>2019-08-11T14:10:27Z</updated>
  2699.  </entry>
  2700.  <entry>
  2701.    <title>Prawn Cocktail Years</title>
  2702.    <link rel="alternate" href="https://www.goodreads.com/review/show/2915458648?utm_medium=api&amp;utm_source=rss" type="text/html"/>
  2703.    <content type="xhtml">
  2704.      <div xmlns="http://www.w3.org/1999/xhtml">
  2705.      
  2706.      <a href="https://www.goodreads.com/book/show/2378986.Prawn_Cocktail_Years?utm_medium=api&amp;utm_source=rss"><img alt="Prawn Cocktail Years" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1488615133l/2378986._SX50_.jpg"/></a><br/>
  2707.                                      author: Lindsey Bareham<br/>
  2708.                                      name: David<br/>
  2709.                                      average rating: 4.50<br/>
  2710.                                      book published: 1999<br/>
  2711.                                      rating: 0<br/>
  2712.                                      read at: <br/>
  2713.                                      date added: 2019/07/29<br/>
  2714.                                      shelves: currently-reading<br/>
  2715.                                      review: <br/><br/>
  2716.                                      
  2717.    </div>
  2718.    </content>
  2719.    <id>https://www.goodreads.com/review/show/2915458648?utm_medium=api&amp;utm_source=rss</id>
  2720.    <published>2019-07-29T03:53:53-07:00</published>
  2721.    <updated>2019-07-29T03:53:53-07:00</updated>
  2722.  </entry>
  2723.  <entry>
  2724.    <title>The Professional Programmer</title>
  2725.    <link rel="alternate" href="https://www.slideshare.net/slideshow/the-professional-programmer-115012386/115012386" type="text/html"/>
  2726.    <content type="html">
  2727.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/tcvqmtxtxcoosqtktwxp-signature-54ef8a2e0bf04eca12a971b40d334e9524d5654cafb99fc7ca3028a7826fc3ab-poli-180917160117-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; The slides from a half-day workshop on career development for programmers that I ran at The Perl Conference in Glasgow
  2728.      </content>
  2729.    <summary type="html">
  2730.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/tcvqmtxtxcoosqtktwxp-signature-54ef8a2e0bf04eca12a971b40d334e9524d5654cafb99fc7ca3028a7826fc3ab-poli-180917160117-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; The slides from a half-day workshop on career development for programmers that I ran at The Perl Conference in Glasgow
  2731.      </summary>
  2732.    <author>
  2733.      <name>davorg@slideshare.net(davorg)</name>
  2734.    </author>
  2735.    <id>https://www.slideshare.net/slideshow/the-professional-programmer-115012386/115012386</id>
  2736.    <published>2018-09-17T16:01:17Z</published>
  2737.    <updated>2018-09-17T16:01:17Z</updated>
  2738.  </entry>
  2739.  <entry>
  2740.    <title>I'm A Republic (Honest!)</title>
  2741.    <link rel="alternate" href="https://www.slideshare.net/slideshow/im-a-republic-honest/91652730" type="text/html"/>
  2742.    <content type="html">
  2743.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/succession-180323080646-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; A (not entirely serious) talk that I gave at the London Perl Mongers technical meeting in March 2018.
  2744.  
  2745. It talks about how and why I build a web site listing the line of succession to the British throne back through history.
  2746.      </content>
  2747.    <summary type="html">
  2748.        &lt;img style="border:1px solid #C3E6D8;float:right;" alt="" src="https://cdn.slidesharecdn.com/ss_thumbnails/succession-180323080646-thumbnail.jpg?width=120&amp;amp;height=120&amp;amp;fit=bounds" /&gt;&lt;br&gt; A (not entirely serious) talk that I gave at the London Perl Mongers technical meeting in March 2018.
  2749.  
  2750. It talks about how and why I build a web site listing the line of succession to the British throne back through history.
  2751.      </summary>
  2752.    <author>
  2753.      <name>davorg@slideshare.net(davorg)</name>
  2754.    </author>
  2755.    <id>https://www.slideshare.net/slideshow/im-a-republic-honest/91652730</id>
  2756.    <published>2018-03-23T08:06:46Z</published>
  2757.    <updated>2018-03-23T08:06:46Z</updated>
  2758.  </entry>
  2759. </feed>
  2760.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda