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

git-site-role 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 eb185b6  2023/02/16 22:51:46: Generated dev website from 
groovy-website@9c56e6c
eb185b6 is described below

commit eb185b643344b8c3549e3c054538d2933da06339
Author: jenkins <[email protected]>
AuthorDate: Thu Feb 16 22:51:46 2023 +0000

    2023/02/16 22:51:46: Generated dev website from groovy-website@9c56e6c
---
 blog/apache-groovy-2022-year-in.html             | 112 +++-
 blog/apache-groovy-committer-graeme-rocher.html  |   7 +-
 blog/classifying-iris-flowers-with-deep.html     |  16 +-
 blog/comparators-and-sorting-in-groovy.html      |   2 +-
 blog/deck-of-cards-with-groovy.html              |   2 +-
 blog/deep-learning-and-eclipse-collections.html  |   2 +-
 blog/detecting-objects-with-groovy-the.html      |   2 +-
 blog/feed.atom                                   |  12 +-
 blog/fruity-eclipse-collections.html             |   2 +-
 blog/fun-with-obfuscated-groovy.html             |   2 +-
 blog/gmavenplus-1-6-2-released.html              |   2 +-
 blog/groovy-2-4-16-released.html                 |   2 +-
 blog/groovy-2-4-16-windows.html                  |   2 +-
 blog/groovy-2-4-17-released.html                 |   2 +-
 blog/groovy-2-5-1-released.html                  |   2 +-
 blog/groovy-2-5-2-released.html                  |   2 +-
 blog/groovy-2-5-2-windows.html                   |   2 +-
 blog/groovy-2-5-3-released.html                  |   2 +-
 blog/groovy-2-5-3-windows.html                   |   2 +-
 blog/groovy-2-5-4-released.html                  |   2 +-
 blog/groovy-2-5-4-windows.html                   |   2 +-
 blog/groovy-2-5-5-released.html                  |   2 +-
 blog/groovy-2-5-5-windows.html                   |   2 +-
 blog/groovy-2-5-6-released.html                  |   2 +-
 blog/groovy-2-5-7-and.html                       |   2 +-
 blog/groovy-2-5-7-released.html                  |   2 +-
 blog/groovy-3-0-0-alpha.html                     |   2 +-
 blog/groovy-3-0-0-alpha1.html                    |   2 +-
 blog/groovy-3-0-0-beta.html                      |   2 +-
 blog/groovy-3-0-0-beta1.html                     |   2 +-
 blog/groovy-3-0-0-beta2.html                     |   2 +-
 blog/groovy-4-0-3-released.html                  |   2 +-
 blog/groovy-list-processing-cheat-sheet.html     |   2 +-
 blog/groovy-release-train-4-0.html               |   2 +-
 blog/img/ImperfectPuzzle.jpg                     | Bin 0 -> 86901 bytes
 blog/img/MathUtilJacocoReport.png                | Bin 0 -> 10621 bytes
 blog/img/MathUtilJacocoReport2.png               | Bin 0 -> 11482 bytes
 blog/img/MathUtilJacocoReport3.png               | Bin 0 -> 10429 bytes
 blog/img/MathUtilSpecResult.png                  | Bin 0 -> 22751 bytes
 blog/img/MathUtilSpecResult2.png                 | Bin 0 -> 43916 bytes
 blog/img/MathUtilSpecResultFailedAssertion.png   | Bin 0 -> 14519 bytes
 blog/img/PitestCoverage2.png                     | Bin 0 -> 42968 bytes
 blog/img/PitestCoverageReport.png                | Bin 0 -> 27683 bytes
 blog/img/PitestMathUtilCoverage.png              | Bin 0 -> 50761 bytes
 blog/img/apachecon_collage_2022.jpg              | Bin 0 -> 1666465 bytes
 blog/img/groovy4_release_tweet.png               | Bin 0 -> 26601 bytes
 blog/img/spock_logo.png                          | Bin 0 -> 135150 bytes
 blog/index.html                                  |   4 +-
 blog/matrix-calculations-with-groovy-apache.html |   2 +-
 blog/parsing-json-with-groovy.html               |   2 +-
 blog/reading-and-writing-csv-files.html          |   2 +-
 blog/testing-your-java-with-groovy.html          | 713 +++++++++++++++++++++++
 blog/using-groovy-with-apache-wayang.html        |   2 +-
 blog/whiskey-clustering-with-groovy-and.html     |   4 +-
 blog/wordle-checker.html                         |   2 +-
 blog/zipping-collections-with-groovy.html        |   2 +-
 css/style.css                                    |   2 +-
 57 files changed, 866 insertions(+), 76 deletions(-)

diff --git a/blog/apache-groovy-2022-year-in.html 
b/blog/apache-groovy-2022-year-in.html
index f12d98d..06faf35 100644
--- a/blog/apache-groovy-2022-year-in.html
+++ b/blog/apache-groovy-2022-year-in.html
@@ -53,39 +53,103 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Apache Groovy 2022 Year In Review</a></li></ul></div><div 
class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>Apache Groovy 2022 Year In 
Review</h1><p><span>Author: <i>Paul King</i></span><br/><span>Published: 
2022-12-29 02:28PM</span></p><hr/><div class="paragraph">
-<p>The year 2022 has been a reasonably good one for the Groovy Programming 
Language. Here are just a few of the highlights.</p>
-</div>
-<div class="paragraph">
-<p>The latest release of Groovy 4 is 4.0.7 which includes over 300 
improvements and bug fixes since 4.0.0.
-For more details about Groovy 4, you can read the <a 
href="https://groovy-lang.org/releasenotes/groovy-4.0.html";>release notes</a>.
-There have also been bug fix releases for earlier Groovy versions.
-For our main branch of our main source code repo, there were 820 commits from 
28 contributors.
-This is the branch which corresponds to Groovy 5 but many fixes were also 
back-ported to earlier Groovy versions.
-Just on Groovy 5, we expect to have alpha versions available for review in the 
first quarter of 2023.
-Also, while discussing commit counts, we should note that <a 
href="https://github.com/eric-milles";>Eric Milles</a>
-became the 5th person to overtake James Strachan (the original founder of 
Groovy) in numbers of commits to the project.
+                        </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'>Apache Groovy 2022 Year In Review</a></li><li><a 
href='#_releases_contributions' class='anchor-link'>Releases &amp; 
Contributions</a></li><li><a href='#_downloads' 
class='anchor-link'>Downloads</a></li><li><a href='#_blogs' 
class='anchor-link'>Blogs</a></li><li><a href='#_ [...]
+<div class="sectionbody">
+<div class="paragraph">
+<p>The year 2022 has been a reasonably good one for the Groovy Programming 
Language.
+Here are just a few of the highlights.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_releases_contributions">Releases &amp; Contributions</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<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/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
+and bug fixes since 4.0.0. For more details about Groovy 4, you can read the
+<a href="https://groovy-lang.org/releasenotes/groovy-4.0.html";>release 
notes</a>.
+There have also been bug fix releases for earlier Groovy versions.</p>
+</div>
+<div class="paragraph">
+<p>For our main branch of our main source code repo, there were 820 commits 
from 28
+contributors. This is the branch which corresponds to Groovy 5 but many fixes
+were also back-ported to earlier Groovy versions.</p>
+</div>
+<div class="paragraph">
+<p>Just on Groovy 5, we expect to have alpha versions available for review in 
the
+first quarter of 2023. Also, while discussing commit counts, we should note 
that
+<a href="https://github.com/eric-milles";>Eric Milles</a> became the 5th person 
to overtake James
+Strachan (the original founder of Groovy) in numbers of commits to the project.
 Congrats Eric!</p>
 </div>
 <div class="paragraph">
-<p>There were also many contributions outside those code commits. <em>We thank 
all those involved in contributing to or promoting Groovy in 2022</em>!</p>
+<p>There were also many contributions outside those code commits.
+<em>We thank all those involved in contributing to or promoting Groovy in 
2022</em>!</p>
+</div>
 </div>
+</div>
+<div class="sect1">
+<h2 id="_downloads">Downloads</h2>
+<div class="sectionbody">
 <div class="paragraph">
