• Euh, ja, waar was ik?

    Euh, ja, waar was ik?

    Juist: die evenementen in de juiste tabellen krijgen dus.

  • Feh. Die werkt dan wel

    Feh. Die werkt dan wel weer. Tja, dan zal het zo maar moeten gaan zeker?

  • The mind positively boggles. Ik

    The mind positively boggles. Ik geraak van nergens meer aan die computer. noch als mezelf, noch als Stijn, noch via mijn computer, noch via een andere. Maar alle services draaien nog en de websites zijn zonder problemen toegankelijk.

    Weird. Eens kijken of RDS nog aan staat.

  • …maar nu is er weer

    …maar nu is er weer iets met de ontwikkelserver. Stom ding is nog altijd beschikbaar om op te surfen, maar filesharing is gelijk afgezet. Ik kan er niet meer op, noch via een share, noch via terminal services. Dammit. Eens kijken in het serverkot waar dat ding fysiek staat.

  • Ha! Het lukt! ’t Is

    Ha! Het lukt! ’t Is gewoon gelukt om uit die XML de jpegs te halen, ha! Nooit gedacht dat het zo simpel zou zijn. Eerst een functie definiëren voor he wegschrijven naar een file:

    <cffunction name=“writeBase64File” access=“private”>
      <cfargument name=“filename” type=“string” required=“yes”>
      <cfargument name=“content” type=“string” required=“yes”>
      <cffile action=“WRITE” file=“#arguments.filename#” output=“#toBinary(arguments.content)#”>
    </cffunction>

    En dan de loop over de XML, met lelijke kludge als er meer dan alleen DATA:BASE64 in het <data>-ding staat:

    <cfscript>
      eventXML=xmlparse(eventXML);
      numEvents=arraylen(eventXML.xmlRoot.xmlchildren);
      request.fnInstall.installMsg(“parsing eventXML took #gettickcount()-temp# ticks”);
      request.fnInstall.installMsg(“eventXML contains #numEvents# events”);
      
      request.fnInstall.installMsg(“looping over events”, “head”);
      temp=gettickcount();   

      for (iEvent=1; iEvent LTE numevents; iEvent=iEvent+1) {
        thisEvent=eventXML.xmlRoot.xmlChildren[iEvent];
        eventName=thisEvent.T_NAAM.xmlText;
        eventImg=thisEvent.SYS_composite_268304.data.xmlText;
        request.fnInstall.installMsg(“#eventName#”);
        if (len(eventImg) GT 12) {
          eventImg=right(eventImg,len(eventImg)-find(“BASE64”,eventImg)-5);
          eventImgName=listlast(thisEvent.SYS_composite_268304.path.xmlText,“/”);
          writeBase64File(“#expandpath(../products/events/images/“&eventImgName)#”,“#eventImg#”);
          request.fnInstall.installMsg(“—created file #eventImgName#”);
        }
      }

     
      request.fnInstall.installMsg(looping over #numEvents# events took #gettickcount()-temp# ticks”);
    </cfscript>

    Jawel, die ColdFusion is wel een stuk geëvolueerd sinds pakweg 1999. Het kan natuurlijk nog altijd lelijk, daar niet van:

    <cfset eventXML=xmlparse(eventXML)>
    <cfloop from=”1″ to=”#arraylen(eventXML.xmlRoot.xmlchildren)#” index=”i”>
    <cfif len(eventXML.xmlRoot.xmlChildren[iEvent].SYS_composite_268304.data.xmlText) GT 12>
    <cffile action=”WRITE” file=”#expandpath(“../products/events/images/”&listlast(eventXML.xmlRoot.xmlChildren[iEvent].SYS_composite_268304.path.xmlText,”/”))#” output=”#toBinary(right(eventXML.xmlRoot.xmlChildren[iEvent].SYS_composite_268304.data.xmlText,len(eventXML.xmlRoot.xmlChildren[iEvent].SYS_composite_268304.data.xmlText)-find(“BASE64″,eventXML.xmlRoot.xmlChildren[iEvent].SYS_composite_268304.data.xmlText)-5))#”></cfif></cfloop>

    …maar voor wie wil, kan het ook proper. En objectgeoriënteerdachtig. En al.

  • Te mooi om waar te

    Te mooi om waar te zijn:

    The parameter 1 of function ToBinary, which is now “DATA:image/jpeg:BASE64/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABIAE8DAREA AhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAAAwQBBQACBgf/xAAwEAACAQMDAwIFBAEFAAAAAAAB AgMABBEFEiExQVETIgYUYXGBMkKRsaEVI1JTkv/EABoBAAMBAQEBAAAAAAAAAAAAAAECAwQFAAb/ Ex9PhbK/G9Ccup2nZ+3p9q3n5nb2Dx8SJEbI29aIPzA+M9hGI0Ece3lj1PNIZZECCoIKuNuDgd68 YizTAH980YPMghTkAV6EgEETs4IjPpT6ku1h8ojooI3CaAMuMdT1BrB6gD+l9f4M+dyY+GQrKawn so72A2hjaRj7SBliCORID1/PfpxWp1LCm7TQA9cajmlOLlna19S7uDbPI4Zm3eoUIHXgcnHHbPio oKrLk37h8gn+oOTcrJnGtcO8gKjIA4rqhaE6gyMWFSrFxvJWQZYnAXtVeNCxMHrc9PDpOUBhR3ye DhjgUhUHZEfhjB4gTUCOJ8KvtPO4HoaJJYbhGLGjceOpsDDHLjoSM4B4NeIZu8bhhDVU1jZDOzO+ MDgZNGjVCIi4i5LVCtskUlOD1B8mgLHeWbHicWomuUaPIUK6djXgCDuT44mTQqpMawn3BBjx2okt GRMTDlxmSSRIpTaC3OFPNeCmBziTQG4s10zRqQemcj60/ETK2Zitgz//2Q== ” must be a Base-64 encoded string.

    Tja, natuurlijk. Die DATA:image/jpeg:BASE64 staat er teveel. Afkappen die handel.

  • Ik heb gelijk het gevoel

    Ik heb gelijk het gevoel dat dit niet de juiste manier is om dat beeld aan te maken. Het kan toch niet zo simpel zijn?

    <cffile action=”WRITE” file=”#expandpath(listlast(eventXML.xmlRoot.xmlChildren[thisEvent].SYS_composite_268304.path.xmlText,”/”))#” output=”#toBinary(eventXML.xmlRoot.xmlChildren[thisEvent].SYS_composite_268304.data.xmlText)#”>

    Effe tsjekke.

  • En dan nu: BASE64 proberen

    En dan nu: BASE64 proberen decoden. Hrm. Het beeld zit in een tag met de naam SYS_composite_268304. Zou die in de volgende versie dezelfde naam hebben?

    En in het algemeen: ik heb er geen flauw idee van of dat gaat lukken met die BASE 64. Maar: wel een beetje opwindend 🙂

  • Niet slèkt: reading and parsing

    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

    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

    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

    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

    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

    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

    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]