Fun with the Windows Subsystem for Linux

Op Build 2016 introduceerde Microsoft het Windows Subsystem for Linux (Beta) , waarmee ontwikkelaars native Ubuntu user-mode console binaries kunnen draaien via de Bash shell in Windows 10. Als u in het Windows Insider-programma bent, hebt u de mogelijkheid gehad om deze functie uit te proberen met behulp van de nieuwste Windows Anniversary Update Insider Builds.

webontwikkelaars zijn gewend om moeilijke keuzes te maken op welke tools en bibliotheken ze kunnen gebruiken op basis van het besturingssysteem waar ze actief aan werken. De WSL is ontworpen en gebouwd door het Windows Kernel Team en geleverd in samenwerking met Canonical, om te helpen Windows 10 ontwikkelaars gebruik maken van de rijke Linux Ontwikkelaar ecosysteem en tools naast de grote tools die ze al gebruiken in Windows, zonder op te starten in een ander besturingssysteem of VM. Dit is zeker een “door ontwikkelaars, voor ontwikkelaars” Windows 10-functie, speciaal ontworpen om een beetje wrijving uit de dagelijkse workflow van ontwikkelaars te verwijderen.

in dit bericht, Ik ga u een paar van de functies van WSL die ik persoonlijk zeer interessant vinden, evenals wijzen u op een aantal middelen om u te helpen meer te leren. Ten eerste zal ik de integratie van nietje commando ‘ s zoals ssh voor het werken met Linux servers en apparaten. Ten tweede zal ik de mogelijkheid demonstreren om Bash scripting te gebruiken om taken op een zeer natuurlijke manier te automatiseren. Ten derde, Ik zal een beetje plezier hebben met de grote command-line compilers, andere tools en de * nix Compatibiliteit aangeboden, en speel een beetje NetHack. Tot slot zal ik je laten zien de mogelijkheid om bestaande Python en andere scripts beschikbaar op het web te gebruiken.

Windows is mijn primaire besturingssysteem en ontwikkelomgeving, en is sinds Windows 3.0 op mijn eerste 286. Niettemin, Ik heb altijd Linux servers of apparaten schoppen rond mijn plaats. Van IoT-apparaten zoals de Raspberry Pi en dedicated router / gateway-apparaten naar Minecraft-servers, ze hebben de neiging om te verzamelen op de planken en hoeken in mijn kantoor. Een ding dat ik altijd moet doen is het beheren en configureren van deze Linux-computers gemakkelijk vanaf mijn belangrijkste werkstation.

Servers en apparaten beheren

Ik run momenteel een headless Ubuntu Minecraft server vanuit mijn huis. Het was het afgelopen jaar mijn kerstcadeau voor mijn 10-jarige zoon, maar het is net zo goed mijn speeltje geworden als het zijne (ok, meer mijn speeltje). Ik gebruikte om een paar client apps te gebruiken om het te beheren vanaf mijn primaire Windows 10 PC, maar nu gebruik ik gewoon command-line ssh vanuit Bash op Windows 10. Met behulp van apps zoals PuTTY en Tera Term zijn prima natuurlijk, net als het gebruik van de grote tools die worden geleverd met Cygwin, maar ik wilde een echt native en natuurlijke ervaring die net goed stroomde. Cygwin vond het altijd een beetje als roerbakken bestellen bij een pizzeria. Het was prima, maar de uitvoering voelde gewoon niet goed voor de omgeving.

Ik heb de publieke / private sleutelparen ingesteld met behulp van ssh-keygen en SSH-copy-id van de WSL, dus naar ssh typ ik gewoon:

$ ssh <gebruikersnaam><server>

Ik heb een alias gemaakt die dat sneller maakt. Dit is een standaard Linux/Bash feature:

$ alias mc=’ssh <user><server>’

nu, om naar de Minecraft server te komen typ gewoon “MC” op de bash prompt in Windows 10.

deze zelfde aanpak werkt natuurlijk met alle Linux-gebaseerde web-of databaseservers of zelfs Raspberry Pi en soortgelijke IoT-apparaten die u gebruikt als onderdeel van uw oplossing.

de mogelijkheid om de shell netjes te beveiligen vanaf een console prompt is slechts EEN gemak en een voorkeur. Echter, als je eenmaal gewend bent om direct in de shell te werken, in een volledige omgeving die nietjes zoals apt, node, Ruby, Python en anderen omvat, open je allerlei mogelijkheden voor automatisering.

