“Make the Future Java” was het credo van de achttiende JavaOne conferentie die van 22 tot en met 26 september in San Francisco werd gehouden, en inmiddels al weer voor de vierde maal georganiseerd werd door Oracle. Vijf dagen lang werden ongeveer 6.000 bezoekers getrakteerd op alles van Java.
Net als de afgelopen jaren waren een drietal hotels in downtown San Francisco de plaats van handeling. Op zondagmiddag 12.00 uur was het startschot van de conferentie met een serie keynotes in good old Moscone, het enorme conferentiecentrum waar JavaOne vroeger werd gehouden, maar wat de rest van de week in het teken van Oracle OpenWorld stond. Spectaculaire aankondigingen werden er op voorhand niet verwacht, maar toch heerste er een goede vibe. Na een paar jaren van wennen – de community aan Oracle en duidelijk ook andersom – leek het alsof er dit jaar een evenwicht in die relatie is bereikt.
Terugkijkend op de afgelopen jaren, kun je vaststellen dat Oracle er inmiddels in geslaagd is om van alledrie de Java distributies nieuwe releases te kunnen doen, de communitie en het toepassingsgebied van Java nog steeds groeien en dat, ondanks de wilde opkomst van alternatieve talen en frameworks, het ecosysteem rondom de kern, de taal, het platform en de libraries nog steeds springlevend is.
Ook in het politieke speelveld om de techniek heen, bijvoorbeeld in het Java Community Process (JCP), zijn een groot aantal positieve wijzigingen doorgevoerd. Het specificatieproces is daardoor veel minder ondoorzichtig geworden, contributies van buitenstaanders zijn makkelijker in te bedden en middels de zogenaamde Adopt-a-JSR formule is zelfs community input mogelijk geworden voordat een specificatie gestolde vormen aanneemt. Kortom, er zit misschien geen explosieve snelheid meer in het platform, maar er is zeker sprake van vooruitgang. Een gezonde basis voor de toekomst.
Zoals ieder jaar vormt de geweldige stad San Francisco het décor voor JavaOne.
Een complete straat afzetten in downtown San Francisco? Het kan tijdens JavaOne.
The Internet of Things
Over diezelfde toekomst gesproken, het centrale thema van de Strategy Keynote, en daarmee wat Oracle betreft van de gehele conferentie, was het zogenaamde Internet of Things (IoT). Hierbij gaat het om het grote en almaar groeiende aantal dingen (lees: devices) dat gecomputeriseerd is en bovendien connectiviteit kent. Op dit moment zijn er voor iedere menselijke internet-gebruiker al ruim drie devices direct of indirect verbonden met het internet en die factor loopt naar verwachting richting de 6,5 in 2020. Denk bij dit soort devices heel breed – van simpele sensoren, meters en domme camera’s tot complexere apparaten als printers, pin-automaten en auto’s.
Het M2M (Machine-to-Machine) netwerk dat door al deze devices wordt gevormd, genereert een enorm volume aan data – van een stortvloed aan kleine, tamelijk betekenisloze signaaltjes op sensor-niveau tot een sterk gefilterde en geconsolideerde stroom van verrijkte berichten in lokale knooppunten en vooral remote enterprise systemen. Het IoT is niet los te zien van Big Data en in veel gevallen – als snelle reactie op de informatie uit het IoT is vereist – met Fast Data. Fast Data is near-real-time interpretatie van (grote) data-stromen, leidend tot inzicht en actie. Event processoren zijn een gebruikelijk hulpmiddel in Fast Data omgevingen.
Een gebruikelijke configuratie omvat zogenaamde edge-devices met beperkte intelligentie en connectiviteit die eenvoudige signalen doorgeven aan lokale gateways. Deze gateways zijn complexer – zij aggregreren, consolideren, filteren en verrijken de signalen van de edge-devices – en beschikken over uitvoeriger security voorzieningen en connectiviteit, teneinde informatie te kunnen doorgeven aan de communicatie gateway, die de toegangspoort vormt tot enterprise omgevingen waar de gegevens verwerkt worden.
Een voorbeeld van bovenstaande configuratie: een beveiligingsdienst monitort een groot aantal objecten (gebouwen). Elk van die gebouwen bevat ruimtes – kamers, corridors, ventilatieschachten etcetera, en in die ruimtes kunnen meerdere temperatuursensoren aanwezig zijn. Iedere sensor geeft meerdere malen per minuut een meetsignaal af. Per cluster, bijvoorbeeld per verdieping, worden deze signalen geaggregeerd door een gateway. Gemiddelden worden iedere vijf minuten naar een centraal punt doorgegeven. Afwijkingen – meerdere sensoren die meer dan één afwijkend signaal afgeven – worden versneld en met hoge prioriteit gemeld door de gateway.
The Internet of Things was het thema tijdens de keynotes.
Java speelt op meerdere manieren een belangrijke rol in deze ontwikkeling. Allereerst draait op een groot aantal edge devices een Java Virtual Machine – bijvoorbeeld Java Card of de Java Embedded VM. Ook de lokale gateways kunnen met eenvoudige hardware worden gerealiseerd die de Java SE Embedded VM bevat, waarop mogelijk een Event Processor draait. Oracle biedt bijvoorbeeld de Oracle Event Processor for Oracle Java Embedded, die op eenvoudige devices zoals de Raspberry Pi kan worden gebruikt om fast data verwerking te realiseren.
De enterprise omgeving die tenslotte de informatie uit het M2M netwerk ontvangt en verwerkt kan heel goed een Java Enterprise architectuur zijn. Naast data verwerking spelen in die omgeving device management (welke componenten hebben toegang, waar bevinden die zich en welke functioneren nog) en security ( is het bericht dat ontvangen is integer en is het verzendende device bekend en geautoriseerd).
IoT is daarmee vanuit het perspectief van de software ontwikkelaar een end-to-end verhaal. Dat wil zeggen: op alle onderdelen van het IoT landschap kun je met Java uit de voeten. Een trend die momenteel waarneembaar is, is dat fabrikanten van bijvoorbeeld edge devices, sensoren en gateways momenteel massaal overstappen naar Java als ontwikkelplatform. Reden hiervoor is dat de developer community van ruim 9 miljoen potentiele ontwikkelaars van toepassingen voor dit soort hardware, de enige manier zijn voor deze fabrikanten om de gewenste versnelling en versmelting van hardware en software voor deze platformen mogelijk te maken. Java keert hiermee ook eigenlijk weer terug naar zijn roots: embedded. Of zoals James Gosling het in de afsluitende keynote zei: “This is what Java was invented for. Enterprise Java was just an opportunistic accident along the way.” Hiermee kreeg hij natuurlijk de lachers op zijn hand, maar het is misschien niet ver naast de waarheid.
De evolutie van Java voor eenvoudiger devices verloopt gestaag. Java ME 8 maakt al vrijwel volledig gebruik van de APIs en libraries die ook in SE worden gebruikt. Het Java SE 8 Embedded Compact Profile is met pakweg 14 Mb inmiddels zo klein, dat op veel devices – die ook nog eens steeds krachtiger hardware gebruiken – een tamelijk volwassen vorm van Java kan worden toegepast. Oracle stimuleert het gebruik van Java op appliances en devices ook met de binaire distributie van de JDK voor ARM/Linux, waardoor gebruik van Java op allerlei ARM gebaseerde devices erg eenvoudig is geworden. De early access release van JDK 8 voor ARM (Raspberry Pi (ARM 11/Linux) en STM32F4DISCOVERY (ARM Cortex-M4) omvat ook JavaFX8.
JavaOne 2013 omvatte een groot aantal druk bezochte presentaties en hands-on sessies rondom embedded Java toepassingen en het gebruik van Java op eenvoudige devices zoals de Raspberry Pi (27 presentaties over de Raspberry Pi!). Die laatste is een computerboard zo groot als een creditcard dat kan worden aangesloten op een tv en een toetsenbord. Het is een op ARM-gebaseerd mini-board dat dus een JVM kan draaien en op allerlei fysieke apparaten kan worden aangesloten – van LED lampen, luidsprekers en eenvoudige drukknoppen tot lichtkranten, deurbellen en temperatuursensoren. De Pi heeft USB, RS232, SD kaart en ethernet-aansluitingen. Het open source project Pi4J – gepresenteerd op JavaOne – biedt een Java API dat een brug vormt naar de fysieke poorten en andere native voorzieningen van de Raspberry Pi. We schreven in Java Magazine al eerder over toepassingen met de Raspberry Pi. De Pi is veel groter dan industrieel toegepaste embedded devices, maar heeft wel vergelijkbare eigenschappen, zodat het voor pakweg 35 euro een geweldige mogelijkheid biedt om embedded Java applicaties te ontwikkelen die vervolgens op ‘echte’ devices kunnen worden uitgerold. Plus dat het wel erg leuk speelgoed is voor Java ontwikkelaars. Een van de projecten die werden gepresenteerd was de zogenaamde DukePad [1] , een zelfbouw tablet op basis van de Raspberry Pi. Leuk voor wie er nog regenachtige zondagmiddagen over heeft!
Bouw je eigen tablet op basis van een Raspberry Pi en Java Embedded.
Java SE 8
Tijdens de technical keynote op zondag was er veel aandacht voor Java SE 8. Dat de release verschoven is van september 2013 naar maart 2014 mocht de pret niet drukken. Onder andere Brian Goetz gaf een overtuigend betoog waarom deze versie van Java het wachten zeker waard is. Brian Goetz is de spec-lead van een van de belangrijkste toevoegingen aan Java 8: Project Lambda.
Met Project Lambda wordt het (eindelijk) mogelijk om in Java meer functioneel te programmeren. Dit gaat op veel libraries in positieve zin zijn weerslag hebben. Maar de belangrijkste library is natuurlijk Java’s eigen core-library. Gelukkig is er ook op dat vlak flink aan de weg getimmerd. Zo is de Collections library volledig klaargemaakt voor Lambda’s:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
In dit voorbeeld zie je duidelijk hoe expliciet te itereren over een collectie met for-loops verleden tijd is. Met de nieuwe Collections library gebruik je ‘higher-order functions’ zoals filter en mapToInt om een collectie te transformeren. Deze functies hebben een Lambda als parameter waardoor je eenvoudig het gewenste gedrag kunt meegeven.
Verder introduceert Java 8 het Stream concept. Een willekeurige collectie zet je om in een Stream door de nieuwe stream() methode aan te roepen. Dit zorgt ervoor dat de volgende transformatiestappen (in dit geval filter en maptoInt) samengevoegd worden en dat er slechts één keer over de collectie heen gelopen wordt.
Het mooie van de nieuwe Collections API is dat je eenvoudig de onderliggende iteratie-strategie kunt veranderen:
int sum = widgets.parallelStream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
Door alleen stream() te veranderen in parallelStream() wordt de transformatie van de collectie nu volledig parallel uitgevoerd. Onder de motorkap wordt het Fork/Join framework gebruikt, wat in Java 7 zijn intrede al heeft gedaan. Nu kun je eenvoudig gebruik maken van alle kracht van je multi-core CPU, zonder de nogal vermoeiende API van Fork/Join direct te gebruiken.
Naast project Lambda brengt Java SE 8 nog vele andere verbeteringen met zich mee. Noemenswaardig is de toevoeging van de nieuwe Date and Time API (JSR 310). Deze is gebaseerd op de welbekende JodaTime library en dat is reden genoeg om hier naar uit te kijken. Ook bevat Java SE 8 een volledig nieuwe JavaScript engine, genaamd Nashorn. Nashorn belooft een sterk verbeterde JavaScript engine in de JVM te geven ten opzichte van de huidige Rhino engine. Programmeergemak, echte integratie tussen Java en JavaScript en vooral een zeer goede performance zijn de kern kwaliteiten van Nashorn.
Tenslotte zijn de Compact Profiles een eerste stap op weg naar modularisatie van het Java SE platform. Project JigSaw, op dit moment voorzien voor Java SE 9, moet een volledig modulair platform opleveren. De drie onderkende profiles ,compact1, compact2 en compact3, kunnen door ontwikkelaars worden gebruikt om hun applicaties mee bundelen en te deployen en worden bijvoorbeeld ingezet voor Java SE-Embedded 8 for ARMv5/Linux. Ze zijn respectievelijk 14, 18 en 21 Mb in omvang – aanzienlijk kleiner dan bijvoorbeeld 7u21 SE Embedded ARMv5/Linux van 45 Mb.
Ben je benieuwd naar al deze wijzigingen, dan is dit het moment om op zoek te gaan naar de early access builds [2] van JDK8. Hiermee – bijvoorbeeld in combinatie met de NetBeans 7.4 Release Candidate [3] kun je direct aan de slag met de toekomst van Java.
Java SE 9 en verder
In voorzichtige mate werd alvast naar Java SE 9 vooruitgekeken. Naast het al genoemde project JigSaw zijn onderstaande thema’s nadrukkelijk genoemd in de strategy keynote:
Reification: een verbeterde implementatie van Generics zonder Type Erasure, waarbij het onderscheid tussen primitieve types en ‘gerefereerde types’ vervaagt en veel meer meta-data over types beschikbaar is op runtime
Java en grafische processoren: Project Sumatra dat streeft naar hardwarematige versnelling van Java-executie
Meer geheugen-efficiënte datastructuren: ondermeer snellere en compactere serialisatie en I/O en beter gebruik van geheugen voor vasthouden van data
JNI 2.0: voor interactie vanuit Java met native code
Wel zullen we voor dit soort ontwikkelingen nog even wat geduld moeten hebben. Vooralsnog staat JDK 9 met potlood gepland voor 2016.
De thema’s voor Java EE 7.
Java EE 7
Afgelopen juni zag de nieuwste generatie van het Java Enterprise platform het levenslicht in de vorm van Java EE 7. De belangrijkste thema’s voor Java EE 7 zijn het verhogen van de ontwikkelproductiviteit, het verder omarmen van HTML 5 en tenslotte het aanvullen van ontbrekende enterprise standaarden. Om aan het productiviteitsthema te kunnen voldoen is er verder gesnoeid in de boilerplate code, wordt er nog meer gebruik gemaakt van annotaties en slimme default configuratiekeuzes en spelen de onderlinge enterprise specificaties beter op elkaar in. Een goed voorbeeld hiervan is dat eindelijk – na ruim 10 jaar wachten – de JMS API volledig op de schop is gegaan, en dat er nu met een fraaie fluent API berichten verzonden en ontvangen kunnen worden.
De WebSocket specificatie is een interessante nieuwe toevoeging aan het platform en in lijn met de wens om HTML 5 verder te omarmen. Naast WebSocket ondersteuning, is er ook een nieuwe API voor het verwerken van JSON, een prettige nieuwe Client API voor JAX-RS, en is er in JSF betere ondersteuning voor HTML 5 gekomen. Onder water zijn er in de Servlet API nog wat nieuwe zaken toegevoegd, waaronder streaming gebaseerd op NIO.
Een andere nieuwe toevoeging in Java EE 7 is de zogenaamde Batch API. Hiermee is eindelijk ondersteuning voorhanden op het gebied van offline batchverwerking. De API is voor een groot deel gebaseerd op Spring Batch. Een andere zeer nuttige toevoeging zijn de zogenaamde concurrency utilities voor Java EE. Hiermee zijn de bekende concurrency utilities die ten tijde van Java SE 5 werden geïntroduceerd, nu ook eindelijk in de container beschikbaar en hoeft hier geen beroep meer te worden gedaan op niet-standaard uitbreidingen die sommige applicatie servers al enige tijd boden.
GlassFish 4 is de referentie implementatie voor Java EE 7, en de meest recente versies van zowel Eclipse als NetBeans bieden goede ondersteuning. Later dit jaar zal ook IntelliJ ondersteuning gaan bieden ten tijde van de nieuwe release van IDEA. Naast GlassFish zijn er diverse andere applicatie servers die op het punt staan ondersteuning te bieden of dit in een pre-release al bieden, zoals JBoss Wildfly 8.
Java EE 8 en verder
Naast de vele presentaties over alle nieuwe en bekende technologie in Java EE 7, waren er ook een aantal sessies waarin werd verteld over de plannen voor Java EE 8 en verder. Een van de thema’s die zeker onderdeel zal zijn van deze release is ‘Cloud’. Hoewel dit onderwerp eerder al was gepositioneerd voor Java EE 7, waren de experts het met elkaar eens dat de tijd een jaar geleden nog niet rijp was voor enterprise standaarden in dit zeer dynamische spectrum. Of de komende paar jaar dat wel zullen zijn zal de tijd ons moeten leren. Andere zaken die op de agenda staan zijn onder andere modulariteit, maar daarbij is een grote afhankelijkheid naar het modulariseren van de JDK zelf, wat in Project JigSaw plaats moet vinden en die tijdslijn lijkt niet haalbaar voor de release van Java EE 8. Een nieuwe ontwikkeling is wel dat als er specificaties zijn die al ‘af’ zijn ruim voordat de release van Java EE 8 zelf komt, zoals JCache, de Java Caching API (JSR-107) en de nieuwe API voor JSON Binding, dat deze dan al eerder als zelfstandige specificatie met een eigen referentie implementatie worden gereleased.
Cameron Purdy vertelt over het open sourcen van Project Avatar
Project Avatar
Aan het eind van JavaOne 2011 werd tussen neus en lippen door nog even project Avatar gelanceerd, een project dat erop gericht was om ‘across the Java stack’ ondersteuning te realiseren voor HTML 5. Het was een wat amechtige poging aan te haken bij de enorme hype die HTML 5 destijds aan het ontketenen was, zonder dat er een duidelijk plan achter leek te zitten.
Vorig jaar werden er wel wat tipjes van de sluier opgelicht, maar bleef het hele project nog tamelijk abstract. De ondersteuning voor HTML 5 en aan HTML 5 gerelateerde onderwerpen kwam deels in Java EE 7 – JAX-RS en JSON ondersteuning, HTML 5 gerichte uitbreidingen in Java ServerFaces en de ondersteuning van WebSockets. Eén thema voor Avatar werd toen wel genoemd: server side JavaScript. JavaScript heeft zich de afgelopen jaren sterk ontwikkeld, mede door de snelle evolutie van de JavaScript engines, en is een serieus alternatief voor Java – en voor andere dynamische talen als Groovy en Scala – om server side componenten te ontwikkelen.
Door de introductie van de Nashorn engine in Java SE 8 wordt een flinke groei verwacht van het gebruik van JavaScript naast Java. Oracle is daarmee duidelijk voornemens om in te spelen op de trends rondom server side JavaScript zoals die vooral door het Node.js project worden aangezwengeld. Node.js maakt server side ontwikkeling mogelijk op basis van een asynchroon, event-gestuurd programmeermodel dat zwaar leunt op closures (functies als parameters) en gebruik maakt van native, platform-specifieke faciliteiten voor asynchrone verwerking en interactie. Node.js kent distributies voor alle grote platforms. Met dit programmeermodel kunnen zeer schaalbare applicaties worden ontwikkeld die grote aantallen requests kunnen afhandelen met heel beperkt resource-gebruik. In plaats van het blokkeren van een thread voor de afhandeling van een request, wordt met Node.js een thread alleen ingeschakeld als er weer werk te doen valt (er is bijvoorbeeld weer gelegenheid tot I/O). NB: de Servlet 3.1 API biedt enigszins vergelijkbare faciliteiten voor non-blocking I/O, maar die zijn niet heel eenvoudig toe te passen.
Dit jaar werd er opeens heel veel meer duidelijk over Avatar, en is er ook concreet code vrijgegeven. Project Avatar is als open source project gepubliceerd op avatar.java.net/. Het doel van dit project is verder geconcretiseerd: ontwikkeling van web applicaties met thin-server-architecture door ontwikkelaars te ondersteunen bij de creatie van server side JavaScript services op basis van het Node programming model, en die services te publiceren via WebSockets, REST, en Server Sent Events (SSE). Bij server side JavaScript ontwikkeling moeten ontwikkelaars met hulp van Avatar eenvoudig gebruik kunnen maken van Java EE Services. Applicaties op basis van Node.js moeten ongewijzigd op de JVM kunnen worden gedraaid, zodat al het goede van de JVM – zowel Java en Java EE integratie als de administratievoorzieningen van de JVM – beschikbaar komen.
Tenslotte biedt Avatar los van deze server side componenten ook een onafhankelijk client side framework dat HTML 5 componenten kan binden aan server side services – WebSockets, REST, and SSE, geïmplementeerd met welke technologie dan ook. Dit client framework vereist geen JavaScript expertise – en vormt dus een soort alternatief voor JQuery, Dojo en andere rich client frameworks. Afgezien van deze aankondigingen was er maar weinig concreet te zien van Avatar.
Next Generation Java developers
Een decennium geleden was Java nog jong en fris en waren de bezoekers van JavaOne dat ook. De gemiddelde leeftijd lag onderin de dertig of nog lager, T-shirt en spijkerbroek waren de normale uitdossing en lang haar meer regel dan uitzondering. Met het volwassen worden van het Java platform en de groei van de Java community lijken ook de JavaOne bezoekers met hun tijd te zijn meegegaan. JavaOne is nog steeds hipper dan het aanpalende en deels overlappende Oracle OpenWorld, maar het verschil is minder groot dan voorheen.
Bovenstaande is niet alleen goed of slecht: meer ervaring, meer kennis en hechte onderlinge relaties en contacten zijn de positieve uitleg van deze ontwikkeling. Daar staat tegenover dat verdere groei van Java enorm zou profiteren van een toestroom van jonge programmeurs die Java als hun vanzelfsprekende gereedschap beschouwen en ook de gemeenschap van vers bloed zouden voorzien. Een langere termijn ontwikkeling die hieraan zou kunnen bijdragen is de groeiende aandacht voor ‘Java for Kids’. In allerlei vormen en via diverse evenementen worden jongeren vanaf een jaar of 8 enthousiast gemaakt voor programmeren met OO en Java. Tijdens JavaOne werd in diverse sprankelende sessies verslag gedaan van dit soort activiteiten, en werd aan volle zalen ‘Java-veteranen’ uit de doeken gedaan hoe jongeren geïnteresseerd kunnen raken in Java. Deze Javanen hebben nu kinderen – en in het geval van één presentator zelfs kleinkinderen – om het enthousiasme op over te dragen.
Een grote factor daarin wordt gevormd door MineCraft. Dit is een multi-player game die over de hele wereld wordt gespeeld door kinderen vanaf pakweg 8 jaar. In dit spel kunnen spelers metalen opdelven, objecten verzamelen en constructies bouwen. MineCraft kan worden aangepast en uitgebreid – de heilige graal voor toegewijde spelers. En dat vereist programmeren in Java. Een grotere motivatie om Java te leren is voor deze doelgroep ondenkbaar. Lego Mindstorm biedt een vergelijkbare aanleiding om met Java aan de slag te gaan en ook fysieke apparaten als Arduino en Raspberry Pi kunnen voor wat oudere kinderen de entree vormen. YouTube en diverse blogs bieden complete workshops aan voor groepen kinderen. In Nederland worden onder de vlag Devoxx4Kids [4] sessies aangeboden voor kinderen van 10-14 jaar.
Er zijn ook diverse tools om de beginselen van programmeren laagdrempelig aan te bieden. Voorbeelden zijn Alice (Carnegie Mellon Institute en gesponsord door Oracle), Scratch (MIT), Greenfoot en BlueJ (beide University of Kent, gesponsord door Oracle). Deze tools zijn niet alleen geschikt voor kinderen: sommige kunnen ook voor programmeurs zonder ervaring met OO of Java een hulpmiddel zijn om de stap naar Java te zetten. Hoewel nog kleinschalig is dit een ontwikkeling die voor de lange termijn evolutie van Java wel eens van zeer groot belang zou kunnen blijken. Aanwas van de community gaat niet vanzelf en is wel cruciaal voor ons allemaal als Java-professionals.
Conclusie
JavaOne is als conferentie terug op het oude niveau. Het aantal bezoekers is dat echter nog niet. Er zijn geen officiële getallen vrijgegeven, maar onze inschatting is dat er ongeveer 6.000 JavaOne bezoekers waren. Een getal dat in de schaduw staat van grote zus Oracle OpenWorld met ruim 50.000 bezoekers. Een van de meer praktische oorzaken is dat er in de hele stad geen hotelbed voor een normale prijs te krijgen is. Het bezoeken van de conferentie is daarmee een kostbare aangelegenheid. Toch, in termen van value for money gesproken is de conferentie zeer de moeite waard. De content is over het algemeen van goed niveau, maar bovenal zijn de netwerkmogelijkheden dat. Iedereen met enige statuur in de Java wereld is hier en is over het algemeen even toegankelijk en aanspreekbaar. JavaOne blijft daarmee een conferentie waar je als Java ontwikkelaar een keer geweest moet zijn.
Referenties
[1] wiki.openjdk.java.net/display/OpenJFX/DukePad [2] jdk8.java.net/download.html [3] netbeans.org/community/releases/74/ [4] devoxx.com/display/4KIDSNL/Home