tag:blogger.com,1999:blog-21500425048039295082024-03-14T09:32:04.319+00:00Tim PizeyLiving in Oxford, CyberspaceTim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.comBlogger144125tag:blogger.com,1999:blog-2150042504803929508.post-19909398488701665642024-02-22T19:42:00.002+00:002024-02-22T20:43:48.373+00:00REMEMBRANCE.md - Tombstones for git projects<p>
There is something wrong with the idea that git gives you confidence to delete.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd8nokT0_5mCWgEbOXeSn8xERArTgr_vZwFJxWTDKU8A_cu2NGSgPg5Iu0Ei2c-IdN6-Lh8ziQ6UxO-zDxlvEeI5DEZABLuZisyhvuoeZUKpNIHZRKGAeG1oqv52_V8aTYluDJfSOYOU6x4LI3_41BlxTaE9udVZRxywyYx1yivPGa60R16esrXJDRSWk/s1024/perl-tombstone.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd8nokT0_5mCWgEbOXeSn8xERArTgr_vZwFJxWTDKU8A_cu2NGSgPg5Iu0Ei2c-IdN6-Lh8ziQ6UxO-zDxlvEeI5DEZABLuZisyhvuoeZUKpNIHZRKGAeG1oqv52_V8aTYluDJfSOYOU6x4LI3_41BlxTaE9udVZRxywyYx1yivPGa60R16esrXJDRSWk/s320/perl-tombstone.jpg"/></a></div>
<p>
As so often this is from the perspective of the individual programmer.
</p>
<p>
Sure, you can delete your code and you can retreive it. Well done you, but you are relying on your memory.
</p>
<p>
Unlike mere programmers Developers are fully interchangeable members of a multi-decade team.
</p>
<h3>Tombstones</h3>
<p>
In the world of online publishing there is a concept of a 'tombstone' which is located at the URL of a retracted paper or any other entity removed for a reason. There are <a href="https://en.wikipedia.org/wiki/Tombstone_(disambiguation)">similar usages</a> in programming.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi3mZ-Sg8ff722ey1EgidWEq6K40SMg0o6eN78w-hn4dh-ZITDoqpYiqSOqiOLS3TG9Iil0glZ-IyGiL900i7GsiS-qNNftSm4ROV1GziJ6tFp78rQYQkXLPQHNWPRcYfS0XbT69wngpQlDSH8sojmo9VY_wXwtA76DMrAeHgwUodivTEQiFEItJ3aBbQ/s1024/pixlr-image-generator-7c0808a5-cea0-45a0-8138-0ed9032f37ad.png" style="display: block; padding: 1em 1em; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi3mZ-Sg8ff722ey1EgidWEq6K40SMg0o6eN78w-hn4dh-ZITDoqpYiqSOqiOLS3TG9Iil0glZ-IyGiL900i7GsiS-qNNftSm4ROV1GziJ6tFp78rQYQkXLPQHNWPRcYfS0XbT69wngpQlDSH8sojmo9VY_wXwtA76DMrAeHgwUodivTEQiFEItJ3aBbQ/s320/pixlr-image-generator-7c0808a5-cea0-45a0-8138-0ed9032f37ad.png"/></a></div>
<h3>A Book of Remembrance as a collection of Tombstones</h3>
<p>
My grandfather's ashes were, I believe, scattered at sea, but as a child I was impressed that he still had an entry in the Book of Remembrance at the Crematorium, which gave us a place to visit, and as my unsentimental Grandmother might have said, took up a lot less room.
</p>
<p>Now these remebrances are <a href="https://www.freebmd.org.uk/cgi/information.pl?scan=1&r=246033640:6595&d=bmd_1708534455">virtual</a>.
</p>
<h3>Gone but Not Forgotten</h3>
<p>
Even after using git for a long time Developers still do not delete modules, files or even lines of code. They comment them out, or just leave them in place, holding an enormous amount of context in their heads.
</p>
<p>
Let's not criticise them, lets take their concern seriously. They want to be able to find things themselves and for future Developers to know what was useful, even if it is not currently required.
</p>
<h3>REMEMBRANCE.md</h3>
<p>
At the top of every repository there HAS to be a README.md (or you get nagged by github); similarly we should add a <tt>REMEMBRANCE.md</tt> which takes the following form:
</p>
<pre><code>
| File | Date | Description and Reason for Deletion |
|---------------------|:----------:|:-------------------------------------------------------------|
| maven-tomcat-plugin | 2013-11-11 | An embedded Tomcat, for testing. The team just walked away |
| my-perl-script.pl | 2019-03-23 | A script to remove stones from horses hooves. Moving on up. |
| tpp-module | 2024-02-22 | Finished polishing, flushing now. |
</code></pre>
<h3>Lest We Forget</h3>
<table border=1 padding=2>
<caption>Example REMEMBRANCE.md</caption>
<tr>
<th>File</th><th>Date</th><th>Description and Reason for Deletion</th>
</tr>
<tr>
<td>maven-xxx-plugin </td><td> 2013-11-11 </td><td> An embedded Tomcat, for testing. The team just walked away </td>
</tr>
<tr>
<td>my-perl-script.pl </td><td> 2019-03-23 </td><td> A script to remove stones from horses hooves. Moving on up. </td>
</tr>
<tr>
<td>tpp-module </td><td> 2024-02-22 </td><td> Finished polishing, flushing now.</td>
</tr>
</table>
<p>
This simple practice will give Developers the confidence to delete and unleash the promise of clean projects that git offers.
</p>
<h4>PS Spelling</h4>
<p>It is Remembrance, not Rememberance, I looked it up, though I prefer Rememberance.
</p>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-71167913120364139072024-02-16T00:49:00.000+00:002024-02-16T00:49:09.601+00:00Melati Day - Twenty Five Year Anniversary<p>
Happy Melati Day!
</p>
<p>
On <b>February 16th 2000</b> WilliamC made the first commit to <a href="http://melati.org/">Melati</a>.
</p>
<p>
<a href="https://github.com/Melati/Melati/commit/7a6fb6762cdbb835b4ff1aeb987bf1671cc598bd">https://github.com/Melati/Melati/commit/7a6fb6762cdbb835b4ff1aeb987bf1671cc598bd</a>
</p>
<p>
<b><a href="http://paneris.org/pe2/MessagePage?db=paneris&id=16603"> The name ...</a></b> <br>
<pre>
Indonesia's national flowers: the melati (small white sweet smelling
flower) ...
:-)
Why it's a coffee variety (at my favourite shop here in The Hague) I
don't know---I'll ask her next time I'm in.
</pre>
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBptef1RXKPeziIVdcIPZwmp-rQUHH1qkj8rz2At7maYWUnsbuEO6xIENUNKFC75ffc7h7MwwiYdQyFmIyBzkad_DZuJQKnJ3cEEC367InIvDujEDzmgRTbLoinwDtqHZTSnHDRE8QTAmC9rGMQ_9Da5UMnba66tSDfi97IaV_ALIZFDUw3FEY8Cc3sks/s320/MelatiOne.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="240" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBptef1RXKPeziIVdcIPZwmp-rQUHH1qkj8rz2At7maYWUnsbuEO6xIENUNKFC75ffc7h7MwwiYdQyFmIyBzkad_DZuJQKnJ3cEEC367InIvDujEDzmgRTbLoinwDtqHZTSnHDRE8QTAmC9rGMQ_9Da5UMnba66tSDfi97IaV_ALIZFDUw3FEY8Cc3sks/s400/MelatiOne.jpg"/></a></div>
<p>
On 11th July that year we held <a href="http://paneris.org/pe2/MessagePage?db=paneris&id=24109">Melati One</a>.
</p>
<p>
PS Some five years later git was <a href="https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290">born</a>!
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-20979280580674551592024-01-25T22:15:00.001+00:002024-01-25T22:29:01.567+00:00Five Element Maven Version Numbering System (N5)<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOAR-zlKqwIMkKMinKJxxuUy5_ZEDzv8_8M59PCitwuxxN5xLXwPX6oloMa1kF5XX0SS3MqNCB6S-C8NMslu_CkWsb4Es3iYPQzmjsQIuqUFIipiWDOYgTnsTaIGdcd8m03ixn8kopzJQdV6u8xXAHo5c7RiY6o_Q8q7cxhIgFiSiWPy0VGrrF8eHT8vw/s4160/IMG_20200829_181403075.jpg" style="display: block; padding: 1em 1em; text-align: center; clear: left; float: left;"><img alt="Five element unique" border="0" width="320" data-original-height="3120" data-original-width="4160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOAR-zlKqwIMkKMinKJxxuUy5_ZEDzv8_8M59PCitwuxxN5xLXwPX6oloMa1kF5XX0SS3MqNCB6S-C8NMslu_CkWsb4Es3iYPQzmjsQIuqUFIipiWDOYgTnsTaIGdcd8m03ixn8kopzJQdV6u8xXAHo5c7RiY6o_Q8q7cxhIgFiSiWPy0VGrrF8eHT8vw/s320/IMG_20200829_181403075.jpg"/></a></div>
<p>
The Five Element Maven Version Numbering System (<b>N5</b>) addresses the problem of <a href="https://tim-pizey.blogspot.com/2023/11/unique-versions-as-pitons-out-of-maven.html">wack-a-mole Maven dependency management</a>: through the combination of excessive modularisation, microservices fervour, XML Declarative Project Object Models and non-unique (<a href="http://semver.org/">SemVer</a>) versioning enterprise Maven Java projects become unmanageable after about five years.
</p>
<p>
The <a href="https://tim-pizey.blogspot.com/2024/01/maven-version-schema-change.html">solution is a sequential identifier which is unique across the space</a>, and does not require xml parsing to modify.
</p>
<p>
My <a href="https://tim-pizey.blogspot.com/2024/01/maven-version-versions-and-regex-block.html">first three proposals</a> represent blundering steps towards the <b>N5</b> Maven Version numbering system.
</p>
<div class="separator" style="clear: both;"/>
<h4>N5 Unique Versioned Artifact Identifier (Maven version)</h4>
<table border=1>
<tr><th>\d</th><td>Code for project</td></tr>
<tr><th>\d\d\d</th><td>Code for repository</td></tr>
<tr><th>\d+</th><td>Major</td></tr>
<tr><th>\d+</th><td>Minor</td></tr>
<tr><th>\d+</th><td>Patch</td></tr>
</table>
<p>
The previous version, <b>N6</b>, included the Year between the Repository Code and the SemVer Major Version.
This was considered too much.
</p>
<p>
<b>2.130.2.0.6</b> works well with the Maven tooling and can be updated over the whole space using <a href="https://www.gnu.org/software/sed/manual/sed.html">sed</a>.
</p>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com1tag:blogger.com,1999:blog-2150042504803929508.post-3830160234353158402024-01-19T01:07:00.005+00:002024-01-19T09:54:03.997+00:00Maven Version Versions and a Regex Block Refactoring of Sequential Identifier<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ovbRsU3NM33tDlAu_x7E5mKt4rIFEYLv5jtzIwlJjauv5JRHKizg0NXDaRDwefyH6mVpMLJd8nzYFrqmIZBdbYJVRYgmHXSpg-QxN4yRzloj0Dst2ehY7EiIZoYvoNbjSCyE9jacy5voZXOItBSheEC6FsL7UaAbtV_JPq_Utp_GQVNox2Yxq4SHDzo/s1024/EngineeringEpiphany.jpg" style="display: block; padding: 1em 1em; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ovbRsU3NM33tDlAu_x7E5mKt4rIFEYLv5jtzIwlJjauv5JRHKizg0NXDaRDwefyH6mVpMLJd8nzYFrqmIZBdbYJVRYgmHXSpg-QxN4yRzloj0Dst2ehY7EiIZoYvoNbjSCyE9jacy5voZXOItBSheEC6FsL7UaAbtV_JPq_Utp_GQVNox2Yxq4SHDzo/s320/EngineeringEpiphany.jpg"/></a></div>
<p>
In the first post in this series I had thought about <a href="https://tim-pizey.blogspot.com/2023/11/unique-versions-as-pitons-out-of-maven.html"> the need for a globally unique incrementable artifect id</a>,
in the next post I not only designed but tested a proposal for such <a href="https://tim-pizey.blogspot.com/2024/01/maven-version-schema-change.html">a globally unique artifact id and how to change it</a>.
</p>
<p>
A triumph of thought and testing over trial and error.
</p>
<p>
So I tried using the new scheme with the <a href="https://maven.apache.org/maven-release/maven-release-plugin/index.html">Maven Release Plugin</a>.
</p>
<p>
A depressing journey into the rabbit hole that is <a href="https://apache.org/">Apache</a>, <a href="https://maven.apache.org/">Maven</a> and the <a href="https://maven.apache.org/maven-release/maven-release-plugin/index.html">Release Plugin</a>, a crucial tool in our pipeline.
</p>
<p>
It turns out that whilst the Maven Artifact Version I had tested against allowed my new scheme the Release Plugin has its own subset of such versions which are gate-kept by a Regular Expression.
</p>
<div class="separator" style="clear: both;">
<code><pre>
"^((?:\\d+\\.)*\\d+)" // digit(s) and '.' repeated followed by digit (version digits 1.22.0, etc)
+ "([-_])?" // optional - or _ (annotation separator)
+ "([a-zA-Z]*)" // alpha characters (looking for annotation - alpha, beta, RC, etc.)
+ "([-_])?" // optional - or _ (annotation revision separator)
+ "(\\d*)" // digits (any digits after rc or beta is an annotation revision)
+ "(?:([-_])?(.*?))?$"); // - or _ followed everything else (build specifier)
</pre></code>
<p>
This stops any version which does not start with digits and full stops from being recognised as a version.
</p>
<table border=1>
<tr>
<th>Current </th><th> Incremented </th><th>Outcome </th>
</tr>
<tr>
<td>VTW360-2023-1.0.3-SNAPSHOT </td><td>Unable to parse the version string </td><td>F</td>
</tr>
<tr>
<td>VTW360.2023.1.0.4-SNAPSHOT </td><td>Unable to parse the version string </td><td>F</td>
</tr>
<tr>
<td>VTW360-2023.1.0.4-SNAPSHOT </td><td>Unable to parse the version string </td><td>F</td>
</tr>
<tr>
<td>VTW-360-2023.1.0.14-SNAPSHOT </td><td>Unable to parse the version string </td><td>F</td>
</tr>
<tr>
<td>VTW-360.2023.1.0.16-SNAPSHOT </td><td>Unable to parse the version string </td><td>F</td>
</tr>
<tr>
<td>2023-VTW360-1.0.3-SNAPSHOT </td><td>2023-VTW361-1.0.4-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>2023|VTW-360|1.0.14 </td><td>Illegal characters in jar name </td><td>F</td>
</tr>
<tr>
<td>2023#VTW-360#1.0.14-SNAPSHOT </td><td>2024#VTW-360#1.0.14-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>2023.VTW-360.1.0.14-SNAPSHOT </td><td>2024.VTW-360.1.0.14-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>360.2023-1.0.15-SNAPSHOT </td><td>360.2023-2.0.15-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>2023.360.1.0.14-SNAPSHOT </td><td>2023.360.1.0.15-SNAPSHOT </td><td>Meh</td>
</tr>
<tr>
<td>1.0.19-VTW360-2023.SNAPSHOT </td><td>hangs </td><td>Eh?</td>
</tr>
<tr>
<td>1.0.19-VTW360-2023-SNAPSHOT </td><td>1.0.19-VTW361-2023-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>1.0.19-2023-VTW360-SNAPSHOT </td><td>1.0.19-2024-VTW360-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>1.0.19-YY24-VTW360-SNAPSHOT </td><td>1.0.19-YY25-VTW360-SNAPSHOT </td><td>F</td>
</tr>
<tr>
<td>1-0-19-2025-VTW360-SNAPSHOT </td><td>1-1-19-2025-VTW360-SNAPSHOT </td><td>Eh?</td>
</tr>
<tr>
<td>360.2023.1.0.16-SNAPSHOT </td><td>360.2023.1.0.17-SNAPSHOT </td><td>MKay</td>
</tr>
</table>
<h4>Proposal 3</h4>
<p>
So we are forced to allocate meaning to digits and place, never a good idea, but it is that or try and change the behaviour of the <a href="https://maven.apache.org/maven-release/maven-release-plugin/index.html">Release Plugin</a>, a task I do not think I have the time or the energy for.
</p>
<table border=1>
<tr><th>\d</th><td>code for project</td></tr>
<tr><th>\d\d\d</th><td>code for repository</td></tr>
<tr><th>\d\d\d\d</th><td>year</td></tr>
<tr><th>\d+</th><td>Major</td></tr>
<tr><th>\d+</th><td>Minor</td></tr>
<tr><th>\d+</th><td>Patch</td></tr>
</table>
<p>
I added the new proposal to <a href="https://github.com/timp/maven-version-comparison-test">the tests</a>, and wrote some more tests based upon the above regex.
</p>
<p>
We land with <b>2.130.2024.2.0.6</b>.
</p>
<p>
However much you think about the problem previous engineers will have constrained your choices.
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-7738396799463993622024-01-14T23:18:00.003+00:002024-01-15T00:36:26.375+00:00Maven version schema change<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGEmFLqAsAVh016aQKb7z3mSkI6Gb6gTZW427IRr3xNDBWbaktrT8UpHAkqP6qpXKLAJfnKIuzUrSbW9dY4H5ndeWddItEDcIiP3uBn7Ls1n3Jr_ogIuqI4hSNJqkkXcR9CG48C1z9uK40K_CcK5T3JsLr8PaNQh1qen6RjxMw79NDXoq4n1KlweLzAFo/s512/code-version-schema-change-hotpot-ai.png" style="display: block; padding: 1em 2em; text-align: center; clear: left; float: left;"><img alt="code version schema change - hotpot.ai" border="30" width="200" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGEmFLqAsAVh016aQKb7z3mSkI6Gb6gTZW427IRr3xNDBWbaktrT8UpHAkqP6qpXKLAJfnKIuzUrSbW9dY4H5ndeWddItEDcIiP3uBn7Ls1n3Jr_ogIuqI4hSNJqkkXcR9CG48C1z9uK40K_CcK5T3JsLr8PaNQh1qen6RjxMw79NDXoq4n1KlweLzAFo/s200/code-version-schema-change-hotpot-ai.png"/></a></div>
<p>
I <a href="https://tim-pizey.blogspot.com/2023/11/unique-versions-as-pitons-out-of-maven.html">proposed</a> a new versioning scheme to yield a unique version string for each artifact in our highly modularised Maven java application.
</p>
<p>
Currently we are running a classic <a href="https://semver.org/">SemVer</a> semantic verioning system.
The only shortcoming I can see with <b>SemVer</b> is that it is not globally unique.
In the Maven world the version is combined with the <b>artifactId</b> and the <b>groupId</b> to create a globally unique token, but because this is within an XML based Project Object Model (POM) file it is fairly difficult to get that token out without buying into the whole toolchain. As Maven allows ranges (<a href= "https://stackoverflow.com/questions/13004443/how-does-maven-sort-version-numbers#:~:text=DON%27T%20USE%20VERSION%20RANGES">don't use ranges</a>) and inheritance it is practically impossible for mortals to parse a pom correctly.
</p>
<h4>What problem are we trying to solve?</h4>
<p>
We want to be able to edit all poms across our collection with a single command to ensure that each version is completely deployed and we have no version clash. We have developed <a href="https://tim-pizey.blogspot.com/2023/09/making-maven-dependency-tree-readable.html">a tool to make the Maven Dependency Tree readable</a> which has allowed us to see how often the team make a change but do not fully roll it out.
</p>
<p>
The problem we are trying to solve is how to update all usages of an artifact every time it is updated, ensuring we never run with a mixture of versions (almost like a <a href="https://www.google.com/search?q=%23monolithsGood">Monolith</a>).
</p>
<p>
In the wider open source community it is not the responsibility of the library writer to ensure that every usage is updated to the latest version but within an enterprise it is.
</p>
<h4>Initial proposal</h4>
<p>
My first proposal, prepending the semantic version number with a unique code for the library, looked good:
</p>
<code><pre>
SMD110-3.0.8
</pre></code>
<p>
This system would work if we had started with this or if we were to backfill all previous versions, however we are proposing a change only to new versions and we have to ensure that the new versioing system will play nicely with the existing versions.
</p>
<p>
By play nicely I mean that <tt>SMD110-3.0.8</tt> should be understood to be more recent than <tt>3.0.7</tt>.
</p>
<p>
I had planned to test this by trial and error but then I thought to actually write a test.
</p>
<h4>Testing the proposal</h4>
<p>
I found the <a href="https://github.com/apache/maven/blob/master/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java">Maven verson comparison code</a> and wrote some <a href="https://github.com/timp/maven-version-comparison-test/blob/master/src/test/java/uk/pizey/ComparableVersionTest.java">tests</a>.
</p>
<p>
The tests revealed my assumption to be incorrect (whether this is a bug or not I am not sure), but the tests enabled me to propose a schema change which did play nicely:
</p>
<code><pre>
@Test
public void workableNextYearNewOldComparisonTest() {
ComparableVersion it = new ComparableVersion("2025-SMD130-2.0.7");
ComparableVersion previous = new ComparableVersion("2024-SMD130-2.0.6");
assertTrue(it.compareTo(previous) > 0);
assertTrue(previous.compareTo(previous) == 0);
assertTrue(previous.compareTo(it) < 0);
}
</pre></code>
<h4>Revised proposal</h4>
<p>
Prepending the initial proposal with the year is an improvement, the year of publication is useful and it works with the tooling:
</p>
<p>
<year>-<artefact code>-<semantic version>
</p>
<code><pre>
2024-SMD110-3.0.8
</pre></code>
<p>
Test your assumptions, it is easier than trial and error!
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-77508218170001140072023-11-30T00:38:00.009+00:002023-11-30T00:58:08.038+00:00Unique versions as pitons out of Maven Dependency Hell<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmKBuulIpaGCZmaqZinEalRdwrwHQwmzj1Snm8IoWpjIvwqqQ1_W7mJQsNQRVsCdQnoqMbpTt50s0QIKXX3I6kfEmW3JIJVw6NgO4HCZdrCXGiJLdzHJ_wh9-Vg-HgXRQCwXiNWzSOorfshxtIDSA9bdG0cnPW-vJ53ysfJfJXieHScPHz6rxdtt2d0ck/s1600/pitons.jpg" style="display: block; padding: 1em 2em; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1200" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmKBuulIpaGCZmaqZinEalRdwrwHQwmzj1Snm8IoWpjIvwqqQ1_W7mJQsNQRVsCdQnoqMbpTt50s0QIKXX3I6kfEmW3JIJVw6NgO4HCZdrCXGiJLdzHJ_wh9-Vg-HgXRQCwXiNWzSOorfshxtIDSA9bdG0cnPW-vJ53ysfJfJXieHScPHz6rxdtt2d0ck/s320/pitons.jpg"/></a></div>
<p>
The whole Maven ecosystem, and more, follows the <a href="https://semver.org/">Semantic Versioning</a> proposal from <a href="https://tom.preston-werner.com/">@mojombo</a> who made a success of being right about most things.
</p>
<p>
Even <a href="https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8903">Oracle</a> use it (no more <tt>ojdbc.jar</tt> for them).
</p>
<p>
The problem Semantic Versioning addressed was the opposing forces of
<dl>
<dt><b>version lock</b></dt><dd>the inability to upgrade a package without having to release new versions of every dependent package</dd>
<dt><b>version promiscuity</b></dt><dd>assuming compatibility with more future versions than is reasonable</dd>
</dl>
leading to <b>Dependency Hell</b>.
</p>
<p>
If that is the problem you have then Semantic Versioning will help.
Semantic Versioning helps you live within the Maven ecosystem, if you are contributing to that ecosystem then use Semantic Versioning.
</p>
<p>
That is not the problem that you have if you dug your very own Dependency Hell due to having a modularisation addiction.
<br>
If the problem you have given yourself is creating over a hundred inter-dependent modules because of your desire to obey the injunction <b><i>Do not Repeat Yourself (DRY)</i></b> within a modular microservice world the problem you have is achieving consistency.
</p>
<p>
The Semantic Version string MAJOR.MINOR.PATCH is not unique.
</p>
<p>
What is actually unique is ARTIFACT.MAJOR.MINOR.PATCH.
<br>
Or even uniquer (sic) GROUP.ARTIFACT.MAJOR.MINOR.PATCH.
</p>
<p>
This is given in the Maven Project Object Model (POM) eg <code><pre> <groupId>org.melati</groupId>
<artifactId>melati-parent</artifactId>
<version>0.8.0-SNAPSHOT</version>
</pre></code>
Using Maven and Java and yadayada you can parse this and get the actual unique identifier you want, but life is too short.
</p>
<p>
We want to use line based <tt>unix</tt> tools, <tt>grep</tt> and <tt>sed</tt>.
<p>
<h3>
Typical Semantic Version strings
</h3>
<code><pre>
3.0.7
6.0.8
2.0.5
2.0.1
5.0.4
2.0.2
1.0.2
1.0.2
2.0.7
1.1.16
3.0.1
1.0.2
1.0.2
5.0.1
5.0.1
5.0.2
5.0.1
</pre></code>
<p>
These are not all unique and those that are are accidentally unique.
</p>
<p>
Another way of achieving the same objective would be to duplicate the artifactId in the version.
<version>melati-13.0.15-SNAPSHOT</version>
</p>
<p>
Or to merely ban whitespace:
<code>
<artifactId>melati</artifactId><br>
<version>13.0.15-SNAPSHOT</version>
</code>
becomes
<code>
<artifactId>melati</artifactId><version>13.0.15-SNAPSHOT</version>
</code>
</p>
<p>
This is fragile: someone will reformat the POM using their IDE and it will fall apart.
</p>
<p>
To achieve uniqueness we will prepend with an Artifact Code, this code will retain the alphabetic ordering of the <tt>artifactId</tt> and be gappy so that we can insert new artifacts without breaking that ordering.
To make it easy to separate from the Semantic Version the code will be followed by a hyphen not a full stop.
</p>
<code><pre>
SMD110-3.0.8
SMD120-6.0.9
SMD130-2.0.6
SMD140-2.0.2
SMD150-5.0.5
SMD160-2.0.3
SMD170-1.0.3
SMD180-1.0.3
SMD190-2.0.8
SMD200-1.1.17
SMD210-3.0.2
SMD220-1.0.3
SMD230-1.0.3
SMD240-5.0.2
SMD250-5.0.1
SMD260-5.0.3
SMD270-5.0.2
</pre></code>
<p>
Now that we have a unique string we have pitons to climb out of the hell we dug for ourselves.
</p>
<code><pre>
find * -name pom.xml | \
grep -v target | \
xargs sed -b --in-place 's/old-unique-version/new-unique-version/g'
</pre></code>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com1tag:blogger.com,1999:blog-2150042504803929508.post-13148407049645136092023-09-28T00:13:00.004+01:002023-10-31T16:00:00.959+00:00Linux Laptop 2023 as a present<p>
My eldest has been using Linux on a 2012 macbook pro with 16GB and an SSD where the optical drive used to be, something she did herself whilst at school, so for her twenty first birthday I wanted to give her a new Linux laptop which she could be proud of and which also had my stamp on it.
</p>
<p>
I like Linux, OpenSource and plucky engineering, she likes sustainability and being able to run python simulations.
</p>
<p>
The problem with the macBook is that it feels like the wifi card is beginning to fail, the screen is cracked and it is heavy by today's expectations.
</p>
<p>
Canvassing the opinion of the remnants of the <a href="https://www.oxlug.org/">Oxford Linux Users Group</a> and googling gave me the following candidates.
</p>
<h2>Candidates</h2>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1beWXHtizNExNmj0EQvjVwc1TxSGS-rilW3szw9IHeoizwBnTqIEZVD490TEOykZ99vPzDmS30DMJtk9zgb0grJMscqh84xdFdM0fSUVHmDo9Htab0BDlzgx1BUMxiLrrPJtR2bJc0dzx4kWmCRRmg-7Nu-xLnLfAr2QfASPx370m3erxNQPu-G_7oUM/s509/Dell-XPS.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="402" data-original-width="509" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1beWXHtizNExNmj0EQvjVwc1TxSGS-rilW3szw9IHeoizwBnTqIEZVD490TEOykZ99vPzDmS30DMJtk9zgb0grJMscqh84xdFdM0fSUVHmDo9Htab0BDlzgx1BUMxiLrrPJtR2bJc0dzx4kWmCRRmg-7Nu-xLnLfAr2QfASPx370m3erxNQPu-G_7oUM/s320/Dell-XPS.png"/></a></div>
<h3>XPS 13 Plus Laptop</h3>
<p>
<a href="https://www.dell.com/en-uk/shop/cty/pdp/spd/xps-13-9320-laptop/" target=_>https://www.dell.com/en-uk/shop/cty/pdp/spd/xps-13-9320-laptop/</a>
</p>
<p>
A phenominal choice of screens, but a maximum of 32mb memory.
A three year old Dell laptop would be "pocket money prices", as will this be in three years.
Work will give you a Dell. Not a twenty first birthday present.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdnMTCZclKnATrcFc_JMS_TAr9wLYOhDkvaj7tKvCGeZXcJo-sW4fiNgWuwYUkQM_DzTe3DkH1G_54s6nw_Lhys9RQb7qEbinGhm7i4hFDwUCqneAsf6QRhAGA7jybGcwS8c6QZxcnxBylbeVLZQxdplcfDuzHeHFGPnxtTD_4W3mu5zvdxwD3kNEHJiU/s1558/System76-sectioncontent-slate-blue-galago.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1096" data-original-width="1558" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdnMTCZclKnATrcFc_JMS_TAr9wLYOhDkvaj7tKvCGeZXcJo-sW4fiNgWuwYUkQM_DzTe3DkH1G_54s6nw_Lhys9RQb7qEbinGhm7i4hFDwUCqneAsf6QRhAGA7jybGcwS8c6QZxcnxBylbeVLZQxdplcfDuzHeHFGPnxtTD_4W3mu5zvdxwD3kNEHJiU/s320/System76-sectioncontent-slate-blue-galago.png"/></a></div>
<h3>System76 Pangolin</h3>
<p>
<a href="https://system76.com/laptops/pangolin" target=_>https://system76.com/laptops/pangolin</a>
</p>
<p>
Not sure about the logo. Does not seem to believe the UK exists. 64GB not available. Shipping costs are high.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcVMoJwxmfM3fFIg2wRYh0LIFpQzn8uVcHqm6GquE-1trCO1p6X9p3Iz7Lq-oZxq2zcY2lZJDhV7HLC0D6w2JTpq6wHmPR4OxLMDem7A_6AbVlKOLi-RrG75tnMYEpCZSoIQ3krKuh-PzLwIaify3KPBZge-MSS1t7UPe6RpsFMG8sYCTTd_YwEAqbgUA/s1290/miuzv85s9l8se7jgdt31yr0xrpui.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" height="320" data-original-height="1290" data-original-width="1056" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcVMoJwxmfM3fFIg2wRYh0LIFpQzn8uVcHqm6GquE-1trCO1p6X9p3Iz7Lq-oZxq2zcY2lZJDhV7HLC0D6w2JTpq6wHmPR4OxLMDem7A_6AbVlKOLi-RrG75tnMYEpCZSoIQ3krKuh-PzLwIaify3KPBZge-MSS1t7UPe6RpsFMG8sYCTTd_YwEAqbgUA/s320/miuzv85s9l8se7jgdt31yr0xrpui.png"/></a></div>
<h3>Framework Laptop 13</h3>
<p>
<a href="https://frame.work/gb/en/products/laptop-diy-13-gen-amd" target=_>https://frame.work/gb/en/products/laptop-diy-13-gen-amd</a>
</p>
<p>
Runner up. Nice idea but I am not convinced anyone wants this in a laptop.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoZ3tXpesqEkPu9UvnnTRxZAYhC3nVXM_b3a7jn8QU1ZVNyg974TUUxQa9-VPyr-WtLQLZoYoxANI4p8j44ZY0A6QiwVwHhA9g75cQVgtS7Vq_OWdET7rOSajUWQfnFXPKId58nJzOAIu0-MrXlwvffRrr6fIeyh-47f-JqDlXpnTJLaFTI_gmKItAOZ4/s618/StarBook-2-Ubuntu-01x2000.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="327" data-original-width="618" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoZ3tXpesqEkPu9UvnnTRxZAYhC3nVXM_b3a7jn8QU1ZVNyg974TUUxQa9-VPyr-WtLQLZoYoxANI4p8j44ZY0A6QiwVwHhA9g75cQVgtS7Vq_OWdET7rOSajUWQfnFXPKId58nJzOAIu0-MrXlwvffRrr6fIeyh-47f-JqDlXpnTJLaFTI_gmKItAOZ4/s320/StarBook-2-Ubuntu-01x2000.png"/></a></div>
<h3>Starlabs Starbook</h3>
<p>
<a href="https://starlabs.systems/products/starbook" target=_>https://starlabs.systems/products/starbook</a>
</p>
<p>
Blue Cables; 64gb ram; pre-installed Ubuntu; British startup.
</p>
<p><b>Winner</b></p>
<hr/>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMUrg4SlfrgFErgKhrf9YaahLT4vQLP0HMyaPvmfV1LXqt1Bi6jeZ4Uv7_QI9Y4bRgXQL4XdaBfM-Lt_Nbnj5hK21ogLERiCVVDsgTnqELBjFiNNlmnrES2O5rWGAoUVJJp0Y8b1aFJtESfHoZSYDLOPJdghKHXKEsQGAypkwLvITZAtsQVrN64PgbF8/s3024/20231011_115840.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="3024" data-original-width="3024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMUrg4SlfrgFErgKhrf9YaahLT4vQLP0HMyaPvmfV1LXqt1Bi6jeZ4Uv7_QI9Y4bRgXQL4XdaBfM-Lt_Nbnj5hK21ogLERiCVVDsgTnqELBjFiNNlmnrES2O5rWGAoUVJJp0Y8b1aFJtESfHoZSYDLOPJdghKHXKEsQGAypkwLvITZAtsQVrN64PgbF8/s320/20231011_115840.jpg"/></a></div>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBzEdWD8Z4GKnWHLwXhqSj73DQYu6rYbKNsSKIjuX5chw2Rh7kgwE_sjE0vjMVEG1kdIFKlldqkXC84zmXzuO2A7oUXr4wC70OYP90CS_5AYIgRK-GD4N8uImJH5stTszy4XzXwEev1pNWCRiQ1p09RhzB_St4lsmNjZm-l4E_78HY-KVU3s-JsFv9ND4/s3024/20231029_124625.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="3024" data-original-width="3024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBzEdWD8Z4GKnWHLwXhqSj73DQYu6rYbKNsSKIjuX5chw2Rh7kgwE_sjE0vjMVEG1kdIFKlldqkXC84zmXzuO2A7oUXr4wC70OYP90CS_5AYIgRK-GD4N8uImJH5stTszy4XzXwEev1pNWCRiQ1p09RhzB_St4lsmNjZm-l4E_78HY-KVU3s-JsFv9ND4/s320/20231029_124625.jpg"/></a></div>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecvcaoTMZ_rmJHWrB7hsWYXQTyZ3DtU_i9cmiZRGDVblam-2Ob2tqSyZSp8YARNw5r96Oxnfy52yJZS2HSh1rMVNxt-OdRAjBYtlgM7EyMEoKay_Xkda3QbZ0KjCRmq6BXt0hyphenhypheniZN3uE4t4otYHrBuQ9PahoT5shzxSaUHZBwvatg_n8ukYm9ftc20Mc/s3024/20231029_124752.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="3024" data-original-width="3024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhecvcaoTMZ_rmJHWrB7hsWYXQTyZ3DtU_i9cmiZRGDVblam-2Ob2tqSyZSp8YARNw5r96Oxnfy52yJZS2HSh1rMVNxt-OdRAjBYtlgM7EyMEoKay_Xkda3QbZ0KjCRmq6BXt0hyphenhypheniZN3uE4t4otYHrBuQ9PahoT5shzxSaUHZBwvatg_n8ukYm9ftc20Mc/s320/20231029_124752.jpg"/></a></div>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlMe5tMJexqKV3rDhw4vol98J2sYhJvQiuu2GWPjXq3DKdpTtLEzZcv59wgZsdMF4WuBCgMagEdmb-v-_01tt3XEdO31342YsNyYpoUnTrVXuykeerKtfZurVMYIX2a1SRSQ19CkVCfVOp-P369VbkvRM3ZulHFUzp-uxP2ZfbFPoyF3s8zKTg7KSP-2w/s3024/20231029_151111.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="3024" data-original-width="3024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlMe5tMJexqKV3rDhw4vol98J2sYhJvQiuu2GWPjXq3DKdpTtLEzZcv59wgZsdMF4WuBCgMagEdmb-v-_01tt3XEdO31342YsNyYpoUnTrVXuykeerKtfZurVMYIX2a1SRSQ19CkVCfVOp-P369VbkvRM3ZulHFUzp-uxP2ZfbFPoyF3s8zKTg7KSP-2w/s320/20231029_151111.jpg"/></a></div>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-78098710358480439112023-09-16T16:14:00.005+01:002023-09-16T16:30:03.705+01:00Making maven dependency tree readable<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWiJuonqM2fIWdwv8zM_2fB50_YPOu4ELu9kNmA9GryDkmU5BBG0iEFwsrSS45AgTBwrSGaVP5hnfl2JNebwoIfbODIfPcq90JXslFZTmxmvilplHdDEX5TB_vjBUhF5w_RdDFvTkhyWgYN8HOd3aw8Ib11VwlBPz7Vqm6nV6SCiYl6Yu2aX1rZKFx5-0/s512/tall-tree-in-the-forest.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWiJuonqM2fIWdwv8zM_2fB50_YPOu4ELu9kNmA9GryDkmU5BBG0iEFwsrSS45AgTBwrSGaVP5hnfl2JNebwoIfbODIfPcq90JXslFZTmxmvilplHdDEX5TB_vjBUhF5w_RdDFvTkhyWgYN8HOd3aw8Ib11VwlBPz7Vqm6nV6SCiYl6Yu2aX1rZKFx5-0/s320/tall-tree-in-the-forest.jpg"/></a></div><p>
We have a super-POM which ties our POM forest into a tree.
It takes 24 minutes just to compile.
The dependency tree output is overwhelming, but the below leavs you with a fairly managable todo list of problems.
</p>
<p>
Assuming <b>org.my-project</b> for your package name
</p>
<pre><code>
mvn dependency:tree -Dverbose > tree.txt
cat tree.txt | \
grep -v Downloading | \
grep org.my-project | \
grep -v 'omitted for duplicate' | \
grep -v -E 'compile[^ ]' | \
grep -v -E 'test[^ ]' | \
grep -v -E 'runtime[^ ]' | \
grep -v -E 'provided[^ ]' | \
grep -v -E '\-SNAPSHOT[^ ]' | \
grep -v -E ':jar:([0-9]\.[0-9]\.[0-9]):provided \(version managed from \1\)' | \
grep -v -E ':jar:([0-9]\.[0-9]\.[0-9]):compile \(version managed from \1\)' | \
grep -v -E ':jar:([0-9][0-9]\.[0-9]\.[0-9]):compile \(version managed from \1\)' | \
grep -v -E ':jar:([0-9]\.[0-9]\.[0-9][0-9]):compile \(version managed from \1\)' | \
grep -v -E ':jar:([0-9][0-9]\.[0-9]\.[0-9][0-9]):compile \(version managed from \1\)' | \
grep -v -E ':jar:([0-9][0-9]\.[0-9]\.[0-9][0-9][0-9]):compile \(version managed from \1\)' \
> conflicts.txt
</code>
</pre>
Output:
<pre>
[WARNING] 'parent.relativePath' of POM org.my-project.api-registry:api-registry-parent:3.0.4-SNAPSHOT (api-registry\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.base:base, please verify your project structure @ line 5, column 13
[WARNING] 'parent.relativePath' of POM org.my-project:local-dynamodb-parent:4.2.10-SNAPSHOT (local-dynamodb\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.base:base-java8, please verify your project structure @ line 4, column 11
[WARNING] 'parent.relativePath' of POM org.my-project:local-mongodb-parent:5.0.1-SNAPSHOT (local-mongodb\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.base:base-java11, please verify your project structure @ line 5, column 13
[WARNING] 'parent.relativePath' of POM org.my-project.apps:apps:13.0.8-SNAPSHOT (apps\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.core.check:core-base, please verify your project structure @ line 5, column 13
[WARNING] 'parent.relativePath' of POM org.my-project.events.common:events-common-parent:11.12.22-SNAPSHOT (events-common\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.core.check:core-base, please verify your project structure @ line 5, column 13
[WARNING] 'parent.relativePath' of POM org.my-project.apps:events-processor:12.1.23-SNAPSHOT (events-processor\pom.xml) points at org.my-project:architecture-parent instead of org.my-project.core.check:core-base, please verify your project structure @ line 4, column 11
[WARNING] 'parent.relativePath' of POM org.my-project.kews:kews:1.0.0-SNAPSHOT (kews\pom.xml) points at org.my-project:architecture-parent instead of org.springframework.boot:spring-boot-starter-parent, please verify your project structure @ line 6, column 10
[INFO] ---------< org.my-project.api-registry:api-registry-parent >----------
[INFO] -------------< org.my-project.api-registry:api-registry >-------------
[INFO] ---------< org.my-project.api-registry:api-registry-jersey >----------
[INFO] ---------< org.my-project.api-registry:api-registry-spring >----------
[INFO] ------< org.my-project.audit.logging:audit-logging-parent >-------
[INFO] ----------< org.my-project.audit.logging:audit-logger-dao >-----------
[INFO] --------< org.my-project.audit.logging:audit-logger-stepdefs >--------
[INFO] -----< org.my-project.audit.logging:audit-logger-servlet-filter >-----
[INFO] -----< org.my-project.authentication:authentication-parent >------
[INFO] -------< org.my-project.authentication:authentication-service >-------
[INFO] -----< org.my-project.authentication:ucs-authentication-service >-----
[INFO] -------------------< org.my-project.base:base >-------------------
[INFO] -------------------< org.my-project:common-parent >-------------------
[INFO] ------------------< org.my-project:java-extension >-------------------
[INFO] ----------------< org.my-project:common-junit-parent >----------------
[INFO] --------------< org.my-project:common-dynamic-logging >---------------
[INFO] ------------------< org.my-project:pooled-rest-client >-------------------
[INFO] ------------------< org.my-project:api-client-library >-------------------
[INFO] ------< org.my-project.configuration:configuration-parent >-------
[INFO] -------< org.my-project.configuration:configuration-framework >-------
[INFO] ---< org.my-project.configuration:configuration-provider-mongodb >----
[INFO] --------< org.my-project.configuration:configuration-editor >---------
[INFO] --< org.my-project.format.support:content-profile-format-support-parent >--
[INFO] --< org.my-project.format.support:content-profile-format-support >--
[INFO] -----< org.my-project.format.support:format-support-parent >------
[INFO] ---------< org.my-project.format.support:format-support >---------
[INFO] ------< org.my-project.http.stepdefs:http-stepdefs-parent >-------
[INFO] ----------< org.my-project.http.stepdefs:http-stepdefs >----------
[INFO] -------< org.my-project.issuetracing:issuetracing-parent >--------
[INFO] -----------< org.my-project.issuetracing:issuetracing >-----------
[INFO] ---------< org.my-project.jmxsupport:jmxsupport-parent >----------
[INFO] -------------< org.my-project.jmxsupport:jmxnaming >--------------
[INFO] ---< org.my-project.format.support:json-format-support-parent >---
[INFO] ------< org.my-project.format.support:json-format-support >-------
[INFO] --< org.my-project.format.support:jsonld-format-support-parent >--
[INFO] -----< org.my-project.format.support:jsonld-format-support >------
[INFO] ---------------< org.my-project:local-dynamodb-parent >---------------
[INFO] ------------------< org.my-project:local-dynamodb >-------------------
[INFO] ------------< org.my-project:local-elasticsearch-parent >-------------
[INFO] ----------------< org.my-project:local-elasticsearch >----------------
[INFO] ---------------< org.my-project:local-mongodb-parent >----------------
[INFO] -------------------< org.my-project:local-mongodb >-------------------
[INFO] -----------------< org.my-project:local-sftp-parent >-----------------
[INFO] --------------------< org.my-project:local-sftp >---------------------
[INFO] -----------------< org.my-project:local-sqs-parent >------------------
[INFO] ---------------------< org.my-project:local-sqs >---------------------
[INFO] ----------------< org.my-project:localservers-parent >----------------
[INFO] --< org.my-project.microservicesexceptions:microservicesexceptions-parent >--
[INFO] --< org.my-project.microservicesexceptions:microservicesexceptions-interface >--
[INFO] --< org.my-project.microservicesexceptions:microservicesexceptions-exception-builder >--
[INFO] ----------< org.my-project.migration:migration-parent >-----------
[INFO] ---------< org.my-project.migration:migration-framework >---------
[INFO] ---------< org.my-project.migration:migration-dynamodb >----------
[INFO] ----------< org.my-project.migration:migration-mongodb >----------
[INFO] ------------< org.my-project.migration:migration-csv >------------
[INFO] -------< org.my-project.mongodb-client:mongodb-client-parent >--------
[INFO] -----------< org.my-project.mongodb-client:mongodb-client >-----------
[INFO] --< org.my-project.placeholder.stepdef.support:placeholder-stepdef-support-parent >--
[INFO] --< org.my-project.placeholder.stepdef.support:placeholder-stepdef-support >--
[INFO] --------< org.my-project.smd:queuelistener-container-parent >---------
[INFO] ------------< org.my-project.smd:queuelistener-container >------------
[INFO] | +- org.my-project:java-extension:jar:5.0.3:test (version managed from 5.0.3)
[INFO] --< org.my-project.format.support:separated-value-format-support-parent >--
[INFO] --< org.my-project.format.support:separated-value-format-support >--
[INFO] --------< org.my-project.timemachine:timemachine-parent >---------
[INFO] ------------< org.my-project.timemachine:timemachine >------------
[INFO] ---------< org.my-project.timemachine:timemachine-steps >---------
[INFO] -------------------< org.my-project.apps:apps >-------------------
[INFO] -------------< org.my-project.apps:workflow-common >--------------
[INFO] -----------------< org.my-project.apps:workflow >-----------------
[INFO] ---------------< org.my-project.apps:workflow-web >---------------
[INFO] -------< org.my-project.apps:events-router-state-checker >--------
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.19:compile - omitted for conflict with 17.0.3)
[INFO] -----------< org.my-project.apps:events-router-rules >------------
[INFO] | +- (org.my-project.events.common:events-router-common:jar:11.12.21:compile - omitted for conflict with 11.12.20)
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.19:compile - omitted for conflict with 17.0.3)
[INFO] -------------< org.my-project.apps:router-processor >-------------
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.19:compile - omitted for conflict with 17.0.3)
[INFO] --------------< org.my-project.apps:service-queue >---------------
[INFO] ----------< org.my-project.assertion:assertion-parent >-----------
[INFO] ----------< org.my-project.assertion:assertion-service >----------
[INFO] ------------< org.my-project.assertion:assertion-api >------------
[INFO] -------------< org.my-project.audit:audit-logger-parent >-------------
[INFO] ---------< org.my-project.audit:audit-logger-servlet-filter >---------
[INFO] -------< org.my-project.backfill:backfill-scripts-parent >--------
[INFO] -------< org.my-project.backfill:patents-backfill-scripts >-------
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:properties:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:aws-common:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:dataset-service:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.ucs:ucs-client:jar:1.2.1:compile - omitted for conflict with 1.1.6)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project:api-client-library:jar:3.1.0:compile - omitted for conflict with 5.0.3)
[INFO] ---< org.my-project.backfill:patents-backfill-scripts-mongodb >---
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:aws-common:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:properties:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:dataset-service:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.ucs:ucs-client:jar:1.2.1:compile - omitted for conflict with 1.1.6)
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project:api-client-library:jar:3.1.0:compile - omitted for conflict with 5.0.3)
[INFO] -----------------< org.my-project:backup-parent >-----------------
[INFO] ----------------< org.my-project:backup-service >-----------------
[INFO] | | | +- (org.my-project.jmxsupport:jmxnaming:jar:2.0.10:compile - omitted for conflict with 2.0.8)
[INFO] ----------< org.my-project.cel.service:cel-service-parent >-----------
[INFO] --------------< org.my-project.cel.service:cel-service >--------------
[INFO] -------------< org.my-project.copyright:cgs-parent >--------------
[INFO] -------------< org.my-project.copyright:cgs-service >-------------
[INFO] ---------------< org.my-project.copyright:cgs-api >---------------
[INFO] ---------------< org.my-project.copyright:cgs-web >---------------
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.2:test - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.1:test - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:rest-client:jar:17.0.1:test - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:aws-common:jar:17.0.1:test - omitted for conflict with 17.0.3)
[INFO] ----------------< org.my-project.core:core-root >-----------------
[INFO] -------------< org.my-project.core.check:core-check >-------------
[INFO] --------------< org.my-project.core:framework-util >--------------
[INFO] -------------< org.my-project.core.check:core-base >--------------
[INFO] ----------------< org.my-project.core:web-parent >----------------
[INFO] ------------< org.my-project.core:common-web-parent >-------------
[INFO] ----------------< org.my-project.core:common-web >----------------
[INFO] ------< org.my-project.configuration:configuration-parent >-------
[INFO] ---------< org.my-project.configuration:property-config >---------
[INFO] -----------< org.my-project.configuration:data-utils >------------
[INFO] --------------< org.my-project.core:service-parent >--------------
[INFO] -------------< org.my-project.core:rest-api-parent >--------------
[INFO] -------------< org.my-project.core:workflow-parent >--------------
[INFO] ----------------< org.my-project.core:properties >----------------
[INFO] ----------------< org.my-project.core:aws-common >----------------
[INFO] -----------------< org.my-project.core:auth-dao >-----------------
[INFO] ----------------< org.my-project.core:ldap-auth >-----------------
[INFO] ---------------< org.my-project.core:rest-client >----------------
[INFO] ---------------< org.my-project.core:digest-auth >----------------
[INFO] -----------< org.my-project.core:elasticsearch-common >-----------
[INFO] -------------< org.my-project.core:common-rest-api >--------------
[INFO] -------------< org.my-project.core:dataset-service >--------------
[INFO] --------------< org.my-project.core:identity-model >--------------
[INFO] --------< org.my-project.core:duplicate-identity-checker >--------
[INFO] -------------< org.my-project.core:events-generator >-------------
[INFO] -----------------< org.my-project.core:ftp-util >-----------------
[INFO] ------------< org.my-project.core:elastic-search-client >-------------
[INFO] ---------< org.my-project.core.import:core-import-time >----------
[INFO] --------< org.my-project.core.import:core-import-spring >---------
[INFO] --------< org.my-project.core.import:core-import-jersey >---------
[INFO] --------< org.my-project.core.import:core-import-apache >---------
[INFO] --------< org.my-project.core.import:core-import-google >---------
[INFO] --------< org.my-project.core.import:core-import-jackson >--------
[INFO] --------< org.my-project.core.import:core-import-logging >--------
[INFO] ----------< org.my-project.core.import:core-import-aws >----------
[INFO] --------< org.my-project.core.import:core-import-opencsv >--------
[INFO] --------< org.my-project.core.import:core-import-ehcache >--------
[INFO] ---------< org.my-project.core.import:core-import-cglib >---------
[INFO] -----< org.my-project.core.import:core-import-elasticsearch >-----
[INFO] -------< org.my-project.core.import:core-import-hibernate >-------
[INFO] ---------< org.my-project.core.import:core-import-jaxen >---------
[INFO] ---------< org.my-project.core.import:core-import-jsch >----------
[INFO] ---------< org.my-project.core.import:core-import-jstl >----------
[INFO] --------< org.my-project.core.import:core-import-aspectj >--------
[INFO] ------< org.my-project.core.import:core-import-freemarker >-------
[INFO] ----------< org.my-project.core.import:core-import-xml >----------
[INFO] --------< org.my-project.core.import:core-import-servlet >--------
[INFO] ---------< org.my-project.core.import:core-import-javax >---------
[INFO] --------< org.my-project.core.import:core-import-jayway >---------
[INFO] --------< org.my-project.core.import:core-import-github >---------
[INFO] --------< org.my-project.core.import:core-import-jolbox >---------
[INFO] ---------< org.my-project.core.import:core-import-cukes >---------
[INFO] -------< org.my-project.core.import:core-import-logstash >--------
[INFO] --------< org.my-project.core.import:core-import-minidev >--------
[INFO] --------< org.my-project.core.import:core-import-oracle >---------
[INFO] -------< org.my-project.core.import:core-import-codehaus >--------
[INFO] --------< org.my-project.core.import:core-import-eclipse >--------
[INFO] ---------< org.my-project.core.import:core-import-jboss >---------
[INFO] ---------< org.my-project.core.import:core-import-json >----------
[INFO] ---------< org.my-project.core.import:core-import-yaml >----------
[INFO] ------< org.my-project.core.import:core-import-skyscreamer >------
[INFO] ------< org.my-project.core.import:core-import-flapdoodle >-------
[INFO] -------< org.my-project.core.import:core-import-searchbox >-------
[INFO] --------< org.my-project.core.import:core-import-mongodb >--------
[INFO] ----------< org.my-project.core.import:core-import-smd >----------
[INFO] ------------< org.my-project.core.import:core-import >------------
[INFO] -------< org.my-project.core.check:core-check-deduplicate >-------
[INFO] ---------------< org.my-project.core:core-parent >----------------
[INFO] -------------< org.my-project.delivery:delivery-app >-------------
[INFO] -----------< org.my-project.delivery:delivery-service >-----------
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] -------------< org.my-project.delivery:delivery-api >-------------
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:compile - omitted for conflict with 17.0.3)
[INFO] -----------< org.my-project.delivery:delivery-client >------------
[INFO] ----< org.my-project.event.framework:event-framework-parent >-----
[INFO] ----< org.my-project.event.framework:event-framework-common >-----
[INFO] ------< org.my-project.event.framework:event-framework-lib >------
[INFO] ---------< org.my-project.event.framework:event-service >---------
[INFO] ------< org.my-project.event.framework:event-framework-api >------
[INFO] | | +- (org.my-project.microservicesexceptions:microservicesexceptions-exception-builder:jar:3.0.1:compile - omitted for conflict with 3.0.0)
[INFO] | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] | | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] | | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] +- (org.my-project:java-extension:jar:5.0.2:compile - omitted for conflict with 5.0.0)
[INFO] --< org.my-project.event.framework.rules:event-framework-rules-parent >--
[INFO] -------< org.my-project.event.framework.rules:ev-patent-rule >--------
[INFO] -------< org.my-project.event.framework.rules:cef-reaxys-rule >-------
[INFO] -----< org.my-project.event.framework.rules:scopus-patent-rule >------
[INFO] ----------< org.my-project.events.common:events-common-parent >-----------
[INFO] ----------< org.my-project.events.common:events-router-common >-----------
[INFO] -------------< org.my-project.apps:events-processor >-------------
[INFO] | | +- (org.my-project.jmxsupport:jmxnaming:jar:1.0.1:compile - omitted for conflict with 2.0.2)
[INFO] ----------< org.my-project.events.router:events-router-parent >-----------
[INFO] --------------< org.my-project.events.router:events-router >--------------
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.19:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.2:test - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:17.0.2:runtime - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.2:runtime - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:aws-common:jar:17.0.2:test - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:rest-client:jar:16.1.7:runtime - omitted for conflict with 17.0.2)
[INFO] | | +- (org.my-project.core:aws-common:jar:16.1.7:runtime - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:16.1.7:runtime - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:rest-client:jar:17.0.3:runtime - omitted for conflict with 17.0.2)
[INFO] -----------------< org.my-project.events.router:cel-api >-----------------
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.19:compile - omitted for conflict with 17.0.3)
[INFO] | | +- org.my-project.api-registry:api-registry:jar:3.0.2:compile (version managed from 3.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:17.0.2:test - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:aws-common:jar:17.0.2:test - omitted for conflict with 17.0.3)
[INFO] ------------------< org.my-project.gis:gis-parent >-------------------
[INFO] ------------------< org.my-project.gis:gis-service >------------------
[INFO] | | +- (org.my-project.jmxsupport:jmxnaming:jar:2.0.10:compile - omitted for conflict with 2.0.8)
[INFO] --------------------< org.my-project.gis:gis-api >--------------------
[INFO] | | +- (org.my-project.jmxsupport:jmxnaming:jar:2.0.10:compile - omitted for conflict with 2.0.8)
[INFO] | | | +- (org.my-project.microservicesexceptions:microservicesexceptions-exception-builder:jar:3.0.1:compile - omitted for conflict with 3.0.0)
[INFO] | | | +- (org.my-project.timemachine:timemachine:jar:4.0.6:compile - omitted for conflict with 4.0.5)
[INFO] | | +- (org.my-project.timemachine:timemachine:jar:4.0.6:compile - omitted for conflict with 4.0.5)
[INFO] --------------< org.my-project.inner:inner-parent >---------------
[INFO] --------------< org.my-project.inner:inner-common >---------------
[INFO] ---------------< org.my-project.inner:inner-model >---------------
[INFO] ---------------< org.my-project.inner:inner-ewii >----------------
[INFO] -------------< org.my-project.inner:ucs-common-service >--------------
[INFO] | +- org.my-project:api-client-library:jar:5.0.3:compile (version managed from 3.1.0)
[INFO] --------------< org.my-project.inner:inner-adaptor >--------------
[INFO] | | +- org.my-project:api-client-library:jar:5.0.3:compile (version managed from 3.1.0)
[INFO] ------------< org.my-project.inner:inner-etl-service >------------
[INFO] | | +- org.my-project:api-client-library:jar:5.0.3:compile (version managed from 3.1.0)
[INFO] --------------< org.my-project.inner:inner-etl-api >--------------
[INFO] | | | +- org.my-project:api-client-library:jar:5.0.3:compile (version managed from 3.1.0)
[INFO] --------< org.my-project.inner:inner-integration-service >--------
[INFO] ----------< org.my-project.inner:inner-integration-api >----------
[INFO] ---------------------< org.my-project.kews:kews >---------------------
[INFO] ----------------< org.my-project.lov:lov-parent >-----------------
[INFO] ----------------< org.my-project.lov:lov-service >----------------
[INFO] ------------------< org.my-project.lov:lov-api >------------------
[INFO] -----------< org.my-project.metadata:metadata-parent >------------
[INFO] -----------< org.my-project.metadata:metadata-common >------------
[INFO] -------------< org.my-project.metadata:metadata-dao >-------------
[INFO] ----------< org.my-project.metadata:validation-service >----------
[INFO] ---------< org.my-project.metadata:addonsearch-service >----------
[INFO] -----------< org.my-project.metadata:contributor-dao >------------
[INFO] -----------< org.my-project.metadata:metadata-service >-----------
[INFO] ---------< org.my-project.metadata:metadata-api-adapter >---------
[INFO] -------------< org.my-project.metadata:metadata-api >-------------
[INFO] -----------< org.my-project.metadata:contributor-api >------------
[INFO] ---------< org.my-project.event.framework.rules:sample-rule >---------
[INFO] -------------< org.my-project.oa:open-access-parent >-------------
[INFO] ------------< org.my-project.oa:open-access-service >-------------
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] ------------< org.my-project.oa:open-access-workflow >------------
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] --------------< org.my-project.oa:open-access-api >---------------
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] --------------< org.my-project.oa:open-access-web >---------------
[INFO] | | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] ----------< org.my-project.oa:open-access-workflow-web >----------
[INFO] | | | +- (org.my-project.core:framework-util:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] -----------< org.my-project.property:property-parent >------------
[INFO] -------------< org.my-project.property:property-dao >-------------
[INFO] -----------< org.my-project.property:property-service >-----------
[INFO] -------------< org.my-project.property:property-api >-------------
[INFO] -------------------< org.my-project.rp:rp-app >-------------------
[INFO] ----------------< org.my-project.apps:rp-service >----------------
[INFO] | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:properties:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] ------------------< org.my-project.apps:rp-api >------------------
[INFO] | | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:properties:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.mongodb-client:mongodb-client:jar:2.0.1:compile - omitted for conflict with 1.1.12)
[INFO] ------------------< org.my-project.apps:rp-web >------------------
[INFO] | | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:properties:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | | +- (org.my-project.core:framework-util:jar:16.1.23:compile - omitted for conflict with 17.0.3)
[INFO] | +- (org.my-project.core:properties:jar:17.0.1:compile - omitted for conflict with 17.0.3)
[INFO] | | | +- (org.my-project.mongodb-client:mongodb-client:jar:2.0.1:compile - omitted for conflict with 1.1.12)
[INFO] --------------------< org.my-project.sdk:sdk >--------------------
[INFO] -----------------< org.my-project.sdk:java-sdk >------------------
[INFO] --------------< org.my-project.sms:shared-messaging-parent >--------------
[INFO] --------------< org.my-project.sms:shared-messaging-common >--------------
[INFO] ---------------< org.my-project.sms:shared-messaging-api >----------------
[INFO] | | +- (org.my-project.microservicesexceptions:microservicesexceptions-exception-builder:jar:3.0.1:compile - omitted for conflict with 3.0.0)
[INFO] | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] | +- (org.my-project:java-extension:jar:5.0.0:test - omitted for conflict with 5.0.2)
[INFO] | | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] | | +- (org.my-project.placeholder.stepdef.support:placeholder-stepdef-support:jar:2.0.0:test - omitted for conflict with 2.0.2)
[INFO] -------------< org.my-project.sms:shared-messaging-service >--------------
[INFO] ----------< org.my-project.skip.mgmt:skip-mgmt-parent >-----------
[INFO] ----------< org.my-project.skip.mgmt:skip-mgmt-service >----------
[INFO] ------------< org.my-project.skip.mgmt:skip-mgmt-web >------------
[INFO] -------< org.my-project.reporting:system-reporting-parent >-------
[INFO] ----------< org.my-project.reporting:system-reporting >-----------
[INFO] --------------< org.my-project.web:web-aggregation >--------------
[INFO] -----------------< org.my-project.web:inner-web >-----------------
[INFO] ---------------< org.my-project.web:metadata-web >----------------
[INFO] ---------------< org.my-project.web:property-web >----------------
[INFO] ---------------< org.my-project.web:dashboard-web >---------------
</pre>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-73941919326477129992023-09-12T21:36:00.006+01:002023-09-12T21:36:56.422+01:00Load bearing structuresFast, light lily trotter.
<div class="separator" style="clear: both;"><a title="(c) Arno Meintjes, some rights reserved (CC BY-NC)" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNCrj5qxTJdamMw0xX-RIuCpey6jD_pAIUNges-qFw3oDFPAN6ss-qVCK7KMM8zbVf5qJZdiaAJIPMUk_aQtE4tHwgiKGPvimyNN6cfWj4-iVxu4X0rQ_5Fs1rtAezBrKgqARLKXAfIRxbJ1yxFKok5yWhS4j4pvynhGD6tbzT_JWiXqQi2rDHXFsTGqc/s1024/large.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="683" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNCrj5qxTJdamMw0xX-RIuCpey6jD_pAIUNges-qFw3oDFPAN6ss-qVCK7KMM8zbVf5qJZdiaAJIPMUk_aQtE4tHwgiKGPvimyNN6cfWj4-iVxu4X0rQ_5Fs1rtAezBrKgqARLKXAfIRxbJ1yxFKok5yWhS4j4pvynhGD6tbzT_JWiXqQi2rDHXFsTGqc/s400/large.jpg"/></a></div>
Dall-e Hippo.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglgY2RK9hhSlOawafE_7RYUvwPQFBMI04l-XDaQ0WKiy1_8gl7iJKABbViUtyqIu0V8NK1YpDy4rlwlgDPh8fVGu1vU9r037c8PZ19Zf0ppepGulashYBSiCbLxrNoBTFQvsonOJZaWZbCQ8TBiShJYoNsXQT6OOtQxUl22siKBvwJrY6jGx7IiRUquq8/s1024/HippoInLilies.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglgY2RK9hhSlOawafE_7RYUvwPQFBMI04l-XDaQ0WKiy1_8gl7iJKABbViUtyqIu0V8NK1YpDy4rlwlgDPh8fVGu1vU9r037c8PZ19Zf0ppepGulashYBSiCbLxrNoBTFQvsonOJZaWZbCQ8TBiShJYoNsXQT6OOtQxUl22siKBvwJrY6jGx7IiRUquq8/s400/HippoInLilies.jpg"/></a></div>
Hippo trotter.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq4aY55gKiJm64kvoCvdN8usaF2Y3uZcieyJ4FATMLMrZSbTaCx11cp0XJknx83hL3f9WIsuctoh35SpBHygBPLZjizlSMPNUiipmcPIh9t7ElzGUy3MJoKGzn6MwhmuspDkQB5x1HUpaKW7IRMdVzmrSOhUv5VyePrtFt-L5Uj-TOsDE1ncUIMednswo/s871/lily_trotter_on_hippo.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="871" data-original-width="697" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq4aY55gKiJm64kvoCvdN8usaF2Y3uZcieyJ4FATMLMrZSbTaCx11cp0XJknx83hL3f9WIsuctoh35SpBHygBPLZjizlSMPNUiipmcPIh9t7ElzGUy3MJoKGzn6MwhmuspDkQB5x1HUpaKW7IRMdVzmrSOhUv5VyePrtFt-L5Uj-TOsDE1ncUIMednswo/s400/lily_trotter_on_hippo.jpg"/></a></div>
For me this is connected with writing software.Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-69771054732802712142023-08-05T23:09:00.004+01:002023-08-06T10:14:10.896+01:00Variety build up in a long lived project<table>
<tr>
<td>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs_8TfotoEahBN2IU0i8Wq_k9JYqwWUYo190fPpO-Q5Gkpq7lKcT9SdzBjjovYrijOMcVHQMb7XYZ4Fl-62zxwl9yBoTsBTWVLs3S5HB7rfK-USwIJn3u6AQAfrXx7_yLljzJ-bhJUKPFLK9vzYovKg7YqUHUhWu0dM7FjdmIKmGvMNv_ppR7c0Pr87JI/s1024/snowflakes.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="200" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs_8TfotoEahBN2IU0i8Wq_k9JYqwWUYo190fPpO-Q5Gkpq7lKcT9SdzBjjovYrijOMcVHQMb7XYZ4Fl-62zxwl9yBoTsBTWVLs3S5HB7rfK-USwIJn3u6AQAfrXx7_yLljzJ-bhJUKPFLK9vzYovKg7YqUHUhWu0dM7FjdmIKmGvMNv_ppR7c0Pr87JI/s200/snowflakes.jpg"/></a></div>
</td><td>
My current project has 319 Maven POMs. These have been worked upon by at least five 'generations' of coders, that is under five different software engineering leads.
Maven enables different actions depending upon different <a href="https://maven.apache.org/guides/introduction/introduction-to-profiles.html">profiles</a>.
This seems like a good idea: you want a new behavior, the work you are doing is new to you and maybe to the project. Name your profile and get the thing you want done.
Lets see how that work out over ten years.
</td>
</tr>
</table>
<div class="separator" style="clear: both;">
<code><pre>
find * -name pom.xml | grep -v git |grep -v target \
|xargs grep -h -a1 "<profile>" \
|grep "<id>" |tr -d '[ \t]'| \
sed 's/<[\/]*id>//g'| \
sort |uniq -c
2 code-quality
5 component-test
64 full
1 Full
5 im-elasticsearch
1 it-test
1 it-tests
1 local-it-tests
28 nightly
1 owasp
8 unit
</pre></code>
<dl>
<dt>
2 code-quality
</dt>
<dd>
seems like you want to separate out your Sonar run, maybe combine it with another profile, say security checking, and want the luxury to only run one at a time.
<br>Use <b>full</b>
</dd>
<dt>
5 component-test
</dt>
<dd>
wat? Is this an integration test or a unit test?
<br>Use <b>full</b>
</dd>
<dt>
64 full
</dt>
<dd>
<b>short and to the point</b>
<br><u><b>Winner!</b></u>
</dd>
<dt>
1 Full
</dt>
<dd>
Typo
<br>Use <b>full</b>
</dd>
<dt>
5 im-elasticsearch
</dt>
<dd>
Might have been a candidate, if inheritted and there was a need for mix-ins, but neither holds.
Requires <b>component-test</b>
<br>Use <b>full</b>
</dd>
<dt>
1 it-test
</dt>
<dd>
Should be plural.
<br>Use <b>full</b>
</dd>
<dt>
1 it-tests
</dt>
<dd>
IT stands for Integration Test so it-tests is Integration Test Tests.
<br>Use <b>full</b>
</dd>
<dt>
1 local-it-tests
</dt>
<dd>
Integration tests which are not run on the Continuous Integration server? Wrong.
<br>Use <b>full</b>
</dd>
<dt>
28 nightly
</dt>
<dd>
These presumably still need to be run on any change. Control periodicity in the Continuous Integration server configuration.
<br>Use <b>full</b>
</dd>
<dt>
1 owasp
</dt>
<dd>
What are these? Why are they special snowflakes? OWASP tests need to be run on any change.
<br>Use <b>full</b>
</dd>
<dt>
8 unit
</dt>
<dd>
Unit tests are the default profile.
<br>Delete
</dd>
</dl>
<p>
Using multiple profiles is a bad idea.
</p>
<p>
Unit tests should be run in any scenario, and should be run as part of development.
</p>
<p>
A reasonable distinction between tests is those which require external fixtures off the developers machine and those which do not, or those that take a long time to run, disabling the developer's machine.
Some tests attempt to drain resources from the machine they are running on, not great on the developer's machine. There is no inherent advantage to calling out these motivations in the profile name.
</p>
<p>
What we want is to be able to reason about the whole class, to be able to say true things about <b>all</b> our builds. This is a much greater advantage than an attempt to communiate with other developers through naming.
</p>
<h3>Use full</h3>
<p>
Now we know that we have three types of build:
</p>
<dl>
<dt>no tests</dt>
<dd>-Dmaven.test.skip=true
<br>(preferred over -skipTests)</dd>
<dt>unit tests</dt>
<dd>
Default profile, nothing for you to do.
</dd>
<dt>all tests</dt>
<dd>
-Pfull
</dd>
</dl>
<p>
We can happily say that the only thing to do when writing code to build our code is to use the profile <b>full</b>.
</p>
<p>
Variety is sand in the gears of our development machine, however much it may mean to you is wears away at your precious attention.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0-Re-_qFxdo8VdB2SCfutmeZiNQU4iUmOgX8XFXyN7nuBEfeYVpj7b8Y5f9U2kW5gmqy_zUQF78fG-sD5jfX2yy2seYY-Mztc5cnctNGt2o9K4ivULy9O2-VMw2JIVeG821Sk6NaSCQMxma8vKxxhmn_U7uBYgIqxOEbVsiT7d-g-CSL1YFO4dxgiDcw/s1440/Sand-grains-magnified-microscope.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="802" data-original-width="1440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0-Re-_qFxdo8VdB2SCfutmeZiNQU4iUmOgX8XFXyN7nuBEfeYVpj7b8Y5f9U2kW5gmqy_zUQF78fG-sD5jfX2yy2seYY-Mztc5cnctNGt2o9K4ivULy9O2-VMw2JIVeG821Sk6NaSCQMxma8vKxxhmn_U7uBYgIqxOEbVsiT7d-g-CSL1YFO4dxgiDcw/s320/Sand-grains-magnified-microscope.jpg"/></a></div>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com1tag:blogger.com,1999:blog-2150042504803929508.post-71278675873611063752023-07-17T22:11:00.003+01:002023-07-17T22:39:14.538+01:00Press Release Driven Development<table>
<tr><td><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0njRmI0CYFPhetrj-PoBqCHEF9fNIvej5AeRGKu8ar9soGkdfElYOLwFWT8jQRfiaFWxBS2Ox5G2Wp8zQULhBWpry_vk1OuA5F6y1wtC3kIjAOTTVeQpLN6PNj154cSE7v4m0HyTJsExtHInkC3tKNE9qicQaWc5GJUUtL4Dct6nvrWTBhh_vbF7sytk/s512/m8JqLq2zD9zu0Jvyzzvk--1--lgzn5.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="200" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0njRmI0CYFPhetrj-PoBqCHEF9fNIvej5AeRGKu8ar9soGkdfElYOLwFWT8jQRfiaFWxBS2Ox5G2Wp8zQULhBWpry_vk1OuA5F6y1wtC3kIjAOTTVeQpLN6PNj154cSE7v4m0HyTJsExtHInkC3tKNE9qicQaWc5GJUUtL4Dct6nvrWTBhh_vbF7sytk/s200/m8JqLq2zD9zu0Jvyzzvk--1--lgzn5.jpg"/></a></div>
</td><td>
<p>
I realised, as I stumbled forwards with a presentation on my current project, that the presentation can be seen as a <em>Press Release</em> and remembered that I have explicitly followed the Amazon <em>Working Backwards</em> practice twice before.
</p>
</td></table>
<div class="separator" style="clear: both;">
<h3>Write the PR at the start of the project</h3>
<p>
This informs the team what the point of the activity is, which is not always self-evident.
</p>
<blockquote>
<h2>Internal Press Release: <b>Important System</b> Upgrade Completed</h2>
<p>
Anticipated release date see: <b>Upgrade Epic Ticket</b>
</p>
<p>
Today we can announce that we have upgraded the whole of <b>Important System</b>.
</p>
<p>
In the process we have achieved the following:
</p>
<ul>
<li>
Extended and upgraded our ability to act upon and monitor all repositories
</li>
<li>
Archived XX repositories
</li>
<li>
Reduced the number of ignored tests from XX to XX
</li>
<li>
Removed all Sonar Bugs and Vulnerabilities
</li>
<li>
Updated all libraries
</li>
<li>
Installed Dependabot to ensure we do not fall behind again
</li>
</ul>
<p>
This enables us to take on the strategic work of removing Bad Thing from our estate.
</p>
</blockquote>
<p>
The numeric gaps in the Press Release make it explicit what needs to be measured before and after the project.
</p>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-46665780677175963962023-07-17T00:53:00.000+01:002023-07-17T00:53:32.829+01:00Trying to use AI to create an image for work<p>
The idea I want to convey, in a slide deck at work, is that the codebase we are working on has not had enough attention for five years. It has been run by a small number of people who managed to keep the system working, 'kept the lights on' but the team were not the original authors, and was not big enough, and not empowered enough, to make updates, let alone the structural changes required.
</p>
<p>
I hit upon the idea of <b>The Marie Celeste and her skeleton crew</b>.
The original authors had left, the system was still running, but those running it were too few.
</p>
<h3><a href="https://hotpot.ai/art-generator#">HotPot.ai</a></h3>
<p>
<a href="https://hotpot.ai/art-generator#">HotPot.ai</a> is really good. It has a nice freemium on-ramp, generates images fast, and nearly had me spend money with them. I certainly used up my free goes.
</p>
<p>
I had to choose styles and engines.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrw9Jf9DZJDHXXd1OC37Ggp_sxDb_GyVh8MlYge0eTJa6rK_4Geh7jQZXPRxgXXWTzpVdgx-tPkdVR4oraQeH2klrxNSJmfW-O7qAQHpouIZzWfhIhb45tDB1TzhV8ApRW7wkrS-6qCXkROXJu2UkuqU99DjpkcZmT0AmZAWXP9e26xGzoKC7q7_iuKUs/s512/image-1.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrw9Jf9DZJDHXXd1OC37Ggp_sxDb_GyVh8MlYge0eTJa6rK_4Geh7jQZXPRxgXXWTzpVdgx-tPkdVR4oraQeH2klrxNSJmfW-O7qAQHpouIZzWfhIhb45tDB1TzhV8ApRW7wkrS-6qCXkROXJu2UkuqU99DjpkcZmT0AmZAWXP9e26xGzoKC7q7_iuKUs/s320/image-1.png"/></a></div>
<br>
<p>
Where is the crew?
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_Xog4f2kFH_BcsT3fqdCErCA5i867JIHlNfrusion2qq0gzO5keUCb0oWfNxZZhdBbE1vQGgmg8u0h2mXRjm0Iuzs7H0byM_e19gJxWL7fxPgULC79NJ4vFUu8oKiu9gPNdHHKlGaM1c12tx7dzFf9g5DrPTEHmT7htOP2qGe_O_5TX0ts7mzXo-06E/s512/image-3.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_Xog4f2kFH_BcsT3fqdCErCA5i867JIHlNfrusion2qq0gzO5keUCb0oWfNxZZhdBbE1vQGgmg8u0h2mXRjm0Iuzs7H0byM_e19gJxWL7fxPgULC79NJ4vFUu8oKiu9gPNdHHKlGaM1c12tx7dzFf9g5DrPTEHmT7htOP2qGe_O_5TX0ts7mzXo-06E/s320/image-3.png"/></a></div>
<br>
<p>
Where is the crew?
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNNT_1LMMMfGCd8UEmk0IHgvqC_faUYBPC-qKQs8NZJwo6RAf0VNgUNcD9uvJQtY7OfBqPLZ-agnsWvtADjeGD-6TvmhtNUHvmY63nHWtqwNWd82q20aYD6gkAjpm3givxmfO_aVNtGs3a-vF8mVZIhRaYC0fqM1OQfYcaJRDkCEuYz-vKMxgyqZC6HDQ/s512/image-4.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNNT_1LMMMfGCd8UEmk0IHgvqC_faUYBPC-qKQs8NZJwo6RAf0VNgUNcD9uvJQtY7OfBqPLZ-agnsWvtADjeGD-6TvmhtNUHvmY63nHWtqwNWd82q20aYD6gkAjpm3givxmfO_aVNtGs3a-vF8mVZIhRaYC0fqM1OQfYcaJRDkCEuYz-vKMxgyqZC6HDQ/s320/image-4.png"/></a></div><br>
<p>
Where is the crew?
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDBVycOZAGbA2FoCrhZIPP7-4YRX7z9r9kUS3H79NqgBpPuMfp_xISG8Foyb17qdwO4Vp9K2PoDBxfd2emURVt3vGWZqkFroZcDEuw3YGbs9GGiQBWgmJ1hnYXjJFPihe0xdxpeQhUPg3_lb-z9raQL3h7tmzNxf7Y0C1KUOprvDA_f8f5nSaQ-T-RcPs/s512/image-5.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDBVycOZAGbA2FoCrhZIPP7-4YRX7z9r9kUS3H79NqgBpPuMfp_xISG8Foyb17qdwO4Vp9K2PoDBxfd2emURVt3vGWZqkFroZcDEuw3YGbs9GGiQBWgmJ1hnYXjJFPihe0xdxpeQhUPg3_lb-z9raQL3h7tmzNxf7Y0C1KUOprvDA_f8f5nSaQ-T-RcPs/s320/image-5.png"/></a></div>
<br>
<p>
Where is the crew? Appears to be a futuristic gun on prow.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFLspO1PfO6Inn0vu-6Oufj7uawx_9J1g-FzR6AaeLnFABpOxHDe1lgmeCFAY5OnMhXIDwvKtvzo-ZI2W6NdJPf3uXHkZMGfHnkFRFo64EpqhDA2R2XQKa7jXCf20wKp-4zVUuejDhPiI0JZv6KO8lfHvp3g1QHpNA3ak0lHVGYG6srDO0oisaIDwWYpY/s512/image-6.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFLspO1PfO6Inn0vu-6Oufj7uawx_9J1g-FzR6AaeLnFABpOxHDe1lgmeCFAY5OnMhXIDwvKtvzo-ZI2W6NdJPf3uXHkZMGfHnkFRFo64EpqhDA2R2XQKa7jXCf20wKp-4zVUuejDhPiI0JZv6KO8lfHvp3g1QHpNA3ak0lHVGYG6srDO0oisaIDwWYpY/s320/image-6.png"/></a></div>
<br>
<p>
Maybe some crew, the one I went with.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh28CXePWlqvhKyMFD5J58i2WzSgouq8KKw5BuWehWNBFUBztEjDC_8qBx_6-dF70WwRJ3Kl2HgvcIpd9fQ5DYHxQu2dAuwq-6oRisok7GkEK8XWSYZGk8cAidM4LAc9BepTFvZkCnotPWZyQgn7dHxhcDNCTmCJUiN9XRO29bIB5R9qM8q2tLhNSQSOM4/s512/image-7.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh28CXePWlqvhKyMFD5J58i2WzSgouq8KKw5BuWehWNBFUBztEjDC_8qBx_6-dF70WwRJ3Kl2HgvcIpd9fQ5DYHxQu2dAuwq-6oRisok7GkEK8XWSYZGk8cAidM4LAc9BepTFvZkCnotPWZyQgn7dHxhcDNCTmCJUiN9XRO29bIB5R9qM8q2tLhNSQSOM4/s320/image-7.png"/></a></div>
<br>
<p>
Where is the crew?
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsIThtbuK42P35V3PTxpSGhtFYGv1dWgBcXGizHV5NBdcjmsQp2Ly4WYp06PE0ZCt3_J3bYFh8USPVyZ1Pz0zNyD5owFcV7xRfDm0O-lPS---ycayKFysnlMw4kGf9u5pKrHVTgyeqVi3No8WFTOkyIkiwjiKzbn98ZKBJEZwQ9flflfBppeaokkNSbrc/s512/image-8.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsIThtbuK42P35V3PTxpSGhtFYGv1dWgBcXGizHV5NBdcjmsQp2Ly4WYp06PE0ZCt3_J3bYFh8USPVyZ1Pz0zNyD5owFcV7xRfDm0O-lPS---ycayKFysnlMw4kGf9u5pKrHVTgyeqVi3No8WFTOkyIkiwjiKzbn98ZKBJEZwQ9flflfBppeaokkNSbrc/s320/image-8.png"/></a></div>
<br>
<p>
Too marvel
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEMde0gI_Ki-LKCkithDItRlbWNmukJwlwGsGLf3po20c4LhScn8GN1cCUS5kBVLEZ0FY-MylW3jV5yAvjx6kacK3b94OHRa697EomZDLymHBk6ayyNnBeSXh_lc2NkYUpSpZygDOYCChudNtIzSMw21fnF7yHzyWsPjPYxNfC73O6C10L8jAi6hWFrUM/s512/image-9.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEMde0gI_Ki-LKCkithDItRlbWNmukJwlwGsGLf3po20c4LhScn8GN1cCUS5kBVLEZ0FY-MylW3jV5yAvjx6kacK3b94OHRa697EomZDLymHBk6ayyNnBeSXh_lc2NkYUpSpZygDOYCChudNtIzSMw21fnF7yHzyWsPjPYxNfC73O6C10L8jAi6hWFrUM/s320/image-9.png"/></a></div>
<br>
<p>
Too stylised
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXru0be7-1twi5-zJXrXLbdCyiR1KfAfC05YgIDyDFCfdaOrTk0uJW32xEVjX1ot4k0l_iHxyzbXCwWxmOv6hc2vpVoq_-TrCrDPx3KfYzI2aqJxXs-s1DqCh2g72cWRfR7JAkOV5-35qk6QAOLRyt6g_TjB72ZKp7sJwLnfxEWhkeJx0mi4nt7CNlzks/s512/image-10.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXru0be7-1twi5-zJXrXLbdCyiR1KfAfC05YgIDyDFCfdaOrTk0uJW32xEVjX1ot4k0l_iHxyzbXCwWxmOv6hc2vpVoq_-TrCrDPx3KfYzI2aqJxXs-s1DqCh2g72cWRfR7JAkOV5-35qk6QAOLRyt6g_TjB72ZKp7sJwLnfxEWhkeJx0mi4nt7CNlzks/s320/image-10.png"/></a></div>
<br>
<p>
Too sexualised
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOcMhXRGIs364bwbf6wLMhRNrkEujpZCLw7pHjE_byJ5312eY6kpaiuXKBRFIkaOScqR-ZBnFeouRjbFvefqjhXx_UUs_VQGk4TXbZiaRlWTJ7sULiIe6Al2nAyNS1RR2zG9nDluQqYWwCDCNeULnO-QyQoShOVPwr04dxDSDnXGvajfD6Qw3v5UwCCnI/s512/image-1.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOcMhXRGIs364bwbf6wLMhRNrkEujpZCLw7pHjE_byJ5312eY6kpaiuXKBRFIkaOScqR-ZBnFeouRjbFvefqjhXx_UUs_VQGk4TXbZiaRlWTJ7sULiIe6Al2nAyNS1RR2zG9nDluQqYWwCDCNeULnO-QyQoShOVPwr04dxDSDnXGvajfD6Qw3v5UwCCnI/s320/image-1.png"/></a></div>
<br>
<p>
I changed the prompt to <b>Crew the ghost ship Marie Celeste</b> or similar, Dalle encorporates the prompt into the filename.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeMmra21SOiMLZbhKLFmHCf-dp0-PbhY0gRIREBTZygERf5HRLZ1KouBKD5t9nZMuaWWrjb6pKpfzJQLqZQSGIw_P_SjSfUs7nseDCb65G1w__C2CnT3R35y6Xrt139NtvSUMAc6axTeElsYVHGI5yUwdhtLhyaBPr88vQqPcnDLEE6K71nX0Ij0boxgE/s512/image-2.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeMmra21SOiMLZbhKLFmHCf-dp0-PbhY0gRIREBTZygERf5HRLZ1KouBKD5t9nZMuaWWrjb6pKpfzJQLqZQSGIw_P_SjSfUs7nseDCb65G1w__C2CnT3R35y6Xrt139NtvSUMAc6axTeElsYVHGI5yUwdhtLhyaBPr88vQqPcnDLEE6K71nX0Ij0boxgE/s320/image-2.png"/></a></div>
<br>
<p>
I changed the prompt back to <b>The ghost ship Marie Celeste</b> or similar, I have lost track of the prompts by this stage.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeez7SNT5KNmXtZ3Y7opt57NXGwxPQ_o3PFK7bNxFk2aHdYWYB0k0v3wZp4pdXShBqf9XKLsIubw97rnsltrlx1HMaw9CNWSHRSgI2m3y29viayS0lJJKCsDV_Xwp81KdJSlINrb8T2idOhXqo5rs4fUAm9LmOQfCL2912jodGRcpHcEBlmVsjUx5l48/s512/image-3.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeez7SNT5KNmXtZ3Y7opt57NXGwxPQ_o3PFK7bNxFk2aHdYWYB0k0v3wZp4pdXShBqf9XKLsIubw97rnsltrlx1HMaw9CNWSHRSgI2m3y29viayS0lJJKCsDV_Xwp81KdJSlINrb8T2idOhXqo5rs4fUAm9LmOQfCL2912jodGRcpHcEBlmVsjUx5l48/s320/image-3.png"/></a></div>
<br>
<p>
Back to the crew.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixAyNhn1Br8GHWkhZXeLZeAK9jxf8fsZiyzh1vwEqEsfs2kIoz1s6zy32OtudyxBfsazApRYHZtXhi5ptZQYM3G7My5WYsUxsj1HP8mMwSZygLeb07tK5Hz6xwg0qhGCdgYnCdpxqu4TEzCd5GO0K8v0M7B1mdfrI_IW8WqhTGw4FnX9AFrYK7bUZjGJ8/s512/image-4.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixAyNhn1Br8GHWkhZXeLZeAK9jxf8fsZiyzh1vwEqEsfs2kIoz1s6zy32OtudyxBfsazApRYHZtXhi5ptZQYM3G7My5WYsUxsj1HP8mMwSZygLeb07tK5Hz6xwg0qhGCdgYnCdpxqu4TEzCd5GO0K8v0M7B1mdfrI_IW8WqhTGw4FnX9AFrYK7bUZjGJ8/s320/image-4.png"/></a></div>
<br>
<p>
Too much emphasis on the word skeleton
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgezE0ywbSrh1w0k_VAMLf2RM6Z8X2jwVh8jcBxnlOqB4TAt146baLeLHHtruSNK5OgvVn7_98viWMK5zpN2R6NjfSpZdiwTZq5CgKa2bRzwDrPojITRHkYGKGg58bxlT-GcnsKzmnxcAn7p7FxKfYU3JILZIJJnuwOY9wpYgOkAuZKnk4uvd11ltvu190/s512/image-5.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgezE0ywbSrh1w0k_VAMLf2RM6Z8X2jwVh8jcBxnlOqB4TAt146baLeLHHtruSNK5OgvVn7_98viWMK5zpN2R6NjfSpZdiwTZq5CgKa2bRzwDrPojITRHkYGKGg58bxlT-GcnsKzmnxcAn7p7FxKfYU3JILZIJJnuwOY9wpYgOkAuZKnk4uvd11ltvu190/s320/image-5.png"/></a></div>
<br>
<p>
I guess it is picking up on 'girls name' + skeleton
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif1MHKSj7D8EI4Oo1AuRs6-1Y6yvZgn9Vd4ErXOoLBKFK81fxpyKByHJB4C-oQZp5p8zoC51jVt2_CIKPLIn1Nu0o9DwbP3k0bZIPJsmliJ1mgkUlKgOzRFBa_vzRXVCbWuGpKTkYVChTTX_01ieE3cdu6juzx-ZDyDIY1GaebCRVKaajnZh0Su8f3MHM/s512/image-6.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif1MHKSj7D8EI4Oo1AuRs6-1Y6yvZgn9Vd4ErXOoLBKFK81fxpyKByHJB4C-oQZp5p8zoC51jVt2_CIKPLIn1Nu0o9DwbP3k0bZIPJsmliJ1mgkUlKgOzRFBa_vzRXVCbWuGpKTkYVChTTX_01ieE3cdu6juzx-ZDyDIY1GaebCRVKaajnZh0Su8f3MHM/s320/image-6.png"/></a></div>
<br>
<p>
'girls name' + skeleton in a different style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIyGnsOXLig8yi8pj8yrOTsPI94LUK_nzzfrSuGXyx7tNfOj4SDZvMeslWeFA29HNMrdXl_Z0fozg2kfkrP7x3kQXS3s5jZyRu30yrD2oLWhA7dVwNczCYIweGK96yisQ1rZ5xu_pGXc7p0LOhfD0SvgUdPHczyAnEjMJo2ryYiUSvLEdTTxQuWqjuiYs/s512/image-1.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIyGnsOXLig8yi8pj8yrOTsPI94LUK_nzzfrSuGXyx7tNfOj4SDZvMeslWeFA29HNMrdXl_Z0fozg2kfkrP7x3kQXS3s5jZyRu30yrD2oLWhA7dVwNczCYIweGK96yisQ1rZ5xu_pGXc7p0LOhfD0SvgUdPHczyAnEjMJo2ryYiUSvLEdTTxQuWqjuiYs/s320/image-1.png"/></a></div>
<br>
<p>
Too much skeleton
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvR3re2T-gyoeISVThMcXGJsnhkQZ699rCYLTOu2F4RnE-oSpC8K0oMedvzxrYvXB28mUKQwi1U3Gjmq_5VHvC3btn-Z6qAHGwCTOFsqAN6xunhVZnmITUetjx2fr_Lqe0-Sq6AyJf9DdtUTI7JE40AIETcfo3Mxpkw9bWLxiWwnpxv5kc1CHTT4qmRBU/s512/image-2.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvR3re2T-gyoeISVThMcXGJsnhkQZ699rCYLTOu2F4RnE-oSpC8K0oMedvzxrYvXB28mUKQwi1U3Gjmq_5VHvC3btn-Z6qAHGwCTOFsqAN6xunhVZnmITUetjx2fr_Lqe0-Sq6AyJf9DdtUTI7JE40AIETcfo3Mxpkw9bWLxiWwnpxv5kc1CHTT4qmRBU/s320/image-2.png"/></a></div>
<br>
<p>
Back to just the ship
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcXFluZ-9NFAkB1psEseACOl2ZD8QIAzxXFVzNTgAqoq0dCr9fMI2aYJKZh4SokTOd-55WND9bXiTCkXqSkP28LnZ7WGVDVDqZdzsiEKMnVDl8Ae3XVuvRwUIaB7AMPXYG7ld5LHPJVmaxXbwi-w-HZDaSRl3WIONxDLT8jsFhyG63WCIBcAxPGHe5_bM/s512/image-3.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcXFluZ-9NFAkB1psEseACOl2ZD8QIAzxXFVzNTgAqoq0dCr9fMI2aYJKZh4SokTOd-55WND9bXiTCkXqSkP28LnZ7WGVDVDqZdzsiEKMnVDl8Ae3XVuvRwUIaB7AMPXYG7ld5LHPJVmaxXbwi-w-HZDaSRl3WIONxDLT8jsFhyG63WCIBcAxPGHe5_bM/s320/image-3.png"/></a></div>
<br>
<p>
Just the ship in a different style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUVJUit9zGYo3CwyBjeaHhOwuC_qzMmD0HUUv1EuuXXiQBuajJhB5K-w0_MbYLOQBgWbks92NYXbWkxSbTyOKOoHGTMso5tYah85piT9QDJLHSXlNRAmjgTiVih_aMdh6C8cgwl-dPEWYphLqSoPA7X0uzhVNMoA3Ye5_ODYU_pWIZ-8Wfuvc0ZN6W_94/s512/image-4.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUVJUit9zGYo3CwyBjeaHhOwuC_qzMmD0HUUv1EuuXXiQBuajJhB5K-w0_MbYLOQBgWbks92NYXbWkxSbTyOKOoHGTMso5tYah85piT9QDJLHSXlNRAmjgTiVih_aMdh6C8cgwl-dPEWYphLqSoPA7X0uzhVNMoA3Ye5_ODYU_pWIZ-8Wfuvc0ZN6W_94/s320/image-4.png"/></a></div>
<br>
<p>
Skeleton and ship, but I have run out of free goes and the will to live.
</p>
<div class="separator" style="clear: both;">
<h3>creator.nightcafe.studio</h3>
<br>
<p>
<a href="https://creator.nightcafe.studio/">creator.nightcafe.studio</a> is a similar, polished service.
I liked this creation, though it is more Flying Dutchman than Marie Celest and has <b>no crew</b>, enough to tweet it.
</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The ghost ship Marie Celest - made with NightCafe Creator <a href="https://t.co/ZXaH2VyZFj">https://t.co/ZXaH2VyZFj</a> <a href="https://twitter.com/hashtag/aiart?src=hash&ref_src=twsrc%5Etfw">#aiart</a> <a href="https://twitter.com/hashtag/nightcafe?src=hash&ref_src=twsrc%5Etfw">#nightcafe</a> <a href="https://twitter.com/hashtag/digitalart?src=hash&ref_src=twsrc%5Etfw">#digitalart</a> <a href="https://twitter.com/hashtag/vqganclip?src=hash&ref_src=twsrc%5Etfw">#vqganclip</a> via <a href="https://twitter.com/NightcafeStudio?ref_src=twsrc%5Etfw">@NightcafeStudio</a></p>— TimP 🦔 (@timPizey) <a href="https://twitter.com/timPizey/status/1680613478871056385?ref_src=twsrc%5Etfw">July 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOPisW0nStWygcgt_ZhFq8n0qGEerJQ7HArfkKomFkUYU1EsV1zoDngEYCJhdoV1hIEHmthQLfzDgWkKyz0bwz5uTOTtgvmXnUMV5F4MBITHo9aK5hicVtoT_saEYtVGG6-mC42ms4S8s-rqF5oOe79UENTwjvVvBJSaxh26dLnMelkGmJ0FwafwWnL4/s512/8ULOxoKBoJ8FIaSLa0PT--1--h2czi.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOPisW0nStWygcgt_ZhFq8n0qGEerJQ7HArfkKomFkUYU1EsV1zoDngEYCJhdoV1hIEHmthQLfzDgWkKyz0bwz5uTOTtgvmXnUMV5F4MBITHo9aK5hicVtoT_saEYtVGG6-mC42ms4S8s-rqF5oOe79UENTwjvVvBJSaxh26dLnMelkGmJ0FwafwWnL4/s320/8ULOxoKBoJ8FIaSLa0PT--1--h2czi.jpg"/></a></div>
<br>
<p>
I added the word 'Indian'
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpNWm_0w70mGwPotZr3QWxqJBzw9JaGgq2wUwG_2Zz8jrnfUegca8Xhd610kz_00cqsrCBwWiGFaACEWD8HjZzZS02W4d16VxlKKS7v3nqduKs0HcBb847TXF1rmm6t9q18v--9bTxt1b16iRDtdo-el-4ilBEN6Z2jFh4PaMnHivxQN1aADmrSls9hpo/s512/AdTdTzg7zZxeYQwAzgqZ--1--11x6g.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpNWm_0w70mGwPotZr3QWxqJBzw9JaGgq2wUwG_2Zz8jrnfUegca8Xhd610kz_00cqsrCBwWiGFaACEWD8HjZzZS02W4d16VxlKKS7v3nqduKs0HcBb847TXF1rmm6t9q18v--9bTxt1b16iRDtdo-el-4ilBEN6Z2jFh4PaMnHivxQN1aADmrSls9hpo/s320/AdTdTzg7zZxeYQwAzgqZ--1--11x6g.jpg"/></a></div>
<br>
<p>
Lost the ship
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijIfiajGQ6XB3c2RpH_J4Sgn9Qw3EWC6vleW_1Ohh6CyMn9RrDL9-LRGPlLzNQjC87AfAVxdJ1r5ulye4rGw8ox7lEUyRTN0EXLoDjkwdO_he-0-lb1Raty_k-_YQtaH3GahXRs_fhR5OrYdiX0cb4MWda3x7lV_uK88TeEyjKBQk9C1tOvzJjGbjpq1E/s512/GF02G8YVYmGTe8A3QukE--1--3wk9r.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijIfiajGQ6XB3c2RpH_J4Sgn9Qw3EWC6vleW_1Ohh6CyMn9RrDL9-LRGPlLzNQjC87AfAVxdJ1r5ulye4rGw8ox7lEUyRTN0EXLoDjkwdO_he-0-lb1Raty_k-_YQtaH3GahXRs_fhR5OrYdiX0cb4MWda3x7lV_uK88TeEyjKBQk9C1tOvzJjGbjpq1E/s320/GF02G8YVYmGTe8A3QukE--1--3wk9r.jpg"/></a></div>
<br>
<p>
Added 'on the sea'
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5kL5MMnTaPS2eF3SaZ7ZZz084deTXXHt3d7x7omzllBnZYMGSKwiCFLJNw6fR7ZguwM053dt9-mKNSbTIgW_f7N1JyT6r8eajpKh0gqxo3bYbZLPxgcK_WvNq192sPfBdGwJdMT2i2d9PZXJyq8aqg4izGfrP6-aIXdZOno6WDK4LSoP0ITXbpqHw2O0/s512/LSd2j5Iybbgprfe4XWEK--1--ibr8s.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5kL5MMnTaPS2eF3SaZ7ZZz084deTXXHt3d7x7omzllBnZYMGSKwiCFLJNw6fR7ZguwM053dt9-mKNSbTIgW_f7N1JyT6r8eajpKh0gqxo3bYbZLPxgcK_WvNq192sPfBdGwJdMT2i2d9PZXJyq8aqg4izGfrP6-aIXdZOno6WDK4LSoP0ITXbpqHw2O0/s320/LSd2j5Iybbgprfe4XWEK--1--ibr8s.jpg"/></a></div>
<br>
<p>
Too much sea.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6GCu3Yvc9dCN5FTOdNrysQb8f-2RooovOF_c0M-l1EkJUh6ijADUqBwhNwKvkx29K1jFL9epVYM6Wgp7a2weNR9Pk16kYLSMTKQIE2QXWdM_fwEdVPxQ6gnoAlwDtfVKZF8Ez3g8bCGWGWVwefhNu8nPcT_8xYFb2Wuy7gUVt9yqy4gRPa4pPmErq4w/s512/LyDFmCEWHv7mwI2HKLMH--1--zvfu4.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6GCu3Yvc9dCN5FTOdNrysQb8f-2RooovOF_c0M-l1EkJUh6ijADUqBwhNwKvkx29K1jFL9epVYM6Wgp7a2weNR9Pk16kYLSMTKQIE2QXWdM_fwEdVPxQ6gnoAlwDtfVKZF8Ez3g8bCGWGWVwefhNu8nPcT_8xYFb2Wuy7gUVt9yqy4gRPa4pPmErq4w/s320/LyDFmCEWHv7mwI2HKLMH--1--zvfu4.jpg"/></a></div>
<br>
<p>
Lost the plot now
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhckBJK5tUPni7zok259qkCmAqtXopfTZp5uFejxfP5M_5MGHLPbPHeWK3HX1j6RjWK-mFBxIX9r_m2-HNfYqEHGj7KUvRK_qfDHXCG9ifYXh3AaXaIxTykEk2k__ztTyyFkxRA2LaJBXwkAxS1gut5TYkdWb0HVMswrypQliHY0NPX9Y32UQ2HQ2yTVpA/s512/mQ0p2JJMWHuv6LiqBuQZ--1--05a79.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhckBJK5tUPni7zok259qkCmAqtXopfTZp5uFejxfP5M_5MGHLPbPHeWK3HX1j6RjWK-mFBxIX9r_m2-HNfYqEHGj7KUvRK_qfDHXCG9ifYXh3AaXaIxTykEk2k__ztTyyFkxRA2LaJBXwkAxS1gut5TYkdWb0HVMswrypQliHY0NPX9Y32UQ2HQ2yTVpA/s320/mQ0p2JJMWHuv6LiqBuQZ--1--05a79.jpg"/></a></div>
<br>
<p>
Back to ghost ship
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUCb04ahtNSt-MAdVVjvXS1RLLUFHRNp0H4VH15ZKU-RcUmNC6xWtBq-H0Ye81U8R4qEIDc07nEtGfbNkosogf-t0DMimcGJCCXwFiZWYRD5OG06R2KWBYHlu7CsUwfk713d3cYBisu_td_iwhSCJUts1HE0dCj4A-q9FGsNSRedjz48ptO93Yev6Mk4/s1024/OKJHKnywGSeuKRMhst9T--1--nadkc.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUCb04ahtNSt-MAdVVjvXS1RLLUFHRNp0H4VH15ZKU-RcUmNC6xWtBq-H0Ye81U8R4qEIDc07nEtGfbNkosogf-t0DMimcGJCCXwFiZWYRD5OG06R2KWBYHlu7CsUwfk713d3cYBisu_td_iwhSCJUts1HE0dCj4A-q9FGsNSRedjz48ptO93Yev6Mk4/s320/OKJHKnywGSeuKRMhst9T--1--nadkc.jpg"/></a></div>
<br>
<p>
'Indian skeleton crew on a ghost ship' in a different style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiAoUxuM-O7JXlHCWaSI1Zvk4sO9CG7FMUZO1VTJxi471_BynKZ_2KO1bdcJ9Qz_-ymJGBx8S1JY8ko6HRVHmUO5q-BZdUJctUKZh4XQL_X8FoW9g3mCPAuWjjC1evguNMZlzFcgj083AJJx93azTU7qMiud9RquctfxTd1HZUuA8b8hFbHEZlguFdcnk/s512/pmrG5yWbN2pHEVNOtHGE--1--wf8nu.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiAoUxuM-O7JXlHCWaSI1Zvk4sO9CG7FMUZO1VTJxi471_BynKZ_2KO1bdcJ9Qz_-ymJGBx8S1JY8ko6HRVHmUO5q-BZdUJctUKZh4XQL_X8FoW9g3mCPAuWjjC1evguNMZlzFcgj083AJJx93azTU7qMiud9RquctfxTd1HZUuA8b8hFbHEZlguFdcnk/s320/pmrG5yWbN2pHEVNOtHGE--1--wf8nu.jpg"/></a></div>
<br>
<p>
'Indian ghost ship' in a different style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLjoDKTJMjR00b9dG8RfGi_xPyXLQpujb1VR6FC47WtPhm1EdP3t3VVgDYSG9TmTlA-s3EGyDUU63BVd9WHAv0vRmzqzzpiIKdHs0sZUanjKw-OAQYM8JKgXKQZyCtIKMhWGfpu4t0uVLPFHOs2xJcq42nJy995vDx32hURt7flnJ0S6O1bFQPw9fpOR4/s512/xNEuq5glHsfQ97AGMer9--1--v0bmi.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLjoDKTJMjR00b9dG8RfGi_xPyXLQpujb1VR6FC47WtPhm1EdP3t3VVgDYSG9TmTlA-s3EGyDUU63BVd9WHAv0vRmzqzzpiIKdHs0sZUanjKw-OAQYM8JKgXKQZyCtIKMhWGfpu4t0uVLPFHOs2xJcq42nJy995vDx32hURt7flnJ0S6O1bFQPw9fpOR4/s320/xNEuq5glHsfQ97AGMer9--1--v0bmi.jpg"/></a></div>
<br>
<p>
'Ghost ship on the sea'
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgltkoBTIx0UljJeuy-o7E4OMXcVN3ow2wR65N5ZfdYlC26r4OfPDcHcDIGWDivhIX5VgIR3JnTDVz2tHXrQydaSTMJMPsexs0FqC9ckMTOENWyRbp37iD_HbHm2teIPKefMaj1uBMCNdXf3fXRq8wuZOKg0NWxniZnwBD6gYI7tIjBi7nDiy6WhrJzrQw/s512/yTAq1eo0yfv1j6yXmzKF--1--bsl9c.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgltkoBTIx0UljJeuy-o7E4OMXcVN3ow2wR65N5ZfdYlC26r4OfPDcHcDIGWDivhIX5VgIR3JnTDVz2tHXrQydaSTMJMPsexs0FqC9ckMTOENWyRbp37iD_HbHm2teIPKefMaj1uBMCNdXf3fXRq8wuZOKg0NWxniZnwBD6gYI7tIjBi7nDiy6WhrJzrQw/s320/yTAq1eo0yfv1j6yXmzKF--1--bsl9c.jpg"/></a></div>
<br>
<p>
'Indian ghost ship on the sea' in a different style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_gML7ttMh6JMILF3c3EerlbJS8lx9IeFiWFkFUj67HmOll5o62v8_L3Ce714INpwWwdcPgFhtCe8MuQn4EtYHT7Wl4VoEGG8pmDsOBHsY5HgnhhGDypkfEgFFDj5qBjKEUNfT0aRmg6jB6DXqtlh5Lmmb2092doAetujkSmdtf8DzYZU1RSTgCDpsp2c/s512/ZCcJzXx7hjDRUaH7DjrH--1--2e599.jpg" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="512" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_gML7ttMh6JMILF3c3EerlbJS8lx9IeFiWFkFUj67HmOll5o62v8_L3Ce714INpwWwdcPgFhtCe8MuQn4EtYHT7Wl4VoEGG8pmDsOBHsY5HgnhhGDypkfEgFFDj5qBjKEUNfT0aRmg6jB6DXqtlh5Lmmb2092doAetujkSmdtf8DzYZU1RSTgCDpsp2c/s320/ZCcJzXx7hjDRUaH7DjrH--1--2e599.jpg"/></a></div>
<br>
<p>
'Indian ghost ship on the sea'
</p>
<p>
Out of credits
</p>
<div class="separator" style="clear: both;">
<h3>Dall-e</h3>
<br>
<p>
The big user benefit of Dall-e is that the prompt is in the file name, so not relying upon my poor memory.
Dall-e does not seem to offer a download all option, which the others do.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD-inns3O4NfxO8GvJ7iuNv5LJBoLee6n1v9cq-jMyTIl2gqbB4_lKlgLPNZbe_ZN-IzzRY8MJ-dsVME-9XFT8gcgMylMOZk2v_j5B7eXICMPLfLvq6rPY92Nz4LGjh_5TUiCQNJ_2DJovjbBdNys1JmAS3Uq__EFXeoQ81hj0w6lar94pgmo7E6ZCLfA/s1024/DALL%C2%B7E%202023-07-16%2023.43.23%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD-inns3O4NfxO8GvJ7iuNv5LJBoLee6n1v9cq-jMyTIl2gqbB4_lKlgLPNZbe_ZN-IzzRY8MJ-dsVME-9XFT8gcgMylMOZk2v_j5B7eXICMPLfLvq6rPY92Nz4LGjh_5TUiCQNJ_2DJovjbBdNys1JmAS3Uq__EFXeoQ81hj0w6lar94pgmo7E6ZCLfA/s320/DALL%C2%B7E%202023-07-16%2023.43.23%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png"/></a></div>
<br>
<p>
The Marie Celeste and her Skeleton crew in a fantasy style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimLQYC-8IkMx6bYONPeRiaj3BYA95gON5xSvwbBzRcDPHKcuO3YWk3wN3TMZqL-IZq3i9yEWjhndvRJZmKOI5QkBlXXMyo7nFNRsq6akuQZdI7VtPaNpoT_cRhtQ1Q8KnwNx0hVMVazEYxXrDbA0EmP5bBosNyAHyg0m5xTVKkrpLxuiPuOZd8-ywQKmE/s1024/DALL%C2%B7E%202023-07-16%2023.44.01%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimLQYC-8IkMx6bYONPeRiaj3BYA95gON5xSvwbBzRcDPHKcuO3YWk3wN3TMZqL-IZq3i9yEWjhndvRJZmKOI5QkBlXXMyo7nFNRsq6akuQZdI7VtPaNpoT_cRhtQ1Q8KnwNx0hVMVazEYxXrDbA0EmP5bBosNyAHyg0m5xTVKkrpLxuiPuOZd8-ywQKmE/s320/DALL%C2%B7E%202023-07-16%2023.44.01%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png"/></a></div>
<br>
<p>
The Marie Celeste and her Skeleton crew in a fantasy style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPVBDx7sYy1ucDD1XYE5miE37tPa_E83MoSfTOFBPAAdq_2anxJ64cCW7ocPHp9np8w_MNX6bsLmuqLSg3qaqvKLr7w1HQTIP1irlbFKAyygX-IA8E3ssN_LUN0oUCaEGFf0lgy-FyEZhD5ueXNECYV0HI53_NMQtR09j6lotTShaVetf7ESRPf04Buak/s1024/DALL%C2%B7E%202023-07-16%2023.44.40%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPVBDx7sYy1ucDD1XYE5miE37tPa_E83MoSfTOFBPAAdq_2anxJ64cCW7ocPHp9np8w_MNX6bsLmuqLSg3qaqvKLr7w1HQTIP1irlbFKAyygX-IA8E3ssN_LUN0oUCaEGFf0lgy-FyEZhD5ueXNECYV0HI53_NMQtR09j6lotTShaVetf7ESRPf04Buak/s320/DALL%C2%B7E%202023-07-16%2023.44.40%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png"/></a></div>
<br>
<p>
The Marie Celeste and her Skeleton crew in a fantasy style
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJuZmGZweJb7M325QNdRZfRQ_5RiBUZcPx88jzeBGDqyvS6vYQLDFNHTZbTf1nrGAbuiOd-lq9rN8b7ptpxSzjR9iZ5y1nJoamC-pg-iTzwMC1vZfQ3cwXYcseLWYmQgCLDTYBo59D4xiH-Tb8nu55H2Lj6IiG_LQHgqs_UT2-xrxRgN8yRxN6quZ3pQ/s1024/DALL%C2%B7E%202023-07-16%2023.44.54%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="1024" data-original-width="1024" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJuZmGZweJb7M325QNdRZfRQ_5RiBUZcPx88jzeBGDqyvS6vYQLDFNHTZbTf1nrGAbuiOd-lq9rN8b7ptpxSzjR9iZ5y1nJoamC-pg-iTzwMC1vZfQ3cwXYcseLWYmQgCLDTYBo59D4xiH-Tb8nu55H2Lj6IiG_LQHgqs_UT2-xrxRgN8yRxN6quZ3pQ/s320/DALL%C2%B7E%202023-07-16%2023.44.54%20-%20The%20%20Marie%20Celeste%20and%20her%20Skeleton%20crew%20in%20a%20fantasy%20style.png"/></a></div>
<br>
<p>
The Marie Celeste and her Skeleton crew in a fantasy style
</p>
<h3>Conclusion</h3>
<p>
I never got the image I wanted, maybe the two ideas are too explicit, but I have an image which I can use. This process was not quick, but it is better than choosing a stock image from the Powerpoint selection.
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com1tag:blogger.com,1999:blog-2150042504803929508.post-21114384321284250162022-11-27T21:21:00.002+00:002022-11-27T21:21:31.427+00:00House Marks in Ossun-ez-Angles, Haute PyreneesLast summer, in Ossun-ez-Angles, Haute Pyrenees, I came across a <a href="https://en.wikipedia.org/wiki/House_mark">House Mark</a>
above a barn door.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF2PeTXUvz-g-Ij-EVV_qlDkiZAYiRHmN5NSc6hmpfBGkE8iUHYiNqlFgsOVT8ZeqSDYkcH3de3-q--wwKgYewVE5daAuJgcvqAvaGvUAuFh0h-Oz3gKHkX-vIaqPLFejpUnEOgdlv-GrakCSy4kcI3aksraolTJErQe5qvXWgKRfR2OdHB9lX4a4s/s4160/IMG_20220729_190059589.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4160" data-original-width="3120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF2PeTXUvz-g-Ij-EVV_qlDkiZAYiRHmN5NSc6hmpfBGkE8iUHYiNqlFgsOVT8ZeqSDYkcH3de3-q--wwKgYewVE5daAuJgcvqAvaGvUAuFh0h-Oz3gKHkX-vIaqPLFejpUnEOgdlv-GrakCSy4kcI3aksraolTJErQe5qvXWgKRfR2OdHB9lX4a4s/s400/IMG_20220729_190059589.jpg"/></a></div><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAOKPU-ti4RCYuXrzmHHMl8fWXCcMNP0omCV-MKm8NEZLJ-iwK4Z5lumS7Kvrtf5-Eu9-cmaXFO-G4-Wm2hBS6F7jm0e6wKJE1Kg5uF5uLWrxGySnKOHoLYZ4ZQpjI86rFobs5nvfCn6NlrWzSKLe9MDkgqHeQQPt_fShKD7dh9sXMt8iNn3mV5LR/s4160/IMG_20220729_190318557.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4160" data-original-width="3120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAOKPU-ti4RCYuXrzmHHMl8fWXCcMNP0omCV-MKm8NEZLJ-iwK4Z5lumS7Kvrtf5-Eu9-cmaXFO-G4-Wm2hBS6F7jm0e6wKJE1Kg5uF5uLWrxGySnKOHoLYZ4ZQpjI86rFobs5nvfCn6NlrWzSKLe9MDkgqHeQQPt_fShKD7dh9sXMt8iNn3mV5LR/s400/IMG_20220729_190318557.jpg"/></a></div>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-83778046450733763282022-10-05T19:46:00.003+01:002022-10-05T20:36:26.524+01:00The Tims by Eleanor Farjeon<h6>From <a href="https://www.amazon.co.uk/Little-Bookroom-Eleanor-Farjeon/dp/0192732498">The Little Bookroom by Eleanor Farjeon</a> via <a href="https://www.eldrbarry.net/rabb/farj/tims.htm">Eldrbarry</a></h6>
<p>There were five Tims all told, Old Tim, Big Tim, Little Tim, Young Tim and Baby Tim, and they were all born wise. So whenever something was the matter in the village, or anything went wrong, or people for some cause were vexed or sorry for themselves, it became their habit to say <i>"Let's go to the Tims about it, they'll know, they were born wise."</i></p>
<p>For instance, when Farmer John found out that the gypsies had slept without leave in his barn one night, his first thought was not, as you might suppose, <i>"I'll fetch the constable and have the law on them!"</i> but, <i>"I'll see Old Tim about it, so I will!"</i></p>
<p>Then off he went to Old Tim, who was eighty years old, and he found him sitting on a gate, smoking his clay pipe.</p>
<p><i>"Morning, Old Tim," </i>said Farmer John.
<i>"Morning, Farmer John,"</i> said Old Tim taking his clay pipe from his mouth.
<i>"I've had gypsies in my barn again, Old Tim,"</i> said Farmer John
<i>"Ah, have you now!"</i>said Old Tim.
<i>"Ay, that I have,"</i> said Farmer John.
<i>"Ah, to be sure!,"</i> said Old Tim.
<i>"You were born wise, Old Tim," </i>said Farmer John. <i>"What would you do if you was me?"</i><p>
Old Tim put his clay pipe in his mouth again and said, <i>"If I was you, I'd ask Big Tim about it, for he was born wise too and is but sixty years old. So I be twenty years further off wisdom than he be."</i></p>
<p>Then off he went to Big Tim, who was Old Tim's son, and he found him sitting on a gate, smoking his briar.</p>
<p><i>"Morning, Big Tim," </i>said Farmer John.
<i>"Morning, Farmer John,"</i> said Big Tim taking his briar from his mouth.
<i>"I've had gypsies in my barn again, Big Tim, and Old Tim sent me to ask what you would do if you was me, for you were born wise"</i> said Farmer John.
Big Tim put his briar in his mouth again and said, <i>"If I was you, I'd ask Little Tim about it, for he was born wise too and is but forty years old which is twenty year nigher to wisdom than me."</i></p>
<p>Then off he went to Little Tim, who was Big Tim's son, and he found him lying in a haystack chewing a straw.</p>
<p>
<i>"Morning, Little Tim,"</i> said Farmer John.
<i>"Morning, Farmer John,"</i> said Little Tim taking the straw from his mouth.
Then Farmer John put his case again, saying, <i>"Big Tim told me to come to you about it, for you were born wise".</i>
Big Tim put the straw back in his mouth again and said, <i>"Young Tim was born wise too and he's but twenty years old. You'll get wisdom fresher from him than from me."</i></p>
<p>Then off went Farmer John to find Young Tim, who was Little Tim's son, and he found him staring into the mill pond, munching an apple.</p>
<p>"<i>Morning, Young Tim,"</i> said Farmer John.
<i>"Morning, Farmer John,"</i> said Young Tim taking the apple from his mouth.
Then Farmer John told his tale for the fourth time, and ended by saying, <i>"Little Tim thinks you'll know what I'd best do, for you were born wise".</i>
Young Tim took a new bite of his apple and said, <i>"My son who was born last month was born wise too, and from him you'll get wisdom at the fountain-head, so to say."</i></p>
<p>Off went Farmer John to find Baby Tim, who was Young Tim's son, and he found him in his cradle with his thumb in his mouth.</p>
<p><i>"Morning, Baby Tim,"</i> said Farmer John.
Baby Tim took his thumb out of his mouth and said nothing.
<i>"I've had gypsies in my barn again, Baby Tim,"</i> said Farmer John, <i>"and Young Tim advised me to ask your advice upon it, for you was born wise. What would you do if you was me? I'll do whatever you say."</i>
Baby Tim put his thumb back in his mouth and said nothing.
So Farmer John went home and did it.</p>
<p>And the gypsies went on to the next village and slept in the barn of Farmer George, and Farmer George called in the constable and had the law on them; and a week later his barn and his ricks were burned down, and his speckled hen was stolen away.</p>
<p>But the happy village went on being happy and doing nothing, neither when the Miller's wife forgot herself one day and boxed the Miller's ears, nor when Molly Garden got a bad sixpence from the pedlar, nor when the parson once came home singing by moonlight. After consulting the Tims, the village did no more than trees do in a wood or crops in a field and so all these accidents got better before they got worse.</p>
<p>Until the day when Baby Tim died an unmarried man at one hundred years of age. After that the happy village became as other villages and did something.</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-46048524102268796242022-03-23T20:58:00.006+00:002022-03-23T21:03:32.694+00:00Letter to Anneliese Dodds on the invasion of Ukraine by Russia<p>
Dear Anneliese Dodds,
</p>
<p>
I learn from the BBC (<a href="https://www.bbc.co.uk/news/58888451" target="_blank" rel="nofollow">https://www.bbc.co.uk/news/58888451</a>) that
"The UK is to phase out Russian oil by the end of the year" and "Russian imports account for 8% of total UK oil demand".
</p>
<p>
8% is a small amount and the end of the year is a long time in the future.
We need immediate action to change Russia's course.
Please use all your influence to this end.
</p>
<p>
Some suggestions, as a minimum:
</p>
<ul>
<li> Stop all petrochemical purchases from Russia, and requiring this of multinationals
</li>
<li>Expulsion of all remaining Russian banks from SWIFT
</li>
<li>Make it unlawful to insure a Russian enterprise
</li>
<li>Seizure and forfeiture of all Russian assets within the UK and its dominions
</li>
<li>Motion to remove Russia from the UN Security Council
</li>
</ul>
<p>
There are many more things which could and should be done, by January 2023 there will be no Ukraine to defend.
</p>
<p>
Yours sincerely,<br>
Tim Pizey
</p>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-74959529030669849222021-11-14T23:37:00.002+00:002021-11-23T10:14:50.203+00:00An Exception wrapper suitable for a RESTful API
<h3>User Story</h3>
<p>
As a third line support engineer
</p>
<p>
I want to be able to go to the server class that throws an exception reported by a client
</p>
<p>
So that I do not need to look for the stack trace in the server logs
</p>
<h3>Example</h3>
<p>
Client code
</p>
<code><pre>if (responseCode != 200) {
throw new TaskException(
"Error occurred while processing the scan response: " +
"response code: " + responseCode +
" response body: " + responseContent.getResponseBody());
} </pre>
</code>
<h3>
Server code
</h3>
<code><pre>
if (null != header && header.startsWith(BEARER)) {
String token = header.substring(BEARER.length()).trim();
try {
final Jws<Claims> jws = Jwts.parser().setSigningKeyResolver(jwtPublicKeyResolver)
.setAllowedClockSkewSeconds(3)
.parseClaimsJws(token);
} catch (JwtException ex) {
String errorMessage = "Invalid JWT token. ";
setError(httpServletResponse, errorMessage + ex.getMessage());
return;
}
}</pre>
</code>
<p>
This results in the following being reported by the second level support agent monitoring the client logs:
</p><code>
[Error occurred while processing the scan response : response code: 401 response body: Invalid JWT token. Error accessing publickey Api]:
</code>
<p>
What we, as Third Line Support, want is to know which server class throws the exception, ideally without grepping the code base or opening the server logs.
</p>
<p>
A better Exception message would be:
</p>
<code>
[Problem with scan response: status code: 401, body: com.corp.server.validation.JwtValidator.validate() line 72: JWT token Exception: Error accessing Public Key API]
</code>
<p>This is the motivation for the StackAwareException, a wrapper exception which adds the class, method and line number of the first element of the wrapped exception's stack trace.
</p>
<p>
See <a href="https://github.com/timp/StackAwareException" target="_blank">https://github.com/timp/StackAwareException</a>
</p>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-68125879286462596312021-10-12T00:51:00.006+01:002024-02-24T12:28:03.567+00:00Twenty Year Exit from the Oracle EcosystemThe Oracle Ecosystem instance that I inheritted was designed from 2000 and went live in 2004. Its centre piece <a href="https://docs.oracle.com/cd/B12037_01/workflow.101/b10285/ugov.htm">Oracle Workflow</a> went end of life that year but <a href="https://blogs.oracle.com/ebstech/post/whats-the-future-of-oracle-workflow">had new versions through to 2007</a>.
In its own way it was a pinnacle of a certain view of software, the software vendor as a one stop shop, in the same way as DEC and IBM had previously sold their systems.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJthnAJw5LkgFWMnFwYE2UWc2j-r7Vbq2gKq24jaHk5Jj3JOtxZSolOzpf9Z8tfyyWXXTQFQCm4NB_ghXvQ_FfrNVNL4SQn9023jYT7Rm0haej2j6fMQWmITz3WWtc7CAhBI9Ev9BHtMQ/s1280/Slide2.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJthnAJw5LkgFWMnFwYE2UWc2j-r7Vbq2gKq24jaHk5Jj3JOtxZSolOzpf9Z8tfyyWXXTQFQCm4NB_ghXvQ_FfrNVNL4SQn9023jYT7Rm0haej2j6fMQWmITz3WWtc7CAhBI9Ev9BHtMQ/s600/Slide2.PNG"/></a></div>
A whole set of components which were guaranteed to work together, with technical support. I probably would have made the same choice, even as late as 2000.
This system was the largest system (by disk storage used) in Europe for a while. Housed in a purpose built computer room.
Then came AWS S3 cloud storage.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN_t8hnVRM7r5uT2Zcw1XFTkryT0Z9eD_kB9HDY9stCBreaMua3xuFOB3gxE9Wryns4QODHKwAfLPvsn9F30KO_Mz04wfdk-5ah4a79rHl7Yi_tXPlHBQnT30X3Gznpe3dnHuEexXz0MY/s1280/Slide3.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN_t8hnVRM7r5uT2Zcw1XFTkryT0Z9eD_kB9HDY9stCBreaMua3xuFOB3gxE9Wryns4QODHKwAfLPvsn9F30KO_Mz04wfdk-5ah4a79rHl7Yi_tXPlHBQnT30X3Gznpe3dnHuEexXz0MY/s600/Slide3.PNG"/></a></div>
The 'replacement' system migrated eighty percent of the files out of the database, seemingly unaware of the eighty-twenty rule, and duplicated the data and the dataflows. The replacement system was a 'microservice architecture' joined by a single datastore.
The users now had two systems to use and were stuck with a 2000 vintage user interface.
The next step was to stop using the Oracle Forms and introduce a modern three tier web application, choosing the new, shiny AngularJS as the front end, Hibernate on java as the middleware.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv3Y_C05TZ_LaHFH7MdnU0qYxiUjp8mimiLOfpxjB5N_JRoWQMIc4HAIqe10eoY-i8vbF2cHPvQA6RGmBndj20PvtzQ-uxK66rxxVBxwwGDucq69o0FbCFV6DtMBOA4FrS1eWlk9nM_cM/s1280/Slide4.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv3Y_C05TZ_LaHFH7MdnU0qYxiUjp8mimiLOfpxjB5N_JRoWQMIc4HAIqe10eoY-i8vbF2cHPvQA6RGmBndj20PvtzQ-uxK66rxxVBxwwGDucq69o0FbCFV6DtMBOA4FrS1eWlk9nM_cM/s600/Slide4.PNG"/></a></div>
This was understandabley a big job, the UI was now on AWS but the data was in a data centre (a commercial one by now).
The need to quit the data centre motivated the removal of CMSDK (Content Management Software Development Kit) from inside the database to separate, external, email and SFTP handling systems, to reduce database size and enable security in the cloud.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP7tie2oGgBzNLZbLlgSRsHBiEp3rFNh70uRaQuGMVrcBR1fghY8yzCPNPqRgartygOkiqP5FNLcBF5Y-53fxNoGvCA4Iwl9cxz0G4hKdD6YvbxJF5LV8lkHsjibsXM63PtblffjSzIv4/s1280/Slide5.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP7tie2oGgBzNLZbLlgSRsHBiEp3rFNh70uRaQuGMVrcBR1fghY8yzCPNPqRgartygOkiqP5FNLcBF5Y-53fxNoGvCA4Iwl9cxz0G4hKdD6YvbxJF5LV8lkHsjibsXM63PtblffjSzIv4/s600/Slide5.PNG"/></a></div>
The remaining steps are to finish the migration of files (who knew this would be the difficult bit) and to migrate from Oracle AQ (Advanced Queues (software naming error 101: avoid hubristic adjectives)) to AWS SQS (Simple Queueing Service (software naming error 102: avoid indexical adjectives)). Note that we have to upgrade AngularJS to Angular just to stay still, and pop things into Kubernetes, just because.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglpmF6J_Mu2W5p8pj-EJTgcn11FQsCFGHZ2mlJqisKrte5_CwU8MjUoXwGCKQSI_QLAVs5Lwd-TV2FdxhpCx0oexug_QfQ4S_7gQwj4vhWYuEjoo_vd0VWhWcIok5PATsbeRwxvmluEmk/s1280/Slide6.PNG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglpmF6J_Mu2W5p8pj-EJTgcn11FQsCFGHZ2mlJqisKrte5_CwU8MjUoXwGCKQSI_QLAVs5Lwd-TV2FdxhpCx0oexug_QfQ4S_7gQwj4vhWYuEjoo_vd0VWhWcIok5PATsbeRwxvmluEmk/s600/Slide6.PNG"/></a></div>
This is clean, recogisable, manageable and stable. We could rest here for a while; but all that pain motivates completion:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUvQPbolm2AbideHPT9WHR4PYWblqtlGJyEerco71bwq7dkMFL_NSOflSlz9FdSIIi532W_2gk1Ho71LdB_gbxyNYVBzMUbEkM5bv9SbNmQoYgJiE2pFQ9K_vmrI4r9xt2NUkE4gmS1tk/s1280/Escape+from+Oracle.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUvQPbolm2AbideHPT9WHR4PYWblqtlGJyEerco71bwq7dkMFL_NSOflSlz9FdSIIi532W_2gk1Ho71LdB_gbxyNYVBzMUbEkM5bv9SbNmQoYgJiE2pFQ9K_vmrI4r9xt2NUkE4gmS1tk/s600/Escape+from+Oracle.png"/></a></div>
The elephant is in the room. The final step is then to replace Oracle Workflow with <a href="https://camunda.com/">Camunda</a>.
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-42492372256113991012020-11-01T14:43:00.004+00:002020-11-01T14:49:36.693+00:00Letter to Anneliese Dodds MP: Support for the Labour Left<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDtuaoJUKiTPMfVn4oTbRt2ksNUKnLu3WO3yi1hmOYeZGN2bExCjnZ0B8hA7ng2vp_o2PIKgmPetX325xvYm3neBLACxojCsKq3AaZrBy8J_lwGVjrKwSiYjpfXiEzKK-cPvIfA-6CHWU/s800/Anneliese-1-800.jpg" style="display: block; padding: 1em 0; text-align: top; clear: right; float: right;"><img alt="" border="0" width="200" data-original-height="478" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDtuaoJUKiTPMfVn4oTbRt2ksNUKnLu3WO3yi1hmOYeZGN2bExCjnZ0B8hA7ng2vp_o2PIKgmPetX325xvYm3neBLACxojCsKq3AaZrBy8J_lwGVjrKwSiYjpfXiEzKK-cPvIfA-6CHWU/s200/Anneliese-1-800.jpg"/></a></div><quote>
<p>
Dear Anneliese Dodds MP,
</p>
<p>
I have voted for you in the last two elections, as a proxy for my support for Jeremy Corbyn, though your attendance and performance at the hustings arranged by the Stop the War Coalition was a reason for my support for you personally.
</p>
<p>
For me to vote for you again I would need to see your support for the left of the Labour party, and the mass movement built by Jeremy Corbyn; should you instead side with the faction which has suspended him you will lose my support.
</p>
<p>
best wishes
<br>
Tim Pizey
</p>
</quote>Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-32132608911059183762020-05-08T12:54:00.003+01:002020-05-15T18:52:50.556+01:00Victory in Europe (VE) Day in Churchill's Toyshop<p>
My grandfather, Norman Angier, </p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkAJnCDh3FruHgYuXZacGkIxGxmisTSAalsN0xl5aDwxn2N6ViMQsa_yGqsSo46eGuiuqi-ddM9XMbN3zFnYOQLXWYW0YAgiiz0HoaAQqw8emXDqTw_2AkVC-R0elFYfvimP6W4D_P3_s/s1600/Norman_Angier_IMG_20200508.jpg" imageanchor="1" title="Norman Angier"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkAJnCDh3FruHgYuXZacGkIxGxmisTSAalsN0xl5aDwxn2N6ViMQsa_yGqsSo46eGuiuqi-ddM9XMbN3zFnYOQLXWYW0YAgiiz0HoaAQqw8emXDqTw_2AkVC-R0elFYfvimP6W4D_P3_s/s320/Norman_Angier_IMG_20200508.jpg" width="240" height="320" data-original-width="1200" data-original-height="1600" alt="Norman Angier"/></a>
<p> worked at <a href="https://www.amazon.co.uk/Winston-Churchills-Toyshop-Military-Intelligence/dp/1445608421" >Churchill’s Toyshop</a> (<a href="https://en.wikipedia.org/wiki/MD1_(military_R%26D_organisation)">M.D.1</a>) as the head civilian engineer during WWII.
</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_QcGVJWyYzNaXGkGtO_3uiPjP9UAOCilv2lChI7BsRNJ-oCy2sIrusGVYb0XheyeGGazsqrZ5_Zgm1IXM1HdfRjJpDsWhUXpgel3TJ5IAfftZXlV2P2h8FRqZkQzsr7xU-CIy15KHlEE/s1600/Norman_Angier_IMG_20200508_135206276.jpg" imageanchor="1"
title="The Firs"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_QcGVJWyYzNaXGkGtO_3uiPjP9UAOCilv2lChI7BsRNJ-oCy2sIrusGVYb0XheyeGGazsqrZ5_Zgm1IXM1HdfRjJpDsWhUXpgel3TJ5IAfftZXlV2P2h8FRqZkQzsr7xU-CIy15KHlEE/s320/Norman_Angier_IMG_20200508_135206276.jpg" width="240" height="320" data-original-width="1200" data-original-height="1600" alt="Norman Angier"/></a>
<p>
On VE day
<quote>“Norman Angier felt it was an occasion for fireworks. He therefore acquired a large batch of quite big rockets and proceeded to poop them off, selecting as his firing site a point at the summit of a concrete road which led down to the ranges and the CMP’s camp. Unlike the Guy Fawkes day rockets, these were not provided with sticks for poking into the ground to keep the bodies upright ; but Norman had fixed up some sort of stand for doing this. All went well for a while and the show was most spectacular. Then Norman got careless. A rocket he had just initiated was not properly secured. It fell over, and instead of going up vertically proceeded at speed in the near horizontal plane. A weary CMP was walking along this road on his way back to the camp. The rocket struck him right on target. Luckily, he was not seriously hurt and we soon whipped him off to hospital . The trouble was to make him believe that the attack was not intentional. He had been the victim of a 1000 to 1 chance.”
</quote>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4SaLK5yhJswCFd-Z_rs4IMFJ9yEnOcPQrsgTDOJROn9416UFwMDPr4O-4B_idDHrcMS3Ijqw2YvmefNB8JZlfr2Gekke_OtWtJ0gpQhGm3EpbpGu5x1U0CdcCphWdM2_F3nlACwpDZXQ/s1600/Norman_Angier_IMG_20200508_135225019.jpg" imageanchor="1" title="Norman Angier preparing to detonate De Gaul"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4SaLK5yhJswCFd-Z_rs4IMFJ9yEnOcPQrsgTDOJROn9416UFwMDPr4O-4B_idDHrcMS3Ijqw2YvmefNB8JZlfr2Gekke_OtWtJ0gpQhGm3EpbpGu5x1U0CdcCphWdM2_F3nlACwpDZXQ/s320/Norman_Angier_IMG_20200508_135225019.jpg" width="240" height="320" data-original-width="1200" data-original-height="1600" alt="Norman prepares to detonate DeGaul" alt="The Firs" /></a>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com1tag:blogger.com,1999:blog-2150042504803929508.post-73298500133762750952019-02-22T14:50:00.001+00:002019-02-22T16:23:32.462+00:00Clean git blame historyPlace the following in a command file, run it within your repo:
<pre class="fileText">
#!/bin/sh
git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_AUTHOR_EMAIL" = "timp@paneris.org" ]
then
an="Tim Pizey"
am="timp21337@paneris.org"
fi
if [ "$GIT_COMMITTER_EMAIL" = "timp@paneris.org" ]
then
cn="Tim Pizey"
cm="timp21337@paneris.org"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
</pre>
Then
<code>
git push -f origin master </code>
Note that this process is very slow so do not repeat for every change: add all the changes you want to make and perform in one pass.Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-21802240427210456852018-10-05T17:47:00.002+01:002018-10-05T17:57:02.983+01:00Disaster Recovery: A Dynamic Redundancy Approach<p>
The problem with disaster planning is that it is not rehearsed. When you need to retrieve a file from backup is when you discover that your backup has been broken for three months.
</p><p>
Modern cloud systems, based upon software defined infrastructure and redundant, auto-scaling fleets of micro-services, come with disaster recovery built in. They are designed to be resilient against DDoS attacks, unexpected peaks in usage and continent wide unavailability.
</p><p>
Some systems have yet to migrate to outsourced infrastructure, some never will migrate.
For these systems we need a Disaster Recovery Strategy which can be implemented within reasonable costs and ideally does not suffer from the <b>fails when needed</b> feature of many backup systems.
One answer is to do regular <em>fire drills</em>. No one would dispute the importance of fire drills in saving lives and ensuring that people know what to do in the case of a real fire, however we all know there is a big difference between a rehearsal and the real thing.
</p><p>
The key insight in the modern cloud architectures is that every version of a system is the same (at a particular time).
</p><p>
We can reduce this to a minimal redundant system: a pair of identical systems with one designated Primary and the other Secondary, with a standard data mirroring link from Primary to Secondary.
</p><p>
To ensure that both elements of the pair really can function as the Primary you could <b>rehearse a cutover</b> one weekend.
</p><p>
But if the two systems really are identical then there is no reason to reverse the cutover at the end of the rehearsal. The old Secondary <em>is</em> the new Primary, the old Primary <em>is</em> the new Secondary. The Primary can be swapped at a periodicity the business is comfortable with, say twice a year.
</p><p>
This Dynamic Redundancy strategy ensures that your Disaster Recovery works when you need it to and can be adjusted according to the business' appetite for risk.
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-80816981113352203632018-09-13T12:36:00.000+01:002018-09-13T19:00:33.369+01:00Direct access to SonarQube Postgresql Database I want to change to change the name of a sonarqube project.
This cannot be done without performing another analysis.
You can just do it in SQL https://stackoverflow.com/questions/30511849/how-to-rename-a-project-in-sonarqube-5-1
but you have to be able to login to the database.
Postgresql is very secure.
A quick fix is to edit <tt>/var/lib//pgsql/pg_hba.conf</tt>
change local connections from ident to trust:
<pre><code>
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
</code></pre>
Now you can edit:
<pre><code>
psql -U sonarqube -W sonar
</code></pre>
and finally:
<pre><code>
UPDATE projects
SET name = 'NEW_PROJECT_NAME',
long_name = 'NEW_PROJECT_NAME'
WHERE kee = 'PROJECT_KEY'
</code></pre>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-32786756644392695792017-08-03T19:55:00.000+01:002017-08-03T19:55:59.948+01:00Thames path improvements - Letter to Oxfordshire County Council <p>
I have sent the following letter to <b>LTS.Team AT oxfordshire.gov.uk</b> in response to
<a href="https://consultations.oxfordshire.gov.uk/consult.ti/OxfordRiversideRoutes/">https://consultations.oxfordshire.gov.uk/consult.ti/OxfordRiversideRoutes/</a>.
</p>
<p> </p>
Hi,
<p> </p>
I have submitted the following via the questionnaire:
<p> </p>
<div style="margin:3em;">
The Oxpens bridge should move upstream to parallel
the railway bridge with a path extension besides railway
to station.
Getting from Thames/railway station to canal towpath and
up to Kidlington Airport and Kidlington new housing extension
needed.
Second bridge, again parallel to rail bridge needed to
access Science Park.
</div>
<p> </p>
I have used the Thames towpath for commuting to Osney Mead industrial estate for three months and for work on Cornmarket for three years.
I also used the path for three months to commute to Kidlington (Oxford Airport) but it is too arduous and much to my sadness I now cycle on the road, so have trenchant views on the difficulty of cycle commuting in Oxford.
<p> </p>
I understand that there is a plan to build many new houses in the Kidlington gap, between Summertown and Kidlington.
<p> </p>
These new commuters would very much appreciate a functioning cycle route into the centre of town.
<p> </p>
The new Oxford Parkway should be integrated into this cycle route.
<p> </p>
The problem facing cyclists is not how to get from the towpath to the Centre, this is served by the pipe bridge, the pedestrian crossing down stream and Folley Bridge.
What is needed is easy access to the railway station which could be easily achieved by a bridge parallel to the railway bridge and then along railway land to the station itself.
<p> </p>
Cyclists wishing to get from the Thames to the canal have to continue to Osney, cross the road and then fiddle around the Thames onto the canal path, which is in a very poor state, then up to Kingsbridge and all the way through Kidlington to the Oxford Airport.
<p> </p>
Finally the Thames path should connect the Science Park, and the planned new housing at Littlemore. This again could be achieved by a cycle bridge parallel to the existing railway bridge down stream from the bypass underpass.
<p> </p>
I really welcome the proposals but would urge you to consider extending its scope and vision. This could be such a good route and would show that Oxford is a cycling city.
<p> </p>
best regards
Tim Pizey
</quote>
<p>
</p>
--
Tim Pizey - http://tim.pizey.uk/Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-71936398276536427542017-06-28T10:10:00.000+01:002017-06-28T13:54:30.475+01:00Tell, don't askMore than twelve years ago <a href="https://twitter.com/timjoyce11">Tim Joyce</a> passed on some programming wisdom:
<h3>
With programs <em>tell don't ask</em>, vice versa for people.
</h3>
This was a bit abstract for me at the time but last night it came back to me as what is wrong with the code I am currently working on.
We store our application configuration in a table in the system's target database and whenever some configuration is needed it is looked up in the database.
There was no problem with this approach when the code was written because JUnit had not been invented and testing was not the main part of our discipline.
However to write a test we would need a database present, which is an obstacle to fast, distinct, unit tests and has been a blocker to writing tests.
<h4>Noncompliant Code Example</h4>
<pre><code>public class Example {
private String path;
public void logPath() {
try {
path = CachedSystemParameter.getInstance().
getParameterValue("PATH");
} catch (SystemParameterException e) {
logger.error("[BUSINESS] Error while retrieving system parameter PATH", e);
}
logger.info("Path: " + path);
}
}
</code></pre>
<h4>Compliant Code Example</h4>
By adding <tt>sftpPath</tt> to the class constructor we can test the business logic without the need for a database fixture.
<pre><code>public class Example {
private String path;
public Example() {
this(CachedSystemParameter.getInstance().
getParameterValue("PATH"));
}
public Example(String path) {
this.path = path;
}
public void logPath() {
logger.info("Path: " + path);
}
}
</code></pre>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0tag:blogger.com,1999:blog-2150042504803929508.post-13673140140124451152017-05-04T13:27:00.000+01:002017-05-04T14:00:05.112+01:00Testing java slf4j over log4j logging in JUnit using SLF4J Test<p>
Testing logging on failure paths has two problems:
<ul>
<li>
It is hard to get the log message text
</li>
<li>
The logger outputs to the test log
</li>
</ul>
The first leads to compromises eg verifying only that a message was logged, the second makes you, the programmer, think an error has occurred when the tests in fact passed.
</p>
<h4>Code to test</h4>
<pre><code>
public class Sut {
public String perform() {
getLog().debug("In perform");
return "Hello world";
}
}
</code></pre>
<h3>My clunky PowerMock Solution</h3>
<p>
My approach was problematic as it required the use of PowerMock which is as powerful as nitroglycerin.
</p>
<h4>Test Code</h4>
<pre><code>
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class SutTest {
@Test
public void testPerform() {
mockStatic(LoggerFactory.class);
Logger mockLog = mock(Logger.class);
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(mockLog);
assertEquals("Hello world", new Sut().perform());
verify(mockLog, times(1)).debug(startsWith("In perform"));
}
}
</code></pre>
<h3>Elegant SLF4j Test Solution </h3>
<p>
The <a href="http://projects.lidalia.org.uk/slf4j-test/index.html">slf4j-test</a> project by <a href="https://twitter.com/RobElliot266">RobElliot266</a> provides a logger which stores messages and so can be asserted against.
</p>
<h4>POM Setup</h4>
<p>
Add the following to your dependencies
</p>
<pre><code>
<dependency>
<groupId>uk.org.lidalia</groupId>
<artifactId>slf4j-test</artifactId>
<version>1.1.0</version>
<scope>test</scope>
</dependency>
</code></pre>
<p>
To ensure that this logger is used during tests only and that it takes precedence over the production logger in the test class path ensure the test logger is the first logger mentioned in the dependencies block and has a test scope.
</p>
<p>
As an additional measure you can explicitly exclude the production logger from the test class path:
</p>
<pre><code>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<classpathDependencyExcludes>
<classpathDependencyExcludes>org.slf4j:slf4j-jdk14</classpathDependencyExcludes>
</classpathDependencyExcludes>
</configuration>
</plugin>
</code></pre>
<h4>Test Code</h4>
<pre><code>
public class SutTest {
@Test
public void testPerform() {
assertEquals("Hello world", new Sut().perform());
assertEquals("Testing", logger.getLoggingEvents().get(0).getMessage());
}
}
</code></pre>
<p>
Much thanks to <a href="https://twitter.com/RobElliot266">RobElliot266</a> for an neat solution to a problem that has been bugging me for a while.
</p>
Tim Pizeyhttp://www.blogger.com/profile/15301339931345833746noreply@blogger.com0