Remote Scripting

stel dat je een hele hoop Linux apparaten of servers hebt, en je wilt er een remote commando op Uitvoeren. Ervan uitgaande dat je al je publieke/private sleutelparen hebt ingesteld, kun je eenvoudig remote SSH commando ‘ s van Bash uitvoeren.

bijvoorbeeld, om te zien wanneer de laatste herstarttijd op een externe server was, typt u dit:

$ ssh <gebruiker><server> ‘last-x/grep reboot’

die shells beveiligen naar de server en het last-x commando uitvoeren, en zoekt naar de regels die het woord “Reboot.”Als ik het gebruik tegen mijn Ubuntu Minecraft server, krijg ik dit resultaat:

reboot system boot 4.4.0-28-generic do Jul 7 08:14 nog steeds draaien

dat is een enkele server. Als je een lijst met servers hebt, kun je dat deel ook automatiseren. Ik heb een bestand gemaakt met de naam servers.txt in mijn home directory op WSL. Het bevat een stel Linux server / apparaat namen-een per regel. Ik lees dan dat bestand uit een script dat ik gemaakt in mijn home directory op WSL.

Na jaren werken met apparaten zoals de Raspberry Pi, ik ben een nano soort man (op VMS was ik een LSEdit persoon), dus dit is hoe het script eruit ziet in mijn favoriete console editor:

u kunt natuurlijk gebruik maken van vim of Emacs of een andere editor die werkt in een ubuntu console sessie.

De gebruikte taal is Bash script (ook wel Bash shell script genoemd). Om het script uit te voeren, typ ik gewoon:

$ ./foreachserver.sh ‘last-x / grep reboot’

en het zal itereren over elke server/apparaat in het bestand en dat commando op afstand uitvoeren via ssh. Dit is een heel eenvoudig voorbeeld, natuurlijk, maar je kunt uitbreiden om te redirect in lokale scripts of andere nuttige commando ‘ s. De bash scripttaal is rijk genoeg, zodat u de meeste beheertaken op afstand kunt uitvoeren met behulp van het. U kunt het ook uitbreiden met andere toepassingen die u downloadt naar de WSL of de externe computers.

Wat als u lokale Windows-bestanden en bronnen wilt gebruiken met uw workflow met andere Linux-computers? Of, wat als je helemaal geen Linux gebruikt? Is Bash in staat om te werken met lokale Windows-bestanden en bronnen, of is het een volledig geïsoleerde omgeving?

werken met Windows-bestanden

de WSL heeft toegang tot het bestandssysteem van uw PC via/mnt/<stationsletter> / mappen (of koppelpunten). Bijvoorbeeld, je C: en D: root directory ‘ s in Windows zouden beschikbaar zijn via respectievelijk /mnt/c/ en /MNT/d/ in de WSL. Dit kan handig zijn wanneer u uw Windows-projectbestanden, downloads of andere bestanden wilt opnemen in een Linux/Bash-gebaseerde workflow.

Deze kaart naar de SSD en mechanische aandrijving heb ik op de PC:

Dit zijn de logische garnituren, zodat ze niet op dit moment weergegeven wanneer u commando ‘ s zoals de berg in de shell. Maar ze werken zoals je zou verwachten. Bijvoorbeeld, vanuit Windows, Ik plaatste een tekstbestand met de naam test.txt in de root van mijn C-schijf. Ik kan het als volgt benaderen vanuit WSL:

tijdens de Build Tour wilden we er zeker van zijn dat de demo ‘ s zonder internettoegang werkten (je weet nooit hoe venue networking eruit zal zien). Dus om er zeker van te zijn dat de Bash / WSL demo zou werken voor het GIT gedeelte, en om de toegang tot Windows bestanden op de lokale PC aan te tonen, heb ik een lokale repo opgezet op C:gitNetHack op de Windows PC. Om dat binnen WSL te klonen, voerde ik het volgende Uit:

$ git –clone file:///mnt/c/Git/NetHack

die commandoregel vertelde git het file:// protocol te gebruiken en de repo in /mnt/c/Git/NetHack te klonen. U kunt toegang krijgen tot al uw Windows-bestanden op een soortgelijke manier.

