+ All Categories
Home > Documents > SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe...

SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe...

Date post: 04-Sep-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
32
Nummer 118 september 2013 SDN Magazine verschijnt elk kwartaal en is een uitgave van Software Development Network www.sdn.nl IN DIT NUMMER O.A.: Windows services beschermen tegen Windows Shutdown < Integreer NFC in je Windows Phone-app < Overview of FireDAC < Big Data: de nieuwe manier van werken < SOFTWARE DEVELOPMENT NETWORK MAGAZINE 118 ISSN: 2211-6486
Transcript
Page 1: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

Nummer 118 september 2013 SDN Magazine verschijnt elk kwartaal en is een uitgave van Software Development Network

www.sdn.nl

IN DIT NUMMER O.A.:

Windows services beschermen tegen Windows Shutdown <Integreer NFC in je Windows Phone-app <

Overview of FireDAC <Big Data: de nieuwe manier van werken <

SOFTWARE DEVELOPMENT NETWORK

MAGAZINE

118

ISSN: 2211-6486

Page 2: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

with

93000employeesworking for

2500clientsin

94 countriesand

52 years of experience

software development holds no mysteries for us

with

30009

3000emplo

eesyemplo

orking fw

2500in

94

ororking f

2500clients

ountriesc

clients

and

52

xperiencears of ey

earsoftwelopmentvde

p

n

elopmentholds no

eriestsymor usf

op-quality softwers tCSC delivechnology serviction tormainf

t ideas, prs the beso harnesus te do amazing things. Find out morors. Wsect

e the we aro its clients. We tarop-quality softwe acrxperienc. Our eyompanes cechnology servic

om both the public and prives and solutions fractict ideas, prom.ct csc.e ae do amazing things. Find out mor

s leading independent orld’e the wtries enables s all indusose acr

e taom both the public and priv

Page 3: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

magazine voor software development 3

ColofonUitgave:Software Development NetworkEenentwintigste jaargangNo. 118 • september 2013

Bestuur van SDN:Remi Caron, voorzitterRob Suurland, penningmeesterMarcel Meijer, secretaris

Redactie:Marcel Meijer([email protected])

Aan dit magazine werd meegewerkt door:Roel Hans Bethlehem, Bob Swart, Maartenvan Stam, Arjen Bos, Alexander Meijers,Remi Caron, Marcel Meijer en natuurlijk alleauteurs!

Listings:Zie de website www.sdn.nl voor eventuelesource files uit deze uitgave.

Contact:Software Development NetworkPostbus 506, 7100 AM WinterswijkTel. (085) 21 01 310Fax (085) 21 01 311E-mail: [email protected]

Vormgeving en opmaak:Reclamebureau Bij Dageraad, Winterswijkwww.bijdageraad.nl

©2013 Alle rechten voorbehouden. Niets uitdeze uitgave mag worden overgenomen opwelke wijze dan ook zonder voorafgaandeschriftelijke toestemming van SDN. Tenzijanders vermeld zijn artikelen op persoonlijketitel geschreven en verwoorden zij dus nietnoodzakelijkerwijs de mening van het be-stuur en/of de redactie. Alle in dit magazinegenoemde handelsmerken zijn het eigen-dom van hun respectievelijke eigenaren.

AdverteerdersCSC 2Achmea 9Microsoft 14Microsoft 20Macaw 32

Adverteren?Informatie over adverteren en de adverten-tietarieven kunt u vinden op www.sdn.nl onder de rubriek Magazine.

voorwoordBeste SDN magazine lezer,

Tjonge, werd het toch nog een mooie zomer. Ik hoop dat je voldoende van het mooieweer genoten hebt in de tuin, op het balkon, op het strand of welke plek dan ook.Heb je het vorige magazine 117 daar lekker zitten lezen? Heb je nog mooie nieuweideeën opgedaan en de behoefte gekregen om zelf een artikel te schrijven? Schroomdan niet om [email protected] te mailen en jouw artikel te publiceren.

Maar ogenschijnlijk wordt de herfst net zo mooi. Eindelijk zijn de release data vanWindows 8.1 en Xbox One bekend. In menig agenda staan naast de data van onzeSDN events, ook de datum van 17 oktober omcirkelt voor de Windows 8.1 updateen de datum van 21 november voor de Xbox One release. Helaas moeten wij in Nederland wachten tot volgend jaar. Waren we net blij dat Microsoft niet dezelfdefout maakte als met Windows Phone door ons mooie kleine landje niet als primairlaunch land te benoemen, doen ze het toch weer. Er was toch iets met een ezel eneen steen of zo?

Hebben jullie al de Leap motion bekeken? En als je hem bekeken hebt, heb je almooie nieuwe toepassingen bedacht? Denk je eens in wat je allemaal niet kunt metdat vernuftig stukje techniek. Laat het ons weten, dan kunnen we daarover een artikel schrijven. Of heb je met de komst van Windows 8.1 ook iets nieuws bedachtvoor een app? Een van de apps die standaard meegeleverd wordt, heeft een hands -free achtige (Kinect-achtige) oplossing. Denk je eens in hoeveel gave dingen je daarmee kunt.

Volgend jaar schijnt Google glas beschikbaar te komen voor de consumenten. Ik benheel benieuwd. Toepassingen met dergelijke apparaten heb ik in elk geval hele visioenen voor. Wat dat niet allemaal mogelijk maakt. Ook ben ik heel benieuwd ofMicrosoft nog met iets dergelijk op de proppen komt. Of met een horloge zoals dieer al wel zijn voor Android en iOS devices. Ik weet niet of de winter koud gaat worden, er liggen nog heel veel ijzers in het vuur.

Dit magazine is in elk geval gevuld met een artikel over Big Data, wat is en wat hebje eraan. Maar ook Delphi is weer met een artikel over iOS en Remote data en CaryJensen over FireDAC. Hassan gaat dieper in op testing in Visual Studio en het web.Rick een nieuwe auteur aan ons firmament, heeft een mooi artikel over WindowsServices en Shut downs. Sander hebben we weten te strikken voor een artikel overWindows Phone en NFC, hoe dat te gebruiken en in te zetten. Dan is er nog eenstukje over Leap Motion en een stukje over Windows Azure vanuit Visual Studio. En met de columns van Sander en Michiel zijn we dan weer compleet. Sander heeftweer een scherpe column over Agile en Michiel doet datzelfde over Data en de opslag ervan.

Ik wens jullie veel leesplezier en laat de ideeën voor artikelen maar komen. De avonden worden weer langer, dus er meer tijd om te schrijven.

Groeten,Marcel •

Page 4: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

Inhoud03 VoorwoordMarcel Meijer

04 Inhoudsopgave

04 Agenda

05 BigData:de nieuwe manier van werken

Alex Arts

10 Delphi XE4 iOS Apps en Remote Data Bob Swart

15 Overview of FireDAC, Delphi's New Data Access Component Framework

Cary Jensen

18 Testing in VS2012.2 & VS2013 Preview op de web-based test case management

Hassan Fadili

21 Agile doesn’t deal with xSander Hoogendoorn

22 Windows Services beschermen tegen Windows shut down

Rick Smolders

26 Integreer NFC in je Windows Phone-app

Sander van de Velde

30 Afleren wat je geleerd hebt Michiel van Otegem

• zaterdag 7 september Delphi Event van Barnsten/PascalGG/Embarcadero

• vrijdag 20 september SDN event in Zeist

• donderdag 17 oktober Windows 8.1 update beschikbaar

• vrijdag 18 oktober Delphi Seminar in Helmond Brandevoort

• medio november SDE+

• vrijdag 15 november SDN Magazine 119

• donderdag 21 november Launch XBox One

Agenda 2013

Page 5: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DATABASES Alex Arts

BigData: de nieuwe manier van werkenBusiness Intelligence is de manier om rapporten te creëren voor een organisatie en er voor tezorgen dat iedereen de resultaten snel kan inzien. Dan is het ook eenvoudiger om conclusieste trekken. De IT afdeling zorgt dan ook niet meer voor vertragingen als heel veel mensen in eenorganisatie zeer specifieke rapportages willen opvragen. Maar wat gebeurt er als de data waardeze rapportages op gebaseerd zijn, uit meerdere GB of zelfs PT bestaan? Als we met zoveeldata om moeten gaan, is er een systeem nodig dat resultaten snel en accuraat kan weergeven.BigData is de term die aan dit proces is gegeven en iedereen is ermee bezig; Microsoft, Google,Oracle en vele anderen die zich allemaal proberen te definiëren in dit veld. In dit artikel zullen wedieper in gaan op de vraag wat BigData is en hoe een organisatie het kan gebruiken voor huneigen voordeel.

De oude tegenover de nieuwe manier van BI zakendoenVroeger was alles beter, zegt iedereen altijd. Vroeger was er nog nietzoveel data, in ieder geval had niemand de tools om de hoeveelheiddata dat werd gebruikt te analyseren. Analyse van IIS gegevens bijvoorbeeld was altijd al gewenst, maar erwaren te weinig echte tools om dit ook in een beperkte tijd te analy-seren. Voorspellingen en analyses van consumenten gedragingen zijnvandaag de dag ook zeer gewild aangezien bedrijven daar veel geldmee kunnen verdienen. Business Intelligence is het gebruiken van voorlezen geoptimaliseerde data die door gebruikers zelf gerapporteerdkan worden. Zeer specialistisch en zonder tussenkomst van IT afde-lingen, dus met een goede levertijd. Dit is de ‘oude’ manier van zakendoen. De ‘nieuwe’ manier gaat ongeveer het zelfde alleen is dedata een tien-, honderdtal maal groter en heb je dus andere toolsnodig om accuraat data te kunnen presenteren op een manier die vooriedereen duidelijk is. Dit geld ook voor real-time wijzigingen en updatesop de data; wijzigingen moeten natuurlijk meteen verwerkt worden.

Wat is BigData eigenlijk?De definitieVroeger stelden we vragen in de trend van: - Wat gebeurde er? - Waarom gebeurde dat?

BigData is zoals gezegd data, veel en veel meer data. Het gaat om devier V’s: - Volume, - Velocity, - Variety en - Variability. (Er zitten maar 3 V’s in de Gartner definitie, maar als we logisch doordenken kunnen we nog veel meer V’s ontdekken.)

Met deze vier V’s kunnen we ons dan de volgende vragen stellen: - Wat zal er gebeuren?- Waarom is dit niet gebeurd?- Wanneer gebeurt het volgende in de reeks?

- Wat zal het volgende zijn in de reeks? (voorspellingen)- Wat gebeurt er eigenlijk, welke analyses kunnen we maken?- Hoe kan ik de data interpreteren met betrekking tot semantisch context zodat anderen dezelfde interpretatie kunnen geven?

Met BigData kunnen we deze vragen stellen over Petabytes of zelfsHexabytes aan data. Datalimieten zijn dan niet meer een bottleneck ofplafond waar we tegen aan lopen. Vooral met de cloud is dit eenvou-dig te bewerkstelligen, data is daar immers ongelimiteerd.

We spreken over BigData als we meer dan ruwweg 500GB verbrui-ken/gebruiken. We spreken ook van BigData als het volume van dedata onze menselijke interpretatie (ver) te boven gaat. BigData is heelcomplex vanwege de omvang die analyses van BI oplossingen onsopleveren. Het is moeilijk om BigData te gebruiken met de meeste re-lationele database management systemen, we hebben meer paral-lelle software op honderden, zelfs duizenden servers nodig. Het isnatuurlijk per organisatie afhankelijk wat BigData zal zijn, sommigenzien dit al bij enige honderden Gigabytes, anderen pas bij honderdenTerabytes.

Fig. 1: bytes

magazine voor software development 5

Page 6: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DATABASES

De term BigData wordt vaak gebruikt voor de kunst en wetenschapvan het analyseren van enorme hoeveelheden informatie om patronenop te sporen, inzichten te krijgen in data en antwoorden op complexevragen te krijgen en te voorspellen. Ruwe data is op de een of anderemanier immuun voor sociale vooroordelen, waardoor analyses uitge-voerd kunnen worden op een massa-niveau en zo de groep-geba-seerde discriminatie te vermijden. Toch wordt BigData vaak ingezetvoor precies dit doel -om individuen in groepen te scheiden- vanwegehet vermogen om groepsgedragingen te onderscheiden.

Keuzes die we kunnen makenWe kunnen verschillende aanbieders kiezen als organisatie, het is welbelangrijk om de goede keuze te maken om te zorgen dat alle datagoed kan worden ingezet. HDInsight kan een goede keuze zijn, maarAmazon of Google hebben ook goede alternatieven. Het is daarombelangrijk om te kijken welke oplossing het beste is voor een specifiekprobleem. In de volgende paragraaf zullen de verschillen worden uitgelegd.

Als het dan zo eenvoudig is om alleen de juiste provider te kiezen,waarom is dan niet iedereen al overgestapt op BigData? Er zijn eenaantal belangrijke kenmerken die men in gedachten moet houden:• Kwantiteit - hoeveel is te veel?• Formaat - kunnen we al deze data wel aan?• Waarde - wie / welke tools kunnen we gebruiken om waarde uit dedata te halen

• Privacy - niet alle data is te vinden in het eigen land, kijk ook naarbuiten.

Veel landen, organisaties hebben veel ruwe data publiekelijk beschik-baar. Hoe kunnen we dat gebruiken en hoe kunnen we ervoor zorgendat de data niet terug te herleiden is naar individuen? Veel BigDataproviders doen hun best om er voor te zorgen dat privacy gewaar-borgd is. Het probleem is dat de BigData privacy veel verder gaar dande standaard her-identificatie risico’s. Gegevens kunnen verkocht wor-den of anderen kunnen dezelfde dataset gebruiken en de ruwe datavoor andere doeleinden gebruiken, denk aan advertenties gebaseerdop de medische geschiedenis. Deze kenmerken zijn grote vraagstuk-ken die men zich af moet vragen voordat men BigData kan imple-menteren in de organisatie. Let ook op, want zulke persoonlijkeBigData datasets zijn zeer gewild bij hackers en leakers. WikiLeaksheeft hier een hand in gehad met een paar grote BigData lekken.

