Mijn vrijwilligerswerk.

pride-photo
Het is af en toe even schrikken, als je de foto’s ziet, maar ik werk als vrijwilliger voor een organisatie die een fotowedstrijd speciaal voor holebi’s (*) organiseert.
Niet dat ik verstand heb van fotografie 🙂
Ze zochten een programmeur, want de software voor het uploaden van foto’s was een beetje een puinhoop.
Die was speciaal voor de wedstrijd geschreven, maar het was nooit afgemaakt of zo.
Ik zou wat knopjes toevoegen waar gebruikers om gevraagd hadden. ‘En we gebruiken een 2 letterige code voor elke deelnemer. Kun je daar 3 letters van maken, want we hadden vorige keer al 500 deelnemers.’
Toen ik er eens goed naar keek, dacht ik : “huh ?’
‘Of ik begrijp niks van programmeren, of dit is echt raar’
Ik kopieerde alles naar mijn eigen PC. ‘Anders blijf ik uploaden’.
‘Vreemd, hij doet het niet’
De PHP-versie op de server was wat ouder dan wat ik gebruik, dus ik kon een toekomstige show-stopper nog net op tijd voorspellen.
“mysql_connect” werkt niet meer als de hoster overgaat naar PHP 5.5.
Paniek.
‘O, de url is overal hard gecodeerd, dus ik zit nog te testen tegen de live server’
‘Vreemd, als ik de 3-lettercode genereer uit de userid, heb ik dit toch allemaal niet nodig ???’
Het plan was om samen te werken met iemand die een drukke baan had en we zouden alles heel voorzichtig doen en van tevoren overal toestemming voor vragen.
Dus ik wachtte tot mijn voorganger klaar was met zijn testen en aanpassingen.
Maar dat duurde tot de datum van de opening, dus ik mocht daarna niets meer doen.
En hoe vlekkeloos het in test ook werkte, toen er eenmaal echte gebruikers kwamen regende het klachten.
En toen ik die klachten ging onderzoeken, snapte ik de oorzaak ook wel :
Het is een web-applicatie, helemaal vanaf scratch geschreven.
De clientcode is javascript, HTML en CSS, de serverkant PHP en MySQL.
Hadden ze maar een framework gebruikt, dan had de globale opzet in ieder geval gedeugd.
Wat er nu gemaakt was, was een webapplicatie waarbij de client de V en de C in het MVC model vervulde.
De M was natuurlijk de database met een schil van PHP-code eromheen.
Wat er mis ging, was dat verschillende gebruikers langer dan 25 minuten ingelogd bleven, waarna de server de sessievariabele weggooide.
Gingen ze dan een foto uploaden, dan vulde de software verschillende variabelen met blanks. De client kreeg geen antwoord, zodat het scherm van de gebruiker bevroor.
De bug zat er al jaren in.
Alles hadden ze geprobeerd. Extra controles in de client, timers, invoer uitschakelen tijdens de upload, etc.
Ik heb dus in de PHP-code eerst een controle ingebouwd of die sessie-variabele er nog wel was.
Er bleek wel een soort “keep-alive” constructie te zijn gemaakt.
Maar door iemand die dacht dat “echo count(10);” in PHP iets nuttigs zou doen.
Een ander probleem was, dat de errorlog vol liep.
Het leek me wel een goed idee om voortaan eerst te testen of een variabele wel bestaat, voordat je de inhoud gebruikt.
Tot dat moment had er kennelijk nooit iemand in de errorlog gekeken.

Ik heb bij verschillende grote bedrijven gewerkt. Ik snap change-procedures.
Maar kom op, het is maar een foto-wedstrijd voor amateurs.
Omdat het onwerkbaar was, heb ik op een nacht het “sessie” probleem opgelost door wat nieuwe code te uploaden naar de server.
De projectleider kreeg bijna een beroerte en eiste dat ik alles terugdraaide, maar ik kon hem ervan overtuigen dat buggy code terugzetten het probleem ook niet ging oplossen.
Vanaf dat moment waren de grootste problemen opgelost.

