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