VoorbeeldenWanneer we denken aan BigData, denken we aan organisaties metveel analyses op data zoals de handel waar analyses worden gebruiktvoor klantgedrag. Andere analyses in organisaties kunnen zijn bestel-lingen in de productie, medische gegevens in de zorg en het bank-wezen zijn, maar denk ook aan Search (Google, Bing) en sociale media(facebook, Twitter).- Een van de nieuwe toepassingen in de wetenschap is de ontdekkingvan de Higgs boson; dit is een resultaat van het grootste grid-com-puting project ooit; CERN gebruikte het Hadoop Distributed File System om alle data onder controle te houden.- Er is ook veel gepraat over gepersonaliseerde medicatie waarbij medicijnen en therapieën zo individueel gericht werken dat het lijktalsof ze van de patiënts eigen DNA gemaakt zijn. Dit is fundamenteelafhankelijk van persoonlijke identificatie op een cellulair en genetischniveau dat het een hoog risico met zich mee brengt op het gebiedvan gebruik en veiligheid.- Een bekend voorbeeld in de handel is de ‘Feedback Economie’waarin we de transactienummers en gedragen bijhouden om te kijken hoe klanten winkelen en de strategieën daarop aanpassen.

Welke smaken in BigData hebben we?Windows Azure HDInsight – Google - AmazonHadoop on Azure van Microsoft is een welbekende toepassing binnenWindows Azure; dit is nu vernoemd naar HDInsight en is onderdeelvan het Windows Azure abonnement. Met HDInsight kunnen we dataanalyseren en nieuwe inzichten krijgen door middel van de kracht vanhet onderliggende Apache Hadoop systeem.

Als we kijken naar de grote drie, een korte vergelijking:- Google heeft met mySQL de laagste kosten van de drie en de minste RDBMS functionaliteit,

- SQL Azure heeft de hoogste kosten, maar de meeste RDBMS functionaliteit,

- AWS RDS heeft de kosten tussen Google en Microsoft in, maar isbruikbaar voor SQL Server, mySQL, Oracle, e.d.

Tabel 1: Verschillende databases op de AWS, Google en Microsoftplatformen

In 2004 werd door Google een artikel gepubliceerd genaamd MapReduce dat een parallel programmeermodel en de bijbehorendeuitvoering beschreef dat enorme hoeveelheden gegevens kon verwerken. Met MapReduce worden query’s gesplitst, verdeeld overparallelle nodes en parallel verwerkt (de Map stap). De resultaten wor-den vervolgens verzameld en geleverd (de Reduce stap). De imple-mentatie van MapReduce werd gepubliceerd als een Apache opensource project genaamd Hadoop. Hadoop ondersteunt het GoogleFile System (GFS) wat een gegevens intensief distributie model ondereen vrije licentie geeft zodat duizenden nodes en petabytes aan dataeenvoudig verwerkt kunnen worden. Deze tools en dit model makenons natuurlijk niet immuun voor bugs en verkeerde interpretaties. Werken met Hadoop is anders dan werken met .NET voor de Microsoft ontwikkelaars of andere bekende programmeertalen. Hetvereist een ander soort denken.

Fig. 2: Hadoop

Hadoop bestaat onder meer uit de volgende onderdelen:• MapReduce• Map (query’s verwerking)• Reduce (verzameling en levering van resultaten)• Pig (ETL - Java)• Dit is een high-level data-flow taal en executie framework voor parallelle verwerking gebouwd op Hadoop Core.

MAGAZINE

6

Page 7: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DATABASES

• Hive (HQL Query taal)• HBase tabellen: een Bigtable-gestructureerd opslagsysteem voorHadoop HDFS.

• HCatalog is een tabel en opslag management service voor data.• HDFS is het Hadoop Distributed File System en is ontworpen ombetrouwbaar zeer grote bestanden via machines in grote clusters opte slaan en geïnspireerd op de GoogleFileSystem.

Om met dit framework te kunnen werken, hebben we allerlei connec-toren die we kunnen gebruiken. Er is een Oracle Loader voor Hadoopom met Oracle databases samen te werken. Er is een SQL ServerConnector voor Hadoop om met SQL Server databases samen tewerken. We hebben ook een Hadoop connector voor Excel zodatmensen ook rapporten en analyses kunnen creëren en met de datakunnen spelen.

NoSQLHadoop is gebaseerd op NoSQL, maar wat is NoSQL eigenlijk?NoSQL heeft zeker raakvlakken met Hadoop, maar is toch anders.Een NoSQL database heeft een mechanisme voor opslag en distri-butie van data dat geen vast gestructureerd model gebruikt, wat an-ders is dan relationele databases waar alle data strak bij elkaargehouden wordt. JOIN-operaties worden gewoonlijk vermeden. Hetresultaat is horizontale schaling en hogere beschikbaarheid. NoSQLdatabases zijn geoptimaliseerd voor opvragen van data en hebbenweinig andere functionaliteit dan key-value opslag. Het voordeel dateen relationeel model niet nodig is, is dat de schaalbaarheid en deperformance vele malen beter zijn dan een relationele database wan-neer gewerkt wordt met grote hoeveelheden data en een relationeelmodel niet nodig is. De data kan gestructureerd zijn, maar NoSQLwordt specifiek gebruikt voor opvragen en opslag van grote hoeveel-heden data en niet zozeer het onderscheiden van relaties in de datazelf.

Fig. 3: NoSQL variaties

Omdat er zoveel verschillende aanbieders en verschillende soortenzijn, is een keuze niet snel gemaakt. Column Databases gebruikenwide, sparse column sets en is schema-light. Voorbeelden zijn BigTable, GAE HR DS en Google AppEngine. We hebben ook documentdatabase zoals MongoDB en CouchDB en Graph databases zoalsneo4J en FreeBase (Google), de keuze is enorm.Sociale media is een populaire bron voor analyses en er is zeker eenhoop informatie om te worden ontgonnen:- facebook is een prominent gebruiker van Hadoop, ze gebruikenmeer dan 100 PB aan data en het data center groeit met een halvePB per dag.

- Van Twitter is het niet bekend, maar zij zullen ook wel vele GB aandata per dag opslaan aangezien tweets populair zijn en er nu ook fo-to’s worden gebruikt.

Deze bedrijven hebben dus baat bij een goed en snel opslagsysteem

om ervoor te zorgen dat de gebruikers eenvoudig toegang hebbentot de informatie.

Waarom zouden we dit willen?Meer data op een snellere manier beschikbaar voor iedereen in de organisatie wanneer ze maar willen op de manier dat ze dat willen.Geen IT afdeling meer die de stroom van aanvragen niet meer aankan,dus geen vertragingen meer. Dit klinkt als een ideale wereld, maar hetis dichterbij dan we denken. Met BigData kunnen we dit aan op eengoede structurele manier die ook nog eens veilig is. Alles hangt af vanwelk systeem een organisatie kiest, maar de infrastructuur is er klaarvoor.

DevelopersSQL Server 2012BigData bestaat uit vier onderdelen wanneer we het over MicrosoftSQL Server hebben: Verzamelen met SSIS, opslaan met SSDB, opvragen met SSAS en visualiseren met SSRS. Microsoft doet dit metde filosofie ‘Beyond Relational’ in versie 2012 van SQL Server; eenrelationele database dat gebruikt maakt van Columnstore index enXML data types. SSAS maakt gebruik van BISM modellen zodat weoptimaal gebruik kunnen maken van BigData. Andere producten diewe kunnen gebruiken zijn StreamInsight en SQL Azure al naar gelangde wensen van de organisatie.

Verschil tussen traditioneel RDBMS en HadoopEr zijn meer dan 120+ NoSQL aanbieders met verschillende aanbie-dingen, iedereen probeert zich te differentiëren. Je houdt volledigecontrole of je kunt een klein deel uitbesteden zoals het geval is met decloud. Aanbieders zijn er zoals VMWare, Cloudera, Cassandra, MongoDB.

Fig 4: Keuzes, keuzes, keuzes

Wanneer we van een RDBMS spreken, praten we over relationele opslag van data zodat mensen het ook kunnen gebruiken, of gestructureerde dataopslag. De bekendste voorbeelden van RDBMSsystemen zijn Oracle en Microsoft SQL Server.Voorbeelden van typesdatabases zijn massive parallel-processing (MPP) databases, search-based applicaties, data-mining grids, distributed file systems, distri-buted databases, cloud based infrastructure (applicaties, opslag encomputing resources) en het Internet. Sommige MPP relationele databases hebben de mogelijkheid om met Petabytes aan data tewerken. Wat zeker goed werkt is het laden, monitoren, back-up enoptimaliseren van grote datasets in een RDBMS.Wanneer je BigData gebruikt, is gedeelde opslag zoals NAS of SAN,niet werkbaar aangezien dat een bottleneck gaat vormen met betrek-king tot snelheid tot de data, complexiteit en kosten. Wat beter is, isDAS of Direct-attached storage wat een SSD (Solid State Drive) kanzijn of een SATA disc wat parallelle nodes aanstuurt. BigData gebrui-kers willen een goede performance, infrastructuur en lage kosten.

magazine voor software development 7

Page 8: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DATABASES

Door deze kwaliteiten is een real-time of bijna-real-time toegang totde data een van de belangrijkste mogelijkheden, latency is een vijanddie vermeden dient te worden. Data dat in geheugen wordt gehou-den is heel goed in tegenstelling tot data die opgeslagen is op de disc.

ConclusieBigData is nog steeds nieuw voor de meeste bedrijven, maar datagroeit gestaag. Er zijn manieren en tools nodig om waarde uit data tehalen en analyses te maken. BI is een heel goede stap in de richtingvan zelf selfservice rapportages, maar dat zorgt er niet voor dat Peta-bytes of zelfs Hexabytes aan data goed en snel geanalyseerd kunnenworden. Natuurlijk zijn er organisaties die dit nu zeer goed voor eigengewin gebruiken, zoals de Amerikaanse FBI. De FBI verzamelt veelgegevens van Amerikanen en de rest van de wereld en hebben ookveel sneller hun analyses klaar vanwege de tools en de goede hard-ware die we tegenwoordig tot onze beschikking hebben. BigData is,simpel gezegd, extreem veel data en tegenwoordig hebben we porgramma’s en systemen die ons daarmee kunnen helpen. In dit artikel is een uitzet gedaan van de verschillende aanbieders, wat BigData is en wat we ermee kunnen doen. •

Alex Arts

Alex Arts is a MCT within Avanade,a collaboration between Accentureand Microsoft focusing on Microsofttechnologies for enterprise custo-mers. Alex is delivering technicaland professional training in the SQL Server, .NET Framework and

Windows Azure fields. In his spare time, he likes to travel and viewthe sceneries, specifically architecture.

Resourceshttp://www.windowsazure.com/en-us/manage/services/hdinsight/ http://www.cloudera.com/content/cloudera/en/why-cloudera/hadoop-and-big-data.htmlhttp://www.microsoft.com/en-us/sqlazurelabs/labs/dataexplorer.aspx

Als sinds de eerste computer maken we gebruik van toetsen-borden. Oké, de allereerste computers werden bedient met scha-kelaars. Maar al snel daarna komen toetsenborden en dat ding isdan ook niet meer weg te denken bij een computer. Als de grafi-sche user interfaces haar intrede doet, komt er een nieuw feno-meen om de hoek kijken. Door ene Douglas Engelbert wordt demuis bedacht. De goede man is op 88 jarige leeftijd in 2013 over-leden. Ook dat ding is sinds dien niet meer weg te denken uitonze dagelijks gebruik.

Microsoft had al vroeg samen met hardware leveranciers laptops diebediend konden worden met een pen. De pen plaatste je dan niet verweg van het scherm, maar op het scherm in de buurt van waar jewilde dat iets gebeurde. Uiteindelijk zijn er tablets gekomen die ditconcept verder uitwerkte en tot een hype verheven hebben. Een penwas toen niet meer echt nodig. Ander groot nadeel van de muis, hettoetsenbord en pen/touch computing is, het gebruiken op plaatsenwaar hygiëne een grote rol speelt. Touch schermen kunnen slechttegen olie en bijtende stoffen, muizen en toetsenbord zijn verzamelaarsvan bacteriën etc. Plaatsen zoals ziekenhuizen hebben daar last van.Groot was ook de verrassing toen Microsoft in 2010 kwam met de Ki-nect (project Natal). Dit apparaat gaf het gamen en heel andere di-mensie. Met zijn drie camera’s en de bijbehorende software kondengames op een nog meer natuurlijke wijze gebruikt worden. Niet langdaarna kon de Kinect ook op een gewone PC aangesloten wordenen daar gebruikt worden. Wij hebben bij Prodware tools ontwikkeldom Kinect te gebruiken in combinatie met ERP systemen.

Nadeel in het begin wasde precisie van het ding.Hij was alleen in staat omeen heel persoon (Skelet)

te zien en het was erg lastig om heel gedetailleerd te zijn. Inmiddels isde SDK zo verfijnd, dat de persoon ook zittend gedetecteerd wordt ende zuiverheid is beter is geworden.Het is dan ook niet zo vreemd datheel veel nieuwe manieren worden bedacht om de computer te be-dienen. Zo zijn er oplossingen waarmee je de computer/Game consolemet spraak kunt bedienen, met je hele lijf of alleen met de touch. Delaatste nieuwe aanwinst aan dit pallet van mogelijkheden is Leap

motion. Dit kleine apparaatje leg je voor je en met je handen er bovenkun je dingen op het scherm bewegen. Het bevat een aantal infra roodsensoren, die samen een heel gebied kunnen bestrijken. Dit gebied isniet beperkt tot de bovenkant van het ding, maar ook een stuk aan devoorkant en aan de achterkant. Tot een hoogte van meer dan 20 centimeter kan hij bijvoorbeeld vingers detecteren.

