Informatie over deze website

Doel van de website

Ik kan een pagina maken. Dat was voor mij reden genoeg om het ook te doen.

Help, de pagina doet gek!

Deze pagina voldoet aan de xhtml-standaard, zie het blauwe plaatje onderaan de pagina met XHTML 1.0 erin. Als je die link volgt dan wordt de pagina gecontroleerd, en tenzij ik een fout gemaakt heb, komt er te staan "This document was successfully checked as XHTML 1.0 Strict!". Ook de stijl voldoet normaal gesproken aan de CSS-standaard, volg de link maar op het blauwe plaatje met CSS erin.

Als deze pagina toch niet goed weergegeven wordt, komt het doordat de webbrowser niet aan die standaard voldoet. Hoogstwaarschijnlijk gebruik je dan (een oude versie van) Internet Explorer, die doet soms gek. Ik heb de pagina gecontroleerd in Internet Explorer, Firefox en Google Chrome, en alles lijkt nu in orde.

Sommige plaatjes laden niet…

Sommige plaatjes zijn SVG. Google Chrome snapt dat, maar ooit snapten Firefox en Internet Explorer nog niet (helemaal), en mobiele browsers hebben daar ook nog problemen mee. Voor sommige plaatjes heb ik alternatieven gemaakt. Het ziet er dan niet zo heel mooi uit als eigenlijk bedoeld was, maar de bedoeling blijft duidelijk.

Privacy

Ik heb ook oog voor de privacy van de bezoekers van deze pagina, hoe weinig het er ook zijn. Als je deze pagina bezoekt, dan komt dat als ik wil in de statistieken te staan. Ik kan dan zien hoevaak elk onderdeel bezocht is, en van welke pagina bezoekers komen als ze er door middel van een link komen. Meer informatie krijg ik niet binnen en sla ik dus ook niet op. Het doel hiervan is puur na te gaan hoeveel mensen er komen en hoe ze mijn pagina bereiken. Deze optie heb ik al in 2012 terug uitgezet, maar wie weet ga ik hem ooit weer gebruiken.

Bij elke pagina die een foutmelding geeft, wordt in een database opgeslagen welke pagina dat precies was, hoeveel foutmelding/waarschuwingen er waren, wat de tijd was, en welk IP deze pagina het laatste heeft bezocht. Dit laatste doe ik alleen om bij 'vreemde' opgevraagde pagina's (waar ik hackpogingen vermoed) een IP-block te kunnen zetten. Nadat ik deze database op merkwaardigheden heb onderzocht (wat om de paar maanden gebeurt), gooi ik de database leeg, zonder backup.

Deze site maakt minimaal gebruik van cookies: als je de instellingen aanpast, worden ze opgeslagen op je computer. Er worden twee dingen opgeslagen: "stijl", wat aangeeft welke stijl je gekozen hebt, en "googlead", wat aangeeft of je de google advertenties uit of aan hebt staan. Deze cookie wordt één maand bewaard.

Als je de instellingen niet verandert, krijg je als het goed is geen cookie, en zie je de pagina in het blauw, je mist dus niks als je geen cookies gebruikt.

Blabla

Deze pagina wordt opgebouwd met PHP (daarom eindigt elke url op ".php"). Ik heb voor PHP gekozen omdat ik geen alternatief kende wat op de server stond.

Voor de paar simpele dingetjes die ik toen wilde doen (het meest complex was het menuutje links), was dit een prima keuze: het was snel gemaakt, gemakkelijk bij te houden, en snel genoeg.

Sindsdien is er wat function creep opgetreden: er kwam een kleine database bij waar dingen uit werden opgezocht, er kwam nog een database bij, informatie uit databases werd gecombineerd, tot het punt dat er vrij uitvoerige berekeningen uitgevoerd worden met informatie uit meerdere databases. Als voorbeeld: ik toon de tussenstand in het algemeen klassement van de Tour de France voor elke willekeurige etappe, daarvoor is nodig:

De regels zijn niet elk jaar hetzelfde, dus is niet in elk jaar elke database nodig. Ook de bonificaties veranderden nog wel eens, dus ik heb ook functies die dit per jaar aangeven, en eigenlijk vervullen die ook de rol van database. Op dit moment kost het maximaal enkele seconden om zo'n tussenstand uit te rekenen.

Die tijd vind ik nog net acceptabel. In de eerste implementatie, met als enige doel alles werkend te krijgen, duurde deze berekening nog tientallen seconden, dus de efficiëntie is al beter. Het is nog zeker niet optimaal. Ik weet het niet exact, maar ik schat dat voor de berekening er zo'n 200 keer een database gelezen wordt, er zo'n 40000 getallen worden opgeteld en een database van 200 elementen gesorteerd wordt; dat moet binnen een seconde kunnen.

