Smart Duck computeren en andere dingetjes ...

Tomcat 8 request dumper JSONRPC bug (EGL)

De request-dumper in Tomcat 8 geeft problemen met jsonrpc requests. De request-dumper gebruikt u voor debugging doeleinden om meer inzicht te krijgen in de request die worden afgehandeld op de Tomcat server. Ik had een client - server applicatie gebouwd in EGL. Een webclient die een restservice bevraagd. Lokaal in mijn ontwikkelomgeving werkte het prima. Echter gedeployed op een Tomcat 8 server kreeg ik foutmeldingen te zien. In de Tomcat error log vond ik het volgende:

04-Mar-2020 13:45:46.998 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 52805 ms
No JSON? ?????????????????????
com.ibm.javart.json.TokenMgrError: Lexical error at line 1, column 1. Encountered: "\uffff" (65535), after : ""
at com.ibm.javart.json.JsonParserTokenManager.getNextToken(JsonParserTokenManager.java:544)
at com.ibm.javart.json.JsonParser.jj_consume_token(JsonParser.java:283)
at com.ibm.javart.json.JsonParser.Object(JsonParser.java:64)
at com.ibm.javart.json.JsonParser.ObjectParse(JsonParser.java:56)
etc...

Met Fiddler (monitoring tool voor o.a. http verkeer) heb ik de request en response bekeken.

{"headers" : {"JSONRPCError" : "%7B%22error%22+%3A+%7B%22name%22+%3A+%22JSONRPCError%22%2C+%22code%22+%3A+%22EGL1538E%22%2C+%22message%22+%3A+%22EGL1538E%3A+See+log.+ID%3AMar+4%2C+2020%2C+3%3A22%3A26+PM.3%22%2C+%22error%22+%3A+%7B%22messageID%22+%3A+%22EGL1538E%22%2C+%22message%22+%3A+%22EGL1538E%3A+See+log.+ID%3AMar+4%2C+2020%2C+3%3A22%3A26+PM.3%22%2C+%22source%22+%3A+4%2C+%22detail1%22+%3A+%22%22%2C+%22detail2%22+%3A+%22%22%2C+%22detail3%22+%3A+%22%22%2C+%22name%22+%3A+%22egl.core.ServiceInvocationException%22%7D%7D%7D"}, "status" : 500, "statusMessage" : "FAILED", "body" : "{\"error\" : {\"name\" : \"JSONRPCError\", \"code\" : \"EGL1538E\", \"message\" : \"EGL1538E: See log. ID:Mar 4, 2020, 3:22:26 PM.3\", \"error\" : {\"messageID\" : \"EGL1538E\", \"message\" : \"EGL1538E: See log. ID:Mar 4, 2020, 3:22:26 PM.3\", \"source\" : 4, \"detail1\" : \"\", \"detail2\" : \"\", \"detail3\" : \"\", \"name\" : \"egl.core.ServiceInvocationException\"}}}"}

Na vergelijken van de configuratie bestanden van mijn lokale Tomcat en de versie op de server zag ik alleen een verschil in de web.xml. Heeft u een vergelijkbaar probleem kijk dan eens in de web.xml van de Tomcat server waarop de applicatie is geinstalleerd. Ziet u dan het volgende geconfigureerd:

<filter>
   <filter-name>request-dumper</filter-name>
   <filter-class>
      org.apache.catalina.filters.RequestDumperFilter
   </filter-class>
</filter>

En eventueel:

<filter-mapping>
   <filter-name>request-dumper</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

Deze stukken configuratie heb ik in commentaar gezet ( <!-- --> er omheen). Hierna werkte mijn applicatie en werden de request netjes afgehandeld.

Waarom procedureel programmeren beter is dan OOP

Dit stukje sluit aan op het berichtje OOP religekkies wat ik een tijdje terug heb geblogd. Object georienteerd programmeren is al een tijd de trend in het wereldje van de softwareontwikkelaar. Waar ik o.a. tegen aan loop is dat OOP mijn aandacht verlegt van bezig zijn met het voorstel wat mijn opdrachtgever heeft gegeven naar hoe ik met de code om moet gaan. Bij OOP moet ik gaan bedenken hoe ik allerlei classes met elkaar moet laten communiceren met o.a. dependency injection, abstracties, overerving etc. naast hoe ik mijn code organiseer in bibliotheken en mappen.