waarschuwing: zoals met elke console, kunt u bestanden in uw Windows bestandssysteem wijzigen/verwijderen vanuit Bash als u niet voorzichtig bent. Bijvoorbeeld, u kunt iets doen als de onderstaande en uiteindelijk veeg uit een goed deel van uw Windows-installatie, ervan uitgaande dat de Windows-account die u draait Onder heeft rechten om dit te doen:

$ rm-rf /mnt/C/ <strong></strong>

Ik breng dit naar voren omdat Linux commando ’s nieuw zijn voor velen van ons, terwijl Windows console commando’ s zijn niet.

De magie die deze integratie van het bestandssysteem mogelijk maakt, wordt DrvFs genoemd. Als u meer wilt weten over het bestandssysteem en hoe het werkt in WSL leren, de WSL team samen een geweldige blog post met alle details.

natuurlijk is toegang tot het bestandssysteem slechts een deel van het verhaal. Veel ontwikkeltaken omvatten toegang tot externe bronnen via HTTP of andere netwerkprotocollen.

HTTP-verzoeken maken

Het is vaak handig om een REST-of andere HTTP (of FTP) aanroep te doen vanuit een script of opdrachtregel in plaats van vanuit een gecompileerd programma of webpagina. Net als de meeste Linux distributies, WSL bevat standaard hulpprogramma ‘ s zoals curl en wget voor het maken van HTTP en andere netwerkgesprekken. Bijvoorbeeld, hier is de rest oproep aan GitHub om mijn profiel informatie te krijgen, met behulp van Krul:

u kunt dit combineren met Bash-scripting om snelle testclients voor REST-API ’s te maken, of hulpprogramma’ s om webpagina ‘ s op servers te pingen en de status terug te rapporteren. Het is ook geweldig om gewoon een bestand van het web te downloaden; Je kunt de uitvoer gewoon omleiden naar een bestand in plaats van het op het scherm te bekijken:

$ curl-i https://api.github.com/users/Psychlist1972> pete.json

Ik ben ook een PowerShell-gebruiker en heb zelfs een aantal interessante extensies gemaakt om Windows 10 MIDI in PowerShell te gebruiken en ook om een aantal bestandscorruptie op te lossen die gebeurde met gebruikers van bepaalde geluidsopnamehardware. Als een oude. NET ontwikkelaar en fan, Ik zal blijven gebruiken en uitbreiden PowerShell als het zinvol is voor mijn projecten. Maar PowerShell is niet de juiste omgeving om al die Bash en Linux-gerichte open source hulpprogramma ‘ s en voorbeelden uit te voeren op het web vandaag. Ik wil de makkelijkste en meest frictievrije manier gebruiken om elke taak te volbrengen, en soms betekent dat dat je het in Bash moet doen.

Ik heb hier nauwelijks het oppervlak van Bash, Bash scripting, en de taken die je kunt uitvoeren vanuit de shell. Tot nu toe heb ik het gehad over nutswerk dat nuttig is, maar bijkomend voor ontwikkeling. Hoe zit het met het doen van werkelijke ontwikkeling en compilatie vanuit WSL? Ik heb dat laten zien als onderdeel van de Build Tour.

Bash tijdens de Build Tour – NetHack

eerder deze zomer, sprekers van Microsoft gingen over de hele wereld demonstreren enkele van de coole nieuwe Ontwikkelaar functies in Windows en de Microsoft Cloud. Als onderdeel daarvan wilden we de WSL op een leuke manier demonstreren, maar ook op een manier waar ontwikkelaars zich mee zouden verhouden.

persoonlijk wilde ik laten zien met behulp van git en enkele traditionele console ontwikkeltools. Toen ik de Bash demo schreef, heb ik de basics toegevoegd (“Hello World” in Python en Ruby), maar wilde iets meer buiten de gebaande paden laten zien.

Ik dacht terug aan mijn tijd op de universiteit, toen we heen en weer stuitten tussen Unix (DEC Ultrix en SunOS) en VAX/VMS. Op dat moment was Unix bijna uitsluitend een command-line first environment. Op mijn school, de meeste x-Gebruikers op de handvol grafische werkstations net geopend meerdere terminal sessies in verschillende vensters, maar met super-cool maanfase behang op de achtergrond. De meerderheid van de studenten gebruikte VT-220 terminals voor hun sessies (de school was niet ver van Boston, dus we hadden veel DEC apparatuur).

