bernhard mostrey new media and communication

Transcription

bernhard mostrey new media and communication
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
WEBAPPLICATIES VOOR DIGITAL SIGNAGE &
JAVASCRIPT PERFORMANCE
STAGEPLAATS: DOOHAPPS | STAGEMENTOR: MEVR SOFIE EECKEMAN | STAGEBEGELEIDER: DHR.
FREDERIK DE WACHTER
PROJECT AANGEBODEN DOOR
BERNHARD MOSTREY
VOOR HET BEHALEN VAN DE GRAAD VAN BACHELOR IN DE
NEW MEDIA AND COMMUNICATION TECHNOLOGY
HOWEST | ACADEMIEJAAR 2014-2015
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
WEBAPPLICATIES VOOR DIGITAL SIGNAGE &
JAVASCRIPT PERFORMANCE
STAGEPLAATS: DOOHAPPS | STAGEMENTOR: MEVR SOFIE EECKEMAN | STAGEBEGELEIDER: DHR.
FREDERIK DE WACHTER
PROJECT AANGEBODEN DOOR
BERNHARD MOSTREY
VOOR HET BEHALEN VAN DE GRAAD VAN BACHELOR IN DE
NEW MEDIA AND COMMUNICATION TECHNOLOGY
HOWEST | ACADEMIEJAAR 2014-2015
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
WOORD VOORAF
Deze bachelorproef is het resultaat van 3 maand samenwerking met DOOHapps.
Tijdens die 3 maand werkte ik mee met het team aan alle opdrachten die binnenkwamen en
aan de branding van het bedrijf zelf. Ik maakte verschillende demo-applicaties voor nieuwe
klanten, maakte een nieuwe website voor DOOHapps samen met een email handtekening
en visitekaartjes. Ik werkte ook mee aan de vernieuwing van de Toolbox en de Scheduler
(zie later).
Op de stageplaats leerde ik hoe het is om in een startup te werken en hoe het is om in een
team te werken. Het was een zeer goede ervaring en daarvoor wil ik hen ook bedanken.
Als hoofdproject mocht ik me ontfermen over een nieuwe soort apps die het bedrijf wil
verkopen (webapps). Onderweg onderzocht ik de structuur van de DOOHapps apps en
kwam ik meer te weten over performance bij Javascript. Deze bachelorproef is daarvan het
resultaat.
Iedereen in het bedrijf is zeer tevreden met het resultaat en ik heb bijzonder veel bijgeleerd.
Het volledige onderzoek was zeer interessant en leerrijk en is zeker een goede verrijking
vóór ik het werkveld instap.
Ik wil iedereen bedanken die mij heeft geholpen tijdens de stageperiode en uiteraard
Howest voor de fantastische opleiding.
Bernhard Mostrey
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
SAMENVATTING
In opdracht van DOOHapps maakte ik een volledige, snelle en mooie citytrip webapplicatie.
Met behulp van API’s (externe services) zoals Trip Advisor, Yelp en Foursquare worden
gegevens van restaurants (of andere plaatsen) in de buurt opgehaald. Deze worden mooi
weergegeven op een scherm waar bezoekers van hotels of publieke plaatsen snel kunnen
zien waar ze naartoe kunnen. Het project kreeg de werknaam Tripler.
Een webapplicatie is in deze context een website afgebeeld op een Digital Signage scherm
die in verbinding staat met verschillende services op het internet. Met webapps zijn er veel
nieuwe mogelijkheden, bijvoorbeeld Social Media Apps, Live Photo Apps, …
Gedurende het onderzoek heb ik ondervonden dat de prestatie van de app heel belangrijk
is. De app moest op alle apparaten afgespeeld kunnen worden (zelfs HDMI-sticks) en er
was kans dat een oudere browser gebruikt zou worden.
Zoals bij alle andere apps in het DOOHapps gamma moet de klant de mogelijkheid hebben
om instellingen te maken en de app naar het scherm te sturen zonder dat ongewenste
personen er toegang tot hebben.
Het onderzoek van deze bachelorproef bestond dus uit twee onderdelen:
1. Hoe maak ik een webapplicatie voor gebruik in een DOOH omgeving?
2. Hoe zorg ik ervoor dat die applicatie werkt op elk systeem zonder de user interface
te verstoren?
Als eerste ging ik kijken hoe de huidige apps van DOOHapps werken. Aanvankelijk waren
er 2 soorten apps, namelijk native apps en de toenmalige web apps. De native apps
bestaan uit bestanden die gekopieerd worden naar de pc en via een game-engine
uitgevoerd worden. De webapps bestaan enkel uit een URL die in een browser wordt
geopend. De nieuwe soort webapps moet de mogelijkheid hebben om via instellingen het
gedrag aan te passen en de bestanden van de website moeten voor de veiligheid op de pc
zelf staan. Er moest dus een nieuwe soort app ontwikkeld worden.
Als tweede onderzocht ik de wereld van Javascript performance. Er is hierover heel veel te
vinden en ik leerde heel veel nieuwe tips bij om toe te passen in de applicatie. Twee boeken
van Kyle Simpson leggen heel diepgaand uit hoe Javascript werkt en hoe de prestaties
verbeterd kunnen worden. Ik leerde tools kennen om de prestatie van mijn applicatie te
meten en zag na alle tweaks grote veranderingen in de laadtijden.
Als resultaat werd een volledig nieuwe soort app ontwikkeld die nu gebruikt kan worden
voor alle soorten webapps. De citytrip app werkt perfect op alle systemen (zowel mini-pc
als game-pc) en is de eerste volledig werkende webapp die onder de naam DOOHapps in
de App Store staat.
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
SYMBOLEN EN AFKORTINGEN
1. API: Application Programming Interface (plaats online waar je gegevens kan
ophalen)
2. App: applicatie
3. B2B: Business To Business
4. B2C: Business To Consumer
5. C#: programmeertaal voor Windows applicaties.
6. CMS: Content Management System (back-end beheersysteem)
7. CSS: Cascading Style Sheet: taal die wordt gebruikt om de HTML pagina van
opmaak te voorzien
8. DOOH: Digital Out Of Home
9. FPS: Frames per Second: het aantal beelden per seconde dat weergegeven wordt.
Lage FPS veroorzaakt haperend (vastlopend) beeld
10. HTML: Hyper Text Markup Language: gestructureerde taal om webpagina’s te
maken
11. JS: Javascript (programmeertaal)
1. JS: Javascript: programmeertaal gebruikt in heel veel verschillende applicaties
(website, gsm, programma, …)
12. JSON: JS Object Notation: een vorm van gegevens schrijven om vlotte overdracht te
verbeteren
13. POI: Point of Interest (interessante plaats)
14. Signage: gebruik maken van tekens of symbolen om te communiceren met een
specifieke groep mensen
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
WOORDENLIJST
1. AngularJS: uitbreiding op HTML vooral gebruikt voor Single Page websites, om
variabelen aan HTML waarden te koppelen en om lijsten eenvoudig naar HTML om
te zetten.
2. Array: een lijst van waarden
3. Asynchroon: opdracht naast andere opdrachten laten uitvoeren
4. Branding: naam, logo, slogan en design geassocieerd met een product of service
5. Call: een aanvraag voor gegevens aan een API
6. Callback: functie die wordt opgeroepen als een taak volbracht is
7. Chrome: browser van Google
8. Configurator: plaats waar instellingen kunnen gemaakt worden
9. Dribbble: website waar designers hun werk tonen aan mede-designers
10. Firefox: browser van Mozilla
11. Functie: een stuk code dat opgeslaan wordt onder een naam, waarna het meerdere
keren gebruikt kan worden door het oproepen van die naam
12. InfoWindow: de tekstballon met informatie die in Google Maps gebruikt wordt
13. Javascript: programmeertaal gebruikt in heel veel verschillende applicaties (website,
gsm, programma, …)
14. Library: een bibliotheek of verzameling van JS functies
15. Loop: herhaling van een stuk code waarbij een nummer opgeteld wordt bij elke
herhaling
16. Media Query
17. Synchroon: één actie tegelijk
18. Toolbox: deel van de DOOHapps App Store waar klanten hun apps zien, kunnen
configureren en instellen wanneer ze waar gespeeld worden
19. Tweaks: aanpassingen aan code om het programma beter te maken
20. Value: een waarde
21. Variabele: een object waar een waarde kan in opgeslagen worden
22. View: wat er te zien is op het scherm, of een deel van wat er op het scherm staat
23. Workload: de zwaarte van het programma, hoe moeilijk het is om uit te voeren
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
LIJST VAN TABELLEN EN FIGUREN
Figuur 1: DOOHapps Logo (DOOHapps) ................................................................................ 7 Figuur 2: DOOHapps ISE 2015 .............................................................................................. 11 Figuur 3: Tripler op straat ....................................................................................................... 14 Figuur 4: Wander (Dribbble) .................................................................................................. 16 Figuur 5: City Logo (Dribbble) ............................................................................................... 17 Figuur 6: Fonts ....................................................................................................................... 17 Figuur 7: Tripler logo .............................................................................................................. 17 Figuur 8: Mongoose webserver (Mongoose) ......................................................................... 20 Figuur 9: Function Declaration ............................................................................................... 21 Figuur 10: Globale Variabele (W3 Schools) ........................................................................... 22 Figuur 11: Lokale variabele (W3 Schools) ............................................................................. 22 Figuur 12: Auto globale variabele (W3 Schools).................................................................... 22 Figuur 13: Nested Scope (You Don’t Know JS) ..................................................................... 23 Figuur 14: Lexing 1 (You Don’t Know JS) .............................................................................. 24 Figuur 15: Lexing 2 (You Don’t Know JS) .............................................................................. 24 Figuur 16: Bubbles 1 (You Don’t Know JS) ............................................................................ 24 Figuur 17: Bubbles 2 (You Don’t Know JS) ............................................................................ 25 Figuur 18: Function Expression (You Don’t Know JS)............................................................ 26 Figuur 19: Closures (You Don’t Know JS) .............................................................................. 26 Figuur 20: Tripler Service ....................................................................................................... 27 Figuur 21: Tripler Settings ...................................................................................................... 28 Figuur 22: Arrays 1 ................................................................................................................. 29 Figuur 23: Arrays 2 ................................................................................................................. 30 Figuur 24: Loops 1 ................................................................................................................. 30 Figuur 25: Loops 2 ................................................................................................................. 30 Figuur 26: Console Time ........................................................................................................ 31 Figuur 27: Timeline 1 (Eigendom van Bhavin Patel) .............................................................. 31 Figuur 28: Timeline 2 (Eigendom van Bhavin Patel) .............................................................. 31 Figuur 29: Profiler Heavy (Eigendom van Bhavin Patel) ........................................................ 32 Figuur 30: Profiler Tree (Eigendom van Bhavin Patel) ........................................................... 32 Figuur 31: Timeline Result Pre ............................................................................................... 33 Figuur 32: Timeline Result Post .............................................................................................. 34 Figuur 33: Scripting Time ....................................................................................................... 34 Figuur 34: Console Time Resultaat ........................................................................................ 35 Figuur 35: Tripler resultaat ..................................................................................................... 35 WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
INHOUDSOPGAVE
WOORD VOORAF .............................................................................................................................. SYMBOLEN EN AFKORTINGEN ........................................................................................................... WOORDENLIJST ................................................................................................................................. LIJST VAN TABELLEN EN FIGUREN ...................................................................................................... SAMENVATTING ................................................................................................................................ INHOUDSOPGAVE ............................................................................................................................. 1. 1.1 1.2 1.3 INLEIDING .............................................................................................................................. 11 Wat is DOOHapps? ...................................................................................................................... 11 Collega’s ...................................................................................................................................... 12 Probleemstelling .......................................................................................................................... 12 1.3.1 Begrenzing ............................................................................................................................................................. 13 1.4 Methode ...................................................................................................................................... 13 2. 2.1 2.2 2.3 TRIPLER .................................................................................................................................. 14 Wat is Tripler? ............................................................................................................................. 14 Welk resultaat werd verwacht? .................................................................................................. 14 Welke bronnen worden gebruikt? .............................................................................................. 15 2.3.1 2.3.2 2.3.3 Trip Advisor ........................................................................................................................................................... 15 Foursquare ............................................................................................................................................................ 15 Yelp ........................................................................................................................................................................ 15 2.5.1 2.5.2 Naam ..................................................................................................................................................................... 16 Logo ....................................................................................................................................................................... 16 2.4 Welke mogelijkheden heeft de klant? ......................................................................................... 16 2.5 Visualisatie / Branding ................................................................................................................. 16 3. HOE WERKT HET MAKEN EN AFSPELEN VAN EEN APPLICATIE IN EEN DOOH OMGEVING ........ 18 3.1 Omkadering applicaties ............................................................................................................... 18 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 Providers ............................................................................................................................................................... 18 App Store ............................................................................................................................................................... 18 Media Speler ......................................................................................................................................................... 18 Native Apps ........................................................................................................................................................... 18 Web Apps .............................................................................................................................................................. 18 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 Offline gebruik ....................................................................................................................................................... 19 Oude browser ........................................................................................................................................................ 19 Branding ................................................................................................................................................................ 19 Instellingen ............................................................................................................................................................ 19 4K ........................................................................................................................................................................... 19 3.2 Implementatie Tripler .................................................................................................................. 19 3.3 Ontwikkeling nieuwe web App .................................................................................................... 20 4. HOE ZORG JE ERVOOR DAT EEN APPLICATIE ZO VLOT MOGELIJK WERKT ................................ 21 4.1 Introductie Javascript Performance ............................................................................................ 21 4.1.1 Functies ................................................................................................................................................................. 21 4.1.2 Variabelen ............................................................................................................................................................. 21 4.1.3 DOM ...................................................................................................................................................................... 22 4.1.4 jQuery .................................................................................................................................................................... 22 4.1.5 Scope ..................................................................................................................................................................... 23 4.1.5.1 Wat is de ‘Scope’ .......................................................................................................................................... 23 4.1.5.2 Hoe werkt ‘Scope’ ........................................................................................................................................ 23 4.1.5.3 Nested Scope ............................................................................................................................................... 23 4.1.5.4 Lexical scope ................................................................................................................................................ 24 4.1.5.5 Function & Block scopes .............................................................................................................................. 25 4.1.5.6 Closures ........................................................................................................................................................ 26 WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
4.1.6 Garbage collection ................................................................................................................................................ 26 4.2 Service ......................................................................................................................................... 27 4.2.1.1 Instellingen ................................................................................................................................................... 27 4.2.2 Gegevens ophalen ................................................................................................................................................. 28 4.2.2.1 Promise ........................................................................................................................................................ 28 4.2.2.2 Deffered object ............................................................................................................................................ 29 4.2.3 Gegevens verwerken ............................................................................................................................................. 29 4.2.3.1 Arrays ........................................................................................................................................................... 29 4.2.3.2 Loops ............................................................................................................................................................ 30 4.3 Kaart & Markers .......................................................................................................................... 30 4.4 Cycle ............................................................................................................................................ 30 4.5 Tools ............................................................................................................................................ 31 4.5.1 4.5.2 4.5.3 Console .................................................................................................................................................................. 31 Chrome Timeline ................................................................................................................................................... 31 Chrome Profiler ..................................................................................................................................................... 31 5. CONCLUSIES ........................................................................................................................... 33 5.1 Problemen & oplossingen ........................................................................................................... 33 5.2 Benchmarks ................................................................................................................................. 33 5.2.1 5.2.2 5.2.3 Timeline ................................................................................................................................................................. 33 Profiler ................................................................................................................................................................... 34 Console Time ......................................................................................................................................................... 34 5.3 Resultaat ...................................................................................................................................... 35 5.4 Geleerde lessen ........................................................................................................................... 35 REFERENTIELIJST ............................................................................................................................ 37 1. 1.1 1.2 1.3 1.4 DIGITALE BRONNEN ............................................................................................................... 37 Websites ...................................................................................................................................... 37 Eindwerken .................................................................................................................................. 38 Tijdschriften ................................................................................................................................. 38 Ebooks ......................................................................................................................................... 38 2. VAKSPECIALISTEN .................................................................................................................. 38 BIJLAGEN ......................................................................................................................................... 1 1. SCOPE IN ANGULARJS ............................................................................................................... 1 1.1 Scopes & Digest cycle .................................................................................................................... 1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 Scopes ..................................................................................................................................................................... 1 $Watch .................................................................................................................................................................... 1 $Watchers ............................................................................................................................................................... 1 Digest cycle .............................................................................................................................................................. 1 $scope.$apply ......................................................................................................................................................... 1 WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
1. INLEIDING
1.1 WAT IS DOOHAPPS?
DOOHapps is een startup in Gent dat zich specialiseert in het verkopen/verspreiden van
interactieve applicaties voor gebruik in een bedrijf of in de retail (Logo: figuur 1).
Bedrijven/zelfstandigen die op een leuke manier bezoekers willen entertainen en tegelijk
hun brand promoten kunnen bij DOOHapps terecht voor het volledige pakket (scherm, pc
en applicatie).
Om zich volledig op het verkopen te kunnen specialiseren worden de apps niet binnenshuis
gemaakt, daarvoor worden applicatieproviders aangesproken. Deze providers maken de
apps en leveren ze samen met configuratiemogelijkheden aan bij
DOOHapps.
Deze apps komen in de App Store te staan en worden verkocht
onder de naam DOOHapps. De klanten kunnen zich registeren op
de website, bladeren door de verschillende beschikbare apps en
uiteindelijk een app kopen of huren om te gebruiken in hun bedrijf
Figuur 1: DOOHapps Logo
(DOOHapps)
of winkel.
Hierna kan de app ook geconfigureerd worden met de Toolbox van DOOHapps om de
foto’s, logo, animatie, etc… aan te passen.
Als bezoekers langskomen bij een opstelling van DOOHapps zien ze onmiddelijk animaties
op het scherm en kunnen ze ermee interageren. Dit werkt veel beter dan een gewone
poster aan de muur (figuur 2).
Figuur 2: DOOHapps ISE 2015
11
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
1.2 COLLEGA’S
In de afdeling te Gent zijn er 3 vaste werknemers. Er wordt ook gebruik gemaakt van een
team programmeurs in Riga waar ook de investeerders zitten.
Frederik De Wachter is de Innovation Manager van DOOHapps. Concreet houdt hij zich
bezig met het algemeen bestuur van het bedrijf en prospectie van nieuwe klanten.
Frederik Vroman is al jaren expert op het vlak van DOOH. Hij gebruikt zijn uitgebreid
netwerk om klanten te vinden voor DOOHapps.
Michaël Boone is de technische expert in Gent. Hij zorgt ervoor dat alle pc’s goed
functioneren en alle apps vlot werken bij de klant. Hij staat ook in voor de communicatie met
het team in Riga.
1.3 PROBLEEMSTELLING
Als nieuwe uitdaging wil DOOHapps een nieuwe weg ingaan en starten met het maken en
verkopen van webapplicaties, in tegenstelling tot alle native apps die nu verkocht worden.
Een native app bestaat uit een map bestanden en een instellingenbestand. Nadat alle
instellingen gemaakt zijn worden alle bestanden naar de pc gekopieerd en worden ze
lokaal opgestart met behulp van een game-engine. Er is weinig communicatie met het
internet, de app kan dus volledig offline werken.
Het nadeel van native apps is dat externe services (API’s) minder gemakkelijk
aanspreekbaar zijn vanuit zo’n app en zij moeilijker te ontwikkelen zijn dan een website.
De huidige webapps hebben als enige instelling een URL die het programma opent en
toont op het scherm. Dit is dus ook de enige instelling die mogelijk is met de huidige
webapps.
De webapp is handig om websites te tonen die geen instellingen vereisen of die op de
server van DOOHapps staan, maar vanaf dat de gebruiker de mogelijkheid moet krijgen om
aanpassingen te maken is er een probleem.
Om dit op te lossen werd een nieuwe soort app gemaakt.
Heel belangrijk bij deze nieuwe soort app is dat hij vlot werkt op een lichte pc, dat hij offline
kan werken en dat hij aanpasbaar is. Verder is het ook belangrijk dat de klant de
belangrijkste instellingen zelf kan aanpassen.
Er werden dus 2 onderwerpen onderzocht:
1. Hoe maak ik een webapplicatie voor gebruik in een DOOH omgeving?
2. Hoe zorg ik ervoor dat die applicatie werkt op elk systeem zonder de user interface
te verstoren?
12
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
1.3.1 BEGRENZING
Uiteraard kan ik in deze bachelorproef niet de volledige werking van Javascript
onderzoeken. In dit onderzoek leg ik een paar van de begrippen uit die belangrijk zijn bij de
performance van Javascript. Alle optimalisaties die ik bespreek werden toegepast in de
citytrip app.
1.4 METHODE
Als eerste leerde ik werken met de huidige apps van DOOHapps. Van aankoop tot
instellingen tot uitvoeren. Ik leerde de verschillende soorten apps kennen en wat hun
mogelijkheden zijn. Daarna ging ik stap voor stap kijken welke instellingen de klant zou
nodig hebben in Tripler en hoe ik deze zou implementeren in de applicatie. Ik onderzocht
ook welke extra functies de nieuwe webapps moesten hebben om te kunnen werken in een
DOOH omgeving. Pas als die vragen opgelost waren kon een nieuwe soort app ontwikkeld
worden.
Als tweede onderzocht ik de wereld van Javascript performance. Er is hierover heel veel te
vinden en ik leerde heel veel nieuwe tips bij om toe te passen in de applicatie. Twee boeken
van Kyle Simpson leggen heel diepgaand uit hoe Javascript werkt en hoe de prestaties
verbeterd kunnen worden. Stap voor stap kon ik veel tips toepassen op de applicatie en
met behulp van verschillende tools meten of deze invloed hadden op de prestaties.
Pas als alle optimalisaties toegepast waren kon de app getest worden in de DOOHapps
omgeving.
13
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
2. TRIPLER
2.1 WAT IS TRIPLER?
Figuur 3: Tripler op straat
Tripler (figuur 3) kan je kort beschrijven als een citytrip app (denk aan de Trip Advisor app).
Toeristen of bezoekers die naar de app kijken kunnen meer info krijgen over restaurants of
winkels in de buurt samen met hun rating, laatste review en openingsuren.
Aan de hand van een grote kaart zien ze snel waar ze zelf zijn en waar de POI’s (Point of
Interest) zich bevinden. Ook is het mogelijk om details van een POI te bekijken, de rating te
bekijken of zelf een rating te geven door de QR-code in te scannen.
Eventueel komt er ook sociale media bij, evenementen in de buurt, etc... Er zijn heel veel
mogelijkheden. Na onderzoek naar de meest bruikbare informatie kon duidelijk bepaald
worden welke informatie precies getoond wordt.
2.2 WELK RESULTAAT WERD VERWACHT?
De app zal uiteindelijk op een tv scherm getoond worden op publieke plaatsen of bedrijven
(bv. hotels). Het doel is dat de toeristen gemakkelijk de app kunnen gebruiken en ook echt
geholpen zijn met de informatie die ze krijgen.
De informatie die een toerist verwacht moet ook te zien zijn op het scherm of moet kunnen
opgevraagd worden.
Daarbovenop moet de applicatie zoals de huidige native apps blijven werken bij verlies van
een internetconnectie, mag deze niet toegankelijk zijn voor niet-klanten, 4K schermen
ondersteunen, vlotte animaties tonen en langdurig blijven werken.
14
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
2.3 WELKE BRONNEN WORDEN GEBRUIKT?
Vóór de ontwikkeling van de app kon starten onderzocht ik alle API’s, zodat beslist kon
worden welke uiteindelijk gebruikt zouden worden.Vooral de informatie die beschikbaar is
en welke limieten er zijn is belangrijk voor deze keuze.
2.3.1 TRIP ADVISOR
Aan het gebruik van de Trip Advisor API zijn een paar regels verbonden. Deze mag niet
gebruikt worden voor applicaties bestemd voor Data Analysis of Academic Research en
niet voor websites die niet B2C (Business To Consumer) gericht zijn.
Na inschrijven op de API kunnen er 1000 ‘calls’ per dag gemaakt worden. Wanneer een
werkend prototype gemaakt is, kan Trip Advisor gecontacteerd worden om 10000 ‘calls’ per
dag te krijgen.
De informatie die we van de API krijgen:
•
Tot 10 restaurants, attracties of accommodaties (POI)
•
Business details voor elke POI
De Business Details bestaan uit:
•
Locatie ID, naam, adres, latitude en longitude
•
Link om reviews lezen en schrijven
•
Rating, ranking, sub ratings, awards, aantal reviews, rating image
•
Prijs level symbool, categorie en subcategorie, attractietype en keuken
•
Drie meest recente review snippets van maximum 200 karakters
De resultaten kunnen gefilterd worden op categorie, subcategorie, keuken en attractietype.
2.3.2 FOURSQUARE
Foursquare is losser in de toegang van de API. Er zijn verschillende zoekmethodes, in dit
project wordt vooral ‘Venue Explore’ gebruikt. ‘Venue Search’ kan eventueel ook gebruikt
worden om naar specifieke locaties te zoeken. Zonder in te loggen is er een limiet van 5000
‘calls’ per uur wat voldoende is voor Tripler.
Volgende gegevens zijn beschikbaar bij ‘Venue Explore’:
•
Venue: ID, naam, contact
•
Locatie: Adres, latitude en longitude
•
Categorie + icoon
•
Aantal check-ins & tips
•
Rating
•
Openingsuren
•
Foto’s
2.3.3 YELP
15
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Yelp gebruikt Oauth autorisatie voor alle API requests wat moeilijker is om te implementeren
maar dan wel geen limieten oplegt. Via de Search API kan gezocht worden naar
‘Businesses’ in de buurt. Er kan gezocht worden op locatie, zoekterm, categorie en deals.
Volgende gegevens krijgen we in de response:
•
ID, is claimed, closed, naam, image, URL, telefoon
•
Aantal reviews, categorieën, afstand, rating
•
Snippet
•
Adres
•
Deals
•
Gift
•
Menu
2.4 WELKE MOGELIJKHEDEN HEEFT DE KLANT?
De klant heeft de mogelijkheid om de applicatie aan te passen naar zijn wensen met behulp
van de Toolbox.
Hier kan de klant zijn eigen branding toepassen en zal hij onder ander kunnen kiezen welke
API gebruikt wordt en of zijn eigen bedrijf op de kaart getoond wordt.
Uiteindelijk zullen er nog meer instellingen toegevoegd worden.
2.5 VISUALISATIE / BRANDING
2.5.1 NAAM
Na een inside brainstormsessie was het beste resultaat Tripler. Dit ligt in het verlengde van
veel nieuwe start-ups die gelijkaardige methodes gebruiken (onder andere Hoplr).
2.5.2 LOGO
Voor het logo werd de inspiratie gehaald uit onderstaande shots van Dribbble. Heel
minimalistisch design (figuur 4) en werken met felle kleuren (figuur 5) is nu in.
Figuur 4: Wander (Dribbble)
16
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 5: City Logo (Dribbble)
Het is dus een combinatie van twee designtrends geworden: figuur 4 minimalisme en figuur
5 flat / material design.
Voor de tekst die bij het logo hoort werd Proxima Nova gebruikt, van de 19 onderstaande
lettertypes (figuur 6) werd deze er als beste uitgekozen.
Figuur 6: Fonts
Het logo en de tekst werden gecombineerd om de branding van Tripler te demonstreren
(figuur 7).
Figuur 7: Tripler logo
17
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
3. HOE WERKT HET MAKEN EN AFSPELEN VAN EEN
APPLICATIE IN EEN DOOH OMGEVING
3.1 OMKADERING APPLICATIES
3.1.1 PROVIDERS
Alle applicaties die te koop zijn in de DOOHapps App Store worden gemaakt door ‘App
Providers’ (een professioneel team van programmeurs). De apps worden aanpasbaar
gemaakt en geïmplementeerd in de App Store.
3.1.2 APP STORE
De DOOHapps App Store is vergelijkbaar met de Apple App Store. Er is een mooi overzicht
te zien van alle beschikbare apps en hun prijs. Na aankoop van een app kan deze
geconfigureerd worden in de Toolbox.
3.1.3 MEDIA SPELER
Elke klant dient naast zijn app ook te beschikken over een pc waar de app op zal draaien.
Hiernaar wordt verwezen als media speler. Nadat de app geconfigureerd is kan deze naar
het aangesloten scherm gestuurd worden voor een bepaalde tijd op een bepaald tijdstip.
3.1.4 NATIVE APPS
De huidige apps in het DOOHapps gamma zijn Native apps. Dit wil zeggen dat de app
bestaat uit een map bestanden en een instellingenbestand. Nadat alle instellingen gemaakt
zijn worden alle bestanden naar de pc gekopieerd en worden ze lokaal opgestart met hulp
van een game engine. Eens alle bestanden gekopieerd zijn is er meestal geen
communicatie meer met het internet en kan de app dus volledig offline werken.
Het nadeel van native apps is dat externe services (API’s) minder gemakkelijk
aanspreekbaar zijn vanuit zo’n app.
3.1.5 WEB APPS
De huidige webapp heeft als enige instelling een URL die het programma opent en toont op
het scherm. Dit is dus de enige instelling die mogelijk is met de web app.
De web app is handig om websites te tonen die geen instellingen vereisen of die op de
server van DOOHapps staan. Maar vanaf dat de gebruiker de mogelijkheid moet krijgen om
aanpassingen te maken is er een probleem.
Om dit op te lossen werd een nieuwe soort app gemaakt.
Heel belangrijk bij die nieuwe soort app was dat hij vlot werkt op een lichte pc, dat hij offline
kan werken en dat hij aanpasbaar is. Verder is het ook belangrijk dat de klant de
belangrijkste instellingen zelf kan aanpassen.
18
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
3.2 IMPLEMENTATIE TRIPLER
3.2.1 OFFLINE GEBRUIK
Omdat internet niet altijd beschikbaar is bij de opstelling van een klant moeten alle apps
ook zonder internet kunnen werken.
Dit is wat moeilijker bij een web app omdat alle gegevens van externe services komen.
Om dit op te lossen werd er in het instellingen bestand een array toegevoegd (genaamd
Businesses). Deze wordt ingevuld bij de eerste opstart van de website en zal gebruikt
worden indien er geen internet beschikbaar is.
3.2.2 OUDE BROWSER
Het is mogelijk dat de webapp in een oudere browser zal moeten werken. Hierdoor kan het
zijn dat bepaalde functionaliteiten niet ondersteund worden of dat de website trager werkt.
Om dit tegen te gaan gebruikte ik alleen functies die in alle browsers werken en pastte ik
alle prestatietips toe uit het performance onderzoek.
3.2.3 BRANDING
De klant moet mogelijkheid hebben om de website aan te passen naar de branding van het
bedrijf. Daartoe zijn het logo en de kleuren over heel de webapp instelbaar.
3.2.4 INSTELLINGEN
De klant moet de mogelijkheid hebben om veel instellingen te maken. Dit is zo bij de
huidige apps van DOOHapps en moet doorgetrokken worden naar de webapps.
Instellingen die zeker mogelijk moeten zijn:
•
Map Locatie
•
Map Zoom Level
•
Map Zoekterm
•
Map POI Limiet
•
Klant Logo
•
Klant Kleuren
•
Klant Slogan
•
Eigen Bedrijf Op Kaart
•
Reviews Geven
3.2.5 4K
Bij sommige klanten worden apps getoont op een 4K scherm. Het is dus belangrijk dat de
website ook goed getoond wordt op zo’n grote resolutie. Hiervoor worden Media Queries
gebruikt.
19
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
3.3 ONTWIKKELING NIEUWE WEB APP
Een combined app bestaat uit twee delen:
•
Een lokale map met alle HTML, CSS, JS, … bestanden.
•
Een lokale server waar enkel het instellingenbestand op staat.
Verschillende browsers (zoals Chrome) kunnen geen JSON bestanden inlezen die niet op
een server staan. Hierdoor zal het JSON bestand met alle instellingen dus van een lokale
webserver gelezen moeten worden.
In Firefox werkt het lokaal inlezen van JSON bestanden echter wel. Indien er met Firefox
gewerkt wordt om de website te openen is de lokale server dus overbodig.
3.3.1 WERKING
Op de servers van DOOHapps wordt een kopie gemaakt van alle bestanden van de
website. Nadat een klant de citytrip app gekocht en geconfigureerd heeft worden alle
instellingen opgeslagen naar een JSON bestand en wordt het samen met de andere
bestanden naar de media speler gekopieerd.
Als lokale webserver wordt Mongoose (figuur 8) gebruikt. Dit is een lightweight webserver
die als één bestand gedownload kan worden. Dit bestand wordt dus ook naar de media
speler gekopieerd. Wanneer de applicatie moet worden opgestart, start Mongoose ook op
in dezelfde map als de website en wordt een browser geopend die naar de Mongoose
webserver verwijst. Daarna wordt de browser in full screen gezet en is de applicatie
volledig opgestart.
Figuur 8: Mongoose webserver (Mongoose)
20
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
4. HOE ZORG JE ERVOOR DAT EEN APPLICATIE ZO VLOT
MOGELIJK WERKT
Om ervoor te zorgen dat de applicatie perfect blijft werken in oudere browsers of op lichte
pc’s werd onderzoek gedaan naar performance in Javascript en AngularJS.
Eerst werd er gekeken naar enkele basistechnieken die kunnen worden toegepast bij het
schrijven van Javascript om de code sneller/minder zwaar te maken. Hierbij wordt
aangetoond hoe variabelen het best gedeclareerd worden, hoe best wordt omgegaan met
data en wat ‘garbage collection’ is.
Daarna volgen we de structuur van het programma. Eerst wordt er een ommanteling
gemaakt om de code in te bewaren.
Daarna wordt er gecommuniceerd met de verschillende API’s en worden de teruggegeven
gegevens verwerkt. Dit alles gebeurt met de hulp van ‘Promises’ of een ‘Deferred object’.
Achteraf worden de gegevens gelinkt met de Google Maps kaart en worden markers
aangemaakt.
Als laatste wordt de snelheid van het programma gemeten met verschillende tools.
4.1 INTRODUCTIE JAVASCRIPT PERFORMANCE
4.1.1 FUNCTIES
Als een deel code meerdere malen gebruikt wordt, steek je deze best in een functie. Zo kan
je de code altijd oproepen zonder ze opnieuw aan te maken.
Functies kunnen ook gelinkt worden aan variabelen. Dit kan nodig zijn in sommige gevallen,
maar dat zorgt er voor dat de functie niet opgeruimd kan worden (figuur 9).
Figuur 9: Function Declaration
4.1.2 VARIABELEN
Eerst en vooral zijn er variabelen. Een variabele is een object waar men waarden in kan
opslaan. Een variabele kan als lokale of globale variabele aangemaakt worden.
Een variabele kan gemaakt worden als globale variabele. Dit wil zeggen dat ze toegankelijk
is over het gehele programma. In dit geval wordt de variabele aangemaakt buiten alle
functies (figuur 10).
21
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 10: Globale Variabele (W3 Schools)
Wanneer een variabele enkel nodig is in de huidige functie is het beter om er een lokale
variabele van te maken. In dit geval wordt ze binnen de functie aangemaakt (figuur 11).
Figuur 11: Lokale variabele (W3 Schools)
Let wel op. Indien er geen ‘var’ voor de variabelenaam staat, wordt het direct een globale
variabele (figuur 12).
Figuur 12: Auto globale variabele (W3 Schools)
4.1.3 DOM
De invoer van het DOM of Document Object Model heeft HTML bestanden veranderd van
tekst met opmaak naar gestructureerde documenten met afzonderlijke objecten. Door het
DOM is het mogelijk om vanuit Javascript toegang te krijgen tot die objecten in je HTML
document.
Toegang tot het DOM is echter heel traag en wordt dus best zo weinig mogelijk gedaan.
Ook inline stijlen toewijzen bij het aanpassen van het DOM is afgewezen.
Hier komt AngularJS van pas. AngularJS zorgt voor heel veel communicatie met de DOM en
doet dit waarschijnlijk ook beter dan als je het zelf zou doen met bijvoorbeeld: jQuery.
4.1.4 JQUERY
JQuery is een bibliotheek van verschillende functies als toevoeging aan Javascript. Door
jQuery te gebruiken kunnen vaak complexe taken heel gemakkelijk uitgevoerd worden,
maar is wel belastend.
22
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
4.1.5 SCOPE
Om meer inzicht te krijgen in de diepe werking van Javascript en zijn performance moest ik
eerst weten wat de ‘Scope’ is.
Kyle Simpson beschrijft in zijn boek (2014) wat scopes zijn, hoe ze werken en hoe je ze
gebruikt. Het belangrijkste is hier samengevat.
4.1.5.1 Wat is de ‘Scope’
In veel programmeertalen zoals Javascript worden variabelen gebruikt om gegevens op te
slaan en weer op te halen. Zonder dit proces is een programma maken zo goed als
onmogelijk. Hierbij zijn er twee ultieme vragen: waar worden deze variabelen opgeslagen
en hoe vindt ons programma ze terug? Het antwoord zit in de ‘Scope’. De ‘Scope’ is een set
regels voor het opslaan in een locatie en ophalen op een later tijdstip van variabelen.
4.1.5.2 Hoe werkt ‘Scope’
Om te leren hoe de ‘Scope’ werkt kijken we eerst naar het proces dat de code aflegt
alvorens ze uitgevoerd wordt. Bij Javascript wordt de code niet op voorhand gecompileerd
zoals C#. De code wordt net vóór het uitvoeren gecompileerd in enkele milliseconden.
Bij dit proces zijn er 3 grote spelers:
•
Engine (verantwoordelijk voor compilatie en executie van begin tot eind)
•
Compiler (verantwoordelijk voor al het werk i.v.m. code-generatie)
•
Scope (verzamelt en onderhoudt een lijst van variabelen met behoud van de regels
voor het ophalen van die variabelen)
In het kort, bij het overlopen van de code converseert de engine constant met de scope
over variabelen die de compiler tegenkomt.
4.1.5.3 Nested Scope
In sommige gevallen vindt de Scope de gevraagde variabele niet in de huidige functie. In
dat geval moet er in de scope van de omringende functie gekeken worden. Dit kan de
global scope of een andere functie zijn.
Bekijk dit voorbeeld (figuur 13):
Figuur 13: Nested Scope (You Don’t Know JS)
Hier is variabele b niet gedeclareerd binnen de functie, dus wordt deze niet gevonden bij
de eerste look-up, maar wel bij de 2e look-up waar hij wel gedeclareerd staat.
23
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
4.1.5.4 Lexical scope
De meest gebruikte manier om variabelen te beheren is ‘Lexical Scope’ (de andere is
‘Dynamic Scope’). Dit verwijst naar Lexing of Tokenizing. Dit is het proces dat de compiler
als eerste uitvoert bij het overlopen van de code.
Bij Tokenizing wordt een string van karakters opgedeeld in ‘tokens’ die meningsvol zijn.
Bijvoorbeeld:
Figuur 14: Lexing 1 (You Don’t Know JS)
Wordt omgezet naar:
Figuur 15: Lexing 2 (You Don’t Know JS)
Zo weet de compiler veel duidelijker wat er met elk deel moet gebeuren.
De ‘Lexical Scope’ past hetzelfde systeem toe op grote delen code. Bijvoorbeeld:
Figuur 16: Bubbles 1 (You Don’t Know JS)
Wordt opgedeeld in 3 ‘Bubbles’.
24
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 17: Bubbles 2 (You Don’t Know JS)
Elke ‘Bubble’ heeft zijn eigen scope en heeft toegang tot variabelen in zijn scope en de
omringende scope.
Maar niet omgekeerd. Zo heeft Bubble 1 geen toegang tot variabele b en dat is waar
scopes net zo belangrijk zijn. Delen code die niet direct leesbaar mogen zijn voor het hele
programma kunnen dus ‘verstopt’ worden in een functie.
4.1.5.5 Function & Block scopes
Een scope wordt meestal gedefinieerd door het maken van een functie. Dit is in de meeste
gevallen voldoende, maar soms kan een scope ook expliciet gemaakt worden.
Dit kan op twee manieren:
•
Delen code verzamelen in een namespace.
•
Delen code verzamelen in een module.
Dat laatste is verwant met wat gebruikt wordt in Tripler, maar dan als het Angular alternatief
(Angular Service).
Functies maken om je code meer privaat te maken lijkt dus een goed idee, en dat is het
ook. Elke functie die wordt gemaakt krijgt een naam (function declaration) en daarmee vul je
de scope, wat dan weer slecht is voor de performance.
Om dit te voorkomen is er een systeem genaamd ‘function expression’ (figuur 18). Hiermee
kan je een functie maken (en direct uitvoeren) zonder het een naam te geven. Dit ziet er zo
uit:
25
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 18: Function Expression (You Don’t Know JS)
Een ‘function expression’ wordt meestal direct uitgevoerd (door () achteraan toe te voegen)
omdat het oproepen van de functie alleen maar kan met verouderde taken. Alles hangt er
dus van af of de functie op een later tijdstip nog opgeroepen moet worden of niet.
4.1.5.6 Closures
Een ‘closure’ wordt automatisch gemaakt bij de code die geschreven wordt. Bekijk
onderstaand voorbeeld:
Figuur 19: Closures (You Don’t Know JS)
De functie ‘bar’ wordt direct teruggestuurd bij het einde van de functie ‘foo’. Bij het
oproepen van de functie ‘foo’ in variabele ‘baz’ wordt dus eigenlijk de functie ‘bar’ gebruikt.
Door de functie op te slaan in een variabele zal de functie niet verwijderd worden als de
garbage collector gepasseerd is. Op die manier kan de functie ‘bar’ dus steeds aan alle
variabelen in zijn scope. Dit noemt men een closure.
4.1.6 GARBAGE COLLECTION
Garbage collection is een vorm van geheugen opruimen bij Javascript. Je kan het
gemakkelijker voorstellen als een poetsman die constant bezig is (namelijk de collector).
De collector houdt bij welke objecten gebruikt en niet meer gebruikt worden en verwijdert
diegene die niet meer nodig zijn.
Hierin komen functies, variabelen en scopes tezamen. Wanneer code in een bepaalde
scope niet meer gebruikt wordt kan deze opgeruimd worden, maar als er objecten van
buiten de huidige scope gebruikt worden, kan er veel minder gekuist worden. De collector
weet echter niet of je nog iets van plan bent met die code.
26
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Hetzelfde geldt met globale of lokale variabelen. Lokale variabelen kunnen veel sneller
opgeruimd worden dan globale omdat hiervan beter bepaald kan worden of het nog nodig
is of niet.
4.2 SERVICE
Om de volledige code leesbaar, overzichtelijk en beter afgeschermd te maken wordt een
Angular Service gemaakt. Services zijn objecten die verschillende stukken code bevatten
die georganiseerd en gedeeld kunnen worden. Het is vergelijkbaar met een Javascript
module.
Hierin worden alle taken samengevat die het programma nodig heeft om te werken.
Korte inhoud:
•
Arrays
•
Instellingen ophalen en opslaan
•
Bronnen ophalen en verwerken
•
Foto’s toevoegen, url verkorten, eigen bedrijf toevoegen
Hieronder een voorbeeld van de Tripler Service (figuur 20).
Figuur 20: Tripler Service
4.2.1.1 Instellingen
Zoals eerder vermeld heeft de klant de mogelijkheid om verschillende instellingen te maken.
Deze instellingen worden via de Toolbox gemaakt en worden mee gekopieerd met de
website.
Om de instellingen gemakkelijk in en uit te lezen met Javascript wordt JSON gebruikt. JSON
is een manier om gegevens te noteren in Javascript. Omdat altijd dezelfde structuur
gevolgd wordt verloopt het in- en uitlezen veel sneller.
Hieronder een voorbeeld van het instellingenbestand van Tripler (figuur 21).
27
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 21: Tripler Settings
4.2.2 GEGEVENS OPHALEN
Na het ophalen van de instellingen kunnen de gegevens van de geselecteerde API
opgehaald worden. Omdat dit grote lijsten zijn zou dit normaal de interface voor enkele
seconden blokkeren. Om dit te voorkomen worden de gegevens asynchroon opgehaald.
Vanaf de 6e versie van de Javascript Engine worden nieuwe functies toegevoegd om acties
asynchroon uit te voeren, namelijk Promises.
Normaal verloopt de code in een Javascript bestand synchroon (na elkaar). Wat niet wil
zeggen dat dit exact van boven naar onder is (functies komen altijd eerst). Dit kan ervoor
zorgen dat je programma even vast lijkt te zitten bij grote taken. En dat is storend voor de
gebruiker.
Om de opdracht naast andere taken te doen lopen, gebruiken we asynchrone functies,
waaronder Promises.
In 2015 schrijft Kyle Simpson een boek over asynchrone code en performance bij
Javascript, hier heb ik heel veel uit geleerd.
Alle communicatie met externe services verloopt asynchroon om de user interface niet te
verstoren. Bij het initieel laden van de gegevens wordt een laad-animatie getoond.
4.2.2.1 Promise
Stel, je bent in een snackbar en bestelt een hamburger. Meestal is de hamburger (noemen
we ‘future value’) niet direct klaar en moet je wachten. Om te bevestigen dat je wel degelijk
recht hebt op een hamburger krijg je een ticket (‘promise’). Dus houd je je ticket bij en
wacht je op de hamburger, in tussentijd kan je nog verschillende andere taken doen, zoals
even iemand bellen, of de krant lezen. Je weet dat de hamburger er ooit komt dus moet je
niet blijven wachten zonder iets te doen. Na een paar minuten word je ticketnummer
afgeroepen en kan je je bestelling gaan afhalen (resolve).
Dit is een alledaags concept, maar was voor de invoering van Promises moeilijk te bereiken
in Javascript.
28
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Er zijn 3 hoofdconcepten bij een Promise.
1. Promise: er wordt beloofd om ooit (onbepaald wanneer) een waarde terug te geven
2. Resolve: de taak is gelukt en een waarde wordt teruggegeven
3. Reject: er is ergens iets verkeerd gegaan, maar je krijgt wel een waarde terug
Heel belangrijk aan een Promise is dat er ALTIJD een waarde wordt teruggegeven.
De variant van Promises in jQuery noemt men een Deferred Object.
4.2.2.2 Deffered object
Een deferred object is de variant van een ‘promise’ in jQuery.
Het object kan verschillende callback queues registeren, callback queues starten en het
succes of falen van elke synchrone of asynchrone functie doorgeven.
Een deferred object wordt heel veel gebruikt wanneer data van een andere server wordt
opgehaald en wanneer men niet weet wanneer de data zal toekomen.
Door een deferred object te gebruiken in de code is er veel meer controle over de interface.
Er kan zelf gekozen worden wanneer en wat er op het scherm getoond wordt en er wordt
feedback gegeven als er iets misloopt.
In onze service gebruik ik een deferred object voor het ophalen van gegevens bij elke API.
4.2.3 GEGEVENS VERWERKEN
De grote lijst die van de API is opgehaald wordt best eerst verwerkt voor ze naar de Scope
wordt gestuurd.
Pas nadat alle POI’s opgehaald zijn en alle bewerkingen voltooid zijn wordt de array
toegevoegd aan de scope. Dit opdat de scope niet telkens aangesproken zou worden.
Abraham Polishchuk beschrijft in zijn blog verschillende tips voor prestatieverbetering in
Javascript, samen met nog andere leg ik hieronder de belangrijkste uit die ik heb toegepast
op de citytrip app.
4.2.3.1 Arrays
Grote arrays verbruiken meer. Hou ze dus zo klein mogelijk. Laadt bij het inladen van data
(extern of intern) alleen de nodige objecten in. Definieer je array ook zoveel mogelijk op
voorhand. Zo weet JS direct welke performance tweaks hij kan uitvoeren op de array.
Een array gebruiken (figuur 22) werkt sneller dan een object met verschillende waarden
(figuur 23).
Figuur 22: Arrays 1
29
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 23: Arrays 2
4.2.3.2 Loops
Elke loop in JS heeft een grote invloed op de performance van de code. Het is dus
belangrijk om zo weinig mogelijk loops te schrijven en om ze zo klein mogelijk te houden.
Elke call die buiten de loop gemaakt kan worden wordt best erbuiten gemaakt. Ook
variabelen die niet binnen de loop veranderen maakt je best erbuiten (figuur 24 & 25).
Figuur 24: Loops 1
Figuur 25: Loops 2
4.3 KAART & MARKERS
De integratie van Google Maps in de webapp gebeurt met ‘Angular Google Maps’. Dit is
een set van directives om de integratie van Google Maps vlot te doen verlopen in Angular
en om de objecten (die we ophalen van de API) te integreren in de kaart als markers.
Markers zijn de kleine icoontjes die je op de kaart ziet. Doordat we Angular gebruiken kan
op een efficiënte manier een marker toegewezen worden voor elk object in onze lijst. Het
logo van de marker kan gedefinieerd worden bij het verwerken van de lijst in de vorige stap.
Wanneer op een marker geklikt wordt, komt een InfoWindow tevoorschijn. Hier tonen we de
meest relevante informatie die we van de API’s krijgen. De inhoud van dit venster wordt ook
bepaald bij het verwerken van de lijst.
4.4 CYCLE
Omdat er geen besturing is met muis of beweging moesten we op zoek naar andere
mogelijkheden om zoveel mogelijk informatie te tonen op het scherm.
Opdat het scherm niet té gevuld zou zijn koos ik ervoor om om de beurt een InfoWindow te
openen. Bij het laden van de kaart wordt de lijst van POI’s in willekeurige volgorde
gebracht. Daarna opent een AngularJS interval functie om de 10 seconden de volgende
InfoWindow. Dit noem ik de ‘cycle’.
30
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
4.5 TOOLS
Bij het toepassen van alle prestatietips wou ik natuurlijk weten of het een positieve invloed
had op de app. Om de prestaties van je website te meten zijn er veel tools die gebruikt
kunnen worden. De 3 tools hieronder werken zonder extra installaties in Google Chrome.
4.5.1 CONSOLE
De console is al een zeer krachtige tool, maar wat velen niet weten is dat je hem ook kan
gebruiken als performance checking tool.
Met behulp van Console.Time en Console.TimeEnd kan je heel snel zien hoeveel tijd een
stuk code nodig heeft om uitgevoerd te worden (figuur 26).
Figuur 26: Console Time
4.5.2 CHROME TIMELINE
De timeline toont overzichtelijk welke processen de website vertragen. Om een vlotte
website te hebben is het aangeraden om rond de 60 fps lijn te blijven. JS optimalisaties en
optimalisatie van je loops kunnen hierbij helpen.
Een goed voorbeeld uit de blog van Bhavin Patel uit 2015 hieronder (figuur 27 & 28). Eerst
vóór de optimalisaties, als tweede na de optimalisaties. Natuurlijk verbruiken sommige
stukken code gewoon veel en zullen die voor enkele milliseconden de website belasten.
Figuur 27: Timeline 1 (Eigendom van Bhavin Patel)
Figuur 28: Timeline 2 (Eigendom van Bhavin Patel)
4.5.3 CHROME PROFILER
In de profiler kan nog beter gezien worden op welke lijn in welk bestand een stuk code
wordt uitgevoerd en hoeveel tijd het inneemt. Er zijn 3 views. De chart view die veel op de
timeline lijkt maar het gemakkelijker maakt om naar een stuk code te navigeren.
De Heavy (bottom up) view identificeert de zware user functies en toont de call stack
omgekeerd (figuur 29). Dit om gemakkelijk de origine van de functie terug te vinden
31
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 29: Profiler Heavy (Eigendom van Bhavin Patel)
De Tree (top down) view toont de functies van boven naar beneden. Op die manier kan snel
gezien worden vanwaar de zware functie origineert (figuur 30).
Figuur 30: Profiler Tree (Eigendom van Bhavin Patel)
32
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
5. CONCLUSIES
5.1 PROBLEMEN & OPLOSSINGEN
5.1.1 NIEUWE APP
Omdat de oude webapp geen mogelijkheid had om instellingen te maken en de website op
een externe server moest staan was het niet mogelijk om daarmee verder te werken.
In samenwerking met het team in Riga en Michaël werd een volledig nieuwe app ontwikkeld
die alle nodige bestanden naar de media speler kopieert en daarna de website opstart
vanaf een lokale webserver (Mongoose).
Deze app kan vanaf nu gebruikt worden voor alle webapps die door het team of door
externe bedrijven gemaakt worden.
5.1.2 INSTELLINGEN
De native applicaties kunnen gemakkelijk fysieke bestanden uitlezen, met Javascript is dit
wat moeilijker. Dus werd besloten om alle instellingen die in de Toolbox gemaakt worden
om te zetten naar een JSON bestand dat mee gekopieerd wordt naar de media speler. Met
behulp van de lokale webserver kan dit JSON bestand uitgelezen worden.
5.1.3 ZWAAR BELASTENDE APP
Bij de eerste versie van Tripler werd snel duidelijk dat het een zware app is. Er moest dus
duidelijk veel optimalisatie gebeuren om de app compatibel te maken met mini-pc’s. Na het
volledig performance onderzoek was duidelijk verbetering te zien in de metingen. Bij het
testen op de mini-pc was ook te zien dat de app nu veel vlotter werkt.
5.1.4 LOKALE WEBSERVER
Als lokale webserver werd gekozen voor Mongoose. Dit is een heel lichte webserver die als
één enkel bestand gedownload kan worden. Dit maakt het de perfecte partner om te
gebruiken in de webapps. Het Mongoose bestand kan gemakkelijk mee gekopieerd worden
met de andere bestanden en daarna opgestart worden.
5.2 BENCHMARKS
5.2.1 TIMELINE
Hieronder ziet u de timeline van de citytrip app vóór en na optimalisatie. Bij de eerste
metingen worden gedurende bijna de hele meettijd bewerkingen gemaakt (figuur 31).
Figuur 31: Timeline Result Pre
33
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Na alle optimalisaties worden enkel bewerkingen gemaakt op het moment van de cycle. De
impact van de bewerkingen is dan ook nog eens kleiner op het piekmoment (figuur 32).
Figuur 32: Timeline Result Post
Door de optimalisaties is de workload een stuk minder. Tussen de cycles in is er
daarbovenop zo goed als geen verwerking nodig.
5.2.2 PROFILER
Hieronder een meting van 33,5 minuten. Er is goed te zien dat er een grote hoeveelheid van
de tijd niets gebeurt. Amper 48 seconden wordt besteed aan scripting, omgerekend is dit
0,238 seconden of 238 milliseconden per cycle (figuur 33). Dit resulteert in een vlotte user
interface en weinig haperingen tijdens de cycle.
Figuur 33: Scripting Time
5.2.3 CONSOLE TIME
Hieronder de resultaten van de Console Time implementaties voor de verschillende delen
van het laden (figuur 34). Zoals u kan zien neemt het laden van de applicatie zelf weinig tijd
in. Door alle optimalisaties hangt de laadtijd nu vooral af van de externe services en van de
verwerking van de POI objecten.
34
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Figuur 34: Console Time Resultaat
5.3 RESULTAAT
De citytrip applicatie is volledig klaar en de eerste webapp in de DOOHapps App Store is
een feit. Iedereen is zeer tevreden over het resultaat, alles werkt voorlopig perfect. Of de
applicatie ook echt gebruikt zal worden is nog niet geweten maar het is alleszins een goed
voorbeeld voor geïnteresseerde klanten (figuur 35).
De nieuwe soort app is ontwikkeld door het team in Riga, Michael en mezelf en kan nu
gebruikt worden voor alle toekomstige webapps eventueel met toepassing van de
prestatietips die in dit document beschreven staan.
Figuur 35: Tripler resultaat
5.4 GELEERDE LESSEN
Gedurende mijn drie maanden stage leerde ik vooral hoe het is om te werken in een startup
en om in een team te werken. Iedereen in het bedrijf heeft zijn eigen specialisatie. Als
iedereen goed samenwerkt resulteert dit in een goed vooruitgaand bedrijf.
Tijdens het performance onderzoek ontdekte ik dat performance ook een heel belangrijk
onderdeel is bij het maken van een website bestemd voor productie. Ik leerde heel veel tips
bij over hoe ik gemakkelijk mijn code sneller kan maken.
35
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
Door de boeken van Kyle Simpson leerde ik ook hoe Javascript werkt ‘under the hood’. Het
is zeer interessant om te weten hoe je code gelezen, opgeslagen, opgeroepen en
opgekuist wordt. Het zal me later zeker helpen om betere code te schrijven.
36
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
REFERENTIELIJST
1. DIGITALE BRONNEN
1.1 WEBSITES
1. Eventplanner, 12 Innovative TIPS to Attract More People to Your Trade Booth [www],
15-10-2013, Eventplanner.tv
https://www.eventplanner.tv/news/5808_12-innovative-tips-to-attract-more-people-toyour-trade-booth.html
Gezien op 22-02-2015
2. MarketingDonut, Ten ways to attract visitors to your exhibition stand [www], xx-xxxxxx, MarketingDonut
http://www.marketingdonut.co.uk/marketing/exhibitions-and-events/exhibiting/tenways-to-attract-visitors-to-your-exhibition-stand
Gezien op 22-02-2015
3. The Display Hub, 8 Sneaky Ways to Attract People to Your Exhibition Stand [www],
01-08-2014, Display Wizard
https://www.displaywizard.co.uk/display-hub/8-sneaky-ways-attract-peopleexhibition-stand/
Gezien op 22-02-2015
4. Skyline Whitespace, 4 Effective Ways to Attract People to Your Exhibition Stand
[www], xx-xx-xxxx, Skyline Whitespace
http://www.skylinewhitespace.com/latest-news/blog/4-effective-ways-attract-peopleexhibition-stand/
Gezien op 22-02-2015
5. Addy Osmani, Writing Fast, Memory-Efficient JavaScript [www], 05-11-2012,
SmashingMagazine
http://www.smashingmagazine.com/2012/11/05/writing-fast-memory-efficientjavascript/
Gezien op 07-05-2015
6. Todd Motto, Speeding up AngularJS apps with simple optimizations [www], 06-082014, Binpress
https://www.binpress.com/tutorial/speeding-up-angular-js-with-simpleoptimizations/135
Gezien op 07-05-2015
7. Abraham Polishchuk, AngularJS Performance in Large Applications [www], xx-xxxxxx, Airpair
https://www.airpair.com/angularjs/posts/angularjs-performance-large-applications
Gezien op 07-05-2015
8. Bhavin Patel, 11 Tips to improve AngularJS performance [www], 05-05-2015, Bhavin
Patel
https://itsmebhavin.wordpress.com/2015/05/05/11-tips-to-improve-angularjsperformance/
Gezien op 07-05-2015
9. Jakob Jenkov, AngularJS $watch(), $digest() and $apply() [www], xx-xx-xxxx,
Jenkov.com
http://tutorials.jenkov.com/angularjs/watch-digest-apply.html
Gezien op 08-05-2015
37
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
10. AngularJS, AngularJS Developer Guide, AngularJS
https://docs.angularjs.org/guide
Gezien op 04-2015
1.2 EINDWERKEN
1. Feys, Kristof. (2012). Wordpress framework : Mr. Duke. [bachelorproef]. Hogeschool
West-Vlaanderen, NMCT. http://search.ugent.be/meercat/x/embed/howestview?q=type%3A%22dissertation%22+library%3A%22GKG%22+wordpress&start=
1&filter=&count=50&sort=&rec=rug01:001940308
2. De Geest, Jonas. (2007). Webdeveloping en graphical design. [bachelorproef].
Hogeschool West-Vlaanderen, NMCT.
http://search.ugent.be/meercat/x/embed/howestview?q=type%3A%22dissertation%22+library%3A%22GKG%22+design&start=4&fil
ter=&count=50&sort=&rec=rug01:001938415
3. Dewilde, Alexander (2011). Webdesign en -development bij Black and White
Company. [bachelorproef]. Hogeschool West-Vlaanderen, NMCT.
http://search.ugent.be/meercat/x/embed/howestview?q=type%3A%22dissertation%22+library%3A%22GKG%22+webdesign&start=
0&filter=&count=50&sort=&rec=rug01:001939986
1.3 TIJDSCHRIFTEN
1. Creative Bloq. Net Magazine. http://www.creativebloq.com/net-magazine
2. Creative Bloq. Computer Arts. http://www.creativebloq.com/computer-arts-magazine
3. Web Designer Magazine. http://www.webdesignermagazine.nl/
1.4 EBOOKS
1. Kyle Simpson (2014), You Don’t Know JS: Scope & Closures, Sebastopol: O'Reilly
Media
2. Kyle Simpson (2015), You Don’t Know JS: Async & Performance, Sebastopol:
O'Reilly Media
2. VAKSPECIALISTEN
1. Frederik De Wachter
2. Michael Boone
38
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
BIJLAGEN
1. SCOPE IN ANGULARJS
Op zijn blog beschrijft Todd Motto de scope en watchers in Angular. Er is echter nog veel
meer te vinden over het onderwerp op de officiele Angular website.
1.1 SCOPES & DIGEST CYCLE
1.1.1 SCOPES
Angular gebruikt scopes om aan de hand van expressies verschillende opdrachten uit te
voeren.
Scopes zijn eigenlijk gewoon JS objecten die een voorgedefinieerd protoype schema
volgen.
Elke verandering aan een scope wordt bijgehouden door $watch.
1.1.2 $WATCH
Een watch bestaat uit een value functie en een listener functie. De value functie geeft de
waarde van de watch value terug, de listener functie doet wat het moet doen als de value
veranderd.
Elke variabele die maar één keer gebonden moet worden aan je DOM wordt best gebonden
met ‘One-time binding’. Dit wordt gedaan door twee dubbele punten voor de value te zetten
({{::value}}).
Wat zeker niet mag is een functie direct binden aan een $watch. Dit zorgt voor grote
performance problemen.
1.1.3 $WATCHERS
Elke scope houdt een array van functies bij ‘$$watchers’.
Elke keer dat een $watch gecalled wordt op een scope value of als een value gelinkt wordt
aan het DOM door ‘ng-repeat’, ‘ng-if’, ‘ng-switch’, enz… wordt een functie toegevoegd aan
$$watchers.
1.1.4 DIGEST CYCLE
Elke keer dat een value in een scope verandert worden alle functies in $$watchers
uitgevoerd, als een van die watchers weer een verandering aanbrengen worden alle
functies opnieuw uitgevoerd. Dit loopt zo door tot een volledige doorloop van $$watchers
geen wijzigingen meer aanbrengt. Dit is de digest cycle.
Het is dus de opdracht om $$watchers zo klein mogelijk te houden door er zo weinig
mogelijk aan te binden (door ng-repeat, ng-if, …). Als je $watchers gebruikt probeer dan je
lijst met data te beperken door gebruik van Track By.
1.1.5 $SCOPE.$APPLY
Deze cycle kan manueel gestart worden door $scope.$apply() uit te voeren.
1
WEB APPLICATIES VOOR DIGITAL SIGNAGE & JAVASCRIPT PERFORMANCE
In plaats van $scope.$apply te gebruiken die heel de cycle uitvoert kan beter
$scope.$digest gebruikt worden. Deze start vanaf de huidige scope en loopt de lijst af tot
beneden en overloopt dus minder functies.
2