-<p>In early 2021, Groovy surpassed the 1 billion artifacts downloaded mark. 
This is downloads of artifacts from repositories
-like Maven Central and (at least until recently) Bintray. We now only collect 
stats from Maven Central.
-We don&#8217;t collect stats on downloads of the zip releases nor attempt to 
account for the many downloads where
-Groovy is bundled within other products, so the stats are no doubt much higher.
-Well, the good news is that the rate of downloads is still increasing, so 
interest in Groovy remains high.
+<p>In early 2021, Groovy surpassed the 1 billion artifacts downloaded mark.
+This is downloads of artifacts from repositories like Maven Central and
+(at least until recently) Bintray. We now only collect stats from Maven 
Central.
+We don&#8217;t collect stats on downloads of the zip releases nor attempt to 
account
+for the many downloads where Groovy is bundled within other products, so
+the stats are no doubt much higher. Well, the good news is that the rate of
+downloads is still increasing, so interest in Groovy remains high.
 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>!
-<span class="image"><img src="img/downloads_until_2022.png" alt="Groovy 
download stats"></span></p>
+<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>We also started increasing the number of posts in the <a 
href="https://groovy.apache.org/blog";>Groovy project blog</a>.
-There were nearly 30 posts for you to peruse from this year. We try to show 
off Groovy features and also have some fun.
-<span class="image"><img src="img/blog_collage_2022.jpg" alt="collage of blog 
post images"></span>
-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
+<p><span class="image"><img src="img/downloads_until_2022.png" alt="Groovy 
download stats"></span></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_blogs">Blogs</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We also started increasing the number of posts in the
+<a href="https://groovy.apache.org/blog";>Groovy project blog</a>.
+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/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
 the <a href="https://www.javaadvent.com/";>JVM Advent</a> folks. It summarises 
a handful of the above-mentioned blog posts.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_apachecon">ApacheCon</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Several folks from the project and many friends of Groovy participated in 
the sold out
+ApacheCon conference in New Orleans in October. We thank the conference 
organisers,
+speakers and attendees for the wonderful conference.</p>
+</div>
+<div class="paragraph">
+<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>
+</div>
+<div class="paragraph">
+<p>Social media: <a href="https://twitter.com/ApacheGroovy";>@ApacheGroovy</a>
+<a href="https://fosstodon.org/@ApacheGroovy";>@<a 
href="mailto:[email protected]";>[email protected]</a></a></p>
+</div>
+</div>
 </div></div></div></div></div><footer id='footer'>
                             <div class='row'>
                                 <div class='colset-3-footer'>
diff --git a/blog/apache-groovy-committer-graeme-rocher.html 
b/blog/apache-groovy-committer-graeme-rocher.html
index 326bd0b..8709e14 100644
--- a/blog/apache-groovy-committer-graeme-rocher.html
+++ b/blog/apache-groovy-committer-graeme-rocher.html
@@ -54,10 +54,13 @@
                                 </div>
                             </div>
                         </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'>Apache Groovy committer Graeme Rocher receives Oracle Groundbreaker 
award</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a 
name='doc'></a><h1>Apache Groovy committer Graeme Rocher receives Oracle 
Groundbreaker award</h1><p><span>Author: <i>Paul King</i></span><br/ [...]
-<p>The <a href="http://groovy.apache.org/";>Apache Groovy</a> team 
congratulates long-time Groovy committer Graeme Rocher on receiving his 
Groundbreaker award at Oracle Code One.</p>
+<p>The <a href="http://groovy.apache.org/";>Apache Groovy</a> team 
congratulates long-time Groovy committer
+Graeme Rocher on receiving his Groundbreaker award at Oracle Code One.</p>
 </div>
 <div class="paragraph">
-<p>Graeme has made numerous significant contributions to Apache Groovy and has 
also founded two of the most important frameworks using Groovy: <a 
href="https://grails.org/";>Grails</a> and <a 
href="http://micronaut.io/";>Micronaut</a>.</p>
+<p>Graeme has made numerous significant contributions to Apache Groovy and has 
also founded
+two of the most important frameworks using Groovy: <a 
href="https://grails.org/";>Grails</a> and
+<a href="http://micronaut.io/";>Micronaut</a>.</p>
 </div>
 <div class="paragraph">
 <p><span class="image"><img 
