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 4280b2f  2024/02/07 03:19:45: Generated dev website from 
groovy-website@061ae08
4280b2f is described below

commit 4280b2fb449f2f7aaa62875e1c469416ec4d7a33
Author: jenkins <bui...@apache.org>
AuthorDate: Wed Feb 7 03:19:45 2024 +0000

    2024/02/07 03:19:45: Generated dev website from groovy-website@061ae08
---
 blog/adventures-with-groovyfx.html               |   2 +-
 blog/classifying-iris-flowers-with-deep.html     |   2 +-
 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/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-0-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-2-5-clibuilder-renewal.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-dauphine.html                        |   2 +-
 blog/groovy-haiku-processing.html                |   2 +-
 blog/groovy-knapsack.html                        | 734 ++++++++++++++++++++---
 blog/groovy-list-processing-cheat-sheet.html     |   2 +-
 blog/groovy-null-processing.html                 |   2 +-
 blog/groovy-record-performance.html              |   2 +-
 blog/groovy-records.html                         |   2 +-
 blog/groovy-release-train-4-0.html               |   2 +-
 blog/groovy-sequenced-collections.html           |   2 +-
 blog/helloworldemoji.html                        |   2 +-
 blog/index.html                                  |   4 +-
 blog/lego-bricks-with-groovy.html                |   2 +-
 blog/matrix-calculations-with-groovy-apache.html |   2 +-
 blog/parsing-json-with-groovy.html               |   2 +-
 blog/reading-and-writing-csv-files.html          |   2 +-
 blog/seasons-greetings-emoji.html                |   2 +-
 blog/set-operations-with-groovy.html             |   2 +-
 blog/using-groovy-with-apache-wayang.html        |   2 +-
 blog/whiskey-clustering-with-groovy-and.html     |   2 +-
 blog/wordle-checker.html                         |   2 +-
 blog/zipping-collections-with-groovy.html        |   2 +-
 53 files changed, 693 insertions(+), 157 deletions(-)