op dat moment waren er twee grote spellen die alle computer science majors speelden: MUDs (voornamelijk Lpmud en de gloednieuwe destijds DikuMUD) en NetHack. NetHack en andere Roguelikes worden beschouwd als een van de meest invloedrijke games in de geschiedenis, de voorlopers van de vele dungeon crawl en role-playing games die we vandaag genieten.

NetHack heeft een lange geschiedenis en bevat vandaag meer dan honderdduizend regels van tientallen jaren oude *nix-code, evenals moderne toevoegingen. Het spel zelf maakt gebruik van vloeken (of zijn vervangingen) voor terminal interactie, vereist lex en yacc (of flex en bison) en cc (of gcc), en een hoop andere ontwikkelaarstools te bouwen.

Het is geschreven in C en bevat een aantal zwaar scripted configuratie utilities geschreven voor de Bourne shell. Ik dacht dat het zou een goede en leuke test om de ontwikkelaar mogelijkheden van WSL en Bash oefenen op Windows 10. Door het gebruik van vloeken (libncurses op Linux en WSL), zou het ook helpen om de mogelijkheden van de terminal emulatie ingebouwd in het Windows 10 console venster te demonstreren.

vroeger duurde het bouwen van NetHack vanuit de bron een eeuwigheid op onze Ultrix-server in tijd gesneden. Nu duurt het een minuut op mijn PC en het is allemaal klaar. Ik hou van vooruitgang. Er zijn eenvoudige en harde manieren om NetHack te configureren en te compileren op Linux of WSL. Om je wat tijd te besparen, zal ik je door de makkelijke aanpak leiden.

Prerequisites

werk eerst uw WSL-omgeving bij om er zeker van te zijn dat u naar de nieuwste softwarecatalogus verwijst en dat de basisinstallatie up-to-date is. Het is over het algemeen een goed idee om dit te doen voordat u nieuwe pakketten installeert.

$ sudo apt update
$ sudo apt upgrade

installeer vervolgens de essentiële developer tools. De makkelijkste manier om dit te doen is om het build-essential pakket te gebruiken. Dit omvat bijna elk console-programma dat een Linux-Ontwikkelaar nodig zou hebben om apps in C/C++te bouwen.

$ sudo apt install build-essential

Dit duurt een paar minuten. Als je meer chirurgisch wilt zijn, kun je apart GCC, GDB, make, flex, bison en de andere tools installeren die in de NetHack docs worden gevraagd. Maar als je een ontwikkelaar bent, zul je waarschijnlijk de andere tools op een bepaald punt willen. Het bouw-essentiële pakket neemt het giswerk uit de toolset installatie.

installeer vervolgens git. Zoals je je kunt voorstellen, is het zo eenvoudig als:

$ sudo apt install git

net als bij Linux, kun je een git PPA toevoegen om een recentere versie te krijgen, maar deze zal doen voor wat we hier doen.

en tot slot willen we curses (ncurses, eigenlijk) geïnstalleerd hebben voor de interactie van het console scherm:

$ sudo apt install libncurses-dev

als je deze stappen hebt voltooid, ben je klaar om NetHack te bouwen.

Building NetHack

de officiële NetHack repo is op GitHub. Eerst pakken we dat en zetten het in een submap van onze persoonlijke map.

$ cd ~
$ git clone http://github.com/NetHack/NetHack

omdat NetHack zoveel verschillende besturingssystemen ondersteunt, heb je om wat basisconfiguratie te doen om het te vertellen dat we Linux gebruiken op de opdrachtregel en vrije en open source tools vervangen voor Unix klassiekers zoals GCC voor CC.

zoals ik al zei, zijn er een aantal manieren om dit te doen. Iemand was attent genoeg om veel van de configuratie in een hints-bestand te vatten. Geloof me hier, het gebruik van het hints bestand bespaart u uren hoofdpijn in configuratie versus de stappen beschreven op de GitHub repo. Het is niet direct duidelijk hoe je de hints moet gebruiken als je naar de README bestanden of andere documentatie kijkt, dus hier ga je:

$ cd NetHack/sys / unix
$. /setup.sh hints / linux