OOP gaat naar mijn idee geheel voorbij aan het KIS princiepe (keep it simpel). Hoe simpeler een programma is hoe beter leesbaar en onderhoudbaar deze is. Ik ga er van uit dat u wanneer u een stuk code schrijft begrijpbare namen kiest voor variabelen en functies zodat iemand anders ook begrijpt wat uw code doet. In mijn ogen is OOP een hele slechte methodiek. Het is leuk voor wetenschappelijke studies op universiteiten.

OOP gecombineerd met TDD (test driven development) gaat helemaal fout. Met OOP bent u veel te lang bezig met mockups e.d. te maken om uw code te testen. Simpele functies en procedures zijn eenvoudiger in units te testen. Testen kost dan minder tijd. Testen zijn veel eenvoudiger te schrijven.

In de praktijk wanneer u onder tijdsdruk en een solide oplossing moet leveren is OOP een no go. Procedureel werkt dan veel beter. De volgorde van hoe uw programma werkt is eenvoudiger. En u kunt gelijksoortige functies of procedures samen prima in een bibliotheek onderbrengen om zo overzicht te houden. Procedureel programma's schrijven is sneller, simpel, met minder kans op fouten, beter leesbaar voor andere (onervaren)programmeurs, en minder kostbaar voor uw baas.

Simpel geformuleerd, een programma dat doet:  "doe stap 1", "dan stap 2", "doe dan stap 3" is vele male leesbaarder dan een programma dat doet: "maak instantie van 1 maak een factory rond stap3 en waarin stap 2 als depency is meegegeven".

OOP is een vreemde methodiek, zo denken mensen in het algemeen niet en daarom werkt het ook niet. Procedureel past veel beter bij wat uw manager of marketing afdeling graag wilt. U kunt zelf wel helemaal begaan zijn met OOP of functioneel programmeren en wat voor een methodieken die we kunnen verzinnen. Uiteindelijk gaat het om het eindproduct, een goed werkend stuk programmatuur.

Brian Will legt hier met voorbeelden uit waarom procedurele code compacter en minder complex is dan OOP code.

Kevlin Henney legt hier ook uit waarin OOP religekkies zich in verliezen (vanaf 25:15).
Kevlin heeft in zijn betoog veel goede punten, bekijk het hele filmpje!

Psuedomugil signifer

Dit artikeltje heb ik in de jaren '90 geschreven voor aquarium vereniging Ichthus te Zevenaar.

Herkomst

Dit fraaie visje komt uit Australië, en vrij wel aan de gehele oostkust tot 20-30 km land inwaarts. Van Cooktown in het noorden tot Ulladulla in het zuidelijke New South Wales.

Uiterlijk

Het is moeilijk om dit visje te beschrijven, omdat de kleur en lengte van de vinnen per vindplaats sterk verschillen. Ook de watercondities verschillen sterk per locatie. Eerst maar een aanwijzing hoe de kleuren kunnen variëren; het lichaam kan van bruingeel tot een zilverig grijsblauw kleuren. Langs de schubbenranden is altijd een grijs/zwarte nettekening te vinden. De staart, aars- en tweederugvin zijn van geel tot oranje gekleurd en voorzien van een zwarte en daarnaast een witte zoom. De eerste rugvin en de gepaarde vinnen zijn zwart met een witte zoom. De eerste rugvin kan bij sommige populaties zo zijn verlengd dat deze tot aan de staartvin reikt.

Waterkondities

De watercondities kunnen per vindplaats variëren van zoet- tot brakwater. Sommige populaties komen alleen in zoetwater voor. Andere populaties zwemmen geregeld van brakwater gebieden naar zoetwater, en andersom. De meeste nakweek kan zonder problemen in puur zoetwater worden gehouden. Met wildvang moet je voorzichtiger zijn, altijd informeren naar de herkomst! Voor de zoetwater populaties neem je de volgende richtlijnen aan : Temperatuur 20-27°C, pH 7 - 7.8, in de natuur komen extremere condities voor : Temperatuur 15-28°C en de pH 5.5 tot 7.8. Toevoeging van zeezout voor een brakwatermilieu: 0,5 gram per liter. Bij een goede warme zomer kun je het verwarmingselement gewoon uitzetten. P. signifer heeft wel regelmatige waterverversingen nodig om gezond te blijven, 20 % per week is aanbevolen, in een klein aquarium is dit zeker nodig! In een groter aquarium kunt je hier iets van afwijken.

Inrichting aquarium

