HTML5. design. { als een pro BOUW. < als een expert 20 HTML5-TIPS, TRUCS EN TECHNIEKEN OM BETERE SITES TE BOUWEN IS JOUW KING?

1 10+ WORKSHOPS INCLUSIEF BESTANDEN UITGAVE 79 HTML5 CSS3 jquery WordPress webdesignermagazine.nl UITGAVE 79 Design als een pro, bouw als een expert C...
Author:  Frederik Bogaerts

329 downloads 714 Views 9MB Size

Recommend Documents



Standaard toont fullPage.js de sectie boven aan de DOM-structuur. Dit kun je zelf aanpassen. Ons voorbeeld hier begint bijvoorbeeld met het tonen van het laatste item van de lijst. De individuele secties kunnen meerdere slides bevatten die horizontaal getoond worden:

| | | |

Slide 1
Slide 2


Hoewel je de losse slides via CSS kunt opmaken, kan het framework ook gebruikt worden om extra context zoals achtergrondkleuren toe te voegen:

| | | | | | | |

$(document).ready(function() { $('#fullpage').fullpage({ sectionsColour: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'], anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'], }); });

In dit stukje code worden zowel de achtergrondkleuren als een setje anchors aangeleverd. Met die laatste kun je eenvoudiger interne links maken, waardoor je individuele pagina’s makkelijk bereikt. Om alle parameters te beschrijven van het JSONobject dat aan de initialisatiefunctie wordt doorgeven, zou deze hele uitgave van Webdesigner vullen. Neem daarom een kijkje op github.com/alvarotrigo/fullPage.js om de readme te bestuderen.

sigmajs.org Gebruik om: diagrammen te tekenen Data in diagrammen krijgen is complex. Dit framework regelt de rendering en handelt zelfs de interactiviteit af.

Glyphs webhostinghub.com/glyphs Gebruik om: icoontjes als font te gebruiken WebHostingHub biedt dit lettertype aan, vol mooi ontworpen symbolen.

bourbon bourbon.io Gebruik om: CSS te verbeteren Sass vereenvoudigt lange CSS-declaraties. Er is ondersteuning voor mix-ins om je CSS bondiger te maken.

VideoJs videojs.com Gebruik om: video’s weer te geven Dit is een strakke videowidget voor HTML5-video.

slick github.com/kenwheeler/slick Gebruik om: een HTML5-carrousel te maken Slick maakt zijn naam waar: een efficiënte en cleane carrousel voor uitgelichte content en producten.

awesomplete github.com/LeaVerou/awesomplete Gebruik om: autocomplete toe te voegen Gebruikers hebben een hekel aan typen. Autocomplete werkt zonder allerlei zware externe frameworks.

randomColor github.com/davidmerfield/randomColor Gebruik om: kleuren te genereren Het genereren van geschikte willekeurige kleuren is een kunst. Deze bibliotheek doet dit uitstekend.

app Lauch Guide github.com/adamwulf/app-launch-guide Gebruik om: te leren hoe je een app lanceert Een handleiding vol tips om je app te laten knallen. feature���������������������������������������������������������� 75

20 BESTE GITHUB PROJECTEN

boUW EENvoUdIGE MobIElE Apps ratchet goratchet.com Gebruik om: apps te maken met eenvoudige componenten Het maken van mooie interfaces voor mobiele applicaties is een vak apart. Ratchet wordt beheerd door het team achter het wereldberoemde Bootstrap-framework. Het richt zich op het versimpelen van deze taak. Na het downloaden van Ratchet kun je je opmaken voor het compleet herschikken van je applicatie. Het framework vereist dat je je houdt aan een strenge volgorde. Zo moeten alle ‘bar’-items direct onder de -tag van de individuele pagina’s staan:

| | | | | | | | |

|

Title



cUstoM KNoppEN

Voor de daadwerkelijke applicatie is er een grote verzameling elementen. Zo kunnen tabbladen bijvoorbeeld opgeleukt worden met handige gadgets die extra informatie bieden. Apps bestaan uit formulieren. Elk daarvan hoort in een eigen HTML-bestand. Ze zijn met elkaar verbonden via het Push.js-framework. Standaard worden alle links hierdoor afgehandeld. Gelukkig is het ontwerpen van externe links eenvoudig. Voeg gewoon de data-ignore-eigenschap toe. Dit is noodzakelijk voor alle verwijzingen die wijzen naar iets buiten je app. De volgende Google-link is een voorbeeld hiervan:

Ratchet verschilt van GUI stacks als jQuery UI/Mobile vanwege de beschikbaarheid van twee stylesheets die het design van het besturingssysteem van de host nabootsen. Helaas ondersteunt Ratchet alleen recente versies van Android en iOS. De developers weten nog niet of ze Windows Phone gaan ondersteunen. Op BlackBerry 10 hoef je niet eens te wachten.

IcooNtJEslEttErtYpE

buttons

MFG Labs icon set

github.com/unicorn-ui/Buttons Gebruik om: volledig aanpasbare knoppen te implementeren Knoppen zijn de belichaming van interfacedesign voor touchscreens: als er sprake is van een touchscreen, zullen er ook tal van knoppen te vinden zijn. Een groep developers heeft een GUI-framework gemaakt puur voor knoppen. Deze aanpak is nuttig, want zo blijven de benodigde externe bronnen minimaal. Neem de volgende bestanden op in je webproject – extra bronnen zijn nodig voor dropdownmenu’s en symbolen:

mfglabs.github.io/mfglabs-iconset Gebruik om: icoontjes als lettertype in te zetten Een afbeelding zegt meer dan duizend woorden en deze icoontjes zullen dan ook zeker verwoorden wat jij wil, zonder tekst. Veel desktopapplicaties kennen een balk vol symbolen om veelgebruikte functies snel toegankelijk te maken. Deze set icoontjes van MFG Labs is anders dan andere sets, want je implementeert deze via een lettertype. Dat is heel handig, want lettertypes bevatten vectorinformatie. Je icoontjes zien er dus altijd goed uit en zullen niet blokkerig worden bij hoge resoluties. Kopieer alle relevante bronnen naar een map van je webproject. Vervolgens voeg je het volgende stukje code toe om de stylesheet te laden en een begin te maken:

| | |



Je kunt knoppen maken via zowel
- als

Buttons kan standaard een paar honderd knoptypes implementeren. Omdat de meeste apps waarschijnlijk niet alles nodig hebben, kun je dit aanpassen. Zo schrap je de onnodige knoppen en bespaar je ruimte en bandbreedte.

76 ����������������������������������������������������������feature

| |



UI-designer zullen er meteen op wijzen dat het verkeerd gebruiken van symbolen de gebruiksvriendelijkheid in de weg kan zitten. Gebruik een symbool alleen wanneer de betekenis 100% helder is voor de doelgroep. Zo voorkom je verwarring. Dit wordt alleen maar lastiger wanneer producten internationaal gaan.

20 BESTE GITHUB PROJECTEN

ANGUlAr-AlErts

ng-notify matowens.github.io/ng-notify Gebruik om: foutmeldingen te tonen Een kleine Duitse startup introduceerde meldingen die in beeld schoven op een lang vergeten concurrent van de iPad. Sinds Windows Phone 7 dit concept breder omarmde, zijn dit soort alerts niet meer weg te denken uit de mobiele markt. Ng-notify is een minuscule add-on voor AngularJS. Het biedt developers een selectie van verschillende stijlen voor meldingen die met een enkele functieaanroep ingezet kunnen worden. Ng-notify gebruik je als alle andere AngularJS-modules. De code hieronder zal er dan ook wel bekend uitzien voor AngularJS-gebruikers:

|

var app = angular.module(‘demo’, [‘ngNotify’]);

Het verzenden van boodschappen gebeurt vervolgens via het aanroepen van de set-methode in het ngNotify-object:.

|

ngNotify.set(‘Your error message goes here!’, ‘error’);

Daarnaast kun je eigen stijlen opzetten: pas de kleuren aan, de richting of andere eigenschappen. Dialoogvensters en alerts van ng-notify zijn niet modaal. Dat betekent dat ze alleen getoond worden wanneer je app in beeld is. Als de toepassing op de achtergrond draait, ziet de gebruiker de informatie niet.

dAtAsEts WEErGEvEN Clusterize.js

FAKE rEst zoNdEr codE json-server

loW-lEvEl css-tools bassCss

opdrAcHtEN FIXEN the Fuck

nexts.github.io/Clusterize.js Gebruik om: de frontend te verbeteren Het weergeven van grote hoeveelheden informatie in een lijst is een flinke uitdaging en het afhandelen van duizenden DOM-elementen kan zelfs de snelste browser overweldigen. Clusterize.js lost dit dataprobleem op door de displaywidgets op een creatieve manier te hergebruiken: het framework kent een klein aantal templates die gevuld worden met data zodra de gebruiker scrollt. Scrollbalken worden voor de gek gehouden met dummy-elementen. Sites die Clusterize inzetten, werken een stuk sneller. Als je grote datasets gebruikt, kun je hier niet omheen.

github.com/typicode/json-server Gebruik om: development te optimaliseren De eerste stappen van een clientserverproject lijken op het klassieke kip-en-eiprobleem. Je kunt pas met de frontend beginnen als de backendfuncties vaststaan. Json-server pakt dit probleem aan met een plaatsvervanger. Je geeft de gewenste reacties op en behandel je jsonserver-instantie als de echte productieserver. Json-server handelt automagisch het retourneren van de benodigde data af. Dit is niet alleen vanuit de frontend gezien een handig product om te gebruiken.

