This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ac35bd8  2026/05/29 23:25:23: Generated dev website from 
groovy-website@1c6990b
ac35bd8 is described below

commit ac35bd842a22df3713f4b5f652c725a9d9d18293
Author: jenkins <[email protected]>
AuthorDate: Fri May 29 23:25:24 2026 +0000

    2026/05/29 23:25:23: Generated dev website from groovy-website@1c6990b
---
 blog/adventures-with-groovyfx.html                 |  2 +-
 blog/apache-groovy-2022-year-in.html               |  8 +--
 blog/australian-timezones.html                     | 16 ++---
 blog/classifying-iris-flowers-with-deep.html       |  8 +--
 blog/community-over-code-eu-2024.html              | 68 +++++++++++-----------
 blog/community-over-code-na-2023.html              | 58 +++++++++---------
 blog/comparators-and-sorting-in-groovy.html        |  6 +-
 blog/create-groovy-blog.html                       | 14 ++---
 blog/deck-of-cards-with-groovy.html                |  2 +-
 blog/deep-learning-and-eclipse-collections.html    |  4 +-
 blog/detecting-objects-with-groovy-the.html        |  6 +-
 blog/exploring-gatherers4j.html                    |  2 +-
 blog/fruity-eclipse-collections.html               | 32 +++++-----
 blog/fun-with-obfuscated-groovy.html               |  2 +-
 blog/fun-with-rating-stars.html                    |  2 +-
 blog/gpars-meets-virtual-threads.html              |  4 +-
 blog/groovy-2-4-16-released.html                   |  2 +-
 blog/groovy-2-4-17-released.html                   |  2 +-
 blog/groovy-2-5-0-released.html                    |  2 +-
 blog/groovy-2-5-1-released.html                    |  2 +-
 blog/groovy-2-5-2-released.html                    |  2 +-
 blog/groovy-2-5-3-released.html                    |  2 +-
 blog/groovy-2-5-4-released.html                    |  2 +-
 blog/groovy-2-5-5-released.html                    |  2 +-
 blog/groovy-2-5-6-released.html                    |  2 +-
 blog/groovy-2-5-7-released.html                    |  2 +-
 blog/groovy-3-0-0-alpha.html                       |  2 +-
 blog/groovy-3-0-0-beta.html                        |  2 +-
 blog/groovy-3-0-0-beta1.html                       |  2 +-
 blog/groovy-4-0-3-released.html                    |  2 +-
 blog/groovy-ai.html                                |  2 +-
 blog/groovy-dauphine.html                          |  2 +-
 blog/groovy-gatherers.html                         |  4 +-
 blog/groovy-graph-databases.html                   | 18 +++---
 blog/groovy-haiku-processing.html                  |  2 +-
 blog/groovy-knapsack.html                          |  8 +--
 blog/groovy-lucene.html                            |  2 +-
 blog/groovy-oracle23ai.html                        | 10 ++--
 blog/groovy-pekko-gpars.html                       |  2 +-
 blog/groovy-record-performance.html                |  4 +-
 blog/groovy-records.html                           |  4 +-
 blog/groovy-release-train-4-0.html                 |  2 +-
 blog/groovy-text-similarity.html                   | 10 ++--
 blog/groovy6-functional.html                       |  2 +-
 blog/groundhog-day.html                            |  2 +-
 blog/helloworldemoji.html                          |  2 +-
 blog/img/{ => img}/WordCount.svg                   |  0
 blog/life-on-mars-units-of.html                    |  4 +-
 blog/matrix-calculations-with-groovy-apache.html   |  8 +--
 blog/natural-language-processing-with-groovy.html  |  6 +-
 blog/netbeans.html                                 | 14 ++---
 blog/parsing-json-with-groovy.html                 |  8 +--
 blog/reading-and-writing-csv-files.html            |  6 +-
 blog/seasons-greetings-emoji.html                  | 18 +++---
 blog/set-operations-with-groovy.html               |  2 +-
 ...olving-cryptarithmetic-puzzles-with-groovy.html | 30 +++++-----
 ...g-simple-optimization-problems-with-groovy.html |  4 +-
 blog/testing-your-java-with-groovy.html            | 22 +++----
 blog/testing_permutations_combinations.html        |  8 +--
 blog/using-groovy-with-apache-wayang.html          |  6 +-
 blog/wayang-tensorflow.html                        |  6 +-
 blog/whiskey-clustering-with-groovy-and.html       |  8 +--
 blog/whisky-revisited.html                         | 20 +++----
 blog/zipping-collections-with-groovy.html          | 16 ++---
 64 files changed, 262 insertions(+), 262 deletions(-)