Deze soort houdt van een dichte beplanting, maar vanwege hun levendige karakter moet er toch wel voldoende zwemruimte zijn. De bodem kan uit zand of een grind/zand mengsel. Gebruik fijnbladerige planten zoals Cambomba, Hoornblad en Javamos. Ze zijn in een aquarium vanaf 60 cm goed onder te brengen, en dan in een schooltje van ongeveer 10 stuks. Zorg voor een verhouding mannetjes : vrouwtjes als 1 : 2. Zorg voor schuilplaatsen in de vorm van stenen, kienhout of dichte begroeiing. De mannetjes kunnen ongeïnteresseerde vrouwtjes behoorlijk opjagen. Als de diertjes in zoetwater worden gehouden, zijn Corydoras soorten of grondeltjes heel geschikt als gezelschap. Hele fraaie grondels zijn Tateurndina ocellicauda uit Nieuw Guinea en Chlamydogobius eremius (Woestijn grondel) uit Australië. Voor een brakwater milieu is natuurlijk het bekende Geelbandgrondeltje (Brachygobius nunus) uit Indonesië een leuke afwisseling in het bakje.


Kweek

Deze is gemakkelijk bij regelmatig voeren 1-2 keer per dag met levend voor dan zijn de visjes zo in paar stemming. Bij een goede verzorging kunt u dit dagelijks zien, en ook in de gezelschapsbak! Het mannetje zwemt met schokkerige bewegingen voor het vrouwtje langs, als zij dan op zijn uitnodiging ingaat volgt ze hem naar een door hem uitgezocht plekje in fijn groen. De visjes zwemmen naast elkaar waarbij het mannetje heftig met zijn borstvinnen "slaat". Daarna, in het groen, worden de eitjes afgezet en bevrucht, waarbij de visjes zij aan zij liggen. De eitjes (vrij groot 1,4 - 1,8 mm) worden in de onderste 10 cm van het aquarium in fijnbladerig groen afgezet. Het vrouwtje legt verspreid over een aantal dagen zo'n 10-12 eitjes per dag. P. signifer is een eiereter dus ; zo snel mogelijk de eitjes verwijderen. De eitjes zijn voorzichtig met de vingers uit het groen te halen en kunnen, mits vochtig gehouden !, 10 to 15 min. buiten de bak verblijven. Het verwijderen van de eitjes uit javamos kan een lastig karweitje zijn, de eitjes bezitten een plakkerig draadje en blijven gemakkelijk aan je handen kleven. De eitjes komen uit na twee tot drie weken. Ik breng de eitjes meestal over in een klein bakje van 20 cm met een klein laagje water (2-3 cm). Op deze manier kan ik de ontwikkeling van de eitjes goed in de gaten houden. Zorg er wel voor dat het bakje op een goed verwarmde plek staat, minimaal kamertemperatuur. Om te voorkomen dat eitjes verschimmelen kun het bakje het beste op een wat donkere plaats zetten. Een beetje (2-3 druppels) methyleenblauw kan ook geen kwaad om verschimmelen te voorkomen. De pas uitgekomen jongen zijn prima door de eerste twee weken te brengen met pantoffeldiertjes en hard gekookte eidooier. Daarna breng je de jongen groot met fijn droogvoer (bijvoorbeeld: Tetra Micromin) en levend voer (bijvoorbeeld: artemia). Na 3 maanden zijn de visjes 2-3 cm, na nog eens drie maanden geslachtsrijp. Bij een goede verzorging worden ze ongeveer 4 jaar oud. P. signifer is een taai visje waar u veel plezier aan kunt beleven!

Copyright 2020 Marcel Beekman

Nanochromis transvestitus

Dit artikeltje heb ik in de jaren '90 geschreven voor aquarium vereniging Ichthus te Zevenaar.

In de natuur zijn de mannen meestal mooier dan hun vrouwtjes. Bij dit visje gaat dit helaas niet op, daar heeft dit visje ook zijn wetenschappelijke naam "transvestitus" aan te danken. Het vrouwtje van deze soort is een grote lijnen gelijk aan het mannetje, alleen de kleuren zijn veel intensiever. Het visje heeft een grijze tot bruinbeige ondergrond met daarop 5-6 donker grijze dwarsbanden. De ongepaarde vinnen zijn voorzien van een zwart zoompje. Verder hebben de kieuwdeksels groenbronzen glans. Het vrouwtje heeft als extra een heel fraai patroon van witte streepjes in haar rug-, aars- en staartvin, verder heeft zij een rood buikje. Bij de volwassen vrouwtjes is dit een heel diep bordeauxrode kleur.

