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 fea5c16 2024/03/13 22:42:09: Generated dev website from groovy-website@340c493 fea5c16 is described below commit fea5c168262b81af0d2d469bf7d3e6b68e4a304a Author: jenkins <bui...@apache.org> AuthorDate: Wed Mar 13 22:42:09 2024 +0000 2024/03/13 22:42:09: Generated dev website from groovy-website@340c493 --- blog/adventures-with-groovyfx.html | 2 +- blog/classifying-iris-flowers-with-deep.html | 2 +- blog/comparators-and-sorting-in-groovy.html | 2 +- blog/deck-of-cards-with-groovy.html | 2 +- blog/deep-learning-and-eclipse-collections.html | 2 +- blog/detecting-objects-with-groovy-the.html | 2 +- blog/fruity-eclipse-collections.html | 2 +- blog/fun-with-obfuscated-groovy.html | 2 +- blog/gmavenplus-1-6-2-released.html | 2 +- blog/gpars-meets-virtual-threads.html | 2 +- blog/groovy-2-4-16-released.html | 2 +- blog/groovy-2-4-16-windows.html | 2 +- blog/groovy-2-4-17-released.html | 2 +- blog/groovy-2-5-0-released.html | 2 +- blog/groovy-2-5-1-released.html | 2 +- blog/groovy-2-5-2-released.html | 2 +- blog/groovy-2-5-2-windows.html | 2 +- blog/groovy-2-5-3-released.html | 2 +- blog/groovy-2-5-3-windows.html | 2 +- blog/groovy-2-5-4-released.html | 2 +- blog/groovy-2-5-4-windows.html | 2 +- blog/groovy-2-5-5-released.html | 2 +- blog/groovy-2-5-5-windows.html | 2 +- blog/groovy-2-5-6-released.html | 2 +- blog/groovy-2-5-7-and.html | 2 +- blog/groovy-2-5-7-released.html | 2 +- blog/groovy-2-5-clibuilder-renewal.html | 2 +- blog/groovy-3-0-0-alpha.html | 2 +- blog/groovy-3-0-0-alpha1.html | 2 +- blog/groovy-3-0-0-beta.html | 2 +- blog/groovy-3-0-0-beta1.html | 2 +- blog/groovy-3-0-0-beta2.html | 2 +- blog/groovy-4-0-3-released.html | 2 +- blog/groovy-dauphine.html | 2 +- blog/groovy-haiku-processing.html | 2 +- blog/groovy-list-processing-cheat-sheet.html | 2 +- blog/groovy-null-processing.html | 2 +- blog/groovy-record-performance.html | 2 +- blog/groovy-records.html | 2 +- blog/groovy-release-train-4-0.html | 2 +- blog/groovy-sequenced-collections.html | 2 +- blog/helloworldemoji.html | 2 +- blog/img/GoogleSheetsDietData.png | Bin 0 -> 49776 bytes blog/img/GoogleSheetsDietOpenSolver.png | Bin 0 -> 38878 bytes blog/index.html | 2 +- blog/lego-bricks-with-groovy.html | 2 +- blog/matrix-calculations-with-groovy-apache.html | 2 +- blog/parsing-json-with-groovy.html | 2 +- blog/reading-and-writing-csv-files.html | 2 +- blog/seasons-greetings-emoji.html | 2 +- blog/set-operations-with-groovy.html | 2 +- ...olving-cryptarithmetic-puzzles-with-groovy.html | 2 +- ...g-simple-optimization-problems-with-groovy.html | 608 +++++++++++++++++++++ blog/using-groovy-with-apache-wayang.html | 2 +- blog/whiskey-clustering-with-groovy-and.html | 2 +- blog/wordle-checker.html | 2 +- blog/working-with-sql-databases-with.html | 2 +- blog/zipping-collections-with-groovy.html | 2 +- 58 files changed, 663 insertions(+), 55 deletions(-) diff --git a/blog/adventures-with-groovyfx.html b/blog/adventures-with-groovyfx.html index baceda3..f302b18 100644 --- a/blog/adventures-with-groovyfx.html +++ b/blog/adventures-with-groovyfx.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Adventures with GroovyFX</a></li><li><a href='#_further_information' class='anchor-link'>Further information</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./set-operations-w [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Adventures with GroovyFX</a></li><li><a href='#_further_information' class='anchor-link'>Further information</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./helloworldemoji' [...] <div class="sectionbody"> <div class="paragraph"> <p>This blog looks at a <a href="http://groovyfx.org/">GroovyFX</a> version of a <a href="https://donraab.medium.com/my-weird-and-wonderful-first-adventures-with-javafx-6efe3b1923c8">ToDo application originally written in JavaFX</a>. diff --git a/blog/classifying-iris-flowers-with-deep.html b/blog/classifying-iris-flowers-with-deep.html index ef9a752..29bd25c 100644 --- a/blog/classifying-iris-flowers-with-deep.html +++ b/blog/classifying-iris-flowers-with-deep.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy and GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse DeepLe [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy and GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse DeepLe [...] <div class="sectionbody"> <div class="paragraph"> <p><span class="image right"><img src="img/iris_flowers.png" alt="iris flowers" width="200"></span> diff --git a/blog/comparators-and-sorting-in-groovy.html b/blog/comparators-and-sorting-in-groovy.html index 7450ca9..de0d89a 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 4fb5bc3..bf76666 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 ce1f676..2d3232c 100644 --- a/blog/deep-learning-and-eclipse-collections.html +++ b/blog/deep-learning-and-eclipse-collections.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model and data</a></li><li><a href='#_applying_deep_learning' class='anchor-link'>Applying deep learning</a></li></ul><br/><ul class='nav-sidebar' [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model and data</a></li><li><a href='#_applying_deep_learning' class='anchor-link'>Applying deep learning</a></li></ul><br/><ul class='nav-sidebar' [...] <div class="sectionbody"> <div class="paragraph"> <p>In previous blogs, we’ve covered diff --git a/blog/detecting-objects-with-groovy-the.html b/blog/detecting-objects-with-groovy-the.html index f98efe0..b776a3f 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/fruity-eclipse-collections.html b/blog/fruity-eclipse-collections.html index aa24d4d..9c254e2 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 5973bb9..0304c24 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='./groovy-record-performance'>Groovy Record Performance</a></li><li><a href='./matrix-calculations-wi [...] <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 733d6b8..5c6874a 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/gpars-meets-virtual-threads.html b/blog/gpars-meets-virtual-threads.html index 3f2c395..0a31ad0 100644 --- a/blog/gpars-meets-virtual-threads.html +++ b/blog/gpars-meets-virtual-threads.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'>GPars meets Virtual Threads</a></li><li><a href='#_parallel_collections' class='anchor-link'>Parallel Collections</a></li><li><a href='#_agents' class='anchor-link'>Agents</a></li><li><a href='#_actors' class='anchor-link'>Actors</a></li><li><a href='#_dataflow' class='anc [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>GPars meets Virtual Threads</a></li><li><a href='#_parallel_collections' class='anchor-link'>Parallel Collections</a></li><li><a href='#_agents' class='anchor-link'>Agents</a></li><li><a href='#_actors' class='anchor-link'>Actors</a></li><li><a href='#_dataflow' class='anc [...] <div class="sectionbody"> <div class="paragraph"> <p><span class="image right"><img src="img/gpars_logo.png" alt="gpars" width="150"></span> diff --git a/blog/groovy-2-4-16-released.html b/blog/groovy-2-4-16-released.html index e73238e..58aca54 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 203d2b3..33a2d7f 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 3714861..aabc2dc 100644 --- a/blog/groovy-2-4-17-released.html +++ b/blog/groovy-2-4-17-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.4.17 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a href='./groovy-2-4-16-windows'>Groovy 2. [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.4.17 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-4-16-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-0-released.html b/blog/groovy-2-5-0-released.html index d99c5ba..7d443f9 100644 --- a/blog/groovy-2-5-0-released.html +++ b/blog/groovy-2-5-0-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.0 released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.0 released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-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-1-released.html b/blog/groovy-2-5-1-released.html index 0d14fed..61efb21 100644 --- a/blog/groovy-2-5-1-released.html +++ b/blog/groovy-2-5-1-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-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-2-released.html b/blog/groovy-2-5-2-released.html index 5d8b75c..e1fbc37 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 f275cd9..973a6e0 100644 --- a/blog/groovy-2-5-2-windows.html +++ b/blog/groovy-2-5-2-windows.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.2 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.2 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 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 d5d3b7b..2015528 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 30a5964..c2210e0 100644 --- a/blog/groovy-2-5-3-windows.html +++ b/blog/groovy-2-5-3-windows.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.3 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.3 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 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 64de0cd..e8ea94d 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 6cc9a18..00166fb 100644 --- a/blog/groovy-2-5-4-windows.html +++ b/blog/groovy-2-5-4-windows.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.4 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.4 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-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 c445f73..cf6cef6 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 5824ed1..5ea68b3 100644 --- a/blog/groovy-2-5-5-windows.html +++ b/blog/groovy-2-5-5-windows.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.5 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-5-released'>Groovy 2.5.5 released</a></li><li><a href [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.5 Windows Installer Released (Community Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows Installer Released (C [...] <p>The Windows installer for Groovy 2.5.5 (community artifact) is available at: <a href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer" class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer</a></p> </div></div></div></div></div><footer id='footer'> diff --git a/blog/groovy-2-5-6-released.html b/blog/groovy-2-5-6-released.html index 709d6db..89d28a2 100644 --- a/blog/groovy-2-5-6-released.html +++ b/blog/groovy-2-5-6-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-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-7-and.html b/blog/groovy-2-5-7-and.html index 5f06e4f..0d17208 100644 --- a/blog/groovy-2-5-7-and.html +++ b/blog/groovy-2-5-7-and.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released (Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released< [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released (Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows In [...] <p>The Windows installer for Groovy 2.5.7 (Community Artifact) is now available from Bintray: <a href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer" class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer</a>.</p> </div> diff --git a/blog/groovy-2-5-7-released.html b/blog/groovy-2-5-7-released.html index be82fd6..7323ea3 100644 --- a/blog/groovy-2-5-7-released.html +++ b/blog/groovy-2-5-7-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released (Community Artifacts)</a></ [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released (Community Artifacts)</a></ [...] <p>Dear community,</p> </div> <div class="paragraph"> diff --git a/blog/groovy-2-5-clibuilder-renewal.html b/blog/groovy-2-5-clibuilder-renewal.html index 8ab7dd1..3ea22a6 100644 --- a/blog/groovy-2-5-clibuilder-renewal.html +++ b/blog/groovy-2-5-clibuilder-renewal.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Apache Groovy 2.5 CliBuilder Renewal</a></li><li><a href='#_the_code_groovy_util_clibuilder_code_class_is_deprecated' class='anchor-link'>The <code>groovy.util.CliBuilder</code> Class is Deprecated</a></li><li><a href='#_typed_options' class='anchor-link'>Typed Options</a> [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Apache Groovy 2.5 CliBuilder Renewal</a></li><li><a href='#_the_code_groovy_util_clibuilder_code_class_is_deprecated' class='anchor-link'>The <code>groovy.util.CliBuilder</code> Class is Deprecated</a></li><li><a href='#_typed_options' class='anchor-link'>Typed Options</a> [...] <div class="sectionbody"> <div class="paragraph"> <p>The <code>CliBuilder</code> class for quickly and concisely building diff --git a/blog/groovy-3-0-0-alpha.html b/blog/groovy-3-0-0-alpha.html index 708ee85..ea81bac 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 a91f96d..f418345 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 3acd736..7e26190 100644 --- a/blog/groovy-3-0-0-beta.html +++ b/blog/groovy-3-0-0-beta.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-beta2'>Gro [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-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 dd543a9..1d855f0 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 22e42b6..c36f6be 100644 --- a/blog/groovy-3-0-0-beta2.html +++ b/blog/groovy-3-0-0-beta2.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 3.0.0-beta-2 Windows Installer Released (Community Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha1'>Groovy 3.0.0-alpha-4 Windows Installe [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 3.0.0-beta-2 Windows Installer Released (Community Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-beta1'>Groovy 3.0.0-beta-2 Released</a></li>< [...] <p>The Windows installer for Groovy 3.0.0-beta-2 is now available from Bintray: <a href="https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe" class="bare">https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe</a></p> </div> diff --git a/blog/groovy-4-0-3-released.html b/blog/groovy-4-0-3-released.html index 043f2cf..1d06ce1 100644 --- a/blog/groovy-4-0-3-released.html +++ b/blog/groovy-4-0-3-released.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></li><li><a href='./groovy-2-5-4-windows'>Groovy 2 [...] <p>Dear community,</p> </div> <div class="paragraph"> diff --git a/blog/groovy-dauphine.html b/blog/groovy-dauphine.html index 196f1b5..f20eea8 100644 --- a/blog/groovy-dauphine.html +++ b/blog/groovy-dauphine.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Processing Results for the Critérium du Dauphiné</a></li><li><a href='#_results_file' class='anchor-link'>Results file</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./parsin [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Processing Results for the Critérium du Dauphiné</a></li><li><a href='#_results_file' class='anchor-link'>Results file</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./readin [...] <div class="sectionbody"> <div class="paragraph"> <p>The 2023 <a href="https://www.criterium-du-dauphine.fr/en/">Critérium du Dauphiné</a> diff --git a/blog/groovy-haiku-processing.html b/blog/groovy-haiku-processing.html index 3322da4..34767ed 100644 --- a/blog/groovy-haiku-processing.html +++ b/blog/groovy-haiku-processing.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Haiku processing</a></li><li><a href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1: Finding the distinct letters</a></li><li><a href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions' class='anchor-link'>Example 2: Splitt [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Haiku processing</a></li><li><a href='#_example_1_finding_the_distinct_letters' class='anchor-link'>Example 1: Finding the distinct letters</a></li><li><a href='#_example_2_splitting_letters_into_unique_and_duplicate_partitions' class='anchor-link'>Example 2: Splitt [...] <div class="sectionbody"> <div class="paragraph"> <p>This blog looks at some Groovy solutions for the examples in the diff --git a/blog/groovy-list-processing-cheat-sheet.html b/blog/groovy-list-processing-cheat-sheet.html index a9271ed..8c43925 100644 --- a/blog/groovy-list-processing-cheat-sheet.html +++ b/blog/groovy-list-processing-cheat-sheet.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy List Processing Cheat Sheet</a></li><li><a href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a href='#_list_elements_and_properties' class='anchor-link'>List elements and properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy List Processing Cheat Sheet</a></li><li><a href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a href='#_list_elements_and_properties' class='anchor-link'>List elements and properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...] <h2 id="_declaring_lists">Declaring lists</h2> <div class="sectionbody"> <div class="paragraph"> diff --git a/blog/groovy-null-processing.html b/blog/groovy-null-processing.html index 1507688..b2ec8bd 100644 --- a/blog/groovy-null-processing.html +++ b/blog/groovy-null-processing.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Processing Nulls In Lists</a></li><li><a href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a list to remove its nulls</a></li><li><a href='#_producing_a_new_list_ [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Processing Nulls In Lists</a></li><li><a href='#_libraries_covered' class='anchor-link'>Libraries covered</a></li><li><a href='#_mutating_a_list_to_remove_its_nulls' class='anchor-link'>Mutating a list to remove its nulls</a></li><li><a href='#_producing_a_new_list_ [...] <div class="sectionbody"> <div class="paragraph"> <p>This <a href="https://www.programmergirl.com/java-remove-nulls-from-list/">article</a> by <a href="https://www.programmergirl.com/about-me/">Shubhra Srivastava</a> diff --git a/blog/groovy-record-performance.html b/blog/groovy-record-performance.html index 96f0b11..42aec04 100644 --- a/blog/groovy-record-performance.html +++ b/blog/groovy-record-performance.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Record Performance</a></li><li><a href='#_our_domain' class='anchor-link'>Our domain</a></li><li><a href='#_performance_of_hashcode' class='anchor-link'>Performance of <code>hashCode</code></a></li><li><a href='#_performance_of_equals' class='anchor-link'>Performanc [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Record Performance</a></li><li><a href='#_our_domain' class='anchor-link'>Our domain</a></li><li><a href='#_performance_of_hashcode' class='anchor-link'>Performance of <code>hashCode</code></a></li><li><a href='#_performance_of_equals' class='anchor-link'>Performanc [...] <div class="sectionbody"> <div class="paragraph"> <p>We highly recommend the excellent diff --git a/blog/groovy-records.html b/blog/groovy-records.html index 429cfaf..34042b9 100644 --- a/blog/groovy-records.html +++ b/blog/groovy-records.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Records</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_optional_enhancements' class='anchor-link'>Optional enhancements</a></li><li><a href='#_internal_details' class='anchor-link'>Internal details</a></li><li><a href='# [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy Records</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_optional_enhancements' class='anchor-link'>Optional enhancements</a></li><li><a href='#_internal_details' class='anchor-link'>Internal details</a></li><li><a href='# [...] <div class="sectionbody"> <div class="paragraph"> <p>A common scenario when programming is the need to group together a bunch diff --git a/blog/groovy-release-train-4-0.html b/blog/groovy-release-train-4-0.html index 6344ff6..add709e 100644 --- a/blog/groovy-release-train-4-0.html +++ b/blog/groovy-release-train-4-0.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a href='./groovy-2-5-5- [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></li><li><a href='./groovy-2 [...] <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/groovy-sequenced-collections.html b/blog/groovy-sequenced-collections.html index 5aee316..a1e1080 100644 --- a/blog/groovy-sequenced-collections.html +++ b/blog/groovy-sequenced-collections.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy and Sequenced Collections (JEP-431)</a></li><li><a href='#_sequenced_collections_summary' class='anchor-link'>Sequenced Collections Summary</a></li><li><a href='#_accessing_the_first_and_last_element' class='anchor-link'>Accessing the first and last element</a></li> [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Groovy and Sequenced Collections (JEP-431)</a></li><li><a href='#_sequenced_collections_summary' class='anchor-link'>Sequenced Collections Summary</a></li><li><a href='#_accessing_the_first_and_last_element' class='anchor-link'>Accessing the first and last element</a></li> [...] <div class="sectionbody"> <div class="paragraph"> <p>An exciting feature coming in JDK21 is diff --git a/blog/helloworldemoji.html b/blog/helloworldemoji.html index 67f07ee..520c08c 100644 --- a/blog/helloworldemoji.html +++ b/blog/helloworldemoji.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Hello World with Emojis</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./set-operations-with-groovy'>Set Operators with Groovy</a></li><li><a href='./deep-learning-and-eclips [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Hello World with Emojis</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./deep-learning-and-eclipse-collections'>Deep Learning and Eclipse Collections</a></li><li><a href='./a [...] <p>In a <a href="https://groovy.apache.org/blog/jvm-hello-world-with-groovy">previous blog post</a> we took an in-depth look at how to write a "hello world" class at the bytecode level using various libraries.</p> diff --git a/blog/img/GoogleSheetsDietData.png b/blog/img/GoogleSheetsDietData.png new file mode 100644 index 0000000..4bfbaaf Binary files /dev/null and b/blog/img/GoogleSheetsDietData.png differ diff --git a/blog/img/GoogleSheetsDietOpenSolver.png b/blog/img/GoogleSheetsDietOpenSolver.png new file mode 100644 index 0000000..7c80bec Binary files /dev/null and b/blog/img/GoogleSheetsDietOpenSolver.png differ diff --git a/blog/index.html b/blog/index.html index 996905e..e11a96f 100644 --- a/blog/index.html +++ b/blog/index.html @@ -97,7 +97,7 @@ colors: am5.ColorSet.new(root, {}) })); wc.data.setAll([ - { category: "concurrency", value: 2 }, { category: "groovy", value: 75 }, { category: "actors", value: 2 }, { category: "pekko", value: 1 }, { category: "gpars", value: 2 }, { category: "calendar", value: 1 }, { category: "date", value: 3 }, { category: "jsr310", value: 1 }, { category: "time", value: 1 }, { category: "data science", value: 7 }, { category: "eclipse collections", value: 9 }, { category: "kmeans", value: 3 }, { category: "emoji", value: 7 }, { category: "v [...] + { category: "groovy", value: 75 }, { category: "emoji", value: 7 }, { category: "set", value: 1 }, { category: "constraint programming", value: 1 }, { category: "jacop", value: 1 }, { category: "or-tools", value: 1 }, { category: "choco", value: 2 }, { category: "jsr331", value: 1 }, { category: "bytecode", value: 1 }, { category: "byte buddy", value: 1 }, { category: "proguardcore", value: 1 }, { category: "asm", value: 1 }, { category: "jvmadvent", value: 1 }, { categor [...] ]); wc.labels.template.setAll({ paddingTop: 5, diff --git a/blog/lego-bricks-with-groovy.html b/blog/lego-bricks-with-groovy.html index 3702cd9..22012a5 100644 --- a/blog/lego-bricks-with-groovy.html +++ b/blog/lego-bricks-with-groovy.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Lego Bricks with Groovy</a></li><li><a href='#_basic_collection_processing' class='anchor-link'>Basic Collection Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our example domain</a></li><li><a href='#_some_bricks_to_play_with' class='anchor-link [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Lego Bricks with Groovy</a></li><li><a href='#_basic_collection_processing' class='anchor-link'>Basic Collection Processing</a></li><li><a href='#_our_example_domain' class='anchor-link'>Our example domain</a></li><li><a href='#_some_bricks_to_play_with' class='anchor-link [...] <div class="sectionbody"> <div class="paragraph"> <p><a href="https://twitter.com/TheDonRaab">Donald Raab</a> has continued has interesting diff --git a/blog/matrix-calculations-with-groovy-apache.html b/blog/matrix-calculations-with-groovy-apache.html index 2c53e23..67d7790 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 10a023d..fc04da2 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 ae32642..56a9e12 100644 --- a/blog/reading-and-writing-csv-files.html +++ b/blog/reading-and-writing-csv-files.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Reading and Writing CSV files with Groovy</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Reading and Writing CSV files with Groovy</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da [...] <h2 id="_introduction">Introduction</h2> <div class="sectionbody"> <div class="paragraph"> diff --git a/blog/seasons-greetings-emoji.html b/blog/seasons-greetings-emoji.html index dd475f3..e5a77ba 100644 --- a/blog/seasons-greetings-emoji.html +++ b/blog/seasons-greetings-emoji.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Season’s Greetings with Emojis</a></li><li><a href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New Features</a></li><li><a href='#_playing_with_emojis_with_groovy' class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a href='#_more_information' cla [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Season’s Greetings with Emojis</a></li><li><a href='#_jdk_21_new_features' class='anchor-link'>JDK 21 New Features</a></li><li><a href='#_playing_with_emojis_with_groovy' class='anchor-link'>Playing with Emojis with Groovy</a></li><li><a href='#_more_information' cla [...] <div class="sectionbody"> <div class="paragraph"> <p>In a <a href="https://groovy.apache.org/blog/helloworldemoji">previous blog post</a> diff --git a/blog/set-operations-with-groovy.html b/blog/set-operations-with-groovy.html index 1295ea4..049d685 100644 --- a/blog/set-operations-with-groovy.html +++ b/blog/set-operations-with-groovy.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Set Operators with Groovy</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./deep-learning-and-eclipse-collections'>Deep Learning and Eclipse Collections</a></li><li><a href='. [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Set Operators with Groovy</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./helloworldemoji'>Hello World with Emojis</a></li><li><a href='./deep-learning-and-eclipse-collectio [...] <p><a href="https://twitter.com/TheDonRaab">Donald Raab</a> posted <a href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b">an article</a> about set operators using Java collections and <a href="https://github.com/eclipse/eclipse-collections">Eclipse Collections</a>. <a href="https://donraab.medium.com/comparing-set-operations-between-java-and-eclipse-collections-92cf1df28d3b">That post</a> focuses on the <em>union</em>, <em>intersection</em> and <em>difference</em> operators. We’ll add in <em>symmetric difference</em> since Groovy supports operator overloading for that diff --git a/blog/solving-cryptarithmetic-puzzles-with-groovy.html b/blog/solving-cryptarithmetic-puzzles-with-groovy.html index 8f172c0..bf154f7 100644 --- a/blog/solving-cryptarithmetic-puzzles-with-groovy.html +++ b/blog/solving-cryptarithmetic-puzzles-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'>Solving cryptarithmetic puzzles with Groovy and constraint programming using Choco, JaCoP, and OR-Tools</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_cryptarithmetic_problems' class='anchor-link'>Cryptarithmetic Problems</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'>Solving cryptarithmetic puzzles with Groovy and constraint programming using Choco, JaCoP, and OR-Tools</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_cryptarithmetic_problems' class='anchor-link'>Cryptarithmetic Problems</a></ [...] <h2 id="_introduction">Introduction</h2> <div class="sectionbody"> <div class="paragraph"> diff --git a/blog/solving-simple-optimization-problems-with-groovy.html b/blog/solving-simple-optimization-problems-with-groovy.html new file mode 100644 index 0000000..20e49f5 --- /dev/null +++ b/blog/solving-simple-optimization-problems-with-groovy.html @@ -0,0 +1,608 @@ +<!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, optaplanner, timefold, ojalgo, jacop, or-tools, choco, commons math, hipparchus, linear programming'/><meta name='description' content='This post looks at solving simple optimization problems using Groovy.'/><title>The Apache Groovy programming language - Blogs - Solving simple optimization problems wi [...] +</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='https://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='https://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='https://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='https://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='https://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a href='/blog'>Blog pos [...] + <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'>Solving simple optimization problems with Groovy using Commons Math, Choco, JaCoP, Ojalgo, OptaPlanner, Timefold, and OR-Tools</a></li><li><a href='#_introduction' class='anchor-link'>Introduction</a></li><li><a href='#_case_study_diet_optimization' class='anchor-link'>Cas [...] +<h2 id="_introduction">Introduction</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>There are many problems involving optimization. +We’ll explore a case study which can be solved using linear optimization, +also known as +<a href="https://en.wikipedia.org/wiki/Linear_programming">linear programming</a>. +Linear programming problems optimize a particular linear objective +function subject to one or more linear equality and inequality constraints.</p> +</div> +<div class="paragraph"> +<p>We’ll look at such a problem and some libraries +and tools which can be used to solve them.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_case_study_diet_optimization">Case Study: Diet Optimization</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Let’s look at a case study where we try to minimize the cost of food +items in our diet, while still maintaining some overall constraints +which we might set for health or dietary preference reasons. +The example is inspired by +<a href="https://documentation.sas.com/doc/en/orcdc/14.2/ormpug/ormpug_lpsolver_examples01.htm">this SAS example</a>, +but see the <a href="#_further_information">Further Information</a> section for a more elaborate linear programming example, +the classic Stigler diet problem, solved using Google OR-Tools.</p> +</div> +<div class="paragraph"> +<p>First, here are six foods with their costs and nutritional +values that make up our diet:</p> +</div> +<table class="tableblock frame-all grid-all stretch"> +<colgroup> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 14.2858%;"> +</colgroup> +<tbody> +<tr> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Bread 🍞</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Milk 🥛</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Cheese 🧀</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Potato 🥔</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Fish 🐟</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Yogurt 🍶</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock">Cost</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">2.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">3.5</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">8.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">1.5</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">11.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock">Protein (g)</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">4.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">8.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">7.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">1.3</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">8.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">9.2</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock">Fat (g)</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">5.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">9.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">0.1</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">7.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock">Carbohydrates (g)</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">15.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">11.7</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">0.4</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">22.6</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">0.0</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">17.0</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock">Calories</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">90</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">120</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">106</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">97</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">130</p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">180</p></td> +</tr> +</tbody> +</table> +<div class="paragraph"> +<p>We want to minimize cost, while maintaining optimal nutrition, +where optimal will be defined as meeting the following criteria:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>Must be at least 300 calories</p> +</li> +<li> +<p>Not more than 10 grams of fat</p> +</li> +<li> +<p>Not less than 10 grams of carbohydrates</p> +</li> +<li> +<p>Not less than 8 grams of fat</p> +</li> +<li> +<p>At least 0.5 units of fish</p> +</li> +<li> +<p>No more than 1 unit of milk</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>Note, we don’t recommend this simplified set of constraints +as a real diet, it is only for illustrative purposes for our case study.</p> +</div> +<div class="paragraph"> +<p>Relating this back to our earlier definition of linear programming, +our list above represent our linear constraints. Our object function +is cost which is determined by the amount of each food multiplied +by its cost.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_solving_with_a_spreadsheet_solver">Solving with a spreadsheet solver</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>This kind of problem is so common that solvers exist even within spreadsheet applications. We’ll show a solution using the +<a href="https://opensolver.org/opensolver-for-google-sheets/">OpenSolver Add-on</a> for +<a href="https://www.google.com.au/sheets/about/">Google Sheets</a>. +But you can do the same thing using +<a href="https://speakerdeck.com/paulk/groovy-constraint-programming?slide=77">Microsoft Excel</a> if you prefer.</p> +</div> +<div class="paragraph"> +<p>First, we fill in the data for our problem. +It will be similar to the figure shown below, but initially, +the variable cells (blue) and objective cell (yellow) will be blank.</p> +</div> +<div class="paragraph"> +<p><span class="image"><img src="img/GoogleSheetsDietData.png" alt="Data"></span></p> +</div> +<div class="paragraph"> +<p>Then, using the OpenSolver extension, we identify by way +of cell ranges, our data (blue) and objective (yellow) cells, +as well as the constraints.</p> +</div> +<div class="paragraph"> +<p><span class="image"><img src="img/GoogleSheetsDietOpenSolver.png" alt="Solver" width="25%"></span></p> +</div> +<div class="paragraph"> +<p>Then we click "Solve" and it calculates our optimized value.</p> +</div> +<div class="paragraph"> +<p>Let’s look at solving this programmatically using Groovy. +Groovy provides a particularly nice environment for +scripting solutions to such problems, but for +the libraries we are using, it should be possible to use +most JVM languages.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_using_apache_commons_math_or_hipparchus">Using Apache Commons Math or Hipparchus</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Let’s now look at solving this problem using a simplex solver. +We’ll use the <code>SimplexSolver</code> class from Apache Commons +Math which is essentially the same as the one from Hipparchus +(a commons math fork).</p> +</div> +<div class="paragraph"> +<p>We’ll start with a little helper method for defining our constraints:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">static scalar(coeffs, rel, double val) { + new LinearConstraint(coeffs as double[], rel, val) +}</code></pre> +</div> +</div> +<div class="paragraph"> +<p>Next we define our individual constraints and the combined set:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">var milk_max = scalar([0, 1, 0, 0, 0, 0], LEQ, 1) +var fish_min = scalar([0, 0, 0, 0, 1, 0], GEQ, 0.5) +var protein = scalar([4.0, 8.0, 7.0, 1.3, 8.0, 9.2], LEQ, 10) +var fat = scalar([1.0, 5.0, 9.0, 0.1, 7.0, 1.0], GEQ, 8) +var carbs = scalar([15.0, 11.7, 0.4, 22.6, 0.0, 17.0], GEQ, 10) +var calories = scalar([90, 120, 106, 97, 130, 180], GEQ, 300) + +LinearConstraintSet constraints = [milk_max, fish_min, protein, fat, carbs, calories]</code></pre> +</div> +</div> +<div class="paragraph"> +<p>Each individual constraint has a coefficient for each food, +a relationship, and a value.</p> +</div> +<div class="paragraph"> +<p>Next, we define our cost function, and an additional constraint +to indicate that we can’t buy a negative amount of any food. +The <code>zeroOrMore</code> constraint saves us from doing the long-hand +equivalent, like <code>fish_min</code> but with a minimum of <code>0</code>, for each food.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">var cost = new LinearObjectiveFunction([2.0, 3.5, 8.0, 1.5, 11.0, 1.0] as double[], 0) + +var zeroOrMore = new NonNegativeConstraint(true)</code></pre> +</div> +</div> +<div class="paragraph"> +<p>Now, our solution is found by creating a new solver, and asking +it to optimize using our cost function and the constraints. +We then print our solution out:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">var solution = new SimplexSolver().optimize(cost, constraints, zeroOrMore) + +static pretty(int idx, double d) { + d ? [sprintf('%s %.2f', ['🍞', '🥛', '🧀', '🥔', '🐟', '🍶'][idx], d)] : [] +} + +if (solution != null) { + printf "Cost: %.2f%n", solution.value + println solution.point.indexed().collectMany(this::pretty).join(', ') +}</code></pre> +</div> +</div> +<div class="paragraph"> +<p>When run, it gives the following output:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>Cost: 12.08 +🥛 0.05, 🧀 0.45, 🥔 1.87, 🐟 0.50</pre> +</div> +</div> +<div class="paragraph"> +<p>This is the same solution as what we saw when using the spreadsheet.</p> +</div> +<div class="paragraph"> +<p>You can currently swap between Apache Commons Math and Hipparchus +by switching the Maven coordinates of the jar being used on the classpath +and changing a few import statements. This may change in future versions, +but for now:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>Using <code>org.apache.commons:commons-math3:3.6.1</code> gives an older stable version +of Commons Math, starting to show its age at 8 years old.</p> +</li> +<li> +<p>Using <code>org.apache.commons:commons-math4-legacy:4.0-beta1</code> +gives the latest version of these classes from Apache Commons Math. +The naming possibly deserves some explanation. There has been ongoing +effort to modularise Commons Math and there are numerous components +delivered as a result. The optimisation classes haven’t +been worked on yet and are available in the aforementioned artifact.</p> +</li> +<li> +<p>Using <code>org.hipparchus:hipparchus-optim:3.0</code> gives classes from the forked +project. For the classes we are using, there is essentially no difference +in the fork, but other parts of the library have seen useful updates +if you don’t mind having a dependency that isn’t backed by the ASF.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>If you don’t like those options, there are many more, here are a few +with Groovy solutions in the same repo:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>For a solution using the SCIP simplex solver in Google <a href="https://developers.google.com/optimization/lp">OR-Tools</a>, see <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietOrTools.groovy">DietOrTools.groovy</a></p> +</li> +<li> +<p>For a solution showing Groovy support within <a href="https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/proc/p1x8agymll9gten1ocziihptcjzj.htm">SAS</a>, see <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietGroovy.sas">DietGroovy.sas</a></p> +</li> +<li> +<p>For a solution using the LP solver in <a href="https://www.ojalgo.org/">ojAlgo</a>, see <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietOjalgo.groovy">DietOjalgo.groovy</a></p> +</li> +<li> +<p>For a solution using the <a href="https://choco-solver.org/">Choco</a> constraint programming solver, see <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietChocoInt.groovy">DietChocoInt.groovy</a> for a solution using scaled integers, and <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietChocoReal.groovy">DietChocoReal.groovy</a> for a solution with [...] +</li> +<li> +<p>For a solution using the <a href="https://github.com/radsz/jacop">JaCoP</a> constraint programming solver, see <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietJacopInt.groovy">DietJacopInt.groovy</a> for a solution using scaled integers, and <a href="https://github.com/paulk-asert/groovy-constraint-programming/blob/master/subprojects/Diet/src/main/groovy/DietJacopIntKnapsack.groovy">DietJacopIntKnapsack.groovy</a> [...] +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_using_optaplanner_or_timefold">Using OptaPlanner or Timefold</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">@PlanningEntity +@ToString(includePackage = false) +class Food { + String name + @PlanningVariable(valueRangeProviderRefs = "amount") + Integer amount // times 100 + double cost, protein, fat, carbs, calories +}</code></pre> +</div> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">@PlanningSolution +class DietSolution { + @PlanningEntityCollectionProperty + List<Food> foods + + @ValueRangeProvider(id = "amount") + CountableValueRange<Integer> getAmount() { + ValueRangeFactory.createIntValueRange(0, 200, 5) + } + + @PlanningScore + HardSoftScore score + + void display() { + foods.eachWithIndex { f, idx -> + var emoji = ['🍞', '🥛', '🧀', '🥔', '🐟', '🍶'] + println "${emoji[idx]} $f.name: ${f.amount / 100}" + } + for (name in ['fat', 'carbs', 'protein', 'calories', 'cost']) { + var total = foods.sum{ f -> f."$name" * f.amount / 100 } + printf "Total %s: %.2f%n", name, total + } + println "Score: $score" + } +}</code></pre> +</div> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">class DietConstraintProvider implements ConstraintProvider { + @Override + Constraint[] defineConstraints(ConstraintFactory factory) { + new Constraint[]{ + maxField(factory, 'protein', 10), + minField(factory, 'fat', 8), + minField(factory, 'carbs', 10), + minField(factory, 'calories', 300), + minFood(factory, 'Fish', 50), + maxFood(factory, 'Milk', 100), + minCost(factory), + } + } + + private static int amountOf(Food f, String name) { + (f."$name" * f.amount).toInteger() + } + + private static Constraint minField(ConstraintFactory factory, String fieldName, double minAmount) { + ToIntFunction<Food> amount = f -> amountOf(f, fieldName) + factory.forEach(Food) + .groupBy(sum(amount)) + .filter(fs -> fs < minAmount * 100) + .penalize(ONE_HARD) + .asConstraint("Min $fieldName") + } + + private static Constraint maxField(ConstraintFactory factory, String fieldName, double maxAmount) { + ToIntFunction<Food> amount = f -> amountOf(f, fieldName) + factory.forEach(Food) + .groupBy(sum(amount)) + .filter(fs -> fs > maxAmount * 100) + .penalize(ONE_HARD) + .asConstraint("Max $fieldName") + } + + private static Constraint minFood(ConstraintFactory factory, String foodName, double minAmount) { + factory.forEach(Food) + .filter(f -> f.name == foodName && f.amount < minAmount) + .penalize(ONE_HARD) + .asConstraint("Min $foodName") + } + + private static Constraint maxFood(ConstraintFactory factory, String foodName, double maxAmount) { + factory.forEach(Food) + .filter(f -> f.name == foodName && f.amount > maxAmount) + .penalize(ONE_HARD) + .asConstraint("Max $foodName") + } + + private static ToIntFunction<Food> totalCost = f -> (f.cost * f.amount).toInteger() + + private static Constraint minCost(ConstraintFactory factory) { + factory.forEach(Food) + .filter(f -> f.amount > 0) + .groupBy(sum(totalCost)) + .penalize(ONE_SOFT, fs -> fs >> 2) + .asConstraint('Min cost') + } +}</code></pre> +</div> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="prettyprint highlight"><code data-lang="groovy">def unsolved = new DietSolution(foods: [ + new Food(name: 'Bread', cost: 2.0, protein: 4.0, fat: 1.0, carbs: 15.0, calories: 90), + new Food(name: 'Milk', cost: 3.5, protein: 8.0, fat: 5.0, carbs: 11.7, calories: 120), + new Food(name: 'Cheese', cost: 8.0, protein: 7.0, fat: 9.0, carbs: 0.4, calories: 106), + new Food(name: 'Potato', cost: 1.5, protein: 1.3, fat: 0.1, carbs: 22.6, calories: 97), + new Food(name: 'Fish', cost: 11.0, protein: 8.0, fat: 7.0, carbs: 0.0, calories: 130), + new Food(name: 'Yogurt', cost: 1.0, protein: 9.2, fat: 1.0, carbs: 17.0, calories: 180) +]) + +def construction = new ConstructionHeuristicPhaseConfig(constructionHeuristicType: FIRST_FIT) +def moveSelector = new UnionMoveSelectorConfig([ + new ChangeMoveSelectorConfig(), + new SwapMoveSelectorConfig() +]) +def localSearch = new LocalSearchPhaseConfig(localSearchType: VARIABLE_NEIGHBORHOOD_DESCENT, + moveSelectorConfig: moveSelector) +def config = new SolverConfig() + .withSolutionClass(DietSolution) + .withEntityClasses(Food) + .withConstraintProviderClass(DietConstraintProvider) + .withPhases(construction, localSearch) + .withTerminationSpentLimit(Duration.ofSeconds(10)) + +def factory = SolverFactory.create(config) +def solver = factory.buildSolver() +def solved = solver.solve(unsolved) +solved.display()</code></pre> +</div> +</div> +<div class="paragraph"> +<p>It has this output when run:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>08:17:05.202 [main] INFO a.t.s.core.impl.solver.DefaultSolver - Solving started: time spent (25), best score (-6init/0hard/0soft), environment mode (REPRODUCIBLE), move thread count (NONE), random (JDK with seed 0). +08:17:05.385 [main] INFO a.t.s.c.i.c.DefaultConstructionHeuristicPhase - Construction Heuristic phase (0) ended: time spent (210), best score (-1hard/-521soft), score calculation speed (1355/sec), step total (6). +08:17:15.175 [main] INFO a.t.s.c.i.l.DefaultLocalSearchPhase - Local Search phase (1) ended: time spent (10000), best score (-1hard/-261soft), score calculation speed (155967/sec), step total (1030). +08:17:15.176 [main] INFO a.t.s.core.impl.solver.DefaultSolver - Solving ended: time spent (10000), best score (-1hard/-261soft), score calculation speed (152685/sec), phase total (2), environment mode (REPRODUCIBLE), move thread count (NONE). +🍞 Bread: 0.6 +🥛 Milk: 0.6 +🧀 Cheese: 0 +🥔 Potato: 0.4 +🐟 Fish: 0.5 +🍶 Yogurt: 1.05 +Total fat: 8.19 +Total carbs: 42.91 +Total protein: 21.38 +Total calories: 418.80 +Total cost: 10.45 +Score: -1hard/-261soft</pre> +</div> +</div> +<div class="paragraph"> +<p>It has this output when run:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>🍞 Bread: 0 +🥛 Milk: 0 +🧀 Cheese: 0.5 +🥔 Potato: 1.9 +🐟 Fish: 0.5 +🍶 Yogurt: 0 +Total fat: 8.19 +Total carbs: 43.14 +Total protein: 9.97 +Total calories: 302.30 +Total cost: 12.35 +Score: 0hard/-308soft</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_further_information">Further Information</h2> +<div class="sectionbody"> +<div class="ulist"> +<ul> +<li> +<p><a href="https://developers.google.com/optimization/lp">OR-Tools</a> linear optimization</p> +</li> +<li> +<p>A related but more elaborate example based on the <a href="https://developers.google.com/optimization/lp/stigler_diet">Stigler Diet</a> problem using Google OR-Tools</p> +</li> +<li> +<p>A Python <a href="https://www.kaggle.com/code/nbuhagiar/diet-optimization-with-or-tools">Diet example</a> also using Google OR-Tools</p> +</li> +<li> +<p>GitHub repos containing sample code: <a href="https://github.com/paulk-asert/groovy-constraint-programming/tree/master/subprojects/Diet">Diet</a> <a href="https://github.com/paulk-asert/groovy-constraint-programming/tree/master/subprojects/DietOptaPlanner">DietOptaPlanner</a> <a href="https://github.com/paulk-asert/groovy-constraint-programming/tree/master/subprojects/DietTimeflow">DietTimeflow</a></p> +</li> +</ul> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_conclusion">Conclusion</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>We have looked at using Groovy and a few linear optimization +libraries to solve a diet case study.</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='https://groovy-lang.org/learn.html'>Learn</a></li><li><a href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='https://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a href='/blog'>Blog posts</a></li><li><a href='https://groovy.apache.org/events.ht [...] + </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='https://groovy-lang.org/security.html'>Security</a></li><li><a href='https://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='https://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='https://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='https://groovy-lang.or [...] + </ul> + </div><div class='col-3'> + <h1>Socialize</h1><ul> + <li><a href='https://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='https://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='https://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow. [...] + </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-2024 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 [...] +</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 f03437d..04924fa 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 3e3cbf1..abdcc92 100644 --- a/blog/whiskey-clustering-with-groovy-and.html +++ b/blog/whiskey-clustering-with-groovy-and.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a href='#_whiskey_clustering' class='anchor-link'>Whiskey Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a href='#_whiskey_clustering' class='anchor-link'>Whiskey Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp [...] <div class="sectionbody"> <div class="paragraph"> <p>In a previous <a href="https://groovy.apache.org/blog/using-groovy-with-apache-wayang">blog post</a>, diff --git a/blog/wordle-checker.html b/blog/wordle-checker.html index 85bb151..9957455 100644 --- a/blog/wordle-checker.html +++ b/blog/wordle-checker.html @@ -53,7 +53,7 @@ </ul> </div> </div> - </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Checking Wordle with Groovy</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a href='./groovy-list-proce [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Checking Wordle with Groovy</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a href='./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/working-with-sql-databases-with.html b/blog/working-with-sql-databases-with.html index d4268dc..296831b 100644 --- a/blog/working-with-sql-databases-with.html +++ b/blog/working-with-sql-databases-with.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'>Working with SQL databases with Groovy and GraalVM</a></li><li><a href='#_native_metadata' class='anchor-link'>Native Metadata</a></li><li><a href='#_working_with_sql_in_groovy' class='anchor-link'>Working with SQL in Groovy</a></li><li><a href='#_configuring_our_native_bu [...] + </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Working with SQL databases with Groovy and GraalVM</a></li><li><a href='#_native_metadata' class='anchor-link'>Native Metadata</a></li><li><a href='#_working_with_sql_in_groovy' class='anchor-link'>Working with SQL in Groovy</a></li><li><a href='#_configuring_our_native_bu [...] <div class="sectionbody"> <div class="paragraph"> <p>During the week, there was an interesting diff --git a/blog/zipping-collections-with-groovy.html b/blog/zipping-collections-with-groovy.html index 59194cb..8f7df63 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">