Update 2016: het duurt nu 1.9 seconde om de eindstand van 2016 te genereren.

De meeste winst is denk ik te halen uit het inlezen van de databases. Ik lees waarschijnlijk sommige databases te vaak in. Ik lees bijvoorbeeld (in een jaar met sprintbonificaties) de sprintdoorkomstendatabase elke etappe apart in, om vervolgens de informatie over de relevante etappe te vinden, terwijl ik dit ook in een keer zou kunnen inlezen. Dit kan ik niet gemakkelijk veranderen, want het hangt samen met de opbouw van het script. (Achteraf was die opbouw natuurlijk niet goed.)

Update in 2016: dit heb ik inmiddels gedaan! En dit heeft alles een stuk sneller gemaakt. Het meest extreme voorbeeld: een scriptje dat eerst 18 uur geduurd zou hebben, is nu in 10 minuten klaar.

Update in 2017: en nu heb ik het aantal database-leesmomenten nog verder verminderd, en nu duurt dit script nog maar 5 minuten. Dit script hoef ik niet zo vaak te runnen, maar omdat ik dezelfde verbetering in alle pagina's heb doorgevoerd, geeft het wel een indicatie dat alle pagina's nu sneller zullen zijn. De volgende verbetering wordt het in een consequent formaat opslaan van data, zodat ik niet steeds hoofdletters/kleine letters hoef te controleren. Als de scripts daar niet sneller van worden, dan worden ze in ieder geval korter en gemakkelijker te onderhouden.

Maar als ik dit ga verbeteren, kan ik eigenlijk beter deze hele functie herschrijven. En als ik dat toch ga doen, moet ik het misschien in een andere taal gaan doen die beter hiervoor geschikt is dan PHP. Want PHP is een klungelige taal: prima om snel even wat dingen in te doen, maar voor complexe dingen niet aan te raden. Voor een niet-programmeur gebruik ik best veel commentaar, maar desondanks is er zo'n wildgroei in mijn code gekomen dat ik soms zelf niet meer snap waarom het werkt. En ik ben niet altijd even consequent geweest, dat helpt ook niet.

Ik ben geen webdesigner. Ik heb maar wat gedaan, en heb nu een effectieve maar inefficiënte oplossing. Ik ben erachter gekomen dat ik sommige dingen beter op een andere manier had kunnen doen. Is dat erg, dat ik het niet direct perfect heb gedaan? Nee. Is het juist fantastisch, dat ik iets geleerd heb? Ook niet. Ik wist voor ik begon al dat ik niet de optimale code zou maken, en ook dat ik dingen zou leren. Dingen die ik waarschijnlijk nooit ergens anders toe zal passen.

Waarschijnlijk ga ik wel ooit de snelheid verbeteren door de databases sneller leesbaar te maken. Dat kost relatief weinig tijd. Maar ook dan blijft de code een rommeltje.

Er is een kleine kans dat ik de kern van mijn scripts ga herschrijven in een betere taal. Als ik dit doe, is het hoofddoel hiervan in ieder geval niet het sneller maken van deze website, maar het uitzoeken hoe de andere taal werkt. Ik denk nu niet dat het gaat gebeuren, maar ik sluit het ook niet uit.

Ik zou ook alle databases sowieso in een beter formaat kunnen zetten. Nu is het XML, wat natuurlijk nergens op slaat. Een opzet in SQL zou veel logischer zijn. Maar het lijkt me erg saai werk om dat om te zetten, en dan moet ik ook mijn methode om data toe te voegen aanpassen. Daar heb ik geen zin in, dus het is erg onwaarschijnlijk dat ik dat ooit ga doen.

Sowieso voel ik me voor niemand verplicht om deze pagina te verbeteren. Ik doe alleen dingen als ik daar zin in heb. De enige uitzondering: als het serververbruik te hoog zou wordt, dan maak ik (een deel van) de pagina gewoon ontoegankelijk voor anderen. Tot ik de benodigde aanpassingen gedaan heb. Maar dat lijkt me een puur theoretische overweging, waarvan ik afvraag waarom ik hem maak.

GDPR

Op 25 mei 2018 wordt de GDPR van kracht. Volgens mij voldeed ik al qua instelling aan die wet, maar misschien niet formeel op elk puntje, bijvoorbeeld het hebben van een register.

Om het op een rijtje te zetten, hieronder nog eens de persoonsgegevens die ik verzamel, hoe ik die verwerk, en zo.