<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bruikbaarheid on Ansel</title><link>https://ansel.photos/nl/tags/bruikbaarheid/</link><description>Recent content in Bruikbaarheid on Ansel</description><generator>Hugo -- gohugo.io</generator><language>nl</language><copyright>© Copyright 2022-2025 – Aurélien Pierre</copyright><lastBuildDate>Sun, 01 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://ansel.photos/nl/tags/bruikbaarheid/index.xml" rel="self" type="application/rss+xml"/><item><title>Sneltoetsen (accelerators) vanaf nul herschrijven</title><link>https://ansel.photos/nl/news/rewriting-key-shortcuts/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><updated>Sun, 01 Jun 2025 00:00:00 +0000</updated><guid>ec634cc96fcee4dcbd19a0c871db54ab4957b337a5548019c25ee7908b87a375</guid><description>&lt;p>In mijn stellingnemende bericht, &lt;a href="https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/" title="" rel="dofollow" >&lt;em>Darktable: crashing into the wall in slow-motion&lt;/em>&lt;/a>, presenteerde ik de treinramp die de nieuwe „Great MIDI turducken&amp;quot; was. Het doel van deze turducken&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> was om het sneltoetsensysteem te herschrijven om het uit te breiden voor MIDI-apparaten.&lt;/p>
&lt;p>Tot op de dag van vandaag ben ik nog steeds boos over deze onderneming van massavernietiging, hier is een samenvatting van de redenen:&lt;/p>
&lt;ol>
&lt;li>het verving in 2021 een sneltoetsensysteem dat behoorlijk goed was, functioneel compleet, goed getest, stabiel en gecodeerd in minder dan &lt;strong>1500 regels&lt;/strong> (commentaar inbegrepen),&lt;/li>
&lt;li>…om ondersteuning toe te voegen voor MIDI-apparaten en PlayStation-gamepads (!?!)…&lt;/li>
&lt;li>…maar in mijn Darktable-enquête van 2022, één jaar na deze nieuwe functie, van de meer dan 1251 gebruikers die deelnamen:
&lt;ul>
&lt;li>had 81% van de gebruikers geen MIDI-apparaat en was niet van plan er een aan te schaffen,&lt;/li>
&lt;li>wist 2% niet eens wat een MIDI-apparaat was.&lt;/li>
&lt;li>had 8% van de gebruikers een MIDI-apparaat maar gebruikte het niet met Darktable,&lt;/li>
&lt;li>overwoog 6% &lt;em>misschien&lt;/em> in de toekomst een MIDI-apparaat aan te schaffen,&lt;/li>
&lt;li>&lt;strong>had 2% van de gebruikers een MIDI-apparaat dat ze daadwerkelijk in Darktable gebruikten&lt;/strong>,&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>de code was absoluut verschrikkelijk, wat betreft:
&lt;ul>
&lt;li>codekwaliteit: onleesbare &lt;code>if&lt;/code>/&lt;code>switch-case&lt;/code>-statements genest op 4 niveaus, midden in functies van 1000 regels (ik plaatste voorbeeldfragmenten in mijn &lt;a href="https://ansel.photos/nl/news/darktable-dans-le-mur-au-ralenti/#keyboard-shortcuts" title="" rel="dofollow" >artikel&lt;/a>),&lt;/li>
&lt;li>codevolume:
&lt;ul>
&lt;li>&lt;strong>3546 regels&lt;/strong> code voor Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>4397 regels&lt;/strong> code voor Darktable 5.0,&lt;/li>
&lt;li>de toename in volume is een direct gevolg van het proberen te repareren van bugs in een architectuur die niet gerepareerd kan worden omdat de complexiteit ervan meer complexiteit bevordert. Dat komt allemaal voort uit het ontwerp, maar problemen die door complexiteit veroorzaakt worden oplossen met het toevoegen van meer complexiteit is geen oplossing.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>codecomplexiteit:
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >cyclomatische complexiteit&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1088&lt;/strong> voor Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>1245&lt;/strong> voor Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?id=aurelienpierreeng_darktable-5&amp;amp;metric=complexity&amp;amp;view=list" title="External link" target="_blank" rel="noopener noreferrer nofollow" >details&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>),&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.sonarsource.com/blog/cognitive-complexity-because-testability-understandability/" title="External link" target="_blank" rel="noopener noreferrer nofollow" >cognitieve complexiteit&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1885&lt;/strong> voor Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>2098&lt;/strong> voor Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?metric=cognitive_complexity&amp;amp;view=list&amp;amp;id=aurelienpierreeng_darktable-5" title="External link" target="_blank" rel="noopener noreferrer nofollow" >details&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>het is verreweg de meest complexe functie van de software, ook al werkt het niet op afbeeldingen. Ter vergelijking: de op één na meest complexe functie is de EXIF-metadata-decodering, die een cognitieve complexiteit van &lt;strong>1348&lt;/strong> heeft.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>het decodeert &lt;strong>door ontwerp&lt;/strong> geen toetsmodificatoren, maar behandelt alleen hardware-toetsaanslagen, wat betekent:
&lt;ul>
&lt;li>„1&amp;quot;-invoer van het numerieke toetsenblok wordt gedecodeerd als &lt;code>Keypad End&lt;/code>,&lt;/li>
&lt;li>„1&amp;quot;-invoer van een Frans AZERTY-toetsenbord wordt gedecodeerd als &lt;code>Shift+&amp;amp;&lt;/code>, of &lt;code>Shift+&amp;quot;&lt;/code> op BÉPO,&lt;/li>
&lt;li>je moet daarom al je op cijfers gebaseerde sneltoetsen dupliceren voor elke manier om een cijfer in te voeren, en erop voorbereid zijn dat het sneltoetsinstellingenvenster geen enkel echt cijfer in de toetscombinaties bevat.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>het ontwerp aan de gebruikerskant is absoluut verschrikkelijk, met veel te veel te configureren acties en emulaties („effecten&amp;quot;), die zelfs 4 jaar later niet volledig gedocumenteerd zijn (wat is „ctrl-toggle&amp;quot;? „right-activate&amp;quot;?), en de sneltoetsconfiguratie gebruikt een raar gesplitst venster dat nergens op slaat,&lt;/li>
&lt;li>de implementatie is ook verschrikkelijk: de functie is op de hoogte van de hele software-GUI, en de software-GUI is op de hoogte van de sneltoetscode. Er is hier geen modulariteit, en iets veranderen in de sneltoetscode kan overal in de software onverwachte en ongewenste effecten hebben.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> Kijk maar naar de afhankelijkheidsgraaf hieronder,&lt;/li>
&lt;li>meerdere „sneltoetsen&amp;quot; (of MIDI-bindingen) kunnen aan dezelfde actie gekoppeld worden, wat betekent dat elke gebruikersinteractie de hele lijst met beschikbare acties moet doorzoeken, wat zeer inefficiënte sneltoetsafhandeling veroorzaakt, GUI-vertragingen in sommige gevallen en „onbekende toetscombinatie&amp;quot;-fout-positieven in bijzondere gevallen.&lt;/li>
&lt;/ol>
&lt;figure class="img-wrapper caption-figure" id="shortcuts-brokenpng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/shortcuts-broken.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/shortcuts-broken.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/shortcuts-broken_hu_e37121e26018e231.png 140w, https://ansel.photos/shortcuts-broken_hu_8766cdc7ed4c0ffe.png 264w, https://ansel.photos/shortcuts-broken_hu_3b7b1b3ab0c67aa4.png 331w, https://ansel.photos/shortcuts-broken_hu_4ce881621b99a2f7.png 400w, https://ansel.photos/shortcuts-broken_hu_41339900c3d3c228.png 496w, https://ansel.photos/shortcuts-broken_hu_b92319103d74af03.png 576w, https://ansel.photos/shortcuts-broken_hu_e47c9ad52cb7218b.png 600w, https://ansel.photos/shortcuts-broken_hu_2084be612ea1c347.png 720w, https://ansel.photos/shortcuts-broken_hu_c71b36b9691e7e8b.png 800w, https://ansel.photos/shortcuts-broken_hu_2febe49d8584f2b1.png 992w, https://ansel.photos/shortcuts-broken_hu_d31c96ca69e52d05.png 1200w, https://ansel.photos/shortcuts-broken_hu_98feacdcc50345e.png 1320w, https://ansel.photos/shortcuts-broken_hu_d99d42c5ec93ce86.png 1440w, https://ansel.photos/shortcuts-broken_hu_1f781700c7610d93.png 1600w, https://ansel.photos/shortcuts-broken_hu_f1176a8dfd24e2cb.png 1920w, https://ansel.photos/shortcuts-broken_hu_2c23e9088e4fe430.png 2048w"width="2508" height="1674"/>
&lt;/div>
&lt;figcaption>
Niet-gedecodeerde cijfertoetsen en rare venstersplitsing tussen „action" en „shortcut".
&lt;/figcaption>
&lt;/figure>
&lt;figure class="img-wrapper caption-figure" id="accelerators-beforejpg">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/accelerators-before.jpg', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/accelerators-before.jpg alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/accelerators-before_hu_5f28983ffa269553.jpg 140w, https://ansel.photos/accelerators-before_hu_7622d56153ebaa50.jpg 264w, https://ansel.photos/accelerators-before_hu_6047a51a0a471dd7.jpg 331w, https://ansel.photos/accelerators-before_hu_11921ace387df1ec.jpg 400w, https://ansel.photos/accelerators-before_hu_85ed35537ae98e7.jpg 496w, https://ansel.photos/accelerators-before_hu_93478e0a0c240e0f.jpg 576w, https://ansel.photos/accelerators-before_hu_5b4f95f36ee81e48.jpg 600w, https://ansel.photos/accelerators-before_hu_8c81fb4523fe5064.jpg 720w, https://ansel.photos/accelerators-before_hu_3cc8ddd08babe7e5.jpg 800w, https://ansel.photos/accelerators-before_hu_5b099d695d7c6396.jpg 992w, https://ansel.photos/accelerators-before_hu_2dc23bad4b919367.jpg 1200w, https://ansel.photos/accelerators-before_hu_a20b8485baa1c620.jpg 1320w, https://ansel.photos/accelerators-before_hu_cef15eb2da9b6ff7.jpg 1440w, https://ansel.photos/accelerators-before_hu_efac0aace80f01eb.jpg 1600w, https://ansel.photos/accelerators-before_hu_fee979325612c769.jpg 1920w, https://ansel.photos/accelerators-before_hu_a5ad2ea57d9b2659.jpg 2048w"width="3730" height="1912"/>
&lt;/div>
&lt;figcaption>
&lt;p>De afhankelijkheidsgraaf van &lt;code>src/gui/accelerators.c&lt;/code> (Great MIDI turducken) vóór de herschrijving. Raad eens waarom we het „&lt;a href="https://en.wikipedia.org/wiki/Spaghetti_code" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >spaghetticode&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>&amp;quot; noemen… Dit maakt duidelijk dat er een tweezijdige afhankelijkheid is tussen de accels-code en de rest van de GUI-code. Dit is een nachtmerrie om te onderhouden.&lt;/p></description></item></channel></rss>