Herkomst

Dit visje komt uit Afrika en wel uit het gebied rond het Maji-ndombe meer in Zaïre.

Mijn ervaringen

Tijdens de landelijke aquariumdag had ik een gesprek met een medeaquariaan bij de stand van de vereniging die op deze dag bij een bekende dierenwinkel was opgezet. Al snel vertelde hij mij dat hij nog zeker een 7 tal paartjes uit eigen kweek had en daar vanaf wilde. Ik heb 4 paartjes van hem gekocht, waarvan er 2 paar naar een goede vriend van me zijn gegaan die het ook wel eens met deze soort wilde proberen. Voor deze visjes heb ik een 60 cm aquarium ingericht, de inrichting voor deze visjes is vrij eenvoudig. De visjes houden van holletjes om in weg te "kruipen", dus kienhout en stenen mochten niet ontbreken. Verder heb ik rivierzand voor de bodem genomen omdat de visjes graag in het zand naar voedsel zoeken. Als beplanting kwamen dan de Anubias barteri soorten en het "mosselplantje" (Pistia stratiotes) als drijfplant (wat zorgt voor een rustig en gedempt licht in het aquarium) in aanmerking. De hiervoor genoemde planten komen voor in Afrika zodat je thema bij Afrika kan houden, en een echt speciaal biotoop aquarium creëert. Ik heb me er niet helemaal bij Afrika gehouden want ik heb er ook wat Javavarens (Microsorium pteropus)en Belgisch-blad (Hygrophyla polysperma) in gezet.

Ik heb al eens voor een paar jaar terug een paar Nanochromis tranvestitus gehouden samen met Pelvicachromis taeniatus (familie van de Kersenbuikcichlide) en dat ging prima. Ik heb toen wel nakomelingen gehad van P. taeniatus. Deze keer wilde ik het met 2 paartjes N. transvestitus proberen, en daarom heb ik voldoende scheidingen in de vorm van kienhout, stenen en planten in het aquarium aangebracht om het zicht zo veel mogelijk te beperken zijn zodat de dieren niet zo snel gestrest raken. Al snel vormde er 2 paartjes uit het groepje van vier en werden territoria al snel afgebakerd. Meestal nemen de dieren hun intrek in een op zijn kant gelegde kokosnootdop of een half bloempotje die in het zand gedrukt is, indien voorhanden. Dat gebeurde bij mij dus niet, de twee mannetjes vestigde zich ieder onder een stuk kienhout en groeven hun eigen hol. Het "broedhol" wordt grondig schoon gemaakt en wat zand wordt verschoven als het in de weg zit. De graafwerkzaamheden bleven gelukkig beperkt rond het broedhol zodat de planten niet boven kwamen drijven. Regelmatig komt er een vrouwtje langs een van de holen van de mannen om haar baltskunsten te vertonen. Dit is prachtig om te zien; het vrouwtje zet al haar vinnen wijd uit en kronkelt zich in een soort U -vorm.

Waterkwaliteit

Nu komen we bij de waterkwaliteit, die een belangrijke rol speelt bij de kweek van Nanochromis transvestitus, tenminste dat beweren veel liefhebbers (wetenschappers). Naar mijn idee is dat een beetje overdreven. Ik heb in grote lijnen aan de richtlijnen van de heren H. Linke en W. Staeck gehouden, zij geven aan: pH 4 - 6,5, zacht water en een temperatuur van 22 - 26°C. Mijn mening is dat veel vissen die generatie na generatie worden nagekweekt, zich aanpassen aan de condities waaronder wordt gekweekt. Als je de boeken dan moet geloven kweken de visjes meestal pas als de pH onder de 5,8 is, beter nog onder de pH 5,5 en er een regelmatige waterverversing plaats vindt, dus filteren over turf en of gedroogde bladeren of turfstrooisel op de bodem.

Kweek

Als de visjes zich "happy" voelen en regelmatig levend voer krijgen, kan je op nakomelingen rekenen. De visjes vertonen broedzorg in de vader-moeder vorm waarbij de taak van de vader meer het afbakeren van het territorium is en de moeder zich meer met de jongen bezig houdt. Af en toe nemen vader of moeder de taak van de andere ouder over als de ander niet in de buurt is. Als het aquarium groot genoeg is met voldoende schuilplaatsen groeien veel jongen op. Na ongeveer een half jaar zijn de jongen opgegroeid tot volwassen exemplaren. Ik heb nog geen jongen van één van de 2 paartjes gehad, maar ik verwacht dat zij mij zeer binnenkort zullen verassen met jongen.

