Iteratie #203 is afgerond. In deze iteratie is een nieuw filter toegevoegd aan de Pricewatch, is het column-artikeltype beter aangeduid in het artikel zelf en zijn er veel verbeteringen achter de schermen gerealiseerd.
Levertijdfilter in de Pricewatch
Het is pricewatchers wellicht al opgevallen dat er sinds een week of twee een levertijdfilter beschikbaar is bij de productlijsten. Deze slider werkt grotendeels hetzelfde als bij de prijslijsten en gaat van een minimum van 24 uur tot een maximum van 12 dagen, met "> 12 dagen" voor geen grens. Dit filter heeft invloed op de laagste prijs en het aantal prijzen. Ook wordt het gebruikt voor de positie van een product als je op prijzen sorteert, als er helemaal geen prijzen overblijven, valt het product weg uit de lijst.
Dit is een eerste variant van een wens die al lange tijd bestaat. Vooraf was voor ons niet duidelijk of we dit met een acceptabele responstijd en belasting van onze servers konden uitwerken. Daarom hebben we deze eerste versie uitgewerkt bij wijze van proof of concept. Daarbij kozen we voor het levertijdfilter, omdat dat nu enerzijds heel relevant is bij onder andere videokaarten. Anderzijds heeft dit de eenvoudigste gebruikersinterface, waardoor we ons konden focussen op de onderliggende techniek.
Voordat we dit filter hadden, werden in de engine voor elk product alleen de laagste prijs en het aantal prijzen in het geheugen geladen. Dat volstond echter niet hiervoor; de laagste prijs kan tenslotte ook een te lange levertijd hebben.
Uiteindelijk bleek de simpelste oplossing ook de beste: bij ieder product de prijzen in een eenvoudige container met een array van prijzen zetten. Om deze bijna 2 miljoen objecten zo klein mogelijk te houden, bevatten ze alleen de prijs, een numerieke representatie van de levertijd en een referentie naar een shop. Deze worden gesorteerd op prijs bewaard. Als er geen prijsfilter actief is, is simpelweg de eerste prijs in de array de laagste en de lengte van de array is het aantal prijzen. Als er wel een prijsfilter actief is, wordt er een kopie van zo'n container gemaakt, maar dan alleen met de prijzen die volstaan. Zo konden we voorkomen dat er veel aanpassingen nodig waren waar iets met prijzen wordt gedaan.
Door bovendien het concept van een PriceFilter generiek op te zetten, werkt die code met ieder willekeurig filter. Of met iedere combinatie van filters, want we hebben ook een implementatie van de PriceFilter-interface die verschillende filters combineert.
Voorheen werkte het filteren op de laagste prijs door een ruwe selectie van de producten in de desbetreffende categorie uit een SortedMap te halen en daarna per product uit die ruwe selectie te testen of die inderdaad voldoet aan het opgegeven prijsbereik. Bij deze nieuwe situatie kon dat ook niet zomaar, want de laagste prijs kan tenslotte per pageview verschillen. Ook hier bleek de simpelste oplossing goed te werken. Als er een prijsfilter is ingesteld, wordt uiteindelijk van alle producten die in een categorie zitten, in een loop getest of ze nadat het prijsfilter is toegepast, aan dat prijsbereik voldoen.
Na onder andere de genoemde aanpassingen om de Java-code hiervoor geschikt te maken en wat benchmarks voor de prestaties bleek het uiteindelijk goed genoeg te werken om direct live te kunnen. Sterker nog, we konden zelfs nog wat optimaliseren. Die originele uitwerking met een SortedMap bleek stiekem helemaal niet zo efficiënt met kleine aantallen producten. Ook als er geen prijsfilter actief is, wordt nu dus met een eenvoudige loop het prijsbereik getest als het aantal te testen producten laag is.
Door het filteren op prijsdetails generiek op te zetten, is ook gelijk een deel voor andere varianten, zoals filteren op een minimale shopreviewscore en uitsluiten van winkels, een stap dichterbij gekomen. Voor die laatste variant was echter vooraf al duidelijk dat een gebruiksvriendelijke interface daarvan de grootste uitdaging is.
Aanduiding column in de titel
Bij de introductie van Plus (toen nog Premium) kwam ook een nieuw artikeltype tot leven: de column. Deze opiniestukken zijn anders dan de feitelijke reviews en nieuwsberichten zoals iedereen van ons gewend is. Om extra aan te geven dat het gaat om een column, met de mening van de redacteur, hebben we dit artikeltype verwerkt in de titel van het artikel, zodat dit voor iedereen helder is bij het lezen.
Serverupgrades
Op servergebied is er het een en ander veranderd. We hebben een vrij lange periode getest met Ubuntu 20.04, maar de veranderingen van de laatste jaren aan Ubuntu bevallen ons niet heel goed. Dat geldt bijvoorbeeld voor de neiging om steeds meer van de snap-store gebruik te maken, de reclame in de motd, veranderde installers (vooral voor vm's) en de bloated installatie, zelfs als je voor minimaal gaat. Omdat alle servers herinstalleren vrij veel werk is, hebben we besloten om dat pas te doen als we de hardware vervangen en om nu eerst alle huidige Ubuntu-installaties te upgraden naar 20.04. Alle nieuwe servers worden voorzien van (een minimale) Debian-installatie. De upgrade naar 20.04 is vorige week afgerond en een aantal nieuwe servers draait zelfs al op Debian.