die de makefile zal Instellen om de juiste tools, bibliotheken en paden voor Linux te gebruiken. De setup scripts zijn niet-triviale shell scripts die veel configuratie doen; Ik ben blij om te melden dat ze perfect werken in WSL. Als je nieuwsgierig bent naar shell scripting, zorg er dan voor dat je ze opent in je favoriete editor.

dan, de uiteindelijke build:

$ cd ~/NetHack
$ make all

na de build, wilt u de installatie maken. Dit is eigenlijk gewoon over het kopiëren van het uitvoerbare bestand naar een bekende locatie:

$ make install

dat zal je dan verlaten met een map genaamd ~/nh. Nethack bevindt zich in de ~/NH/install/games directory en heet gewoon nethack. Om het uit te voeren, navigeert u naar die map (of typt u het volledige pad) en typt u:

$ cd ~/NH/install/games
$ nethack

zodra u dat doet, zal het scherm leeg zijn en wordt u gevraagd om NetHack te spelen. Merk op dat alles hier gedaan is net zoals het zou worden gedaan op een vanilla Ubuntu Linux installatie; niets Windows-specifieke was nodig.

het spelen van NetHack

gezien de beperkingen van een console spel en de complexiteit van NetHack, kan het een beetje duren om erin te komen. Om te zeggen dat het is een beetje cryptisch op het eerste zou een understatement, maar ik heb nog nooit een ontwikkelaar die schuwde weg van een goede uitdaging ontmoet.

de navigatietoetsen zijn dezelfde als die gebruikt worden in VI (M), dus HJKL voor respectievelijk links, omlaag, omhoog en rechts. Om te verlaten, kunt u de trap omhoog op het hoogste niveau te vinden en ze te gebruiken, of druk op Control-C om het spel te stoppen.

In NetHack bent u het @ symbool. Elk niveau bestaat uit kamers, gangen, deuren en zowel trappen op en neer. Monsters, schat, en items worden weergegeven als verschillende ASCII personages die je vertrouwd met worden als je speelt. Zoals de norm is bij Roguelikes, is er geen redding en krijg je maar één leven. Als je sterft en opnieuw speelt, wordt de kerker willekeurig opnieuw gegenereerd en worden de items versleuteld.

Het doel van NetHack is om de kerkers te overleven, goud en voorwerpen te verzamelen en zoveel mogelijk monsters te doden. Er zijn doelen veel verder dan dat, maar je moet spelen voor een tijdje (of lezen) om ze te ontdekken. Regels volgen losjes Dungeons & Dragons regels voor wapens, vaardigheden, enz.

Hier is een screenshot van NetHack met drie kamers en twee gangen zichtbaar. De trap naar boven is in de linker bovenkamer, en ik ben momenteel in de rechter bovenkamer, samen met een aantal schatten en andere items.

Als u geen kleur in uw versie heeft, maak dan een bestand aan met de naam ~/.nethackrc en zet het volgende erin:

OPTIONS = color: true, dark_room: true, menucolors: true

terzijde: Als ASCII karakter graphics zijn niet uw ding, maar je houdt van het concept, zoeken naar “roguelike” in de Microsoft Store en geniet van de meer visuele games in dit populaire genre.

zeker, NetHack is een oude codebasis, het dierbaarst voor degenen onder ons van een bepaalde leeftijd. Echter, building it maakt gebruik van een aanzienlijk aantal belangrijke ontwikkeltools en functies van *nix besturingssystemen, en ook de terminal emulatie. Het is geweldig om te zien dat alles, van gcc, GDB, make, bison en flex tot modernere git, vandaag de dag werkt op WSL.

als je de bovenstaande demo wilt zien zoals gedaan tijdens de Build Tour, bekijk dan deze keynote van de Build Tour Canada. De WSL demo begint rond 6: 20 in. (En ja, het is Windows subsysteem voor Linux, ondanks wat ik zei in die video.)

https://channel9.msdn.com/Events/Build/Build-Tour-2016-Toronto/Keynote

Ik hoop dat u geniet van uw excursie in de kerkers van NetHack!

C en c++ zijn geweldig, net als al deze klassieke ontwikkeltools. Je kunt zelfs veel doen met gewone Bash scripting. Maar veel ontwikkelaarstaken omvatten scripttalen zoals Python.

Python