Gezeldschaps aquarium

Eventueel zou ik de bevolking aan kunnen vullen met wat andere bewoners. Uit Afrika komen vele mooie killievisjes waarvan vooral de Rivulus soorten heel geschikt zijn als gezelschap, ook in een bakje van 60 cm. Gezelschap van rustige killies of labyrintvisjes die dicht bij het wateroppervlak zwemmen maken dwergcichliden minder schuw.

Geraadpleegde boeken: Afrikanische Cichliden I, Buntbarsche aus Westafrika, Horst Linke - Wolgang Staeck, uitgeverij Tetra.

Copyright (c) 2020 Marcel Beekman

Performance for loops in EGL

Stukje achtergrond

EGL is een 4GL taal die wordt gebruikt in IBM's Rational Business Developer.
EGL wordt vertaalt naar javascript (front-end), java of cobol (back-end)


Case

Vaak zie je de volgende code:

for (i int from 1 to lijst.getSize())
// doe iets
end

Bij Java generatie maar ook naar javascript kun je het beste eerst het
bepalen van de lengte van de lijst in een variabele zetten. Met het bepalen in de loop
gaat ie elke keer de lengte bepalen per iteratie.

Beter zo:

lengteLijst int = lijst.getSize();
for (i int from 1 to lengteLijst)
// doe iets
end

Test

Java (server kant)
1000 x 1000 x string zetten in een array
10000 x 1000 x string zetten in een array
100000 x 1000 x string zetten in een array

JavaScript (web pagina)
100 x 100 x string zetten in een array
1000 x 100 x string zetten in een array
10000 x 100 x string zetten in een array

Elke meeting is een gemiddelde van 5 testresulataten.

Resulaat

Lengte bepalen in de loop vs buiten de loop:

Java

Run In loop Buiten loop
1000 24 ms 20 ms
10000 174 ms 151 ms
100000 2400 ms 1800 ms

JavaScript

Run In loop Buiten loop
100 72 ms 61ms
1000 820 ms 600 ms
10000 5535 ms 5019 ms

 

Conclusie

Dit is maar een klein testje. Het geeft wel een indicatie. Mijn advies is om de lengte van een array altijd buiten de loop te bepalen.
Het kan sowieso geen kwaad. Met complexe en geneste loops denk ik dat er winst te behalen is. Bij kleine array's zal weinig te merken zijn kwa performance.


Bronnen

https://stackoverflow.com/questions/2383422/java-for-loop-performance-question
https://stackoverflow.com/questions/13645890/javascript-for-in-vs-for-loop-performance

 

De OOP religekkies

OOP staat voor object oriented programming. In het huidige softwarewereldje is dit de meest gangbare methodiek. OOP heeft zo zijn voor- en nadelen. Ik zie er meer nadelen aan kleven dan voordelen. Ik merk in discussies wanneer ik aangeef dat er ook andere manieren zijn men bijna fanatiek religieus reageert.

Zo heb je ook colega's die boos worden omdat ik weer eens een static class had toegevoegd. Als ik simpel een aantal functies nodig heb waar a en b in gaan en c uitkomt en verder geen staat hebben waarom zou ik daar meerdere instanties van willen hebben? Een C# of Java omgeving dwingt me te werken met classes maar die heb ik vaak helemaal niet nodig.

OOP is een stuk gereedschap dat soms handig is. Het kan handig zijn bij het ontwikkelen van een spel waarbij een object waarbij je bij een spelfiguur zijn attributen bij houdt, dus een staat heeft.

Ik zie de wereld, denk ik, wat relatiever dan een flink aantal andere programmeurs in het veld, en dat botst wel eens. Ik ga niet meer in discussie met programmeurs die OOP verkondigen als een absolute waarheid. Met elke programmeer methodiek kun je gestructureerd software ontwikkelen maar ook een gigantische spagetti produceren.

Professioneel doe ik wel wat water bij de wijn ik pas ik me aan met wat je met een team wil bereiken. Het doel van software ontwikkelen voor een baas is iets wat goed werkt, wat bij draagt en verkoopbaar is. Privé programmeer ik procedureel omdat dat het beste past bij mijn manier van denken.

Lees ook dit mooie stukje om over na te denken:

Object-Oriented Programming — The Trillion Dollar Disaster

of http://harmful.cat-v.org/software/OO_programming/why_oo_sucks

 

 

Home ← Oudere berichten