diff --git a/blog/adventures-with-groovyfx.html 
b/blog/adventures-with-groovyfx.html
index eca74db..df70cab 100644
--- a/blog/adventures-with-groovyfx.html
+++ b/blog/adventures-with-groovyfx.html
@@ -234,7 +234,7 @@ The application is perfectly functional without them (and 
the approximately 20 l
 </div>
 <div class="paragraph">
 <p>Here is the application in use:
-<span class="image"><img src="img/img/TodoScreenshot.png" 
alt="TodoScreenshot"></span></p>
+<span class="image"><img src="./img/TodoScreenshot.png" 
alt="TodoScreenshot"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/apache-groovy-2022-year-in.html 
b/blog/apache-groovy-2022-year-in.html
index 3d3eed0..bceaf11 100644
--- a/blog/apache-groovy-2022-year-in.html
+++ b/blog/apache-groovy-2022-year-in.html
@@ -78,7 +78,7 @@ Here are just a few of the highlights.</p>
 <p>In 2022, Groovy had 18 releases starting with Groovy 4 in January:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/groovy4_release_tweet.png" 
alt="Groovy 4 release tweet"></span></p>
+<p><span class="image"><img src="./img/groovy4_release_tweet.png" alt="Groovy 
4 release tweet"></span></p>
 </div>
 <div class="paragraph">
 <p>The latest release of Groovy 4 is 4.0.7 which includes over 300 improvements
@@ -119,7 +119,7 @@ While the figures for December are not yet finalised, it 
looks like
 <strong><em>2022 will be the first year Groovy surpasses 1 Billion downloads 
in a single calendar year</em></strong>!</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/downloads_until_2022.png" alt="Groovy 
download stats"></span></p>
+<p><span class="image"><img src="./img/downloads_until_2022.png" alt="Groovy 
download stats"></span></p>
 </div>
 </div>
 </div>
@@ -133,7 +133,7 @@ There were nearly 30 posts for you to peruse from this year.
 We try to show off Groovy features and also have some fun.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_collage_2022.jpg" alt="collage 
of blog post images"></span></p>
+<p><span class="image"><img src="./img/blog_collage_2022.jpg" alt="collage of 
blog post images"></span></p>
 </div>
 <div class="paragraph">
 <p>You might also like to check out the <a 
href="https://www.javaadvent.com/2022/12/groovy-and-data-science.html";>Groovy 
and Data Science blog post</a> from
@@ -150,7 +150,7 @@ ApacheCon conference in New Orleans in October. We thank 
the conference organise
 speakers and attendees for the wonderful conference.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/apachecon_collage_2022.jpg" alt="Some 
photos from ApacheCon 2022"></span></p>
+<p><span class="image"><img src="./img/apachecon_collage_2022.jpg" alt="Some 
photos from ApacheCon 2022"></span></p>
 </div>
 <div class="paragraph">
 <p>We have plenty more in store for 2023. We invite you to come on the journey 
with us!</p>
diff --git a/blog/australian-timezones.html b/blog/australian-timezones.html
index d760308..5c7b9d9 100644
--- a/blog/australian-timezones.html
+++ b/blog/australian-timezones.html
@@ -75,7 +75,7 @@
 covering among other things, time zones in Antarctica.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><a class="image" 
href="https://external-preview.redd.it/16_JjhwH0lSETAc7LMNvulifXMrs-43lWIs_nr2OPIs.jpg?width=960&amp;crop=smart&amp;auto=webp&amp;v=enabled&amp;s=7fe189e9ed24d481d3445fad245bd6ae18ee5740";><img
 src="img/img/stations_antarctica.png" alt="Research stations and timezones in 
Antarctica" width="600"></a></span></p>
+<p><span class="image"><a class="image" 
href="https://external-preview.redd.it/16_JjhwH0lSETAc7LMNvulifXMrs-43lWIs_nr2OPIs.jpg?width=960&amp;crop=smart&amp;auto=webp&amp;v=enabled&amp;s=7fe189e9ed24d481d3445fad245bd6ae18ee5740";><img
 src="./img/stations_antarctica.png" alt="Research stations and timezones in 
Antarctica" width="600"></a></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s replicate his example in Groovy before looking at time zones
@@ -120,7 +120,7 @@ Antarctic research stations, Casey, Davis, and Mawson
 First a picture showing the main timezones (source: wikipedia):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/autimezones.png" alt="Australian 
timezones" width="500"></span></p>
+<p><span class="image"><img src="./img/autimezones.png" alt="Australian 
timezones" width="500"></span></p>
 </div>
 <div class="paragraph">
 <p>And now a more complete table:</p>
@@ -293,7 +293,7 @@ timezones. Western Australia and South Australia are 
(excluding daylight saving)
 an hour and 30 minutes apart, so halfway between results in the 45-minute 
offset!</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/perth_eucla_adelaide.png" alt="Perth 
to Adelaide via Eucla"></span></p>
+<p><span class="image"><img src="./img/perth_eucla_adelaide.png" alt="Perth to 
Adelaide via Eucla"></span></p>
 </div>
 <div class="paragraph">
 <p>Incidentally, if you want to see
@@ -303,7 +303,7 @@ then the Nullarbor plain is the place to be, but otherwise 
it&#8217;s not high
 on most folks tourist attractions must-see list.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nullarbor.png" alt="Nullarbor plain" 
width="600"></span></p>
+<p><span class="image"><img src="./img/nullarbor.png" alt="Nullarbor plain" 
width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>But the Nullarbor is the place to be if you want to know about another 
obscure timezone fact!
@@ -315,7 +315,7 @@ We won&#8217;t follow this unofficial timezone in our later 
exploration,
 but it would add another to our list if we wanted to include it too!</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IndianPacificRailroadRouteMap.png" 
alt="Indian pacific train"></span></p>
+<p><span class="image"><img src="./img/IndianPacificRailroadRouteMap.png" 
alt="Indian pacific train"></span></p>
 </div>
 <div class="paragraph">
 <p>A few other obscure timezone facts relate to some of Australia&#8217;s 
smaller islands.</p>
@@ -330,7 +330,7 @@ Being that far East of the mainland, it&#8217;s not 
surprising to find out that
 it has a timezone 30 minutes earlier than the mainland.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/lordhoweisland.jpg" alt="Lord Howe 
Island" width="500"></span></p>
+<p><span class="image"><img src="./img/lordhoweisland.jpg" alt="Lord Howe 
Island" width="500"></span></p>
 </div>
 <div class="paragraph">
 <p>Apparently, some years back,
@@ -399,7 +399,7 @@ precisely in half, including the runway. Technically, 
flights departing in the s
 months leave the terminal in one time zone and take off from the ground in 
another.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/goldcoast_airport.png" alt="Fireworks 
on the Gold Coast" width="400"></span></p>
+<p><span class="image"><img src="./img/goldcoast_airport.png" alt="Fireworks 
on the Gold Coast" width="400"></span></p>
 </div>
 <div class="paragraph">
 <p>This has the potential to severely muck up the airlines 
<em>departed-on-time</em> statistics!
@@ -411,7 +411,7 @@ any potential confusion.</p>
 perfect destination.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/fireworks_beach.png" alt="Fireworks 
on the Gold Coast" width="400"></span></p>
+<p><span class="image"><img src="./img/fireworks_beach.png" alt="Fireworks on 
the Gold Coast" width="400"></span></p>
 </div>
 <div class="paragraph">
 <p>You can party and watch fireworks in Tweed Heads before walking a handful 
of steps North
diff --git a/blog/classifying-iris-flowers-with-deep.html 
b/blog/classifying-iris-flowers-with-deep.html
index 262870a..919af6b 100644
--- a/blog/classifying-iris-flowers-with-deep.html
+++ b/blog/classifying-iris-flowers-with-deep.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy&trade; and 
GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a 
href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
+<p><span class="image right"><img src="./img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
 A classic data science <a 
href="https://en.wikipedia.org/wiki/Iris_flower_data_set";>dataset</a> captures 
flower characteristics of Iris flowers.
 It captures the <em>width</em> and <em>length</em> of the <em>sepals</em> and 
<em>petals</em> for three <em>species</em> (<a 
href="https://en.wikipedia.org/wiki/Iris_setosa";>Setosa</a>, <a 
href="https://en.wikipedia.org/wiki/Iris_versicolor";>Versicolor</a>, and <a 
href="https://en.wikipedia.org/wiki/Iris_virginica";>Virginica</a>).</p>
 </div>
@@ -113,7 +113,7 @@ comparing and contrasting various libraries and various 
classification algorithm
 <p>Feel free to browse these other examples and the Jupyter/BeakerX notebook 
if you are interested in any of these additional techniques.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/iris_beakerx.png" 
alt="Jupyter/BeakerX notebook image of the Iris problem"></span></p>
+<p><span class="image"><img src="./img/iris_beakerx.png" alt="Jupyter/BeakerX 
notebook image of the Iris problem"></span></p>
 </div>
 <div class="paragraph">
 <p>For this blog, let&#8217;s just look at the Deep Learning examples. 
We&#8217;ll look at solutions using Encog, Eclipse DeepLearning4J and Deep 
Netts (with standard Java and as a native image using GraalVM) but first a 
brief introduction.</p>
@@ -130,7 +130,7 @@ but we can give some basic details. We will have four input 
nodes corresponding
 We will have three output nodes corresponding to each possible <em>class</em> 
(<em>species</em>). We will also have one or more additional layers in 
between.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_network.png" alt="Iris neural 
net layers"></span></p>
+<p><span class="image"><img src="./img/deep_network.png" alt="Iris neural net 
layers"></span></p>
 </div>
 <div class="paragraph">
 <p>Each node in this network mimics to some degree a neuron in the human 
brain. Again, we&#8217;ll simplify the details.
@@ -138,7 +138,7 @@ Each node has multiple inputs, which are given a particular 
weight, as well as a
 determine whether our node "fires". Training the model is a process which 
works out what the best weights should be.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_node.png" alt="Neural net 
node"></span></p>
+<p><span class="image"><img src="./img/deep_node.png" alt="Neural net 
node"></span></p>
 </div>
 <div class="paragraph">
 <p>The math involved for converting inputs to output for any node isn&#8217;t 
too hard. We could write it ourselves (as shown <a 
href="https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/Mnist/src/main/groovy/MnistTrainer.groovy";>here</a>
 using matrices
diff --git a/blog/community-over-code-eu-2024.html 
b/blog/community-over-code-eu-2024.html
index 70b64ab..34b1afe 100644
--- a/blog/community-over-code-eu-2024.html
+++ b/blog/community-over-code-eu-2024.html
@@ -99,7 +99,7 @@ and it was a great city to visit.</p>
 <span class="image"><img 
src="https://photos.apachecon.com/_data/i/upload/2024/06/05/20240605134031-d3953d86-xx.jpg";
 alt="20240605134031 d3953d86 xx" width="42%"></span>
 <span class="image"><img 
src="https://photos.apachecon.com/_data/i/upload/2024/06/10/20240610202025-1ac29b1e-xx.jpg";
 alt="20240610202025 1ac29b1e xx" width="44.4%"></span>
 <span class="image"><img 
src="https://photos.apachecon.com/_data/i/upload/2024/06/05/20240605081228-926eecf0-xx.jpg";
 alt="20240605081228 926eecf0 xx" width="44.4%"></span>
-<span class="image"><img src="img/img/coceu2024_tac_dinner.jpg" alt="coceu2024 
tac dinner" width="55%"></span>
+<span class="image"><img src="./img/coceu2024_tac_dinner.jpg" alt="coceu2024 
tac dinner" width="55%"></span>
 <span class="image"><img 
src="https://photos.apachecon.com/_data/i/upload/2023/10/20/20231020033313-d56c0136-me.jpg";
 alt="stickers" width="33%"></span></p>
 </div>
 <div class="paragraph">
@@ -122,7 +122,7 @@ language choice in 2024.</p>
 <p>This talk looked at some of the compelling reasons for using Groovy 
today.</p>
 </div>
 <div class="paragraph">
-<p><a href="https://speakerdeck.com/paulk/groovy-today";><span 
class="image"><img src="img/img/coceu2024_why_groovy.png" alt="first slide of 
slide deck"></span></a>
+<p><a href="https://speakerdeck.com/paulk/groovy-today";><span 
class="image"><img src="./img/coceu2024_why_groovy.png" alt="first slide of 
slide deck"></span></a>
 <a href="https://speakerdeck.com/paulk/groovy-today";>Why use Groovy in 
2024?</a></p>
 </div>
 <div class="paragraph">
@@ -136,7 +136,7 @@ As one example, here&#8217;s an example of a deeply 
immutable <code>Book</code>
 additional generated code for comparators (sorting), custom serialization and 
deserialization,
 and some special JavaBean index handling code:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_transforms.png" alt="AST 
transform example"></span></p>
+<p><span class="image"><img src="./img/coceu2024_transforms.png" alt="AST 
transform example"></span></p>
 </div>
 </li>
 <li>
@@ -144,7 +144,7 @@ and some special JavaBean index handling code:</p>
 functionality. As one example, primitive array extensions speed up certain 
operations
 where you might otherwise use streams:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_primitives.png" 
alt="performance of primitive int array extension methods"></span></p>
+<p><span class="image"><img src="./img/coceu2024_primitives.png" 
alt="performance of primitive int array extension methods"></span></p>
 </div>
 </li>
 <li>
@@ -152,7 +152,7 @@ where you might otherwise use streams:</p>
 use of the libraries and APIs that Java programmers are familiar with.
 Here&#8217;s an example of using Apache Commons Math:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_operator_overloading.png" 
alt="matrix example"></span></p>
+<p><span class="image"><img src="./img/coceu2024_operator_overloading.png" 
alt="matrix example"></span></p>
 </div>
 </li>
 <li>
@@ -169,7 +169,7 @@ numerals. Once the DSL is defined, you can use it in 
scripts like this:</p>
 <p>Invalid roman numerals are detected at compile-time:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_static_roman_numerals.png" 
alt="error" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_static_roman_numerals.png" 
alt="error" width="80%"></span></p>
 </div>
 </li>
 </ul>
@@ -184,7 +184,7 @@ numerals. Once the DSL is defined, you can use it in 
scripts like this:</p>
 <p>This talk looked at the machine language problem of classification using a 
classic Iris flowers dataset.</p>
 </div>
 <div class="paragraph">
-<p><a href="https://speakerdeck.com/paulk/groovy-iris";><span 
class="image"><img src="img/img/coceu2024_iris.png" alt="cover slide for slide 
deck"></span></a>
+<p><a href="https://speakerdeck.com/paulk/groovy-iris";><span 
class="image"><img src="./img/coceu2024_iris.png" alt="cover slide for slide 
deck"></span></a>
 <a href="https://speakerdeck.com/paulk/groovy-iris";>Classifying Iris flowers 
with Groovy, Deep Learning, and GraalVM</a></p>
 </div>
 <div class="paragraph">
@@ -196,45 +196,45 @@ numerals. Once the DSL is defined, you can use it in 
scripts like this:</p>
 <p>Classification predicts the class of something using models trained
 on measured features given a known class:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris1.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris1.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 <li>
 <p>The case study uses a well-known Iris dataset.
 The measured features are sepal width and length, and petal width and 
length:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris2.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris2.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 <li>
 <p>First, a number of classic algorithms for doing classification were examined
 including the Naïve Bayes algorithm, here using the Weka data science 
library:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris3.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris3.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 <li>
 <p>Then neural networks are explained. A potential network for the case study
 is shown here:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris4.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris4.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 <li>
 <p>Each node acts like a neuron in the human brain:
-<span class="image"><img src="img/img/coceu2024_iris5.png" alt="classifiation" 
width="80%"></span></p>
+<span class="image"><img src="./img/coceu2024_iris5.png" alt="classifiation" 
width="80%"></span></p>
 </li>
 <li>
 <p>Several libraries for deep learning were discussed including Deep Netts:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris6.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris6.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 <li>
 <p>Compiling the script using the Groovy compiler with the 
<code>--compile-static</code> switch and
 then using GraalVM to build a native image gave a more than 10 times speed 
increase:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_iris7.png" 
alt="classifiation" width="80%"></span></p>
+<p><span class="image"><img src="./img/coceu2024_iris7.png" 
alt="classifiation" width="80%"></span></p>
 </div>
 </li>
 </ul>
@@ -249,7 +249,7 @@ then using GraalVM to build a native image gave a more than 
10 times speed incre
 <p><a href="https://sergiodelamo.com/";>Sergio del Amo</a> gave a talk on
 <a 
href="https://speakerdeck.com/sdelamo/getting-started-with-the-micronaut-framework";>Getting
 Started with the Micronaut Framework</a>, in particular
 its support for using Groovy when building microservices.
-<a 
href="https://speakerdeck.com/sdelamo/getting-started-with-the-micronaut-framework";><span
 class="image"><img src="img/img/coceu2024_micronaut.png" alt="slide deck first 
slide"></span></a></p>
+<a 
href="https://speakerdeck.com/sdelamo/getting-started-with-the-micronaut-framework";><span
 class="image"><img src="./img/coceu2024_micronaut.png" alt="slide deck first 
slide"></span></a></p>
 </div>
 <div class="paragraph">
 <p>Highlights:</p>
@@ -259,37 +259,37 @@ its support for using Groovy when building microservices.
 <li>
 <p>The speed of Micronaut applications comes from its ahead-of-time 
approach:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut1.png" alt="Using 
Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut1.png" alt="Using 
Micronaut Launch"></span></p>
 </div>
 </li>
 <li>
 <p>Micronaut supports a range of runtimes:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut2.png" alt="Using 
Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut2.png" alt="Using 
Micronaut Launch"></span></p>
 </div>
 </li>
 <li>
 <p>Micronaut supports a range of messaging technologies:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut3.png" alt="Using 
Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut3.png" alt="Using 
Micronaut Launch"></span></p>
 </div>
 </li>
 <li>
 <p>Micronaut supports a range of persistence technologies:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut4.png" alt="Using 
Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut4.png" alt="Using 
Micronaut Launch"></span></p>
 </div>
 </li>
 <li>
 <p>Micronaut supports a range of view technologies:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut5.png" alt="Using 
Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut5.png" alt="Using 
Micronaut Launch"></span></p>
 </div>
 </li>
 <li>
 <p>You can create Microservices applications using Micronaut launch:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_micronaut_groovy_spock.png" 
alt="Using Micronaut Launch"></span></p>
+<p><span class="image"><img src="./img/coceu2024_micronaut_groovy_spock.png" 
alt="Using Micronaut Launch"></span></p>
 </div>
 </li>
 </ul>
@@ -304,7 +304,7 @@ its support for using Groovy when building microservices.
 <p>This talk looked at the machine language problem of clustering using a 
well-known whiskey flavor profiles dataset.</p>
 </div>
 <div class="paragraph">
-<p><a href="https://speakerdeck.com/paulk/groovy-whiskey";><span 
class="image"><img src="img/img/coceu2024_whiskey.png" alt="cover slide for 
slide deck"></span></a>
+<p><a href="https://speakerdeck.com/paulk/groovy-whiskey";><span 
class="image"><img src="./img/coceu2024_whiskey.png" alt="cover slide for slide 
deck"></span></a>
 <a href="https://speakerdeck.com/paulk/groovy-whiskey";>Whiskey Clustering with 
Apache Projects:Groovy, Commons CSV, Commons Math, Ignite, Spark, Wayang, Beam, 
&amp; Flink</a></p>
 </div>
 <div class="paragraph">
@@ -315,14 +315,14 @@ its support for using Groovy when building microservices.
 <li>
 <p>The case study looked at how to cluster 86 single malt scotch whiskies 
based on rankings of 12 flavor categories:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering0.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering0.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 </li>
 <li>
 <p>There are different algorithms that can be used to do the clustering.
 K-Means clustering was the key algorithm covered:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering1.png" alt="The k-means 
algorithm"></span></p>
+<p><span class="image"><img src="./img/Clustering1.png" alt="The k-means 
algorithm"></span></p>
 </div>
 </li>
 <li>
@@ -331,51 +331,51 @@ including Apache Commons Math to solve this problem, then 
looks at
 how you might scale up the problem using a range of Apache technologies.
 The first technology considered was Apache Ignite. First we read in the 
data:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering2.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering2.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 </li>
 <li>
 <p>Then we use Ignite&#8217;s distributed clustering libraries to find the 
centroids:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering3.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering3.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 </li>
 <li>
 <p>Various options to tweak the algorithm and various
 ways to visualize the results were examined:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering4.png" alt="Whiskey flavour 
profiles with Ignite"></span></p>
+<p><span class="image"><img src="./img/Clustering4.png" alt="Whiskey flavour 
profiles with Ignite"></span></p>
 </div>
 </li>
 <li>
 <p>The same case study was also done using Spark:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_whiskey1.png" alt="Whiskey 
flavour profiles with Apache Spark"></span></p>
+<p><span class="image"><img src="./img/coceu2024_whiskey1.png" alt="Whiskey 
flavour profiles with Apache Spark"></span></p>
 </div>
 </li>
 <li>
 <p>The same case study was also done using Apache Wayang:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_whiskey2.png" alt="Whiskey 
flavour profiles with Wayang"></span></p>
+<p><span class="image"><img src="./img/coceu2024_whiskey2.png" alt="Whiskey 
flavour profiles with Wayang"></span></p>
 </div>
 </li>
 <li>
 <p>The same case study was also done using Apache Beam (Python-style version 
shown here):</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_whiskey3.png" alt="Whiskey 
flavour profiles with Beam"></span></p>
+<p><span class="image"><img src="./img/coceu2024_whiskey3.png" alt="Whiskey 
flavour profiles with Beam"></span></p>
 </div>
 </li>
 <li>
 <p>The same case study was also done using Apache Flink:</p>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_whiskey4.png" alt="Whiskey 
flavour profiles with Flink"></span></p>
+<p><span class="image"><img src="./img/coceu2024_whiskey4.png" alt="Whiskey 
flavour profiles with Flink"></span></p>
 </div>
 </li>
 </ul>
 </div>
 <div class="paragraph">
 <p>The speakers:
-<span class="image"><img src="img/img/coceu2024_groovy_speakers.png" alt="The 
speakers"></span></p>
+<span class="image"><img src="./img/coceu2024_groovy_speakers.png" alt="The 
speakers"></span></p>
 </div>
 </div>
 </div>
@@ -391,8 +391,8 @@ as well as to learn about a range of topics if the folks 
who might know
 all about those topics aren&#8217;t in the corridor at the same time as 
you.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/coceu2024_posters.jpg" alt="Posters" 
width="51%"></span>
-<a 
href="https://github.com/apache/apachecon-eu/blob/main/static/posters/CoCEU_WhyGroovyToday.pdf";><span
 class="image"><img src="img/img/coceu2024_groovy_poster.jpg" alt="Why use 
Groovy in 2024? Poster" width="35%"></span></a></p>
+<p><span class="image"><img src="./img/coceu2024_posters.jpg" alt="Posters" 
width="51%"></span>
+<a 
href="https://github.com/apache/apachecon-eu/blob/main/static/posters/CoCEU_WhyGroovyToday.pdf";><span
 class="image"><img src="./img/coceu2024_groovy_poster.jpg" alt="Why use Groovy 
in 2024? Poster" width="35%"></span></a></p>
 </div>
 <div class="paragraph">
 <p>Check out the Groovy <a 
href="https://github.com/apache/apachecon-eu/blob/main/static/posters/CoCEU_WhyGroovyToday.pdf";>poster</a>!</p>
diff --git a/blog/community-over-code-na-2023.html 
b/blog/community-over-code-na-2023.html
index c2aae57..289b607 100644
--- a/blog/community-over-code-na-2023.html
+++ b/blog/community-over-code-na-2023.html
@@ -106,7 +106,7 @@ In my case, I took the opportunity to do a bicycle ride 
East of Halifax mostly a
 cyclist-friendly bike trails.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HalifaxRideMap.png" 
alt="HalifaxRideMap"></span></p>
+<p><span class="image"><img src="./img/HalifaxRideMap.png" 
alt="HalifaxRideMap"></span></p>
 </div>
 <div class="paragraph">
 <p>The route was 90% on trails built upon now disused railroad tracks
@@ -121,7 +121,7 @@ The views were spectacular. I particularly like some of the 
autumn color scenery
 where I live.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HalifaxRideCollage.jpg" 
alt="HalifaxRideCollage"></span></p>
+<p><span class="image"><img src="./img/HalifaxRideCollage.jpg" 
alt="HalifaxRideCollage"></span></p>
 </div>
 </div>
 </div>
@@ -314,12 +314,12 @@ Groovy 5 has 80+ AST transforms.</p>
 <li>
 <p>While we like, many of the exciting changes for switch expressions coming 
along with
 recent Java versions, Groovy still provides numerous additional options (for 
JDK8+):
-<span class="image"><img src="img/img/Groovy2023Switch.png" alt="Groovy switch 
expressions"></span></p>
+<span class="image"><img src="./img/Groovy2023Switch.png" alt="Groovy switch 
expressions"></span></p>
 </li>
 <li>
 <p>Groovy gives you the choice of emulated records for JDK8+
 or native records for JDK16+ with many record enhancements:
-<span class="image"><img src="img/img/Groovy2023Records.png" alt="Groovy 
records"></span>
+<span class="image"><img src="./img/Groovy2023Records.png" alt="Groovy 
records"></span>
 Over and above the built-in enhancements, record development is made
 easier by Groovy&#8217;s AST transforms. The slides have examples of combining
 records with the following AST transforms:
@@ -377,7 +377,7 @@ It also showed examples of a few advanced tools you might 
want to consider as pa
 simple mathematical calculation originally implemented using the following 
Java code:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava1.png" alt="Buggy code" 
width="80%"></span></p>
+<p><span class="image"><img src="./img/TestingJava1.png" alt="Buggy code" 
width="80%"></span></p>
 </div>
 <div class="paragraph">
 <p>We write a Groovy test using the <a 
href="https://spockframework.org/";>Spock</a> testing framework which
@@ -385,21 +385,21 @@ at first glance seems to indicate our initial 
implementation is correct since al
 pass and we have 100% test coverage.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava2.png" alt="Code coverage" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/TestingJava2.png" alt="Code coverage" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>But this is 100% line and branch coverage but doesn&#8217;t reflect 100% 
state coverage.
 We can illustrate this by adding one more test case, which now fails:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava3.png" alt="Add fault 
revealing test case" width="90%"></span></p>
+<p><span class="image"><img src="./img/TestingJava3.png" alt="Add fault 
revealing test case" width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>It turns out there was one edge case the initial implementation 
didn&#8217;t cater
 for but it is simple enough to fix:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava4.png" alt="Corrected 
algorithm" width="90%"></span></p>
+<p><span class="image"><img src="./img/TestingJava4.png" alt="Corrected 
algorithm" width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>We now have all test cases passing and still 100% coverage.</p>
@@ -431,7 +431,7 @@ indeed reveals some surviving mutations and analysis 
indicates that indeed the m
 correspond to the faulty edge case:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava5.png" alt="Pitest result" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/TestingJava5.png" alt="Pitest result" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>This should direct us to add the additional test case like we did manually 
earlier
@@ -452,7 +452,7 @@ under test with random data. Indeed, such testing also 
reveals the flaw in the
 original code, with no flaw found in the fixed code.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/TestingJava6.png" alt="Jqwik result" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/TestingJava6.png" alt="Jqwik result" 
width="90%"></span></p>
 </div>
 </div>
 <div class="sect2">
@@ -596,14 +596,14 @@ using <a href="https://ignite.apache.org/";>Apache 
Ignite</a>.</p>
 86 single malt scotch whiskies.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering0.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering0.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 <div class="paragraph">
 <p>There are different algorithms that can be used to do the clustering.
 Here K-Means clustering was used.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering1.png" alt="The k-means 
algorithm"></span></p>
+<p><span class="image"><img src="./img/Clustering1.png" alt="The k-means 
algorithm"></span></p>
 </div>
 <div class="paragraph">
 <p>For this particular dataset, the number of datapoints is relatively small
@@ -611,7 +611,7 @@ and scaling up isn&#8217;t crucial. But larger datasets 
would be split up in the
 so we&#8217;ll look at how we&#8217;d scale this up. First we read in the 
data:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering2.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering2.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 <div class="paragraph">
 <p>Apache Ignite has special features for reading in data within a cluster 
environment,
@@ -626,19 +626,19 @@ in the same way we&#8217;d use a non-distributed version 
and Ignite does the har
 Here is the result:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering3.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering3.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 <div class="paragraph">
 <p>There are various options we have to tweak the algorithm and various
 ways to visualize the results.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Clustering4.png" alt="Whiskey flavour 
profiles"></span></p>
+<p><span class="image"><img src="./img/Clustering4.png" alt="Whiskey flavour 
profiles"></span></p>
 </div>
 <div class="paragraph">
 <p>As a side note, it is rumoured that additional extensive research on this 
topic may (or may not)
 have been held in conjunction with the conference. Only because the conference 
was in (Nova) Scotia no doubt!
-<span class="image"><img src="img/img/HalifaxWhisky.png" 
alt="Citadel"></span></p>
+<span class="image"><img src="./img/HalifaxWhisky.png" 
alt="Citadel"></span></p>
 </div>
 <div class="paragraph">
 <p><span class="image right"><img 
src="https://photos.apachecon.com/_data/i/upload/2023/10/13/20231013192401-65a58458-cu_s9999x410.jpg";
 alt="Jeremy Meyer" width="200"></span>
@@ -659,7 +659,7 @@ compute grid, and clever peer class loading?
 <p>For those that know Ignite, it can be used in numerous ways:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks1.png" alt="Ignite" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks1.png" alt="Ignite" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>In this scenario, it was going to be used for distributed computing
@@ -667,38 +667,38 @@ and the task at hand was to solve Rubik&#8217;s cubes. In 
this case,
 particular non-destructive corner moves of a 3x3x2 cube.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks2.png" alt="Numbers" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks2.png" alt="Numbers" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>First up was to create a little domain model to represent the cube:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks3.png" alt="Model" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks3.png" alt="Model" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>Then piece together a cluster of computers of varying skills for the 
compute grid:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks4.png" alt="Team" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks4.png" alt="Team" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>Or a different visualization of the machines if you&#8217;re not
 a Guardians of the Galaxy fan:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks5.png" alt="Machines" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks5.png" alt="Machines" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>Then code up the corner swapping algorithm:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks6.png" alt="Algorithm" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks6.png" alt="Algorithm" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>And finally get the results:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/IgniteRubiks7.png" alt="Results" 
width="90%"></span></p>
+<p><span class="image"><img src="./img/IgniteRubiks7.png" alt="Results" 
width="90%"></span></p>
 </div>
 <div class="paragraph">
 <p>I won&#8217;t steal Jeremy&#8217;s thunder. Check out the link for details.
@@ -716,16 +716,16 @@ First covered was the traditional GORM functionality 
including dynamic finders,
 the Criteria API, Where queries, and HQL:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/GORM1.png" alt="1"></span></p>
+<p><span class="image"><img src="./img/GORM1.png" alt="1"></span></p>
 </div>
 <div class="paragraph">
 <p>Then he covered GORM Data Services:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/GORM2.png" alt="2"></span></p>
+<p><span class="image"><img src="./img/GORM2.png" alt="2"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img 
src="img/img/JeffOpenSourceSoftwareAndYou.jpg" alt="Jeff Scott Brown" 
width="300"></span>
+<p><span class="image right"><img src="./img/JeffOpenSourceSoftwareAndYou.jpg" 
alt="Jeff Scott Brown" width="300"></span>
 Jeff also gave the final talk for the track: <em>Open Source Software and 
You</em>.
 In this talk, Jeff gave an insight into his own open source journey.
 He covered some of his insights from his 30+ years working in open source.
@@ -849,7 +849,7 @@ to be sent great distances quickly. A message that might 
take half a day
 to deliver on horseback could be done in 30 minutes using the signal masts and 
codes.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HalifaxCitadel.png" 
alt="Citadel"></span></p>
+<p><span class="image"><img src="./img/HalifaxCitadel.png" 
alt="Citadel"></span></p>
 </div>
 </div>
 </div>
@@ -862,7 +862,7 @@ There&#8217;s great people, great food, hallway 
conversations, a chance to chat
 Infra folks. And did I say great people and great food?</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HalifaxConferenceOverall.png" 
alt="conference"></span></p>
+<p><span class="image"><img src="./img/HalifaxConferenceOverall.png" 
alt="conference"></span></p>
 </div>
 <div class="paragraph">
 <p>I hope to see you at a future ASF conference.</p>
@@ -877,7 +877,7 @@ Infra folks. And did I say great people and great food?</p>
 In my case, this involved a weekend away at the beach.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MermaidBeach.jpg" alt="Mermaid 
Beach"></span></p>
+<p><span class="image"><img src="./img/MermaidBeach.jpg" alt="Mermaid 
Beach"></span></p>
 </div>
 <div class="paragraph">
 <p>If you visit Australia, make sure to pop in.</p>
diff --git a/blog/comparators-and-sorting-in-groovy.html 
b/blog/comparators-and-sorting-in-groovy.html
index 442d64d..8c699f2 100644
--- a/blog/comparators-and-sorting-in-groovy.html
+++ b/blog/comparators-and-sorting-in-groovy.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Comparators and Sorting in Groovy&trade;</a></li><li><a 
href='#_the_java_comparator_story_recap' class='anchor-link'>The Java 
comparator story recap</a></li><li><a href='#_the_groovy_comparator_story' 
class='anchor-link'>The Groovy comparator story</a></li><li><a href='#_m [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/cher_record.png" alt="Cher" 
width="179" height="179"></span>
+<p><span class="image right"><img src="./img/cher_record.png" alt="Cher" 
width="179" height="179"></span>
 This blog post is inspired by the Comparator examples in the excellent
 <em>Collections Refuelled</em> <a 
href="https://www.youtube.com/watch?v=q6zF3vf114M&amp;t=13s";>talk</a> and <a 
href="https://blogs.oracle.com/java/post/collections-refueled";>blog</a>
 by Stuart Marks. That blog, from 2017, highlights improvements in the Java
@@ -90,7 +90,7 @@ e.g.&nbsp;a celebrity known by a single name.</p>
 <h2 id="_the_java_comparator_story_recap">The Java comparator story recap</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/JavaLogo.png" alt="Java logo" 
width="95" height="128"></span>
+<p><span class="image right"><img src="./img/JavaLogo.png" alt="Java logo" 
width="95" height="128"></span>
 Our <code>Celebrity</code> class if we wrote it in Java would look something 
like:</p>
 </div>
 <div class="listingblock">
@@ -254,7 +254,7 @@ JDKs. The output when running the example is the same as 
previously.</p>
 <h2 id="_the_groovy_comparator_story">The Groovy comparator story</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="180" height="90"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="180" height="90"></span>
 At about the same time that Java was evolving its comparator story, Groovy
 added some complementary features to tackle many of the same problems.
 We&#8217;ll look at some of those features and also how the JDK improvements we
diff --git a/blog/create-groovy-blog.html b/blog/create-groovy-blog.html
index b20d69c..5e01e31 100644
--- a/blog/create-groovy-blog.html
+++ b/blog/create-groovy-blog.html
@@ -153,13 +153,13 @@ under <code>Add file</code> click on <code>Create new 
file</code>. It should loo
 the following image:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_add_file_github.png" 
alt="Clicking Add file &#8594; Create new file"></span></p>
+<p><span class="image"><img src="./img/blog_add_file_github.png" alt="Clicking 
Add file &#8594; Create new file"></span></p>
 </div>
 <div class="paragraph">
 <p>You will be prompted to enter an appropriate name for your file:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_enter_filename.png" 
alt="Entering the new file name"></span></p>
+<p><span class="image"><img src="./img/blog_enter_filename.png" alt="Entering 
the new file name"></span></p>
 </div>
 <div class="paragraph">
 <p>You generally pick a unique name that isn&#8217;t too long. Here we picked
@@ -173,7 +173,7 @@ Some of the tooling doesn&#8217;t like such characters.</p>
 <p>We now enter Asciidoc content into the file:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_enter_content.png" alt="Entering 
some content"></span></p>
+<p><span class="image"><img src="./img/blog_enter_content.png" alt="Entering 
some content"></span></p>
 </div>
 <div class="paragraph">
 <p>The first line is the title for the post.
@@ -186,21 +186,21 @@ we&#8217;ll guide you through any changes if needed once 
the PR is submitted.</p
 <p>When finished, click on "Commit changes&#8230;&#8203;":</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_commit_changes_start.png" 
alt="click commit changes"></span></p>
+<p><span class="image"><img src="./img/blog_commit_changes_start.png" 
alt="click commit changes"></span></p>
 </div>
 <div class="paragraph">
 <p>If you haven&#8217;t forked the repository before, you might be prompted
 to do that now:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_fork_repository.png" 
alt="forking the repo"></span></p>
+<p><span class="image"><img src="./img/blog_fork_repository.png" alt="forking 
the repo"></span></p>
 </div>
 <div class="paragraph">
 <p>Next, you have the option to override the default commit message
 and provide an optional extended description if you wish:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_confirm_commit.png" alt="confirm 
commit"></span></p>
+<p><span class="image"><img src="./img/blog_confirm_commit.png" alt="confirm 
commit"></span></p>
 </div>
 <div class="paragraph">
 <p>When ready, click "Propose changes".</p>
@@ -209,7 +209,7 @@ and provide an optional extended description if you 
wish:</p>
 <p>You should now see a summary of your pull request.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/blog_create_pr.png" alt="create pull 
request"></span></p>
+<p><span class="image"><img src="./img/blog_create_pr.png" alt="create pull 
request"></span></p>
 </div>
 <div class="paragraph">
 <p>Add a comment if you wish and finally click "Create pull request".</p>
diff --git a/blog/deck-of-cards-with-groovy.html 
b/blog/deck-of-cards-with-groovy.html
index 3fb470e..e5603f6 100644
--- a/blog/deck-of-cards-with-groovy.html
+++ b/blog/deck-of-cards-with-groovy.html
@@ -140,7 +140,7 @@ println "Remaining cards 
sorted:\n${deck.sort()}"</code></pre>
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/CardsConsole.png" alt="Cards" 
width="740"></span></p>
+<p><span class="image"><img src="./img/CardsConsole.png" alt="Cards" 
width="740"></span></p>
 </div>
 <div class="paragraph">
 <p>Both these Groovy examples run on JDK versions from 8 to 19<br>
diff --git a/blog/deep-learning-and-eclipse-collections.html 
b/blog/deep-learning-and-eclipse-collections.html
index ab26227..58045a0 100644
--- a/blog/deep-learning-and-eclipse-collections.html
+++ b/blog/deep-learning-and-eclipse-collections.html
@@ -168,7 +168,7 @@ assert counts == expected</code></pre>
 <p>The first attempt was to write the emojis into swing JLabel components and 
then save using a buffered image. This lead to poor looking images:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/pet_emoji_fonts.jpg" 
alt="PetAsFonts"></span></p>
+<p><span class="image"><img src="./img/pet_emoji_fonts.jpg" 
alt="PetAsFonts"></span></p>
 </div>
 <div class="paragraph">
 <p>And consequently, poor image inference. Recent JDK versions on some 
platforms might do better, but we gave up on this approach.</p>
@@ -177,7 +177,7 @@ assert counts == expected</code></pre>
 <p>Instead, emoji image files from the <a 
href="https://fonts.google.com/noto/specimen/Noto+Color+Emoji?preview.text=%F0%9F%98%BB%F0%9F%90%B6%F0%9F%90%B9%F0%9F%90%A2%F0%9F%90%A6%F0%9F%90%8D&amp;preview.text_type=custom";>Noto
 Color Emoji</a> font were used and saved under the pet type in the 
<code>resources</code> folder. These look much nicer:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/pet_emoji.png" alt="Noto Color 
Emoji"></span></p>
+<p><span class="image"><img src="./img/pet_emoji.png" alt="Noto Color 
Emoji"></span></p>
 </div>
 <div class="paragraph">
 <p>Here is the code which makes use of those saved images to detect the animal 
types (note the use of type aliasing since we have two <code>PetType</code> 
classes; we rename one to <code>PT</code>):</p>
diff --git a/blog/detecting-objects-with-groovy-the.html 
b/blog/detecting-objects-with-groovy-the.html
index 570ac3a..a5c1c36 100644
--- a/blog/detecting-objects-with-groovy-the.html
+++ b/blog/detecting-objects-with-groovy-the.html
@@ -79,13 +79,13 @@
 <p>Deep learning falls under the branches of <a 
href="https://en.wikipedia.org/wiki/Machine_learning";>machine learning</a> and 
<a href="https://en.wikipedia.org/wiki/Artificial_intelligence";>artificial 
intelligence</a>. It involves multiple layers (hence the "deep") of an <a 
href="https://en.wikipedia.org/wiki/Artificial_neural_network";>artificial 
neural network</a>. There are lots of ways to configure such networks and the 
details are beyond the scope of this blog post, but we can give  [...]
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_network.png" alt="Deep learning 
network" width="630"></span></p>
+<p><span class="image"><img src="./img/deep_network.png" alt="Deep learning 
network" width="630"></span></p>
 </div>
 <div class="paragraph">
 <p>Each node in this network mimics to some degree a neuron in the human 
brain. Again, we&#8217;ll simplify the details. Each node has multiple inputs, 
which are given a particular weight, as well as an activation function which 
will determine whether our node "fires". Training the model is a process which 
works out what the best weights should be.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_node.png" alt="Node in a deep 
learning network" width="580"></span></p>
+<p><span class="image"><img src="./img/deep_node.png" alt="Node in a deep 
learning network" width="580"></span></p>
 </div>
 </div>
 </div>
@@ -226,7 +226,7 @@ class: <strong class="green">"dog"</strong>, probability: 
<strong>0.93752</stron
 <p>The displayed image looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/detected_objects.png" alt="Detected 
objects" width="468"></span></p>
+<p><span class="image"><img src="./img/detected_objects.png" alt="Detected 
objects" width="468"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/exploring-gatherers4j.html b/blog/exploring-gatherers4j.html
index 0ec5cf8..e88e56e 100644
--- a/blog/exploring-gatherers4j.html
+++ b/blog/exploring-gatherers4j.html
@@ -99,7 +99,7 @@ in the <a 
href="https://tginsberg.github.io/gatherers4j/";>Gatherers4J</a> librar
 <h2 id="_revisiting_collate_with_gatherers4j">Revisiting Collate with 
Gatherers4J</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/collate.png" alt="collate a 
list - produced by Dall-E 3" width="200"></span></p>
+<p><span class="image right"><img src="./img/collate.png" alt="collate a list 
- produced by Dall-E 3" width="200"></span></p>
 </div>
 <div class="paragraph">
 <p>In an
diff --git a/blog/fruity-eclipse-collections.html 
b/blog/fruity-eclipse-collections.html
index d13a3ec..859e1b4 100644
--- a/blog/fruity-eclipse-collections.html
+++ b/blog/fruity-eclipse-collections.html
@@ -165,7 +165,7 @@ of the related emoji. As in the previous blog, we&#8217;ll 
use the slightly nice
 fonts for our fruit as shown here:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/fruit_emoji.png" alt="Noto Color 
Emoji"></span></p>
+<p><span class="image"><img src="./img/fruit_emoji.png" alt="Noto Color 
Emoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We&#8217;ll use an Eclipse Collections <code>BiMap</code> to switch back 
and forth between the color names
@@ -241,7 +241,7 @@ static range(int deg) {
 <div class="paragraph">
 <p>We used a <a href="https://plotly.com/javascript/";>Plotly</a> 3D 
interactive scatterplot
 (as supported by the <a 
href="https://jtablesaw.github.io/tablesaw/userguide/Introduction_to_Plotting";>Tablesaw</a>
 Java dataframe and visualization library to visualize our emoji colors (as 
degrees on the color spectrum) vs the XY coordinates:
-<span class="image"><img 
src="img/img/fruity_eclipse_collections_color_vs_xy.png" alt="Color vs xy 
plot"></span></p>
+<span class="image"><img 
src="./img/fruity_eclipse_collections_color_vs_xy.png" alt="Color vs xy 
plot"></span></p>
 </div>
 <div class="paragraph">
 <p>We are going to try out 3 approaches for determining the predominant color 
of each emoji:</p>
@@ -263,14 +263,14 @@ static range(int deg) {
 <h3 id="_most_common_color">Most Common Color</h3>
 <div class="paragraph">
 <p>Ignoring the background white color, the most common color for our PEACH 
emoji is a shade of orange. The graph below shows the count of each color:
-<span class="image"><img 
src="img/img/fruity_eclipse_collections_peach_color_histogram.png" alt="Color 
histogram for PEACH"></span></p>
+<span class="image"><img 
src="./img/fruity_eclipse_collections_peach_color_histogram.png" alt="Color 
histogram for PEACH"></span></p>
 </div>
 </div>
 <div class="sect2">
 <h3 id="_most_common_range">Most Common Range</h3>
 <div class="paragraph">
 <p>If instead of counting each color, we group colors into their range and 
count the numbers in each range, we get the following graph for PEACH:
-<span class="image"><img 
src="img/img/fruity_eclipse_collections_peach_range_histogram.png" alt="Range 
histogram for PEACH"></span></p>
+<span class="image"><img 
src="./img/fruity_eclipse_collections_peach_range_histogram.png" alt="Range 
histogram for PEACH"></span></p>
 </div>
 </div>
 <div class="sect2">
@@ -280,19 +280,19 @@ static range(int deg) {
 3 random points as our starting centroids.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/kmeans_step1.png" alt="kmeans step 
1"></span></p>
+<p><span class="image"><img src="./img/kmeans_step1.png" alt="kmeans step 
1"></span></p>
 </div>
 <div class="paragraph">
 <p>We allocate all points to their closest centroid:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/kmeans_step2.png" alt="kmeans step 
2"></span></p>
+<p><span class="image"><img src="./img/kmeans_step2.png" alt="kmeans step 
2"></span></p>
 </div>
 <div class="paragraph">
 <p>Given this allocation, we re-calculate each centroid from all of its 
points:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/kmeans_step3.png" alt="kmeans step 
3"></span></p>
+<p><span class="image"><img src="./img/kmeans_step3.png" alt="kmeans step 
3"></span></p>
 </div>
 <div class="paragraph">
 <p>We repeat this process until either a stable centroid selection
@@ -308,11 +308,11 @@ The centroid with the most points allocated to it should 
be the
 most predominant color. (This is another interactive 3D scatterplot.)</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/rgb_peach3d.png" 
alt="RgbPeach3d"></span>
+<p><span class="image"><img src="./img/rgb_peach3d.png" 
alt="RgbPeach3d"></span>
 We can plot the number of points allocated to each cluster as a
 bar chart. (We used a <a 
href="https://github.com/alexarchambault/plotly-scala";>Scala plotting 
library</a>
 to show Groovy integration with Scala.)
-<span class="image"><img src="img/img/peach_centroid_sizes.png" alt="Peach 
colour centroid sizes"></span></p>
+<span class="image"><img src="./img/peach_centroid_sizes.png" alt="Peach 
colour centroid sizes"></span></p>
 </div>
 <div class="paragraph">
 <p>The code for drawing the above chart looks like this:</p>
@@ -440,18 +440,18 @@ results.each { fruit, maxRange, maxColor, maxCentroid 
-&gt;
 <p>Here are the resulting images:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/peach_images.png" alt="peach 
images"></span>
-<span class="image"><img src="img/img/banana_images.png" alt="banana 
images"></span>
-<span class="image"><img src="img/img/cherry_images.png" alt="cherry 
images"></span>
-<span class="image"><img src="img/img/orange_images.png" alt="orange 
images"></span>
-<span class="image"><img src="img/img/grape_images.png" alt="grape 
images"></span>
-<span class="image"><img src="img/img/apple_images.png" alt="apple 
images"></span></p>
+<p><span class="image"><img src="./img/peach_images.png" alt="peach 
images"></span>
+<span class="image"><img src="./img/banana_images.png" alt="banana 
images"></span>
+<span class="image"><img src="./img/cherry_images.png" alt="cherry 
images"></span>
+<span class="image"><img src="./img/orange_images.png" alt="orange 
images"></span>
+<span class="image"><img src="./img/grape_images.png" alt="grape 
images"></span>
+<span class="image"><img src="./img/apple_images.png" alt="apple 
images"></span></p>
 </div>
 <div class="paragraph">
 <p>And, here are the final results:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/fruit_emoji_color_prediction_results.png" alt="results"></span></p>
+<p><span class="image"><img 
src="./img/fruit_emoji_color_prediction_results.png" alt="results"></span></p>
 </div>
 <div class="paragraph">
 <p>In our case, all three approaches yielded the same results.
diff --git a/blog/fun-with-obfuscated-groovy.html 
b/blog/fun-with-obfuscated-groovy.html
index 1ae2dd2..de86c04 100644
--- a/blog/fun-with-obfuscated-groovy.html
+++ b/blog/fun-with-obfuscated-groovy.html
@@ -67,7 +67,7 @@
 <p>An interesting tweet appeared in my feed this morning:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/bloch_obfuscated_java_tweet.png" 
alt="ObfuscatedJava@joshbloch" width="540"></span></p>
+<p><span class="image"><img src="./img/bloch_obfuscated_java_tweet.png" 
alt="ObfuscatedJava@joshbloch" width="540"></span></p>
 </div>
 <div class="paragraph">
 <p>And of course it prints the same thing in Groovy:</p>
diff --git a/blog/fun-with-rating-stars.html b/blog/fun-with-rating-stars.html
index 3a38846..4539f85 100644
--- a/blog/fun-with-rating-stars.html
+++ b/blog/fun-with-rating-stars.html
@@ -71,7 +71,7 @@
 be used when displaying ratings on a website:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/star_ratings_csharp.png" alt="Image 
of original tweet" width="366"></span></p>
+<p><span class="image"><img src="./img/star_ratings_csharp.png" alt="Image of 
original tweet" width="366"></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s have a look at several ways to do the same thing in Groovy.</p>
diff --git a/blog/gpars-meets-virtual-threads.html 
b/blog/gpars-meets-virtual-threads.html
index 2923590..03bcbec 100644
--- a/blog/gpars-meets-virtual-threads.html
+++ b/blog/gpars-meets-virtual-threads.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>GPars meets Virtual Threads</a></li><li><a 
href='#_parallel_collections' class='anchor-link'>Parallel 
Collections</a></li><li><a href='#_agents' 
class='anchor-link'>Agents</a></li><li><a href='#_actors' 
class='anchor-link'>Actors</a></li><li><a href='#_dataflow' class='anc [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/gpars_logo.png" alt="gpars" 
width="150"></span>
+<p><span class="image right"><img src="./img/gpars_logo.png" alt="gpars" 
width="150"></span>
 An exciting feature coming in JDK21 is Virtual Threads
 (<a href="https://openjdk.org/jeps/444";>JEP 444</a>).
 It has been previewed in JDK19 (<a href="https://openjdk.org/jeps/425";>JEP 
425</a>)
@@ -293,7 +293,7 @@ tasks are producing some results and a third task is adding 
the results
 of the other tasks.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/gpars_dataflow.png" alt="gpars 
dataflow"></span></p>
+<p><span class="image"><img src="./img/gpars_dataflow.png" alt="gpars 
dataflow"></span></p>
 </div>
 <div class="paragraph">
 <p>We have three logical tasks which can run in parallel and perform
diff --git a/blog/groovy-2-4-16-released.html b/blog/groovy-2-4-16-released.html
index 2b1c947..f0d32f6 100644
--- a/blog/groovy-2-4-16-released.html
+++ b/blog/groovy-2-4-16-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.4.16 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-2-4-17-released.html b/blog/groovy-2-4-17-released.html
index ca32976..cc133a7 100644
--- a/blog/groovy-2-4-17-released.html
+++ b/blog/groovy-2-4-17-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.4.17 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-2-5-0-released.html b/blog/groovy-2-5-0-released.html
index 5f9f999..6e05271 100644
--- a/blog/groovy-2-5-0-released.html
+++ b/blog/groovy-2-5-0-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.0 of Apache Groovy. 
Apache Groovy is a multi-faceted programming language for the JVM. Further 
details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-1-released.html b/blog/groovy-2-5-1-released.html
index fa88e93..9c0282e 100644
--- a/blog/groovy-2-5-1-released.html
+++ b/blog/groovy-2-5-1-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.1 of Apache Groovy. 
Apache Groovy is a multi-faceted programming language for the JVM. Further 
details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-2-released.html b/blog/groovy-2-5-2-released.html
index 669324c..d857798 100644
--- a/blog/groovy-2-5-2-released.html
+++ b/blog/groovy-2-5-2-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.2 of Apache Groovy. 
Apache Groovy is a multi-facet programming language for the JVM. Further 
details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-3-released.html b/blog/groovy-2-5-3-released.html
index 9c86fef..791faf2 100644
--- a/blog/groovy-2-5-3-released.html
+++ b/blog/groovy-2-5-3-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.3 of Apache Groovy. 
Apache Groovy is a multi-facet programming language for the JVM. Further 
details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-4-released.html b/blog/groovy-2-5-4-released.html
index 07c8987..451c5d0 100644
--- a/blog/groovy-2-5-4-released.html
+++ b/blog/groovy-2-5-4-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.4 of Apache Groovy. 
Apache Groovy is a multi-facet programming language for the JVM. Further 
details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-5-released.html b/blog/groovy-2-5-5-released.html
index 79f16e1..a607313 100644
--- a/blog/groovy-2-5-5-released.html
+++ b/blog/groovy-2-5-5-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.5 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-2-5-6-released.html b/blog/groovy-2-5-6-released.html
index 2eeeee8..86703df 100644
--- a/blog/groovy-2-5-6-released.html
+++ b/blog/groovy-2-5-6-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.6 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-2-5-7-released.html b/blog/groovy-2-5-7-released.html
index 956eadf..f6ffc13 100644
--- a/blog/groovy-2-5-7-released.html
+++ b/blog/groovy-2-5-7-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 2.5.7 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-3-0-0-alpha.html b/blog/groovy-3-0-0-alpha.html
index d939a91..df4da91 100644
--- a/blog/groovy-3-0-0-alpha.html
+++ b/blog/groovy-3-0-0-alpha.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 3.0.0-alpha-4 of
 Apache Groovy. We expect this to be the last "alpha" release of Groovy
 3.0.0 as we shift our focus to releasing this next version of Groovy.</p>
diff --git a/blog/groovy-3-0-0-beta.html b/blog/groovy-3-0-0-beta.html
index 13bee17..fbb2d3c 100644
--- a/blog/groovy-3-0-0-beta.html
+++ b/blog/groovy-3-0-0-beta.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 3.0.0-beta-1 of Apache 
Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-3-0-0-beta1.html b/blog/groovy-3-0-0-beta1.html
index ecf21b0..7bc131e 100644
--- a/blog/groovy-3-0-0-beta1.html
+++ b/blog/groovy-3-0-0-beta1.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 3.0.0-beta-2 of Apache 
Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-4-0-3-released.html b/blog/groovy-4-0-3-released.html
index 34f393d..8edccc4 100644
--- a/blog/groovy-4-0-3-released.html
+++ b/blog/groovy-4-0-3-released.html
@@ -67,7 +67,7 @@
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 The Apache Groovy team is pleased to announce version 4.0.3 of Apache Groovy.
 Apache Groovy is a multi-faceted programming language for the JVM.
 Further details can be found at the <a href="https://groovy.apache.org"; 
class="bare">https://groovy.apache.org</a> website.</p>
diff --git a/blog/groovy-ai.html b/blog/groovy-ai.html
index 53e5cf4..5ef981a 100644
--- a/blog/groovy-ai.html
+++ b/blog/groovy-ai.html
@@ -80,7 +80,7 @@
 </blockquote>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/bulcock_beach_sunset.jpg" 
alt="Bulcock Beach at Sunset looking towards Pumicestone Passage" 
width="400"></span></p>
+<p><span class="image right"><img src="./img/bulcock_beach_sunset.jpg" 
alt="Bulcock Beach at Sunset looking towards Pumicestone Passage" 
width="400"></span></p>
 </div>
 <div class="paragraph">
 <p>We&#8217;ll use a simple chat example, perhaps similar to what you might 
have done yourself when trying out your favourite LLM.
diff --git a/blog/groovy-dauphine.html b/blog/groovy-dauphine.html
index 0ada912..b3bcfb6 100644
--- a/blog/groovy-dauphine.html
+++ b/blog/groovy-dauphine.html
@@ -80,7 +80,7 @@ riders in the general classification.</p>
 <p>Our results are stored in a CSV file:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/topten.png" alt="lines from CSV 
file"></span></p>
+<p><span class="image"><img src="./img/topten.png" alt="lines from CSV 
file"></span></p>
 </div>
 <div class="paragraph">
 <p>In a
diff --git a/blog/groovy-gatherers.html b/blog/groovy-gatherers.html
index a1fa527..2f81298 100644
--- a/blog/groovy-gatherers.html
+++ b/blog/groovy-gatherers.html
@@ -212,7 +212,7 @@ I&#8217;m glad you asked. Let&#8217;s look at stream 
equivalents for <code>colla
 <h2 id="_collate">Collate</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/collate.png" alt="collate a 
list - produced by Dall-E 3" width="200"></span>
+<p><span class="image right"><img src="./img/collate.png" alt="collate a list 
- produced by Dall-E 3" width="200"></span>
 Groovy&#8217;s <code>collate</code> method splits a collection into fixed size 
chunks:</p>
 </div>
 <div class="listingblock">
@@ -473,7 +473,7 @@ collections.</p>
 <h2 id="_chop">Chop</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/chop.png" alt="chop a list - 
produced by Dall-E 3" width="200"></span>
+<p><span class="image right"><img src="./img/chop.png" alt="chop a list - 
produced by Dall-E 3" width="200"></span>
 A related collection extension method in Groovy is <code>chop</code>.
 For this method, we also create chunks from the original collection but rather
 than specifying a fixed size that applies to all chunks, we specify the size we
diff --git a/blog/groovy-graph-databases.html b/blog/groovy-graph-databases.html
index 8ba49dc..ad5736f 100644
--- a/blog/groovy-graph-databases.html
+++ b/blog/groovy-graph-databases.html
@@ -121,7 +121,7 @@ Regan lead off the 4 x 100m medley relay and broke the 
backstroke record swimmin
 That makes 7 times the record was broken across the last 2 games!</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/BackstrokeRecord.png" alt="Result of 
Semifinal1" width="70%"></span></p>
+<p><span class="image"><img src="./img/BackstrokeRecord.png" alt="Result of 
Semifinal1" width="70%"></span></p>
 </div>
 <div class="paragraph">
 <p>We&#8217;ll have vertices in our graph database corresponding to the 
swimmers and the swims.
@@ -388,7 +388,7 @@ and even other sports if we wanted to.</p>
 <p>Let&#8217;s have a look at what our graph now looks like:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/BackstrokeRecords.png" alt="network 
of swim and swimmer vertices and relationship edges"></span></p>
+<p><span class="image"><img src="./img/BackstrokeRecords.png" alt="network of 
swim and swimmer vertices and relationship edges"></span></p>
 </div>
 <div class="paragraph">
 <p>We now might want to query the graph in numerous ways.
@@ -517,7 +517,7 @@ graph in <em>GraphML</em>, which is how the earlier image 
of Graphs and Nodes wa
 database storing nodes and edges. Nodes and edges may have a label and 
properties (or attributes).</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Neo4jLogo.svg" alt="neo4j logo" 
width="50%"></span></p>
+<p><span class="image"><img src="./img/Neo4jLogo.svg" alt="neo4j logo" 
width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>Neo4j models edge relationships using enums. Let&#8217;s create an enum for 
our example:</p>
@@ -778,7 +778,7 @@ swim7.runnerup(swim11)</code></pre>
 <p>The visualization is something like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/BackstrokeRecordsRunnerup.png" 
alt="Additional runnerup relationship" width="60%"></span></p>
+<p><span class="image"><img src="./img/BackstrokeRecordsRunnerup.png" 
alt="Additional runnerup relationship" width="60%"></span></p>
 </div>
 <div class="paragraph">
 <p>It essentially makes it easier to find the other medalists if we know any 
one of them.</p>
@@ -956,7 +956,7 @@ For our database, a query returning all nodes and edges 
creates
 a visualization like below (we chose to manually re-arrange the nodes):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/age-viewer.png" alt="age 
viewer"></span></p>
+<p><span class="image"><img src="./img/age-viewer.png" alt="age 
viewer"></span></p>
 </div>
 </div>
 </div>
@@ -964,7 +964,7 @@ a visualization like below (we chose to manually re-arrange 
the nodes):</p>
 <h2 id="_orientdb">OrientDB</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image"><img src="img/img/orientdb_logo.png" alt="orientdb 
logo" width="50%"></span></p>
+<p><span class="image"><img src="./img/orientdb_logo.png" alt="orientdb logo" 
width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>The next graph database we&#8217;ll look at is <a 
href="https://orientdb.org/";>OrientDB</a>.
@@ -1069,7 +1069,7 @@ We&#8217;ll examine them next when we look at 
ArcadeDB.</p>
 <p>Now, we&#8217;ll examine <a 
href="https://arcadedb.com/#getting-started";>ArcadeDB</a>.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/arcadedb-logo.png" alt="arcadedb 
logo"></span></p>
+<p><span class="image"><img src="./img/arcadedb-logo.png" alt="arcadedb 
logo"></span></p>
 </div>
 <div class="paragraph">
 <p>ArcadeDB is a rewrite/partial fork of OrientDB and carries over its 
Multi-Model nature.
@@ -1195,7 +1195,7 @@ as this example show:</p>
 with a query that looks at all nodes and edges associated with the Tokyo 2021 
olympics:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ArcadeStudio.png" 
alt="ArcadeStudio"></span></p>
+<p><span class="image"><img src="./img/ArcadeStudio.png" 
alt="ArcadeStudio"></span></p>
 </div>
 </div>
 </div>
@@ -1207,7 +1207,7 @@ with a query that looks at all nodes and edges associated 
with the Tokyo 2021 ol
 <a href="https://tugraph.tech/";>TuGraph</a>.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/tugraph.svg" alt="tugraph logo" 
width="40%"></span></p>
+<p><span class="image"><img src="./img/tugraph.svg" alt="tugraph logo" 
width="40%"></span></p>
 </div>
 <div class="paragraph">
 <p>We used the Community Edition using a docker image as outlined in the
diff --git a/blog/groovy-haiku-processing.html 
b/blog/groovy-haiku-processing.html
index abad853..0bff3cd 100644
--- a/blog/groovy-haiku-processing.html
+++ b/blog/groovy-haiku-processing.html
@@ -75,7 +75,7 @@ with its multi-line strings, so we won&#8217;t elaborate 
further on that aspect.
 <p>Here is some of Donald&#8217;s creative writing:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/DonaldRaabHaikus.png" alt="text of 
Donald Raab&#8217;s haikus"></span></p>
+<p><span class="image"><img src="./img/DonaldRaabHaikus.png" alt="text of 
Donald Raab&#8217;s haikus"></span></p>
 </div>
 <div class="paragraph">
 <p>In his examples, he processes those examples in various ways. We&#8217;ll 
look at doing the same
diff --git a/blog/groovy-knapsack.html b/blog/groovy-knapsack.html
index 8f1a817..06ecf08 100644
--- a/blog/groovy-knapsack.html
+++ b/blog/groovy-knapsack.html
@@ -75,7 +75,7 @@ in order to maximise the value within the knapsack without 
exceeding
 a given weight limit.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/knapsack2.jpg" alt="A knapsack and 
some gems"></span></p>
+<p><span class="image"><img src="./img/knapsack2.jpg" alt="A knapsack and some 
gems"></span></p>
 </div>
 </div>
 </div>
@@ -137,7 +137,7 @@ We&#8217;ll look at some other variations later.</p>
 maximise the value.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/knapsack.jpg" alt="A knapsack and 
some gems"></span></p>
+<p><span class="image"><img src="./img/knapsack.jpg" alt="A knapsack and some 
gems"></span></p>
 </div>
 </div>
 </div>
@@ -240,7 +240,7 @@ the limit, then we can discard that path from further 
processing.</p>
 <p>It is useful to visualize the above process as a solution tree (shown for 
capacity 10):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/brute-force-tree.png" alt="brute 
force tree"></span></p>
+<p><span class="image"><img src="./img/brute-force-tree.png" alt="brute force 
tree"></span></p>
 </div>
 <div class="paragraph">
 <p>The light red nodes indicate where subsequent processing of the solution 
tree can be skipped.</p>
@@ -423,7 +423,7 @@ println "Total value for capacity $W = ${knapsack(W, items, 
values.length)}"</co
 <p>Which has this visualization (for capacity 10):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/branch-and-bound-tree.png" 
alt="branch and bound tree"></span></p>
+<p><span class="image"><img src="./img/branch-and-bound-tree.png" alt="branch 
and bound tree"></span></p>
 </div>
 <div class="paragraph">
 <p>We should note that as well as discarding the
diff --git a/blog/groovy-lucene.html b/blog/groovy-lucene.html
index 0818b1e..9644d89 100644
--- a/blog/groovy-lucene.html
+++ b/blog/groovy-lucene.html
@@ -1191,7 +1191,7 @@ emojis.collect { k, v -&gt; "$k: ${v.join(', ')}" }.each 
{ println it }</code></
 <p>When run, you should see something like this (flag emojis may not show up 
on some platforms):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/LuceneWithStandardAnalyzer.png" 
alt="LuceneWithStandardAnalyzer"></span></p>
+<p><span class="image"><img src="./img/LuceneWithStandardAnalyzer.png" 
alt="LuceneWithStandardAnalyzer"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/groovy-oracle23ai.html b/blog/groovy-oracle23ai.html
index 42cac3c..18220cc 100644
--- a/blog/groovy-oracle23ai.html
+++ b/blog/groovy-oracle23ai.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Using the Oracle 23ai Vector data type with Groovy&trade; to 
classify Iris flowers</a></li><li><a href='#_the_dataset' 
class='anchor-link'>The dataset</a></li><li><a href='#_the_database_solution' 
class='anchor-link'>The database solution</a></li><li><a href='#_more_inform 
[...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
+<p><span class="image right"><img src="./img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
 A classic data science <a 
href="https://en.wikipedia.org/wiki/Iris_flower_data_set";>dataset</a> captures 
flower characteristics of Iris flowers.
 It captures the <em>width</em> and <em>length</em> of the <em>sepals</em> and 
<em>petals</em> for three <em>species</em> (<a 
href="https://en.wikipedia.org/wiki/Iris_setosa";>Setosa</a>, <a 
href="https://en.wikipedia.org/wiki/Iris_versicolor";>Versicolor</a>, and <a 
href="https://en.wikipedia.org/wiki/Iris_virginica";>Virginica</a>).</p>
 </div>
@@ -107,13 +107,13 @@ has some trouble with the data points near the overlap of 
the Virginica and Vers
 groupings as shown in the resulting graph of classification vs petal size:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/iris_knn_smile_petal.png" alt="Graph 
of predicted vs actual Iris flower classifications"></span></p>
+<p><span class="image"><img src="./img/iris_knn_smile_petal.png" alt="Graph of 
predicted vs actual Iris flower classifications"></span></p>
 </div>
 <div class="paragraph">
 <p>If we look at classification vs sepal size, we can see even more chance of 
confusion:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/iris_knn_smile_sepal.png" alt="Graph 
of predicted vs actual Iris flower classifications"></span></p>
+<p><span class="image"><img src="./img/iris_knn_smile_sepal.png" alt="Graph of 
predicted vs actual Iris flower classifications"></span></p>
 </div>
 <div class="paragraph">
 <p>The purple and green points show the incorrectly classified flowers.</p>
@@ -147,7 +147,7 @@ to be prone to mis-classification.</p>
 <p>Our data is stored in a CSV file:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/iris_csv.png" alt="iris CSV 
file"></span></p>
+<p><span class="image"><img src="./img/iris_csv.png" alt="iris CSV 
file"></span></p>
 </div>
 <div class="paragraph">
 <p>It happens to have 50 each of the three classes of Iris.
@@ -302,7 +302,7 @@ We&#8217;ll do this for the points returned for the 70%
 confidence case (second <strong>bold</strong> line above):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/iris_closest10points.png" 
alt="closest 10 points"></span></p>
+<p><span class="image"><img src="./img/iris_closest10points.png" alt="closest 
10 points"></span></p>
 </div>
 <div class="paragraph">
 <p>This is a Principal Component Analysis (PCA) plot
diff --git a/blog/groovy-pekko-gpars.html b/blog/groovy-pekko-gpars.html
index 4e39ea4..5224fb5 100644
--- a/blog/groovy-pekko-gpars.html
+++ b/blog/groovy-pekko-gpars.html
@@ -75,7 +75,7 @@ It provides Scala and Java APIs/DSLs for writing your 
applications. We&#8217;ll
 We&#8217;ll look at just one example of using Pekko actors.</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/gpars_logo.png" alt="gpars" 
width="180"></span>
+<p><span class="image right"><img src="./img/gpars_logo.png" alt="gpars" 
width="180"></span>
 By way of comparison, we&#8217;ll also be looking at <a 
href="http://www.gpars.org/";>GPars</a>,
 a concurrency library for Java and Groovy with support for actors, agents,
 concurrent &amp; parallel map/reduce, fork/join, asynchronous closures, 
dataflow, and more.
diff --git a/blog/groovy-record-performance.html 
b/blog/groovy-record-performance.html
index 8d4443b..aced9c8 100644
--- a/blog/groovy-record-performance.html
+++ b/blog/groovy-record-performance.html
@@ -288,7 +288,7 @@ So, let&#8217;s average the results across the three 
platforms, which
 gives us the following chart:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/hashcodeTimes.png" 
alt="hashcodeTimes"></span></p>
+<p><span class="image"><img src="./img/hashcodeTimes.png" 
alt="hashcodeTimes"></span></p>
 </div>
 <div class="paragraph">
 <p>Next we&#8217;ll look at some of the reasons behind these differences
@@ -652,7 +652,7 @@ EqualsBenchmark.equalsScalaCaseLabel                avgt   
10  20.673 ± 0.766
 <p>Like before, we&#8217;ll average the results across the three platforms:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/equalsTimes.png" 
alt="equalsTimes"></span></p>
+<p><span class="image"><img src="./img/equalsTimes.png" 
alt="equalsTimes"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/groovy-records.html b/blog/groovy-records.html
index 69e4143..11dfc4c 100644
--- a/blog/groovy-records.html
+++ b/blog/groovy-records.html
@@ -503,7 +503,7 @@ mix in the appropriate transforms from 
<code>@ToString</code>, <code>@EqualsAndH
 <p>Here is a summary of the main transforms and the provided functionality:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/record_like_functionality.png" 
alt="record like functionality"></span></p>
+<p><span class="image"><img src="./img/record_like_functionality.png" 
alt="record like functionality"></span></p>
 </div>
 </div>
 </div>
@@ -514,7 +514,7 @@ mix in the appropriate transforms from 
<code>@ToString</code>, <code>@EqualsAndH
 <p>Let&#8217;s wrap up our introduction to records with a summary of 
functionality:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/record_feature_summary.png" 
alt="TodoScreenshot"></span></p>
+<p><span class="image"><img src="./img/record_feature_summary.png" 
alt="TodoScreenshot"></span></p>
 </div>
 </div>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-release-train-4-0.html 
b/blog/groovy-release-train-4-0.html
index c3d7bd5..60f54c8 100644
--- a/blog/groovy-release-train-4-0.html
+++ b/blog/groovy-release-train-4-0.html
@@ -73,7 +73,7 @@
 <p>We&#8217;ve also had some great contributions from Sandip Chitale for 
Groovy&#8217;s Object Browser. You can access this from a number of ways 
including the <code>:inspect</code> command in groovysh or in the GroovyConsole 
via the <code>Script&#8594;Inspect Last</code> or <code>Script&#8594;Inspect 
Variables</code> menu items. It&#8217;s also hooked into the AST Browser if 
you&#8217;re exploring code produced by the Groovy compiler.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/object_explorer.png" alt="launching 
of Object Browser"></span></p>
+<p><span class="image"><img src="./img/object_explorer.png" alt="launching of 
Object Browser"></span></p>
 </div>
 <div class="paragraph">
 <p>Please find more details about the 4.0.4 release below.</p>
diff --git a/blog/groovy-text-similarity.html b/blog/groovy-text-similarity.html
index cd9a9ad..8486aa8 100644
--- a/blog/groovy-text-similarity.html
+++ b/blog/groovy-text-similarity.html
@@ -941,7 +941,7 @@ Nearest words in vocab: [cows, goat, pig, bovine]</pre>
 We could use the bar-charts we used previously, or something like a 
heat-map:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/AnimalSemanticSimilarity.png" 
alt="animal semantic similarity" width="60%"></span></p>
+<p><span class="image"><img src="./img/AnimalSemanticSimilarity.png" 
alt="animal semantic similarity" width="60%"></span></p>
 </div>
 <div class="paragraph">
 <p>Groupings of similar words can be seen as the larger orange and red 
regions. We can also quickly check
@@ -973,7 +973,7 @@ the raw vectors contain far too many dimensions for us mere 
mortals to comprehen
 analysis (PCA) to reduce the number of dimensions whilst capturing the most 
important information as shown here:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/AnimalSemanticMeaningPcaBubblePlot.png" alt="principal component 
analysis of animal-related word embeddings" width="75%"></span></p>
+<p><span class="image"><img src="./img/AnimalSemanticMeaningPcaBubblePlot.png" 
alt="principal component analysis of animal-related word embeddings" 
width="75%"></span></p>
 </div>
 </div>
 <div class="sect2">
@@ -1848,13 +1848,13 @@ challenges would be how to represent the large number 
of parameters to the user
 We could work on some pretty bar-charts like in <a 
href="https://semantle.com/";>Semantle</a>:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/semantle.png" alt="semantle game" 
width="50%"></span></p>
+<p><span class="image"><img src="./img/semantle.png" alt="semantle game" 
width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>And we could add a prettier representation of available letters, e.g. 
greyed out keys on a keyboard, like in <a 
href="https://www.nytimes.com/games/wordle/index.html";>Wordle</a>:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/wordle.png" alt="world game" 
width="30%"></span></p>
+<p><span class="image"><img src="./img/wordle.png" alt="world game" 
width="30%"></span></p>
 </div>
 <div class="paragraph">
 <p>But we might also just use a bubble-chart, like we showed earlier,
@@ -1862,7 +1862,7 @@ and let datascience condense the results for us. We might 
end up with
 a chart something like this (some guesses and hints for Round 3 shown):</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/gameBubble.png" alt="Game BubleChart" 
width="70%"></span></p>
+<p><span class="image"><img src="./img/gameBubble.png" alt="Game BubleChart" 
width="70%"></span></p>
 </div>
 <div class="paragraph">
 <p>But these are just ideas. A production ready game is for another time.
diff --git a/blog/groovy6-functional.html b/blog/groovy6-functional.html
index 63520d1..77329aa 100644
--- a/blog/groovy6-functional.html
+++ b/blog/groovy6-functional.html
@@ -1000,7 +1000,7 @@ not maintained separately, regenerated on every build:</p>
 </div>
 <div class="imageblock">
 <div class="content">
-<img src="img/WordCount.svg" alt="WordCount" width="584" height="248">
+<img src="./img/WordCount.svg" alt="WordCount" width="584" height="248">
 </div>
 </div>
 </div>
diff --git a/blog/groundhog-day.html b/blog/groundhog-day.html
index 901a562..f80e87c 100644
--- a/blog/groundhog-day.html
+++ b/blog/groundhog-day.html
@@ -70,7 +70,7 @@ in honor of <a 
href="https://en.wikipedia.org/wiki/Groundhog_Day";>Groundhog Day<
 looking at the kotlinx-datetime library.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Groundhog.png" 
alt="Groundhog"></span></p>
+<p><span class="image"><img src="./img/Groundhog.png" 
alt="Groundhog"></span></p>
 </div>
 <div class="paragraph">
 <p>The North American tradition, or superstition, depending on how you view 
such things,
diff --git a/blog/helloworldemoji.html b/blog/helloworldemoji.html
index 1431a8b..70eba6a 100644
--- a/blog/helloworldemoji.html
+++ b/blog/helloworldemoji.html
@@ -73,7 +73,7 @@ using various libraries.</p>
 kudos to <a href="https://twitter.com/hugs";>Jason Huggins</a> for the <a 
href="https://twitter.com/hugs/status/1642004520874942464";>idea</a>. It&#8217;s 
all in the picture:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/helloworld.png" alt="code for hello 
world"></span></p>
+<p><span class="image"><img src="./img/helloworld.png" alt="code for hello 
world"></span></p>
 </div></div></div></div></div><footer id='footer'>
                             <div class='row'>
                                 <div class='colset-3-footer'>
diff --git a/blog/img/WordCount.svg b/blog/img/img/WordCount.svg
similarity index 100%
rename from blog/img/WordCount.svg
rename to blog/img/img/WordCount.svg
diff --git a/blog/life-on-mars-units-of.html b/blog/life-on-mars-units-of.html
index 94219b5..8f59ec4 100644
--- a/blog/life-on-mars-units-of.html
+++ b/blog/life-on-mars-units-of.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Life on Mars: Units of Measurement systems, Groovy&trade;, and 
domain specific languages (DSLs)</a></li><li><a 
href='#_units_of_measurement_systems' class='anchor-link'>Units of measurement 
systems</a></li><li><a href='#_jsr_385_units_of_measurement_api_2_0' 
class='anchor- [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/duke_measure.png" 
alt="duke_measuring"></span>
+<p><span class="image right"><img src="./img/duke_measure.png" 
alt="duke_measuring"></span>
 The Mars Climate Orbiter was launched in 1998 as part
 of a multi-faceted Mars exploration program.
 It was lost due to a trajectory calculation error when
@@ -396,7 +396,7 @@ little nicer to type.</p>
 Domain-Specific-Language (DSL) to control a Mars rover robot.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/mars_rover_selfie.jpg" alt="Mars 
rover selfie" width="500"></span></p>
+<p><span class="image"><img src="./img/mars_rover_selfie.jpg" alt="Mars rover 
selfie" width="500"></span></p>
 </div>
 <div class="paragraph">
 <p>First, we&#8217;ll write a <code>Direction</code> enum as part of
diff --git a/blog/matrix-calculations-with-groovy-apache.html 
b/blog/matrix-calculations-with-groovy-apache.html
index 267b7e0..2a78ca8 100644
--- a/blog/matrix-calculations-with-groovy-apache.html
+++ b/blog/matrix-calculations-with-groovy-apache.html
@@ -105,7 +105,7 @@ be in one year? The sequence goes like this:</p>
 </div>
 </div>
 <div class="paragraph">
-<p>We can solve this problem using matrices. If we multiply the matrix <span 
class="image"><img src="img/img/FibMatrix.png" alt="fibonacci matrix" 
width="43"></span> by itself n times we get <span class="image"><img 
src="img/img/FibMatrixN.png" alt="fib n matrix" width="82"></span>.
+<p>We can solve this problem using matrices. If we multiply the matrix <span 
class="image"><img src="./img/FibMatrix.png" alt="fibonacci matrix" 
width="43"></span> by itself n times we get <span class="image"><img 
src="./img/FibMatrixN.png" alt="fib n matrix" width="82"></span>.
 This is an operation known as matrix exponentiation.
 Let&#8217;s explore this problem using four of the most popular
 and maintained matrix libraries.</p>
@@ -684,7 +684,7 @@ factory method for creating a transform matrix.</p>
 <p>When we run this code we see our three shapes:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MatrixShapes.png" 
alt="Shapes"></span></p>
+<p><span class="image"><img src="./img/MatrixShapes.png" 
alt="Shapes"></span></p>
 </div>
 <div class="paragraph">
 <p>We can now add our transforms. We&#8217;ll have one which rotate by 90
@@ -748,7 +748,7 @@ def trapezoid_
 like:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MatrixShapesTransformed.png" 
alt="Shapes transformed"></span></p>
+<p><span class="image"><img src="./img/MatrixShapesTransformed.png" 
alt="Shapes transformed"></span></p>
 </div>
 <div class="paragraph">
 <p>We can see here that matrix transforms give us powerful ways to
@@ -876,7 +876,7 @@ a graphical rendition of the matrix. So, the final end-user
 experience when using the GroovyConsole looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/GroovyConsoleOutputTransformsMatrix.png" alt="matrix output 
transforms in groovy console"></span></p>
+<p><span class="image"><img 
src="./img/GroovyConsoleOutputTransformsMatrix.png" alt="matrix output 
transforms in groovy console"></span></p>
 </div>
 <div class="paragraph">
 <p>When using in Jupyter style environments, other pretty output
diff --git a/blog/natural-language-processing-with-groovy.html 
b/blog/natural-language-processing-with-groovy.html
index 490c440..43ec70c 100644
--- a/blog/natural-language-processing-with-groovy.html
+++ b/blog/natural-language-processing-with-groovy.html
@@ -305,13 +305,13 @@ We need to copy that file into our <code>~/.groovy</code> 
folder and then enable
 visualization as shown here:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/groovyconsole_enable_visualization.png" alt="How to enable 
visualization in the groovyconsole"></span></p>
+<p><span class="image"><img src="./img/groovyconsole_enable_visualization.png" 
alt="How to enable visualization in the groovyconsole"></span></p>
 </div>
 <div class="paragraph">
 <p>Then we should see the following when running the script:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/groovyconsole_showing_visutalization.png" alt="natural language 
processing in the groovyconsole with visualization"></span></p>
+<p><span class="image"><img 
src="./img/groovyconsole_showing_visutalization.png" alt="natural language 
processing in the groovyconsole with visualization"></span></p>
 </div>
 <div class="paragraph">
 <p>The visualization is purely optional but adds a nice touch. If using Groovy 
in
@@ -1317,7 +1317,7 @@ Two sentences with similar meaning typically have similar 
embeddings.</p>
 <p>The displayed graphic is shown below:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/sentence_encodings_smile_heatmap.png" 
alt="Heatmap plot of sentence encodings"></span></p>
+<p><span class="image"><img src="./img/sentence_encodings_smile_heatmap.png" 
alt="Heatmap plot of sentence encodings"></span></p>
 </div>
 <div class="paragraph">
 <p>This graphic shows that our first four sentences are somewhat related, as 
are
diff --git a/blog/netbeans.html b/blog/netbeans.html
index ea2a568..89d3763 100644
--- a/blog/netbeans.html
+++ b/blog/netbeans.html
@@ -88,13 +88,13 @@ If you haven&#8217;t used NetBeans with Groovy before, you 
might need to enable
 to Groovy plugin. Select <code>Tools &#8594; Plugins &#8594; Installed</code>, 
Check <code>Groovy</code> and click on <code>Activate</code>, when finished, 
you should see a screen like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_enable_groovy_plugin.png" 
alt="enabling the groovy plugin" width="600"></span></p>
+<p><span class="image"><img src="./img/nb_enable_groovy_plugin.png" 
alt="enabling the groovy plugin" width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>Next, we are going to create a new project, select <code>File &#8594; New 
Project&#8230;&#8203; &#8594; Groovy with Gradle</code>.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_create_groovy_application.png" 
alt="creating a new project" width="600"></span></p>
+<p><span class="image"><img src="./img/nb_create_groovy_application.png" 
alt="creating a new project" width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>Select <code>Groovy Application</code> then click <code>Next</code>.</p>
@@ -103,7 +103,7 @@ to Groovy plugin. Select <code>Tools &#8594; Plugins 
&#8594; Installed</code>, C
 <p>Now, fill in the project details:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_new_application_details.png" 
alt="entering project details" width="600"></span></p>
+<p><span class="image"><img src="./img/nb_new_application_details.png" 
alt="entering project details" width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>We are going to create a little script that uses some fraction 
functionality from the
@@ -168,7 +168,7 @@ application {
 and then one line of code:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_simple_fractions_script.png" 
alt="NetBeans IDE showing simple script"></span></p>
+<p><span class="image"><img src="./img/nb_simple_fractions_script.png" 
alt="NetBeans IDE showing simple script"></span></p>
 </div>
 <div class="paragraph">
 <p>Running the script shows the expected output of <code>5 / 6</code>. The 
fractions library
@@ -186,7 +186,7 @@ That way we won&#8217;t impact using the 
<code>Integer</code> and <code>Fraction
 without these changes in other places.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_script_with_category.png" 
alt="NetBeans IDE showing script with category"></span></p>
+<p><span class="image"><img src="./img/nb_script_with_category.png" 
alt="NetBeans IDE showing script with category"></span></p>
 </div>
 <div class="paragraph">
 <p>The magic is in the code fragment <code>println 1 / 3 + 1 / 2</code>. The 
expression <code>1 / 3</code>
@@ -215,7 +215,7 @@ Let&#8217;s put a breakpoint on the statement in the 
<code>plus</code> method of
 <code>FractionCategory</code> class, and then run with debug.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_debug.png" alt="NetBeans IDE 
showing script debugging"></span></p>
+<p><span class="image"><img src="./img/nb_debug.png" alt="NetBeans IDE showing 
script debugging"></span></p>
 </div>
 <div class="paragraph">
 <p>Execution has halted. We can inspect the <code>self</code> and 
<code>other</code> variables and
@@ -234,7 +234,7 @@ overloading in the source code, and it is renamed to normal 
method
 calls, removing the need for subsequent metaprogramming.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/nb_groovy5.png" alt="using Groovy 
5"></span></p>
+<p><span class="image"><img src="./img/nb_groovy5.png" alt="using Groovy 
5"></span></p>
 </div>
 <div class="paragraph">
 <p>So, the <code>+</code> in the assert statement at line 6 is converted into
diff --git a/blog/parsing-json-with-groovy.html 
b/blog/parsing-json-with-groovy.html
index 262cacc..26165d4 100644
--- a/blog/parsing-json-with-groovy.html
+++ b/blog/parsing-json-with-groovy.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Parsing JSON with Groovy&trade;</a></li><li><a 
href='#_batteries_included_experience' class='anchor-link'>Batteries included 
experience</a></li><li><a href='#_gradle' 
class='anchor-link'>Gradle</a></li><li><a href='#_maven' 
class='anchor-link'>Maven</a></li><li><a href='#_ [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/json_logo.gif" alt="json logo" 
width="120"></span>
+<p><span class="image right"><img src="./img/json_logo.gif" alt="json logo" 
width="120"></span>
 Groovy has excellent support for processing a range of structured
 data formats like JSON, TOML, YAML, etc. This blog post looks at
 <a href="https://www.json.org/json-en.html";>JSON</a>.</p>
@@ -94,7 +94,7 @@ and in the other mentioned links should work out of the 
box.</p>
 <p><code>JsonSlurper</code> is the main class for parsing JSON.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/JsonSlurper_in_GroovyConsole.png" 
alt="JsonSlurper in GroovyConsole"></span></p>
+<p><span class="image"><img src="./img/JsonSlurper_in_GroovyConsole.png" 
alt="JsonSlurper in GroovyConsole"></span></p>
 </div>
 <div class="paragraph">
 <p>This example shows parsing JSON embedded in a string but there
@@ -117,7 +117,7 @@ groovy:000&gt; new groovy.json.JsonSlurper().parseText('{ 
"myList": [1, 3, 5] }'
 <p>Or using a Jupyter/BeakerX notebook:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/JsonSlurper_in_Jupyter_notebook.png" 
alt="JsonSlurper in Jupyter notebook"></span></p>
+<p><span class="image"><img src="./img/JsonSlurper_in_Jupyter_notebook.png" 
alt="JsonSlurper in Jupyter notebook"></span></p>
 </div>
 </div>
 </div>
@@ -175,7 +175,7 @@ transitively, so there&#8217;s no need to reference that 
explicitly.</p>
 <p>Running <code>gradle test</code> should run the tests and produce a 
report:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/Test_results_for_Class_JsonTest.png" 
alt="Test results for Class JsonTest"></span></p>
+<p><span class="image"><img src="./img/Test_results_for_Class_JsonTest.png" 
alt="Test results for Class JsonTest"></span></p>
 </div>
 <div class="paragraph">
 <p>You can if you prefer, use the <code>groovy-all</code> artifact like 
this:</p>
diff --git a/blog/reading-and-writing-csv-files.html 
b/blog/reading-and-writing-csv-files.html
index 5af948e..87c6b98 100644
--- a/blog/reading-and-writing-csv-files.html
+++ b/blog/reading-and-writing-csv-files.html
@@ -127,7 +127,7 @@ Groovy provides nice options for this too. Suppose we have
 the following existing CSV file:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HommesOverall.png" 
alt="HommesOverall"></span></p>
+<p><span class="image"><img src="./img/HommesOverall.png" 
alt="HommesOverall"></span></p>
 </div>
 <div class="paragraph">
 <p>We can read in the file and select various columns of interest
@@ -192,7 +192,7 @@ is summarised in honour of the great riding during the tour!
 Here&#8217;s the output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/HommesMultipleWins.png" 
alt="MultipleWins"></span></p>
+<p><span class="image"><img src="./img/HommesMultipleWins.png" 
alt="MultipleWins"></span></p>
 </div>
 <div class="paragraph">
 <p>Okay, now let&#8217;s look at our three CSV libraries.</p>
@@ -299,7 +299,7 @@ writing our CSV file in the same way as earlier:</p>
 than earlier with double quotes around all data:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/FemmesPodiumStage1.png" 
alt="FemmesPodiumStage1"></span></p>
+<p><span class="image"><img src="./img/FemmesPodiumStage1.png" 
alt="FemmesPodiumStage1"></span></p>
 </div>
 <div class="paragraph">
 <p>If we want to do more elaborate processing, the
diff --git a/blog/seasons-greetings-emoji.html 
b/blog/seasons-greetings-emoji.html
index 588924b..00b7a70 100644
--- a/blog/seasons-greetings-emoji.html
+++ b/blog/seasons-greetings-emoji.html
@@ -135,14 +135,14 @@ We&#8217;ll check that the 3 Unicode code points for that 
String
 all correspond to emojis using one of the new API calls:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji1.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji1.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We can check using the newly added regex binary properties as well.
 The Groovy regex operator (<code>==~</code>) ensures that the String exactly 
matches 3 emojis:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji2.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji2.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>Unicode supports various forms of modification by sequencing Unicode 
characters.
@@ -156,7 +156,7 @@ base, but the two Claus emojis can. Also, we can see that 
all 5 skin
 tone emoji characters can be used as emoji modifiers:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji3.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji3.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s try some combinations. We&#8217;ll combine the Santa emoji with
@@ -169,7 +169,7 @@ it will be the same as the "bare" Santa emoji plus the code 
points
 from the skin tone emoji:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji4.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji4.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We are also checking the emoji roles using a regex.
@@ -179,7 +179,7 @@ We can see the base followed by the modifier.</p>
 <p>We can put all this together to check all five toned Santas as follows:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji5.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji5.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>Another sequencing trick offered by Unicode is to combine related
@@ -203,7 +203,7 @@ emoji using Unicode. The first and last parts are 
represented as surrogate
 pairs which are combined into the correct code points automatically.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji6.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji6.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>The last two lines show checking the combined emoji with regex.
@@ -216,7 +216,7 @@ emoji names using the <code>\N{&#8230;&#8203;}</code> 
notation.</p>
 combines 3 emojis, with interleaved ZWJ characters.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji7.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji7.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We can do similar regex checks as previously, checking the
@@ -233,7 +233,7 @@ The "♀️" emoji combines the female sign character "♀" with 
a special
 should be treated as an emoji rather than a character.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji8.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji8.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We can put the new emoji API calls through their paces by checking
@@ -245,7 +245,7 @@ We can check for an exact match of the Unicode characters 
exactly,
 by their emoji names, or by role each part plays as shown below:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/emoji9.png" alt="using 
isEmoji"></span></p>
+<p><span class="image"><img src="./img/emoji9.png" alt="using 
isEmoji"></span></p>
 </div>
 <div class="paragraph">
 <p>We hope you have enjoyed this little exploration of the
diff --git a/blog/set-operations-with-groovy.html 
b/blog/set-operations-with-groovy.html
index 3928155..14805d0 100644
--- a/blog/set-operations-with-groovy.html
+++ b/blog/set-operations-with-groovy.html
@@ -73,7 +73,7 @@ operator also.</p>
 <p>First, a quick refresh about the operators for two sets <strong>A</strong> 
and <strong>B</strong>:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/SetOperators.png" 
alt="SetOperators"></span></p>
+<p><span class="image"><img src="./img/SetOperators.png" 
alt="SetOperators"></span></p>
 </div>
 <div class="paragraph">
 <p>We&#8217;ll use the same emoji sets from Donald&#8217;s post:</p>
diff --git a/blog/solving-cryptarithmetic-puzzles-with-groovy.html 
b/blog/solving-cryptarithmetic-puzzles-with-groovy.html
index 218682e..c0cffe6 100644
--- a/blog/solving-cryptarithmetic-puzzles-with-groovy.html
+++ b/blog/solving-cryptarithmetic-puzzles-with-groovy.html
@@ -636,46 +636,46 @@ represents our problem search space. We walk our way 
through
 the rules looking for ways to prune the search space:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step1.png" 
alt="choco_step1"></span></p>
+<p><span class="image"><img src="./img/choco_step1.png" 
alt="choco_step1"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step2.png" 
alt="choco_step2"></span></p>
+<p><span class="image"><img src="./img/choco_step2.png" 
alt="choco_step2"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step3.png" 
alt="choco_step3"></span></p>
+<p><span class="image"><img src="./img/choco_step3.png" 
alt="choco_step3"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step4.png" 
alt="choco_step4"></span></p>
+<p><span class="image"><img src="./img/choco_step4.png" 
alt="choco_step4"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step5.png" 
alt="choco_step5"></span></p>
+<p><span class="image"><img src="./img/choco_step5.png" 
alt="choco_step5"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step6.png" 
alt="choco_step6"></span></p>
+<p><span class="image"><img src="./img/choco_step6.png" 
alt="choco_step6"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step7.png" 
alt="choco_step7"></span></p>
+<p><span class="image"><img src="./img/choco_step7.png" 
alt="choco_step7"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step8.png" 
alt="choco_step8"></span></p>
+<p><span class="image"><img src="./img/choco_step8.png" 
alt="choco_step8"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step9.png" 
alt="choco_step9"></span></p>
+<p><span class="image"><img src="./img/choco_step9.png" 
alt="choco_step9"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step10.png" 
alt="choco_step10"></span></p>
+<p><span class="image"><img src="./img/choco_step10.png" 
alt="choco_step10"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step11.png" 
alt="choco_step11"></span></p>
+<p><span class="image"><img src="./img/choco_step11.png" 
alt="choco_step11"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step12.png" 
alt="choco_step12"></span></p>
+<p><span class="image"><img src="./img/choco_step12.png" 
alt="choco_step12"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step13.png" 
alt="choco_step13"></span></p>
+<p><span class="image"><img src="./img/choco_step13.png" 
alt="choco_step13"></span></p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/choco_step14.png" 
alt="choco_step14"></span></p>
+<p><span class="image"><img src="./img/choco_step14.png" 
alt="choco_step14"></span></p>
 </div>
 <div class="paragraph">
 <p>As we are locking in the value of variables, we can substitute
@@ -710,7 +710,7 @@ Prolog (<a 
href="http://apice.unibo.it/xwiki/bin/view/Tuprolog/";>tuprolog</a>),
 and <a href="https://www.scala-lang.org/";>Scala</a>.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/sendmoremoney_polyglot.png" 
alt="slides"></span></p>
+<p><span class="image"><img src="./img/sendmoremoney_polyglot.png" 
alt="slides"></span></p>
 </div>
 <div class="paragraph">
 <p>To wrap up, let&#8217;s look at solving a few more examples (using
diff --git a/blog/solving-simple-optimization-problems-with-groovy.html 
b/blog/solving-simple-optimization-problems-with-groovy.html
index b8c1db8..e148bfa 100644
--- a/blog/solving-simple-optimization-problems-with-groovy.html
+++ b/blog/solving-simple-optimization-problems-with-groovy.html
@@ -217,7 +217,7 @@ It will be similar to the figure shown below, but initially,
 the variable cells (blue) and objective cell (yellow) will be blank.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/GoogleSheetsDietData.png" 
alt="Data"></span></p>
+<p><span class="image"><img src="./img/GoogleSheetsDietData.png" 
alt="Data"></span></p>
 </div>
 <div class="paragraph">
 <p>Then, using the OpenSolver extension, we identify by way
@@ -225,7 +225,7 @@ of cell ranges, our data (blue) and objective (yellow) 
cells,
 as well as the constraints.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/GoogleSheetsDietOpenSolver.png" 
alt="Solver" width="25%"></span></p>
+<p><span class="image"><img src="./img/GoogleSheetsDietOpenSolver.png" 
alt="Solver" width="25%"></span></p>
 </div>
 <div class="paragraph">
 <p>Then we click "Solve" and it calculates our optimized value.</p>
diff --git a/blog/testing-your-java-with-groovy.html 
b/blog/testing-your-java-with-groovy.html
index b7aca4d..15f12a6 100644
--- a/blog/testing-your-java-with-groovy.html
+++ b/blog/testing-your-java-with-groovy.html
@@ -66,7 +66,7 @@
                         </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Testing your Java with Groovy&trade;, Spock, JUnit5, Jacoco, Jqwik 
and Pitest</a></li><li><a href='#_the_system_under_test' 
class='anchor-link'>The system under test</a></li><li><a 
href='#_testing_with_spock' class='anchor-link'>Testing with 
Spock</a></li><li><a href='#_mu [...]
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/spock_logo.png" alt="spock 
logo" width="100"></span>
+<p><span class="image right"><img src="./img/spock_logo.png" alt="spock logo" 
width="100"></span>
 This blog post covers a common scenario seen in the Groovy community which is
 projects which use Java for their production code and Groovy for their tests.
 This can be a low risk way for Java shops to try out and become more familiar
@@ -126,7 +126,7 @@ An initial stab at the code for this might look something 
like this:</p>
 <p>When we run this test, all tests pass:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MathUtilSpecResult.png" 
alt="MathUtilSpec test result"></span></p>
+<p><span class="image"><img src="./img/MathUtilSpecResult.png" 
alt="MathUtilSpec test result"></span></p>
 </div>
 <div class="paragraph">
 <p>But if we look at the coverage report, generated with
@@ -134,7 +134,7 @@ An initial stab at the code for this might look something 
like this:</p>
 hasn&#8217;t covered all lines of code:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MathUtilJacocoReport.png" 
alt="MathUtilSpec coverage report"></span></p>
+<p><span class="image"><img src="./img/MathUtilJacocoReport.png" 
alt="MathUtilSpec coverage report"></span></p>
 </div>
 <div class="paragraph">
 <p>We&#8217;ll swap to use Spock&#8217;s data-driven feature and include an 
additional testcase:</p>
@@ -156,7 +156,7 @@ hasn&#8217;t covered all lines of code:</p>
 <p>We can check our coverage again:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MathUtilJacocoReport2.png" 
alt="MathUtilSpec coverage report"></span></p>
+<p><span class="image"><img src="./img/MathUtilJacocoReport2.png" 
alt="MathUtilSpec coverage report"></span></p>
 </div>
 <div class="paragraph">
 <p>That is a little better. We now have 100% line coverage but not 100% branch 
coverage.
@@ -180,7 +180,7 @@ Let&#8217;s add one more testcase:</p>
 <p>And now we can see that we have reached 100% line coverage and 100% branch 
coverage:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MathUtilJacocoReport3.png" 
alt="MathUtilSpec coverage report"></span></p>
+<p><span class="image"><img src="./img/MathUtilJacocoReport3.png" 
alt="MathUtilSpec coverage report"></span></p>
 </div>
 <div class="paragraph">
 <p>At this point, we might be very confident in our code and ready to ship it 
to production.
@@ -205,7 +205,7 @@ Before we do, we&#8217;ll add one more testcase:</p>
 <p>When we re-run our tests, we discover that the last testcase failed!:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/MathUtilSpecResult2.png" 
alt="MathUtilSpec test result"></span></p>
+<p><span class="image"><img src="./img/MathUtilSpecResult2.png" 
alt="MathUtilSpec test result"></span></p>
 </div>
 <div class="paragraph">
 <p>And examining the testcase, we can indeed see that there is a flaw in our 
algorithm.
@@ -213,13 +213,13 @@ Basically, having the <code>else</code> logic 
doesn&#8217;t cater for when <code
 greater than both <code>a</code> and <code>b</code>!</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img 
src="img/img/MathUtilSpecResultFailedAssertion.png" alt="MathUtilSpec failed 
assertion"></span></p>
+<p><span class="image"><img src="./img/MathUtilSpecResultFailedAssertion.png" 
alt="MathUtilSpec failed assertion"></span></p>
 </div>
 <div class="paragraph">
 <p>We succumbed to faulty expectations of what 100% coverage would give us.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ImperfectPuzzle.jpg" alt="Imperfect 
puzzle" width="250"></span></p>
+<p><span class="image"><img src="./img/ImperfectPuzzle.jpg" alt="Imperfect 
puzzle" width="250"></span></p>
 </div>
 <div class="paragraph">
 <p>The good news is that we can fix this. Here is an updated algorithm:</p>
@@ -282,13 +282,13 @@ where we erroneously thought we had 100% coverage. When 
we run Pitest, we get th
 following result:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/PitestCoverageReport.png" alt="Pitest 
coverage report summary"></span></p>
+<p><span class="image"><img src="./img/PitestCoverageReport.png" alt="Pitest 
coverage report summary"></span></p>
 </div>
 <div class="paragraph">
 <p>And looking at the code we see:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/PitestMathUtilCoverage.png" 
alt="Pitest coverage report"></span></p>
+<p><span class="image"><img src="./img/PitestMathUtilCoverage.png" alt="Pitest 
coverage report"></span></p>
 </div>
 <div class="paragraph">
 <p>With output including some statistics:</p>
@@ -315,7 +315,7 @@ In our case, we know that the testsuite was 
insufficient.</p>
 <p>Let&#8217;s run it again but this time with all of our tests and the 
corrected algorithm.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/PitestCoverage2.png" alt="Pitest 
coverage report"></span></p>
+<p><span class="image"><img src="./img/PitestCoverage2.png" alt="Pitest 
coverage report"></span></p>
 </div>
 <div class="paragraph">
 <p>The output when running the test has also changed slightly:</p>
diff --git a/blog/testing_permutations_combinations.html 
b/blog/testing_permutations_combinations.html
index d94b8a7..103b208 100644
--- a/blog/testing_permutations_combinations.html
+++ b/blog/testing_permutations_combinations.html
@@ -252,7 +252,7 @@ it is to do with supporting friendly test names when the 
test is run with variou
 Here are the first 9 of the 326 tests shown when run in <a 
href="https://www.jetbrains.com/idea/";>Intellij IDEA</a>:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ListDemoTest.png" alt="Result of 
running the test"></span></p>
+<p><span class="image"><img src="./img/ListDemoTest.png" alt="Result of 
running the test"></span></p>
 </div>
 </div>
 </div>
@@ -425,7 +425,7 @@ The pretty formatting of nested results is missing. The 
JUnit5 run in Intellij
 will look like the following:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ListDemoGroovyTest.png" alt="Result 
of test run"></span></p>
+<p><span class="image"><img src="./img/ListDemoGroovyTest.png" alt="Result of 
test run"></span></p>
 </div>
 <div class="paragraph">
 <p>We can&#8217;t drill down into the different test subcases within the 
<code>validate</code> and <code>validateMany</code> tests.
@@ -486,7 +486,7 @@ void validate(List&lt;String&gt; names, List&lt;Closure&gt; 
operations) {
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ListDemoDataDrivenGroovyTest.png" 
alt="Result of running test"></span></p>
+<p><span class="image"><img src="./img/ListDemoDataDrivenGroovyTest.png" 
alt="Result of running test"></span></p>
 </div>
 </div>
 </div>
@@ -530,7 +530,7 @@ with the <em>where</em> clause for data-driven testing:</p>
 <p>When run, it has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ListDemoDataDrivenSpockSpec.png" 
alt="Result of running test"></span></p>
+<p><span class="image"><img src="./img/ListDemoDataDrivenSpockSpec.png" 
alt="Result of running test"></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s now cover some additional topics.</p>
diff --git a/blog/using-groovy-with-apache-wayang.html 
b/blog/using-groovy-with-apache-wayang.html
index 52ed008..0141223 100644
--- a/blog/using-groovy-with-apache-wayang.html
+++ b/blog/using-groovy-with-apache-wayang.html
@@ -101,7 +101,7 @@ specific underlying processing platforms.</p>
 <h2 id="_whiskey_clustering">Whiskey Clustering</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="groovy 
logo" width="140"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="groovy 
logo" width="140"></span>
 We&#8217;ll take a look at using Apache Wayang with Groovy to help us in
 the quest to find the perfect single-malt Scotch whiskey.
 The whiskies produced from
@@ -118,7 +118,7 @@ algorithms involving iteration (the typical map, filter, 
reduce
 style of processing).</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/whiskey_bottles.jpg" 
alt="whiskey_bottles"></span></p>
+<p><span class="image"><img src="./img/whiskey_bottles.jpg" 
alt="whiskey_bottles"></span></p>
 </div>
 <div class="paragraph">
 <p>KMeans is a standard data-science clustering technique. In our
@@ -357,7 +357,7 @@ Cluster 4: 2.25, 2.38, 1.38, 0.08, 0.13, 1.79, 1.54, 1.33, 
1.75, 2.17, 1.75, 1.7
 <p>Which, if plotted looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/whiskey_wayang_kmeans_spiderplot.png" 
alt="WhiskeyWayang Centroid Spider Plot"></span></p>
+<p><span class="image"><img src="./img/whiskey_wayang_kmeans_spiderplot.png" 
alt="WhiskeyWayang Centroid Spider Plot"></span></p>
 </div>
 <div class="paragraph">
 <p>If you are interested, check out the examples in the repo links
diff --git a/blog/wayang-tensorflow.html b/blog/wayang-tensorflow.html
index 9160e11..a65bf7b 100644
--- a/blog/wayang-tensorflow.html
+++ b/blog/wayang-tensorflow.html
@@ -72,7 +72,7 @@
         </div><br/><span>Published: 2025-02-28 09:30AM (Last updated: 
2025-08-28 02:21PM)</span></p><hr/><div id="preamble">
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/iris_flowers.png" alt="iris 
flowers" width="180"></span>In previous blog posts, we have looked at:</p>
+<p><span class="image right"><img src="./img/iris_flowers.png" alt="iris 
flowers" width="180"></span>In previous blog posts, we have looked at:</p>
 </div>
 <div class="ulist">
 <ul>
@@ -193,13 +193,13 @@ Recall that such networks have inputs (the features),
 one or more hidden layers, and outputs (in this case, labels).</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_network.png" alt="Iris neural 
net layers" width="600"></span></p>
+<p><span class="image"><img src="./img/deep_network.png" alt="Iris neural net 
layers" width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>The nodes can be activated by linear or non-linear functions.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/deep_node.png" alt="Neural net node" 
width="600"></span></p>
+<p><span class="image"><img src="./img/deep_node.png" alt="Neural net node" 
width="600"></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s first define our inputs:</p>
diff --git a/blog/whiskey-clustering-with-groovy-and.html 
b/blog/whiskey-clustering-with-groovy-and.html
index a24f038..8cc8220 100644
--- a/blog/whiskey-clustering-with-groovy-and.html
+++ b/blog/whiskey-clustering-with-groovy-and.html
@@ -85,11 +85,11 @@ but earlier versions are also fine for our example.</p>
 <h2 id="_whiskey_clustering">Whiskey Clustering</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
+<p><span class="image right"><img src="./img/groovy_logo.png" alt="Groovy 
logo" width="200"></span>
 This problem looks at the quest of finding the perfect single-malt Scotch 
whiskey. The whiskies produced from <a 
href="https://www.niss.org/sites/default/files/ScotchWhisky01.txt";>86 
distilleries</a> have been ranked by expert tasters according to 12 criteria 
(Body, Sweetness, Malty, Smoky, Fruity, etc.). We&#8217;ll use a K-means 
algorithm to calculate the centroids.</p>
 </div>
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/whiskey_bottles.jpg" 
alt="whiskey_bottles" width="300"></span>
+<p><span class="image right"><img src="./img/whiskey_bottles.jpg" 
alt="whiskey_bottles" width="300"></span>
 K-means is a standard data-science clustering technique. In our case, it 
groups whiskies with similar characteristics (according to the 12 criteria) 
into clusters. If we have a favourite whiskey, chances are we can find 
something similar by looking at other instances in the same cluster. If we are 
feeling like a change, we can look for a whiskey in some other cluster. The 
centroid is the notional "point" in the middle of the cluster. For us, it 
reflects the typical measure of each criter [...]
 </div>
 </div>
@@ -119,7 +119,7 @@ This explanation drastically simplifies Ignite&#8217;s 
feature set. Ignite can b
 </div>
 <div class="paragraph">
 <p>It is mostly this last capability that we will use. Ignite&#8217;s 
<em>Machine Learning API</em> has purpose built, cluster-aware machine learning 
and deep learning algorithms for Classification, Regression, Clustering, and 
Recommendation among others. We&#8217;ll use the distributed <a 
href="https://ignite.apache.org/docs/latest/machine-learning/clustering/k-means-clustering";>K-means
 Clustering</a> algorithm from their library.
-<span class="image"><img src="img/img/apache_ignite_architecture.png" 
alt="Machine Learning _ Ignite Documentation"></span></p>
+<span class="image"><img src="./img/apache_ignite_architecture.png" 
alt="Machine Learning _ Ignite Documentation"></span></p>
 </div>
 </div>
 </div>
@@ -221,7 +221,7 @@ Body, Sweetness, Smoky, Medicinal, Tobacco, Honey, Spicy, 
Winey, Nutty, Malty, F
 </div>
 <div class="paragraph">
 <p>We can plot the centroid characteristics in a spider plot.
-<span class="image"><img src="img/img/whiskey_spider_plot.png" alt="Whiskey 
clusters with Apache Ignite"></span></p>
+<span class="image"><img src="./img/whiskey_spider_plot.png" alt="Whiskey 
clusters with Apache Ignite"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/whisky-revisited.html b/blog/whisky-revisited.html
index 42fbf1f..3c883dc 100644
--- a/blog/whisky-revisited.html
+++ b/blog/whisky-revisited.html
@@ -114,7 +114,7 @@ We&#8217;ll explore Whisky flavor profiles!</em></span></p>
 <h2 id="_the_case_study">The Case Study</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><span class="image right"><img src="img/img/whiskey_bottles.jpg" 
alt="whisky bottles" width="180"></span>
+<p><span class="image right"><img src="./img/whiskey_bottles.jpg" alt="whisky 
bottles" width="180"></span>
 In the quest to find the perfect single-malt Scotch whisky,
 the whiskies produced from
 <a href="https://www.niss.org/sites/default/files/ScotchWhisky01.txt";>86 
distilleries</a>
@@ -206,7 +206,7 @@ plot.correlationMatrix(df[features]).show()</code></pre>
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/underdogCorrelationPlot.png" 
alt="correlation plot" width="50%"></span></p>
+<p><span class="image"><img src="./img/underdogCorrelationPlot.png" 
alt="correlation plot" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>We can see that the different flavor measures are quite distinct.
@@ -252,7 +252,7 @@ There is one such shortcut for a radar plot of a single 
series. Let&#8217;s look
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/underdogAberlourRadar.png" alt="radar 
plot for Aberlour" width="50%"></span></p>
+<p><span class="image"><img src="./img/underdogAberlourRadar.png" alt="radar 
plot for Aberlour" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>This pops up in a browser window for the code shown above, but other output 
options are also available.</p>
@@ -290,7 +290,7 @@ plot.show(multiRadar)</code></pre>
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/underdogWhiskySelectionsRadar.png" 
alt="radar plot for six whiskies" width="50%"></span></p>
+<p><span class="image"><img src="./img/underdogWhiskySelectionsRadar.png" 
alt="radar plot for six whiskies" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>It can often be infuriating when a library doesn&#8217;t offer a feature 
you need,
@@ -424,7 +424,7 @@ df['Y'] = projected*.getAt(1)</code></pre>
 <p>The output looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/underdogClusterKmeans.png" 
alt="scatter plot kmeans" width="50%"></span></p>
+<p><span class="image"><img src="./img/underdogClusterKmeans.png" alt="scatter 
plot kmeans" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>We can go and change our clustering algorithm, e.g. 
<code>ml.clustering.agglomerative(data, nClusters: 3)</code>,
@@ -444,7 +444,7 @@ in which case the cluster allocation counts will look like 
this:</p>
 <p>And the scatter plot looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/underdogClustersAgglomerative.png" 
alt="scatter plot agglomerative" width="50%"></span></p>
+<p><span class="image"><img src="./img/underdogClustersAgglomerative.png" 
alt="scatter plot agglomerative" width="50%"></span></p>
 </div>
 </div>
 </div>
@@ -555,7 +555,7 @@ are some differences too.
 <p>The output looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/matrixAberlourRadar.png" 
alt="aberlour profile" width="50%"></span></p>
+<p><span class="image"><img src="./img/matrixAberlourRadar.png" alt="aberlour 
profile" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>The same chart also works to display all selected whiskies:</p>
@@ -570,7 +570,7 @@ new 
SwingWrapper(rc.exportSwing().chart).displayChart()</code></pre>
 <p>Which looks like this:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/matrixWhiskySelectionsRadar.png" 
alt="selected whisky profiles" width="50%"></span></p>
+<p><span class="image"><img src="./img/matrixWhiskySelectionsRadar.png" 
alt="selected whisky profiles" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s now cluster our whiskies. We&#8217;ll use the K-Means 
functionality from
@@ -701,7 +701,7 @@ new 
SwingWrapper(sc.exportSwing().chart).displayChart()</code></pre>
 <p>When run, we get the following output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/matrixWhiskyScatterPlot.png" 
alt="scatter plot" width="50%"></span></p>
+<p><span class="image"><img src="./img/matrixWhiskyScatterPlot.png" 
alt="scatter plot" width="50%"></span></p>
 </div>
 <div class="paragraph">
 <p>Matrix doesn&#8217;t have a correlation heatmap plot out of the box, but it 
does have heatmap plots,
@@ -728,7 +728,7 @@ def hc = HeatmapChart.create(corrMatrix)
 <p>Which has this output:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/matrixWhiskyCorrHeatmap.png" 
alt="heatmap" width="50%"></span></p>
+<p><span class="image"><img src="./img/matrixWhiskyCorrHeatmap.png" 
alt="heatmap" width="50%"></span></p>
 </div>
 </div>
 </div>
diff --git a/blog/zipping-collections-with-groovy.html 
b/blog/zipping-collections-with-groovy.html
index bec8ee5..1b08932 100644
--- a/blog/zipping-collections-with-groovy.html
+++ b/blog/zipping-collections-with-groovy.html
@@ -98,7 +98,7 @@
 <p>We&#8217;ll use an example inspired by this <a 
href="https://twitter.com/TheDonRaab";>Donald Raab</a> <a 
href="https://donraab.medium.com/make-or-append-me-a-string-c654f247373a";>blog 
post</a>. It looks at zipping (and formatting) lists of strings containing 
"fall"-inspired emoji. Yes, it&#8217;s late spring for the southern hemisphere 
who also mostly call fall "autumn", but hopefully everyone will appreciate the 
inspiration.</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/fall_emojis.png" alt="some fall 
inspired emojis" width="741"></span></p>
+<p><span class="image"><img src="./img/fall_emojis.png" alt="some fall 
inspired emojis" width="741"></span></p>
 </div>
 <hr>
 </div>
@@ -110,7 +110,7 @@
 <p>Groovy uses the <code>transpose</code> method for zipping:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsGroovy.png" 
alt="zipping example with Groovy"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsGroovy.png" 
alt="zipping example with Groovy"></span></p>
 </div>
 </div>
 </div>
@@ -121,7 +121,7 @@
 <p>Eclipse Collections has a <code>zip</code> method on its list classes:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsEC.png" 
alt="zipping example with Eclipse Collections"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsEC.png" alt="zipping 
example with Eclipse Collections"></span></p>
 </div>
 </div>
 </div>
@@ -132,7 +132,7 @@
 <p>Guava has a streams utility class with a <code>zip</code> method:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsGuava.png" 
alt="zipping example with Guava"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsGuava.png" 
alt="zipping example with Guava"></span></p>
 </div>
 </div>
 </div>
@@ -143,7 +143,7 @@
 <p>StreamEx provides an enhanced stream library which supports 
<code>zipWith</code>:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsStreamEx.png" 
alt="zipping example with StreamEx"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsStreamEx.png" 
alt="zipping example with StreamEx"></span></p>
 </div>
 </div>
 </div>
@@ -154,7 +154,7 @@
 <p>Vavr has a <code>zipWith</code> method on its list class:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsVavr.png" 
alt="zipping example with Vavr"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsVavr.png" 
alt="zipping example with Vavr"></span></p>
 </div>
 </div>
 </div>
@@ -165,7 +165,7 @@
 <p>jOOλ has a <code>zip</code> method for its sequences:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsJool.png" 
alt="zipping example with jOOλ"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsJool.png" 
alt="zipping example with jOOλ"></span></p>
 </div>
 </div>
 </div>
@@ -176,7 +176,7 @@
 <p>If you are a fan of query-like DSLs, Groovy&#8217;s language integrated 
query, GQuery (AKA GINQ), can also be used:</p>
 </div>
 <div class="paragraph">
-<p><span class="image"><img src="img/img/ZippingCollectionsGQ.png" 
alt="zipping example with GQuery"></span></p>
+<p><span class="image"><img src="./img/ZippingCollectionsGQ.png" alt="zipping 
example with GQuery"></span></p>
 </div>
 <div class="paragraph">
 <p>This uses a special <code>_rn</code> "row number" pre-defined variable in 
GQ expressions. It follows the same strategy as the IntStream "workaround" for 
Java mentioned in this <a 
href="https://www.baeldung.com/java-collections-zip";>blog</a>.</p>


Reply via email to