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&crop=smart&auto=webp&v=enabled&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&crop=smart&auto=webp&v=enabled&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’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’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’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’s
smaller islands.</p>
@@ -330,7 +330,7 @@ Being that far East of the mainland, it’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™ 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’s just look at the Deep Learning examples.
We’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’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’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’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’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,
& 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’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’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’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’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’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’t crucial. But larger datasets
would be split up in the
so we’ll look at how we’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’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’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’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’t steal Jeremy’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’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™</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&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. 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’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 → Create new file"></span></p>
+<p><span class="image"><img src="./img/blog_add_file_github.png" alt="Clicking
Add file → 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’t too long. Here we picked
@@ -173,7 +173,7 @@ Some of the tooling doesn’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’ll guide you through any changes if needed once
the PR is submitted.</p
<p>When finished, click on "Commit changes…​":</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’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&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’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’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’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
->
<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’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’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’m glad you asked. Let’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’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’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’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’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’ll look at is <a
href="https://orientdb.org/">OrientDB</a>.
@@ -1069,7 +1069,7 @@ We’ll examine them next when we look at
ArcadeDB.</p>
<p>Now, we’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’t elaborate
further on that aspect.
<p>Here is some of Donald’s creative writing:</p>
</div>
<div class="paragraph">
-<p><span class="image"><img src="img/img/DonaldRaabHaikus.png" alt="text of
Donald Raab’s haikus"></span></p>
+<p><span class="image"><img src="./img/DonaldRaabHaikus.png" alt="text of
Donald Raab’s haikus"></span></p>
</div>
<div class="paragraph">
<p>In his examples, he processes those examples in various ways. We’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’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 -> "$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™ 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’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’ll
We’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’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 & 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’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’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’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’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’ve also had some great contributions from Sandip Chitale for
Groovy’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→Inspect Last</code> or <code>Script→Inspect
Variables</code> menu items. It’s also hooked into the AST Browser if
you’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’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™, 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’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’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’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’t used NetBeans with Groovy before, you
might need to enable
to Groovy plugin. Select <code>Tools → Plugins → 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 → New
Project…​ → 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 → Plugins
→ 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’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’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™</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> 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’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’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’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’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’s try some combinations. We’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{…​}</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’ll use the same emoji sets from Donald’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’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™, 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’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’ll swap to use Spock’s data-driven feature and include an
additional testcase:</p>
@@ -156,7 +156,7 @@ hasn’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’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’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’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’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’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<String> names, List<Closure>
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’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’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’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’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’s
feature set. Ignite can b
</div>
<div class="paragraph">
<p>It is mostly this last capability that we will use. Ignite’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’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’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’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’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’s now cluster our whiskies. We’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’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’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’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’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>