mirror of
				https://github.com/alanorth/cgspace-notes.git
				synced 2025-01-27 05:49:12 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			37bdf2645f
			...
			479bb9684a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 479bb9684a | |||
| 5cd298a37a | 
| @@ -517,4 +517,69 @@ colly | awk '{print $1}' | sort | uniq -c | sort -h | |||||||
| - I exported CGSpace to check for missing Initiative collection mappings | - I exported CGSpace to check for missing Initiative collection mappings | ||||||
| - Start a harvest on AReS | - Start a harvest on AReS | ||||||
|  |  | ||||||
|  | ## 2023-03-27 | ||||||
|  |  | ||||||
|  | - The harvest on AReS was incredibly slow and I stopped it about half way twelve hours later | ||||||
|  |   - Then I relied on the plugins to get missing items, which caused a high load on the server but actually worked fine | ||||||
|  | - Continue working on thumbnails on DSpace | ||||||
|  |  | ||||||
|  | ## 2023-03-28 | ||||||
|  |  | ||||||
|  | - Regarding ImageMagick there are a few things I've learned | ||||||
|  |   - The `-quality` setting does different things for different output formats, see: https://imagemagick.org/script/command-line-options.php#quality | ||||||
|  |   - The `-compress` setting controls the compression algorithm for image data, and is unrelated to lossless/lossy | ||||||
|  |     - On that note, `-compress lossless` for JPEGs refers to Lossless JPEG, which is not well defined or supported and should be avoided | ||||||
|  |     - See: https://imagemagick.org/script/command-line-options.php#compress | ||||||
|  |   - The way DSpace currently does its supersampling by exporting to a JPEG, then making a thumbnail of the JPEG, is a double lossy operation | ||||||
|  |     - We should be exporting to something lossless like PNG, PPM, or MIFF, then making a thumbnail from that | ||||||
|  |   - The PNG format is always lossless so the `-quality` setting controls compression and filtering, but has no effect on the appearance or signature of PNG images | ||||||
|  |   - You can use `-quality n` with WebP's `-define webp:lossless=true`,  but I'm not sure about the interaction between ImageMagick quality and WebP lossless... | ||||||
|  |     - Also, if converting from a lossless format to WebP lossless in the same command, ImageMagick will ignore quality settings | ||||||
|  |   - The MIFF format is useful for piping between ImageMagick commands, but it is also lossless and the quality setting is ignored | ||||||
|  |   - You can use a format specifier when piping between ImageMagick commands without writing a file | ||||||
|  |   - For example, I want to create a lossless PNG from a distorted JPEG for comparison: | ||||||
|  |  | ||||||
|  | ```console | ||||||
|  | $ magick convert reference.jpg -quality 85 jpg:- | convert - distorted-lossless.png | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | - If I convert the JPEG to PNG directly it will ignore the quality setting, so I set the quality and the output format, then pipe it to ImageMagick again to convert to lossless PNG | ||||||
|  | - In an attempt to quantify the generation loss from DSpace's "JPG JPG" method of creating thumbnails I wrote a script called `generation-loss.sh` to test against a new "PNG JPG" method | ||||||
|  |   - With my sample set of seventeen PDFs from CGSpace I found that _the "JPG JPG" method of thumbnailing results in scores an average of 1.6% lower than with the "PNG JPG" method_. | ||||||
|  |   - The average file size with _the "PNG JPG" method was only 200 bytes larger_. | ||||||
|  | - In my brief testing, the relationship between ImageMagick's `-quality` setting and WebP's `-define webp:lossless=true` setting are completely unpredictable: | ||||||
|  |  | ||||||
|  | ```console | ||||||
|  | $ magick convert img/10568-103447.pdf.png /tmp/10568-103447.webp | ||||||
|  | $ magick convert img/10568-103447.pdf.png -define webp:lossless=true /tmp/10568-103447-lossless.webp | ||||||
|  | $ magick convert img/10568-103447.pdf.png -define webp:lossless=true -quality 50 /tmp/10568-103447-lossless-q50.webp | ||||||
|  | $ magick convert img/10568-103447.pdf.png -quality 10 -define webp:lossless=true /tmp/10568-103447-lossless-q10.webp | ||||||
|  | $ magick convert img/10568-103447.pdf.png -quality 90 -define webp:lossless=true /tmp/10568-103447-lossless-q90.webp | ||||||
|  | $ ls -l /tmp/10568-103447* | ||||||
|  | -rw-r--r-- 1 aorth aorth 359258 Mar 28 21:16 /tmp/10568-103447-lossless-q10.webp | ||||||
|  | -rw-r--r-- 1 aorth aorth 303850 Mar 28 21:15 /tmp/10568-103447-lossless-q50.webp | ||||||
|  | -rw-r--r-- 1 aorth aorth 296832 Mar 28 21:16 /tmp/10568-103447-lossless-q90.webp | ||||||
|  | -rw-r--r-- 1 aorth aorth 299566 Mar 28 21:13 /tmp/10568-103447-lossless.webp | ||||||
|  | -rw-r--r-- 1 aorth aorth 190718 Mar 28 21:13 /tmp/10568-103447.webp | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | - I'm curious to see a comparison between the ImageMagick `-define webp:emulate-jpeg-size=true` (aka `-jpeg_like` in cwebp) option compared to normal lossy WebP quality: | ||||||
|  |  | ||||||
|  | ```console | ||||||
|  | $ for q in 70 80 90; do magick convert img/10568-103447.pdf.png -quality $q -define webp:emulate-jpeg-size=true /tmp/10568-103447-lossy-emulate-jpeg-q${q}.webp; done | ||||||
|  | $ for q in 70 80 90; do magick convert /tmp/10568-103447-lossy-emulate-jpeg-q${q}.webp /tmp/10568-103447-lossy-emulate-jpeg-q${q}.webp.png; done | ||||||
|  | $ for q in 70 80 90; do ssimulacra2 img/10568-103447.pdf.png /tmp/10568-103447-lossy-emulate-jpeg-q${q}.webp.png 2>/dev/null; done | ||||||
|  | 81.29082887 | ||||||
|  | 84.42134524 | ||||||
|  | 85.84458964 | ||||||
|  | $ for q in 70 80 90; do magick convert img/10568-103447.pdf.png -quality $q /tmp/10568-103447-lossy-q${q}.webp; done | ||||||
|  | $ for q in 70 80 90; do magick convert /tmp/10568-103447-lossy-q${q}.webp /tmp/10568-103447-lossy-q${q}.webp.png; done | ||||||
|  | $ for q in 70 80 90; do ssimulacra2 img/10568-103447.pdf.png /tmp/10568-103447-lossy-q${q}.webp.png 2>/dev/null; done | ||||||
|  | 77.25789006 | ||||||
|  | 80.79140936 | ||||||
|  | 84.79108246 | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | - Using `-define webp:method=6` (versus default 4) gets a ~0.5% increase on ssimulacra2 score | ||||||
|  |  | ||||||
| <!-- vim: set sw=2 ts=2: --> | <!-- vim: set sw=2 ts=2: --> | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ I finally got through with porting the input form from DSpace 6 to DSpace 7 | |||||||
| <meta property="og:type" content="article" /> | <meta property="og:type" content="article" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/2023-03/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/2023-03/" /> | ||||||
| <meta property="article:published_time" content="2023-03-01T07:58:36+03:00" /> | <meta property="article:published_time" content="2023-03-01T07:58:36+03:00" /> | ||||||
| <meta property="article:modified_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="article:modified_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -38,9 +38,9 @@ I finally got through with porting the input form from DSpace 6 to DSpace 7 | |||||||
|   "@type": "BlogPosting", |   "@type": "BlogPosting", | ||||||
|   "headline": "March, 2023", |   "headline": "March, 2023", | ||||||
|   "url": "https://alanorth.github.io/cgspace-notes/2023-03/", |   "url": "https://alanorth.github.io/cgspace-notes/2023-03/", | ||||||
|   "wordCount": "3600", |   "wordCount": "4219", | ||||||
|   "datePublished": "2023-03-01T07:58:36+03:00", |   "datePublished": "2023-03-01T07:58:36+03:00", | ||||||
|   "dateModified": "2023-03-24T13:19:13+03:00", |   "dateModified": "2023-03-28T17:04:54+03:00", | ||||||
|   "author": { |   "author": { | ||||||
|     "@type": "Person", |     "@type": "Person", | ||||||
|     "name": "Alan Orth" |     "name": "Alan Orth" | ||||||
| @@ -687,6 +687,83 @@ RL: performed 0 reads and 16 write i/o operations | |||||||
| <li>I exported CGSpace to check for missing Initiative collection mappings</li> | <li>I exported CGSpace to check for missing Initiative collection mappings</li> | ||||||
| <li>Start a harvest on AReS</li> | <li>Start a harvest on AReS</li> | ||||||
| </ul> | </ul> | ||||||
|  | <h2 id="2023-03-27">2023-03-27</h2> | ||||||
|  | <ul> | ||||||
|  | <li>The harvest on AReS was incredibly slow and I stopped it about half way twelve hours later | ||||||
|  | <ul> | ||||||
|  | <li>Then I relied on the plugins to get missing items, which caused a high load on the server but actually worked fine</li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li>Continue working on thumbnails on DSpace</li> | ||||||
|  | </ul> | ||||||
|  | <h2 id="2023-03-28">2023-03-28</h2> | ||||||
|  | <ul> | ||||||
|  | <li>Regarding ImageMagick there are a few things I’ve learned | ||||||
|  | <ul> | ||||||
|  | <li>The <code>-quality</code> setting does different things for different output formats, see: <a href="https://imagemagick.org/script/command-line-options.php#quality">https://imagemagick.org/script/command-line-options.php#quality</a></li> | ||||||
|  | <li>The <code>-compress</code> setting controls the compression algorithm for image data, and is unrelated to lossless/lossy | ||||||
|  | <ul> | ||||||
|  | <li>On that note, <code>-compress lossless</code> for JPEGs refers to Lossless JPEG, which is not well defined or supported and should be avoided</li> | ||||||
|  | <li>See: <a href="https://imagemagick.org/script/command-line-options.php#compress">https://imagemagick.org/script/command-line-options.php#compress</a></li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li>The way DSpace currently does its supersampling by exporting to a JPEG, then making a thumbnail of the JPEG, is a double lossy operation | ||||||
|  | <ul> | ||||||
|  | <li>We should be exporting to something lossless like PNG, PPM, or MIFF, then making a thumbnail from that</li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li>The PNG format is always lossless so the <code>-quality</code> setting controls compression and filtering, but has no effect on the appearance or signature of PNG images</li> | ||||||
|  | <li>You can use <code>-quality n</code> with WebP’s <code>-define webp:lossless=true</code>,  but I’m not sure about the interaction between ImageMagick quality and WebP lossless… | ||||||
|  | <ul> | ||||||
|  | <li>Also, if converting from a lossless format to WebP lossless in the same command, ImageMagick will ignore quality settings</li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li>The MIFF format is useful for piping between ImageMagick commands, but it is also lossless and the quality setting is ignored</li> | ||||||
|  | <li>You can use a format specifier when piping between ImageMagick commands without writing a file</li> | ||||||
|  | <li>For example, I want to create a lossless PNG from a distorted JPEG for comparison:</li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | </ul> | ||||||
|  | <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ magick convert reference.jpg -quality <span style="color:#ae81ff">85</span> jpg:- | convert - distorted-lossless.png | ||||||
|  | </span></span></code></pre></div><ul> | ||||||
|  | <li>If I convert the JPEG to PNG directly it will ignore the quality setting, so I set the quality and the output format, then pipe it to ImageMagick again to convert to lossless PNG</li> | ||||||
|  | <li>In an attempt to quantify the generation loss from DSpace’s “JPG JPG” method of creating thumbnails I wrote a script called <code>generation-loss.sh</code> to test against a new “PNG JPG” method | ||||||
|  | <ul> | ||||||
|  | <li>With my sample set of seventeen PDFs from CGSpace I found that <em>the “JPG JPG” method of thumbnailing results in scores an average of 1.6% lower than with the “PNG JPG” method</em>.</li> | ||||||
|  | <li>The average file size with <em>the “PNG JPG” method was only 200 bytes larger</em>.</li> | ||||||
|  | </ul> | ||||||
|  | </li> | ||||||
|  | <li>In my brief testing, the relationship between ImageMagick’s <code>-quality</code> setting and WebP’s <code>-define webp:lossless=true</code> setting are completely unpredictable:</li> | ||||||
|  | </ul> | ||||||
|  | <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ magick convert img/10568-103447.pdf.png /tmp/10568-103447.webp | ||||||
|  | </span></span><span style="display:flex;"><span>$ magick convert img/10568-103447.pdf.png -define webp:lossless<span style="color:#f92672">=</span>true /tmp/10568-103447-lossless.webp | ||||||
|  | </span></span><span style="display:flex;"><span>$ magick convert img/10568-103447.pdf.png -define webp:lossless<span style="color:#f92672">=</span>true -quality <span style="color:#ae81ff">50</span> /tmp/10568-103447-lossless-q50.webp | ||||||
|  | </span></span><span style="display:flex;"><span>$ magick convert img/10568-103447.pdf.png -quality <span style="color:#ae81ff">10</span> -define webp:lossless<span style="color:#f92672">=</span>true /tmp/10568-103447-lossless-q10.webp | ||||||
|  | </span></span><span style="display:flex;"><span>$ magick convert img/10568-103447.pdf.png -quality <span style="color:#ae81ff">90</span> -define webp:lossless<span style="color:#f92672">=</span>true /tmp/10568-103447-lossless-q90.webp | ||||||
|  | </span></span><span style="display:flex;"><span>$ ls -l /tmp/10568-103447* | ||||||
|  | </span></span><span style="display:flex;"><span>-rw-r--r-- 1 aorth aorth 359258 Mar 28 21:16 /tmp/10568-103447-lossless-q10.webp | ||||||
|  | </span></span><span style="display:flex;"><span>-rw-r--r-- 1 aorth aorth 303850 Mar 28 21:15 /tmp/10568-103447-lossless-q50.webp | ||||||
|  | </span></span><span style="display:flex;"><span>-rw-r--r-- 1 aorth aorth 296832 Mar 28 21:16 /tmp/10568-103447-lossless-q90.webp | ||||||
|  | </span></span><span style="display:flex;"><span>-rw-r--r-- 1 aorth aorth 299566 Mar 28 21:13 /tmp/10568-103447-lossless.webp | ||||||
|  | </span></span><span style="display:flex;"><span>-rw-r--r-- 1 aorth aorth 190718 Mar 28 21:13 /tmp/10568-103447.webp | ||||||
|  | </span></span></code></pre></div><ul> | ||||||
|  | <li>I’m curious to see a comparison between the ImageMagick <code>-define webp:emulate-jpeg-size=true</code> (aka <code>-jpeg_like</code> in cwebp) option compared to normal lossy WebP quality:</li> | ||||||
|  | </ul> | ||||||
|  | <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> magick convert img/10568-103447.pdf.png -quality $q -define webp:emulate-jpeg-size<span style="color:#f92672">=</span>true /tmp/10568-103447-lossy-emulate-jpeg-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> magick convert /tmp/10568-103447-lossy-emulate-jpeg-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp /tmp/10568-103447-lossy-emulate-jpeg-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp.png; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> ssimulacra2 img/10568-103447.pdf.png /tmp/10568-103447-lossy-emulate-jpeg-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp.png 2>/dev/null; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>81.29082887 | ||||||
|  | </span></span><span style="display:flex;"><span>84.42134524 | ||||||
|  | </span></span><span style="display:flex;"><span>85.84458964 | ||||||
|  | </span></span><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> magick convert img/10568-103447.pdf.png -quality $q /tmp/10568-103447-lossy-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> magick convert /tmp/10568-103447-lossy-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp /tmp/10568-103447-lossy-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp.png; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>$ <span style="color:#66d9ef">for</span> q in <span style="color:#ae81ff">70</span> <span style="color:#ae81ff">80</span> 90; <span style="color:#66d9ef">do</span> ssimulacra2 img/10568-103447.pdf.png /tmp/10568-103447-lossy-q<span style="color:#e6db74">${</span>q<span style="color:#e6db74">}</span>.webp.png 2>/dev/null; <span style="color:#66d9ef">done</span> | ||||||
|  | </span></span><span style="display:flex;"><span>77.25789006 | ||||||
|  | </span></span><span style="display:flex;"><span>80.79140936 | ||||||
|  | </span></span><span style="display:flex;"><span>84.79108246 | ||||||
|  | </span></span></code></pre></div><ul> | ||||||
|  | <li>Using <code>-define webp:method=6</code> (versus default 4) gets a ~0.5% increase on ssimulacra2 score</li> | ||||||
|  | </ul> | ||||||
| <!-- raw HTML omitted --> | <!-- raw HTML omitted --> | ||||||
|  |  | ||||||
|    |    | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/categories/notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | <meta property="og:description" content="Documenting day-to-day work on the [CGSpace](https://cgspace.cgiar.org) repository." /> | ||||||
| <meta property="og:type" content="website" /> | <meta property="og:type" content="website" /> | ||||||
| <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | <meta property="og:url" content="https://alanorth.github.io/cgspace-notes/posts/" /> | ||||||
| <meta property="og:updated_time" content="2023-03-24T13:19:13+03:00" /> | <meta property="og:updated_time" content="2023-03-28T17:04:54+03:00" /> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,19 +3,19 @@ | |||||||
|   xmlns:xhtml="http://www.w3.org/1999/xhtml"> |   xmlns:xhtml="http://www.w3.org/1999/xhtml"> | ||||||
|   <url> |   <url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/categories/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/categories/</loc> | ||||||
|     <lastmod>2023-03-24T13:19:13+03:00</lastmod> |     <lastmod>2023-03-28T17:04:54+03:00</lastmod> | ||||||
|   </url><url> |   </url><url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/</loc> | ||||||
|     <lastmod>2023-03-24T13:19:13+03:00</lastmod> |     <lastmod>2023-03-28T17:04:54+03:00</lastmod> | ||||||
|   </url><url> |   </url><url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/2023-03/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/2023-03/</loc> | ||||||
|     <lastmod>2023-03-24T13:19:13+03:00</lastmod> |     <lastmod>2023-03-28T17:04:54+03:00</lastmod> | ||||||
|   </url><url> |   </url><url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/categories/notes/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/categories/notes/</loc> | ||||||
|     <lastmod>2023-03-24T13:19:13+03:00</lastmod> |     <lastmod>2023-03-28T17:04:54+03:00</lastmod> | ||||||
|   </url><url> |   </url><url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/posts/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/posts/</loc> | ||||||
|     <lastmod>2023-03-24T13:19:13+03:00</lastmod> |     <lastmod>2023-03-28T17:04:54+03:00</lastmod> | ||||||
|   </url><url> |   </url><url> | ||||||
|     <loc>https://alanorth.github.io/cgspace-notes/2023-02/</loc> |     <loc>https://alanorth.github.io/cgspace-notes/2023-02/</loc> | ||||||
|     <lastmod>2023-03-01T08:30:25+03:00</lastmod> |     <lastmod>2023-03-01T08:30:25+03:00</lastmod> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user