basscss.com Gebruik om: betere CSS-stijlen te maken Goed kleurgebruik is een balanceeract tussen leesbaarheid en design: mooie looks en goede leesbaarheid zijn twee verschillende zaken. BassCSS is een verzameling interessante CSS-elementen die eenvoudig in je applicatie geïntegreerd kunnen worden. Daarnaast krijg je 96 leesbare en mooie kleurschema’s, lay-out- en typografiehulpmiddelen, en herbruikbare lay-outmodules. Het is responsive, lichtgewicht en flexibel genoeg om op elk apparaat te werken. Kopieer gewoon de stijldeclaraties die je wilt gebruiken naar je eigen CSS-bestand.

github.com/nvbn/thefuck Gebruik om: je commando’s te verbeteren Je hoeft maar één teken verkeerd te typen op de Unix-commandline en je hele opdracht wordt geweigerd. The Fuck is een workaround die foute commando’s analyseert en verbeterd:

| | | | | | | | |

➜ apt-get install vim E: Could not open lock file / var/lib/dpkg/lock – open (13: Permission denied) E: Unable to lock the administration directory (/var/ lib/dpkg/), are you root? ➜ fuck sudo apt-get install vim

feature���������������������������������������������������������� 77

20 BESTE GITHUB PROJECTEN

VIJF OM TE VOLGEN GitHub @github Gebruik je een GitHub-dienst? Dan kun je maar beter het officiële Twitter-account van GitHub volgen. Een eindeloze bron van interessante informatie.

GitHub Status @githubstatus Zoals alle computersystemen gaat ook GitHub weleens down. Volg dit account om op de hoogte te blijven van gepland onderhoud en onverwachte crashes.

INzooMEN MEt JQUErY zoom.js github.com/fat/zoom.js Gebruik om: afbeeldingen te vergroten Je wilt afbeeldingen meestal zo groot mogelijk laten zien, zonder te veel ruimte op te offeren. Fotografen en infographicdesigners willen hun creaties graag in de schijnwerper plaatsen. UI-designers richten zich meestal op een goede lees/kijk-flow. Zoom.js lost dit probleem op door kleine afbeeldingen klikbaar te maken om ze vervolgens in volle glorie te tonen. Gebruikers kunnen zo intuïtief afbeeldingen openen en sluiten. Ideaal voor situaties waarin je graag de volledige grootte toont, maar daar niet echt plek voor hebt. De zoom.js-plug-in neem je met de volgende drie regels op in je webapplicatie. Transition.js is geen onderdeel van het framework, maar beschikbaar als onderdeel van Bootstrap:

| | |

<script src=”js/zoom.js”> <script src=”js/transition.js”>

Elke individuele -tag heeft wat markup nodig om de afbeelding groter te kunnen tonen:

| |



Denk eraan dat zoom.js geen oplossing is voor het verminderen van je dataverkeer. De grote afbeeldingen worden gewoon geladen en kleiner weergegeven. Op het moment kan zoom.js nog geen andere bron laden wanneer er op een afbeelding geklikt wordt.

Tom Preston-Werner @mojombo Vanwege een – ietwat dubieus – schandaal is Tom vertrokken, maar hij verdient nog steeds de aandacht als de programmeur die het idee had om GitHub aan de wereld te schenken.

Chris Wanstrath @defunkt De huidige co-CEO van GitHub verschijnt af en toe op Twitter. Hem volgen is leuk als je graag een lijstje prominente mensen in je account wil hebben.

Linus Torvalds @linus__torvalds Een verhaal over GitHub is niet compleet zonder Linus Torvalds te noemen. De wereldberoemde programmeur schiep Git om de broncode van de Linux-kernel te onderhouden. Sinds 2011 zit hij echter vooral op Google+.

NoG MEEr GItHUb

78 ����������������������������������������������������������feature

Github-documentatie

enterprise-editie

help.github.com Het was ooit een hele uitdagende taak om versiebeheersystemen onder de knie te krijgen. Gelukkig streeft het GitHub-team ernaar om hun product zo toegankelijk mogelijk te maken. Bezoek deze pagina om toegang te krijgen tot een enorme hoeveelheid informatie over zowel eenvoudige als complexe features.

enterprise.github.com De gratis dienst van GitHub past niet bij iedereen. Tegen betaling kun je GitHub ook lokaal op je bedrijfsnetwerk draaien.

Zoeksyntax

Git-handleiding

help.github.com/articles/searchinggithub Vind eenvoudig code via de geavanceerde zoeksyntax in het zoekveld.

git-scm.com GitHub is een gehoste instantie van Git. Meer informatie over Git vind je in de documentatie.

Github-blog github.com/blog Roddels, updates en het laatste nieuws vanuit GitHub vind je op de officiële blog.

20 BESTE GITHUB PROJECTEN

WErEldWIJd sAMENWErKEN Dankzij GitHub is versiebeheer en samenwerken aan projecten eenvoudiger dan ooit Deze uitgave van Webdesigner staat boordevol GitHub. Dat is niet zo gek, want GitHub is sinds de oprichting in 2008 snel uitgegroeid tot de grootste code-hoster ter wereld. GitHub is dé plek om code te delen met collega’s, vakgenoten, vrienden, klasgenoten en onbekenden. Miljoenen mensen werken zo samen aan projecten of bouwen voort op code van anderen. Op de voorgaande pagina’s heb je een selectie van de nuttigste, mooiste en leukste projecten op GitHub.com kunnen zien. GitHub is meer dan alleen een verzamelplek voor toffe code. Naast het online platform en de gave apps die het bedrijft ontwikkelt, kent GitHub ook een enterprise-editie. Daarmee kunnen bedrijven het GitHub-platform lokaal op hun netwerk draaien – centraal en veilig. Om dit allemaal goed te ondersteunen, begint GitHub nu met het uitrollen van supportafdelingen in Engeland, Frankrijk en – jawel – Nederland. Een mooi moment om eens een praatje te maken met Brian Doll, Vice President Strategy van GitHub. GitHub heeft de wereld veroverd. Brian Doll vertelt: “GitHub is ruim zeven jaar geleden opgericht om softwareontwikkeling specialer te maken. We houden ervan om mensen te helpen met het samenwerken aan projecten en streven ernaar om ze de beste tools te bieden. GitHub is snel het grootste softwareontwikkelingsplatform ter wereld geworden. Er werken momenteel meer dan 10 miljoen mensen aan 25 miljoen projecten. GitHub is het beste platform voor het bouwen van de beste software. Met meer dan 25 miljoen projecten en meer dan 32 miljoen bezoekers elke maand, kun je wel zeggen dat GitHub dé manier is waarop software tegenwoordig wordt gebouwd.”

data staat op je eigen infrastructuur of in een private cloud die jij beheert. Developers kunnen inloggen met dezelfde corporate identity die ze overal gebruiken.”

Europa, dat ondertussen goed is voor 36% van het bezoek. Het is leuk om bedrijven in Nederland en de rest van Europa te ontmoeten en we willen er nog veel meer leren kennen.”

WAAroM AMstErdAM?

WAt Is JE FAvorIEtE proJEct?

“Ongeveer 10% van onze werknemers woont in Europa. Velen daarvan wonen in of in de buurt van Amsterdam. Het is een schitterende stad die centraal in West-Europa ligt, met een hoog percentage Engelssprekenden. De technologie- en startupscene is ontzettend goed en daar willen we graag onderdeel van zijn. We willen elk bedrijf op aarde helpen de beste software te bouwen. We zien een enorme groei in

“Ik maak de laatste tijd met veel plezier gebruik van Atom (atom.io). Dat is een hackbare teksteditor die we eerder dit jaar uitgebracht hebben. Het is echt een groepsprestatie van honderden mensen die bijdragen aan Atom zelf (github.com/ atom/atom) en de documentatie (github.com/ atom/docs). Er zijn al meer dan 2500 pakketten (atom.io/packages) voor Atom gebouwd door de gemeenschap om de tool nog beter te maken.”

WIE zIJN dE GEbrUIKErs? “De laatste jaren is software steeds belangrijker geworden voor alle soorten bedrijven, ongeacht de sector. De eerste GitHub-gebruikers waren vaak kleine softwareteams die samen aan wat projecten werkten. Toen we groter werden, gingen we ook met wat grotere softwarebedrijven werken. Tegenwoordig werken we ook met hele grote bedrijven wereldwijd. We werken met bedrijven in alle sectoren waar software een nieuwe strategische functie is om het hele bedrijf te ondersteunen. Elk bedrijf, traditioneel of visionair, wil productief werken en diverse inzichten krijgen van de mensen die in de verschillende teams en bedrijfstakken werken. Samenwerken is steeds belangrijker om de feedbackcyclus tussen bedrijfs- en technologieteams te verkorten. We helpen elk bedrijf de beste software te bouwen, samen. GitHub Enterprise brengt de kracht van GitHub naar het interne netwerk van een organisatie. Je

Brian Doll, Vice President Strategy van GitHub



GitHub is dé manier waarop software tegenwoordig gebouwd wordt



feature����������������������������������������������������������79

Webdeveloper

Maak playlists met de API van Last.fm Ontdek Fetch en de API van Last.fm en maak een gezamenlijke playlist van jouw smaak en die van je vrienden

80 �������������������������������������������������������������� workshops

Workshopbestanden Te vinden op wdmag.nl/WDfiles

Webdeveloper

M