src="https://pbs.twimg.com/media/DqPOTAPU0AAK_5d.jpg"; alt="Graeme receiving the 
award" width="800" height="600"></span></p>
diff --git a/blog/classifying-iris-flowers-with-deep.html 
b/blog/classifying-iris-flowers-with-deep.html
index 1bc3603..849d920 100644
--- a/blog/classifying-iris-flowers-with-deep.html
+++ b/blog/classifying-iris-flowers-with-deep.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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 DeepLe [...]
+                        </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 DeepLe [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
@@ -175,7 +175,7 @@ println "Validation error: " + 
pretty(calculateRegressionError(bestMethod, model
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_encog$ time groovy -cp 
"build/lib/*" IrisEncog.groovy
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ time groovy -cp "build/lib/*" 
IrisEncog.groovy
 1/5 : Fold #1
 1/5 : Fold #1/5: Iteration #1, Training Error: 1.43550735, Validation Error: 
0.73302237
 1/5 : Fold #1/5: Iteration #2, Training Error: 0.78845427, Validation Error: 
0.73302237
@@ -254,7 +254,7 @@ println eval.stats()</code></pre>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_dl4j$ time groovy -cp 
"build/lib/*" IrisDl4j.groovy
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ time groovy -cp "build/lib/*" 
IrisDl4j.groovy
 [main] INFO org.nd4j.linalg.factory.Nd4jBackend - Loaded [CpuBackend] backend
 [main] INFO org.nd4j.nativeblas.NativeOpsHolder - Number of threads used for 
linear algebra: 4
 [main] INFO org.nd4j.nativeblas.Nd4jBlas - Number of threads used for OpenMP 
BLAS: 4
@@ -271,7 +271,7 @@ println eval.stats()</code></pre>
  Precision:       0.9778
  Recall:          0.9744
  F1 Score:        0.9752
-Precision, recall &amp; F1: macro-averaged (equally weighted avg. of 3 classes)
+Precision, recall & F1: macro-averaged (equally weighted avg. of 3 classes)
 
 =========================Confusion Matrix=========================
   0  1  2
@@ -358,7 +358,7 @@ new ClassifierEvaluator().with {
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_graalvm$ time groovy -cp 
"build/lib/*" Iris.groovy
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ time groovy -cp "build/lib/*" 
Iris.groovy
 16:49:27.089 [main] INFO deepnetts.core.DeepNetts - 
------------------------------------------------------------------------
 16:49:27.091 [main] INFO deepnetts.core.DeepNetts - TRAINING NEURAL NETWORK
 16:49:27.091 [main] INFO deepnetts.core.DeepNetts - 
------------------------------------------------------------------------
@@ -413,7 +413,7 @@ We&#8217;ll compile it up using static mode:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_graalvm$ groovyc -cp 
"build/lib/*" --compile-static Iris.groovy</code></pre>
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ groovyc -cp "build/lib/*" 
--compile-static Iris.groovy</code></pre>
 </div>
 </div>
 <div class="paragraph">
@@ -421,7 +421,7 @@ We&#8217;ll compile it up using static mode:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_graalvm$ native-image  
--report-unsupported-elements-at-runtime \
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ native-image  
--report-unsupported-elements-at-runtime \
    
--initialize-at-run-time=groovy.grape.GrapeIvy,deepnetts.net.weights.RandomWeights
 \
    --initialize-at-build-time --no-fallback  
-H:ConfigurationFileDirectories=conf/  -cp ".:build/lib/*" Iris</code></pre>
 </div>
@@ -436,7 +436,7 @@ We also did the same for the <code>RandomWeights</code> 
class to avoid it being
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="prettyprint highlight"><code 
data-lang="shell">paulk@pop-os:/extra/projects/iris_graalvm$ time ./iris
+<pre class="prettyprint highlight"><code><strong 
class="lime">paulk@pop-os</strong>:<strong 
class="blue">/extra/projects/iris_encog</strong>$ time ./iris
 ...
 CLASSIFIER EVALUATION METRICS
 Accuracy: 0.93460923 (How often is classifier correct in total)
diff --git a/blog/comparators-and-sorting-in-groovy.html 
b/blog/comparators-and-sorting-in-groovy.html
index 7740d90..a30e9dd 100644
--- a/blog/comparators-and-sorting-in-groovy.html
+++ b/blog/comparators-and-sorting-in-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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='#_mixing_i 
[...]
+                        </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='#_mixing_i 
[...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/cher_record.png" alt="Cher" 
width="179" height="179"></span>
diff --git a/blog/deck-of-cards-with-groovy.html 
b/blog/deck-of-cards-with-groovy.html
index 540a31d..3813075 100644
--- a/blog/deck-of-cards-with-groovy.html
+++ b/blog/deck-of-cards-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Deck of cards with Groovy, JDK collections and Eclipse 
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./deep-learning-and-eclipse-collections'>Deep Learning and E [...]
+                        </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'>Deck of cards with Groovy, JDK collections and Eclipse 
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./deep-learning-and-eclipse-collections'>Deep Learning and E [...]
 <p>Once again, <a href="https://twitter.com/TheDonRaab";>Donald Raab</a> has 
produced an interesting
 <a 
href="https://donraab.medium.com/how-to-create-a-deck-of-cards-using-eclipse-collections-d9838ac430b7";>blog
 post</a> on
 <a href="https://github.com/eclipse/eclipse-collections";>Eclipse 
Collections</a> this one shows some code for modelling and manipulating cards 
with Java 17 and Eclipse Collections. His related katas are highly recommended.
diff --git a/blog/deep-learning-and-eclipse-collections.html 
b/blog/deep-learning-and-eclipse-collections.html
index 0b6e3c1..f85416d 100644
--- a/blog/deep-learning-and-eclipse-collections.html
+++ b/blog/deep-learning-and-eclipse-collections.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Deep Learning and Eclipse Collections</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./deck-of-cards-with-groovy'>Deck of cards with Groovy, JDK collections 
and Eclipse Colle [...]
+                        </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'>Deep Learning and Eclipse Collections</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./deck-of-cards-with-groovy'>Deck of cards with Groovy, JDK collections 
and Eclipse Colle [...]
 <p>In previous blogs, we&#8217;ve covered
 <a href="https://groovy.apache.org/blog/deck-of-cards-with-groovy";>Eclipse 
Collections</a> and
 <a 
href="https://groovy.apache.org/blog/detecting-objects-with-groovy-the";>Deep 
Learning</a>.
diff --git a/blog/detecting-objects-with-groovy-the.html 
b/blog/detecting-objects-with-groovy-the.html
index f330f62..eb75908 100644
--- a/blog/detecting-objects-with-groovy-the.html
+++ b/blog/detecting-objects-with-groovy-the.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Detecting objects with Groovy, the Deep Java Library (DJL), and 
Apache MXNet</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_deep_java_library_djl_apache_mxnet' 
class='anchor-link'>Deep Java Library (DJL) &amp; Apache MXNet</a [...]
+                        </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'>Detecting objects with Groovy, the Deep Java Library (DJL), and 
Apache MXNet</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_deep_java_library_djl_apache_mxnet' 
class='anchor-link'>Deep Java Library (DJL) &amp; Apache MXNet</a [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog posts looks at using <a href="https://groovy-lang.org/";>Apache 
Groovy</a> with the
diff --git a/blog/feed.atom b/blog/feed.atom
index eb945c7..18278ff 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -280,7 +280,7 @@
     </author>
     <title>Classifying Iris Flowers with Deep Learning, Groovy and 
GraalVM</title>
     <link 
href="http://groovy.apache.org/blog/classifying-iris-flowers-with-deep"/>
-    <updated>2022-06-25T10:52:59+00:00</updated>
+    <updated>2022-06-27T11:16:59+00:00</updated>
     <published>2022-06-25T10:52:59+00:00</published>
     <summary>This post looks at classifying Iris flowers using traditional and 
neural net based approaches using Eclipse DeepLearning4j, Encog, Deep Netts and 
GraalVM.</summary>
   </entry>
@@ -294,6 +294,16 @@
     <published>2022-07-10T14:00:51+00:00</published>
     <summary>This post looks at parsing JSON using Groovy's in-built 
capabilities as well as some other libraries.</summary>
   </entry>
+  <entry>
+    <author>
+      <name>Paul King</name>
+    </author>
+    <title>Testing your Java with Groovy, Spock, JUnit5, Jacoco, Jqwik and 
Pitest</title>
+    <link href="http://groovy.apache.org/blog/testing-your-java-with-groovy"/>
+    <updated>2022-07-15T08:26:15+00:00</updated>
+    <published>2022-07-15T08:26:15+00:00</published>
+    <summary>This post looks at testing Java using Groovy, Spock, JUnit5, 
Jacoco, Jqwik and Pitest</summary>
+  </entry>
   <entry>
     <author>
       <name>Paul King</name>
diff --git a/blog/fruity-eclipse-collections.html 
b/blog/fruity-eclipse-collections.html
index b5b7315..1e7febc 100644
--- a/blog/fruity-eclipse-collections.html
+++ b/blog/fruity-eclipse-collections.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Fruity Eclipse Collections</a></li><li><a 
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse 
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors' 
class='anchor-link'>Exploring emoji colors</a></li><li><a 
href='#_putting_it_all_together'  [...]
+                        </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'>Fruity Eclipse Collections</a></li><li><a 
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse 
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors' 
class='anchor-link'>Exploring emoji colors</a></li><li><a 
href='#_putting_it_all_together'  [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog post continues on the theme of using fruit emoji from the
diff --git a/blog/fun-with-obfuscated-groovy.html 
b/blog/fun-with-obfuscated-groovy.html
index f042f90..c438d18 100644
--- a/blog/fun-with-obfuscated-groovy.html
+++ b/blog/fun-with-obfuscated-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Fun with obfuscated Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./matrix-calculations-with-groovy-apache'>Matrix calculations with 
Groovy, Apache Commons Math, ojAl [...]
+                        </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'>Fun with obfuscated Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./matrix-calculations-with-groovy-apache'>Matrix calculations with 
Groovy, Apache Commons Math, ojAl [...]
 <p>An interesting tweet appeared in my feed this morning:</p>
 </div>
 <div class="paragraph">
diff --git a/blog/gmavenplus-1-6-2-released.html 
b/blog/gmavenplus-1-6-2-released.html
index 42e661b..f47684f 100644
--- a/blog/gmavenplus-1-6-2-released.html
+++ b/blog/gmavenplus-1-6-2-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>GMavenPlus 1.6.2 Released (Community Artifact)</a></li><li><a 
href='#_gmavenplus_1_6_2_has_been_released' class='anchor-link'>GMavenPlus 
1.6.2 has been released.</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Rel [...]
+                        </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'>GMavenPlus 1.6.2 Released (Community Artifact)</a></li><li><a 
href='#_gmavenplus_1_6_2_has_been_released' class='anchor-link'>GMavenPlus 
1.6.2 has been released.</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Rel [...]
 <h2 id="_gmavenplus_1_6_2_has_been_released">GMavenPlus 1.6.2 has been 
released.</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/groovy-2-4-16-released.html b/blog/groovy-2-4-16-released.html
index f6bfbe5..f9caca9 100644
--- a/blog/groovy-2-4-16-released.html
+++ b/blog/groovy-2-4-16-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.4.16 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
+                        </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'>Groovy 2.4.16 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-4-16-windows.html b/blog/groovy-2-4-16-windows.html
index 054ea2f..098c036 100644
--- a/blog/groovy-2-4-16-windows.html
+++ b/blog/groovy-2-4-16-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.4.16 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a h [...]
+                        </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'>Groovy 2.4.16 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a h [...]
 <p>The Windows installer for Groovy 2.4.16 (community artifact) is available 
from: <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.4.16-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.4.16-installer</a>.</p>
 </div></div></div></div></div><footer id='footer'>
                             <div class='row'>
diff --git a/blog/groovy-2-4-17-released.html b/blog/groovy-2-4-17-released.html
index bc88e62..822a40e 100644
--- a/blog/groovy-2-4-17-released.html
+++ b/blog/groovy-2-4-17-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.4.17 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
+                        </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'>Groovy 2.4.17 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2. [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-1-released.html b/blog/groovy-2-5-1-released.html
index 21561fb..728ed69 100644
--- a/blog/groovy-2-5-1-released.html
+++ b/blog/groovy-2-5-1-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-2-released.html b/blog/groovy-2-5-2-released.html
index ef04de8..7ecdce0 100644
--- a/blog/groovy-2-5-2-released.html
+++ b/blog/groovy-2-5-2-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.2 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.2 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-2-windows.html b/blog/groovy-2-5-2-windows.html
index 8c6896d..0db754b 100644
--- a/blog/groovy-2-5-2-windows.html
+++ b/blog/groovy-2-5-2-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.2 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installe [...]
+                        </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'>Groovy 2.5.2 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.2 (community artifact) is available 
from:
 <a 
href="https://dl.bintray.com/groovy/Distributions/groovy-2.5.2-installer.exe"; 
class="bare">https://dl.bintray.com/groovy/Distributions/groovy-2.5.2-installer.exe</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-3-released.html b/blog/groovy-2-5-3-released.html
index 003d3a3..32941f0 100644
--- a/blog/groovy-2-5-3-released.html
+++ b/blog/groovy-2-5-3-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-3-windows'>Groovy 2.5.3 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-3-windows'>Groovy 2.5.3 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-3-windows.html b/blog/groovy-2-5-3-windows.html
index c5914a2..50a9c89 100644
--- a/blog/groovy-2-5-3-windows.html
+++ b/blog/groovy-2-5-3-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.3 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
+                        </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'>Groovy 2.5.3 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.3 (community artifact) is available 
from:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.3-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.3-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-4-released.html b/blog/groovy-2-5-4-released.html
index f6a77b2..169e6f6 100644
--- a/blog/groovy-2-5-4-released.html
+++ b/blog/groovy-2-5-4-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.4 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.4 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-4-windows.html b/blog/groovy-2-5-4-windows.html
index 5774383..245ae7d 100644
--- a/blog/groovy-2-5-4-windows.html
+++ b/blog/groovy-2-5-4-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
+                        </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'>Groovy 2.5.4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.4 (community artifact) is available 
from:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.4-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.4-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-5-released.html b/blog/groovy-2-5-5-released.html
index c6e6170..b6a3785 100644
--- a/blog/groovy-2-5-5-released.html
+++ b/blog/groovy-2-5-5-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.5 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.5 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-5-windows.html b/blog/groovy-2-5-5-windows.html
index 0af3d0a..68a2090 100644
--- a/blog/groovy-2-5-5-windows.html
+++ b/blog/groovy-2-5-5-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.5 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
+                        </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'>Groovy 2.5.5 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-released'>Groovy 2.5.5 released</a></li><li><a href [...]
 <p>The Windows installer for Groovy 2.5.5 (community artifact) is available at:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-6-released.html b/blog/groovy-2-5-6-released.html
index 2d8362f..1010317 100644
--- a/blog/groovy-2-5-6-released.html
+++ b/blog/groovy-2-5-6-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-7-and.html b/blog/groovy-2-5-7-and.html
index 15c91c4..25e43fc 100644
--- a/blog/groovy-2-5-7-and.html
+++ b/blog/groovy-2-5-7-and.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released 
(Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows In 
[...]
+                        </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'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released 
(Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released< 
[...]
 <p>The Windows installer for Groovy 2.5.7 (Community Artifact) is now 
available from Bintray:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer</a>.</p>
 </div>
diff --git a/blog/groovy-2-5-7-released.html b/blog/groovy-2-5-7-released.html
index 9629de0..caac668 100644
--- a/blog/groovy-2-5-7-released.html
+++ b/blog/groovy-2-5-7-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 
Windows Installers Released (Community Artifacts)</a></ [...]
+                        </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'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 
Windows Installers Released (Community Artifacts)</a></ [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-alpha.html b/blog/groovy-3-0-0-alpha.html
index ce0a9fc..79b7296 100644
--- a/blog/groovy-3-0-0-alpha.html
+++ b/blog/groovy-3-0-0-alpha.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 3.0.0-alpha-4 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha1'>Groovy 
3.0.0-alpha-4 Windows Installer Released (Community Artifact)</a></ [...]
+                        </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'>Groovy 3.0.0-alpha-4 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha1'>Groovy 
3.0.0-alpha-4 Windows Installer Released (Community Artifact)</a></ [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-alpha1.html b/blog/groovy-3-0-0-alpha1.html
index f791df8..be9d7a5 100644
--- a/blog/groovy-3-0-0-alpha1.html
+++ b/blog/groovy-3-0-0-alpha1.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 3.0.0-alpha-4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></l [...]
+                        </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'>Groovy 3.0.0-alpha-4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></l [...]
 <p>The Windows installer for Groovy 3.0.0-alpha-4 (Community Artifact) is 
available from the usual place:
 <a 
href="https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-alpha-4-installer.exe";
 
class="bare">https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-alpha-4-installer.exe</a></p>
 </div>
diff --git a/blog/groovy-3-0-0-beta.html b/blog/groovy-3-0-0-beta.html
index b1cd7eb..58e141d 100644
--- a/blog/groovy-3-0-0-beta.html
+++ b/blog/groovy-3-0-0-beta.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 
3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-beta1'>Gro [...]
+                        </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'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 
3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-beta2'>Gro [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-beta1.html b/blog/groovy-3-0-0-beta1.html
index eb57fdc..db26cbe 100644
--- a/blog/groovy-3-0-0-beta1.html
+++ b/blog/groovy-3-0-0-beta1.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 3.0.0-beta-2 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-beta2'>Groovy 
3.0.0-beta-2 Windows Installer Released (Community Release)</a></li>< [...]
+                        </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'>Groovy 3.0.0-beta-2 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-beta2'>Groovy 
3.0.0-beta-2 Windows Installer Released (Community Release)</a></li>< [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-beta2.html b/blog/groovy-3-0-0-beta2.html
index 8d7df3b..4d020f6 100644
--- a/blog/groovy-3-0-0-beta2.html
+++ b/blog/groovy-3-0-0-beta2.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 3.0.0-beta-2 Windows Installer Released (Community 
Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-beta1'>Groovy 3.0.0-beta-2 Released</a></li>< [...]
+                        </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'>Groovy 3.0.0-beta-2 Windows Installer Released (Community 
Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha1'>Groovy 3.0.0-alpha-4 Windows Installe [...]
 <p>The Windows installer for Groovy 3.0.0-beta-2 is now available from Bintray:
 <a 
href="https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe";
 
class="bare">https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe</a></p>
 </div>
diff --git a/blog/groovy-4-0-3-released.html b/blog/groovy-4-0-3-released.html
index d912bc0..88dfd55 100644
--- a/blog/groovy-4-0-3-released.html
+++ b/blog/groovy-4-0-3-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </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'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-list-processing-cheat-sheet.html 
b/blog/groovy-list-processing-cheat-sheet.html
index 3a33fd8..a305876 100644
--- a/blog/groovy-list-processing-cheat-sheet.html
+++ b/blog/groovy-list-processing-cheat-sheet.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy List Processing Cheat Sheet</a></li><li><a 
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a 
href='#_list_elements_and_properties' class='anchor-link'>List elements and 
properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...]
+                        </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'>Groovy List Processing Cheat Sheet</a></li><li><a 
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a 
href='#_list_elements_and_properties' class='anchor-link'>List elements and 
properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...]
 <h2 id="_declaring_lists">Declaring lists</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/groovy-release-train-4-0.html 
b/blog/groovy-release-train-4-0.html
index 4f3dc7a..58ef3ee 100644
--- a/blog/groovy-release-train-4-0.html
+++ b/blog/groovy-release-train-4-0.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released 
(Community Artifact [...]
+                        </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'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a 
href='./groovy-2-5-5- [...]
 <p>It&#8217;s been a productive time for the Apache Groovy project recently. 
We recently released versions 4.0.4, 3.0.12 and 2.5.18 with 42, 21 and 15 fixes 
and improvements respectively. Two quick highlights for the 4.0.4 release 
before getting into more details about the release.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/img/ImperfectPuzzle.jpg b/blog/img/ImperfectPuzzle.jpg
new file mode 100644
index 0000000..ebdef10
Binary files /dev/null and b/blog/img/ImperfectPuzzle.jpg differ
diff --git a/blog/img/MathUtilJacocoReport.png 
b/blog/img/MathUtilJacocoReport.png
new file mode 100644
index 0000000..9328328
Binary files /dev/null and b/blog/img/MathUtilJacocoReport.png differ
diff --git a/blog/img/MathUtilJacocoReport2.png 
b/blog/img/MathUtilJacocoReport2.png
new file mode 100644
index 0000000..9d2b10b
Binary files /dev/null and b/blog/img/MathUtilJacocoReport2.png differ
diff --git a/blog/img/MathUtilJacocoReport3.png 
b/blog/img/MathUtilJacocoReport3.png
new file mode 100644
index 0000000..096907c
Binary files /dev/null and b/blog/img/MathUtilJacocoReport3.png differ
diff --git a/blog/img/MathUtilSpecResult.png b/blog/img/MathUtilSpecResult.png
new file mode 100644
index 0000000..6c99602
Binary files /dev/null and b/blog/img/MathUtilSpecResult.png differ
diff --git a/blog/img/MathUtilSpecResult2.png b/blog/img/MathUtilSpecResult2.png
new file mode 100644
index 0000000..d5efbb4
Binary files /dev/null and b/blog/img/MathUtilSpecResult2.png differ
diff --git a/blog/img/MathUtilSpecResultFailedAssertion.png 
b/blog/img/MathUtilSpecResultFailedAssertion.png
new file mode 100644
index 0000000..ac275ad
Binary files /dev/null and b/blog/img/MathUtilSpecResultFailedAssertion.png 
differ
diff --git a/blog/img/PitestCoverage2.png b/blog/img/PitestCoverage2.png
new file mode 100644
index 0000000..b94a4cd
Binary files /dev/null and b/blog/img/PitestCoverage2.png differ
diff --git a/blog/img/PitestCoverageReport.png 
b/blog/img/PitestCoverageReport.png
new file mode 100644
index 0000000..e1e3a44
Binary files /dev/null and b/blog/img/PitestCoverageReport.png differ
diff --git a/blog/img/PitestMathUtilCoverage.png 
b/blog/img/PitestMathUtilCoverage.png
new file mode 100644
index 0000000..d5d479c
Binary files /dev/null and b/blog/img/PitestMathUtilCoverage.png differ
diff --git a/blog/img/apachecon_collage_2022.jpg 
b/blog/img/apachecon_collage_2022.jpg
new file mode 100644
index 0000000..264d445
Binary files /dev/null and b/blog/img/apachecon_collage_2022.jpg differ
diff --git a/blog/img/groovy4_release_tweet.png 
b/blog/img/groovy4_release_tweet.png
new file mode 100644
index 0000000..df408d0
Binary files /dev/null and b/blog/img/groovy4_release_tweet.png differ
diff --git a/blog/img/spock_logo.png b/blog/img/spock_logo.png
new file mode 100644
index 0000000..fb5a4a6
Binary files /dev/null and b/blog/img/spock_logo.png differ
diff --git a/blog/index.html b/blog/index.html
index 5e44eb1..565d7eb 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul 
class='nav-sidebar list'><li class='active'><a 
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with 
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In 
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a 
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul 
class='nav-sidebar list'><li class='active'><a 
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with 
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In 
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a 
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
                             <div class='row'>
                                 <div class='colset-3-footer'>
                                     <div class='col-1'>
@@ -97,7 +97,7 @@
                     colors: am5.ColorSet.new(root, {})
                 }));
                 wc.data.setAll([
-                { category: "centroids", value: 1 }, { category: "data 
science", value: 7 }, { category: "groovy", value: 53 }, { category: "kmeans", 
value: 3 }, { category: "records", value: 5 }, { category: "apache spark", 
value: 1 }, { category: "apache wayang", value: 1 }, { category: "release", 
value: 23 }, { category: "decryption", value: 1 }, { category: "encryption", 
value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle", 
value: 1 }, { category: "domain speci [...]
+                { category: "data science", value: 7 }, { category: "eclipse 
collections", value: 7 }, { category: "groovy", value: 54 }, { category: 
"kmeans", value: 3 }, { category: "emoji", value: 3 }, { category: "virtual 
threads", value: 3 }, { category: "scala integration", value: 1 }, { category: 
"clustering", value: 2 }, { category: "windows installer", value: 8 }, { 
category: "release", value: 23 }, { category: "decryption", value: 1 }, { 
category: "encryption", value: 1 }, { ca [...]
                 ]);
                 wc.labels.template.setAll({
                     paddingTop: 5,
diff --git a/blog/matrix-calculations-with-groovy-apache.html 
b/blog/matrix-calculations-with-groovy-apache.html
index 4135af7..77a8206 100644
--- a/blog/matrix-calculations-with-groovy-apache.html
+++ b/blog/matrix-calculations-with-groovy-apache.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Matrix calculations with Groovy, Apache Commons Math, ojAlgo, Nd4j 
and EJML</a></li><li><a href='#_fibonacci' 
class='anchor-link'>Fibonacci</a></li><li><a href='#_leslie_matrices' 
class='anchor-link'>Leslie Matrices</a></li><li><a 
href='#_encryption_with_matrices' class='a [...]
+                        </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'>Matrix calculations with Groovy, Apache Commons Math, ojAlgo, Nd4j 
and EJML</a></li><li><a href='#_fibonacci' 
class='anchor-link'>Fibonacci</a></li><li><a href='#_leslie_matrices' 
class='anchor-link'>Leslie Matrices</a></li><li><a 
href='#_encryption_with_matrices' class='a [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blogs looks at performing matrix calculations with Groovy
diff --git a/blog/parsing-json-with-groovy.html 
b/blog/parsing-json-with-groovy.html
index 2ffdfed..72941e4 100644
--- a/blog/parsing-json-with-groovy.html
+++ b/blog/parsing-json-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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='#_advance [...]
+                        </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='#_advance [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/json_logo.gif" alt="json logo" 
width="120"></span>
diff --git a/blog/reading-and-writing-csv-files.html 
b/blog/reading-and-writing-csv-files.html
index f250ac2..907c7f7 100644
--- a/blog/reading-and-writing-csv-files.html
+++ b/blog/reading-and-writing-csv-files.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Reading and Writing CSV files with Groovy</a></li><li><a 
href='#_introduction' class='anchor-link'>Introduction</a></li><li><a 
href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a 
href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da 
[...]
+                        </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'>Reading and Writing CSV files with Groovy</a></li><li><a 
href='#_introduction' class='anchor-link'>Introduction</a></li><li><a 
href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a 
href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da 
[...]
 <h2 id="_introduction">Introduction</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/testing-your-java-with-groovy.html 
b/blog/testing-your-java-with-groovy.html
new file mode 100644
index 0000000..de53dd6
--- /dev/null
+++ b/blog/testing-your-java-with-groovy.html
@@ -0,0 +1,713 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' 
content='IE=edge'/><meta name='viewport' content='width=device-width, 
initial-scale=1'/><meta name='keywords' content='groovy, java, spock, testing, 
jqwik, pitest, junit, jacoco'/><meta name='description' content='This post 
looks at testing Java using Groovy, Spock, JUnit5, Jacoco, Jqwik and 
Pitest'/><title>The Apache Groovy programming language - Blogs - Testing your 
Java with Groovy, Spock, JUnit5, Jacoco, Jqwik and Pitest</ [...]
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; 
z-index: 100; transform: rotate(45deg);' 
src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' 
class='icon'><span class='fa fa-envelope'></span> Discuss on the 
mailing-list</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' 
class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' 
class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' 
class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' 
class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' 
class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow 
questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span 
class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an 
<strong>outdated</strong> browser. Please <a 
href="http://browsehappy.com/";>upgrade your browser</a> to improve your 
experience.</p>
+                <![endif]--><div><div class='navbar navbar-default 
navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' 
class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span 
class='icon-bar'></span><span class='icon-bar'></span><span 
class='icon-bar'></span>
+                                    </button><a class='navbar-brand' 
href='../index.html'>
+                                        <i class='fa fa-star'></i> Apache 
Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a 
href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a 
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li 
class=''><a href='/download.html'>Download</a></li><li class=''><a 
href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a 
href='/'>Contribute</a></li><li class=''><a 
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a 
href='https://groovy.apac [...]
+                                            <a data-effect='st-effect-9' 
class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='../search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </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='#_mutation_ [...]
+<div class="sectionbody">
+<div class="paragraph">
+<p>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
+with Groovy. We&#8217;ll write our initial tests using the
+<a href="https://spockframework.org/";>Spock testing framework</a>, and 
we&#8217;ll use
+<a href="https://junit.org/junit5/";>JUnit5</a> later with our jqwik tests.
+You can usually use your favorite Java testing libraries if you switch to 
Groovy.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_the_system_under_test">The system under test</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For illustrative purposes, we will test a Java mathematics utility function
+<code>sumBiggestPair</code>. Given three numbers, it finds the two biggest and 
then adds them up.
+An initial stab at the code for this might look something like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="java">public class 
MathUtil {                       // Java
+
+    public static int sumBiggestPair(int a, int b, int c) {
+        int op1 = a;
+        int op2 = b;
+        if (c &gt; a) {
+            op1 = c;
+        } else if (c &gt; b) {
+            op2 = c;
+        }
+        return op1 + op2;
+    }
+
+    private MathUtil(){}
+}</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_testing_with_spock">Testing with Spock</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>An initial test could look like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">class MathUtilSpec 
extends Specification {
+    def "sum of two biggest numbers"() {
+        expect:
+        MathUtil.sumBiggestPair(2, 5, 3) == 8
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When we run this test, all tests pass:</p>
+</div>
+<div class="paragraph">
+<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
+<a href="https://github.com/jacoco/jacoco";>Jacoco</a>, we see that our test
+hasn&#8217;t covered all lines of code:</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/MathUtilJacocoReport.png" 
alt="MathUtilSpec coverage report"></span></p>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll swap to use Spock&#8217;s data-driven feature and include an 
additional testcase:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def "sum of two 
biggest numbers"(int a, int b, int c, int d) {
+    expect:
+    MathUtil.sumBiggestPair(a, b, c) == d
+
+    where:
+    a | b | c | d
+    2 | 5 | 3 | 8
+    5 | 2 | 3 | 8
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can check our coverage again:</p>
+</div>
+<div class="paragraph">
+<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.
+Let&#8217;s add one more testcase:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def "sum of two 
biggest numbers"(int a, int b, int c, int d) {
+    expect:
+    MathUtil.sumBiggestPair(a, b, c) == d
+
+    where:
+    a | b | c | d
+    2 | 5 | 3 | 8
+    5 | 2 | 3 | 8
+    5 | 4 | 1 | 9
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<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/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.
+Before we do, we&#8217;ll add one more testcase:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def "sum of two 
biggest numbers"(int a, int b, int c, int d) {
+    expect:
+    MathUtil.sumBiggestPair(a, b, c) == d
+
+    where:
+    a | b | c | d
+    2 | 5 | 3 | 8
+    5 | 2 | 3 | 8
+    5 | 4 | 1 | 9
+    3 | 2 | 6 | 9
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<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/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.
+Basically, having the <code>else</code> logic doesn&#8217;t cater for when 
<code>c</code> is
+greater than both <code>a</code> and <code>b</code>!</p>
+</div>
+<div class="paragraph">
+<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/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>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="java">public static int 
sumBiggestPair(int a, int b, int c) {                // Java
+    int op1 = a;
+    int op2 = b;
+    if (c &gt; Math.min(a, b)) {
+        op1 = c;
+        op2 = Math.max(a, b);
+    }
+    return op1 + op2;
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With this new algorithm, all 4 testcases now pass,
+and we again have 100% line and branch coverage.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>> Task :SumBiggestPairPitest:test
+<strong class="lime">✔</strong> Test sum of two biggest numbers [Tests: 
4/<strong class="lime">4</strong>/<strong class="red">0</strong>/<strong 
class="gold">0</strong>] [Time: 0.317 s]
+<strong class="lime">✔</strong> Test util.MathUtilSpec [Tests: 4/<strong 
class="lime">4</strong>/<strong class="red">0</strong>/<strong 
class="gold">0</strong>] [Time: 0.320 s]
+<strong class="lime">✔</strong> Test Gradle Test Run 
:SumBiggestPairPitest:test [Tests: 4/<strong class="lime">4</strong>/<strong 
class="red">0</strong>/<strong class="gold">0</strong>]</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>But haven&#8217;t we been here before? How can we be sure there isn&#8217;t 
some additional test
+cases that might reveal another flaw in our algorithm? We could keep writing 
lots more
+testcases, but we&#8217;ll look at two other techniques that can help.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_mutation_testing_with_pitest">Mutation testing with Pitest</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>An interesting but not widely used technique is mutation testing. It 
probably deserves
+to be more widely used. It can test the quality of a testsuite but has the 
drawback of
+sometimes being quite resource intensive. It modifies (mutates) production 
code and
+re-runs your testsuite. If your test suite still passes with modified code, it 
possibly
+indicates that your testsuite is lacking sufficient coverage. Earlier, we had 
an algorithm
+with a flaw and our testsuite didn&#8217;t initially pick it up. You can think 
of mutation
+testing as adding a deliberate flaw and seeing whether your testsuite is good 
enough
+to detect that flaw.</p>
+</div>
+<div class="paragraph">
+<p>If you&#8217;re a fan of test-driven development (TDD), it espouses a rule 
that not a single
+line of production code should be added unless a failing test forces that line 
to be
+added. A corollary is that if you change a single line of production code in 
any
+meaningful way, that some test should fail.</p>
+</div>
+<div class="paragraph">
+<p>So, let&#8217;s have a look at what mutation testing says about our initial 
flawed algorithm.
+We&#8217;ll use Pitest (also known as PIT). We&#8217;ll go back to our initial 
algorithm and the point
+where we erroneously thought we had 100% coverage. When we run Pitest, we get 
the
+following result:</p>
+</div>
+<div class="paragraph">
+<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/PitestMathUtilCoverage.png" alt="Pitest 
coverage report"></span></p>
+</div>
+<div class="paragraph">
+<p>With output including some statistics:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>======================================================================
+- Statistics
+======================================================================
+&gt;&gt; Line Coverage: 7/8 (88%)
+&gt;&gt; Generated 6 mutations Killed 4 (67%)
+&gt;&gt; Mutations with no coverage 0. Test strength 67%
+&gt;&gt; Ran 26 tests (4.33 tests per mutation)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>What is this telling us? Pitest mutated our code in ways that you might 
expect to break
+it but our testsuite passed (survived) in a couple of instances. That means 
one of two
+things. Either, there are multiple valid implementations of our algorithm and 
Pitest
+found one of those equivalent solutions, or our testsuite is lacking some key 
testcases.
+In our case, we know that the testsuite was insufficient.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s run it again but this time with all of our tests and the 
corrected algorithm.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/PitestCoverage2.png" alt="Pitest coverage 
report"></span></p>
+</div>
+<div class="paragraph">
+<p>The output when running the test has also changed slightly:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>======================================================================
+- Statistics
+======================================================================
+&gt;&gt; Line Coverage: 6/7 (86%)
+&gt;&gt; Generated 4 mutations Killed 3 (75%)
+&gt;&gt; Mutations with no coverage 0. Test strength 75%
+&gt;&gt; Ran 25 tests (6.25 tests per mutation)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Our warnings from Pitest have reduced but not gone completely away and our 
test strength
+has gone up but is still not 100%. It does mean that we are in better shape 
than before.
+But should we be concerned?</p>
+</div>
+<div class="paragraph">
+<p>It turns out in this case, we don&#8217;t need to worry (too much). As an 
example, an equally
+valid algorithm for our function under test would be to replace the 
conditional with
+<code>c &gt;= Math.min(a, b)</code>. Note the greater-than-equals operator 
rather than just greater-than. For this algorithm, a different path would be 
taken for the case when <code>c</code> equals <code>a</code> or <code>b</code>, 
but the end result would be the same. So, that would be an inconsequential or 
equivalent mutation. In such a case, there may be no additional testcase that 
we can write to keep Pitest happy. We have to be aware of this possible outcome 
when using this technique.</p>
+</div>
+<div class="paragraph">
+<p>Finally, let&#8217;s look at our build file that ran Spock, Jacoco and 
Pitest:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">plugins {
+    id 'info.solidsoft.pitest' version '1.7.4'
+}
+apply plugin: 'groovy'
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    implementation "org.apache.groovy:groovy-test-junit5:4.0.3"
+    testImplementation("org.spockframework:spock-core:2.2-M3-groovy-4.0") {
+        transitive = false
+    }
+}
+
+pitest {
+    junit5PluginVersion = '1.0.0'
+    pitestVersion = '1.9.2'
+    timestampedReports = false
+    targetClasses = ['util.*']
+}
+
+tasks.named('test') {
+    useJUnitPlatform()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The astute reader might note some subtle hints which show that the latest 
Spock versions
+run on top of the JUnit 5 platform.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_using_property_based_testing">Using Property-based Testing</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Property-based testing is another technology which probably deserves much 
more attention.
+Here we&#8217;ll use <a href="https://jqwik.net/";>jqwik</a> which runs on top 
of JUnit5,
+but you might also like to consider
+<a href="https://github.com/Bijnagte/spock-genesis";>Genesis</a>
+which provides random generators and especially targets Spock.</p>
+</div>
+<div class="paragraph">
+<p>Earlier, we looked at writing <em>more</em> tests to make our coverage 
stronger. Property-based
+testing can often lead to writing <em>less</em> tests. Instead, we generate 
many random tests
+automatically and see whether certain properties hold.</p>
+</div>
+<div class="paragraph">
+<p>Previously, we fed in the inputs and the expected output. For 
property-based testing,
+the inputs are typically randomly-generated values, we don&#8217;t know the 
output.
+So, instead of testing directly against some known output, we&#8217;ll just 
check various
+properties of the answer.</p>
+</div>
+<div class="paragraph">
+<p>As an example, here is a test we could use:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void "result should be bigger than any individual and smaller than sum of all"(
+        @ForAll @IntRange(min = 0, max = 1000) Integer a,
+        @ForAll @IntRange(min = 0, max = 1000) Integer b,
+        @ForAll @IntRange(min = 0, max = 1000) Integer c) {
+    def result = sumBiggestPair(a, b, c)
+    assert [a, b, c].every { individual -&gt; result &gt;= individual }
+    assert result &lt;= a + b + c
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>@ForAll</code> annotations indicate places where jqwik will 
insert random values.
+The <code>@IntRange</code> annotation indicates that we want the random values 
to be contained
+between 0 and 1000.</p>
+</div>
+<div class="paragraph">
+<p>Here we are checking that (at least for small positive numbers) adding the 
two biggest
+numbers should be greater than or equal to any individual number and should be 
less than
+or equal to adding all three of the numbers. These are necessary but 
insufficient
+properties to ensure our system works.</p>
+</div>
+<div class="paragraph">
+<p>When we run this we see the following output in the logs:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>                              
|--------------------jqwik--------------------
+tries = 1000                  | # of calls to property
+checks = 1000                 | # of not rejected calls
+generation = RANDOMIZED       | parameters are randomly generated
+after-failure = PREVIOUS_SEED | use the previous seed
+when-fixed-seed = ALLOW       | fixing the random seed is allowed
+edge-cases#mode = MIXIN       | edge cases are mixed in
+edge-cases#total = 125        | # of all combined edge cases
+edge-cases#tried = 117        | # of edge cases tried in current run
+seed = -311315135281003183    | random seed to reproduce generated values</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>So, we wrote 1 test and 1000 testcases were executed. The number of tests 
run is
+configurable. We won&#8217;t go into the details here. This looks great at 
first glance.
+It turns out however, that this particular property is not very discriminating 
in
+terms of the bugs it can find. This test passes for both our original flawed 
algorithm
+as well as the fixed one. Let&#8217;s try a different property:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void "sum of any pair should not be greater than result"(
+        @ForAll @IntRange(min = 0, max = 1000) Integer a,
+        @ForAll @IntRange(min = 0, max = 1000) Integer b,
+        @ForAll @IntRange(min = 0, max = 1000) Integer c) {
+    def result = sumBiggestPair(a, b, c)
+    assert [a + b, b + c, c + a].every { sumOfPair -&gt; result &gt;= 
sumOfPair }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If we calculate the biggest pair, then surely it must be greater than or 
equal to any
+arbitrary pair. Trying this on our flawed algorithm gives:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
+    assert [a + b, b + c, c + a].every { sumOfPair -&gt; result &gt;= 
sumOfPair }
+            | | |  | | |  | | |  |
+            1 1 0  0 2 2  2 3 1  false
+                              |--------------------jqwik--------------------
+tries = 12                    | # of calls to property
+checks = 12                   | # of not rejected calls
+generation = RANDOMIZED       | parameters are randomly generated
+after-failure = PREVIOUS_SEED | use the previous seed
+when-fixed-seed = ALLOW       | fixing the random seed is allowed
+edge-cases#mode = MIXIN       | edge cases are mixed in
+edge-cases#total = 125        | # of all combined edge cases
+edge-cases#tried = 2          | # of edge cases tried in current run
+seed = 4830696361996686755    | random seed to reproduce generated values
+
+Shrunk Sample (6 steps)
+-----------------------
+  arg0: 1
+  arg1: 0
+  arg2: 2
+
+Original Sample
+---------------
+  arg0: 247
+  arg1: 32
+  arg2: 267
+
+  Original Error
+  --------------
+  org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
+    assert [a + b, b + c, c + a].every { sumOfPair -&gt; result &gt;= 
sumOfPair }
+            | | |  | | |  | | |  |
+            | | 32 32| 267| | |  false
+            | 279    299  | | 247
+            247           | 514
+                          267</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Not only did it find a case which highlighted the flaw, but it shrunk it 
down to a very
+simple example. On our fixed algorithm, the 1000 tests pass!</p>
+</div>
+<div class="paragraph">
+<p>The previous property can be refactored a little to not only calculate all 
three pairs
+but then find the maximum of those. This simplifies the condition somewhat:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void "result should be the same as alternative oracle implementation"(
+        @ForAll @IntRange(min = 0, max = 1000) Integer a,
+        @ForAll @IntRange(min = 0, max = 1000) Integer b,
+        @ForAll @IntRange(min = 0, max = 1000) Integer c) {
+    assert sumBiggestPair(a, b, c) == [a+b, a+c, b+c].max()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This approach, where an alternative implementation is used, is known as a 
test oracle.
+The alternative implementation might be less efficient, so not ideal for 
production code,
+but fine for testing. When revamping or replacing some software, the oracle 
might be the
+existing system. When run on our fixed algorithm, we again have 1000 testcases 
passing.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s go one step further and remove our <code>@IntRange</code> 
boundaries on the Integers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void "result should be the same as alternative oracle implementation"(@ForAll 
Integer a, @ForAll Integer b, @ForAll Integer c) {
+    assert sumBiggestPair(a, b, c) == [a+b, a+c, b+c].max()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When we run the test now, we might be surprised:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>  org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
+    assert sumBiggestPair(a, b, c) == [a+b, a+c, b+c].max()
+           |              |  |  |  |   |||  |||  |||  |
+           -2147483648    0  1  |  |   0|1  0||  1||  2147483647
+                                |  |    1    ||   |2147483647
+                                |  false     ||   -2147483648
+                                2147483647   |2147483647
+                                             2147483647
+Shrunk Sample (13 steps)
+------------------------
+  arg0: 0
+  arg1: 1
+  arg2: 2147483647</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It fails! Is this another bug in our algorithm? Possibly? But it could 
equally be
+a bug in our property test. Further investigation is warranted.</p>
+</div>
+<div class="paragraph">
+<p>It turns out that our algorithm suffers from Integer overflow when trying 
to add <code>1</code> to
+<code>Integer.MAX_VALUE</code>. Our test partially suffers from the same 
problem but when we call
+<code>max()</code>, the negative value will be discarded. There is no always 
correct answer as to
+what should happen in this scenario. We go back to the customer and check the 
real
+requirement. In this case, let&#8217;s assume the customer was happy for the 
overflow to
+occur - since that is what would happen if performing the operation long-hand 
in Java.
+With that knowledge we should fix our test to at least pass correctly when 
overflow occurs.</p>
+</div>
+<div class="paragraph">
+<p>We have a number of options to fix this. We already saw previously we can 
use <code>@IntRange</code>.
+This is one way to "avoid" the problem and we have a few similar approaches 
which do the
+same. We could use a more confined data type, e.g. <code>Short</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void checkShort(@ForAll Short a, @ForAll Short b, @ForAll Short c) {
+    assert sumBiggestPair(a, b, c) == [a+b, a+c, b+c].max()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Or we could use a customised provider method:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void checkIntegerConstrainedProvider(@ForAll('halfMax') Integer a,
+                                     @ForAll('halfMax') Integer b,
+                                     @ForAll('halfMax') Integer c) {
+    assert sumBiggestPair(a, b, c) == [a+b, a+c, b+c].max()
+}
+
+@Provide
+Arbitrary&lt;Integer&gt; halfMax() {
+    int halfMax = Integer.MAX_VALUE &gt;&gt; 1
+    return Arbitraries.integers().between(-halfMax, halfMax)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>But rather than avoiding the problem, we could change our test so that it 
allowed for
+the possibility of overflow within <code>sumBiggestPair</code> but 
didn&#8217;t compound the problem with
+its own overflow. E.g.&nbsp;we could use Long&#8217;s to do our calculations 
within our test:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">@Property
+void checkIntegerWithLongCalculations(@ForAll Integer a, @ForAll Integer b, 
@ForAll Integer c) {
+    def (al, bl, cl) = [a, b, c]*.toLong()
+    assert sumBiggestPair(a, b, c) == [al+bl, al+cl, bl+cl].max().toInteger()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Finally, let&#8217;s again look at our Gradle build file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">apply plugin: 
'groovy'
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    testImplementation project(':SumBiggestPair')
+    testImplementation "org.apache.groovy:groovy-test-junit5:4.0.3"
+    testImplementation "net.jqwik:jqwik:1.6.5"
+}
+
+test {
+    useJUnitPlatform {
+        includeEngines 'jqwik'
+    }
+}</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_more_information">More information</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The examples in this blog post are excerpts from the following repo:<br>
+<a href="https://github.com/paulk-asert/property-based-testing"; 
class="bare">https://github.com/paulk-asert/property-based-testing</a></p>
+</div>
+<div class="paragraph">
+<p>Library versions used:<br>
+Gradle 7.5, Groovy 4.0.3, jqwik 1.6.5, pitest 1.9.2, Spock 2.2-M3-groovy-4.0, 
Jacoco 0.8.8.<br>
+Tested with JDK 8, 11, 17, 18.</p>
+</div>
+<div class="paragraph">
+<p>There are many sites with valuable information about the technologies 
covered here. There are also some great books. Books on Spock include <a 
href="https://www.oreilly.com/library/view/spock-up-and/9781491923283/";>Spock: 
Up and Running</a>, <a 
href="https://www.manning.com/books/java-testing-with-spock";>Java Testing with 
Spock</a>, and
+<a href="https://leanpub.com/spockframeworknotebook";>Spocklight Notebook</a>.
+Books on Groovy include:
+<a href="https://www.manning.com/books/groovy-in-action-second-edition";>Groovy 
in Action</a>
+and <a 
href="https://link.springer.com/book/10.1007/978-1-4842-5058-7";>Learning Groovy 
3</a>.
+If you want general information about using Java and Groovy together, consider
+<a href="https://www.manning.com/books/making-java-groovy";>Making Java 
Groovy</a>.
+And there&#8217;s a section on mutation testing in <a 
href="http://kaczanowscy.pl/books/practical_unit_testing_junit_testng_mockito.html";>Practical
 Unit Testing With Testng And Mockito</a>. The most recent book for property 
testing is for the <a 
href="https://pragprog.com/titles/fhproper/property-based-testing-with-proper-erlang-and-elixir/";>Erlang
 and Elixir languages</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_conclusion">Conclusion</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We have looked at testing Java code using Groovy and Spock with some 
additional
+tools like Jacoco, jqwik and Pitest. Generally using Groovy to test Java is a
+straight-forward experience. Groovy also lends itself to writing testing DSLs
+which allow non-hard-core programmers to write very simple looking tests;
+but that&#8217;s a topic for another blog!</p>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a 
href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a 
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a 
href='/download.html'>Download</a></li><li><a 
href='http://groovy-lang.org/support.html'>Support</a></li><li><a 
href='/'>Contribute</a></li><li><a 
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a 
href='https://groovy.apache.org/events.html'></a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a 
href='https://github.com/apache/groovy'>Source code</a></li><li><a 
href='http://groovy-lang.org/security.html'>Security</a></li><li><a 
href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a 
href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a 
href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a
 href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a 
href='http://groovy-lang.org/sea [...]
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a 
href='http://groovy-lang.org/mailing-lists.html'>Discuss on the 
mailing-list</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on 
Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and 
conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code 
on GitHub</a></li><li><a 
href='http://groovy-lang.org/reporting-issues.html'>Report issues in 
Jira</a></li><li><a href='http://stackoverflow.com [...]
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is 
supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> 
and the Groovy community.
+                                        </p><div text-align='right'>
+                                            <img src='../img/asf_logo.png' 
title='The Apache Software Foundation' alt='The Apache Software Foundation' 
style='width:60%'/>
+                                        </div><p>Apache&reg; and the Apache 
feather logo are either registered trademarks or trademarks of The Apache 
Software Foundation.</p>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2023 
the Apache Groovy project &mdash; Groovy is Open Source: <a 
href='http://www.apache.org/licenses/LICENSE-2.0.html' alt='Apache 2 
License'>license</a>, <a 
href='https://privacy.apache.org/policies/privacy-policy-public.html'>privacy 
policy</a>.</div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='../js/vendor/jquery-1.10.2.min.js' 
defer></script><script src='../js/vendor/classie.js' defer></script><script 
src='../js/vendor/bootstrap.js' defer></script><script 
src='../js/vendor/sidebarEffects.js' defer></script><script 
src='../js/vendor/modernizr-2.6.2.min.js' defer></script><script 
src='../js/plugins.js' defer></script><script 
src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoa
 [...]
+          
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new 
Date();a=s.createElement(o),
+          
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/blog/using-groovy-with-apache-wayang.html 
b/blog/using-groovy-with-apache-wayang.html
index 0cab414..487c146 100644
--- a/blog/using-groovy-with-apache-wayang.html
+++ b/blog/using-groovy-with-apache-wayang.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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 Groovy with Apache Wayang and Apache Spark</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_implementation_details' 
class='anchor-link'>Implementation Details</a></li><li><a 
href='#_running_with_the_java_streams [...]
+                        </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 Groovy with Apache Wayang and Apache Spark</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_implementation_details' 
class='anchor-link'>Implementation Details</a></li><li><a 
href='#_running_with_the_java_streams [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img 
src="https://www.apache.org/logos/res/wayang/default.png"; alt="wayang logo" 
width="100"></span>
diff --git a/blog/whiskey-clustering-with-groovy-and.html 
b/blog/whiskey-clustering-with-groovy-and.html
index 8ab550e..3489060 100644
--- a/blog/whiskey-clustering-with-groovy-and.html
+++ b/blog/whiskey-clustering-with-groovy-and.html
@@ -53,11 +53,11 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache 
Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp 
[...]
+                        </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'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache 
Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp 
[...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>In a previous <a 
href="https://groovy.apache.org/blog/using-groovy-with-apache-wayang";>blog 
post</a>,
-<span class="image right"><img src="https://ignite.apache.org/img/logo.svg"; 
alt="Ignite logo" width="150"></span> we looked at
+<span class="image right"><img 
src="https://www.apache.org/logos/res/ignite/default.png"; alt="Ignite logo" 
width="150"></span> we looked at
 using <a href="https://wayang.apache.org/";>Apache Wayang</a> (incubating) and
 <a href="https://spark.apache.org/";>Apache Spark</a> to scale up the
 <a href="https://en.wikipedia.org/wiki/K-means_clustering";>k-means</a> 
clustering algorithm.
diff --git a/blog/wordle-checker.html b/blog/wordle-checker.html
index d10d37e..47b7598 100644
--- a/blog/wordle-checker.html
+++ b/blog/wordle-checker.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Checking Wordle with Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a 
href='./zipping-collectio [...]
+                        </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'>Checking Wordle with Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a 
href='./groovy-list-proce [...]
 <p>This <a 
href="https://donraab.medium.com/comparing-my-smalltalk-and-eclipse-collections-wordle-kata-solutions-4058ac7d8ca0";>article</a>
 by <a href="https://twitter.com/TheDonRaab";>Donald Raab</a>
 looks at writing a Wordle checker in Smalltalk and Java using <a 
href="https://github.com/eclipse/eclipse-collections";>Eclipse Collections</a>. 
Let&#8217;s look at doing the same in Groovy.
 We could easily use Eclipse Collections with Groovy
diff --git a/blog/zipping-collections-with-groovy.html 
b/blog/zipping-collections-with-groovy.html
index 94ee20f..a453e6f 100644
--- a/blog/zipping-collections-with-groovy.html
+++ b/blog/zipping-collections-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </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'>Zipping Collections with Groovy</a></li><li><a 
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a 
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a 
href='#_eclipse_collections' class='anchor-link'>Eclipse 
Collections</a></li><li><a href='# [...]
+                        </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'>Zipping Collections with Groovy</a></li><li><a 
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a 
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a 
href='#_eclipse_collections' class='anchor-link'>Eclipse 
Collections</a></li><li><a href='# [...]
 <h2 id="_what_is_zipping">What is zipping?</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/css/style.css b/css/style.css
index 70c07f6..5370eba 100644
--- a/css/style.css
+++ b/css/style.css
@@ -1 +1 @@
-@import 
url(https://fonts.googleapis.com/css?family=Source+Code+Pro:500,700|Open+Sans:400,600);html,code,kbd,pre,samp{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,body{height:100%;-webkit-overflow-scrolling:touch}p,ul,pre,h1,h2,h3,h4,h5,h6,h7,h8{margin:1em
 
0}p{display:block}h1,h2,h3,h4,h5,h6,h7,h8{font-weight:bold}pre{border-radius:0;border:0!important;font-size:14px}.navbar{margin-bottom:0;padding-right:110px}.navbar
 .container{margin:10px}.navbar-default a{color:#c0d3db [...]
\ No newline at end of file
+@import 
url(https://fonts.googleapis.com/css?family=Source+Code+Pro:500,700|Open+Sans:400,600);html,code,kbd,pre,samp{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,body{height:100%;-webkit-overflow-scrolling:touch}p,ul,pre,h1,h2,h3,h4,h5,h6,h7,h8{margin:1em
 
0}p{display:block}h1,h2,h3,h4,h5,h6,h7,h8{font-weight:bold}pre{border-radius:0;border:0!important;font-size:14px}.navbar{margin-bottom:0;padding-right:110px}.navbar
 .container{margin:10px}.navbar-default a{color:#c0d3db [...]
\ No newline at end of file

Reply via email to