Er was nog wel een andere bug :
Je kon series foto’s uploaden, en daarvan kon je de volgorde manipuleren. Je kon ook een foto verwijderen uit een serie.
Op het scherm zag het er fantastisch uit, maar de manier waarop het gebouwd was, was een ramp.
De code probeerde bij elke mutatie op de client de server te synchroniseren.
Dus als je foto a verplaatste naar het einde van de serie, dan moesten er 10 renames plaatsvinden op de server.
Niet zo handig om dat met 10 Ajax requests te doen.
Natuurlijk kwam er dan een keer halverwege de renames een kink in de kabel, en dan zat je verbaasd naar al die tijdelijke files op de server te kijken.
De oplossing was natuurlijk om de hele actie in één Ajax request te verpakken, maar of de oorspronkelijke maker nu zijn code nog herkent ?

En dan was er nog het probleem van de teksten die de gebruikers konden invoeren. Die kwamen in een veldje in de database terecht. De eerste versie van de software bevatte kennelijk geen bescherming tegen cross-site scripting. Eerst was geprobeerd dat probleem ook aan de client-zijde op te lossen. Met een rigoureus filter. Een stuk javascript-code dat ergens opgedoken was. Afgezien van het feit dat je de client nooit kan vertrouwen, zat er een bug in dat filter. Als een gebruiker een lange tekst m.b.v. knippen en plakken in het vakje prakte, verslikte het filter zich en verdween de hele tekst.
Kennelijk had de maker zich gerealiseerd dat de applicatie nog niet veilig was, dus aan de server-zijde zat een nog rigoureuzer filter. Alleen cijfers en letters, punten en comma’s.
Dus zelfs een aanhalingsteken of een vraagteken werden uit de tekst gegooid.
PHP heeft een standaard filter : strip_tags().
Ik vind het veilig genoeg, dus alle zelfgemaakte er uit gegooid.

Nog een rare bug :
In de database-code werd het script beeindigd als een query geen resultaat opleverde.
Dat hoort daar niet. Sommige later toegevoegde functionaliteit werkte daardoor niet, zonder dat iemand snapte waarom.

Toen nog iets kleins : de foto’s mochten maximaal 10MB jpg zijn. Veel fotografen stuurden iets anders, of groter. En stuurden dan een mailtje, omdat ze hun werk niet zagen.
En veel gebruikers wilden toch wel graag een “finish” knopje.
Een melding op het scherm, hoe moeilijk kan het zijn, dacht ik.
Toen kwamen er nog meer lijken uit de kast rollen.
Een file waarvan de upload mislukt is heeft geen filetype, dus het heeft niet veel zin om die als eerste te testen.
Je kan een file wel “mijnpostzegel.jpg” noemen, maar het kan iets heel anders zijn. Probeer een tekstfile maar eens te verkleinen tot een thumbnail.
Het systeem maakte al gebruik van jquery-UI, dus ik dacht dat te gebruiken voor een melding op het scherm.
Oeps : wel javascript, maar geen stylesheet en geen images ???

OK, alles werkt nu. Zelfs het “help” knopje. Ik zie geen vragen van gebruikers meer, er zijn inmiddels 2600 foto’s ge-upload.

(*) holebi is Vlaams voor LBGT ( lesbian, bisexual, gay, transgender )


Posted

in

by

Tags:

Comments