uziek is zowel universeel als ongelofelijk subjectief. Wat de een de ultieme creatie van de mensheid vindt, kan de ander afdoen als het toonbeeld van slechte smaak. In deze workshop gaan we proberen om dit gat te dichten door met data van Last. fm een playlist samen te stellen die jou en je vrienden kan bekoren. Last.fm is opgericht in 2002 door twee studenten en later opgekocht door CBS Interactive. Op de site kun je bijhouden wat je allemaal geluisterd hebt. Dankzij de verschillende API-diensten kunnen developers allerlei leuke dingen doen met de verzamelde data. Om dit voor elkaar te krijgen, gebruiken we een nieuwe methode voor het maken van requests, genaamd Fetch (meer informatie op fetch.spec.whatwg.org). Fetch wordt momenteel ondersteund door Chrome 42, Firefox 39 en Opera 29. Fetch probeert het oude en hackerige XMLHttpRequest, dat in in 1999 door Microsoft werd geïntroduceerd, te vervangen. Het web is enorm gegroeid sinds die tijd en Fetch is opgebouwd rond streams en promises. Het frontenddeel van deze workshop is heel eenvoudig, maar het helpt wel als je een beetje kennis van Angular hebt. Het server-sidedeel wordt kort besproken, maar de volledige code is natuurlijk te vinden op wdmag.nl/WDfiles.

1. Express installeren De server voor onze simpele app bestaat uit Node.js en Express. Hiermee wordt een Express-app in de steigers gezet, die beschikbaar is op poort 3000. We passen later het app.js-bestand in de root van het project aan. We gebruiken ook een wrapper voor de Last.fm API, dat helpt straks bij de authenticatie.

2. Client-side pakketten De code die aangeboden wordt aan de gebruiker, wordt opgeslagen in de ‘public’-map. Ga naar deze map en start het Bower-commando. Je kunt ook

handmatig Angular 1.3, angular-query-string (npmjs.com/package/angular-query-string) en Underscore installeren. Meteor wordt automatisch opnieuw gestart.

lijst vrienden op te halen. Dit kunnen we op vele manieren doen, maar hier kijken we of de user-eigenschap wijzigt. Je zou ook een functie kunnen toevoegen op de input, die bijgewerkt wordt bij een blur.

3. Gebruikersnaam

| | | | | | | | |

We schrijven nu onze Angular-app. We willen een Last.fm-gebruikersnaam, zodat we dadelijk onze vrienden kunnen zoeken. Maak een index.html in de root van het project, met daarin een tekstveld dat bijgewerkt wordt met het ‘user’-model.

| | | | | | | |



4. Module definiëren

$scope.$watch('user', function (username) { if (username) { lastfm.getFriends(username).then(function (data) { $scope.friends = data.friends.user; $scope.$apply(); }); } });

6. Angular service Je hebt gezien dat we lastfm.getFriends aanroepen, maar ‘lastfm’ bestaat nog niet in onze app. Dat lossen we op door een service toe te voegen aan de ‘app’module. Je moet een account aanmaken op last.fm/ api/account/create om een API key te krijgen.

Ga terug naar de public-map en maak daarin een JavaScript-bestand genaamd ‘playlist-app.js’. Het attribuut ng-app uit de vorige stap zoekt naar de module ‘app’, hetzelfde geldt voor de controller en de definitie daarvan. We injecteren ook nog een LastFmService, deze maken we later nog. Let op de dependency op de angular-query-string, deze regelt de UrlQueryString.

| | | | | | |

| | | | | | |

We gebruiken de experimentele Fetch-API om een request te maken naar user.getFriends (last.fm/ api/show/user.getFriends). Fetch werkt met

angular.module('app', ['angular-querystring']) .controller('FriendController', ['$scope', '$window', 'LastFmService', 'UrlQueryString', function ($scope, $window, Lastfm, UrlQueryString) { }]);

5. Vrienden zoeken Als een gebruiker een gebruikersnaam opgeeft, maken we een request naar de API van Last.fm om een

