september/oktober 2013 nr. 3
MAGAZINE Onafhankelijk tijdschrift voor de Java-professional
Poets je code op met Sonar Features Arduino aansturen met Java cover.indd 1
Java upgraden in de enterprise
Software Craftsmanship 9/12/13 4:45 PM
Bert van den Belt en Huub Jansen, directeuren Java Ordina
Bij Ordina vinden we craftmanship belangrijk. We hebben een hekel aan slechte code, want onze passie is techniek zoals het hoort. Waarom ingewikkeld doen als het makkelijk kan? Vakmanschap definieert de echte professional en vakmanschap is waar het om draait. Ordina J-Tech is hĂŠt kenniscentrum voor Java-technologie in Nederland. Vakmanschap is onze drijfveer en met enthousiasme en passie actualiseren wij continu onze brede en diepgaande technologische kennis met de modernste ontwikkelingen in ons vakgebied. Dat geldt ook voor de nieuwste methoden, processen en werkwijzen. Dit alles doen we een in werkomgeving, waarbij het niet alleen om software gaat. Fun is voor ons net zo belangrijk. Wil jij dit ook ervaren? En wil je jouw vakmanschap met ons delen? Bekijk ons vacatureaanbod op werkenbijordina.nl
ICT. MAAR DAN VOOR MENSEN werkenbijordina.nl
VOORWOORD
De zomer voorbij De zomerperiode staat bekend om zijn relatieve werkrust, komkommernieuws en de zon hoog aan de hemel. Bekende tv-programma’s zijn van de buis, tijdschriften komen met een dubbeldik zomernummer en grote projecten staan op een lager pitje. Binnen de NLJUG is deze zomer vooral gewerkt om voorbereidingen te treffen voor de aankomende (drukke) herfstperiode. Als de eerste blaadjes namelijk gaan vallen, dan gaat het bij elke Javaan al kriebelen… De J-Fall komt eraan! Ook dit jaar belooft het weer een groots evenement te gaan worden met een breed scala aan onderwerpen en sprekers. Alle informatie voor de J-Fall is te vinden op onze site www.nljug.org Met het einde van de zomer komt er ook een einde aan het komkommernieuws. Java Magazine staat weer boordevol met artikelen en workshops, die gespitst zijn op de nieuwste ontwikkelingen binnen de Java wereld. Zo zal er in deze editie uitgebreid worden ingegaan op alle mogelijkheden van Sonar. Hoe verbeter je de kwaliteit van je code en hoe ziet het verloop van je codekwaliteit eruit. Java Magazine zet de basisfunctionaliteiten en de meer geavanceerde functionaliteiten voor je op een rij. Verder kunnen we vol trots melden dat er in deze editie een interview met Javaguru Adam Bien staat. Java Magazine sprak afgelopen juni met Adam na afloop van het MeetingPoint event van JPoint en vroeg hem naar zijn passie en visie op het programmeren. Het gehele interview kun je verder lezen. De NLJUG is een community die draait door en voor leden. Ben jij enthousiast geworden door het lezen van Java Magazine en wil je zelf ook graag je ervaringen en kennis delen met de rest van de community? Mail mij dan een voorstel voor een artikel, zodat we dit kunnen plaatsen in Java Magazine of op onze site. Hierbij wil ik trouwens graag een groot misverstand wegnemen. Je hoeft niet over literaire schrijverskunsten te beschikken of een spellingswonder te zijn om te schrijven in Java Magazine. Het gaat ons vooral om de kennis en ervaringen, die gedeeld worden. Het artikel zal namelijk geheel herschreven worden, zodat alle eventuele grammaticale fouten en kromme zinsconstructies eruit gehaald worden. Dus deel je kennis en kom met jouw artikel in Java Magazine! Ramon Wieleman Content manager Java Magazine
Colofon Java Magazine 03-2013 Content manager: Ramon Wieleman, ramon.wieleman@nljug.org Eindredactie: Lilian Krijt, Mark Gamble Auteurs: Gijs Mollema, Peter Doornbosch, Joop Lanting, Ben Ooms, Tim Prijn, Peter Hendriks, Johan Janssen, Christine Dirkse, Minze Tolsma, Pieter van der Meer, Bert Ertman, Robert Scholte Redactiecommissie: Nanne Baars, Eelco Meuter, Bert Jan Schrijver, Ben Ooms, Bert Ertman, Lucas Jellema, Tim Prijn Vormgeving: Jannemieke Duyzer, Jan Wesel Uitgever: Martin Smelt Traffic & Media order: Marco Verhoog Marketing: Ramon Wieleman Abonnementenadministratie: Tanja Ekel Drukkerij: Senefelder Misset, Doetinchem Advertenties: Richelle Bussenius E-mail: richelle.bussenius@nljug.org Telefoon: 023 752 39 22 Fax: 023 535 96 27
Java Magazine verschijnt 4 maal per jaar en is onderdeel van het lidmaatschap NLJUG en kost € 39,50 (België € 40,50) per jaar. Naast het Java Magazine krijgt u gratis toegang tot de vele NLJUG workshops en het J-Fall congres. Het NLJUG is lid van het wereldwijde netwerk van JAVA user groups. Voor meer informatie of wilt u lid worden, zie www.nljug.org. Een nieuw lidmaatschap wordt gestart met de eerst mogelijke editie voor een bepaalde duur. Het lidmaatschap zal na de eerste (betalings) periode stilzwijgend worden omgezet naar lidmaatschap van onbepaalde duur, tenzij u uiterlijk één maand voor afloop van het initiële lidmaatschap schriftelijk (per brief of mail) opzegt. Na de omzetting voor onbepaalde duur kan op ieder moment schriftelijk worden opgezegd per wettelijk voorgeschreven termijn van 3 maanden. Een lidmaatschap is alleen mogelijk in Nederland en België. U kunt mailen naar members@nljug.org of schrijven naar NLJUG BV, ledenadministratie, postbus 3389, 2001 DJ Haarlem. Op werkdagen kunt u bellen tussen 10 en 14 uur naar telefoonnummer 023–5364401. Verhuisberichten of bezorgklachten kunt u doorgeven via members@nljug.org (Klantenservice).
JAVA MAGAZINE | 03 2013
Voorwoord.indd 3
9/12/13 4:44 PM
Een nieuwe omgeving waarin je de ruimte krijgt om jezelf verder te ontwikkelen Durf jij de sprong te wagen? Werken bij Blue4IT betekent onderdeel uitmaken van een team van ervaren professionals die de passie voor Java met elkaar delen en de ambitie hebben om het beste uit zichzelf te halen.
Wil je meer weten over werken bij Blue4IT of wil je een keer bij ons op kantoor langskomen voor een oriënterend gesprek?
Als Java Developer werk je voor wisselende opdrachtgevers aan uitdagende en complexe projecten met de nieuwste technologieën, waardoor je jezelf steeds verder ontwikkelt.
Kijk op www.blue4it.nl voor meer informatie of neem contact op met:
Daarnaast word je door Blue4IT gestimuleerd en in de gelegenheid gesteld om jouw kennis van Java uit te breiden door het volgen van interne en externe cursussen, workshops, trainingen en seminars.
Michel van Dongen (directeur Blue4IT) T: 0172-782145 E: michel.van.dongen@blue4it.nl
De voordelen van lidmaatschap 9 september/oktober 2013 nr. 3
MAGAZINE Onafhankelijk tijdschrift voor de Java-professional
Poets je code op met Sonar Features Arduino aansturen met Java
Java upgraden in de enterprise
Software Craftsmanship
S SLECH,T50 3
€
Voor elke serieuze Java-ontwikkelaar of Java bedrijf is het een must om lid te worden van de NLJUG. Als je up-to-date wilt zijn en blijven is dit de manier om het te doen: word lid van de NLJUG op www.nljug.org. Het lidmaatschap kost € 39,50 (incl. 6% BTW)
• Gratis toegang tot J-Fall 2013 • Gratis toegang tot NLJUG University sessions • Gratis 4 maal per jaar het Java Magazine
» Ga naar: www.nljug.org Java werf half.indd 4
9/12/13 5:24 PM
INHOUDSOPGAVE
Thymeleaf
06
Styling is een onontkoombaar onderdeel van het web applicatie ontwikkelproces. Tijdens de start of gaandeweg een project komt dit altijd wel aan de orde. De lay-out voor een pagina aanmaken of aanpassen is in een werkende omgeving geen probleem. Indien er echter een lay-out gemaakt moet worden, terwijl er geen web applicatie aanwezig is, wordt het lastiger. Hoe en in welk formaat moet het dan aangeleverd worden, zodat het eenvoudig inpasbaar is?
Upgraden Java in de Enterprise Het is alweer twee jaar geleden dat de Java Standard Edition (SE) 7 uitgebracht is. Een release van het Java platform met interessante verbeteringen. Toch draaien veel bestaande systemen nog op Java SE 6. Upgraden van Java SE is in de praktijk vaak een uitdagende klus. Wat zijn de voordelen van upgraden, en nadelen van niet upgraden? Wat zijn risico’s en inspanning? Welke stakeholders zijn betrokken? Java Magazine zocht het uit en deelt de ervaringen die opgedaan zijn tijdens diverse grootschalige upgradetrajecten.
16
22 Sonar doorgelicht Code kwaliteit is erg belangrijk om succesvolle software op te leveren. Het is noodzakelijk dat ontwikkelaars zo snel mogelijk feedback krijgen op de code die ze schrijven. Sonar, een open platform voor het automatisch analyseren van code-kwaliteit, biedt niet alleen inzicht in de huidige kwaliteit, maar toont ook het verloop hiervan. Met behulp van Sonar kunnen ontwikkelaars goed zien wat de algehele kwaliteit van de applicatie is. In dit artikel worden zowel de basisfunctionaliteiten als de meer geavanceerde functionaliteiten van Sonar behandeld.
06
THYMELEAF Pagina templates
10
WORKSHOP Met Java een Arduino aansturen
15
COLUMN Waar? NIET WAAR!
16
ACTIEPLAN Upgraden Java in de Enterprise
22
WORKSHOP Sonar
26
INTERVIEW Adam Bien
28
BOEKREVIEW Scala for the impatient
29
LIBRARIES Libraries uitgelicht
30
AGILE Agile Architectuur toegepast
33
SOFTWARE CRAFTMANSHIP De toegevoegde waarde
36
BESTUURSCOLUMN Van het bestuur
38
TIPS & TRICKS Meer met Maven
SCHRIJVEN VOOR JAVA MAGAZINE? Ben je een enthousiast lid van NLJUG en zou je graag willen bijdragen aan Java Magazine? Of ben je werkzaam in de IT en zou je vanuit je functie graag je kennis willen delen met de NLJUG-community? Dat kan! Neem contact op met de redactie, leg uit op welk gebied je expertise ligt en over welk onderwerp je graag zou willen schrijven. Direct artikelen inleveren mag ook. Mail naar info@nljug.org en wij nemen zo spoedig mogelijk contact met je op.
JAVA MAGAZINE | 03 2013
Inhoud.indd 5
9/12/13 4:45 PM
06
Thymeleaf
Pagina templates voor zowel on- als offline gebruik
Styling is een onontkoombaar onderdeel van het web applicatie ontwikkelproces. Tijdens de start of gaandeweg een project komt dit altijd wel aan de orde. De layout voor een pagina aanmaken of aanpassen is in een werkende omgeving geen probleem. Indien er echter een layout gemaakt moet worden terwijl er geen web applicatie aanwezig is of buiten een werkende web applicatie (bijvoorbeeld door een designer) dan wordt het lastiger. De vraag die hierbij rijst is: hoe en in welk formaat moet het dan aangeleverd worden zodat het eenvoudig inpasbaar is?
Het Natural Templates concept Ook al wordt de layout in statische HTML of in een ander formaat aangeleverd, er zal altijd een vertaalslag nodig zijn om deze te integreren met bestaande web pagina’s. Deze vertaalslag is te voorkomen middels het Natural Template concept: templates die ongewijzigd zowel binnen een web applicatie als ook statisch correct door een browser getoond kunnen worden. Thymeleaf hanteert dit concept door middel van een template syntax die de document structuur intact houdt, waarbij de template een well-formed XML document blijft. Hiervoor wordt uitsluitend gebruik gemaakt van HTML attributen. Templates kunnen gebruikt worden als prototypen waarbij statische waarden getoond worden, en Thymeleaf zal deze run-time vervangen met live data. Thymeleaf voorziet daarmee in de volgende belangrijke punten: Geen conversie nodig van templates bij een layout update. Eenvoudige integratie met een web-applicatie, doordat logica eenvoudig is toe te voegen zonder de layout te breken. In dit artikel wordt aan de hand van code besproken hoe met Thymeleaf templates gemaakt kunnen worden, die zonder structurele aanpassingen zowel offline als binnen een web applicatie te gebruiken zijn. Daarnaast wordt er een voorbeeld gegeven hoe Thymleaf geïnstalleerd en geconfigureerd kan worden naast een ander web framework.
Onder de motorkap - een HTML 5 oriented template engine
Gijs Mollema is senior software developer bij iPROFS
Thymeleaf is een XML/XHTML(1.0 & 1.1)/ HTML5 template engine en is uitbreidbaar voor andere formaten. Het project is gestart in 2011 en brengt bijna iedere maand een nieuwe versie uit. Thymeleaf gebruikt een XML parser en een DOM processor voor de interpretatie van de templates. Standaard wordt HTML5 goed ondersteund, zolang de geschreven template een well-formed XML bestand is. Indien dit niet het geval is (bijvoorbeeld door integratie met legacy code), dan wordt de template eerst geconverteerd naar XML middels tag balancing. Hierbij worden fouten die tijdens het programmeren worden gemaakt gecorrigeerd, zoals het toevoegen van missende (parent) elementen en het verwijderen van ongeldige inline elementen. De Thymeleaf DTD moet gedefinieerd zijn in de template zodat alle custom HTML attributes beschikbaar worden. Doordat deze attributen beschikbaar worden is de template een well-formed XML. Zodra een template is geïnterpreteerd door de template engine, worden al deze custom attributen verwijderd en de DTD declaratie vervangen door de XHTML 1.0 Strict definitie.
Van HTML naar Thymleaf templates In dit artikel wordt een film catalogus demo gemaakt dat bestaat uit een lijst van films en de mogelijkheid om films toe te voegen en aan te passen. Momenteel is Spring MVC het enige web framework waarmee geïntegreerd kan worden. Uiteraard is het mogelijk om helemaal geen Spring te gebruiken. Het
JAVA MAGAZINE
06-09 Thymeleaf.indd 6
9/12/13 4:46 PM
thymeleaf
Figuur 1: Movie list (offline)
nadeel is dat koppeling tussen van de juiste controller en de bevraagde url dan geprogrammeerd moet worden. Vanwege de leesbaarheid van de code is daarom bij deze gekozen voor de SpringMVC integratie in combinatie met Spring. De demo applicatie is gebaseerd op Maven. Daarnaast is de Apache Tomcat als web server gebruikt. We beginnen met een HTML bestand dat een lijst van films gaat tonen. Deze gaan we tijdens de voorbeelden omzetten naar Thymeleaf templates. Dit bestand bevat lijst dat aan de hand van statische gegevens wordt gevuld. De code voor de voorbeelden kan je met git clonen (git clone https://github.com/gmolle ma/ThymeleafDemo.git), en daarna bekijken door een specifieke branch uit te checken (git checkout -b example1)
Om Thymeleaf de template te laten processen moeten een tweetal zaken doorgevoerd worden: Thymeleaf configuratie opnemen in de Spring configuratie. Integratie met Thymleaf binnen de pagina zelf. Voor de configuratie zijn een drietal zaken geconfigureerd (terug te vinden in springthymeleaf-config.xml) template resolver: definieert type templates die aanwezig zijn en waar deze te vinden zijn.
Example 1
Statische data Zodra je de inhoud van het list.html bestand (/WEB-INF/view/templates/pages/movie) bekijkt, zal je onder andere het volgende in de source zien: <img src=”../../../../images/logo_ offline.png”/> <h1>Home (offline)</h1>
Op dit moment is alleen de home pagina en de movie list pagina beschikbaar. Open ‘home.html’ met je browser en navigeer naar de movie list (zie figuur 1), de pagina die een lijst met films toont (sluit de pagina niet af, dit in verband met de volgende stap). Er wordt een lijst getoond van films op basis van statische data. Daarnaast is aan de titel en het logo de tekst offline toegevoegd (zie bovenstaande twee code regels), dat alleen getoond wordt als de pagina offline wordt geopend.
Example 2
Statisch versus dynamisch De volgende stap is de Thymleaf integratie om zo dynamische data te kunnen tonen.
t emplate engine: het hart van Thymeleaf die de template resolver gebruikt om te weten naar welke templates geluisterd moet worden. template view resolver: vertelt Thymeleaf uit welke context de templates gehaald moeten worden. In dit geval worden deze uit de servlet context gehaald. De integratie in de pagina is vrij eenvoudig. In de head van de html moet de Thymeleaf namespace worden opgenomen. Vervolgens kan de namespace als html attribuut gebruikt
JAVA magazine | 03 2013
06-09 Thymeleaf.indd 7
9/12/13 4:46 PM
08
worden op de html elementen om zo de dynamische data en functionaliteit toe te voegen. De twee regels code zijn nu als volgt geworden: <img th:src=”@{/images/logo.png}” src=”../../../../images/logo_offline. png”/> <h1 th:text=”#{title.home}”>Home (offline)</h1>
Thymleaf zal ervoor zorgen dat door middel van de th:src en th:text attributen de statische gegevens binnen de html tag worden overschreven. Open je browser en voer een refresh uit. De pagina is ongewijzigd en laat dezelfde statische gegevens zoals voorheen zien. Bouw de code met ‘mvn clean install’ Start tomcat, kopieer de war uit de target map naar de webapp map van een Tomcat installatie en open de volgende url in je browser: localhost:8080/ThymeleafDemo-1.0/ home.html De home pagina zal standaard geopend worden. Navigeer vervolgens naar de movie list (zie figuur 2). Nu wordt de dynamische data getoond. Als je nu figuur 1 en 2 vergelijkt zie je dat Thymeleaf de titel, logo en de data heeft vervangen.
Thymeleaf syntax Om de inhoud de syntax beter begrijpen volgt hier in het kort een beschrijving van de simpele expressies: Variable Expressions: ${...} -Tonen van variabelen Selection Variable Expressions: *{...} Zelfde als $ echter op geselecteerd object Message Expressions: #{...} - Externe resources voor teksten, context variabelen en utilities Link URL Expressions: @{...}
Voorbeeld van eerste twee expressies: <div th:object=”${movie}”> <p>Title: <span th:text=”${movie. title}”>Title</span>.</p> ... </div> <div> <p>Title: <span th:text=”*{title}” >Title</span>.</p> ... </div>
De message expressions maken het onder andere mogelijk om meertalige teksten op te slaan. In de voorbeeldcode is een default gedefinieerd (message.properties) en Nederlands (messages_nl.properties). Zodra de browser op Nederlands ingesteld staat zal het deze vertalingen gebruiken en in alle andere gevallen de default. Thymeleaf kent een aantal tegenhangers die de JSTL ook kent. Het Thymleaf th:each attribuut is bijvoorbeeld de tegenhanger van de JSTL tag c:forEach voor het itereren over een collectie van objecten.
Example 3
Template fragmentatie Thymeleaf ondersteunt template fragments. Hiermee kan je pagina onderdelen zoals header, footer, menu of pagina onderdelen die vaak gebruikt worden als een template fragment aanmaken. Vanuit de diverse pagina’s kan hier dan naar worden verwezen. In dit voorbeeld is de footer van de drie pagina’s apart getrokken naar een apart fragment. Deze is te vinden in de nieuwe fragments map binnen de folder templates.
Thymeleaf zal ervoor zorgen dat door middel van de th:src en th:text attributen de statische gegevens binnen de html tag worden overschreven.
Example 4
Forms & validatie In dit voorbeeld is een pagina opgenomen om een nieuwe film aan te maken of een bestaande film te bewerken. Onderaan de
Figuur 2: Movie list
JAVA magazine
06-09 Thymeleaf.indd 8
9/12/13 4:46 PM
thymeleaf
Figuur 3: Add new movie
pagina is een link toegevoegd om een nieuwe film op te voeren en elke titel in de lijst is aanklikbaar om deze vervolgens te kunnen aanpassen. In beide gevallen wordt er een nieuw scherm getoond, waarin de gegevens kunnen worden ingevuld ofwel aangepast. Zodra de gegevens worden opgeslagen worden er twee validatie slagen gedaan. Voordat de save methode wordt aangeroepen van de MovieNewController, zal de initDateBinder methode het ingevoerd datum formaat controleren aan de hand van de syntax die gedefinieerd is in de message resources. Vervolgens wordt in de save methode de validate methode van de NewMovieValidator aangeroepen om te controleren of de titel is ingevuld en er op z’n minst één genre is geselecteerd. Zie figuur 3 als voorbeeld van de validatie op het titel veld. De melding(en) worden getoond in het geel, en het veld waarom het gaat is voorzien van een rood kader. Middels de volgende code in de new.html pagina worden de errors getoond. <ul th:if=”${#fields.hasErrors(‘*’)}” class=”errorlist”> <li> th:each=”err : ${#fields. errors(‘*’)}” th:text ==”${err}” Input is incorrect</li> </ul>
Aan elk invoerveld is aan de th:class attribuut een controle toegevoegd of the opgenomen is binnen de errors. Zo ja, dan wordt het veld gemarkeerd.
de de /WEB-INF/view/jsp context. Alle Thymleaf html pagina’s blijven gezocht worden in de /WEB-INF/view/templates/pages context (zie de the Thymleaf configuratie). Er is een nieuwe jsp pagina toegevoegd aan de jsp folder onder WEB-INF. Deze kan geopend worden door op de Movie counter link te klikken. Daaropvolgend zal de MovieCounterController worden aangeroepen die deze jsp gebruikt als view. Zodra op deze pagina op return Home geklikt wordt, wordt de HomeController aangeroepen en zal deze de home pagina zal laden, waarna neemt de Thymleaf view resolver het weer overneemt. Nu is deze pagina geen rocket sience, maar dit is alleen om te laten zien dat beide engines naast elkaar kunnen draaien. De controllers maken gebruik van een hetzelfde sessie object om zo dezelfde lijst van films te kunnen gebruiken. Op deze manier is het mogelijk om Thymleaf templates te gebruiken, ook binnen een bestaand servlet gebaseerde web applicatie.
Bronnen
thymeleaf.org De Thymeleaf site bevat documentatie en duidelijke voorbeelden github.com/gmollema/ ThymeleafDemo - De demo source code
Advertentie
Example 5
Servlet engine in harmonie met de Thymeleaf engine Om de servlet engine en Thymeleaf naast elkaar te kunnen laten draaien, is de mvc configuratie aangepast. In deze configuratie is een view resolver opgenomen die jsps opzoekt in
Ben jij ook een Champions League speler
?
Kijk voor onze vacatures op pagina 20/21 van dit magazine.
JAVA magazine | 03 2013 03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1
06-09 Thymeleaf.indd 9
4/23/2013 5:24:44 PM
9/12/13 4:49 PM
10
Arduino aansturen met Java Een workshop
Ben Ooms is een gepassioneerde Java senior software engineer werkzaam bij Sogeti.
In dit artikel gaan we aan de hand van Java laten zien hoe je met het Arduino-platform kunt communiceren. De Arduino is een open source microcontroller prototype platform die is gebaseerd op flexibele, eenvoudig te gebruiken hard- en software. De Arduino is vooral gericht op eenieder die geïnteresseerd is in het ontwikkelen van interactieve objecten of omgevingen. Op de Arduino website kun je heel veel informatie vinden en is zowel de hardware als de software uitgebreid gedocumenteerd waardoor je snel aan de slag kunt en er is een levendig community forum, waar je terecht kunt voor al je vragen en ondersteuning. We geven u eerst een introductie tot het Ardiuno-platform, en daarna zullen we een Java-applicatie bouwen, waarmee we Jenkins-feeds kunnen inlezen en op basis van de build-informatie een stoplicht en een algemeen project-status - de bekende zonnetjes en wolkjes van Jenkins tegenhanger - aanstuurt. De Java-applicatie is op Swing gebaseerd en zal door middel van een USB verbinding serieel met een Arduino communiceren. De broncode is beschikbaar op bitbucket en te vinden op https://bitbucket.org/bendh/jenkinstoarduino/ .
De functionaliteit Het stoplicht is gemapped naar de volgende statussen: Groen: Laatste build was succesvol Geel: Alle andere statussen (Not build, Unstable en Aborted) Rood: Laatste build gefaald Naast het driekleurig stoplicht hebben we ook een RGBled. Hiermee wordt de score van het project aangeduid: Groen: 100% Geel: 75%-99% Paars: 50% Rood: 0-25% De hardware – Arduino De hardware van een Arduino is op basis van de Atmel AVR 8 bits Atmega-processor opgebouwd. Naast deze microchip is er een open source generieke printplaat ontwikkeld waardoor je erg eenvoudig hardware kan aan de printplaat kunt toevoegen. Er zijn talloze varianten van de Arduino, van een generieke prototype board tot mini boards die speciaal ontworpen zijn om bijvoorbeeld op textiel te monteren.
De software - Arduino IDE De software bestaat uit een bootloader en een programmeertaal die gebaseerd is op Wire en Processing. De syntax van de programmeertaal lijkt op c++. Om de Arduino te programmeren is er een IDE ontwikkeld die je op de Arduino site kan downloaden. Daarnaast kun je ook eclipse CDT gebruiken met de avr plugin, op mijn blog heb ik een artikel die de eclipse setup beschrijft (http://benooms.nl/?p=14). In dit artikel gebruiken we de Arduino IDE voor het gemak. De microchip pinnen zijn op alle Arduino printplaten op dezelfde manier bedraad en hebben eigen Arduino synoniemen die via de programmeertaal benaderbaar zijn. Als je wilt gaan starten met Arduino, let dan op welke type je koopt. Er zijn namelijk verschillende versies te koop. Het is - wanneer je voor de eerste keer begint met elektronica - erg eenvoudig om een bedradingsfoutje te maken en de chip daardoor onbruikbaar te maken. Tenzij je al electronica ervaring heb en een specifieke board wil hebben adviseer ik de Arduino Uno en dan wel de versie met de dip28 AVR chip. Deze versie heeft het voordeel dat je de microchip kan vervangen als deze defect is of wanneer je de geprogrammeerde chip standalone wilt gebruiken. Je kunt dan het board hergebruiken en een nieuwe chip plaatsen. In de afbeelding hieronder hebben we de microprocessor in het rood gearceerd (zie afbeelding 1). De Arduino IDE installeren en gebruiken De website van Arduino biedt eenvoudige en volledig gedocumenteerde informatie over de installatie. De handleiding vind je op http://arduino.cc/en/Guide/HomePage De installatiestappen zijn als volgt: Download en installeer de Arduino IDE Sluit je Arduino op je pc aan via een USB-kabel Installeer de USB-drivers die je terugvindt in de installatiefolder van de Arduino IDE (alleen voor Windows)
JAVA MAGAZINE
Arduino.indd 10
9/12/13 4:50 PM
Arduino aansturen met java
// Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13;
// the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); }
// the loop routine runs over and over again forever:
Afbeelding 1: ArduinoUno R3
electeer via het menu in Tools > Board jouw Arduino S Selecteer in Tools > Serial de com poort waar de Arduino op aangesloten zit (meestal is dit COM3 onder Windows) Sketch Een Arduino-programma wordt een sketch genoemd. De structuur van een sketch is eenvoudig en bestaat uit twee methoden, setup() en loop(). De setup() methode wordt eenmaal uitgevoerd wanneer de microprocessor start of wanneer deze gereset wordt. In dit codeblok zet je initialisatiecode zoals bijvoorbeeld de poortconfiguraties, seriële poort configuratie, enzovoort. De loop() methode is de methode waar het echte werk verricht wordt, de code in dit blok wordt eindeloos herhaald. Feitelijk is deze methode te vergelijke met een while(true) codeblok. Na de setup is het raadzaam om een bestaande werkende sketch te laden om te testen of de installatie, de seriële connectie en de Arduino zelf naar behoren werken. In de Arduino IDE zijn onder File > Examples > sketches te vinden die demo’s bevatten van verschillende features. Bijna alle Arduino’s hebben op poort 13 standaard een led aangesloten. Deze gaan we laten knipperen als zijnde het equivalent van de ‘hello world’ van de microcontrollers. Open hiervoor File > Examples > 1.Basics > Blink. Nadat de sketch is geladen, kun je deze uploaden naar je Arduino door op de upload knop te klikken. Als alles goed gaat zie je na een paar seconden een bericht ‘Upload succesfull’ en zie je op je Arduino een led knipperen. Gefeliciteerd, je hebt nu de ‘hello world’ onder de microcontrollers uitgevoerd!. De code We lopen even door de code van de Blink sketch. Voordat we een microcontroller kunnen gebruiken, moeten we aangeven welke functies de poorten moeten vervullen. Elke poort kan zowel voor input of output gebruikt worden. Voor de Blink sketch wordt in de setup poort 13 als output geïnitialiseerd waarna doormiddel van digitalWrite en een delay de poort hoog en laag gemaakt worden. Hoog is 5 Volt en laag 0 Volt, de gegeven delay is in milliseconden.
void loop() { digitalWrite(led, HIGH); // (HIGH is the voltage level) delay(1000); // digitalWrite(led, LOW); // by making the voltage LOW delay(1000); // }
turn the LED on wait for a second turn the LED off wait for a second
Jenkins status monitor Nu we u een kleine introductie hebben gegeven van de Blink sketch, bespreken we hier de sketch en de hardware die we voor dit project gaan gebruiken. De hardware setup is eenvoudig en bestaat uit de voeding van de Arduino naar de breadboard en het verbinden van de led’s via de voorschakelweerstanden naar de arduino poorten. We gebruiken hier de USB-voeding voor ons project. Dit kan op een veilige manier, omdat de hele schakeling ongeveer 100 mA gebruikt en we daardoor ver onder de 500 mA grens zitten. De voorschakelweerstanden zijn nodig omdat de led’s een spanning van maximaal 2 Volt verdragen en de arduino poorten 5 Volt leveren (zie afbeelding 2). De Sketch start met het initialiseren van een aantal variabelen. De laatste drie integer-waarden zijn de poorten die we gaan gebruiken voor het stoplicht en de projectstatus led. Voor de projectstatus led hebben we drie poorten nodig omdat we deze analoog gaan gebruiken om de kleuren te mixen die we willen hebben voor een bepaalde status. String command = “”; boolean commandIsReceived = false; // Prefix expected for all commands String commandMask = “jta”; // Commands whe expect to receive String REDCOMMAND = “R”; String YELLOWCOMMAND = “Y”; String GREENCOMMAND = “G”; String CHECKCOMMAND = “CHECK”; String STATUSCOMMAND = “STAT”;// with the value appended like STAT25 // Needed ports for the trafficlight int REDLIGHT = 5; int YELLOWLIGHT = 6; int GREENLIGHT = 7; // Needed ports for the RGB led int STATUSLIGHTR = 2; int STATUSLIGHTG = 3; int STATUSLIGHTB = 4; // For debug purposes String stat = “ status light: “;
In de setup zetten we de seriële verbinding op met een snelheid van 9600 baud op, reserveren we fysiek geheugen voor de command String en zetten we alle poorten die we gebruiken willen als output.
JAVA magazine | 03 2013
Arduino.indd 11
9/12/13 4:50 PM
12
void setup() { Serial.begin(9600); command.reserve(200); pinMode(REDLIGHT,OUTPUT); pinMode(YELLOWLIGHT,OUTPUT); pinMode(GREENLIGHT,OUTPUT); pinMode(STATUSLIGHTR,OUTPUT); pinMode(STATUSLIGHTG,OUTPUT); pinMode(STATUSLIGHTB,OUTPUT); }
Hierna zetten we de main loop op. Kort gezegd, als je een commando hebt, voer dan de methode checkCommand uit en print de output van checkCommand naar de seriële poort. Reset daarna command en de boolean commanIsReceived. De boolean commanIsReceived wordt door de seriele eventhandler gezet (de serialEvent() die later uitgelegd wordt) void loop() { if(commandIsReceived) { Serial.println(checkCommand()); command = “”; commandIsReceived = false; } }
CheckCommand controleert de ontvangen input. Als er fouten zijn worden deze geprint naar de seriële poort en een boolean false (cijfer 0 in arduino) teruggegeven. Wanneer de validatie geslaagd is, wordt het commando uitgevoerd. boolean checkCommand(){ String commandPart = command.substring(3); if(command.startsWith(commandMask)){ if (commandPart == REDCOMMAND){ setLight(REDLIGHT); return true; } else if (commandPart == YELLOWCOMMAND){ setLight(YELLOWLIGHT); return true; } else if (commandPart == GREENCOMMAND){ setLight(GREENLIGHT); return true; } else if (commandPart == CHECKCOMMAND) { checkStatus(); return true; } else if (commandPart. startsWith(STATUSCOMMAND)){ String percentString = commandPart.substring(4); char charBuffer[percentString.length()+1]; percentString.toCharArray(charBuffer,percen tString.length()+1); int value = atoi(charBuffer); setStatusLight(value); return true; } Serial.println(“command not reconized: “+commandPart); command = “”; return false; } Serial.println(“prefix not reconized in :”+command); command = “”; return false; }
Afbeelding 2: Schematische weergave
De commando’s worden in twee stappen uitgevoerd. In de eerste stap wordt het stoplicht gezet op basis van een meegegeven poort die aan moet worden gezet. void setLight(int light){ digitalWrite(REDLIGHT,LOW); digitalWrite(YELLOWLIGHT,LOW); digitalWrite(GREENLIGHT,LOW); switch(light){ case 5: digitalWrite(REDLIGHT,HIGH); break; case 6: digitalWrite(YELLOWLIGHT,HIGH); break; case 7: digitalWrite(GREENLIGHT,HIGH); break; } }
De poort die moet worden aangezet, moet worden ingesteld op ‘HIGH’ gezet en de overige stoplichtpoorten op ‘LOW’. Deze code kan 6 regels kleiner door direct de waarde 1 toe te wijzen aan de roodlicht poort, We moeten dan wel de technische ‘AVR’ poortnaam gebruiken. De mapping van de Arduino poortnamen die naar de AVR poortnamen lopen (zie afbeelding 3). Voor de leesbaarheid heb ik hier niet voor gekozen, maar stel dat we het scenario van het stoplicht op rood zetten, zouden herschrijven, dan zou het er als volgt uitzien. Eerst de normale code:
JAVA MAGAZINE
Arduino.indd 12
9/12/13 4:50 PM
ARDUINO AANSTUREN MET JAVA
case 2: digitalWrite(REDLIGHT,HIGH); digitalWrite(YELLOWLIGHT,LOW); digitalWrite(GREENLIGHT,LOW); break;
Die code zou dan herschreven kunnen worden in: case 2: PORTD = b00010000; break;
PORTD vind je in de mapping terug onder PD. In de volgende methode wordt de status led ingesteld door middel van PWM-waarden voor de drie RGB-poorten. PWM staat voor pulse width modulation. Door een waarde tussen de 0 en 255 te geven wordt de betreffende led verlicht. 0 betekent uit en 255 fel brandend. Doordat de drie leds in een behuizing zitten, kun je een gemixte kleur krijgen door verschillende waarden voor de leds op te geven. void setStatusLight(int percent){ // For debug purposes //String stat = “statusVal:”; //stat +=percent; if (percent > 0 && percent <= 25 ){ //Red analogWrite(STATUSLIGHTR,255); analogWrite(STATUSLIGHTG,0); analogWrite(STATUSLIGHTB,0); // For debug purposes //stat = “status light:red”; //Serial.println(stat); } else if (percent > 0 && percent <= 50){ // Purple analogWrite(STATUSLIGHTR,125); analogWrite(STATUSLIGHTG,0); analogWrite(STATUSLIGHTB,255); // For debug purposes //stat =”status light:purple”; //Serial.println(stat); }else if (percent > 0 && percent <= 75){ // Yellow analogWrite(STATUSLIGHTR,255); analogWrite(STATUSLIGHTG,255); analogWrite(STATUSLIGHTB,0); // For debug purposes // stat =”status light:yellow”; //Serial.println(stat); } else if(percent > 75 ) { // Green analogWrite(STATUSLIGHTR,0); analogWrite(STATUSLIGHTG,255); analogWrite(STATUSLIGHTB,0); // For debug purposes // stat =”status light:green”; //Serial.println(stat); } }
In de checkStatus()-methode worden de waarden gelezen die op basis van de commando’s ingesteld zijn voor de poorten, Hierdoor kun je zonder leds je programma controleren nadat je commando’s verzonden hebt door de commando CHECK te sturen naar de Arduino. Als je de CHECK commando stuurt zal de Arduino de toestand van het stoplicht naar de seriele poort wegschrijven. Alles wat we wegschrijven naar Serial.println wordt door de Arduino naar de seriele poort gestuurd en kunnen we
Afbeelding 3: Mapping van de Arduino poortnamen
op de pc afvangen. In eerste instantie lijkt het op het oog wat vreemd om zoveel print en println te zien, maar de reden hiervoor is dat Arduino slecht omgaat met het concateneren van Strings. Een regel zoals println(“een waarde”+digitalRead(REDLIGHT)) geeft onverwachte output omdat de String “een waarde” nog niet geïnitialiseerd is voordat de int waarde van digitalRead(REDLIGHT) toegevoegd wordt. void checkStatus(){ Serial.println(“debug status information”); String debugInfo = “Red:”; debugInfo += digitalRead(REDLIGHT); debugInfo += “ Orange:”; debugInfo += digitalRead(YELLOWLIGHT); debugInfo += “ green:”; debugInfo += digitalRead(GREENLIGHT); debugInfo += stat; Serial.println(debugInfo); }
VERBINDING Om verbinding te kunnen maken met Arduino en de andere besproken onderdelen in dit artikel, heb je de volgende materialen nodig: Hardware - Een Arduino - Een usb kabel - Een groene, een gele en een rode led - drie voorschakel weerstanden van 220 ohm - Een voorschakel weerstand van 270 ohm
- Een RGB led - Een breadboard - veroboard (optioneel) - Behuizing (optioneel) Alle deze materialen kun je bij Conrad.nl bestellen voor ongeveer 45 euro. Software - Je favoriete Java IDE - De Arduino IDE (te downloaden op: http://arduino.cc/en/Main/ Software)
JAVA MAGAZINE | 03 2013
Arduino.indd 13
9/12/13 4:51 PM
14
De laatste methode serialEvent() is een event handler die afgaat wanneer data ontvangen wordt via de seriele poort van de Arduino en zet de ontvangen data in de string command waarna de loop() methode de command String gebruikt om de leds aan te sturen. /* SerialEvent occurs whenever a new data comes in the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response. Multiple bytes of data may be available. */ void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); // add it to the inputString: if (inChar == ‹\n›) { // if the incoming character is a newline, set a flag // so the main loop can do something about it: commandIsReceived = true; return; } command += inChar; } }
Afbeelding 4
Het Java-gedeelte Het Java deel van het project bestaat uit een op Swing gebaseerde system tray applicatie die op basis van de geconfigureerde url en Arduino-instellingen de Jenkinsserver polt, en op basis van het Jenkins-project gegevens de Arduino aanstuurt. Voor de seriële communicatie gebruiken we de RXTX library. RXTX is een implementatie van de Sun CommAPI die het mogelijk maakt om met Java met een seriële poort te communiceren. De library is voor verschillende platformen te gebruiken, waaronder in ieder geval Windows, Linux en Mac OS X. Om de RXTX library te kunnen gebruiken moet in het classpath ook de rxtx.dll voor Windows aanwezig zijn, Zonder deze dll kan geen seriële communicatie plaatsvinden. De dll bevat de C code die de RXTX library via JNI calls aanroept. In onze applicatie vind je het gebruik van RXTX in de class SerialBridgeConnector. In deze class wordt een aantal methoden geboden die de beschikbare poorten weergeeft, de verbindingsstatus geven en data serieel kan lezen en schrijven. De beschikbare poorten gebruiken we in het Settings scherm voor de “Arduino COM port” Combobox. Deze lijst met poorten wordt vervolgens gevuld met actieve seriële poorten. In onze applicatie wordt alle data – die door de Arduino wordt verstuurd – in een label getoond onderin de “setting” tab. Met de ‘Test serial’ knop kun je dit vervolgens uittesten. Als je bijvoorbeeld jtaCHECK in het tekstvak invoert en daarna op ‘Test serial’ drukt, dan wordt het commando “jtaCHECK” naar de Arduino gestuurd. De Arduino ontvangt de data en voert de methode checkStatus() uit. De Arduino controleert de led-poorten en stuurt vervolgens de ingelezen poorten via Serial.println weer naar de pc. In onze applicatie wordt er een event afgevuurd doordat er data op
Afbeelding 5
de seriële poort aanwezig is, en wordt de ontvangen data getoond in een label. Dit is schematisch weergegeven in de volgende twee diagrammen (zie afbeelding 4 en 5). De JenkinsHandler class is de hulpklasse die verantwoordelijk is voor de communicatie richting het Jenkins project en gegevens uit de response vertaald naar een projectstatus die we is onze applicatie kunnen gebruiken. Doormiddel van SAX en XPath expressies wordt de data geëxtraheerd en verder verwerkt om de applicatieview en Arduino aan te sturen. In de MainFrame class is een inner class genaamd StatusUpdateTask. Deze class is een SwingWorker-implementatie die in een apparte Thread je Jenkins server polt, de Swing view op basis van de Jenkins gegevens ververst en de commando’s naar de Arduino stuurt. De StatusUpdateStask wordt afgevuurd door een Swing Timer die door de MainFrame gecontroleerd wordt.
Tot slot Ik hoop met dit simpele project een indruk gegeven te hebben hoe makkelijk seriële communicatie tussen een Java-applicatie en een Arduino te implementeren is. De verdere hardware-implementatie hangt volledig af van wat voor stoplicht je gaat gebruiken. Alle broncode voor dit project is te vinden op https://bitbucket.org/bendh/ jenkinstoarduino/. Het project is een Maven-project en bevat ook de Arduino sketch en hardware schema’s. De broncode leent zich er goed voor om als bootstrap te gebruiken voor een ander Java to Arduino project.
JAVA magazine
Arduino.indd 14
9/12/13 4:51 PM
Column
Waar? NIET WAAR! We leven in de 21e eeuw, bijgeloof is uitgebannen, geruchten ontzenuwd, niemand kan ons iets wijs maken ... WORD WAKKER! Het is niet anders dan 500 of 1000 jaar geleden: we geloven alles, vooral van “gezaghebbende” bronnen, “deskundigen” of personen met misplaatste autoriteit; zelfs de politici trappen er in. We controleren zelden een roddel; behalve wanneer het over ons zelf gaat uiteraard! Er zijn onnoemelijk veel zaken die niet waar zijn, maar die een ieder voor waar aanneemt, soms uit gemakzucht, soms door blindelings vertrouwen in ... , ja waarin eigenlijk. Ik heb er een paar voor u verzameld: Volgens Einstein is de lichtsnelheid de hoogst mogelijke. NIET WAAR: reeds in de 10e eeuw veronderstelde de Arabische geleerde Ibn Al-Haytham de lichtsnelheid eindig, het meten ervan bleek een probleem; pas Fizeau en Foucault slaagden erin. James Clerk Maxwell toonde aan dat licht een golfverschijnsel is en opperde dat de lichtsnelheid de hoogst mogelijke is en .... Hendrik Lorentz uit Arnhem bewees dit. Volgens Lorentz wordt een voorwerp dat de lichtsnelheid benadert oneindig traag, zwaar en dun (goed en slecht nieuws voor Star Trek fans). Albert Einstein was een leerling van Lorentz en bewees o.a. dat licht geen medium nodig heeft, dat de lichtsnelheid gelijk blijft voor bewegende systemen en dat materie kan overgaan in energie en omgekeerd. De grijze eekhoorn heeft in Engeland de rode verdreven. NIET WAAR: in 1872 haalde een edelman wat grijze eekhoorns naar Engeland: ze gingen allemaal dood. Herhaalde pogingen hadden matig succes. Echter in 1890 woedde er in Engeland een eekhoornplaag ...... een RODE (inheemse) eekhoornplaag. Er werd een wet aangenomen ‘ter uitroeiing van ... de RODE eekhoorn’. Pas in 1939 (!!!) ‘ontdekte’ men dat de rode eekhoorn nagenoeg verdwenen was en werden de rollen ‘omgekeerd’: de rode werd beschermd, de grijze vogelvrij. Op dat moment viel Hitler Polen binnen en waren er ‘even’ belangrijker dingen. Het zeilschip de Mary Celeste werd in 1872 onbemand aangetroffen. NIET WAAR: een geraffineerd geval van verzekeringsfraude, reeds in 1923 (!) opgelost door de Australische
journalist Keating, maar de films en documentaires blijven maar komen. De vrouw van kapitein van de Mary kwam door een ongeluk om het leven, waarna de kapitein overboord sprong. De resterende bemanning was geleend van een ander schip. Toen nu dit schip de Mary Celeste ontmoette stapte deze uitgeleende bemanning terug over en verklaarde daarna de Mary tot ‘gevonden onbemand zijnde’ voor de verzekeringspremie. Georg Friedrich Händel solliciteerde met Water Music aan het Engelse hof. NIET WAAR: Georg Ludwig, keurvorst van Hannover, verkreeg via zijn vrouw de Engelse troon en werd George I; hij ging in deeltijd in Londen wonen en nam zijn hofcomponinst (Händel) mee. Deze ging echter zodanig aan de ‘rol’ in Londen, dat ontslag dreigde. Het componeren van de Water Music was zijn laatste kans om zijn baan te behouden.
Joop Lanting, Amsterdam 1947. Gepensioneerd systeemprogrammeur, een der eersten in Europa met UNIX (1977), was onder meer werkzaam aan de Universiteit van Amsterdam, MultiHouse en Unisys.
Bill Gates bedacht Windows. NIET WAAR: Douglas Engelbart bedacht in 1960 WIMP (Windows, Icons, Menu’s en Pointer= de muis). Hij bouwde hardware en software uit werkelijk niets en demonstreerde in 1968 op een congres in Californië. De unanieme reactie was: “DIT IS VOOR IMBECIELEN”. Gefrustreerd droop hij af. Xerox (X-windows!, X11) pikte e.e.a. weer op maar de directie zag er geen handel in en alles verdween in het public domain. “Iemand” bij APPLE zag het wel zitten en de rest weet je. Helaas was Steve enige tijd een beetje ‘afwezig’ en juist in die tijd kreeg Microsoft een wat te ‘ruime’ licentie; hun uitstekende juristen wisten Windows als merknaam te registreren en ... Ik ontdekte de geschiedenis van Engelbart zo’n 10 jaar geleden. Sindsdien zijn vele artikelen en video’s van Internet verdwenen. Zou iemand bezwaar hebben tegen de intellectuele eigendommen van Douglas? Ach, hij is zojuist overleden, 88 jaar oud. ;JOOP!
JAVA magazine | 03 2013
Column Joop Lanting.indd 15
9/12/13 4:51 PM