7 responses to “Mijn vrijwilligerswerk.”

  1. Wies de Winter Avatar
    Wies de Winter

    Klinkt als heel zinvol vrijwilligerswerk. Zelf heb ik ook lang in dubio gestaan of gezeten, het is maar hoe je er tegenaan kijkt, want je wilt toch iets terugdoen voor de maatschappij. Zo heb ik een tijdje in een hospice gewerkt maar ik werd enorm depri van al die bijna doden , alhoewel het mij verbaasde hoe weinig moedeloos ze eigenlijk waren. We wandeleden wat , de meest intieme gesprekken kwamen aan de orde, gêne is überhaupt geen punt meer als je bijna dood gaat. Samen eten maken en samen eten, allemaal reuze intiem, te intiem voor mij uiteindelijk, het kwam me allemaal te na aan de schenen, de dood zat me op de hielen, mijn lichten moesten al aan voor de tunnel, en toen ben ik snel afgehaakt.

    Na een tijdje geen extra bijdrage meer geleverd te hebben aan de maatschappij heb ik, toen het weer reuze ging kriebelen, de stoute schoenen aangetrokken en me vrijwillig gemeld bij de zorgboerderij, afdeling slagerij.
    Er ging een wereld voor me open, zoveel vriendelijkheid als me tegemoet kwam, het hele concept zorgboerderij is een warm bad, weliswaar vaak verstikkend warm maar op de afdeling slagerij heb ik eens in de week mijn eigen koninklijke bij slager Tinus van der Bijl, zeg maar Tinus. Het slagersvak heb ik leren kennen als een prachtige keten doorheen het vlees, de slgerskunde als een beroep ver voorbij die van een eenvoudig chirurg zijn. Ga er maar aan staan als chirurg , het gekoesterde dier met een naam te slachten met zowel liefde voor het beest laswel voor de mens die het vlees eten gaat. Tinus gaat haast sacraal te werk bij het slachten of misschien vul ik dat zo wel in maar je ziet de zorgvuldigheid waarmee hij te werk gaat, ook een diep respect voor het leven en de dood. Ik kijk daar alleen , ik hoef verder niets te doen, hij ziet me ook nooit staan hij werkt in de slachterij in trance. Daarna volgt dan het echte slagersgedeelte, het was nog een hele toer al die ledematen uit elkaar te houden. Er hangt een groot affiche achter de toonbank met de namen van de verschillende onderdelen en al doende leert men.
    Het werken met de klanten vind ik ook erg aantrekkelijk, ze komen vaak van ver omdat we alleen het beste van het beste verkopen en wegens ruim bemeten subsidies niet afhankelijk zijn van de hoge prijzen in vergelijkbare keurslagerijen.
    Het is mooi werk, wat heet, het is prachtig werk, zolang als het duurt dan want het voordeel van vrijwilligerswerk vind ik wel de gemakkelijke afwisseling.

    Bijzondere plek op, die foto, om te werken, werk je letterlijk op die graven of zijn ze inmiddels allang leeggeschennist.

    https://www.youtube.com/watch?v=d30iINRYDK8

  2. blewbird Avatar

    Je bent een ster!

  3. j de kat Avatar
    j de kat

    Dit is de langste Belgenmop ooit.

  4. beheerder Avatar
    beheerder

    Oeps. Een stukje schrijven en daarna “even” gaan slapen is niet zo’n goed idee. De eerste reactie stond een halve dag in moderatie. Aan de andere kant : als je bij sommige bladen reageert krijg je dat ook en daar is het de bedoeling dat andere bezoekers het lezen.

  5. beheerder Avatar
    beheerder

    J de Kat:
    Ik was nog iets vergeten. De communicatie tussen JavaScript en PHP (AJAX) gebeurt via JSON gecodeerde datastructuren. Natuurlijk gebruik je daarvoor geen standaard-functies, als je alles zelf wil maken. Natuurlijk werkte het. Tot iemand in zijn “omschrijving” een enter gebruikte. Waarschijnlijk was de wedstrijd toen al begonnen.

  6. Johan Avatar
    Johan

    Eind goed al goed.

  7. Grutte Pier Avatar
    Grutte Pier

    Cool!

Leave a Reply

Your email address will not be published. Required fields are marked *