.service('LastFmService', function () { var url = ‘http://ws.audioscrobbler. com/2.0/?api_key=YOUR_API_KEY&format=json'; return { /* next step */ }; })

7. API call

Afleidingsmanoeuvre

Gebruik je de Network-tab binnen je Web Inspector voor het debuggen van requests van Fetch, dan zul je ze niet vinden in de XHR-tab, want het zijn geen XMLHttpRequests!

Links

Als er eenmaal een gebruikersnaam is ingevuld, kunnen we een lijst vrienden ophalen en weergeven Linksboven

We gebruiken Bower voor het managen van pakketten, waardoor we meerdere projecten ineens kunnen opnemen en het project beter kunnen beheren Rechtsboven

Deze input vangt de gebruikersnaam en is gekoppeld aan het ‘user’-model. Door te updaten na een blur wordt het aantal requests beperkt workshops ���������������������������������������������������������������� 81

Webdeveloper Maak playlists met de API van Last.fm

streams en promises, en die zijn een beetje apart. Met de Promise-API kunnen we verschillende asynchrone functies koppelen met ‘then’. Response. json() geeft een stream terug, zodat het lezen van grote bestanden progressief gedaan kan worden.

| | | |

| | | | | | |

Je zou nu een lijst vrienden moeten hebben. Als de gebruiker op een vriend klikt, moet de vergelijking starten. Maak een playlist-array waarin de weer te geven nummers komen en roep ‘compare’ aan op de ‘lastfm’ service. Geef dan de gebruikersnaam door en de naam van de vriend.

getFriends: function getFriends (username) { return fetch(url + '&method=user.getfriends& recenttracks=1&user=' + username) .then(function (response) { return response.json(); }); },

8. Vrienden weergeven Fetch maakt een API call. We hebben hier al een handler voor geschreven door $scope.friends te vullen met het resultaat. Om onze Last.fm-vrienden weer te geven, moeten we een simpele repeater schrijven die een lijst vrienden toont. We laten een kleine afbeelding zien en geven de voorkeur aan de echte naam in plaats van de gebruikersnaam.

| | | | | | | | | | |

<section class="friend-container" data-ngshow="friends.length">

Choose a friend to create a playlist with:

  • {{friend.realname || friend.

    Uitgebreide API

    Last.fm heeft 133 gedocumenteerde services voor je in de aanbieding, van informatie over gebruikers tot geografische evenementen. Meer informatie vind je op last.fm/api.

    Linksboven

    Een request gemaakt met de Fetch-API bevat dezelfde informatie als de oude XHR request Rechtsboven

    We geven de gebruiker een link naar de samengestelde playlist, zodat hij zijn vriendschap kan beklinken Rechts

    De gebruiker wordt verwezen naar de site van Last.fm, waar hij kan lezen welke toegangsrechten onze app vraagt

    82��������������������������������������������������������������� workshops

    name}}


9. Vriend kiezen

| | | | | | | | | | | |

$scope.chooseFriend = function (friend) { $scope.playlist = []; $scope.chosenFriend = friend; lastfm.compare($scope.user, friend.name) .then(function (data) { var artists = data.comparison.result. artists.artist; return artists; }).then(function (artists) { /* next step */ }); };

10. Tracks ophalen Voor de reactie daarop gaan we door alle wederzijdse artiesten die we terugkrijgen van Last.fm. We roepen voor elke artiest een service aan die kijkt naar tracks van een bepaalde artiest waar onze vriend naar geluisterd heeft en kiest er willekeurig twee om toe te voegen aan onze lijst. Voor die twee tracks roepen we een andere methode aan, deze moeten we nog maken en heet ‘addTrack’.

| | | | | |

artists.forEach(function (artist) { return lastfm.getTracksOfArtist($scope. chosenFriend.name, artist.name) .then(function (tracks) { _.sample(tracks.artisttracks.track, 2).forEach(addTrack);

| | |

}); });

11. Last.fm API calls De compare- en getTracksOfArtist-methoden hebben eenzelfde format als de vorige API call met Fetch. In beide gevallen parsen we de respons als JSON en geven deze door naar de volgende functie, zodat we toegang krijgen tot het antwoord in de controller. De vergelijking wordt gedaan door de eigen Taste-o-meter van Last.fm, die ook een ‘verenigbaarheidscijfer’ tussen 0 en 1 teruggeeft.

| | | | | | | | | | | | | | | |

compare: function (user1, user2) { return fetch(url + '&method=tasteometer. compare&limit=30&type1=user&type2=user &value1=' + user1 + ' &value2=' + user2). then(function (response) { return response.json(); }); }, getTracksOfArtist: function (friend, artist) { return fetch(url + '&method=user. getartisttracks&user=' + friend + '&artist=' + artist).then(function (response) { return response.json(); }); },

12. Track toevoegen De logica voor het toevoegen van een track aan de playlist wordt hergebruikt, dus om alles in DRY-stijl (Don’t Repeat Yourself) te houden, hebben we er een aparte functie van gemaakt. Deze zorgt ervoor dat de track een naam heeft en door de array loopt om te kijken of de Last.fm ID misschien al is opgenomen. Als dat zo is, wordt er een track toegevoegd en wordt de boel gehusseld om te voorkomen dat een artiest twee keer achter elkaar afgespeeld wordt.

Webdeveloper Maak playlists met de API van Last.fm

Last.fm-authenticatie We hebben een bibliotheek ingezet om het authenticatieproces voor ons af te handelen. Je moet een request maken met je API key en in ruil daarvoor geeft Last. fm (als de gebruiker toestemming heeft gegeven) je een token die je kunt opslaan, zodat er in het vervolg geen authenticatie nodig is. Het lastigste aan dit proces is het ondertekenen van je aanroep naar de API-methoden die authenticatie vereisen. Hiervoor moet je parameters alfabetisch en in UTF-8 opgeven, waarna dit gehasht moet worden met het MD5-algoritme. Je kunt elke taal gebruiken en Last.fm heeft een lijst aanbevolen wrappers, waaronder Python en .NET. Je kunt het zelfs aan de client-side doen, maar daarmee geef je de geheime key van je app vrij en dat is niet aan te bevelen.

| | | | | | | | | | | | | | |

var addTrack = function (track) { if (track && track.name) { var inPlaylist = $scope.playlist. some(function (t) { return t.mbid.length && t.mbid === track. mbid; }); if (!inPlaylist) { $scope.playlist.push(track); $scope.playlist = (_.shuffle($scope. playlist); $scope.$apply(); } } };

13. Geliefde liedjes Je kunt dit project ook gebruiken om liedjes te luisteren als je samen in dezelfde ruimte bent. Omdat je een goede gastheer of -vrouw bent, voeg je vast wat tracks toe voor je gast. We nemen een paar ‘loved tracks’ van hem of haar op in de playlist.

| | | | | | |

.then(function () { lastfm.getLovedTracks($scope.chosenFriend. name).then(function (data) { _.sample(data.lovedtracks.track, 2).forEach(addTrack); }); });

14. Loved tracks request De API call lijkt op de vorigen. De meeste Last.fm services geven een subgroep van de totale resul-

taten terug. Er is een pagineersysteem, dus je kunt hier doorheen loopen door steeds de &page-waarde te verhogen. Je kunt ook de resultaten beperken als je er minder dan vijftig wilt terugkrijgen.

| | | | | | | |

getLovedTracks: function getLovedTracks (user) { return fetch(url + '&method=user. getlovedtracks&user=' + user) .then(function (response) { return response.json(); }); },

15. Playlist weergeven We krijgen wat tracks terug van de API. Deze gaan we weergeven. Maak een geordende lijst en geef de naam van de track, artiest en album weer met daartussen een koppelteken. Andere services geven .name of .#text terug.

| | | | | | | | | | | |

<section class="playlist-container" data-ngshow="playlist.length">

Your playlist with {{chosenFriend. realname || chosenFriend.name}}

  1. {{track.name}} <span data-ng-show="track. artist.name || track.artist['#text']"> {{track.artist.name || track. artist['#text']}} <span data-ng-show="track. album.name || track.album['#text']">-

    | | | | | |

    {{track.album.name || track.album['#text']}}


16. Playlist listener opslaan We hebben een knop toegevoegd om de playlist op te slaan. Om een playlist te maken, moet je de gebruiker toestemming geven op de server. Stuur de naam van onze vriend en de tracks in de playlist door. Als we een reactie van de server krijgen, worden we ter authenticatie doorgestuurd naar de Last. fm-site.

| | | | | | | | | | | |

$scope.savePlaylist = function () { var data = JSON.stringify({ name: $scope.chosenFriend.name, tracks: $scope.playlist, }); lastfm.savePlaylist(data).then(function (url) { if (~url.indexOf('last.fm')) { $window.location = url; } }); };

17. POST request Het POSTen van data met de Fetch-API is iets lastiger dan de GET requests die we gemaakt hebben. In plaats van de data in de url te encoderen, wordt de data verzonden met een POST request. Het is workshops ��������������������������������������������������������������� 83

Webdeveloper Maak playlists met de API van Last.fm

heel belangrijk dat we Content-type instellen op application/json, zodat de server het kan identificeren.

| | | | | | | | | | | | |

savePlaylist: function savePlaylist (data) { return fetch('http://localhost:3000/saveplaylist', { method: 'post', headers: { 'Content-type': 'application/json; charset=UTF-8' }, body: data }).then(function (response) { return response.text(); }); }

18. Serverauthenticatie We gaan nu naar app.js in de root van het project. We werken rond de code die er al staat, dus misschien kun je het volgende toevoegen aan het eind van het bestand. Je kunt ook de code kopiëren uit de download. Const is een variabele die in ES6 geintroduceerd is en kan niet aangepast worden.

| | | | | | |

var LastfmAPI = require('lastfmapi'); const LASTFM_API_KEY = ‘YOUR_API_KEY’; const LASTFM_API_SECRET = ‘YOUR_API_SECRET’; var lfm = new LastfmAPI({ api_key: LASTFM_API_KEY, secret: LASTFM_API_SECRET });

die we nu ergens anders kunnen bereiken (in een echt project moet je dit met sessies doen).

| | | | | | | | | | |

app.get('/', function (req, res) { res.sendFile(path.join(__dirname + '/index. html')); }); app.post(‘/save-playlist', function (req, res) { data = req.body; var authUrl = lfm.getAuthenticationUrl({ 'cb' : 'http://localhost:3000/auth' }); res.send(authUrl); });

20. Authenticatie In de vorige stap hebben we tegen Last.fm gezegd dat de gebruiker naar http://localhost:3000/auth gestuurd moet worden als de app toegang heeft gekregen tot het account. In dit proces krijgen we een unieke token die we kunnen gebruiken om een sessie te maken.

| | | | | | | | | |

app.get('/auth', function (req, res) { var token = url.parse(req.url, true).query. token; lfm.authenticate(token, function (err, session) { lfm.setSessionCredentials(session.username, session.key); // next step }); });

19. Express routes

21. Nummers toevoegen

Om ervoor te zorgen dat alles op dezelfde plek werkt, serveer je index.html op rootniveau. We hebben de playlistdata naar de /save-playlist route gePOST. Deze wordt opgeslagen in een variabele

We geven de playlist een naam (de naam van je vriend) en een beschrijving. Daarna gebruiken we een callback functie om de tracks toe te voegen aan de playlist. Er is een timeout ingesteld van 500

Fetch vandaag al gebruiken Er zijn een paar valkuilen met Fetch. Je kunt bijvoorbeeld een Fetch-stream maar een keer lezen. Als je ‘response. json(); response.text();’ schrijft, geeft de tweede een error omdat deze al gelezen is. Als je dit wilt doen, dan schrijf je ‘response.clone().text()’. Er is ook nog geen mogelijkheid om een request te annuleren, maar dat komt misschien nog. Dit ligt aan het feit dat Fetch gebaseerd is op Promise. Fetch heeft ook geen brede ondersteuning. Om dit te omzeilen, hebben GitHub-developers een polyfill geschreven (github.com/github/ fetch), waarmee XHR gewrapt wordt met de Fetch-API. Fetch kan ook gebruikt worden in service workers, in tegenstelling tot XHR requests. Dit houdt in dat je asynchrone processen meer asynchrone processen kunnen voortbrengen.

84��������������������������������������������������������������� workshops

milliseconden tussen elke request, want anders worden er maar enkele liedjes toegevoegd. Als deze eenmaal gemaakt is, verwijzen we met parameters die de url van de playlist bepalen.

| | | | | | | | | | | | | | | |

lfm.playlist.create({ title: data.name, description: 'Generated by Playlist-omatic.' }, function(err, playlists) { data.tracks.forEach(function (track, index) { setTimeout(function () { lfm.playlist.addTrack(playlists.playlist.id, track.artist['#text'] || track.artist.name, track.name); }, 500 * index); }); res.redirect('/?playlist=' + playlists. playlist.url + '&friend=' + data.name); });

22. Url delen Als de gebruiker terugkeert naar de plek waar deze begon, tonen we een bericht met de mededeling dat de playlist aangemaakt is.

| | | | | | | | | | | |

// client///playlist-app.js if (UrlQueryString.friend) { $scope.created = { friend: UrlQueryString.friend, url: UrlQueryString.playlist }; } //index.html

Your playlist with {{created.friend}} has been created! Create another?



Experience The Speed Anywhere

Webdeveloper

Bouw desktopapps met NW.js en JavaScript Gebruik NW.js om desktopapps te maken die draaien op OS X, Linux en Windows

86 ______________________________________________________________ workshops

WORKSHOPBESTANDEN Te vinden op wdmag.nl/WDfiles

Webdeveloper

D

e afgelopen 25 jaar heeft de browser steeds nieuwe mogelijkheden geboden voor de distributie van content en code. Hele ecosystemen zijn ontstaan ter ondersteuning van apps die te benaderen zijn met een simpele url. Hele besturingssystemen werken er inmiddels in de browser. Toch willen we soms nog een app die we op ons systeem kunnen installeren en uitvoeren wanneer we willen – met net dat beetje extra kracht. Wat we nodig hebben, is iets met de lage instap van Node, het developmentgemak van browsers en iets om het allemaal als app te verpakken zodat het op ons traditionele OS draait als een normale, native app. Dat is NW.js (voorheen bekend als Node-WebKit). NW.js bundelt io.js en de WebKitbrowserengine zodat we de volle kracht van Node kunnen benutten via de DOM. Nu kunnen we webapps schrijven en ze tevens uitvoeren in autonome vensters die er bijna hetzelfde uitzien als OS native apps. In deze workshop zetten we NW.js op en creëren we een eenvoudige to-do-app. We laten zien hoe eenvoudig het is om native apps te schrijven met JavaScript en NW.js. We doen dit voor Mac OS X.

1. NW.js installeren Het installeren van NW.js is redelijk simpel. We hoeven maar naar GitHub (github.com/nwjs/ nw.js) te gaan en de juiste build voor ons OS binnen te halen. Je kunt NW.js ook zelf compilen, dat is aan te raden als je zeker wilt zijn van een bepaalde mate van stabiliteit. Voor dit voorbeeld zijn de kant-en-klare binaries prima. Wij hebben de 32-bit release van NW.js 0.12.1 gebruikt op OS X 10.10.3.

2. Verplaatsen Pak je gedownloade pakketje uit. De map bevat het uitvoerbare bestand dat we kunnen gebruiken om onze apps te draaien. Wanneer we onze apps gaan testen en inzetten, gebruiken we de nwjs-app-

bundle uit deze map. Verplaats de hele map dus naar een handige plek – zoals Documents.

3. NW.js-project NW.js-apps zijn eenvoudig, met weinig vereiste dependencies. Je hebt dus geen projecttools nodig, zoals je die bijvoorbeeld vindt in Cordova. Maak ergens een nieuwe map aan en creëer een HTMLbestand genaamd index.html. Voeg onderstaande code toe. Zo maken we de UI van onze app en laden we de NW.js-code om de bouw van ons venster af te handelen.

| | | | | | | | | | | | | | | | |

<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> To Do <meta name="viewport" content="initialscale=1.0, user-scalable=no" />

Hello World



4. Creëer het manifest Net als een io.js-app gebruikt NW.js een JSON-manifest om de boel op gang te krijgen. Maak een bestand genaamd package.json in dezelfde map als index.html. Dit is de root van je NW.js. Alle URI’s zijn relatief ten opzichte van je package.json-bestand.

5. Eenvoudig manifest Open je nieuwe manifest. Het eenvoudigste manifest vereist twee eigenschappen: een main en een

title. De main is het bestand dat onze app uitvoert wanneer deze gestart wordt. In ons geval index. html. Er zijn andere eigenschappen die invloed hebben op hoe je app draait, maar voor nu gebruik je:

| | | |

{ "title" : "To Do Today", "main" : "index.html" }

6. Naar de app verwijzen Wanneer we onze app testen, willen we deze niet voor elke wijziging in de code opnieuw inpakken. We kunnen het uitvoerbare NW.js-bestand gebruiken om onze app uit te voeren door naar de root van ons project te verwijzen. Open een terminal en ga naar de map die je van GitHub gehaald hebt.

7. Onze app uitvoeren Het uitvoerbare NW.js-bestand is begraven in de NW.js-app in onze map. In dit bestand staat de io.jsen NW.js-code. Met NW.js veranderen we de app niet, maar we maken projecten die ermee draaien. Om de app te draaien, gebruik je:

| |

$ nwjs.app/Contents/MacOS/nwjs /path/to/ your/project/root.

8. Eerste indruk Er zal nieuw venster openen en er is een NW.jsicoontje verschenen in je dock. We voeren onze

Code compileren

Omdat je je code niet echt compileert in NW. js, wil je misschien wel je broncode afschermen. Er zijn manieren om het lastiger te maken je broncode te bemachtigen, kijk op de GitHub-wiki van NW.js: github.com/ nwjs/nw.js/wiki.

Links

We willen niet steeds te hoeven bundelen wanneer we gaan testen. Daarom wijzen we de NW.js-binary naar ons project en voeren we deze uit in een terminal Linksboven

Wanneer we onze app de eerste keer uitvoeren, lijkt het op een browser. We passen het manifest-bestand nog aan Rechtsboven

Wanneer het manifest fatsoenlijk aangepast is, lijkt onze app al meer op zijn plek workshops _______________________________________________________________ 87

Webdeveloper Bouw desktopapps met NW.js en JavaScript

eerste NW.js-app uit. We zien ons HTML-bestand, maar het lijkt nog steeds op een browservenster. Om onze app meer native te laten lijken, kunnen we bepaalde elementen verwijderen met ons package.json-manifest.

9. Manifest verbeteren Tijd om wat systeemopsmuk weg te halen! Direct na de main-eigenschap van je manifest, voeg je een window-object toe en pas je de volgende eigenschappen toe:

| | | | | | | | | | | |

{ "title" : "To Do Today", "main" : "index.html" "window" : { "toolbar" : false, "frame" : true, "width" : 480, "height" : 320, "show" : true, "resizable" : true } }

Het window-object bepaalt hoe ons venster zich gedraagt. We kunnen het frame weghalen, de hoogte bepalen, het venster zichtbaar maken op alle werkplekken en nog veel, veel meer. Voor nu zijn deze eigenschappen voldoende.

Node-webkit

NW.js is eigenlijk Node WebKit. De naamsverandering hoorde bij de migratie van het project van Node.js naar io.js. Het gerucht gaat dat de coole gasten het n-dubz noemen (enn-double-you-dot-jayess was wat lang).

Linksboven

Wanneer we ons venster positioneren met code, wordt de linkerbovenhoek relatief gepositioneerd ten opzichte van de top en left Rechtsboven

We moeten door onze structuur bladeren om onze NW. js-app fatsoenlijk te verpakken Rechts

Het maken van ICNS-bestanden kan vermoeiend zijn, maar gelukkig is er Image2icon als je de app voor OS X maakt

88 ______________________________________________________________ workshops

10. GUI maken Als je nu stap 7 herhaalt en de app start, zie je dat de adresbalk weg is en dat het venster de hoogte en breedte heeft die we hebben opgegeven. Alleen de titel en de sluit-, minimaliseer- en maximaliseerknoppen zijn nog over. We kunnen deze ook weghalen, maar dat werkt niet zo handig voor de gebruiker. Die laten we dus staan.

11. Scripts toevoegen Het is tijd om de componenten van onze GUI bijeen te brengen. Open index.html en pas het zo aan:

| | | | | | | | | | | | | | | | | | | | | | | | | |

<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> To Do <meta name="viewport" content="initialscale=1.0, user-scalable=no" />
<script src="scripts/core.js"> <script src="scripts/window.js">

Dit is de markup voor onze lijst. We richten ons niet op de app-logica, dus schrijven we core.js of style. css niet vanaf nul. Je kunt ze vinden in de workshopbestanden.

12. Windows.js We schrijven nu windows.js om te oefenen met NW.js-code. Maak een map genaamd scripts in je root en maak daarin een bestand aan genaamd windows.js. Hier beïnvloeden we het appvenster met events en listeners om onze app die native uitstraling te geven.

13. GUI-module Net als bij een Node-app kunnen we met require() de node-modules en NW.js-globals benaderen. Om de eigenschappen van het venster te kunnen aanpassen en te kunnen luisteren naar events, hebben we de GUI-module van NW.js nodig. Voeg het volgende toe aan windows.js:

| |

var gui = require('nw.gui'), win = gui.Window.get();

14. Menubalk NW.js is platformagnostisch, maar er zijn kleine OS-tweaks om onze app er meer native uit te laten zien. OS X heeft bijvoorbeeld een menubalk met About en Edit, dat hebben wij niet. Voeg onderstaande code toe aan windows.js om de menubalk van onze to-do-app aan te passen met relevantere informatie.

| | | | | |

var nativeMenuBar = new gui.Menu({ type: "menubar" }); nativeMenuBar.createMacBuiltin("ToDo", { // hideEdit: true, hideWindow: true });

Webdeveloper Bouw desktopapps met NW.js en JavaScript

Node-modules NW.js is, gedeeltelijk, io.js. Dat betekent dat je modules kunt gebruiken! Nou ja, in principe. NW.js kun je op alle grote platforms draaien, maar net als bij een native app verschilt het inpakproces per OS waar je je op richt. Je kunt bijvoorbeeld geen .exe uitvoeren op een Mac of een dmg gebruiken in Windows. Wanneer je io.jsmodules wilt gebruiken die een andere taal gebruiken dan het gangbare JavaScript, zul je waarschijnlijk je pakket moeten compileren op je doelsysteem. Gebruik je echter alleen maar JavaScript-modules (zoals de fantastische moment.js- module bijvoorbeeld), dan zou het gewoon prima moeten werken.

15. Venster verbergen Wanneer onze app laadt, zien we een korte flits wit voordat de content van de pagina geladen en geinitialiseerd is. Verander in je package.json de show-waarde van true naar false. In windows.js voeg je aan het eind win.show(); toe. Alsonze app nu laadt, worden de scripts geïnitialiseerd en pas getoond wanneer ze klaar zijn met laden.

16. Venster positioneren Als de app klaar is, kunnen we het venster positioneren. Wanneer we een native app openen in OS X bevindt deze zich meestal op dezelfde plek als bij het afsluiten. We kunnen dit nabootsen. Voeg gewoon het volgende toe voor win.show():

| | | | | | | | | | | | | | |

var initialPosition = { top : 50, left : 50 }; var savedPosition = JSON.parse(localStorage. getItem('windowposition')); win.on('move', function(){ localStorage.setItem('windowposition', JSON. stringify({left : win.x, top: win.y})); }); if(savedPosition !== null){ win.moveTo(savedPosition.left, savedPosition.top); } else { win.moveTo(initialPosition.left,

| |

initialPosition.top); }

Op ons win-object, wat een verwijzing is naar het NW.js-venster, hebben we een event listener toegevoegd. Elke keer dat een gebruiker zijn venster verplaatst, wordt het move-event naar win gestuurd. Als dit gebeurt, wordt onze callback aangeroepen en kunnen we de coördinaten van het verplaatste venster opslaan in localStorage. Zo kunnen we het venster voortaan op de vorige positie openen.

17. Negatieve getallen Als onze gebruiker meerdere schermen heeft en onze app staat op één daarvan, lopen we het gevaar dat we op een onzichtbare plek komen te staan wanneer dat scherm wordt uitgeschakeld. Als onze opgeslagen coördinaten minder dan 0 zijn, overschrijven we de coördinaten en plaatsen we ons venster op het hoofdscherm. Direct na if(savedPosition !== null){ voeg je het volgende toe:

| | | | | | |

if(savedPosition !== null){ if(savedPosition.left < 0){ savedPosition.left = 50; } if(savedPosition.top < 0){ savedPosition.top = 50; }

18. Formaat aanpassen We willen graag dat ons venster niet alleen op dezelfde plek staat als waar we het hebben achtergelaten, maar ook met dezelfde afmetingen. Dat doen we hier. We gebruiken dezelfde methode als bij het move-event en localStorage, maar nu checken we het resize-event. Wanneer ons venster van afmeting verandert, slaan we die afmetingen op in localStorage. Wanneer we onze app herstarten, gebruiken we de opgeslagen afmetingen.

| | | | | | | | | | | | | | | | | | | |

var savedPosition = JSON.parse(localStorage. getItem(‘windowposition’)), savedSize = JSON.parse(localStorage. getItem(‘windowsize’)); win.on(‘move’, function(){ localStorage.setItem(‘windowposition’, JSON. stringify( {left : win.x, top: win.y } ) ); }); win.on(‘resize’, function(width, height){ localStorage.setItem(‘windowsize’, JSON. stringify( {width : width, height : height} ) ); }); if(savedPosition !== null){ if(savedPosition.left < 0){ savedPosition.left = 50; } if(savedPosition.top < 0){ savedPosition.top = 50; }

workshops _______________________________________________________________89

Webdeveloper Bouw desktopapps met NW.js en JavaScript

| | | | | | | | |

win.moveTo(savedPosition.left, savedPosition.top); } else { win.moveTo(initialPosition.left, initialPosition.top); } if(savedSize !== null){ win.resizeTo(savedSize.width, savedSize. height); }

19. Klik om te vergrendelen In de workshopbestanden staat het bestand core. js. Dat heb je als het goed is ook in je scripts-map. Daar gaan we nu wat code aan toevoegen. In onze app zie je rechts beneden in de hoek een open slotje. Dat doet nu nog niks, maar straks fungeert het als schakelaar om onze app te vergrendelen en continu zichtbaar te houden.

20. Code toevoegen Open core.js in je editor en scroll naar beneden totdat je de addEvents-functie tegenkomt. Net voor het einde van die functie voeg je dit toe:

| | | | | | | | | | | | | | |

document.getElementById(‘lock’). addEventListener(‘click’, function(){ var isLocked = this.getAttribute(‘datawindow-is-locked’); if(isLocked === “false”){ win.setAlwaysOnTop(true); win.setVisibleOnAllWorkspaces(true); this.setAttribute(‘data-window-is-locked’, “true”); } else { win.setAlwaysOnTop(false); win.setVisibleOnAllWorkspaces(false); this.setAttribute(‘data-window-is-locked’, “false”); } }, false);

Node.js en io.js: hoe zit het nou? Node wordt ondersteund door het bedrijf Joyent. Dat is om een aantal redenen heel goed geweest, maar veel mensen vonden dat JavaScript-features en –optimalisaties te langzaam in Node werden geïntegreerd. Dit leidde tot io.js, een fork van de Node-broncode, helemaal onderhouden door de community. Er werd meteen begonnen met het implementeren van nieuwe features (zoals ES6-syntax). Dankzij de snellere release-cyclus maakten veel projecten, zoals NW.js, de overstap naar io.js. Joyent en de mensen aan het roer van io.js hebben afgesproken alle wijzigingen van io.js terug te brengen naar Node.js en door te gaan als Node Foundation.

90 ______________________________________________________________ workshops

Als we nu onze app herstarten en op het slotje klikken, sluit het. Als het goed is, blijft onze app nu continu in beeld, ook als je een ander venster of werkblad opent. Als we nog een keer op het slotje klikken, schakelen we deze functie weer uit.

21. Wat hebben we gedaan? Ons package.json-bestand bepaalt het uiterlijk en gedrag van ons venster. We hebben bij het aanpassen van de positie en afmetingen gezien dat we die eigenschappen kunnen overschrijven met JavaScript. Zelfs als het venster gesloten is. Onze winvariabele bevindt zich in de globale scope. Het is dus mogelijk om deze te benaderen vanuit onze app en DOM-events te gebruiken om de eigenschappen aan te passen – hoewel het feitelijk van Node.js is. Wanneer we dan op ons slotje klikken, checken we het data-attribuut window-is-locked op het DOM-element om de huidige staat te verkrijgen. Als het venster niet vergrendeld is, kunnen we win.setAlwaysOnTop(true) en win.setVisibleOnAllWorkspaces(true) gebruiken om het venster vast te zetten.

22. Onze app verpakken Wanneer we nu onze app uitvoeren, hebben we een volledig functionerende to-do-lijst die we vast in beeld kunnen zetten. Je kunt minimaliseren, sluiten en het formaat aanpassen. Tijd om de boel in te pakken. Ga naar de map die je van GitHub gehaald hebt. Kopieer NWJS.app naar de root van je projectmap en klik erop met de rechtermuisknop. Selecteer ‘show Package Contents’ en ga naar Contents>Resources.

23. Bestanden kopiëren Open nog een Finder-venster en kopieer alle bestanden die we gemaakt hebben (zoals index.html, styles.css, de scripts-map en package.json) naar

de nieuwe app.nw-map. Ga terug naar de projectroot en dubbelklik NWJS. Je app zal starten.

24. PLIST aanpassen Onze app ziet er nog steeds uit als een NW.js-app. Om zaken te wijzigen, zoals de naam en het icoontje, moeten we het PLIST-bestand van de app aanpassen. Rechtsklik weer op NWJS en selecteer ‘Show Package Contents’. Ga naar Contents en open het PLIST-bestand. Als je Xcode hebt, wordt de editor geopend, maar je kunt elke editor gebruiken. Verander de ‘Bundle name’ en ‘bundle display’ in ‘ToDo’ en sla op.

25. ICNS maken Als finishing touch passen we het icoontje van de app aan. Je kunt er zelf eentje maken met bijvoorbeeld Image2icon of je gebruikt het ICNS-bestand uit de workshopbestanden. Plaats dit in Content> Resources.

26. Wijzigingen doorvoeren De wijzigingen van het icoontje en de naam vinden niet meteen plaats. Je kunt Finder herstarten of de naam van de .app in je projectroot naar iets anders veranderen en dan weer terug in ToDo. De wijzigingen worden zo zichtbaar.

27. Distributie Nu hebben we een echte OS X-app, aangedreven door JavaScript. Je kunt je ToDo-app nu verplaatsen op jouw systeem of op de computer van iemand anders en, zoals elke andere app, gewoon starten. Als je de app op een ander systeem draait, moet je misschien wat beveiligingsinstellingen aanpassen om je app uit te kunnen voeren. Ga naar System Preferences>Security and Privacy en sta apps van de Mac App Store toe. Zet ToDo in de applications-map en ga je gang.

Plus



Het laatste nieuws, de mooiste sites en de beste tips en trucs

KRACHTIGE ANIMATIES VOOR HET WEB ontdek de beste tools en technologiee¨n om elegante, moderne online animaties te maken

NGMESSAGES MET ANGULAR

Gebruik de ngMessages directive voor contextgevoelige berichten

INTERACTIEVE ANIMATIES

Met de bibliotheek Snap.svg geef je je pagina’s meer swung

RESPONSIVE LAY-OUTS

Combineer HTML en CSS en maak designs op basis van aspectratio’s

BOUW MET BETERE CODE

De beste tools om je code te testen voor snelle, efficiënte sites

Volg Webdesigner webdesignermagazine.nl twitter.com/Web_Designer facebook.com/webdesignermagazine [email protected]

Colofon < abonnementeninformatie > Webdesigner is een uitgave van Life Publications B.V. In licentie van Imagine Publishing, Dorset, Groot-Brittannië. Uitgevers: Wien Feitz en Paul Lemmens Bezoekadres Meijhorst 6010 6537 KT Nijmegen Postbus 31331 6503 CH Nijmegen Tel.: 024-2404636 fax: 024-3723630 Website: www.webdesignermagazine.nl Hoofdredacteur Patrick Smits Redactie Niels Buddiger en Edwin Toonen Met medewerking van Mark Billen, David de Boer, David Boyer, Leon Brown, Anja de Crom, Jo Cruickshanks, Tam Hanna, Ralph Saunders, Mark Shufflebottom, Tim Stone, Sean Tracey Redactie/persberichten F&L Life Publications B.V. o.v.v. Webdesigner adresgegevens zie boven E-mail persberichten: [email protected] E-mail lezersvragen: [email protected] Vormgeving Patrick Maters Druk Habo DaCosta bv, Vianen Website Luc Kickken, Ravi Lautan E-mail: [email protected] Abonnementenservice Tel: 0251-760122 E-mail: [email protected] Commercieel directeur Gerrit-Jan Bomhof Accountmanager Thijs de Hoogh Tel.: 024-2404641 E-mail: [email protected] Traffic/backoffice Marko Versteege Tel.: 024-2404645 E-mail: [email protected] Marketing Marijn van Gelder Tel: 024-2404556 E-mail: [email protected] Copyrights

Het auteursrecht op deze uitgave en op de daarin verschenen artikelen wordt door de uitgever voorbehouden. Voor de uit het Engelse ‘Web Designer’ overgenomen artikelen geldt dat het inhoudsrecht daarvan bij het copyright van het trademark ‘Web Designer‘ van Imagine Publishing, Dorset, Groot-Brittannië ligt, terwijl de vertaalrechten daarvan bij F&L Life Publications B.V., Nijmegen, Nederland berusten. Het verlenen van toestemming tot publicatie in de gedrukte uitgave houdt in dat de auteur de uitgever, met uitsluiting van ieder ander onherroepelijk machtigt de bij of krachtens de auteurswet door derden verschuldigde vergoedingen voor kopiëren te innen en dat de auteur alle rechten overdraagt aan de uitgever, tenzij anders bepaald. Niets uit deze uitgave mag worden overgenomen, vermenigvuldigd of gekopieerd zonder uitdrukkelijke schriftelijke toestemming van de uitgever. De uitgever stelt zich niet aansprakelijk voor eventuele onjuistheden die in deze uitgave zouden kunnen voorkomen. Webdesigner ISSN 1875-8525

Kijk voor de meest actuele aanbieding op

www.fnl.nl/webdesignabo • Profiteer van kortingen • Abonnement met cadeau • Iedere editie de leukste workshops • In huis nog voordat hij in de winkel ligt Klantenservice Nederland De klantenservice in Nederland is bereikbaar via [email protected] of via Postbus 20, 1910 AA Uitgeest t.a.v. Klantenservice Webdesigner. Telefonisch is de klantenservice bereikbaar op werkdagen van 9:00 tot 17:00 uur via telefoonnummer 0251-760122. Klantenservice België De klantenservice in België is bereikbaar via [email protected] of via Diependaalweg 6, 3020 Herent t.a.v. Klantenservice Webdesigner. Telefonisch is de klantenservice bereikbaar op werkdagen van 9:00 tot 17:00 uur via telefoonnummer 028-085523. Het afsluiten van een abonnement kan telefonisch of via www.bladenbox.be. Abonnementsprijzen Webdesigner kost €8,99 per nummer. Het standaardtarief voor Webdesigner is €74,- voor 10 nummers. Deze prijs is bij betaling via

automatische incasso. Voor betaling per factuur geldt een toeslag van €2,50. Abonnementen worden na een jaar automatisch verlengd tegen het dan geldende standaardtarief. Het opzeggen van een abonnement kan schriftelijk per post of e-mail of via www.aboland.nl of www.aboland.be. Vermeld voor een spoedig antwoord duidelijk de abonnee- en adresgegevens (zie adresetiket). Algemene voorwaarden De algemene voorwaarden zijn te vinden op de website www.fnl.nl. Deze voorwaarden zijn ook schriftelijk op te vragen bij Abonnementenland, Postbus 20, 1910 AA Uitgeest.

NVM OPEN H IZEN DAG

R E B O T K 3O 0 0 : 1 1

r u u 0 0 : 5 1 -

Kijk vrijblijvend binnen bij zo’n 50.000 huizen!

De goede prijs... Laat het huis r taxeren doo de NVM!

tip: Hoeveel mag je lenen? De tijd dat je alle bijkomende kosten in je hypotheek kunt opnemen is voorbij. Je mag nu nog maar 103% van de marktwaarde van je nieuwe huis lenen. Dit percentage wordt elk jaar minder tot je in 2018 nog maar 100% kunt lenen Het is dus belangrijk om te gaan sparen voor een huis. Zo moet je in de toekomst niet alleen de nieuwe keuken en dergelijke betalen van eigen geld, maar ook de kosten koper.

Energielabel Bij het kopen van een woning kun je ook letten op het energielabel. Een verkoper is verplicht een energielabel te overhandigen. Hieraan kun je in één oogopslag zien hoe milieuvriendelijk en energiezuinig de woning is in vergelijking met andere woningen van hetzelfde type.

Er zijn zeven verschillende labels. Een huis met energielabel A is zeer energiezuinig. Label G is helemaal niet zuinig. Je kunt energiebesparende maatregelen nemen. Hier moet je dus rekening mee houden bij de financiering, maar het is een investering die zichzelf snel weer terugverdient.

7

Stap-voor-stap

naar je nieuwe woning Je hebt besloten dat je een huis wilt kopen, maar wat dan? Van zoektocht tot sleuteloverdracht, er zijn behoorlijk wat stappen die je moet nemen. Wij zetten ze allemaal voor je op een rij. hoeveel 1. Weet je kunt lenen

Om je droom te bereiken moet je weten wat je maximaal als hypotheek kunt lenen. Je kunt zelf een schatting maken op de websites van verschillende banken en hypotheekadviseurs. Voor een op maat gesneden advies kun je bij deze financiële dienstverleners terecht voor een persoonlijk gesprek.

2.

Wat zijn je wensen?

Stel een wensenlijstje samen. Zo kun je op de NVM Open Huizen Dag gericht op zoek en zie je geen belangrijke dingen over het hoofd. Misschien vind je het wel belangrijk dat er openbaar vervoer in de buurt is of wil je een grote tuin. En ben je je ervan bewust dat de ligging van bepaalde wegen geluidshinder van verkeer kan veroorzaken? Hoe beter je hier van tevoren over nadenkt, hoe minder kans je hebt op teleurstellingen.

3.

Ga op huisbezoek

Kijk op Funda.nl welke huizen 3 oktober meedoen met de NVM Open Huizen Dag. Je kunt op de site de huizen selecteren die aan je wensen voldoen en direct een handige route uitstippelen. Bezoek ook de website van de NVM om een bezichtigingsverslag voor de NVM Open Huizen Dag te downloaden. Deze checklist helpt je bij het op een rijtje zetten van de details van de bezochte huizen.

4. Samen sta je sterker

Een woning koop je niet alleen, maar samen. Een aankoopmakelaar is een goede partner waarbij je je goed kunt laten adviseren over alle stappen van het aankoopproces. Hij kijkt door de roze wolk heen en geeft je een gedegen en eerlijk advies. Hij kan informatie geven over de geschiedenis van het huis, de omgeving

en bestemmingsplannen in de buurt. Ook weet hij of de vraagprijs wel reëel is en kan hij onderhandelingen voor je voeren. Bedenk voordat je gaat onderhandelen wat je maximale bod is om te voorkomen dat je emoties met je aan de haal gaan. Denk ook aan de ontbindende voorwaarden zoals voorbehoud van financiering!

verloopt. Je bepaalt bijvoorbeeld de flexibele voorwaarden en de rentevaste periode. Op basis van jouw wensen maakt de hypotheekadviseur een hypotheekadvies en offerte. De hypotheekadviseur bespreekt dit uitgebreid met jou en als jij er helemaal tevreden mee bent, wordt de hypotheekaanvraag ingediend.

5. Tekenen maar!

7. De praktische zaken

In de koopakte staan afspraken als de prijs, de overdrachtsdatum, ontbindende voorwaarden, maar ook afspraken over wat er in de woning achterblijft, bijvoorbeeld vloeren en gordijnen. Na het tekenen kun je binnen drie dagen zonder opgaaf van redenen ontbinden. Als koper moet je een waarborgsom voldoen of een bankgarantie overleggen. Voor de verkoper is dit een garantie zodat je niet onrechtmatig van de koop afziet. Dit bedrag kun je bij de notaris betalen of als bij de bank aanvragen.

hypotheek 6. De in orde maken

De hypotheek moet rond zijn voor de termijn van de ontbindende voorwaarden



De periode die je wacht op de sleutel van je nieuwe huis is perfect om enkele praktische zaken te regelen. Denk bijvoorbeeld aan je woonverzekeringen en de planning van een verbouwing of de verhuizing. Ook is dit de ideale tijd om te shoppen voor vloeren en gordijnen. Zo maak je van de nood een deugd.

8. Eindelijk: de sleuteloverdracht!

Nog heel even en je kunt gaan genieten van je nieuwe leven. Eerst inspecteer je de woning samen met de verkoopmakelaar en de verkoper. Daarna teken je bij de notaris de akte van levering en de hypotheekakte. En dan is je droomhuis echt van jou!

Met een goede voorbereiding maak je je droomhuis werkelijkheid. 6



Coole gadgets voor je nieuwe huis Als je uiteindelijk een nieuw huis hebt gekozen op de NVM Open Huizen Dag, kun je alvast erover nadenken hoe je die technisch op niveau brengt. Daarom hebben we hier de coolste gadgets verzameld waarmee je je huis ‘slim’ kunt maken.

Honeywell Lyric Wat: Slimme thermostaat die via je smartphone controleert of je thuis bent en de temperatuur regelt. Zo bespaar je op alle mogelijke momenten energie. Prijs: Circa € 250. Info: www.lyric.honeywell.com

iDevices Switch Wat: Een wifi-stekker die je in het stopcontact steekt en waarop alle elektrische apparaten kunnen worden aangesloten. De app onthoudt gebeurtenissen waardoor je de stekker kunt personaliseren. Prijs: Circa €50 Info: www.idevicesinc.com/switch/

Withings Home Wat: Camera met audioverbinding en sensor voor luchtkwaliteit, bedoeld om binnenshuis een oogje in het zeil te houden via je iPhone of iPad. De app geeft een samenvatting van de afgelopen twaalf uur en de camera detecteert bewegingen automatisch. Prijs: € 199,95 Info: www. withings.com/ nl/withingshome.html

Elgato Eve Wat: Serie sensoren voor luchtkwaliteit, -druk en -vochtigheid, temperatuur en energie- en waterverbruik. Via de app krijg je een overzicht van deze gegevens en adviezen voor klimaatbeheersing en besparing. Prijs: € 50 tot € 100 per module. Info: www.elgato. com/eve

Philips Hue Wat: Een serie LED-lampen die via je smartphone op slimme wijze bediend kunnen worden. Ondersteuning voor Apple’s HomeKit is er op dit moment nog niet, maar dat kan niet lang meer duren. Prijs: € 99 tot € 199 voor een startpakket. Info: www.meethue.com

5

Een modern

huis

Een huis kun je op veel verschillende manieren beoordelen. Heel belangrijk is je gevoel, maar daarnaast zijn er wat minder subjectieve zaken waarop je kunt letten. Hoe zit het bijvoorbeeld met de internetverbinding? Is je nieuwe huis klaar voor de toekomst?

Als je huizen gaat bezichtigen op de NVM Open Huizen Dag zijn er een aantal dingen waarop je moet letten. In eerste instantie moet het huis dat je bezoekt natuurlijk fijn aanvoelen. Dat is het allerbelangrijkst. Maar tegelijkertijd is het ook subjectief, en wat doe je als meerdere huizen even fijn aanvoelen? Dan is het zaak om op zoek te gaan naar specifieke zaken die een huis beter maken dan een andere. Voor ons hebben deze zaken vaak te maken met internet, wifi en (mobiele) netwerken.

Internet

Dus, je hebt een huis gevonden dat je mooi vindt. Hoe achterhaal je nu of dat huisje ook echt perfect is? Op technisch gebied zijn er een aantal eenvoudige dingen waarop je kunt letten. Voor veel mensen is een razendsnelle internetverbinding tegenwoordig heel belangrijk. De snelste verbinding van het moment is glasvezel, maar dat heeft nog een beperkte beschikbaarheid. Hiermee zijn in theorie snelheden tot 500 Mb/s mogelijk. Op een site als www. eindelijkglasvezel.nl kun je van tevoren al controleren of glasvezel voor je (nieuwe) huis beschikbaar is. Als er geen glasvezel beschikbaar is, is nog niet alle hoop verloren. Kabelaansluitingen van tegenwoordig zijn maar iets trager dan glasvezel en zijn vrijwel overal beschikbaar. Nog een voordeel: bij veel kabelabonnementen is televisie inbegrepen.

Is ook kabel niet beschikbaar, dan moet je terugvallen op de relatief trage ADSL via de telefoonlijn. Je moet wel heel achteraf wonen, wil er geen telefoonverbinding zijn. Bovendien worden deze aansluitingen de komende jaren geüpgraded naar VDSL waardoor ze ook weer sneller worden.

Wifi

Welke internetverbinding je ook kiest, in veel gevallen komt die binnen in de meterkast van het huis. Daar is op zich niet mis mee, maar denk er wel aan dat de meterkast niet de beste positie is voor je router. Die staat het beste ergens in het midden van het huis, hoog in een kamer geplaatst, bijvoorbeeld op een kast. Een glasvezel-, kabel- of telefoonaansluiting die in de woonkamer binnenkomt is in dat geval praktischer dan in de meterkast. Naast de aansluitingen en positie van de router zijn er nog meer factoren die de kwaliteit van het wifi-signaal in het nieuwe huis kunnen beïnvloeden. Zo werken gipsmuren erg belemmerend, evenals technische apparaten als een magnetron of diepvries. Hoe verder deze verwijderd kunnen staan van je router, hoe beter. Het zijn allemaal dingen waarmee je rekening kunt houden tijdens een bezichtiging op de NVM Open Huizen Dag. Je zult het niet vaak zien, maar een huis met ingebouwde ethernet-aansluitingen in elke kamer is uiteraard perfect voor optimaal bereik in het hele huis. Een bekabelde verbinding is namelijk altijd

4

sneller en betrouwbaarder dan een draadloze. Heeft een huis zoiets, dan is dat een groot pluspunt. Misschien is het juist een reden te kiezen voor een huis waar nog wat aan moet gebeuren, zodat je het aan je wensen kunt aanpassen.

Mobiel bereik

Je denkt er niet zo gauw aan, maar heb je in het nieuwe huis ook wel genoeg bereik met je mobiel? Veel mensen kiezen er tegenwoordig voor om geen vaste telefoonlijn meer te nemen omdat ze toch al een duur mobiel abonnement hebben met voldoende belminuten. Daar heb je echter weinig aan als het bereik slecht is en de verbinding tijdens het bellen wegvalt. Hetzelfde geldt voor de mobiele internetverbinding. In grote steden heb je waarschijnlijk toegang tot 4G of tenminste 3G, maar op het platteland moet je het doen met het erg trage GPRS. Bij het streamen van muziek en video is dat echt niet meer voldoende. Op de sites van de mobiele telecomproviders achterhaal je snel welke netwerken op de plaats van het nieuwe huis beschikbaar zijn.

Conclusie

Met bovenstaande tips is de kans groot dat je het perfecte moderne huis gaat vinden. En als een droomhuis niet aan al jouw digitale wensen voldoet, kun je dit natuurlijk altijd nog zelf realiseren. Houd daarbij rekening met je budget en pak eventuele aanpassingen direct op zodra je het huis koopt.

Bezichtigen met beleid • Kijk vooraf op funda.nl welke huizen je wil bezichtigen. Je hebt maar enkele uren de tijd, dus blijf niet te lang hangen. En vergeet ook niet om je lunchpauze in te plannen. • Denk aan je budget. Bezoek alleen huizen waarvan je de hypotheek kunt veroorloven. Zo bespaar je tijd en teleurstellingen. • Bezoek een week voor de bezichtiging de buurt van de woningen die je wilt bezoeken, liefst zowel overdag als ‘s avonds. • Ga samen. Vier ogen zien meer dan twee. • Neem een stuk papier, een pen en een rolmaat mee. • Is de eerste indruk niet goed? Ga dan gewoon weg.

5

meest gestelde vragen over kopen en verkopen

doet een 1. Wat aankoopmakelaar?

Als je een huis koopt, krijg je meestal eerst te maken met een verkoopmakelaar. Die behartigt echter alleen de belangen van de verkoper, dus het is verstandig om een NVM-aankoopmakelaar in te schakelen, die alleen naar jouw belangen als koper kijkt. Een NVM-makelaar kan zowel aankoop- als verkoopmakelaar zijn, maar nooit voor hetzelfde huis. Zo treedt er geen belangenverstrengeling op.

4. Wat is een optie?

Een optie is een verklaring waarin de partijen aangeven akkoord te zijn met de koopovereenkomst. Een afspraak kan zijn dat je enkele dagen bedenktijd krijgt voor het uitbrengen van een bod. Zo heb je bijvoorbeeld tijd om inzicht in de financiering te krijgen. De NVM-makelaar zal eventuele andere geïnteresseerden laten weten dat er op een woning een optie rust. Een optie kun je overigens niet eisen.

Ik wil een appartement Kan ik de koop 2. kopen. Waar moet ik dan 5. annuleren? op letten? Het kopen van een appartement is op bepaalde punten anders dan het kopen van een woonhuis. Je moet er rekening mee houden dat je te maken krijgt met de Vereniging van Eigenaars (VvE) en met allerlei rechten en verplichtingen. Verder is er bij een appartement sprake van zowel gedeeld eigendom (denk aan liften, gangen, daken) als privé-eigendom (de woonruimte) en dus moet je weten wat wel en niet van jou wordt. De NVM-aankoopmakelaar kan je bij al deze zaken adviseren.

Dat kan alleen wanneer je zogeheten ontbindende voorwaarden, ofwel geldige redenen om de koop te annuleren, in de koopovereenkomst hebt laten opnemen. Denk bijvoorbeeld aan het financieringsvoorbehoud, zodat je de koop kunt annuleren als je de financiering niet rond krijgt, De NVM No-Risk clausule is een ontbindende voorwaarde die je het recht geeft de koop te annuleren als de verkoop van je huidige huis onverhoopt lang duurt. Zo voorkom je dubbele lasten. Meer informatie vind je op www.nvm.nl

Ik ben in onderhande3. ling. Mogen er dan nog bezichtigingen zijn?

Ja, dat mag. Een verkopende makelaar mag met meerdere geïnteresseerden tegelijk onderhandelen, maar dit moet de NVMmakelaar wel aan alle partijen melden. De NVM-makelaar laat trouwens niet weten hoe hoog de biedingen zijn om overbiedingen te voorkomen.

facebook.co m/ NVMOpenHu is #NVMOpenH

uis

tip: Vergeet de kosten koper niet! Bij het kopen van een woning betaal je niet alleen de koopsom van het huis, maar komen er ook nog andere wettelijke kosten kijken die de koper voor zijn rekening moet nemen. Denk daarbij onder meer aan overdrachtsbelasting en notariskosten.Deze kosten vormen de kosten koper, in advertenties aangeduid met de afkorting k.k. Gemiddeld moet je rekening houden met een bedrag van 2,5% tot 3% van de koopsom.

3

Ervaar je toekomstige

droomhuis Je hebt op internet en in de etalage van de makelaar al vele honderden foto’s van woningen bekeken, maar er gaat natuurlijk niets boven het zelf ervaren van een woning. Tijdens de NVM Open Huizen Dag op 3 oktober 2015 kun je vrijblijvend en zonder afspraak tussen 11.00 en 15.00 uur binnenkijken bij al je favoriete deelnemende koopwoningen. Als je het slim aanpakt, kun je al snel drie of meer woningen bezichtigen.

tip: Download de checklist Een checklist is een slim hulpmiddel bij het bezichtigen van een woning. Je kunt via www.nvm.nl/wonen een kant-en-klare checklist, ofwel een bezichtigingsverslag, downloaden. Print deze en neem hem mee. Zo voorkom je dat je de belangrijkste punten overslaat.

2

Een bijlage van

EEN HEERLIJK HUIS De eerste stappen n aar

J E N I EU W WONINGE

Zaterdag 3 oktober 2015

OPEN HUIZEN DAG

www.nvm.nl