Standaard wordt er een Visualizer meegeleverd, waarmee je je Leapmotion kunt testen en uitproberen. Hier (http://www.youtube.com/watch?v=_d6KuiuteIA&feature=player_embedded) zie je hoe e.e.a.werkt.Er is een hele market aanwezig, waarin verschillende aanbie-ders van games, applicaties en tools hun producten voor de Leap mo-tion verzameld worden en beschikbaar gesteld worden aan deconsumenten en gebruikers. En het gaat niet om paar titels of slappeaftreksels, het gerenommeerde Cut the Rope is aanwezig en nog heelveel meer leuke spullen.

De aanwezig van de store betekend ook nog iets anders. Er is dusook een SDK beschikbaar om zelf tegen de Leap motion aan te programmeren. En ja ook vanuit C#. •

Leap motion

MAGAZINE

8

Page 9: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

Afgelopen zomer was Achmea’s Alex Thissen een week lang te gast bij het Windows Communication Foundation team op Microsofts hoofdkantoor in het Amerikaanse Redmond. “Er zijn op de hele wereld maar zes bedrijven die daarvoor werden uitgenodigd, dus ik beschouw het wel als een eer dat Achmea deel uitmaakt van dit selecte groepje. Microsoft luistert echt naar Achmea, ze beschouwen ons als een bedrijf dat voorop wil lopen. We spraken bijvoorbeeld over Microsofts onder-steuning van IBM Websphere MQ, waarvoor wij andere communicatie-patronen mogelijk wilden maken. Maar ook de koppeling tussen Sharepoint en SAP was onderwerp van gesprek.”Microsoft-topman Scott Guthrie, alias ‘Scott Gu’, was onlangs te gast op de Achmea-burelen. Thissen: “Ja, dat zijn inspirerende sessies. In mijn vakgebied heeft hij de status van een popster, dus je begrijpt dat het geweldig sparren is met zo’n man.”

Mep je fitBij de ontwikkeling van Visual Studio Team System (bestaande uit ontwikkelomgeving Visual Studio

2010 en de ‘Application Lifecycle Management omgeving’ Team Foundation Server 2010) was Achmea in een vroeg stadium betrokken, vertelt Thissen. “We hebben ideeën en suggesties aan-geleverd en Microsoft gewezen op bugs en verbeterpunten, zoals bijvoorbeeld bij het berekenen van de burnrate van code. Dat is nuttig voor ons én nuttig voor Microsoft.”Voor Achmea is Visual Studio Team System belangrijk bij het ontwik kelingen van software aan de voorkant, zoals webappli-caties en mobiele applicaties, en voor integratie-oplossingen met behulp van webservices. “Voor Achmea wordt het internet steeds belangrijker, niet alleen om schades te melden of verzekeringen af te sluiten, maar ook voor allerlei zaken op het gebied van preventie. Zo hebben we in opdracht van Zilveren Kruis Achmea de game ‘Mep je fit’ ontwikkeld voor Micro-softs ‘computertafel’ Surface. Ook tijdens de Olympische Winter-spelen hadden we in het Holland Heineken House een gezondheids-installatie staan; bezoekers konden

daarop onder andere hun bloeddruk en body mass index meten en sportieve prestaties vergelijken met die van topsporters.”

AgileDaarnaast draagt de Microsoft-software bij aan de toenemende vraag naar transparantie en voorspel-baarheid, vindt Thissen. “Team Foundation Server houdt alle stappen in het ontwikkelproces bij, vast-gelegd in hiërarchische workitems. Zo bieden wij onze klanten – de mensen in de business van Achmea – optimaal inzicht in het proces.”Last but not least is Thissen tevreden met MSF Agile, het processjabloon dat Visual Studio Team System voert. “Dat betekent dat we snel en flexibel kunnen bouwen, in korte iteraties met de klant. Dat is precies wat we nodig hebben, want Achmea wil razendsnel kunnen inspelen op nieuwe ontwikkelingen die zich voordoen in de markt.”

Alex Thissen: “Microsoft luistert echt naar Achmea.”

Foto

: Han

s B

arte

n

Page 10: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI Bob Swart

Remote DataIn dit artikel wil ik het echter hebben over iets waar nog iets mindervaak over wordt geschreven, maar waar ik het tijdens de afgelopenSDN Event over gehad heb: het gebruik van "remote" data op je iOSdevice. Dus niet lokale data, maar juist data of gegevens uit een database die ergens anders staat. Zodat je ook met de buitenwereldkunt praten, of zinvolle externe data altijd bij de hand hebt (als je eenof andere internet verbinding hebt - via 3G of WiFi liefst).

Remote AgendaAls voorbeeld wil ik mijn Remote Agenda app nabouwen - de iOS appwaarmee ik de afspraken in mijn agenda kan inzien, en kan aanpas-sen indien nodig. Inclusief de mogelijkheid om tijdelijk "offline" te wer-ken (als ik in het vliegtuig zit bijvoorbeeld). Om het voorbeeldeenvoudig te houden, beschrijf ik hier een iets versimpelde versie vande toepassing, waarbij de database uit één tabel bestaat met tweevelden: een datum veld, en een omschrijving veld. Het datum veld ismeteen primary key, en we kunnen er vanuit gaan dat voor de komende jaren er al een record bestaat met dit betreffende datum veld(met een paar regels code kun je natuurlijk voor een gegeven jaar evenalle 365 of 366 records toevoegen met de nieuwe datum en (nog) legeomschrijving).Normaal gesproken zal één tekst veld voor de omschrijving wat weinig zijn voor een agenda, maar voor de eenvoud zal het voldoenom de principes te demonstreren.

CREATE TABLE [Agenda](

[Datum] [datetime] NOT NULL,

[Omschrijving] [nvarchar](256) NULL

DataSnap ServerGebruikmakend van Delphi XE4 Enterprise kunnen we nu een DataSnap ISAPI Server maken. Doe File | New - Other, kies voor deDataSnap WebBroker Application, en in de eerste pagina van de Wizard die volgt is de ISAPI dynamic link library de keuze die we hebben willen.

Omdat ik mijn agenda niet door iedereen wil laten aanpassen (lezen iseen ander verhaal, maar ook daar laat ik liever een beperkte groeptoe), zijn zowel de Authentication als the Authorizations options gewenst. Ook de Server Methods Class is nodig, maar sample methods voegen weinig toe, dus die skip ik deze keer.

Als voorvader class van de server method class wil ik graag eenTDSServerModule, omdat daar het IAppServer interface door geïmplementeerd is, zodat we straks ApplyUpdates kunnen aanroepen om eventuele wijzigingen in de agenda (gemaakt door deiOS client) door te sturen naar de DataSnap server en daarmee mijnagenda database zelf.

Delphi XE4 (Update #1 is inmiddels beschikbaar) biedt ons als grootste nieuwe feature de mogelijkheid om iOS apps te maken. En deze keer zonder de FPC compiler, maar met denieuwe Delphi NextGen compiler (zie het artikel in het vorige nummer van SDN Magazine waarinik beschrijf hoe o.a. de string handling in deze NextGen compiler toch wel iets anders is dan wegewend zijn).

Er zijn inmiddels al verschillende demos, artikelen, videos en andere publicaties geweest waarinde gebruikelijke "Hello, World" toepassingen gemaakt zijn in iOS, en soms gaat het al iets verder en zijn het beste leuke apps met native controls en een goede look-and-feel (op basisvan de FireMonkey styles ziet het er echt uit als een iOS 6 toepassing, alhoewel we straks weleen nieuwe style nodig hebben als iOS 7 echt uit is)...

Delphi XE4 iOS Appsen Remote Data

MAGAZINE

10

Page 11: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI

Het resulterende project sla ik op als DataSnapAgendaServer.

Web ModuleTeneinde te voorkomen dat iedereen mijn agenda zomaar kan inzien(of erger: kan wijzigen), gaan we nu de beveiliging inbouwen. Dat gaataan de hand van een tweetal events van de DSAuthenticationMana-ger op de web module in de WebModuleUnit.pas file. In de OnUse-rAuthenticate kunnen we checken of iemand wel bij de toepassingmag, door de User en Password te vergelijken met een database, endaar optioneel ook meteen de relevante "rollen" voor die persoon tebepalen.

procedure TWebModule1.DSAuthenticationManager1UserAuthenti-

cate(

Sender: TObject; const Protocol, Context, User, Password:

string;

var valid: Boolean; UserRoles: TStrings);

begin

valid := (User = Password);

if User = 'Bob' then UserRoles.Add('admin')

else

UserRoles.Add('guest');

end;

In de OnUserAuthorize kunnen we op basis van de rol van de huidigegebruiker, en de AuthenticationRoles van de functie die we willen aan-roepen, bepalen of dit wel of niet mag. Ik gebruik hierbij de pessimis-tische (of veilige) benadering: je mag niks, tenzij expliciet is verteld datje het wel mag.

procedure TWebModule1.DSAuthenticationManager1UserAuthorize(

Sender: TObject; EventObject: TDSAuthorizeEventObject;

var valid: Boolean);

var

UserRole: String;

begin

valid := True;

if Assigned(EventObject.AuthorizedRoles) then

begin

valid := False;

for UserRole in EventObject.UserRoles do

valid := valid or

(EventObject.AuthorizedRoles.IndexOf(UserRole) >=

0);

end;

end;

De enige uitzondering is de situatie waarbij er niemand in de lijst metAuthorizedRoles zit; in dat geval mag iedereen de functie uitvoeren.

Om te zorgen dat we straks de aanroep naar ApplyUpdates alleenkunnen uitvoeren vanuit de "admin" rol, moeten we de Roles propertyvan de TDSAuthenticationManager invullen, en aangeven dat we voorde AS_APplyUpdates method als Authorized role "admin" hebben, alsvolgt:

Server MethodsTijd om naar de ServerMethodsUnit te gaan, en de daadwerkelijkeServer Methods te implementeren, of - zoals in dit geval - een TData-SetProvider met mijn agenda gegevens te exporteren. Omdat mijnagenda in een SQL Server database staat, gebruik ik in dit geval eenTADOConnection en TADODataSet component om de data op tehalen, en een TDataSetProvider (met de naam dspAgenda) om dedata vanuit de DataSnap Server door te geven naar de DataSnapClients.

magazine voor software development 11

Page 12: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI

Tot zover is het een DataSnap Server zoals ik die vaker heb gemaakten gedeployed, maar Delphi XE4 biedt nu de mogelijkheid om er eenechte iOS client bij te maken.

DataSnap iOS ClientMet Delphi XE4 kunnen we een nieuwe FireMonkey Mobile applicationmaken, waarbij we meteen de keuze hebben uit een achttal templa-tes. In ons geval hoef ik maar één schermpje te hebben, met daarineen listview met de agenda items, dus de Header Footer template isgoed genoeg.Het project dat hiermee gegenereerd wordt sta ik op onder de naamAgendaClient. Als eerste stap moeten we vervolgens een TSQLConnection op de iOS form zetten, en een verbinding maken met deDataSnap Server.

object SQLConnection1: TSQLConnection

DriverName = 'DataSnap'

LoginPrompt = False

Params.Strings = (

'DriverUnit=Data.DBXDataSnap'

'HostName=www.bobswart.nl'

'Port=80'

'CommunicationProtocol=http'

'DatasnapContext=datasnap/'

'DriverAssemblyLoader=Borland.Data.TDBXClientDriverLoa-

der,Borland' +

'.Data.DbxClientDriver,Version=18.0.0.0,Culture=neu-

tral,PublicKey' +

'Token=91d62ebb5b0d1b1b'

'Filters={}'

'URLPath=/cgi-bin/DataSnapAgendaServer.dll')

end

Vervolgens een TDSProviderConnection die niet alleen met deTSQLConnection verbonden is, maar ook de ServerClassName aangeeft (meestal iets als TServerMethods1).

object DSProviderConnection1: TDSProviderConnection

ServerClassName = 'TServerMethods1'

Connected = True

SQLConnection = SQLConnection1

end

Tot slot is aan TClientDataSet component nodig die als RemoteServernaar de TDSProviderConnection component wijst, en dan als waardevan de ProviderName property kan kiezen uit de lijst van alle TData-SetProvider componenten die door de DataSnap Server worden geëxporteerd. Als het goed is, is dat in ieder geval de dspAgenda:

object ClientDataSet1: TClientDataSet

ProviderName = 'dspAgenda'

RemoteServer = DSProviderConnection1

end

Het ziet er dan tijdens design-time als volgt uit:

Dit is in principe voldoende, alleen is het belangrijk te zorgen dat deTClientDataSet en TSQLConnection componenten NIET verbondenzijn met de DataSnap Server op het moment dat we de toepassinggaan compileren. Als bij het opstarten van de iOS app namelijk iets misgaat (er is geen internet verbinding bijvoorbeeld), dan krijg je een fout-melding (een exception), maar die is niet zichtbaar in het splash screenop het iOS device. En nog erger: een exception tijdens het opstartenzal leiden tot het afsluiten van de toepassing. Dus je ziet het splashscreen even opkomen (of de splash image liever gezegd), en daarnaverdwijnt de app weer. Dat is natuurlijk niet de bedoeling...

Om de verbinding tijdens runtime te maken, kunnen we een speed-button rechtsboven in de toolbar zetten. Een gewone speedbuttonziet er natuurlijk niet (mooi) uit, maar met behulp van de StyleLookupproperty kunnen we er een leuke button van maken, zoals de refreshtoolbuttonbordered stijl, waardoor het op een refresh buttonlijkt, met een refresh pijltje; ideaal om de verbinding op te zetten (of dedata te refreshen).

Als implementatie schrijf ik dan de volgende code:

MAGAZINE

12

Page 13: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI

procedure THeaderFooterForm.SpeedButton1Click(Sender: TOb-

ject);

begin

(Sender as TSpeedButton).Enabled := False;

try

ClientDataSet1.Close;

try

SQLConnection1.Open;

ClientDataSet1.Open;

except

end;

finally

SQLConnection1.Close;

(Sender as TSpeedButton).Enabled := True;

end;

end;

In de except-clause kunnen we een melding geven dat er iets mis isgegaan, maar daar ga ik de volgende keer verder op in.

Wat we verder nodig hebben is een user interface element om deagenda neer te zetten. En dan geen listbox, maar een meer nativecontrol, zoals een TListView. Vervolgens kunnen we met Visual Live-Bindings de twee velden van de TClientDataSet (datum en omschrij-ving) koppelen aan de twee visuele items van de TListView: deitemHeader.Text (voor de Datum) en de item.Text (voor de Omschrij-ving).

In het laatste screenshot zien we live data tijdens design-time, omdatde TClientDataSet actief was ten behoeve van de Visual LiveBindingsDesigner. Maar zoals eerder gezegd, zowel de TClientDataSet als deTSQLConnection moeten niet actief zijn voor je het project gaat compileren en deployen op je iOS device (of de simulator).

Het resultaat is een iOS app die een leeg scherm laat zien bij het op-starten, maar na een druk op de refesn button een verbinding maaktmet mijn DataSnap Agenda Server, en dan de inhoud van mijn agendaophaalt en in de TListView laat zien.

Het is nu een kleine kunst om in een detail pagina meer details van deagenda te laten zien, eventuele fouten af te handelen, of zelfs data tijdelijk op te slaan oo de iPhone of iPad om er offline mee te kunnenwerken. In een volgend artikel zal ik hier dieper op ingaan. Wie niet totdie tijd wil of kan wachten, kan altijd even contact opnemen voor eenkleine sessie of uitleg hoe vergelijkbare apps en oplossingen gereali-seerd kunnen worden. •

magazine voor software development 13

Bob Swart

Bob Swart is werkzaam in de ITsinds 1983 en heeft daarbij eenvoorliefde voor (Turbo) Pascal enDelphi. Bob spreekt regelmatig op(internationale) conferenties overDelphi en heeft honderden artikelengeschreven, alsmede zijn eigen Delphi cursusmateriaal voor Delphitrainingen en workshops. Behalve

voor het geven van trainingen, is Bob ook beschikbaar voor consultancy, coaching, ontwerp- en bouwwerkzaamheden, of an-dere ondersteuning op het gebied van software ontwikkeling metDelphi – voor zowel Win32 als .NET. Sinds de zomer van 2007 isBob ook reseller van CodeGear producten zoals Delphi en RADStudio. Bob Swart Training & Consultancy is gevestigd in Helmond Brandevoort, en beschikt over een eigen trainingsruimtevan ruim 42 vierkante meter, inclusief een testlab voor alle moge-lijke toepassingen. De voorliefde van Bob voor Pascal en Delphiheeft hij ook tot uiting laten komen in de namen van zijn kinderenErik Mark Pascal en Natasha Louise Delphine.

Page 14: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

� � � � � � � � � �

h

Mijn innovatieve geest denkt in Windows Azure. Windows Azure is het ontwikkelplatform in de cloud dat developers vrij baan geeft in hun denken.

Bouw en draai applicaties in de cloud. Lanceer applicaties in minuten, in plaats van uren. Programmeer

in meerdere talen en technologieën, zoals .NET, PHP en Java. Begin vandaag nog met innoveren.

2QJHKLQGHUG�GRRU�UHGXQGDQWLH��EDQGEUHHGWH�RI�GH�EHSHUNLQJHQ�YDQ�XZ�VHUYHUFRQÀJXUDWLH��

Dat is Cloud Power.

Start vandaag nog met Windows Azure.

Probeer* Windows Azure gratis. Ga naar microsoft.nl/azure

h

� � � � � � � � � �

h

� � � � � � � � � �

Download de gratis app op http://gettag.mobi

� � � � � � � � � �

h

� � � � � � � � � �

h

* Voor het uitproberen zijn creditcardgegevens nodig. Voor gebruik boven het introductieniveau betaalt u het standaardtarief.

Page 15: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI

Anywhere, Sybase Advantage Database Server, and Firebird relational database servers (and a MS Access driver for that local fileserver database). It also provides an ODBC driver, which means thatyou can attach to virtually any database. For example, if you are stillusing the BDE with Paradox of dBase tables (and I understand thatthere are legitimate situations where this is necessary), you will behappy to learn that the Paradox and dBase ODBC drivers that shipwith Windows seem to work well with the FireDAC ODBC driver.This extensive support for databases is nice, but what makes it evenmore remarkable is that FireDAC provides this support while providingeven more support for the TDataSet interface than did the BDE. Forexample, all TDataSets are editable and support cached updates.Converting from the BDE to FireDAC might just be one of the easiestconversions you could possibly make.

Cross-Platform SupportThe BDE was exclusively a Windows solution, as was dbGo (Delphi'sTDataSets for ActiveX Data Objects). And while dbExpress is availa-ble for all of Delphi's supported platforms (including iOS), FireDACdoes this with the ease of use that was the hallmark of the BDE.

FireDAC is Written in DelphiFireDAC is written in Delphi, and comes with complete source code.I really don't have anything more to say about this, as this benefit is obvious.

A Better In-Memory DataSetThe ClientDataSet is an important tool for working with data in memory. Unfortunately, it was written in C and contains some very oldcode. ClientDataSets also start to show some performance problemswhen handling large amounts of data (in the hundreds of thousandsof records).FireDAC includes its own version of an in-memory table, called ADMemTable. ADMemTable significantly out-performs ClientDataSeton a number of measures, and it is also written entirely in Delphi. Likewith other FireDAC TDataSets, Delphi ships with this source code.

Overview of FireDAC, Delphi's New Data AccessComponent Framework

This state of affairs led many developers to seek alternative solutionsin the form of third-party TDataSets, and AnyDAC was one of the leading solutions. While some may morn, with some justification, theloss of a first-rate third-party vendor, by adding FireDAC to its portfolio, Embarcadero has solidified its status as a first-rate databasetool out-of-the-box (albeit in an Enterprise or higher SKU, though FireDAC can be added to Delphi Professional for an additional cost).

In this article I am going to take a high-level view of FireDAC, and indoing so I hope to answer two specific questions that you might be asking yourself. The first is should you move from your current data access framework to FireDAC (assuming you are not already usingAnyDAC)? The second question, assuming that the answer to the firstis Yes, is how soon should you begin your transition.

Overview of FireDACI will answer the first question right off. FireDAC is a feature rich dataaccess framework, and you are going to want to add at least some ofits features to your applications. The real question is how soon will youmake the move. Yes, I know, changing how you access your data-base is not something that you will normally take lightly. It will requireyou to perform the conversion followed by testing to ensure that youapplications continue to work as designed.However, I believe that once you learn what FireDAC can do you willwant its capabilities in your applications. The following sections outlinesome of the features you are likely to want most.

A Complete TDataSet ImplementationThe TDataSet interface, with its simultaneous support for both navigational and set-based operations, has been in Delphi since day1, but the BDE is no longer an acceptable solution given its supportonly for notoriously fragile local file server databases. What FireDACdoes is provide a straightforward implementation of the TDataSet interface, with support for almost any database imaginable.FireDAC provides drivers for InterBase, ORACLE, Microsoft SQL Server, IBM DB2, SQLite, MySQL, PostgreSQL, Sybase SQL

Cary Jensen

Delphi has always been a great development tool for building database applications, but thingsjust got a lot better. Earlier this year Embarcadero announced that it had acquired DA-Soft, thepublisher of AnyDAC. In addition, AnyDAC architect Dmitry Arefiev is staying on to bring hissubstantial talents to the Delphi team.This is very good news, as the state of Delphi's out-of-the-box data access capabilities hasbeen shaky for some time. The Borland Database Engine (BDE) has been deprecated for manyyears now and dbExpress has failed to achieve its full potential. Even worse, dbExpress wasnever a good option for migrating BDE application, due it its more complicated architecture andreliance on in-memory datasets.

magazine voor software development 15

Page 16: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

component), ADScript permits you to write SQL scripts against anydatabase. Like Dynamic SQL, one of the main benefits of ADScript isthat your application can more easily support multiple databases froma common code base. Even if you only need to support one data-base, ADScript allows you to write SQL scripts even against databa-ses that do not natively support that feature.

Local SQL QueriesHere I have saved one of the best for last. For years people have beenasking me if the ClientDataSet supports SQL statements. They do not,but I understand why there is confusion. You can assign a SQL state-ment to a ClientDataSet's CommandText property. When you openthe ClientDataSet, that SQL statement is passes to a DataSetProvider,which in turn assigns the SQL statement to its associated DataSet.(This setup requires that the DataSetProvider's DataSet supports que-ries, and that the poAllowCommandText flag of the Options propertyof the DataSetProvider is present). However, the ClientDataSet is notexecuting the query. This is merely a pass-through mechanism, andthe SQL is executed by the underlying database, not the ClientData-Set.

With FireDAC, you can write SQL queries against any DataSet, andthose queries are executed locally. This feature is called Local SQL,and it employs the SQLite SQL engine. In the simplest application, Local SQL permits you to execute a queryagainst a single DataSet. That query can be a SELECT query, an INSERT query, or an UPDATE query, or any query using syntax sup-ported by SQLite.

On the other hand, Local SQL queries can also include joins and sub-queries. This permits you to do some rather remarkable things. Forexample, you can use Local SQL to create joins based on DataSetsconnected to completely different databases. For example, Local SQLpermits you to create a heterogeneous query between an ORACLEtable and a MS SQL Server table, or between two different ORACLEdatabases. But you are not limited to just two DataSets. It is comple-tely feasible to create a queries that joins an ADStoredProc executedagainst InterBase, an ADQuery connected to an MS Access table, aSQLDataSet (dbExpress) connected to an IBM DB2 database, and aClientDataSet whose data was loaded from an XML file.

The power of Local SQL is astounding, and anyone with a good graspof SQL can easily imagine a whole new world of possibilities. I suspectthat this feature alone will be enough to motivate a lot of developersto include FireDAC capabilities in their applications.

Getting Started and Future ConsiderationsSo, this returns me back to the second question I hoped to addressin this article: How soon should you begin your transition? The reallygood news is that you can start, in increments, just as soon as you install FireDAC (or have installed a version of Delphi in which FireDACis part of the installation).Initially, you may want to continue using your existing data access framework for general data access, and use FireDAC for Local SQLagainst those components. You may also want to consider using FireDAC components as your principle data access components innew development. As you become more familiar with FireDAC youmight then be able to justify replacing the existing data access components in your legacy applications.

I want to close by acknowledging that you should expect changes toFireDAC over the next few Delphi versions. For instance, it is prettyobvious that the names of the FireDAC components must change.The AD prefix in all FireDAC components obviously refers to AnyDAC.Expect the prefix to change to FD, or something that implies FireDAC.

DELPHI

I wouldn't throw out my ClientDataSet's just yet, however. The ADMemTable is great, but there is still some room for improvement.The ClientDataSet makes it very easy to open local files containingClientDataSet data. The same operation with an ADMemTable is morecomplicated.

I believe that ADMemTable will eventually replace the ClientDataSet. If that does happen, I hope that the Delphi team makes an effort tocompletely synchronize ADMemTable interface with the ClientData-Set, permitting us to simply replace each ClientDataSet with an ADMemTable. Maybe I'm being too simplistic, or even unreasonable,since an ADMemTable doesn't rely on a DataSetProvider. Nonethe-less, greater consistency is needed, and will be welcome.

Cached Updates in all TDataSetsThe Borland Database Engine initially supported cached updates inthe Table and Query components, but that support broke in Delphi 6(about the time ClientDataSet was added to the Professional editionof Delphi). FireDAC returns this support, permitting you to cache mul-tiple updates in any TDataSet, permitting you to batch your updatesunder a common transaction.

This support for cached updates may actually reduce the need for in-memory datasets. The upside of this is that you can use any Fire-DAC dataset to create batch operations, and reserve the use of in-memory datasets for those operations that really need them.

Dynamic SQLFireDAC includes a SQL command pre-processor that enables you towrite flexible SQL statements that are modified prior to their execu-tion. In addition to normal SQL statements, Dynamic SQL allows youto include special escape sequence that permit you to define variables,conditional execution, macro expansion, and function calls.

Using variable substitution you can embed variables in your SQL state-ments, even in those places where traditional SQL parameters are notallowed. These variables are replaced with actual data prior to the execution of the SQL. Conditional execution permits you to include several alternatives ofSQL syntax specific to different database servers. At runtime, the pre-processor will select the correct syntax based on the server towhich your application is connected.

Macro expansion permits you to include special escape sequencesthat automatically insert syntax-correct SQL, again based on the server you are using. Finally, the pre-processor supports a large number of function calls that you can embed in your SQL.Taken together, the pre-processor permits you to write more flexibleSQL, including the ability to easily supports multiple database backends from a single executable.

SQL Scripts for Any DatabaseSome, but not all, database servers support SQL scripts. A SQL scriptis text that includes two or more SQL statements. Of those serversthat do support SQL scripts, some of those servers permit you to include multiple SELECT clauses, and execution of the script returnsone result set for each SELECT statement.FireDAC includes an ADScript component that permits you to use SQLscripts against any database. For those databases that support SQLscripts, ADScript uses the built-in facilities of the database. For thosedatabases that do not, ADScript submits each SQL statement separately, returning a separate result set for any SELECT statementexecuted.

While databases that support SQL scripts can access that textthrough a normal query (for instance, using a FireDAC ADQuery

MAGAZINE

16

Page 17: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

DELPHI

Likewise, expect to see changes to the FireDAC unit names. Futhemore, additional improvements to existing components, such asthe ADMemTable, are highly likely.

These changes will make FireDAC more consistent with Delphi's naming conventions and standards, and should pose few obstacles tofuture migrations. Nonetheless, it is clear that FireDAC takes databasedevelopment with Delphi to a new level, and should add to Delphi's re-emergence as an industry-leading tool for software developmentas we move into the future. •

Cary Jensen

Cary Jensen is the bestselling author of more than 20 books onsoftware development, includingDelphi in Depth: ClientDataSets,and winner of the 2002 and 2003Delphi Informant Reader's Choice

Award for Best Training. A frequent speaker at conferences, work-shops, and seminars throughout much of the world, he is widelyregarded for his self-effacing humor and practical approaches tocomplex issues. Cary's company Web site is at: http://www.JensenDataSystems.com. Cary has a Ph.D. from Rice Universityin Human Factors Psychology, specializing in human-computer interaction.

Met de nieuwe versie van de Windows Azure SDK en Tools 2.1 heeftWindows Azure zijn eigen plekje veroverd in Server explorer. Om eerlijk te zijn, dat werd ook wel tijd. De server explorer maakt het voorde ontwikkelaar mogelijk om Visual studio niet te verlaten tijdens zijnontwikkel werkzaamheden. Op deze manier kan hij efficiënt met zijn tijdom gaan en geen tijd te verspillen met het switchen tussen verschil-lende programma’s/tools.

Oké, niet helemaal nieuw.Van het Windows Azureplatform hadden Cloudser-vices en Storage al ingan-gen. Maar nu zijn ze samengevoegd en netjes onder elkaar gezet. Alle compo-nenten van Windows Azureonder een kopje. Met uitzondering van WindowsAzure Websites die staanwel los van de rest.

Je Windows Azure websi-tes kun je nu dus ook van-uit de vertrouwde omgevingvan Visual Studio benade-ren en settings aanpassen.

Wel nieuw is, dat je Virtual Machine nu rechtstreeks vanuit de Serverexplorer kunt benaderen. Je kunt dus nu zonder eerst naar de portalte hoeven vanuit Visual Studio een remote desktop connection maken.

Hoe gaaf is het dat Microsoft de extensibility van het Windows Azureplatform ook inzet voor haar eigen tools. En als zij het doen waaromjij niet? •

Windows Azure Visual Studio Tools 2.1

magazine voor software development 17

Page 18: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

CLOUD Hassan Fadili

Voor alle duidelijkeid, Microsoft Test Manager (MTM) is een test toolspecfiek voor testen als het gaat om het plannen en uitvoeren van Manual en Automated Tests van de software applicaties.

In dit artikel zal vooral de nadruk liggen op de nieuwe test mogelijk-heden vanuit Team Web Access in Team Foundation Server/Service2012 Update 2 en Visual Studio 2013 Preview releases als onderdeelvan Visual Studio Application Life Cycle Mangement 2012/2013(VSALM-2012/2013).Microsoft Test Manager is in eerst instantie beschikbaar als stand-alone tool voor de test professionals om hen te ondersteunen bij testwerkzaamheden o.a. te weten: - Specificeren van test cases/scenario’s- Opstellen van test plannen- Uitvoeren van Tests (Manual en ge-automatiseerd testen) - Registreren van test bevindingen - Opstellen van test rapportages op basis van aantal geslaagde en/offalende test cases

- Terugkopelen van test resultaten aan (development en/of management teams)

- etc.

In de voorgaande SDN Magazines is uitgebreid geschreven over alle test mogelijkheden opbasis van de Microsoft Test Manager 2010 RTM, 2012 BETA1 en RC releases in combinatie metTeam Foundation Server versies. Met de komst van Visual Studio 2012 Update 2 Release is er een nieuwe wereld open gegaanvoor test professionals. Nu is testen ook mogelijk vanuit de zogenaamde “Team Web Access”en ben je niet langer gebonden aan het Stand-alone Microsoft Test Manager (MTM) tool.

Testing in VS2012.2 & VS2013 Preview op de web-based testcase management

Gedurende de Visual Studio / Team Foundation Server (en/of) Serviceupgrade cyclus, werden er steeds nieuwe verbeteringen toegevoegdaan de Visual Studio Testing mogelijkheden. Deze verbeteringen worden voortgezet. Onderstaande plaatje geeft een globale weergavevan deze mogelijkheden op het web gebaseerde test case management.

In Visual Studio / Team Foundation Server 2013 zullen deze nieuwemogelijkheden verder doorgevoerd worden. Ten eerste zal voort-geborduurd worden op de nieuwe web gebaseerde test case management en testuitvoering mogelijkheden die geïntroduceerd zijnin Visual Studio 2012 Update 2.

Waar voorheen (t/m) Visual Studio 2012.2 het niet mogelijk was omtest artefacten te creëren vanuit de web gebaseerd test case management zonder eerst een Test plan te maken met de stand-aloneMicrosoft Test Manager. Met de komst van Visual Studio 2013 Previewis dit verleden tijd.

Fig.1: Testing mogelijkheden in web gebaseerde test case management

MAGAZINE

18

Page 19: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

CLOUD

Zo kun je vanuit Visual Studio 2013 Preview de nieuwe test artefactendirect creëren vanuit web gebaseerd test case management zoalshieronder is weergegeven in Fig. 2, te weten: - Test plan- Static suite- Requirement-based suite- Query-based suite- Shared steps

Fig. 2: Mogelijke toe te voegen test artefacten in web gebaseerdetest case management

De Microsoft Visual Studio, Team Foundation Server en Test teamswerken hard samen om de test case management mogelijkheden verder uit te bouwen, zodat de testplannen volledig daar te beherenzijn zonder over te hoeven schakelen naar de stand-alone Test Professional oftewel Microsoft Test Manager (MTM) Tool. Testplannen,suites en gemeenschappelijke stappen (shared steps) kunnen nu gecreëerd en gewijzigd worden op het web.Andere verbeteringen in dat verleent zijn gedaan als het gaat om hetbewerken van de test door het mogelijk te maken om de stap bijlagentoe te voegen, gebruik te maken van de gedeelde stappen, parametriseren van de stappen en meer...Fig.3 geeft een voorbeeld weer van deze toevoeging van stappen envan stap bijlagen aan een test case.

Fig.3: Test case opbouw en de bijbehorende eigenschappen

In aanvulling op de volgende ronde van verbeteringen aan Microsoftweb-based test case management oplossing, is tijdens de //BUILD/Conferentie in San Fransisco in juni 2013 een nieuwe aankondiginggedaan van een nieuwe dienst in dit verleen, namelijk: Cloud-load testing.

Load testing is sinds 2005 ondersteund binnen Visual Studio. Dit steltu in staat om de prestaties, omvang en betrouwbaarheid van uw server applicaties te valideren. Echter, je moet uw eigen infrastructuurinstellen en configureren zodat je load tests uit te kunnen voeren. Met de nieuwe Team Foundation Service Load test gebaseerd oplossing, kun je nu load testen uitvoeren op je applicaties zonderenige infrastructuur te configureren. Dit kan door gebruik te makenvan Visual Studio Ultimate Editie, daarin een load test te maken endeze op Team Foundation service te richten en klaar! Binnenkort zullen de laatste test resultaten zichtbaar worden voor je toepassing.Microsoft denkt dat dit erg bijzonder belangrijk en zeer waardevol zalworden voor mensen die Windows Azure applicaties bouwen en diede schaalbaarheid van hun applicaties willen controleren voordat zebeschikbaar gesteld worden aan een grote groep gebruikers.Om een cloud based load test uit te voeren op Team Foundation Service, dien je simpelweg een load test te creëren en op te nemen envervolgens de optie uitvoeren kiezen bij de test instellingen zoals hieronder is weergegeven in Fig. 4.

Fig.4: Load Test Eigenschappen voor het uitvoeren en opnemenvan load test

Nadat de test instellingen gekozen en bevestigd zijn met Apply, zal deload test uitgevoerd worden waarna de resultaten snel zichtbaar worden zoals hieronder is weergegeven. Let op: Dit is een voorbeeld op basis van de nieuwe aangekondigdeVisual Studio 2013 Preview. Dit is aan veranderingen onderhevig!

Fig.5: Load Test resultaten op basis van VS2013 Preview

magazine voor software development 19

Page 20: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

CLOUD

Je kunt van deze mogelijkheid nog niet optimaal profiteren gezienVS2013 nog een Preview status heeft momenteel en nog niet RTM is!Wel belooft dit een interessante stap te gaan worden in het load testveldzeker voor Windows Azure based applicaties in combinatie metTeam Foundation Service faciliteiten.

Conclusie:Microsoft Test Manager Tool is met de komst van Visual Studio 2012Update 2 en Visual Studio 2013 Preview niet meer beperkt in gebruikalleen als stand-alone tool voor test doeleinden, maar heeft de concurentie van web gebaseerd test case management. Met dezenieuwe stap in test wereld, heeft Microsoft een prima eerste stap gezetom ook op termijn in het test veld te kunnen concurreren met anderetest tools leveranciers. De kracht van web based test case manage-ment ligt in het feit dat steeds meer applicaties webbased zijn en kunnen naadloos op elkaar afgestemd te worden binnen dezelfde ofverschillende browsers. Cloud Load testing met Web based test case management wordt interessanter voor Azure gebruikers door gebruik te maken van de juiste tools die naadloos op elkaar zijn afgestemd en geïntegreerd.Zo zouden klanten zich meer kunnen richten op hun core-business en hoeven geen of weinig tijd besteden aan de infrastructuur (installa-tie/configuratie) zaken voor het uitvoeren van dit type tests. •

LinksQuality Enablement (Testing)http://blogs.msdn.com/b/visualstudioalm/archive/2013/01/30/first-ctp-for-visual-studio-update-2.aspx#TCMWeb

Microsoft Test Manager (MTM) - The ability to clone test cases in Microsoft Test Manager:http://blogs.msdn.com/b/visualstudioalm/archive/2013/02/08/february-ctp-for-visual-studio-update-2.aspx#copy

Configure Test Plans for web access in TFS 2012.2http://nakedalm.com/configure-test-plans-for-web-access-in-tfs-2012-2/

Team Test Blog: http://blogs.msdn.com/b/vstsqualitytools/

What's new for MSTest Unit Tests in Visual Studio 11 Beta:http://blogs.msdn.com/b/visualstudioalm/archive/2012/03/13/what-s-new-for-mstest-unit-tests-in-visual-studio-11-beta.aspx

Application Lifecycle Management resource center | SharePoint 2010http://msdn.microsoft.com/en-us/sharepoint/dd552992.aspx

Test Release Management Guidance: http://vsartestreleaseguide.codeplex.com/

Rangers Solutions by Version: http://msdn.microsoft.com/en-us/vstudio/ee358787

Compare Visual Studio 2012 editions: http://www.microsoft.com/visualstudio/11/en-us/products/compare

Hassan Fadili

Hassan Fadili is werkzaam als Freel-ance Lead Architect / Consultant enVS ALM Consultant (MVP) voor zijneigen bedrijf FadiliCT Consultancy(http://www.fadilict-consultancy.nl).Hassan is zeer actief in de Commu-nity en mede bestuurslid van Dot-Ned (.NET & VS ALM UG NL) en VSALM Track Owner. Hassan houdt

zijn blog op: http://hassanfad001.blogspot.com en te bereiken via:[email protected], [email protected], [email protected] en/of via Twitter op: @HassanFad

MAGAZINE

20

Page 21: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

GENERAL

When I get back to the Netherlands next week, I will pick up coach-ing in three different organizations and three very different projects.The first project is all about continuous software product development,with business developers, quarterly releases and multiple configurati-ons of the products delivered. The second one is building a publicavailable service, both for mobile and web, using .NET and Mono tech-nology. And the third project is rebuilding an old customer-facing client-server application in Java, whilst moving towards a service orientedarchitecture, complete with document management and business pro-cess automation. So in merely two weeks I will look at five very diffe-rent projects, in different organizations, with different targets, and verydifferent issues. But there is one common denominator: they are alltrying to be as agile as they possibly can.

All projects great and smallIn only a few years agile has moved from guerilla warfare to main-stream. The popularity of everything agile is reaching new peaks. Fromagile practices such as continuous integration, pair programming, andtest driven development, to agile approaches, such as Scrum andKanban to even open space sessions, agile thinking, agile gaming anda seemingly never ending stream of agile conferences. Despite the fact that no-one in the agile communities actually claimsthat agile, or Scrum, or Kanban, is a silver bullet for all projects greatand small, many organizations these days move towards agile, basedon a firm believe that agile will solve all their problems. And it justdoesn’t.

Dealing with xIn my experience, agile approaches only cover a small subset of thetopics and issues that projects in the real world will need to address.Simply because most agile approaches merely provide a minimalisticframework to guide your projects, and simply because it is virtually impossible for the authors of agile approaches to provide fitting solutions for each and everyone’s problems.Very often project teams ask me: how do you deal with x in agile? Andfeel free to replace x with every issue that your projects have sufferedfrom in the past years. This month x’s for me? Estimating bug fixing,

velocity for starting teams, agile and service oriented architecture, agileand building frameworks, distributed functional testing, documentationin Finnish, while developers and testers can’t read Finnish, agile workbreakdown, estimating user stories, DBA’s that have too much control,or even how to shorten the time that is required to move from devel-opment to test (which is currently two weeks).

So how do you deal with x in agile? If I was a Scrum Master (with orwithout the dash) my default answer would probably be: it depends.It’s an easy way out. Your audience will continue to believe all wisdomis converged in Scrum, even without offering a real solution. But thenagain I’m not a Scrum Master. So my answer is a bit different: agiledoesn’t cover x.

No tailored solutionBasically, agile doesn’t exist. And even worse, there’s no such thing asthe agile approach or methodology. At most, there’s a set of approa-ches that adhere to a set of principles. And although these agile prin-ciples and the approaches that adhere to them will give you a senseof direction on how to solve your specific project issues, none of themwill provide you with a tailored solution. Moving towards agile does never mean that you should stop thinkingand go on automatic pilot. Each and every one of your projects is dif-ferent. They start different, use a different set of techniques, have dif-ferent teams with different people, serve different clients with differentdemands, you have different roles in your organizations, apply differenttechniques and technologies, and projects have different endings.

More than meets the eyeProjects are all different, and thus there is no one-size-fits-all agile approach. You will always have to tailor agile to your organization andto your project. Find out what it is that your project requires, besidesimplementing the basic agile principles. Figure out how you want todeal with requirements, as user stories could well be an over-simpli-fied technique. Identify how estimation works best for you. Don’t throwout old techniques that your organization has been using for years andyears just because they are not mentioned in the Scrum Guide. If yourenvironments don’t match on-click deployment, identify how it canbest match agile projects. Identify how to report out to your manage-ment best. And try to establish how the roles in your organization couldmatch the way you would like to deliver. What is it enterprise archi-tects can contribute? Or functional analysts? And foremost, make sureyour testers now how important they can be in agile projects. Eventhough most agile approaches don’t mention any of these roles specifically.To some, these warnings may well be an open door, in that case: carryon. But in my experience, most organizations and projects taking theplunge into agile, Scrum, Kanban, XP, please be aware that there’s somuch more than meets the eye. •

While writing this post, I am on an airplane to Helsinki. Nice sunny city. And lucky for me it is about 50degrees Celsius warmer than the last time I visited it. In Helsinki I will have look at a couple of projectsthat use a distributed agile approach, but fail to deliver on-time and on-budget.

Agile doesn’t deal with x

Sander Hoogendoorn

magazine voor software development 21

Page 22: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

.NET Rick Smolders

Stap 1: Windows Service abonneren op PreShutdown notificatie Vanaf Windows Vista en later is het mogelijk dat Windows Servicesgeïnformeerd worden over het afsluiten of herstarten van Windows.Bij beide acties wordt door Windows een PreShutdown notificatie verstuurd wat aangeeft dat Windows gaat afsluiten. Standaard reageert een service niet op een PreShutdown notificatie. Daarom zaleen service zich op de notificatie moeten abonneren. In listing 1 kunje zien hoe een Windows Service zich hier op abonneert.

using System;

using System.ServiceProcess;

using System.Reflection;

using System.Threading;

using System.Runtime.InteropServices;

using System.Threading.Tasks;

using System.Diagnostics;

namespace DelayShutdownService

{

public partial class DelayShutdownService: ServiceBase

{

private const int _Service_Accept_Preshutdown = 0x100;

public DelayShutdownService()

{

InitializeComponent();

AcceptPreShutdown();

}

private void AcceptPreShutdown()

{

var acceptedCommandsFieldInfo =

typeof(ServiceBase).GetField("acceptedCommands", Binding-

Flags.Instance | BindingFlags.NonPublic);

if (acceptedCommandsFieldInfo != null)

{

int value =

(int)acceptedCommandsFieldInfo.GetValue(this);

acceptedCommandsFieldInfo.SetValue(this, value |

_Service_Accept_Preshutdown);

}

Windows Services beschermentegen Windows shut downBij het afsluiten van Windows worden alle actieve Windows Services automatisch gestopt. Maar stel dat de service nog activiteiten moet uitvoeren, voordat deze mag stoppen. Er moeten bijvoorbeeld nog gegevens naar file of database weggeschreven worden. En watals deze Windows Service hier twee minuten of langer over doet? Dan mag Windows de service niet stoppen voordat al het werk afgerond is. Dit artikel beschrijft de stappen tot de oplossing voor deze problemen.

}

}

}

Listing 1: Service abonneren op PreShutdown notificatie

In de constructor van de Windows Service wordt de methode AcceptPreShutdown aangeroepen. In deze methode worden via reflectie de reeds geaccepteerde acties van de ServiceBase klasseopgehaald. Voorbeelden van bestaande acties zijn starten, stoppenen pauzeren van de service. Indien deze variabele niet null is, wordtaan de bestaande acties de _Service_Accept_Preshutdown vlag toe-gevoegd. Zodra deze is toegevoegd zal de service bij het afsluiten vanWindows een PreShutdown notificatie ontvangen.

Als een Windows Service een notificatie ontvangt die niet door de ServiceBase klasse wordt ondersteund, wordt de methode OnCustomCommand aangeroepen. De PreShutdown notificatie is hiereen voorbeeld van. de methode OnCustomCommand kan over-schreven worden, zodat we zelf een actie kunnen toevoegen als deWindows Service een PreShutDown notificatie ontvangt.

private const int _Service_Control_Preshutdown = 0xf;

protected override void OnCustomCommand(int command)

{

if (command == _Service_Control_Preshutdown)

{

// do work which is needed before service can stop

}

else

base.OnCustomCommand(command);

}

Listing 2: De methode OnCustomCommand

De integer command geeft het type notificatie aan. In het if statementwordt deze parameter vergeleken met de constante _Service_Con-trol_Preshutdown. Als ze aan elkaar gelijk zijn, weet de service datWindows zal afsluiten en is het dus mogelijk om de service op eennette manier te sluiten.

MAGAZINE

22

Page 23: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

.NET

Stap 2: De levensduur van een Windows Service verlengen bijhet afsluiten van Windows De Service Control Manager (SCM) stuurt Windows Services op eenWindows machine aan. Starten, stoppen en sluiten zijn voorbeeldenvan opdrachten die de SCM aan services verstuurd. De communica-tie tussen de SCM en services is geen eenrichtingsverkeer. Een service kan aangeven hoe de SCM met hem om moet gaan.

Als een Windows Service een PreShutdown notificatie ontvangt en deservice communiceert niet met de SCM, dan heeft de service dertigseconden om af te sluiten. Na dertig seconden neemt de SCM aan datde service hangt en zal deze geforceerd gestopt worden. Indien deservice meer tijd nodig heeft, moet de service dit aangeven. Hoe eenWindows Service dit kan doen wordt in listing 3 aangegeven.

private bool _IsDeinitialized = false;

private const int _Service_Control_Preshutdown = 0xf;

protected override void OnCustomCommand(int command)

{

if (command == _Service_Control_Preshutdown)

{

PreShutDownActivities();

ExtendServiceLiveTime();

}

else

{

base.OnCustomCommand(command);

}

}

private void PreShutDownActivities()

{

var deinitializeTask = Task.Factory.StartNew(() =>

{

Thread.Sleep(1000 * 60 * 2);

_IsDeinitialized = true;

});

}

private void ExtendServiceLiveTime()

{

var waitTillWorkIsDone = Task.Factory.StartNew(() =>

{

var _serviceHandle = this.ServiceHandle;

bool setStatus = false;

int checkPoint = 1;

while (_IsDeinitialized == false)

{

int waitHint = 1000 * 40;

setStatus =

ChangeServiceStatus(SERVICE_STATE.SERVICE_STOP_PENDING, wait-

Hint, checkPoint);

Thread.Sleep(1000 * 35);

checkPoint ++;

}

ChangeServiceStatus(SERVICE_STATE.SERVICE_STOPPED, 0,

0);

});

}

private bool ChangeServiceStatus(SERVICE_STATE serviceState,

int waitHint, int checkPoint)

{

SERVICE_STATUS serviceStatus = new SERVICE_STATUS();

serviceStatus.currentState = (int)serviceState;

serviceStatus.serviceType = 16;

serviceStatus.waitHint = waitHint;

serviceStatus.serviceSpecificExitCode = 0;

serviceStatus.checkPoint = checkPoint;

serviceStatus.controlsAccepted = 0 |

(this.CanStop ? (int)ControlsAccepted.ACCEPT_STOP : 0) |

(this.CanShutdown ? (int)ControlsAccepted.ACCEPT_SHUT-

DOWN : 0) |

(this.CanPauseAndContinue ? (int)ControlsAccepted.AC-

CEPT_PAUSE_CONTINUE : 0) |

(this.CanHandleSessionChangeEvent ? (int)ControlsAccep-

ted.ACCEPT_SESSION_CHANGE : 0) |

(this.CanHandlePowerEvent ? (int)ControlsAccepted.AC-

CEPT_POWER_EVENT : 0);

return Interop.SetServiceStatus(this.ServiceHandle, ref

serviceStatus);

}

Listing 3: Levensduur van een Windows Service verlengen

Bij het ontvangen van een PreShutdown notificatie wordt eerst de me-thode PreShutDownActivities aangeroepen. Deze methode start eenTask, zodat in een nieuwe thread de service het werk kan uitvoeren datnodig is voor het correct afsluiten van de service. Task is beschikbaarvanaf .NET 4.0. Let op dat de hoofdthread van de Windows Servicevan de SCM is. Indien deze thread geblokkeerd wordt, kan de SCMniet met andere Windows Services communiceren. Het werk wordtgesimuleerd met een Thread.Sleep en duurt twee minuten. Als dezetwee minuten om zijn, wordt de boolean _IsDeinitialized op true gezet.Deze boolean geeft aan dat het werk uitgevoerd is en de service kanworden afgesloten.

Na de methode PreShutDownActivities wordt de methode Extend-ServiceLiveTime aangeroepen. In deze methode wordt ook een taakgestart waarin een while loop aanwezig is. Deze loop zal net zo vaakworden doorlopen tot de boolean _IsDeinitialized op true is gezet. Elkekeer wordt de methode ChangeServiceStatus aangeroepen, die bij deSCM aangeeft dat de service meer tijd nodig heeft om af te sluiten. Inde methode ChangeServiceStatus wordt gebruik gemaakt van reflec-tie om de status van de service te wijzigen. In dit voorbeeld zal om de35 seconden worden doorgegeven dat de service nog veertig secon-den nodig heeft. Als de status niet verandert, is het belangrijk dat decheckpoint met één wordt verhoogd. Als deze niet met één wordt ver-hoogd, weet de SCM niet dat er wijzigingen zijn en zal de SCM deWindows Service na dertig seconden alsnog stoppen.

Zodra de Windows Service klaar is met afsluiten wordt de status vande service naar “SERVICE_STOPPED” gewijzigd. Nu kan de SCM deservice stoppen.

Voor het communiceren met de SCM is de Dynamic Link Library advapi32.dll nodig. door middel van platform invoke kunnen we methodes in deze DLL ook daadwerkelijk aanspreken. Onderstaandeklasse is daarom nodig.

magazine voor software development 23

Windows Service bepaalt de tijd dienodig is om Windows af te sluiten

Page 24: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

.NET

MAGAZINE

24

SERVICE_STOP_PENDING = 0x00000003,

SERVICE_RUNNING = 0x00000004,

SERVICE_CONTINUE_PENDING = 0x00000005,

SERVICE_PAUSE_PENDING = 0x00000006,

SERVICE_PAUSED = 0x00000007

}

[Flags]

public enum SERVICE_CONTROL : uint

{

STOP = 0x00000001,

PAUSE = 0x00000002,

CONTINUE = 0x00000003,

INTERROGATE = 0x00000004,

SHUTDOWN = 0x00000005,

PARAMCHANGE = 0x00000006,

NETBINDADD = 0x00000007,

NETBINDREMOVE = 0x00000008,

NETBINDENABLE = 0x00000009,

NETBINDDISABLE = 0x0000000A,

DEVICEEVENT = 0x0000000B,

HARDWAREPROFILECHANGE = 0x0000000C,

POWEREVENT = 0x0000000D,

SESSIONCHANGE = 0x0000000E

}

public enum ControlsAccepted

{

ACCEPT_STOP = 1,

ACCEPT_PAUSE_CONTINUE = 2,

ACCEPT_SHUTDOWN = 4,

ACCEPT_POWER_EVENT = 64,

ACCEPT_SESSION_CHANGE = 128

}

public enum INFO_LEVEL : uint

{

SERVICE_CONFIG_DESCRIPTION = 0x00000001,

SERVICE_CONFIG_FAILURE_ACTIONS = 0x00000002,

SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 0x00000003,

SERVICE_CONFIG_FAILURE_ACTIONS_FLAG = 0x00000004,

SERVICE_CONFIG_SERVICE_SID_INFO = 0x00000005,

SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 0x00000006,

SERVICE_CONFIG_PRESHUTDOWN_INFO = 0x00000007,

SERVICE_CONFIG_TRIGGER_INFO = 0x00000008,

SERVICE_CONFIG_PREFERRED_NODE = 0x00000009

}

[Flags]

public enum SCM_ACCESS : uint

{

STANDARD_RIGHTS_REQUIRED = 0xF0000,

SC_MANAGER_CONNECT = 0x00001,

SC_MANAGER_CREATE_SERVICE = 0x00002,

SC_MANAGER_ENUMERATE_SERVICE = 0x00004,

SC_MANAGER_LOCK = 0x00008,

SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,

SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,

SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |

SC_MANAGER_CONNECT |

SC_MANAGER_CREATE_SERVICE |

SC_MANAGER_ENUMERATE_SERVICE |

SC_MANAGER_LOCK |

SC_MANAGER_QUERY_LOCK_STATUS |

SC_MANAGER_MODIFY_BOOT_CONFIG

internal class Interop

{

[DllImport("advapi32.dll", SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool ControlService(

IntPtr hService,

SERVICE_CONTROL dwControl,

ref SERVICE_STATUS lpServiceStatus);

[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW",

ExactSpelling = true, CharSet = CharSet.Unicode, SetLas-

tError = true)]

internal static extern IntPtr OpenSCManager(

string machineName,

string databaseName,

uint dwAccess);

[DllImport("advapi32.dll", SetLastError = true, CharSet =

CharSet.Auto)]

internal static extern IntPtr OpenService(IntPtr hSCMana-

ger, string lpServiceName, uint dwDesiredAccess);

[DllImport("advapi32.dll", SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool CloseServiceHandle(IntPtr

hSCObject);

[DllImport("advapi32.dll", EntryPoint = "QueryServiceSta-

tus", CharSet = CharSet.Auto)]

internal static extern bool QueryServiceStatus(IntPtr hSer-

vice, ref SERVICE_STATUS dwServiceStatus);

[DllImport("advapi32.dll")]

internal static extern bool SetServiceStatus(IntPtr hServi-

ceStatus, ref SERVICE_STATUS lpServiceStatus);

[DllImport("advapi32.dll", SetLastError = true, CharSet =

CharSet.Auto)]

[return: MarshalAs(UnmanagedType.Bool)]

public static extern bool ChangeServiceConfig2(

IntPtr hService,

int dwInfoLevel,

IntPtr lpInfo);

}

Listing 4: Pinvoke

Voor het goed functioneren van bovenstaande code zijn de volgendestructs en enums nodig.

[StructLayout(LayoutKind.Sequential)]

public struct SERVICE_STATUS

{

public int serviceType;

public int currentState;

public int controlsAccepted;

public int win32ExitCode;

public int serviceSpecificExitCode;

public int checkPoint;

public int waitHint;

}

public enum SERVICE_STATE : uint

{

SERVICE_STOPPED = 0x00000001,

SERVICE_START_PENDING = 0x00000002,

Page 25: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

.NET

magazine voor software development 25

}

[StructLayout(LayoutKind.Sequential)]

public struct SERVICE_PRESHUTDOWN_INFO

{

public UInt32 dwPreshutdownTimeout;

}

Listing 5: Structs en enums

Stap 3: 180 seconden zijn niet genoeg om de Windows Serviceaf te sluitenNa het toepassen van bovenstaande code bleek dat een WindowsService niet meer dan 180 seconden kan draaien als Windows een-maal afsluit. Het heeft mij veel tijd gekost om de reden te achterhalen.Uiteindelijk heb ik, met dank aan Microsoft, toch een oplossing gevonden om een Windows Service langer dan 180 seconden draai-ende te houden.Als een Windows Service meer tijd nodig heeft dan180 seconden, moet ook de PreShutdownTimeOut van de SER-VICE_PRESHUTDOWN_INFO worden verhoogd. Deze staat standaard op 180 seconden en is service specifiek. Helaas kan dezeparameter niet verhoogd worden nadat de PreShutdown notificatieontvangen is. Daarom kan de waarde van deze parameter het bestein de constructor worden aangepast. Als niet bekend is hoe lang de service nodig heeft om af te sluiten, kan de waarde van deze parameter zo hoog worden gezet, dat zeker is, dat de service genoegtijd heeft om te af te sluiten. Listing zes laat zien hoe de PreShutdownTimeOut verhoogd kan worden.

public void SetPreShutdownTimeOut(uint minutes)

{

IntPtr hMngr = Interop.OpenSCManager(null, null,

(uint)SCM_ACCESS.SC_MANAGER_ALL_ACCESS);

if (hMngr == IntPtr.Zero)

{

throw new Exception("Failed to open SC Manager handle");

}

else

{

IntPtr hSvc = Interop.OpenService(hMngr, this.Service-

Name, (uint)SCM_ACCESS.SC_MANAGER_ALL_ACCESS);

if (hSvc == IntPtr.Zero)

{

throw new Exception("Failed to open service handle");

}

else

{

SERVICE_PRESHUTDOWN_INFO spi = new

SERVICE_PRESHUTDOWN_INFO();

spi.dwPreshutdownTimeout = 1000 * 60 * minutes;

IntPtr lpInfo =

Marshal.AllocHGlobal(Marshal.SizeOf(spi));

if (lpInfo == IntPtr.Zero)

{

throw new Exception(String.Format("Unable to allocate

memory for service action, error was: 0x{0:X}", Marshal.Get-

LastWin32Error()));

}

Marshal.StructureToPtr(spi, lpInfo, false);

if (!Interop.ChangeServiceConfig2(hSvc,

(int)INFO_LEVEL.SERVICE_CONFIG_PRESHUTDOWN_INFO, lpInfo))

{

throw new Exception("Failed to change service timeout");

}

Interop.CloseServiceHandle(hSvc);

}

Interop.CloseServiceHandle(hMngr);

}

}

Listing 6: Service levensduur met meer dan 180 seconden verlengen

Eerst wordt een pointer naar de service control manager en naar debetreffende service handler bepaald. Let op dat this.ServiceName deservicenaam van de service ophaalt. Deze moet namelijk gelijk zijn aande naam zoals die bij Services.mcs wordt weergegeven. Vervolgenswordt de PreshutdownTimeout parameter naar zes minuten gezet. Ditis een willekeurig getal en kan naar voorkeur worden ingesteld. Metdeze instelling zal de service maximaal zes minuten blijven draaienzodra Windows afsluit. Uiteindelijk wordt met de methode Change-ServiceConfig2 de PreshutdownTimeout daadwerkelijk gewijzigd. Ookbij deze methode gebruiken we pinvoke.

ConclusieVoor de leesbaarheid van de code heb ik de foutafhandeling wegge-laten. Voor een volledig goed werkende Windows Service moet dezenog worden toegevoegd. Om tijdens het testen nog meer inzicht tehebben op de gebeurtenissen die zich afspelen in de service, heb ikmet Enterprise Library logging gewerkt. In de constructor had ik nogeen timer gedefinieerd die elke seconde de tijd logt. Op deze manierkun je gemakkelijker terug zien wanneer welke gebeurtenissen of fouten optreden. Het testen van de oplossing is dus omslachtig. De enige mogelijkheid om de code te testen is door Windows af te sluiten. Daarmee zorg je dat een PreShutdown notificatie naar deWindows Service wordt verstuurd. Dus eerst moet je Windows afslui-ten en vervolgens alles weer opstarten. Dit kost enkele minuten, waar-bij je weinig kunt doen. Het gebruik van een virtuele omgeving zalhierbij een voordeel opleveren, omdat dan de computer waar dezevirtuele machine opdraait nog beschikbaar is. Ik kwam met deze uit-daging in aanraking toen een Atos collega deze vraag aan mij stelde.Zijn probleem was dat een Windows Service om onverklaarbare redenvroegtijdig stopte. Deze service draait op een computer waarop ookeen virtuele machine draait. Het doel van deze service is, nadat Windows afgesloten wordt, Windows net zo lang laten draaien tot devirtuele machine helemaal afgesloten is. Het afsluiten van de virtuelemachine duurt ongeveer veertig seconden. Met de oplossing die ikgevonden heb, is het probleem uiteindelijk opgelost. •

Rick Smolders

Rick Smolders, .NET ontwikkelaar,is sinds 2008 werkzaam bij Atos. Hijbehaalde In 2007 zijn diploma Infor-matica aan de Avans Hogeschool.Daarna heeft Rick al vele facettenvan het softwareontwikkeling ge-zien. Hij heeft inmiddels veel kennisopgedaan van het .NET frameworkalsmede het praktisch toepassenvan die kennis in verschillendemarkten, waaronder de energiewe-

reld. Rick zijn grootste passie is wandelen door bergachtige ge-bieden als de Alpen en Pyreneeën. Vaak probeert hij een top tebereiken, maar door weersomstandigheden wil dit niet altijd lukken. Eenmaal toch boven kan hij intens genieten van het fantastische uitzicht.

Page 26: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

MOBILE

Near field communicationBij het communiceren met een tag wordt een elektromagnetische puls,via de Windows Phone uitgezonden, door de tag opgevangen en omgezet in net voldoende spanning om een opgeslagen boodschapweer terug te zenden. Dit alles gebeurt alleen als de twee apparatenzich maar enkele centimeters in elkaar nabijheid bevinden.Toch maakt dit ‘tappen’ het al mogelijk om een bepaalde handeling opje telefoon via een tag te starten zoals het openen van een app, hetverzenden van een SMS of het starten van een telefoongesprek. Dezehandeling is dus gekoppeld aan de locatie waar de tag zich bevindt.Zelf maak ik hier gebruik van als ik op mijn fiets stap van en naar mijnwerk. Een tag onder het zadel zorgt er voor dat op mijn Nokia Lumiade Music Player beschikbaar komt om zo de rit te veraangenamen.

Windows Phone kan op dit moment slechts omgaan met een gedeeltevan de mogelijkheden die NFC ons standaard biedt. Zo kan WindowsPhone momenteel nog niet low-level schrijven, worden meerdere commando’s gebundeld op één tag nog niet ondersteund en kan eentag nog niet tegen overschrijven beschermd worden. Ook kan alleengebruikt gemaakt worden van tags die vooraf NDEF (NFC Data Exchange Format) geformatteerd zijn, wat wel dertig procent van debeschrijfbare ruimte opsnoept. Let hier dus op bij het bestellen vantags. Toch zijn NFC tags nu al een leuke en soms zelf nuttige uitbreiding op de mogelijkheden van je telefoon.Het wordt pas echt leuk als zelf geschreven apps van NFC onder-steuning voorzien worden. Hieronder zal ik dit met een aantal voor-beelden demonstreren. Mocht je niet over een Windows Phone metNFC beschikken dan kan je onderstaande voorbeelden ook naspelenmet de Windows Phone 8 emulator samen met de proximitytapper(via CodePlex). De hier toegepaste standaard ondersteuning vanuit deproximity bibliotheek is helemaal niet onaardig maar via CodePlex iseen NDEF bibliotheek beschikbaar met meer (low level) mogelijk -heden.

Hoe te beginnenStart met het openen van een nieuw Windows Phone-project In

Sander van de Velde

Tegenwoordig worden steeds meer Windows Phone-toestellen met NFC ondersteuning uitgeleverd. NFC staat voor Near Field Communication. Het biedt de mogelijkheid om vanuit eenactief NFC device (bijvoorbeeld een telefoon) gegevens uit te wisselen met een andere actiefNFC device (wellicht een andere telefoon). Maar het is ook mogelijk om met een passief device,oftewel een programmeerbare chip met alleen een antenne, contact te maken. Dit wordt ookwel een ‘tag’ genoemd en in dit artikel zal het uitwisselen van opdrachten met deze tags beschreven worden.

Integreer NFC in je Windows Phone-app

Visual Studio 2012, met Operating System 8.0 als gekozen versie. Om gebruik te kunnen maken van NFC in een Windows Phone-appmoeten enkele wijzingen in de bijbehorende WMAppManifest.xml aan-gebracht worden. Ten eerste moet de capability ID_CAP_PROXIMITYaangekruist worden. Apps die NFC willen toepassen zonder deze capability, kunnen niet in de Windows Phone store uitgerold worden.

Fig. 1: Proximity moet aangevinkt zijn om NFC te ondersteunen

Mocht NFC een onmisbaar element van jouw app zijn dan is het wenselijk om ook NFC als vereiste ID_REQ_NFC in te stellen. Zo wordtvoorkomen dat Windows Phone-toestellen zonder NFC ondersteu-ning de app gaan installeren.

Fig. 2: Stel NFC als vereiste in indien dit noodzakelijk is

Plaatst daarna op je MainPage nog een referentie naar Windows.Networking.Proximity en probeer vervolgens in de constructor eenProximityDevice als singleton te instantiëren:

Windows Phone kan op dit momentslechts omgaan met een gedeelte van de mogelijkheden die NFC ons standaard biedt

MAGAZINE

26

Page 27: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

MOBILE

using Windows.Networking.Proximity;

private ProximityDevice _proximityDevice;

public MainPage()

{

InitializeComponent();

_proximityDevice = ProximityDevice.GetDefault();

if (_proximityDevice != null)

{

// SubscribeWriteableTagsMessages();

// SubscribeWindowsUriMessages();

CheckForTags();

txtDeviceAvailable.Text = "NFC proximity device found :-

)";

}

else

{

txtDeviceAvailable.Text = "No NFC proximity device found :-(";

}

}

Listing 1: Bevat het toestel ondersteuning voor NFC?

Het is dus voldoende om te testen of op het Windows Phone-toestelNFC ondersteund wordt, door op null te controleren. De uitkomstwordt in Wpf TextBlock geplaatst.

Alles draait nu om tagsMocht NFC inderdaad ondersteund worden, dan kunnen we nu con-troleren of er een tag in de buurt van het toestel geplaatst wordt:

private void CheckForTags()

{

_proximityDevice.DeviceArrived += sender =>

{

Dispatcher.BeginInvoke(() => txtTagAvailable.Text = "Tag

Arrived.");

};

_proximityDevice.DeviceDeparted += sender =>

{

Dispatcher.BeginInvoke(() => txtTagAvailable.Text = "Tag

departed.");

};

}

Listing 2: Detecteer of een tag aanwezig is

We abonneren ons hiervoor op twee gebeurtenissen en tonen een bij-passende tekst, wederom in een Wpf TextBlock. Omdat deze eventsniet op de UI thread draaien, moet via de Dispatcher het recht totschrijven op de UI thread aangevraagd worden.Als NFC wel op hettoestel aanwezig is maar bovenstaande events gaan toch niet af, controleer dan bij de instellingen van het toestel of “tap+send” noguitgeschakeld is.

De beschrijfbare ruimte op een tag uitlezenMaar wat als we willen reageren op de inhoud van een tag? Berichtenop een tag zijn voorzien van een MessageType. Dit is een vooraf gedefinieerde string en ieder type kan rekenen op ander gedrag vande lezer. Maar laten we ons eerst eens abonneren op het ontvangenvan “WriteableTag” tags, dus accepteer eenvoudig alle tags die

overschrijfbaar zijn.

using System.Runtime.InteropServices.WindowsRuntime;

private long _subscriptionIdWriteableTag;

private void SubscribeWriteableTagsMessages()

{

_subscriptionIdWriteableTag = _proximityDevice.

SubscribeForMessage("WriteableTag", WriteableTagHand-

ler);

}

private void WriteableTagHandler(ProximityDevice sender,

ProximityMessage message)

{

var dataSize = BitConverter.ToInt32(message.Data.ToAr-

ray(), 0);

Dispatcher.BeginInvoke(() => txtTagDataSize.Text =

string.Format("{0} {1}", dataSize.ToString(), sender.De-

viceId));

}

private void UnsubscribeWriteableTagsMessages()

{

_proximityDevice.StopSubscribingForMessage(_subscriptio-

nIdWriteableTag);

}

Listing 3: Lees de ruimte op de tag uit

Plaats bovenstaande code binnen de MainPage en roep de Subscri-beWriteableTagsMessages methode aan, nog vóór de ProximityDevice.DeviceArrived gebeurtenis is afgegaan. Anders wordt een tagmogelijk gemist en moet de gebruiker die tag opnieuw aanbieden.Mocht nu een tag gelezen worden die aan het opgegeven messagetype voldoet, dan zal de WriteableTagHandler methode uitgevoerdworden. We zien hier dat de lengte van de beschrijfbare ruimte uitge-lezen wordt en in een Wpf TextBlock geplaatst wordt. Ook de door defabrikant opgegeven typering van de lezer wordt getoond.De verwijzing naar de UnsubscribeWriteableTagsMessages methodeis niet onbelangrijk. Bij het abonneren op een willekeurige Message-Type krijgen we een subscriptionId mee. Willen we ons later afmelden,bijvoorbeeld bij het verlaten van de pagina of vooraf aan het startenvan een schrijfactie, dan moeten we die waarde doorgeven.

Starten van een website in de browser via een tagLaten we eens een URL gaan schrijven op een tag. We gebruiken hier-bij het MessageType WindowsUri:WriteTag. Hierbij maken we gebruikvan een Wpf Button. Het uitlezen van tags wordt gestart als de gebruiker op de knop drukt.

using System.Text;

private long _subscriptionIdWriteableTagToWrite;

private void btnUri_Click(object sender, RoutedEventArgs e)

{

SubscribeWriteableTagsToWrite();

}

private void SubscribeWriteableTagsToWrite()

{

UnsubscribeWriteableTagsMessages();

_subscriptionIdWriteableTagToWrite = _proximityDevice.

magazine voor software development 27

Page 28: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

MOBILE

MAGAZINE

28

SubscribeForMessage("WriteableTag", WriteableTagToWrite-

Handler);

Dispatcher.BeginInvoke(() =>{

btnUri.IsEnabled = false;

txtUri.Text = "Waiting for tag...";

});

}

private void WriteableTagToWriteHandler(ProximityDevice sender,

ProximityMessage mes-

sage)

{

var uri = new Uri("http://nl.atos.net/");

var uriByteArray = Encoding.Unicode.GetBytes(uri.To-

String());

sender.PublishBinaryMessage("WindowsUri:WriteTag",

uriByteArray.AsBuffer(), OnUriSentHandler);

}

private void UnsubscribeWriteableTagsToWrite()

{

_proximityDevice.StopSubscribingForMessage(_subscriptionId-

WriteableTagToWrite);

}

private void OnUriSentHandler(ProximityDevice sender, long

messageId)

{

UnsubscribeWriteableTagsToWrite();

Dispatcher.BeginInvoke(() => txtUri.Text = "URL written.

Close app and read tag.");

}

Listing 4: Beschrijf een tag met het adres van een website

Eerst melden we ons af voor alle andere abonnementen. Daarna mel-den we ons (opnieuw) aan voor een abonnement op beschrijfbare tagsmaar nu met een andere handler als reactie. Zodra dit gebeurt, schrij-ven we een URL op de tag en tonen we een melding op het scherm.We schrijven maar eenmalig naar één tag. Sluit nu de applicatie af omde tag te testen vanuit het home screen. Zie dat de Windows Phonebij het lezen van de tag om toestemming vraag voor het openen vande ingebouwde browser.Het MessageType WindowsUri geeft ook de mogelijkheid om bijvoor-beeld naar een coördinaat te navigeren of een mail te verzenden. Na-deel van dit MessageType is dat Windows Phone niet te onderdrukkenis om direct op de inhoud van een tag te reageren (tenzij NFC totaaluitgeschakeld wordt).

De inhoud van een tag uitlezenMaar wat is dan nu de inhoud geworden? Laten we de inhoud van dezojuist beschreven tag eens uitlezen.

private long _subscriptionIdWindowsUri;

private void SubscribeWindowsUriMessages()

{

_subscriptionIdWindowsUri = _proximityDevice.

SubscribeForMessage("WindowsUri", WindowsUriHandler);

}

private void WindowsUriHandler(ProximityDevice sender, Proxi-

mityMessage message)

{

Dispatcher.BeginInvoke(() =>

txtTagDataAsString.Text = string.Format("data: {0} ({1})",

message.DataAsString.Replace("\0", String.Empty), mes-

sage.MessageType));

}

private void UnsubscribeWindowsUriMessages()

{

_proximityDevice.StopSubscribingForMessage(_subscriptionId-

WindowsUri);

}

Listing 5: Lees de inhoud van een tag uit

Hier wordt de inhoud van de tag zichtbaar, waarop bv. onze websiteof een telefoonnummer geplaatst is. De tekst is overigens ‘verminkt’door lege chars die er voor het gemak uitgefilterd worden via de Replace methode.

Het lanceren van een app via een tagMaar voor mij is de meest interessantste toepassing dat ik vanuit eenbestaande app een tag kan laden met de actie om later diezelfde appte starten met een specifieke boodschap. Zo kan bijvoorbeeld auto-matisch het scherm voor de invoer van je gewicht getoond wordenals je toch bij een weegschaal staat. En dit scenario is heel eenvoudigte implementeren. Wederom wachten we met schrijven op de aangeboden tag totdateen knop ingedrukt is.

private long _subscriptionIdWriteableTagToWriteLaunch;

private void btnLaunch_Click(object sender, RoutedEventArgs

e)

{

SubscribeWriteableTagsToWriteLaunch();

}

private void SubscribeWriteableTagsToWriteLaunch()

{

UnsubscribeWriteableTagsMessages();

UnsubscribeWindowsUriMessages();

_subscriptionIdWriteableTagToWriteLaunch = _proximityDe-

vice.

SubscribeForMessage("WriteableTag", WriteableTagToWrite-

LaunchHandler);

Dispatcher.BeginInvoke(() =>{

btnLaunch.IsEnabled = false;

txtLaunch.Text = "Waiting for Launch tag...";

});

}

private void WriteableTagToWriteLaunchHandler(ProximityDe-

vice sender,

Proximi-

tyMessage message)

{

StartMyselfWithMessage(sender, "messagetext=LaunchStar-

ted;action=hello");

}

private void StartMyselfWithMessage(ProximityDevice sender,

string launchMessage)

{

string command =

string.Format("{0}\tWindowsPhone\t{{{1}}}",

Page 29: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

MOBILE

magazine voor software development 29

launchMessage,

Windows.ApplicationModel.Store.CurrentApp.AppId);

var byteArray = Encoding.Unicode.GetBytes(command);

sender.PublishBinaryMessage("LaunchApp:WriteTag",

byteArray.AsBuffer(), LaunchHandler);

}

private void LaunchHandler(ProximityDevice sender, long mes-

sageId)

{

UnsubscribeWriteableTagsToWriteLaunch();

Dispatcher.BeginInvoke(() => txtLaunch.Text = "Launch writ-

ten. Close to launch.");

}

private void UnsubscribeWriteableTagsToWriteLaunch()

{

_proximityDevice.StopSubscribingForMessage(_subscriptionId-

WriteableTagToWriteLaunch);

}

Listing 6: Geef opdracht tot het lanceren van een app

Ook hier abonneren we ons op het aanbieden van een overschrijfbaretag. Indien dit gebeurt, geven we een message door van het type“LaunchApp:WriteTag”. Het schrijfcommando is samengesteld uit driedelen. We geven de unieke identificatie van de huidige app door en wegeven aan dat deze in de Windows Phone store te vinden zal zijn. Diezelfde aanpak geldt overigens ook voor Windows 8 apps, alleenmoet voor die app store de notatie “Windows” meegegeven worden.Als laatste geven we de boodschap door die bij het opstarten van deapp beschikbaar komt. Na het schrijven wordt het abonnement direct gestopt en krijgt de gebruiker de melding om de app te sluiten. En als later vanuit het homescreen de tag wordt uitgelezen dan zal onze app opnieuw starten. In de MainPage zal de boodschap uitgelezen worden:

protected override void OnNavigatedTo(System.Windows.Naviga-

tion.NavigationEventArgs e)

{

if (NavigationContext.QueryString.ContainsKey("ms_nfp_laun-

chargs"))

{

var text = NavigationContext.QueryString["ms_nfp_laun-

chargs"];

txtNfcMessage.Text = string.Join("-", text.Split(

new char[] { ';' }, StringSplitOptions.None));

}

base.OnNavigatedTo(e);

}

Listing 7: Reageer op het starten via een NFC tag

De via NFC doorgegeven boodschap wordt nu uitgelezen en in ditvoorbeeld op het scherm getoond. Het is aan de ontwikkelaar omhierop te reageren. Zoals te zien is, kunnen we verschillende bood-schappen doorgeven.Mocht de te lanceren app bij het uitlezen van de tag nog niet op hetWindows Phone-toestel geïnstalleerd zijn, dan zal de gebruiker gevraagd worden om een download vanuit de Windows Phone storete bevestigen. Heel comfortabel dus.

Fig. 3: Onze app is gelanceerd en de boodschap is uitgelezen

ConclusieDit zijn nog maar enkele voorbeelden van de vele protocollen om viahet lezen van NFC tags commando’s uit te voeren. We hebben gezien dat het heel eenvoudig is om met NFC de functionaliteit van jeWindows Phone-toepassingen uit te breiden. Deze kennis is ook vantoepassing bij het ontwikkelen van apps voor Windows 8.

http://www.developer.nokia.com/Community/Wiki/Use_NFC_tags_with_Windows_Phone_8

http://proximitytapper.codeplex.com/

http://ndef.codeplex.com/ •

Sander van de Velde

Sander van de Velde is sinds 1993actief in de IT sector. Sander iswerkzaam bij Atos TS als .Net Consultant. Sander is graag bezigmet software innovaties zoals Windows Azure en Windows Phoneen probeert die een plaats te gevenin zijn dagelijkse werkzaamheden.

Sander vindt het belangrijk om kennis te delen en dat doet hijdoor het schrijven van blogs en artikelen en het geven van presentaties. Kennis maakt kennis!

Als er nog tijd overblijft, dan gaat hij graag zeilen of motorrijdenmet zijn vrouw of hij loopt een geocache met zijn drie zonen.

Page 30: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

GENERAL

In nummer 108 schreef ik nog een artikel over transacties en web -services. Ik gaf toen al aan dat je voorzichtig met transacties om moestspringen als je buiten de muren van de organisatie kwam (of zelfs nogdaarbinnen). Ook bracht ik de uitspraak van bekend auteur en spreker Juval Löwy naar voren: “Any application not using transactions is a toy” (iedere applicatie die geen transacties gebruiktis speelgoed).

Speelgoed? Of juist niet?Voor veel enterprise systemen was en is dat helemaal waar. Financiële gegevens waarvan de integriteit niet gewaarborgd is zouden bijvoorbeeld een catastrofe betekenen. Maar we leven ondertussen in een andere wereld, een waarin Big Data het laatstemodewoord is. Big Data gaat deels over het verwerken van enormehoeveelheden data. En met enorme hoeveel bedoel ik niet een paar terabyte, maar exabytes, zettabytes of meer. Daarom gaat Big Dataook over een andere manier om naar data te kijken. In Yoda-speak:“You must unlearn what you have learned” (je moet afleren wat je geleerd hebt). Met dergelijke hoeveelheden data, vaak ook verspreidover de aardbol is transactionele integriteit simpelweg niet haalbaarvanwege het CAP-theorema. CAP staat voor Consistent, Available(beschikbaar) en Partition Tolerance (data kan gepartioneerd worden)en zegt dat maar twee van de drie garanties gegeven kunnen worden. Aangezien met hele grote hoeveelheden je niet zonder partionering kunt om enige performance te behalen en data eigenlijkaltijd beschikbaar moet zijn, valt consistentie dus vrijwel automatischaf. In de wereld van Big Data wordt de uitspraak van Juval Löwy dusop z’n kop gezet. Voor Big Data geldt: “Any application using transactions is a toy” (iedere applicatie die transacties gebruikt isspeelgoed).

Een kopietje hier en een kopietje daarAls je consistentie overboord zet heb je ineens ook allerlei mogelijk-heden, zoals het denormaliseren en dupliceren van data. Mensen meteen zware achtergrond in RDBMS systemen als Oracle, DB2 en SQLServer zullen hier wellicht van gruwen, maar dit levert enorme voordelen op. Neem bijvoorbeeld data over welke emailadressen een

mailing moeten ontvangen. In het systeem waarin de emailadressenbeheerd worden is het handig om transactionele integriteit te hebben.Maar het is helemaal niet erg als de mailing een uur na een opt-outdoor een persoon toch nog naar die persoon gestuurd wordt. Het isdaarom prima om de lijst met emailadressen bij de verzendende ap-plicatie op te slaan en bijvoorbeeld middels een queue bij te werken.De performance winst die daarmee behaald wordt is gigantisch. Nu isdit niet exact Big Data, maar het is wel een voorbeeld wat goed laatzien dat de wereld niet zo zwart-wit is als het gaat om het duplicerenvan data. Een ander aspect wat hier een rol speelt is dat de gedupli-ceerde data helemaal niet in een RDBMS opgeslagen hoeft te worden.Een bestand of een andere form van BLOB-achtige opslag werkt ooken is veel goedkoper. Daardoor is het ook mogelijk om data zo op teslaan is dat deze geoptimaliseerd is voor een specifieke applicatie.Voor een andere applicatie kun je een eigen geoptimaliseerde kopiemaken.

Effectiever ontwerpenWanneer data een niet-integer duplicaat betreft, betekent dit in principe dat deze uit oorspronkelijke data af te leiden moet zijn. Gedupliceerde data is daardoor altijd weg te gooien en opnieuw op tebouwen. Dat is interessant, omdat daardoor een systeem veel fout toleranter is. Zelfs als de hardware helemaal afbrandt kan een nieuwsysteem neergezet worden. Ook oorspronkelijke data hoeft overigensniet per definitie in een RDMBS te staan, als de consistentie maar gewaarborgd is. In een gedistribueerde wereld bereik je dit met queuesin plaats van transacties. Disk replicatie kan dan weer zorgen voor debeschikbaarheid en veiligheid van de data. Slechts voor een hele kleinesubset van data is het echt nodig om transactionele integriteit te waarborgen. Voor die data kun je teruggrijpen op een RDBMS. Voorhet overige kan slim design enorm veel moeite en geld besparen. Denkdaaraan de volgende keer dat je een systeem dat veel data verwerktmoet ontwerpen en kijk naar zaken als bestandsopslag, NoSQL enBLOB-storage. Vergeet niet om na te denken over het afvoeren vandata die niet meer nodig is. Dat storage goedkoop is wil niet zeggendat je het moet verspillen. •

Zoals velen ben ik opgegroeid met het mantra dat data genormaliseerd opgeslagen moet worden en dat je moet werken met ACID transacties om data consistent te houden. Dat is leukvoor een “kleine” hoeveelheid data, maar als het gaat om terabytes, exabytes of zelfs yottabytes kunnen die mantra’s het raam uit.

Michiel van Otegem

Aflerenwat je geleerd hebt

Dat storage goedkoop is wil niet zeggen dat je het moet verspillen

Voor Big Data geldt: “Any applicationusing transactions is a toy.”

MAGAZINE

30

Page 31: SDN Magazine 118Inhoud 03 Voorwoord Marcel Meijer 04 Inhoudsopgave 04 Agenda 05 BigData: de nieuwe manier van werken Alex Arts 10 Delphi XE4 iOS Apps en Remote Data Bob Swart 15 Overview

magazine voor software development 31

SDN > Update

Delphi XE4 Update #1Vlak voor de vakantie is Delphi XE4 Update #1 uitgekomen, metdaarin een flink aantal bug fixes en verbeteringen, met name voor Fi-reMonkey toepassingen weer. Geregistreerde gebruikers van Delphiof RAD Studio XE4 kunnen de update downloaden vanhttp://cc.embarcadero.com/ item/29446. Ook is het mogelijk omde nieuwe ISO van Delphi XE4 inclusief Update #1 te downloaden.De Release Notes zijn te vinden op http://docwiki.embarcadero.com/RADStudio/XE4/en/Release_Notes_for_XE4_Update_1 en hier isonder andere te lezen dat het installeren van de patch enige tijd inbeslag kan nemen (maar het is gelukkig geen complete uninstall/install meer, zoals bij XE3 het geval was).

Een gedeeltelijke lijst met fixes is te vinden op http://edn.embarca-dero.com/article/43207 maar hier staan niet alle’intern’ (of door hetbeta-proces) gevonden en gerapporteerde bugs in, maar alleen depublieke QC zaken. Er kan dus meer opgelost zijn dan alleen in dezelijst te zien is.

Top 5Mistakes DevelopersMake When GoingMobile (and how to avoid them)

Zie http://delphi-insider.blogspot.nl/2013/07/free-report-top-5-mistakes-developers.html om een Embarca-dero White Paper te downloaden metdaarin een overzicht van de vijf groot-ste fouten die ontwikkelaars (vaak)maken als ze een toepassing geschikt maken (of migreren) naarMobile devices.

Het paper gaat ook in op de manieren om deze fouten te voorkomen, en is best interessant omte lezen.

Delphi NieuwsFireMonkeyiOS ReleaseBuildsHelaas is er ook iets omgevallen: na installatie van Delphi XE4 Update #1 hebbenmensen die iOS toepassingen maken (dus Delphi Enterprise users, of mensen metDelphi Professional en de Mobile AddOn Pack) een probleem bij het compileren vaneen RELEASE build van hun iOS project voor het iOS Device. Daarbij krijg je eenfoutmelding dat system.pas of een binair equivalent (.dcu/.o) niet gevonden kanworden. Beetje slordig natuurlijk.

Het probleem werd veroorzaakt doordat de Update #1 niet de datum/tijd van bestanden heeft aangepast die NIET door de Update #1 gewijzigd zijn. Hierdoor lijken deze ouder, en wil Delphi ze opnieuw compileren (maar kan daarbij de sourcecode niet vinden - wat meteen al bij de system.pas unit mis gaat).

De oplossing is om de SysInit.dcu en alle .o files in de Embarcadero\RAD Studio\11.0\lib\iosDevice\Release even te "touchen" zodat ze in ieder geval weernieuw zijn (en allemaal van dezelfde datum/tijd).Zie ook http://support.embarcadero.com/article/43250 voor meer details.


Recommended