diff --git a/blog/adventures-with-groovyfx.html 
b/blog/adventures-with-groovyfx.html
index b8bf362..8cb33cf 100644
--- a/blog/adventures-with-groovyfx.html
+++ b/blog/adventures-with-groovyfx.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'>Adventures with GroovyFX</a></li><li><a 
href='#_further_information' class='anchor-link'>Further 
information</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='./set-operations-w [...]
+                        </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'>Adventures with GroovyFX</a></li><li><a 
href='#_further_information' class='anchor-link'>Further 
information</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-an [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog looks at a <a href="http://groovyfx.org/";>GroovyFX</a> version of 
a <a 
href="https://donraab.medium.com/my-weird-and-wonderful-first-adventures-with-javafx-6efe3b1923c8";>ToDo
 application originally written in JavaFX</a>.
diff --git a/blog/classifying-iris-flowers-with-deep.html 
b/blog/classifying-iris-flowers-with-deep.html
index 0760315..cbdcda7 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>
diff --git a/blog/comparators-and-sorting-in-groovy.html 
b/blog/comparators-and-sorting-in-groovy.html
index 55daeb3..aa8cd39 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 cff8b31..eaaca28 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 7535e2e..dc1c3a9 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><li><a 
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model 
and data</a></li><li><a href='#_applying_deep_learning' 
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul 
class='nav-sidebar' [...]
+                        </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><li><a 
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model 
and data</a></li><li><a href='#_applying_deep_learning' 
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul 
class='nav-sidebar' [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>In previous blogs, we&#8217;ve covered
diff --git a/blog/detecting-objects-with-groovy-the.html 
b/blog/detecting-objects-with-groovy-the.html
index aa39877..7ab6b1c 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 923474a..79d8f42 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -8,21 +8,21 @@
     <author>
       <name>Remko Popma</name>
     </author>
-    <title>Groovy 2.5.0 released</title>
-    <link href="http://groovy.apache.org/blog/groovy-2-5-0-released"/>
+    <title>Apache Groovy 2.5 CliBuilder Renewal</title>
+    <link href="http://groovy.apache.org/blog/groovy-2-5-clibuilder-renewal"/>
     <updated>2018-05-30T11:28:31+00:00</updated>
     <published>2018-05-30T11:28:31+00:00</published>
-    <summary>Groovy 2.5.0 Release Announcement.</summary>
+    <summary>This post looks at new CliBuilder features from Groovy 2.5 in 
particular the Picocli-based implementation.</summary>
   </entry>
   <entry>
     <author>
       <name>Remko Popma</name>
     </author>
-    <title>Apache Groovy 2.5 CliBuilder Renewal</title>
-    <link href="http://groovy.apache.org/blog/groovy-2-5-clibuilder-renewal"/>
+    <title>Groovy 2.5.0 released</title>
+    <link href="http://groovy.apache.org/blog/groovy-2-5-0-released"/>
     <updated>2018-05-30T11:28:31+00:00</updated>
     <published>2018-05-30T11:28:31+00:00</published>
-    <summary>This post looks at new CliBuilder features from Groovy 2.5 in 
particular the Picocli-based implementation.</summary>
+    <summary>Groovy 2.5.0 Release Announcement.</summary>
   </entry>
   <entry>
     <author>
diff --git a/blog/fruity-eclipse-collections.html 
b/blog/fruity-eclipse-collections.html
index 13d8bd5..e0c83cc 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/gmavenplus-1-6-2-released.html 
b/blog/gmavenplus-1-6-2-released.html
index b67e5f5..d43703e 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 93dd82f..1fbb1b3 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 a6d07d6..ca8e47b 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 99f54cf..5435a8a 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-released'>Groovy 2.4.16 Released</a></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2. [...]
+                        </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 [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-0-released.html b/blog/groovy-2-5-0-released.html
index fe78c25..1521dfc 100644
--- a/blog/groovy-2-5-0-released.html
+++ b/blog/groovy-2-5-0-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.0 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  [...]
+                        </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.0 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-1-released.html b/blog/groovy-2-5-1-released.html
index e064add..03f2b5f 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-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </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= [...]
 <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 d3d2ef3..ad7a6b4 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 e77fbdd..0d40d2b 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-5-windows'>Groovy 2.5.5 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.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 [...]
 <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 005103a..a86ad7a 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 b5ffb87..592cf14 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-5-windows'>Groovy 2.5.5 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-2-windows'>Groovy 2.5.2 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 bd20ea8..6fce9a3 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 805c014..66f0524 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-5-windows'>Groovy 2.5.5 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-2-windows'>Groovy 2.5.2 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 241757f..af2e70c 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 857499f..4bb73ff 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-5-released'>Groovy 2.5.5 released</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 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 [...]
 <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 c451e76..a6c2c64 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-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </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= [...]
 <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 008198c..877e708 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-7-released'>Groovy 2.5.7 Released< 
[...]
+                        </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 
[...]
 <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 ae345de..4e93f9b 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-2-5-clibuilder-renewal.html 
b/blog/groovy-2-5-clibuilder-renewal.html
index c1abb16..b70e539 100644
--- a/blog/groovy-2-5-clibuilder-renewal.html
+++ b/blog/groovy-2-5-clibuilder-renewal.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'>Apache Groovy 2.5 CliBuilder Renewal</a></li><li><a 
href='#_the_code_groovy_util_clibuilder_code_class_is_deprecated' 
class='anchor-link'>The <code>groovy.util.CliBuilder</code> Class is 
Deprecated</a></li><li><a href='#_typed_options' class='anchor-link'>Typed 
Options</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'>Apache Groovy 2.5 CliBuilder Renewal</a></li><li><a 
href='#_the_code_groovy_util_clibuilder_code_class_is_deprecated' 
class='anchor-link'>The <code>groovy.util.CliBuilder</code> Class is 
Deprecated</a></li><li><a href='#_typed_options' class='anchor-link'>Typed 
Options</a> [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>The <code>CliBuilder</code> class for quickly and concisely building
diff --git a/blog/groovy-3-0-0-alpha.html b/blog/groovy-3-0-0-alpha.html
index a1296b9..477a60e 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 6a69527..221c5bb 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 6c177ae..c6440e2 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-beta2'>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-beta1'>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 01678d7..b2a9f01 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 8db7d6a..f882c61 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-alpha1'>Groovy 3.0.0-alpha-4 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 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>< [...]
 <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 9bbe3e4..31e6c6b 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-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </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= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-dauphine.html b/blog/groovy-dauphine.html
index 94ed688..3e2873e 100644
--- a/blog/groovy-dauphine.html
+++ b/blog/groovy-dauphine.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'>Processing Results for the Critérium du Dauphiné</a></li><li><a 
href='#_results_file' class='anchor-link'>Results file</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='./parsin [...]
+                        </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'>Processing Results for the Critérium du Dauphiné</a></li><li><a 
href='#_results_file' class='anchor-link'>Results file</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='./readin [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>The 2023 <a href="https://www.criterium-du-dauphine.fr/en/";>Critérium du 
Dauphiné</a>
diff --git a/blog/groovy-haiku-processing.html 
b/blog/groovy-haiku-processing.html
index 479b98c..10bfb98 100644
--- a/blog/groovy-haiku-processing.html
+++ b/blog/groovy-haiku-processing.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 Haiku processing</a></li><li><a 
href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1: 
Finding the distinct letters</a></li><li><a 
href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions' 
class='anchor-link'>Example 2: Splitt [...]
+                        </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 Haiku processing</a></li><li><a 
href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1: 
Finding the distinct letters</a></li><li><a 
href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions' 
class='anchor-link'>Example 2: Splitt [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog looks at some Groovy solutions for the examples in the
diff --git a/blog/groovy-knapsack.html b/blog/groovy-knapsack.html
index 5d2152d..54b6e87 100644
--- a/blog/groovy-knapsack.html
+++ b/blog/groovy-knapsack.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'>Solving the Knapsack Problem with Groovy</a></li><li><a 
href='#_case_study' class='anchor-link'>Case Study</a></li><li><a 
href='#_brute_force_recursion' class='anchor-link'>Brute force 
recursion</a></li><li><a href='#_using_dynamic_programming' 
class='anchor-link'>Using Dy [...]
+                        </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'>Solving the Knapsack Problem with Groovy</a></li><li><a 
href='#_case_study' class='anchor-link'>Case Study</a></li><li><a 
href='#_brute_force' class='anchor-link'>Brute force</a></li><li><a 
href='#_using_branch_and_bound' class='anchor-link'>Using Branch and 
Bound</a></li> [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>The
@@ -84,34 +84,34 @@ knapsack. The gems have the following characteristics:</p>
 </colgroup>
 <thead>
 <tr>
-<th class="tableblock halign-left valign-top">Number</th>
-<th class="tableblock halign-left valign-top">Weight</th>
+<th class="tableblock halign-left valign-top">Index&nbsp;</th>
+<th class="tableblock halign-left valign-top">Weight&nbsp;</th>
 <th class="tableblock halign-left valign-top">Value</th>
 </tr>
 </thead>
 <tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">15</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">17</p></td>
 </tr>
@@ -123,7 +123,8 @@ This is known as the 0/1 knapsack variation of the problem.
 We&#8217;ll look at some other variations later.</p>
 </div>
 <div class="paragraph">
-<p>Our goal then is to find out which gems we place into the knapsack.</p>
+<p>Our goal then is to find out which gems we place into the knapsack to 
maximise
+the value.</p>
 </div>
 <div class="paragraph">
 <p><span class="image"><img src="img/knapsack.jpg" alt="A knapsack and some 
gems"></span></p>
@@ -131,7 +132,7 @@ We&#8217;ll look at some other variations later.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_brute_force_recursion">Brute force recursion</h2>
+<h2 id="_brute_force">Brute force</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The first approach we might take is simply to try all
@@ -148,13 +149,28 @@ Then, find the one which yields the highest value as 
shown here:</p>
 <pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
 int[] weights = [1, 2, 3, 5, 6]    // Weights
 int W = 10
-var indexCombos = weights.indices.collect{ [null, it] 
}.combinations()*.findResults()
-var validWeight = indexCombos.findAll{ weights[it].sum() &lt;= W }
-var best = validWeight.max{ values[it].sum() }
-println "Total value for capacity $W = ${values[best].sum()}"
-println "Gems taken: $best"
-println "Gem weights: ${weights[best]}"</code></pre>
+
+var totalValue = { it*.v.sum() }
+var withinLimit = { it*.w.sum() &lt;= W }
+var asTriple = { [i:it, w:weights[it], v:values[it]] }
+
+var best = weights
+    .indices
+    .collect(asTriple)
+    .subsequences()
+    .findAll(withinLimit)
+    .max(totalValue)
+
+println "Total value for capacity $W = ${totalValue(best)}"
+println "Gems taken: ${best*.i}"
+println "Gem weights: ${best*.w}"</code></pre>
+</div>
 </div>
+<div class="paragraph">
+<p>In a bit more detail, we first define three helper closures, 
<code>totalValue</code>, <code>withinLimit</code>,
+and <code>asTriple</code>. Collecting our data into the list of maps (triples) 
isn&#8217;t required
+but simplifies subsequent processing. Once we have our data, we find the
+subsequences, retain the ones within the weight limit, and then find the 
maximum value.</p>
 </div>
 <div class="paragraph">
 <p>Running this script yields the following output:</p>
@@ -168,8 +184,14 @@ Gem weights: [2, 3, 5]</pre>
 </div>
 <div class="paragraph">
 <p>While this is simple enough, it doesn&#8217;t offer many opportunities
-for optimisation. Let&#8217;s instead, consider a recursive solution
-which lets us opt out earlier for cases which are over the valid knapsack 
weight:</p>
+for optimisation. For a small problem like our case study,
+optimisation is not important, but for larger problems,
+the number of combinations may grow exponentially large,
+and we&#8217;ll want to keep that in mind.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s instead, consider a recursive solution which lets us opt out
+earlier for cases which will exceed the maximum knapsack weight limit:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -196,6 +218,139 @@ int[] weights = [1, 2, 3, 5, 6]    // Weights
 </div>
 </div>
 <div class="paragraph">
+<p>Here, we consider each gem (for a given stage, gem <code>n</code>, or index 
<code>n - 1</code>).
+There are two paths to calculate, one with the gem <em>included</em>,
+the other with it <em>excluded</em>. We remember the maximum value returned
+from the two paths and continue processing. When a gem is included,
+we then solve the smaller problem of fitting the remaining gems into a 
conceptually
+smaller knapsack. If placing a gem into the knapsack causes the weight to 
exceed
+the limit, then we can discard that path from further processing.</p>
+</div>
+<div class="paragraph">
+<p>It is useful to visualize the above process as a solution tree (shown for 
capacity 10):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>digraph unix {
+       fontname="Helvetica,Arial,sans-serif"
+       node [fontname="Helvetica,Arial,sans-serif"]
+       edge [fontname="Helvetica,Arial,sans-serif"]
+       node [color=lightblue2, style=filled];
+       n [label="0 0"]
+       n5 [label="6 17"]
+       n_ [label="0 0"]
+
+       n54 [label="11 _", color="#f88379"]
+       n_4 [label="5 15"]
+       n5_ [label="6 17"]
+       n__ [label="0 0"]
+
+       n5_3 [label="9 27"]
+       n5__ [label="6 17"]
+       n_43 [label="8 25"]
+       n_4_ [label="5 15"]
+       n__3 [label="3 10"]
+       n___ [label="0 0"]
+
+       n__32 [label="5 15"]
+       n___2 [label="2 5"]
+       n5_32 [label="11 _", color="#f88379"]
+       n5__2 [label="8 23"]
+       n_432 [label="10 30"]
+       n_4_2 [label="7 20"]
+
+       n__3_ [label="3 10"]
+       n____ [label="0 0"]
+       n5_3_ [label="9 27"]
+       n5___ [label="6 17"]
+       n_43_ [label="8 25"]
+       n_4__ [label="5 15"]
+       n__3_ [label="3 10"]
+       n____ [label="0 0"]
+
+       n__321 [label="6 16"]
+       n___21 [label="3 7"]
+       n5__21 [label="9 23"]
+       n_4321 [label="11 _", color="#f88379"]
+       n_4_21 [label="9 20"]
+       n__3_1 [label="4 11"]
+       n____1 [label="1 1"]
+       n5_3_1 [label="10 28"]
+       n5___1 [label="7 18"]
+       n_43_1 [label="9 26"]
+       n_4__1 [label="6 16"]
+       n__3_1 [label="4 11"]
+       n____1 [label="1 1"]
+
+       n__32_ [label="5 15"]
+       n___2_ [label="2 5"]
+       n5__2_ [label="8 23"]
+       n_432_ [label="10 30", color=gold]
+       n_4_2_ [label="7 20"]
+       n__3__ [label="3 10"]
+       n_____ [label="0 0"]
+       n5_3__ [label="9 27"]
+       n5____ [label="6 17"]
+       n_43__ [label="8 25"]
+       n_4___ [label="5 15"]
+       n__3__ [label="3 10"]
+       n_____ [label="0 0"]
+
+       n -&gt; n5 [label="Gem5"];
+       n -&gt; n_ [label=&lt;&lt;s&gt;Gem5&lt;/s&gt;&gt;];
+
+       n5 -&gt; n54 [label="Gem4"];
+       n5 -&gt; n5_ [label=&lt;&lt;s&gt;Gem4&lt;/s&gt;&gt;];
+       n_ -&gt; n_4 [label="Gem4"];
+       n_ -&gt; n__ [label=&lt;&lt;s&gt;Gem4&lt;/s&gt;&gt;];
+
+       n5_ -&gt; n5_3 [label="Gem3"];
+       n5_ -&gt; n5__ [label=&lt;&lt;s&gt;Gem3&lt;/s&gt;&gt;];
+       n_4 -&gt; n_43 [label="Gem3"];
+       n_4 -&gt; n_4_ [label=&lt;&lt;s&gt;Gem3&lt;/s&gt;&gt;];
+       n__ -&gt; n__3 [label="Gem3"];
+       n__ -&gt; n___ [label=&lt;&lt;s&gt;Gem3&lt;/s&gt;&gt;];
+
+       n5_3 -&gt; n5_32 [label="Gem2"];
+       n5_3 -&gt; n5_3_ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n_43 -&gt; n_432 [label="Gem2"];
+       n_43 -&gt; n_43_ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n__3 -&gt; n__32 [label="Gem2"];
+       n__3 -&gt; n__3_ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n5__ -&gt; n5__2 [label="Gem2"];
+       n5__ -&gt; n5___ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n_4_ -&gt; n_4_2 [label="Gem2"];
+       n_4_ -&gt; n_4__ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n___ -&gt; n___2 [label="Gem2"];
+       n___ -&gt; n____ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+
+       n_432 -&gt; n_4321 [label="Gem1"];
+       n_432 -&gt; n_432_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n__32 -&gt; n__321 [label="Gem1"];
+       n__32 -&gt; n__32_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n5__2 -&gt; n5__21 [label="Gem1"];
+       n5__2 -&gt; n5__2_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n_4_2 -&gt; n_4_21 [label="Gem1"];
+       n_4_2 -&gt; n_4_2_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n___2 -&gt; n___21 [label="Gem1"];
+       n___2 -&gt; n___2_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+
+       n5_3_ -&gt; n5_3_1 [label="Gem1"];
+       n5_3_ -&gt; n5_3__ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n_43_ -&gt; n_43_1 [label="Gem1"];
+       n_43_ -&gt; n_43__ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n__3_ -&gt; n__3_1 [label="Gem1"];
+       n__3_ -&gt; n__3__ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n5___ -&gt; n5___1 [label="Gem1"];
+       n5___ -&gt; n5____ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n_4__ -&gt; n_4__1 [label="Gem1"];
+       n_4__ -&gt; n_4___ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n____ -&gt; n____1 [label="Gem1"];
+       n____ -&gt; n_____ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+}</pre>
+</div>
+</div>
+<div class="paragraph">
 <p>We calculate here the result for 3 different knapsack weight limits (6, 8, 
and 10).
 The output looks like this:</p>
 </div>
@@ -207,9 +362,14 @@ Total value for capacity 10 = 30</pre>
 </div>
 </div>
 <div class="paragraph">
-<p>We now have some possibilities for optimisation. One quick win is to
-memoize (cache) the results of calling the <code>knapsack</code> method.
-The only change from above is the addition of the <code>@Memoized</code> 
annotation.</p>
+<p>Instead of having 32 combinations (2^5 for our 5 gems), we&#8217;ll only 
process 11,
+16, and 21 combinations where both paths are traversed when the maximum weight
+limit is 6, 8, and 10 respectively.</p>
+</div>
+<div class="paragraph">
+<p>More importantly, we&#8217;ll have further possibilities for optimisation.
+One quick win is to memoize (cache) the results of calling the 
<code>knapsack</code> method.
+Groovy makes this easy. The only change from above is the addition of the 
<code>@Memoized</code> annotation:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -233,87 +393,33 @@ the <code>knapsack</code> method reduces from 44 to 32 
(when just calculating fo
 </div>
 </div>
 <div class="sect1">
-<h2 id="_using_dynamic_programming">Using Dynamic Programming</h2>
+<h2 id="_using_branch_and_bound">Using Branch and Bound</h2>
 <div class="sectionbody">
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">int solve(int[] v, 
int[] w, int W) {
-    knapsack(new Integer[v.length][W+1], v, w, W, 0)
-}
-
-int knapsack(Integer[][] dp, int[] v, int[] w, int W, int n) {
-    if (W &lt;= 0 || n &gt;= v.length) {
-        return 0
-    }
-    if (dp[n][W]) {
-        return dp[n][W]
-    }
-    int tryN = w[n] &gt; W ? 0 : v[n] + knapsack(dp, v, w, W - w[n], n + 1)
-    int skipN = knapsack(dp, v, w, W, n + 1)
-    dp[n][W] = max(tryN, skipN)
-}
-
-int[] values = [1, 5, 10, 15, 17]  // Gem values
-int[] weights = [1, 2, 3, 5, 6]    // Weights
-[6, 8, 10].each {
-    println "Total value for capacity $it = ${solve(values, weights, it)}"
-}</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre>Total value for capacity 6 = 17
-Total value for capacity 8 = 25
-Total value for capacity 10 = 30</pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
-int[] weights = [1, 2, 3, 5, 6]    // Weights
-int W = 10
-int N = values.length
-
-int[][] dp = new int[N + 1][W + 1]
-boolean[][] sol = new boolean[N + 1][W + 1]
-
-for (int n = 1; n &lt;= N; n++) {
-    for (int w = 1; w &lt;= W; w++) {
-        int skipN = dp[n - 1][w]
-        int tryN = weights[n - 1] &gt; w ? 0 : values[n - 1] + dp[n - 1][w - 
weights[n - 1]]
-        dp[n][w] = max(skipN, tryN)
-        sol[n][w] = tryN &gt; skipN
-    }
-}
-
-println "Total value for capacity $W = ${dp[N][W]}"
-
-def taken = []
-for (int i = N, j = W; j &gt; 0; i--) {
-    if (sol[i][j]) {
-        taken &lt;&lt; i - 1
-        j -= weights[i - 1]
-    }
-}
-println "Gems taken: $taken"</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre>Total value for capacity 10 = 30
-Gems taken: [3, 2, 1]</pre>
-</div>
+<div class="paragraph">
+<p>Another technique often used for optimisation is branch and bound.
+It&#8217;s a special form of the general principle of divide and conquer;
+solving a big problem by turning it into smaller problems.</p>
 </div>
+<div class="paragraph">
+<p>Divide and conquer is similar to what we did for the recursive solution 
above,
+but with branch and bound, we perform smarter elimination.
+Before processing the children of a branch, the branch is checked against
+upper and lower estimated bounds of some optimal solution and is discarded
+if it cannot produce a better solution. For the knapsack problem,
+we could find an optimal "greedy" solution if we could use fractional</p>
 </div>
+<div class="paragraph">
+<p>First, we&#8217;ll create an <code>Item</code> record for holding our 
weights and values.</p>
 </div>
-<div class="sect1">
-<h2 id="_using_branch_and_bound">Using Branch and Bound</h2>
-<div class="sectionbody">
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">record Item(int 
weight, int value) {}</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Next, we&#8217;ll create a <code>Node</code> to hold information about the 
current status
+of a candidate solution at a particular point in our solution tree:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">@Canonical
@@ -327,6 +433,12 @@ class Node {
 }</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Next, the <code>bound</code> method calculates the weight using the
+optimal (greedy) algorithm. This would require us to allow fractional
+parts of gems to be accurate, but in our case, we are just using it
+as a bound. Think of estimating with best and worst case kept in mind.</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">int bound(Node u, 
int n, int W, List&lt;Item&gt; items) {
@@ -347,9 +459,17 @@ class Node {
         valueBound += (int) ((W - totalWeight) * items[j].value / 
items[j].weight)
 
     valueBound
-}
-
-int knapsack(int W, List&lt;Item&gt; items, int n) {
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, our knapsack method will sort the gems according to
+most value per weight and then process through them keeping
+track of the bound at each step.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">int knapsack(int 
W, List&lt;Item&gt; items, int n) {
     items.sort { it.value / it.weight }
     var q = new PriorityQueue&lt;&gt;((a, b) -&gt; b.bound &lt;=&gt; a.bound)
     Node u, v
@@ -399,18 +519,319 @@ println "Total value for capacity $W = ${knapsack(W, 
items, values.length)}"</co
 </div>
 </div>
 <div class="paragraph">
-<p>Which has this output:</p>
+<p>Which has this visualization (for capacity 10):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>digraph unix {
+       fontname="Helvetica,Arial,sans-serif"
+       node [fontname="Helvetica,Arial,sans-serif"]
+       edge [fontname="Helvetica,Arial,sans-serif"]
+       node [color=lightblue2, style=filled];
+       n [label="0 0 _ _"]
+
+       n3 [label="3 10 30 10"]
+       n_ [label="0 0 29 10"]
+
+       n34 [label="8 25 30 25"]
+       n_4 [label="5 15 29 25"]
+       n3_ [label="3 10 30 25"]
+       n__ [label="0 0 29 25"]
+
+       n345 [label="14 _ _ _", color="#f88379"]
+       n_45 [label="11 _ _ _", color="#f88379"]
+       n3_5 [label="9 27 30 25"]
+       n__5 [label="6 17 29 25"]
+       n34_ [label="8 25 30 25"]
+       n_4_ [label="5 15 29 25"]
+       n3__ [label="3 10 30 25"]
+       n___ [label="0 0 29 25"]
+
+       n3_52 [label="11 _ _ _", color="#f88379"]
+       n__52 [label="8 23 29 30", color="#cbc3e3"]
+       n34_2 [label="10 30 30 30"]
+       n_4_2 [label="7 20 29 30", color="#cbc3e3"]
+       n3__2 [label="5 15 30 30"]
+       n___2 [label="2 5 29 30", color="#cbc3e3"]
+       n3_5_ [label="9 27 30 30"]
+       n__5_ [label="6 17 29 30", color="#cbc3e3"]
+       n34__ [label="8 25 30 30"]
+       n_4__ [label="5 15 29 30", color="#cbc3e3"]
+       n3___ [label="3 10 30 30"]
+       n____ [label="0 0 29 30", color="#cbc3e3"]
+
+       n34_21 [label="11 _ _ _", color="#f88379"]
+       n3__21 [label="6 16 30 30"]
+       n3_5_1 [label="10 28 30 30"]
+       n34__1 [label="9 26 30 30"]
+       n3___1 [label="4 11 30 30"]
+
+       n34_2_ [label="10 30 30 30", color=gold]
+       n3__2_ [label="5 15 30 30"]
+       n3_5__ [label="9 27 30 30"]
+       n34___ [label="8 25 30 30"]
+       n3____ [label="3 10 30 30"]
+
+       n -&gt; n3 [label="Gem3"];
+       n -&gt; n_ [label=&lt;&lt;s&gt;Gem3&lt;/s&gt;&gt;];
+
+       n3 -&gt; n34 [label="Gem4"];
+       n_ -&gt; n_4 [label="Gem4"];
+       n3 -&gt; n3_ [label=&lt;&lt;s&gt;Gem4&lt;/s&gt;&gt;];
+       n_ -&gt; n__ [label=&lt;&lt;s&gt;Gem4&lt;/s&gt;&gt;];
+
+       n34 -&gt; n345 [label="Gem5"];
+       n_4 -&gt; n_45 [label="Gem5"];
+       n3_ -&gt; n3_5 [label="Gem5"];
+       n__ -&gt; n__5 [label="Gem5"];
+       n34 -&gt; n34_ [label=&lt;&lt;s&gt;Gem5&lt;/s&gt;&gt;];
+       n_4 -&gt; n_4_ [label=&lt;&lt;s&gt;Gem5&lt;/s&gt;&gt;];
+       n3_ -&gt; n3__ [label=&lt;&lt;s&gt;Gem5&lt;/s&gt;&gt;];
+       n__ -&gt; n___ [label=&lt;&lt;s&gt;Gem5&lt;/s&gt;&gt;];
+
+       n3_5 -&gt; n3_52 [label="Gem2"];
+       n__5 -&gt; n__52 [label="Gem2"];
+       n34_ -&gt; n34_2 [label="Gem2"];
+       n_4_ -&gt; n_4_2 [label="Gem2"];
+       n3__ -&gt; n3__2 [label="Gem2"];
+       n___ -&gt; n___2 [label="Gem2"];
+       n3_5 -&gt; n3_5_ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n__5 -&gt; n__5_ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n34_ -&gt; n34__ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n_4_ -&gt; n_4__ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n3__ -&gt; n3___ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+       n___ -&gt; n____ [label=&lt;&lt;s&gt;Gem2&lt;/s&gt;&gt;];
+
+       n34_2 -&gt; n34_21 [label="Gem1"];
+       n3__2 -&gt; n3__21 [label="Gem1"];
+       n3_5_ -&gt; n3_5_1 [label="Gem1"];
+       n34__ -&gt; n34__1 [label="Gem1"];
+       n3___ -&gt; n3___1 [label="Gem1"];
+
+       n34_2 -&gt; n34_2_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n3__2 -&gt; n3__2_ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n3_5_ -&gt; n3_5__ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n34__ -&gt; n34___ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+       n3___ -&gt; n3____ [label=&lt;&lt;s&gt;Gem1&lt;/s&gt;&gt;];
+}</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We should note that as well as discarding the
+infeasible paths which exceed the weight limit,
+we now also discard unfruitful paths which our bound
+value tells us can never exceed some alternative <em>best</em> path
+we already know about.</p>
+</div>
+<div class="paragraph">
+<p>It has the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Total value for capacity 10 = 30</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_using_dynamic_programming">Using Dynamic Programming</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>You can think of dynamic programming as a special case of the
+branch and bound technique. It can also be thought of as similar
+to the memoization we looked at earlier. In this case, rather
+than Groovy providing us with the cache, we track it ourselves
+in the <code>dp</code> array:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">int solve(int[] v, 
int[] w, int W) {
+    knapsack(new Integer[v.length][W+1], v, w, W, 0)
+}
+
+int knapsack(Integer[][] dp, int[] v, int[] w, int W, int n) {
+    if (W &lt;= 0 || n &gt;= v.length) {
+        return 0
+    }
+    if (dp[n][W]) {
+        return dp[n][W]
+    }
+    int tryN = w[n] &gt; W ? 0 : v[n] + knapsack(dp, v, w, W - w[n], n + 1)
+    int skipN = knapsack(dp, v, w, W, n + 1)
+    dp[n][W] = max(tryN, skipN)
+}
+
+int[] values = [1, 5, 10, 15, 17]  // Gem values
+int[] weights = [1, 2, 3, 5, 6]    // Weights
+[6, 8, 10].each {
+    println "Total value for capacity $it = ${solve(values, weights, it)}"
+}</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Total value for capacity 6 = 17
+Total value for capacity 8 = 25
+Total value for capacity 10 = 30</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Like with most things, we have options when using dynamic programming.
+Here is an alternative variant which keeps a second array tracking
+the gems taken:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
+int[] weights = [1, 2, 3, 5, 6]    // Weights
+int W = 10
+int N = values.length
+
+int[][] dp = new int[N + 1][W + 1]
+boolean[][] sol = new boolean[N + 1][W + 1]
+
+for (int n = 1; n &lt;= N; n++) {
+    for (int w = 1; w &lt;= W; w++) {
+        int skipN = dp[n - 1][w]
+        int tryN = weights[n - 1] &gt; w ? 0 : values[n - 1] + dp[n - 1][w - 
weights[n - 1]]
+        dp[n][w] = max(skipN, tryN)
+        sol[n][w] = tryN &gt; skipN
+    }
+}
+
+println "Total value for capacity $W = ${dp[N][W]}"
+
+def taken = []
+for (int i = N, j = W; j &gt; 0; i--) {
+    if (sol[i][j]) {
+        taken &lt;&lt; i - 1
+        j -= weights[i - 1]
+    }
+}
+println "Gems taken: $taken"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If just the final value is what we want to work out, our earlier
+variant will be very slightly faster and use less memory.
+If keeping track of the gems taken is important, then this
+variant would be one way to go.</p>
+</div>
+<div class="paragraph">
+<p>It produces the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Total value for capacity 10 = 30
+Gems taken: [3, 2, 1]</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_using_bitsets">Using BitSets</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>When using dynamic programming, our 2D <code>dp</code> array could
+use significant memory for large problems. In such cases,
+we could use a bitset instead of the array like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
+int[] weights = [1, 2, 3, 5, 6]    // Weights
+int W = 10
+var N = weights.size()
+var nums = 0L..&lt;(1L &lt;&lt; N)
+var totalValue = nums
+    .collect{ BitSet.valueOf(it) }
+    .findAll{ mask -&gt; mask.stream().map(idx -&gt; weights[idx]).reduce(0, 
Integer::sum) &lt;= W }
+    .collect{ mask -&gt; nums.indices.sum{ idx -&gt; mask[idx] ? values[idx] : 
0 } }
+    .max()
+println "Total value for capacity $W = $totalValue"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here we are using the bitset to track the gem combinations
+in a candidate solution. This might seem a little unusual
+but does the job in our case.</p>
+</div>
+<div class="paragraph">
+<p>It has the following output:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre>Total value for capacity 10 = 30</pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Most often bitsets are used not just to save memory but
+because for certain problems we can perform operations
+on entire bitsets. You can think of this as bulk
+operations with <em>free</em> parallelism when compared to performing
+such operations on say arrays of booleans.</p>
+</div>
+<div class="paragraph">
+<p>We can show a simple example of this kind of operation
+by adding a preliminary optimisation step. We&#8217;ll use a simple
+trick which can find all possible sums of a set of numbers
+using bit shifting. If the maximum weight (10 in this example)
+isn&#8217;t in the list of possible sums - we find that out using the
+<code>maskW</code> constant, then we discard the combination.
+For simplicity, we&#8217;ve kept the example simple here, but realise that this
+crude optimisation has the possibility of ruling out valid candidates.
+The maximum value could, in theory, be for weight 8 or 9 for instance.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
+int[] weights = [1, 2, 3, 5, 6]    // Weights
+int W = 10
+var N = weights.size()
+var maskW = 1L &lt;&lt; W
+var nums = 0L..&lt;(1L &lt;&lt; N)
+var totalValue = nums
+    .collect{ BitSet.valueOf(it) }
+    .findAll{ mask -&gt; mask.stream().reduce(1) {a, b -&gt; a | a &lt;&lt; 
weights[b] } &amp; maskW }
+    .findAll{ mask -&gt; mask.stream().map(idx -&gt; weights[idx]).reduce(0, 
Integer::sum) &lt;= W }
+    .collect{ mask -&gt; nums.indices.sum{ idx -&gt; mask[idx] ? values[idx] : 
0 } }
+    .max()
+println "Total value for capacity $W = $totalValue"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which has the same output for this case study,
+so luckily, our crude optimisation step didn&#8217;t reject the best 
solution.</p>
+</div>
+<div class="paragraph">
+<p>Groovy 5 adds support for <code>&lt;&lt;</code> (left 
shift),<code>&gt;&gt;</code> (right shift),
+and <code>&gt;&gt;&gt;</code> (right shift unsigned) operators for bitsets.
+This kind of functionality will make working on such
+problems even nicer with Groovy.</p>
+</div>
 </div>
 </div>
 <div class="sect1">
 <h2 id="_using_constraint_programming">Using Constraint Programming</h2>
 <div class="sectionbody">
+<div class="paragraph">
+<p>Another technique we could consider is constraint programming.
+Here we define some constraints and let a solver find solutions
+for us. Here we have used the Choco solver.</p>
+</div>
+<div class="paragraph">
+<p>We thought we would also spice up the example and illustrate
+what is known as the bounded knapsack problem. Instead of
+either taking the gem or leaving it out, we now consider
+gems to be readily available commodities and the weight and
+value would apply to all gems of a particular type.</p>
+</div>
+<div class="paragraph">
+<p>In our example, we&#8217;ll set the bound for our solver&#8217;s
+domain variables to be between <code>0</code> and <code>W</code>.
+We could easily set the upper bound to be <code>1</code> and
+we&#8217;d be back to the 0/1 knapsack problem.</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
@@ -436,6 +857,14 @@ new Model('KnapsackProblem').with {
 if (!found) println 'No solution'</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>We keep an array <code>counts</code> of solver variables,
+apply numerous constraints on the variables,
+tell the solver to maximise the <code>total</code> variable.</p>
+</div>
+<div class="paragraph">
+<p>When we run this script, it produces the following output:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>Total value for capacity 10 (unbounded) = 25, [count0 = 0, count1 = 5, 
count2 = 0, count3 = 0, count4 = 0]
@@ -443,6 +872,24 @@ Total value for capacity 10 (unbounded) = 30, [count0 = 0, 
count1 = 2, count2 =
 Total value for capacity 10 (unbounded) = 31, [count0 = 1, count1 = 0, count2 
= 3, count3 = 0, count4 = 0]</pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Here, the solver is finding solutions which satisfy the problem
+as we have specified it, and then tries to find better solutions.
+We should note that because we are allowing more than one of
+each gem, it isn&#8217;t surprising that our answer (31) is higher
+than our previous best answer (30).</p>
+</div>
+<div class="paragraph">
+<p>If we didn&#8217;t want to receive all solutions, we can simply
+ask for the best solution, or provide the solver with better
+search hints for the problem, to arrive at the best answer earlier.</p>
+</div>
+<div class="paragraph">
+<p>As it turns out, the set of constraints we set in place here to
+solve the knapsack problem, are so common, that Choco has a
+built-in <code>knapsack</code> method which sets multiple constraints
+for us. We could use it as follows:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
@@ -468,6 +915,9 @@ new Model('KnapsackProblem').with {
 if (!found) println 'No solution'</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Which when run has this output:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>Total value for capacity 10 (unbounded) = 30, Total weight taken = 10, 
[count0 = 0, count1 = 2, count2 = 2, count3 = 0, count4 = 0]
@@ -479,6 +929,10 @@ Total value for capacity 10 (unbounded) = 31, Total weight 
taken = 10, [count0 =
 <div class="sect1">
 <h2 id="_using_ortools">Using OrTools</h2>
 <div class="sectionbody">
+<div class="paragraph">
+<p>Other libraries also have built-in solvers for knapsack.
+Here is another implementation using the OrTools library:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code 
data-lang="groovy">Loader.loadNativeLibraries()
@@ -508,6 +962,9 @@ println "Gems taken: $packedItems"
 println "Gem weights: $packedWeights"</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Which when run has this output:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>Total value for capacity 10 = 30
@@ -521,11 +978,28 @@ Gem weights: [2, 3, 5]</pre>
 <div class="sect1">
 <h2 id="_using_jenetics">Using Jenetics</h2>
 <div class="sectionbody">
+<div class="paragraph">
+<p>We can also use Genetic Algorithms to find a solution.
+When creating solutions based on genetic algorithms,
+a series of steps take place which mimic evolution
+in nature. We typically start with some random guesses,
+which we regard as the first generation of children.
+We have functions to test the fitness of individuals,
+processes to select a new generation of children based
+on the current generation, steps for mutation and so forth.</p>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll start by creating a record to track our weights and values:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">record Item(int 
weight, int value) implements Serializable {}</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>We&#8217;ll create a <code>Knapsack</code> class to keep track of state
+and provide our fitness function:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">class Knapsack 
implements Problem&lt;ISeq&lt;Item&gt;, BitGene, Integer&gt; {
@@ -552,6 +1026,19 @@ Gem weights: [2, 3, 5]</pre>
 }</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>We create our genetic algorithm engine and
+configure it work out how the next generation
+will be selected, and what mutations, if any,
+might be used to provide random alterations.</p>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll also create a <code>log</code> function to output some
+information as our various generations are being produced.</p>
+</div>
+<div class="paragraph">
+<p>Here is the script:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">int W = 10
@@ -586,6 +1073,9 @@ var best = engine.stream()
 println best</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Which when run produces this output:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>avg = 18.88, best = 23
@@ -603,6 +1093,9 @@ avg = 30.00, best = 30
 [00001110] -&gt; 30</pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Since it is random, subsequent runs may produce different results:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>avg = 16.75, best = 27
@@ -616,11 +1109,38 @@ avg = 26.88, best = 27
 [00010100] -&gt; 27</pre>
 </div>
 </div>
+<div class="paragraph">
+<p>As we can see here, we aren&#8217;t guaranteed to get the optimal
+solution with all genetic algorithm problems.</p>
+</div>
+<div class="paragraph">
+<p>What we should notice is that while the process involves
+various random aspects, and we might sometimes actually kill off
+best individuals, if we have configured
+our algorithm correctly, we should see that the average
+and best fitness values go up over time.</p>
+</div>
 </div>
 </div>
 <div class="sect1">
 <h2 id="_using_greedy_selection">Using Greedy selection</h2>
 <div class="sectionbody">
+<div class="paragraph">
+<p>The final example we will look at is the "optimal" or "greedy"
+solution. Here we take the items in order of best value/weight.
+If we allowed a fractional value greater than 1, we&#8217;d
+just use the first item in this sorted list, but here we&#8217;ll
+have a maximum of 1 for any item.</p>
+</div>
+<div class="paragraph">
+<p>For this problem, instead of gems, which might indeed be hard to split
+(or at least split and not devalue significantly),
+you might instead think of exotic spices, or some other
+valuable which can be readily divided.</p>
+</div>
+<div class="paragraph">
+<p>Here is the code:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy">int[] values = [1, 
5, 10, 15, 17]  // Gem values
@@ -646,12 +1166,19 @@ println taken
 printf 'Total value for capacity %d (with fractions) = %6.3f%n', W, 
total</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>Which when run has this output:</p>
+</div>
 <div class="listingblock">
 <div class="content">
 <pre>[2:1, 3:1, 4:0.3333333333]
 Total value for capacity 10 (with fractions) = 30.667</pre>
 </div>
 </div>
+<div class="paragraph">
+<p>It is not unexpected that we can obtain a value greater than 30
+when allowing fractional amounts of the valuables.</p>
+</div>
 </div>
 </div>
 <div class="sect1">
@@ -684,7 +1211,15 @@ Total value for capacity 10 (with fractions) = 
30.667</pre>
 <p><a href="https://www.hindawi.com/journals/mpe/2023/1742922/";>Solving the 
0/1 Knapsack Problem Using Metaheuristic and Neural Networks for the Virtual 
Machine Placement Process in Cloud Computing Environment</a></p>
 </li>
 <li>
-<p><a href="https://choco-solver.org/";>Choco home page</a></p>
+<p>Choco Solver: <a href="https://choco-solver.org/";>home page</a>,
+<a 
href="https://choco-solver.org/tutos/other-examples/the_knapsack_problem/";>a 
different knapsack example</a></p>
+</li>
+<li>
+<p>OR-Tools: <a href="https://developers.google.com/optimization";>home 
page</a>,
+<a href="https://developers.google.com/optimization/pack/knapsack";>a different 
knapsack example</a></p>
+</li>
+<li>
+<p><a 
href="https://www.boardinfinity.com/blog/branch-and-bound-algorithm/";>Branch 
And Bound Algorithm: Explained</a></p>
 </li>
 <li>
 <p><a href="https://github.com/paulk-asert/groovy-knapsack";>Example source 
code</a></p>
@@ -698,7 +1233,8 @@ Total value for capacity 10 (with fractions) = 30.667</pre>
 <div class="sectionbody">
 <div class="paragraph">
 <p>We have seen how to solve the knapsack problem in Groovy
-using several approaches.</p>
+using several approaches. In the references, there are even
+more exotic algorithms which can be used to solve the knapsack problem.</p>
 </div>
 </div>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-list-processing-cheat-sheet.html 
b/blog/groovy-list-processing-cheat-sheet.html
index bcaf411..1089dea 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-null-processing.html b/blog/groovy-null-processing.html
index c6cd93c..6c6be01 100644
--- a/blog/groovy-null-processing.html
+++ b/blog/groovy-null-processing.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 Processing Nulls In Lists</a></li><li><a 
href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a 
href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a 
list to remove its nulls</a></li><li><a href='#_producing_a_new_list_ [...]
+                        </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 Processing Nulls In Lists</a></li><li><a 
href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a 
href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a 
list to remove its nulls</a></li><li><a href='#_producing_a_new_list_ [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This <a 
href="https://www.programmergirl.com/java-remove-nulls-from-list/";>article</a> 
by <a href="https://www.programmergirl.com/about-me/";>Shubhra Srivastava</a>
diff --git a/blog/groovy-record-performance.html 
b/blog/groovy-record-performance.html
index af15213..1b1beb1 100644
--- a/blog/groovy-record-performance.html
+++ b/blog/groovy-record-performance.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 Record Performance</a></li><li><a href='#_our_domain' 
class='anchor-link'>Our domain</a></li><li><a href='#_performance_of_hashcode' 
class='anchor-link'>Performance of <code>hashCode</code></a></li><li><a 
href='#_performance_of_equals' class='anchor-link'>Performanc [...]
+                        </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 Record Performance</a></li><li><a href='#_our_domain' 
class='anchor-link'>Our domain</a></li><li><a href='#_performance_of_hashcode' 
class='anchor-link'>Performance of <code>hashCode</code></a></li><li><a 
href='#_performance_of_equals' class='anchor-link'>Performanc [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>We highly recommend the excellent
diff --git a/blog/groovy-records.html b/blog/groovy-records.html
index ba8badf..e3c7ca7 100644
--- a/blog/groovy-records.html
+++ b/blog/groovy-records.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 Records</a></li><li><a href='#_introduction' 
class='anchor-link'>Introduction</a></li><li><a href='#_optional_enhancements' 
class='anchor-link'>Optional enhancements</a></li><li><a 
href='#_internal_details' class='anchor-link'>Internal details</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 Records</a></li><li><a href='#_introduction' 
class='anchor-link'>Introduction</a></li><li><a href='#_optional_enhancements' 
class='anchor-link'>Optional enhancements</a></li><li><a 
href='#_internal_details' class='anchor-link'>Internal details</a></li><li><a 
href='# [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>A common scenario when programming is the need to group together a bunch
diff --git a/blog/groovy-release-train-4-0.html 
b/blog/groovy-release-train-4-0.html
index 6a19937..7b40e38 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-7-released'>Groovy 2.5.7 Released</a></li><li><a 
href='./groovy-2-5-5- [...]
+                        </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 [...]
 <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/groovy-sequenced-collections.html 
b/blog/groovy-sequenced-collections.html
index 588c2da..786b431 100644
--- a/blog/groovy-sequenced-collections.html
+++ b/blog/groovy-sequenced-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'>Groovy and Sequenced Collections (JEP-431)</a></li><li><a 
href='#_sequenced_collections_summary' class='anchor-link'>Sequenced 
Collections Summary</a></li><li><a 
href='#_accessing_the_first_and_last_element' class='anchor-link'>Accessing the 
first and last element</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 and Sequenced Collections (JEP-431)</a></li><li><a 
href='#_sequenced_collections_summary' class='anchor-link'>Sequenced 
Collections Summary</a></li><li><a 
href='#_accessing_the_first_and_last_element' class='anchor-link'>Accessing the 
first and last element</a></li> [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>An exciting feature coming in JDK21 is
diff --git a/blog/helloworldemoji.html b/blog/helloworldemoji.html
index 237f194..8aadad4 100644
--- a/blog/helloworldemoji.html
+++ b/blog/helloworldemoji.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'>Hello World with Emojis</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='./set-operations-with-groovy'>Set Operators with Groovy</a></li><li><a 
href='./deep-learning-and-eclips [...]
+                        </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'>Hello World with Emojis</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 Eclipse 
Collections</a></li><li><a href='./z [...]
 <p>In a <a 
href="https://groovy.apache.org/blog/jvm-hello-world-with-groovy";>previous blog 
post</a>
 we took an in-depth look at how to write a "hello world" class at the bytecode 
level
 using various libraries.</p>
diff --git a/blog/index.html b/blog/index.html
index de90ca4..502ea40 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='groovy-delegation'>Using the 
Delegation Pattern with Groovy</a></li><li><a href='groovy-typecheckers'>Groovy 
Type Checkers</a></li><li><a href='seasons-greetings-emoji'>Season&#8217;s 
Greetings with Emojis</a></li><li><a href='groovy-gatherers'>Using Gatherer 
[...]
+                        </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='groovy-delegation'>Using the 
Delegation Pattern with Groovy</a></li><li><a href='groovy-typecheckers'>Groovy 
Type Checkers</a></li><li><a href='seasons-greetings-emoji'>Season&#8217;s 
Greetings with Emojis</a></li><li><a href='groovy-gatherers'>Using Gatherer 
[...]
                             <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: "concurrency", value: 2 }, { category: "groovy", 
value: 75 }, { category: "actors", value: 2 }, { category: "pekko", value: 1 }, 
{ category: "gpars", value: 2 }, { category: "calendar", value: 1 }, { 
category: "date", value: 3 }, { category: "jsr310", value: 1 }, { category: 
"time", value: 1 }, { category: "data science", value: 7 }, { category: 
"eclipse collections", value: 9 }, { category: "kmeans", value: 3 }, { 
category: "emoji", value: 7 }, { category: "v [...]
+                { category: "centroids", value: 1 }, { category: "data 
science", value: 7 }, { category: "groovy", value: 75 }, { category: "kmeans", 
value: 3 }, { category: "records", value: 7 }, { category: "apache spark", 
value: 1 }, { category: "apache wayang", value: 1 }, { category: "release", 
value: 25 }, { category: "clibuilder", value: 1 }, { category: "picocli", 
value: 1 }, { category: "commons cli", value: 1 }, { category: "asf", value: 1 
}, { category: "apachecon", value: 2 } [...]
                 ]);
                 wc.labels.template.setAll({
                     paddingTop: 5,
diff --git a/blog/lego-bricks-with-groovy.html 
b/blog/lego-bricks-with-groovy.html
index efaea4e..f922b38 100644
--- a/blog/lego-bricks-with-groovy.html
+++ b/blog/lego-bricks-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'>Lego Bricks with Groovy</a></li><li><a 
href='#_basic_collection_processing' class='anchor-link'>Basic Collection 
Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our 
example domain</a></li><li><a href='#_some_bricks_to_play_with' 
class='anchor-link [...]
+                        </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'>Lego Bricks with Groovy</a></li><li><a 
href='#_basic_collection_processing' class='anchor-link'>Basic Collection 
Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our 
example domain</a></li><li><a href='#_some_bricks_to_play_with' 
class='anchor-link [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><a href="https://twitter.com/TheDonRaab";>Donald Raab</a> has continued has 
interesting
diff --git a/blog/matrix-calculations-with-groovy-apache.html 
b/blog/matrix-calculations-with-groovy-apache.html
index 531ee69..0c2f479 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 18e3fce..0c3078d 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 e9bf532..a635946 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/seasons-greetings-emoji.html 
b/blog/seasons-greetings-emoji.html
index 3da861a..bebff77 100644
--- a/blog/seasons-greetings-emoji.html
+++ b/blog/seasons-greetings-emoji.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'>Season&#8217;s Greetings with Emojis</a></li><li><a 
href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New 
Features</a></li><li><a href='#_playing_with_emojis_with_groovy' 
class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a 
href='#_more_information' cla [...]
+                        </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'>Season&#8217;s Greetings with Emojis</a></li><li><a 
href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New 
Features</a></li><li><a href='#_playing_with_emojis_with_groovy' 
class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a 
href='#_more_information' cla [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>In a <a href="https://groovy.apache.org/blog/helloworldemoji";>previous blog 
post</a>
diff --git a/blog/set-operations-with-groovy.html 
b/blog/set-operations-with-groovy.html
index 5fc82c3..f083cbf 100644
--- a/blog/set-operations-with-groovy.html
+++ b/blog/set-operations-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'>Set Operators 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='./deep-learning-and-eclipse-collections'>Deep Learning and 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'>Set Operators 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='./deep-learning-and-eclipse-collections'>Deep Learning and Eclipse 
Collections</a></li><li><a href='. [...]
 <p><a href="https://twitter.com/TheDonRaab";>Donald Raab</a> posted <a 
href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b";>an
 article</a> about set operators using Java collections and <a 
href="https://github.com/eclipse/eclipse-collections";>Eclipse Collections</a>. 
<a 
href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b";>That
 post</a> focuses
 on the <em>union</em>, <em>intersection</em> and <em>difference</em> 
operators. We&#8217;ll add in
 <em>symmetric difference</em> since Groovy supports operator overloading for 
that
diff --git a/blog/using-groovy-with-apache-wayang.html 
b/blog/using-groovy-with-apache-wayang.html
index c236b71..2bb9800 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 b36c86c..f2d1a20 100644
--- a/blog/whiskey-clustering-with-groovy-and.html
+++ b/blog/whiskey-clustering-with-groovy-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'>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>,
diff --git a/blog/wordle-checker.html b/blog/wordle-checker.html
index 2c5a46b..3de2993 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='./groovy-list-proce [...]
+                        </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 [...]
 <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 47bbe7c..41c9afa 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">

Reply via email to