u kunt voorbeelden van Python-scripts over het hele web vinden, wat impliceert dat Python zowel populair als nuttig is voor veel ontwikkelaars. De meeste van die voorbeelden gaan er natuurlijk van uit dat je Linux draait. In het verleden betekende dit het uitvoeren van ze in een Linux installatie op een andere machine, een VM of boot optie, of het maken van de vereiste wijzigingen die nodig zijn om ze uit te voeren met behulp van de Windows-distributies van Python.

Dit zijn geen onoverkomelijke problemen door een stretch, maar in het dagelijks leven van een ontwikkelaar, tellen kleine stukjes wrijving zoals deze op. Met WSL heb je altijd een compatibel Python-compatibel subsysteem en shell beschikbaar voor je, zonder dat je uit je zone hoeft te stappen.

om de nieuwste ontwikkelversie van Python en het python pakket installer “pip,” te installeren, voert u het volgende uit op de Bash shell prompt:

$ sudo apt install python-pip python-dev
$ sudo pip install –upgrade pip

nu Python is geïnstalleerd, wilde ik laten zien hoe u een typisch Linux Python voorbeeld van een site kunt pakken en er direct mee kunt werken. Ik ging naar de Activestate Python recept site en pakte de top Python voorbeeld. Oké, ik heb gelogen. De bovenste is voor het afdrukken van namen van gehele getallen, en dat klonk niet super spannend, dus koos ik de tweede: Tetris. Ik dacht dat jullie elke dag genoeg praktische Python zien, dus ik ga voor een ander spel.

Ik opende nano, kopieerde de 275 regels Python code direct van de pagina in mijn browser op Windows, plakte ze in nano in mijn WSL console venster, opgeslagen als tetris.py en dan gewoon uitgevoerd:

$ python tetris.py

die onmiddellijk het scherm gewist en bracht een basis Tetris applicatie. Net zoals bij NetHack gebruik je dezelfde VI-standaard bewegingssleutels. (Terug in de dagen voor de muis en WASD toetsen voor beweging, de rechterhand was op het toetsenbord hjkl toetsen.)

zoals ik al zei, kunt u natuurlijk Python draaien op Windows zonder WSL. Echter, voor snelle hulpprogramma ‘ s en voorbeelden, in staat zijn om een Linux Python voorbeeld draaien zonder veranderingen gewoon door het plakken in een aantal code van een bekende bron is een grote productiviteit boost voor ontwikkelaars.

daar gaat het eigenlijk om. Het gaat niet om het vervangen van andere Windows-native tools zoals Python, PowerShell, C# en meer. Het gaat over het verwijderen van wrijving wanneer je gewoon nodig hebt om dingen gedaan snel en efficiënt in een moderne ontwikkeling workflow.

tussen Bash, Python en alle native command-line Linux development tools, WSL heeft mijn Linux workflow behoeften gedekt. Het is geen Linux server of zelfs geen volledige Linux client. In plaats daarvan is het precies wat ik nodig heb om wat dagelijkse wrijving te verminderen en het ontwikkelen van Windows nog productiever en plezieriger te maken.

uw WSL-omgeving resetten

experimenteer gerust. Als u uw WSL-installatie beschadigt, is het eenvoudig genoeg om opnieuw te installeren. Zorg ervoor dat kopieën van alles wat belangrijk is.

C:> lxrun.exe / uninstall / full
C:> lxrun.exe / install

Hoe gebruikt u Bash en de WSL?

We hopen dat het hebben van WSL, en Bash in het bijzonder, op Windows 10 helpt u een beetje efficiënter en verwijdert een beetje wrijving van uw dagelijkse ontwikkeling taken.

Hoe gebruikt u de WSL op Windows 10? Hoe zou je het willen gebruiken?

het team doet veel werk om ervoor te zorgen dat WSL een geweldig console gereedschap is voor ontwikkelaars. Als je feedback hebt of problemen ondervindt, raden we je aan de GitHub issues pagina te bekijken, evenals de Uservoice Feedback en stemsite. We horen graag van je.

extra referenties en verder lezen

Linux shell scripting is een enorm onderwerp en er zijn veel geweldige tutorials op het web. Als u nog niet bekend bent met het en wilt u meer leren, de meeste elke Bash tutorial zal werken voor u. Hier is er een om mee te beginnen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *