Tales of Drudgery and Boredom

Michel Vuijlsteke's Weblog. Altijd al geprobeerd een dagboek bij te houden.

I've moved
My new address is http://blog.zog.org.
Not because I was immensely dissatisfied with Radio, just because TypePad is the better service. That, and Robb's Law: I don't want to have a weblog (any website really) on a domain that I don't own.

Ik ben verhuisd
Mijn nieuw adres is http://blog.zog.org.
Niet omdat ik heel erg ontevreden was van Radio, maar gewoon omdat TypePad beter is. En omdat ik er een website kan hebben op mijn eigen domeinnaam.

  donderdag 6 maart 2003

Niet slèkt:

reading and parsing event XML
reading testEvenement.xml took 450 ms
parsing eventXML took 22524 ms
eventXML contains 1487 events

looping over events
TestNaam
Schaken door de eeuwen heen
test Oostendse Salsanachten
[...]
FATALE VROUWEN
KERSTTAFERELEN WASSEN BEELDJES
looping over 1487 events took 1022 ms

Magnifiek. Culprit gevonden. Er staat op lijn 104.204 bijvoorbeeld dit:

<KL_Periode>08/06/2003 09/06/2003 10/06/2003 11/06/2003 12/06/2003 13/06/2003 14/06/2003 15/06/2003 16/06/2003 17/06/2003 18/06/2003 19/06/2003 20/06/2003 21/06/2003 22/06/2003 23/06/2003 24/06/2003 25/06/2003 26/06/2003 27/06/2003 28/06/2003 29/06/2003 30/06/2003 01/07/2003 02/07/2003 03/07/2003 04/07/2003 05/07/2003 06/07/2003 07/07/2003 08/07/2003 09/07/2003 10/07/2003 11/07/2003 12/07/2003 13/07/2003 14/07/2003 15/07/2003 16/07/2003 17/07/2003 18/07/2003 19/07/2003 20/07/2003 21/07/2003 22/07/2003 23/07/2003 24/07/2003 25/07/2003 26/07/2003 27/07/2003 28/07/2003 29/07/2003 30/07/2003 31/07/2003 01/08/2003 02/08/2003 03/08/2003 04/08/2003 05/08/2003 06/08/2003 07/08/2003 08/08/2003 09/08/2003 10/08/2003 11/08/2003 12/08/2003 13/08/2003 14/08/2003 15/08/2003 16/08/2003 17/08/2003 18/08/2003 19/08/2003 20/08/2003 21/08/2003 22/08/2003 23/08/2003 24/08/2003 25/08/2003 26/08/2003 27/08/2003 28/08/2003 29/08/2003 30/08/2003 31/08/2003 31/08/2004 31/08/2005 31/08/2006</KL_Perio!
de>

Zeer grappig: die lijn is afgebroken na 990 karakters. Never mind dat dat gedrocht waarschijnlijk beter iets zou zijn in de zin van

<KL_Periode begin="08/06/2003" eind="31/08/2003"/>
<KL_Periode begin="31/08/2004" eind="31/08/2004"/>
<KL_Periode begin="31/08/2005" eind="31/08/2005"/>
<KL_Periode begin="31/08/2006" eind="31/08/2006"/>

of

<KL_Periode>
  <begin>08/06/2003</begin>
  <eind>31/08/2003</eind>
</KL_Periode>

of iets in die zin, of zelfs dat wellicht beter een iets minder ambigu datumformaat zou gebruikt worden, of zelfs dat ik mij met de beste wil van de wereld niet kan inbeelden dat het evenement waarover het gaat dit jaar tussen 8 juni en 31 augustus gehouden wordt, maar in 2004, 2005 en 2006 telkens op één dag, 31 augustus.

Zucht.

En de encoding staat zogezegd op ISO 8859-1, maar in de file zelf worden wel karakters gebruikt die voor Latin-1/West European ongeldig zijn. Asshats!

Egads! Ze hebben verdorie de beelden voor de evenementen in de XML zelf gezet! Base bloody 64 encoded. Urgh. Ik heb zoiets nog nooit gedaan.

Eens kijken zeker? Ahem. Vijftien megabyte XML. On verra ce qu'on verra.

Hmm. Het inlezen lukt nog vlotter dan gedacht, op het eerste gezicht. Tussen 1500 en 2500 milliseconden. En nu loopen over die XML-structuur. Dat wordt lachen vrees ik.

Dedju! Ze leveren ons een file van honderdduizenden regels, en die is zelfs niet valide? "Expected "</KL_PERIODE>" to terminate element starting on line 101,686" weet de parser mij e vertellen. Tommetoch.

Bleh. Daarjuist een XML-file met 1500 evenementen binnegekregen.

Wat zou ik eerst doen? Een converteerding schrijven om die XML om te zetten naar onze structuur? Of een XSL om de inhoud te tonen op de website? Of toch maar in Delphi een zoekfunctie naar die statussen en "ontbreekt"-dingen?

Hmmmm... Ik denk eerst eens die conversie. Alhoewel dat het vervelendste is, zou het het minst lang moeten duren. Allez dan.

Zitten rondprutsen in andermans code is niet altijd even evident.

Ik heb daarnet een eenvoudig schermpje bij de content manager gevoegd (met per node in de boom een achttal mogelijke "ontbreekt"-velden en een zevental statusvelden, van "created" over "internal validation" tot "publication"). Dat was rap gedaan: tabje bij in de node properties, hup een paar checkboxen erop, wat vieze code in GetContent om .checked laten afhangen van een veld in de database, onClick allChange aanroepen, en dan in ApplyContent wat vieze code om de database-velden te laten zetten zoals ze .checked-prperty van de checkboxen stonden.

Ik zeg "vieze code" trouwens omdat ik geen flauw idee heb hoe ik in Delphi een variabelenaam dynamisch kan laten evalueren. Zoals het nu is, zit ik opgescheept met monstrositeiten in de zin van

aTemp1:=strToBool(varToStr(rs.fields['node_temp1'].value));
aTemp2:=strToBool(varToStr(rs.fields['node_temp2'].value));
aTemp3:=strToBool(varToStr(rs.fields['node_temp3'].value));
aTemp4:=strToBool(varToStr(rs.fields['node_temp4'].value));

Ik zou het misschien kunnen oplossen met een structuur of een array of zo, dynamisch die checkboxen er run-time op pleuren, maar daar ben ik bang van: het is al te lang geleden en ik zou er teveel op moeten zoeken. Mocht dit ColdFusion-achtig zijn, dan zou ik verwachten iets in de zin van het volgende te kunnen doen:

for i:=1 to 17 do
  evaluate('aTemp1'+intToStr(i)):=
   strToBool(varToStr(rs.fields['node_temp'+intToStr(i)].value));

...maar het is dus niet iets ColdFusion-achtig, en dat lukt allemaal niet wegens alsdat die strings uiteraard tegen dat het run-time is allang geen strings meer zijn, en dus is het vies gecodeerd, waarschijnlijk weet Stijn wel hoe het eigenlijk moet.

Enfin dus, so far so good, dacht ik, nu nog die zooi synchroniseren. Een stukje toevoegen aan TSyncThread.UpdateNode voor de synchronisatie heen:

for i:=1 to 17 do
  AddElem(Content,'temp'+intToStr(i)).text:=
    tbl.Fields['node_temp'+intToStr(i)].Value;

...en de tegenhanger in TSyncThread.TaskNode voor de synchronisatie terug:

for i:=1 to 17 do
  tbl.Fields['node_temp'+intToStr(i)].Value:=
    GetElem(content,'temp'+intToStr(i))='1';

Hoplaboem, niet veel later, en ik dacht dat ik klaar was. Statusje veranderen op de site, synchroniseren... niets. Ahem. Nakijken in de database, tiens, counter wordt niet geïncrementeerd op het node-object bij een edit on-line. Dus toegevoegd

<cfscript>
  request.app.sync=request.fnEdit.getCurrentSync();
  request.app.editSync=request.fnEdit.getIncrementSync();
  request.fnObjectsEdit.updateObject(node_id);
</cfscript>

aan de update-actie op de site. En nog eens synchroniseren.

Ah tiens, de gewijzigde node verdwijnt gewoon helemaal. Opsporen, zoeken, ha! Er stond

tbl.Fields['node_deleted'].Value:=GetElem(content,'deleted')='0';

en dat moest zijn

tbl.Fields['node_deleted'].Value:=GetElem(content,'deleted')='1';

Opgelost? Nope. Bleek dat dezelfde actie (deleted:=true als <deleted>0</deleted>) ook nog eens uitgevoerd werd op het object zelf, dus niet op de node-als-node, maar op de node-als-object.

Aangepast, sync, juich! Het lukt!

Arrested for wearing "peace" t-shirt

Stephen Downs, a lawyer, was arrested for wearing a t-shirt with the text "give peace a chance" and refusing to leave the Crossgates Mall in Guilderland, New York. According to Downs, he had just purchased the t-shirt right outside the mall.

Security guards had first ordered him to take off the t-shirt or leave the mall. When he refused, they called the police. Police officers argued that a mall was like a private house. When he still refused to take off his t-shirt or leave, he was taken away in handcuffs.

Downs is due in court on March 17 and risks a year in prison if convicted.

[Secular Blasphemy]

Verdimme tien na negen en geen Stijn te zien. Misschien zit hij beneden bij Suzanne? Ik zit hier in ieder geval met Myriam en Koen.

Bij de mensen van de provincie, maar Stijn is er nog niet.

Ik heb mij dan maar zo geïnstalleerd.

En ik ben daarjuist dan toch niet aan de pulp begonnen: het is Rise of Western Christendom geworden. Vanmorgen eventjes de inleiding gelezen, en ik was al direkt hooked. Vooral dat de mens expliciet het wetenschappelijk werk van de laatste paar jaar meeneemt, en niet een rehash doet van Henri Pirenne (die in de jaren 30 zei dat het Romeinse Rijk niet "ineengestort" is rond 500, de "barbaarse invallen" eigenlijk niet echt zo erg waren omdat het de commercie was die Europa samenhield, en dat het pas is als de islam Carthago verovert tond 700 dat de Middellandse Zee, het echte centrum van Europa, niet meer open is voor West-Europa, waardoor de Karel de Grote mogelijk wordt). Sans Mahomet pas de Charlemagne, azzet ware.

Ht was wel zielig vanmorgen: Zelie slaapt bij Sofie en Andy, en Louis is hier alleen. Hij kwam naar beneden, en al dat er uitkwam was "zusje! zusje! zusje!".

Och here dat kind. Het is de eerste keer denk ik dat hij wakker wordt en dat Zelie er niet bij is.

Voor de rest: weelde! Kunnen uitslapen tot acht uur!

Ikzelf

Nieuws & stuff Fark - Salon - BBC - Standaard - Slashdot

Mensen Graham - Bie - Neil G. - Rene - Iwein - Merel - Free - Steven - Bruno - Stijn

Boeken Bookslut - Amazon UK