ID.nl logo
Zo kun je programmeren in Python - Deel 5
© Reshift Digital
Zekerheid & gemak

Zo kun je programmeren in Python - Deel 5

In de href="https://computertotaal.nl/artikelen/pc/zo-kun-je-programmeren-in-python-deel-4/" rel="noopener noreferrer" target="_blank">vorige les</a> toonden we allerlei manieren om de uitvoer van tekst op het scherm aan te passen. In deze les zetten we de stap van je scherm naar bestanden: we gaan gegevens uit bestanden lezen en naar bestanden schrijven. Daarnaast leer je reageren op exceptions: foutmeldingen die Python je geeft als er iets misgaat.

Twee lessen geleden gebruikte je de functie input om wat de gebruiker op zijn toetsenbord intypt te registreren. En in de vorige les toonden we je hoe je met de functie print uitvoer op het scherm toont. Maar in- en uitvoer kan ook via bestanden verlopen. Laten we eens kijken hoe dat gaat.

Hier kun je les vier bekijken.

We beperken ons in deze les tot het lezen en schrijven van tekstbestanden. Je kunt ook met binaire bestanden werken, die willekeurige data in een andere vorm dan tekst kunnen bevatten, maar dat is wat meer werk omdat je de data nog moet interpreteren. Voor de rest werkt dit hetzelfde.

Een tekstbestand lezen

We tonen hier in een voorbeeld hoe je op een Linux-machine zoals een Raspberry Pi met Raspberry Pi OS (tot voor kort Raspbian geheten) het bestand met de lijst van gebruikers uitleest. Ook op macOS werkt dit voorbeeld. Gebruik je Windows, maak dan zelf een bestand aan met de inhoud die we in ons voorbeeld tonen en pas de locatie van het te openen bestand aan in je Python-code.

De eenvoudigste manier om een volledig tekstbestand uit te lezen en op het scherm te tonen, heeft maar twee regels nodig:

with open('/etc/passwd', 'rt') as bestand:

print(bestand.read())

In de eerste regel openen we het bestand met de functie open. Het eerste argument is het bestand dat we willen openen. We hebben hier een volledig pad gebruikt: '/etc/passwd'. Als je een bestand wilt lezen dat in dezelfde directory staat als waarin je de Python-interpreter hebt opgestart, hoef je geen volledig pad door te geven: de bestandsnaam volstaat dan. Met het tweede argument 'rt' geven we aan dat we het bestand willen lezen en dat het om een tekstbestand gaat.

De constructie met with is wat Python een ‘context manager’ noemt. In het with-blok heb je toegang tot het object bestand dat het geopende bestand voorstelt. Na het with-blok wordt het bestand automatisch gesloten, zodat je het niet meer kunt lezen. Dit lijkt vanzelfsprekend, maar dat is het niet: ook zonder with kun je bestanden openen, maar als je dan het bestand na gebruik vergeet te sluiten, kan dit tot problemen leiden. Werk dus nooit met bestanden zonder with.

In de tweede regel roepen we de functie read op het object bestand aan. Deze functie geeft de volledige inhoud van het tekstbestand terug als een string, die we dan met print op het scherm tonen. Op een typisch Linux-systeem ziet de uitvoer er als volgt uit (we tonen hier maar enkele regels):

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

Enzovoort

Een tekstbestand regel voor regel lezen

Maar wat als we niet het hele bestand in één keer willen inlezen, maar regel voor regel, bijvoorbeeld omdat we willen testen of de regels aan specifieke voorwaarden voldoen? Geen probleem, ook dat is in Python heel eenvoudig. In plaats van de functie read op je bestand toe te passen, ga je dan met een for-lus door de elementen van het bestand. Het tekstbestand dat je van de functie open terugkrijgt, gedraagt zich immers als een lijst met als elementen de opeenvolgende regels in het bestand.

Een string splitsen

Maar als we die regels een voor een gaan inlezen, moeten we er ook iets mee doen. Zoals je ziet, bevat het bestand /etc/passwd op elke regel allerlei informatie over de gebruiker, telkens afgescheiden door een dubbele punt. We willen elk van die gegevens afzonderlijk uitlezen. Dat gaat eenvoudig met de functie split die we op een string kunnen uitvoeren. Bijvoorbeeld:

>>> 'root:x:0:0:root:/root:/bin/bash'.split(':')

['root', 'x', '0', '0', 'root', '/root', '/bin/bash']

Je ziet hier dat we aan de functie split het teken meegeven dat de verschillende componenten van de string afscheidt: ':'. Het resultaat is een lijst met strings die onderdeel uitmaken van onze lange string, zonder de afscheidingstekens ':'.

De opeenvolgende componenten in de regels van het bestand /etc/passwd hebben overigens de volgende betekenis: gebruikersnaam, ongebruikt, ID van de gebruiker, ID van de groep, volledige gebruikersnaam, persoonlijke map van de gebruiker, shell van de gebruiker.

Een lijst uitpakken

Je kunt nu naar de elementen in de gesplitste string verwijzen met een index, bijvoorbeeld:

>>> informatie = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> informatie[0]

'root'

>>> informatie[6]

'/bin/bash'

Maar dat is niet heel duidelijk. Zo willen we informatie[0] eigenlijk gebruiker noemen en informatie[6] de naam shell geven. Gelukkig kun je in Python de elementen van een lijst eenvoudig in één keer aan enkele variabelen toekennen. Dat heet unpacking. In ons voorbeeld gaat dat als volgt:

>>> gebruiker, *_, naam, directory, shell = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> gebruiker

'root'

>>> _

['x', '0', '0']

>>> naam

'root'

>>> directory

'/root'

>>> shell

'/bin/bash'

De notatie * gebruik je om een willekeurig aantal elementen uit te pakken. Omdat we in dit geval niet in deze elementen geïnteresseerd zijn, kennen we ze toe aan de variabele met de naam _, vandaar dat we bij het uitpakken *_ gebruiken. We konden dit hier ook vervangen door gebruiker, _, _, _, naam, directory, shell.

Gegevens uit een tekstbestand filteren

Dan weet je nu genoeg om de volgende opdracht uit te voeren: lees het bestand met wachtwoorden regel per regel in en als de shell geen '/usr/sbin/nologin' of '/bin/false' is, toon je de gebruikersnaam, volledige gebruikersnaam en persoonlijke map.

De code ziet er als volgt uit:

with open('/etc/passwd', 'rt') as bestand:

for regel in bestand:

gebruiker, *_, naam, directory, shell = regel.strip().split(':')

if shell not in ['/bin/false', '/usr/sbin/nologin']:

print(' {1} ({0}): {2} ({3})'.format(gebruiker, naam, directory, shell))

We openen dus het bestand /etc/passwd als tekstbestand om te lezen. Voor elke regel in het bestand pakken we de verschillende elementen uit in enkele variabelen. We kijken dan of de shell niet gelijk is aan de twee eerdergenoemde shells. Als aan die voorwaarde is voldaan, tonen we de gebruiker, zijn volledige naam, zijn persoonlijke map en zijn shell.

Er is slechts één nieuwigheid in deze code: de functie strip. Die verwijdert witruimte en nieuwe regels aan het begin en het einde van een string. Dat hebben we hier nodig omdat de shell op het einde van de regel staat en er daar dus een teken voor een nieuwe regel komt. Zonder die aanroep van strip zou de vergelijking in de regel erna niet werken.

Naar een tekstbestand schrijven

Naar een tekstbestand schrijven, verloopt op een vergelijkbare manier als een tekstbestand lezen. We beginnen een with-blok waarin we het bestand openen en daarin schrijven we naar het bestand:

with open('bestand.txt', 'wt') as bestand:

bestand.write('Dit is de eerste regel.\n')

bestand.write('Dit is de tweede regel.\n')

bestand.write('Dit is de derde regel.\n')

Op het einde van elke regel moet je zelf een teken voor een nieuwe regel toevoegen: \n. Een andere manier om een regel naar een tekstbestand te schrijven, is met de functie print, die automatisch een nieuwe regel toevoegt:

print('Dit is de eerste regel.', file=bestand)

Merk op dat we het bestand openen met als tweede argument 'wt', waarmee we aangeven dat we naar het bestand willen schrijven. Op deze manier overschrijven we alle al bestaande inhoud van het bestand, dus let hiermee op!

Als je deze situatie wilt vermijden, kun je open aanroepen met de bestandsmodus 'xt'. Als het bestand nog niet bestaat, doet die hetzelfde als 'wt': je kunt naar het bestand schrijven. Maar als het bestand al bestaat, krijg je een foutmelding:

with open('bestand.txt', 'xt') as bestand:

print('Dit is een test.', file=bestand)

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

Traceback (most recent call last):

File "<pyshell>", line 1, in <module>

FileExistsError: [Errno 17] File exists: 'bestand.txt'

Een andere interessante bestandsmodus is 'at' (van ‘append’): hiermee voeg je aan het einde van een bestaand tekstbestand regels toe.

Exceptions afhandelen

In het voorbeeld hierboven zou je waarschijnlijk de foutmelding dat het bestand al bestaat op een nettere manier willen afhandelen. Wat we tot nu toe een foutmelding genoemd hebben, heet in Python een exception. Er bestaan verschillende types exceptions en in je Python-code kun je eenvoudig het optreden van exceptions afvangen. Dat gaat als volgt:

try:

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

except FileExistsError:

print('FOUT: Het bestand bestaat al.')

De code binnen het try-blok wordt uitgevoerd zoals normaal. Maar als er binnen dit blok een exception voorkomt, gaat het programma door naar het except-blok. Daarin hebben we aangegeven dat we alleen in de exceptions van het type FileExistsError geïnteresseerd zijn. In het geval er zo een voorkomt, tonen we onze eigen foutmelding. Daarna gaat het programma verder na het except-blok.

Als je meerdere types exceptions wilt afvangen, voeg je meerdere except-blokken toe met elk het andere type exception. Als je voor meerdere types exceptions dezelfde code wilt uitvoeren, dan zet je die exceptions tussen haakjes, zoals hier:

except (ZeroDivisionError, ValueError):

En als je op alle mogelijke exceptions hetzelfde wilt reageren, voeg je gewoon een except-blok zonder de naam van een exception toe, al is dat niet zo vaak zinvol.

Samenvatting

In deze les hebben we geleerd hoe we tekstbestanden kunnen inlezen en strings in onderdelen kunnen splitsen. Ook in de andere richting kun je nu met tekstbestanden werken: je kunt willekeurige tekst naar een bestand schrijven. En doordat je hebt geleerd hoe je exceptions kunt afvangen, hoeven de gebruikers van je programma geen cryptische foutmeldingen van Python meer te krijgen. Omdat je met deze kennis al complexere Python-programma’s kunt schrijven, leer je in de volgende les hoe je je programma meer kunt structureren in functies en modules.

Opdracht

Vraag de gebruiker om een regel zoals root:x:0:0:root:/root:/bin/bash voor gebruik in een wachtwoordbestand op te geven. Schrijf de belangrijkste elementen van de regel naar een afzonderlijke regel in een bestand, in de vorm: Gebruiker: root Naam: root Directory: /root Shell: /bin/bash Zorg dat je programma een heldere foutmelding geeft als de regel niet de correcte vorm voor een wachtwoordbestand heeft.

Uitwerking

regel = input('Voer een regel voor het wachtwoordbestand in: ') try: gebruiker, _, _, _, naam, directory, shell = regel.strip().split(':') with open('wachtwoordbestand', 'wt') as bestand: print('Gebruiker: {}'.format(gebruiker), file=bestand) print('Naam: {}'.format(naam), file=bestand) print('Directory: {}'.format(directory), file=bestand) print('Shell: {}'.format(shell), file=bestand) except ValueError: print('Voer de regel in de volgende vorm in:') print('gebruiker:x:0:0:naam:directory:shell') Dit is een rechtstreekse combinatie van alles wat je in deze les geleerd hebt. Let op: we hebben hier wel gebruiker, _, _, _, naam, directory, shell nodig en niet de kortere versie gebruiker, *_, naam, directory, shell. Met die laatste regel garanderen we immers niet dat de regel uit exact zeven elementen bestaat.

Cheatsheet

exception: een foutmelding in Python pad: de locatie van een bestand, met alle bovenliggende directorynamen erbij

▼ Volgende artikel
Kort programma op je wasmachine gebruiken: slim of juist niet?
© Sergei Klopotov
Huis

Kort programma op je wasmachine gebruiken: slim of juist niet?

Je favoriete broek is vies. Eigenlijk wil je hem morgen weer aan, maar je moet zo weg. Het korte programma lijkt dan een logische keuze: binnen een half uur (en soms zelfs korter) ben je klaar. Maar ís het wel zo slim? Dat hangt sterk af van wat je erin stopt en wat je ervan verwacht.

In dit artikel

Je ziet wanneer een kort programma handig is en wanneer het beter is om een ander programma te kiezen. We leggen uit hoe schoon zo'n snelle was echt wordt, wat het betekent voor je energieverbruik en wat vaak wassen op lagere temperaturen met je machine doen. Ook lees je hoe je een kort programma zo gebruikt dat je was goed schoon wordt en je machine fris blijft.

Lees ook: Wat doet de stoomfunctie van een wasmachine en wanneer heeft het zin?

Korte wasprogramma's: zo zit het

Een kort wasprogramma is bedoeld om licht vervuilde was in weinig tijd schoon te krijgen. Daardoor doet de wasmachine een paar dingen anders dan bij een standaardprogramma. De wastijd is kort, de fase waarin wasmiddel echt kan inwerken is beperkt en ook het spoelen en centrifugeren duren vaak korter. Ook de temperatuur is lager dan bij reguliere wasprogramma's. Veel korte programma's draaien op 30 graden en soms zelfs op 20 graden. Vaak kun je die temperatuur nog wel iets aanpassen, maar soms ook niet.

Wanneer werkt een kort programma wél?

Een kort programma doet het goed bij kleding die nauwelijks vuil is. Denk aan een shirt dat je mar één dag hebt gedragen, een blouse die wat naar rook of eten ruikt, of sportkleding die je direct na het trainen wast. In die situaties is vuil nog niet in de vezels getrokken. Een korte wasbeurt is dan vaak al voldoende om je kleding snel op te frissen.

Wanneer werkt een kort programma minder goed?

Bij echt vuil textiel red je het zelden met een kort programma. Hardnekkige vlekken zoals vet, modder, gras en opgedroogd zweet hebben tijd nodig om los te weken. En juist die tijd ontbreekt bij korte programma's. Het wasmiddel heeft niet voldoende tijd om zijn werk te doen en ook spoelt een kort programma minder grondig dan bij een standaard was. Gebruik je zo'n korte cyclus toch voor beddengoed, handdoeken of echt vieze kleding met vlekken, dan voelt of ruikt de was na afloop misschien wel frisser, maar is hij niet écht schoon.

Waarom kort niet automatisch zuinig is

Veel mensen kiezen voor een snel programma omdat ze denken dat dat minder energie kost. Klinkt logisch, maar het werkt anders. Het grootste deel van het energieverbruik gaat naar het opwarmen van water, en dat hangt vooral af van de hoeveelheid water en de gewenste temperatuur. Of de machine dat snel of langzaam doet, maakt vooral verschil in de piek van het stroomgebruik, niet in de totale hoeveelheid energie.

Eco-programma's zijn juist zuiniger omdat ze minder water gebruiken en op lagere temperatuur wassen. De machine neemt de tijd om hetzelfde resultaat te bereiken. Een kort programma op een hogere temperatuur moet in korte tijd veel warmte leveren, en dat jaagt je energieverbruik juist op.

View post on TikTok

Kort programma? Gebruik niet te veel wasmiddel!

Korte programma's wassen vaak op een lagere temperatuur. Gebruik je poeder, dan kan dat wat langzamer oplossen. En omdat zo'n programma ook korter spoelt, kunnen er eerder witte waasjes of zeepresten in de stof achterblijven. Dat merk je soms ook aan je huid, vooral als die snel reageert.

Doseer daarom precies. Volg het advies op de verpakking en gebruik bij een snelle was liever iets minder waspoeder dan te veel, zeker als de was maar licht vervuild is. Je kunt ook kiezen voor vloeibaar wasmiddel, omdat dat meestal sneller oplost dan poeder.

Veel korte programma's = meer kans op vetluis

Als je vaak op 20 of 30 graden wast, blijft er na verloop van tijd wat vet en vuil achter in de trommel, de rubbers en de slangen. Dat laagje heet 'vetluis': een mengsel waarin bacteriën zich makkelijk kunnen vermeerderen. Je merkt het meestal aan een muffe geur in de machine, of aan wasgoed dat niet helemaal fris meer ruikt.

Laat je wasmachine daarom af en toe op hoge temperatuur draaien. Een onderhoudsprogramma of een hete was helpt om opgehoopte viezigheid beter op te lossen en houdt de machine fris. Hoe vaak dat nodig is, verschilt per huishouden. Draai je vooral korte programma's op lagere temperaturen, dan is het verstandig om geregeld een heter programma te draaien.

Lees ook: Vetluis in je wasmachine? Zo kom je er vanaf!

Zo haal je het meeste uit een kort programma

Een kort programma is vooral bedoeld om kleding op te frissen. Dan helpt het om de trommel niet te vol te stoppen: de was moet ruim kunnen bewegen, zodat water en wasmiddel overal bij kunnen. Doseer het wasmiddel ook zuinig; bij een korte was spoelt een teveel aan wasmiddel minder goed uit je kleding (waarom dat zo is, legden we eerder al uit). En: stel de temperatuur niet te hoog in. Misschien denk je dat een hogere temperatuur de verkorte wastijd compenseert, maar zo werkt het niet. Voor een kort programma (dat vooral bedoeld is om kleding op te frissen) is 20 of 30 graden echt voldoende. Stel je de temperatuur hoger in, dan maakt dat voor het resultaat vaak weinig verschil. Het is vooral je wasmachine zelf die harder moet werken en meer energie verbruikt.

Conclusie

Een kort programma is handig, zolang je het gebruikt voor licht vervuilde was die vooral opgefrist moet worden. Wil je écht schoon wassen of energie besparen, dan ben je met een langer programma vaak beter uit.

👉4x uitstekende wasmachines voor snelle wasjes

De Miele WEA 135 WCS Excellence is een wasmachine met 8 kg vulgewicht. Voor snelle wasjes zit er een Express 20-programma op, bedoeld voor kleding die je vooral even wilt opfrissen. Met 1400 tpm komt je was droger uit de trommel dan bij 1200 tpm, wat scheelt als je daarna nog moet drogen, terwijl het geluidsniveau tijdens centrifugeren met 72 dB binnen de gebruikelijke marges blijft. Qua energie zit dit model op energieklasse A met een extra marge (A-10%) en het ECO 40-60-programma is de zuinige standaard voor normaal bevuild katoen. Handig in gebruik zijn AddLoad (nog snel iets toevoegen), CapDosing (capsules voor specifieke stoffen zoals wol) en de SoftCare-trommel die kleding wat zachter behandelt.

In de LG F4X1009NWB kun je 9 kilo wasgoed kwijt. Voor snelle wasjes is er een Quick 30-programma. Je kunt ook koud wassen. Je kiest verder uit programma's als Eco, Cotton, Easy Care, Wool en Sports, met Tub Clean om de trommel schoon te houden. De trommel is van roestvrij staal en de motor is koolborstelloos, wat meestal zorgt voor minder slijtage. Spa Steam (stoomfunctie) is er voor een hygiënischere was en de machine heeft vuilherkenning om de wasbeurt beter op de lading af te stemmen. Handig: je kunt deze wasmachine aan de ThinQ-app koppelen, voor bediening op afstand..

 De Hisense WF5I8043BWF is een smalle wasmachine met 8 kg vulgewicht en een diepte van 47 cm. Dat maakt hem interessant als je weinig ruimte hebt, maar wel een normale trommelinhoud wilt. Met 1400 toeren centrifugeert hij stevig. Voor snelle wasbeurten heb je Power Wash 39' en 59' en een Quicker Wash-optie die de wastijd inkort. Daarnaast is er een stoomfunctie voor kleding die je hygiënischer wilt opfrissen of net wat frisser uit de trommel wilt halen. Deze wasmachine heeft energielabel A met een extra marge (A(-30%)). Bedienen kan op het display, maar je kunt hem ook via wifi koppelen aan de ConnectLife-app om de was op afstand te starten, de voortgang te volgen en meldingen te krijgen.

De Samsung WW90CGC04AAHEN is een wasmachine met 9 kg vulcapaciteit. EcoBubble mengt water en wasmiddel tot schuim, zodat het wasmiddel sneller in de stof kan trekken. Voor snelle wasjes zit er een QuickWas 15'-programma op, bedoeld voor kleine ladingen die vooral een opfrisbeurt nodig hebben. Ook fijn: je houdt de trommel zelf schoon met Drum Clean. Qua energie zit dit model volgens Samsung op energieklasse A met een extra marge (A-10%), en via SmartThings kun je AI Energy Mode gebruiken om bij 20-40 °C zuiniger te wassen en je verbruik bij te houden. Daarnaast krijg je programma's als hygiënisch stomen (tegen bacteriën en allergenen) en een microplastic-programma dat is bedoeld om vezelverlies bij synthetische kleding te beperken.

▼ Volgende artikel
TikTok is in de VS nu afgesplitst van Chinese eigenaar
Huis

TikTok is in de VS nu afgesplitst van Chinese eigenaar

Sinds afgelopen vrijdag is TikTok in de Verenigde Staten afgesplitst van het Chinese moederbedrijf ByteDance.

Vorig jaar werd al aangekondigd dat TikTok zou worden afgesplitst in de Verenigde Staten. Dit omdat het socialmediaplatform daar onder vuur ligt. China heeft namelijk toegang tot gebruikersdata van TikTok-gebruikers, en het land kan ook ook de algoritme van gebruikers beïnvloeden.

Met die kritiek in het achterhoofd stelde de Amerikaanse president Donald Trump TikTok vorig jaar voor de keuze: de app helemaal niet beschikbaar maken in de VS, of het verkopen aan een Amerikaans bedrijf. Dat laatste is nu dus gebeurd.

Het Amerikaanse TikTok

De Amerikaanse vestiging waar TikTok in de VS nu onder valt heet TikTok USDS Joint Venture LLC. Het bedrijf wordt door Amerikaanse investeerders beheerd, waaronder Oracle, MGX en Silver Lake, die samen iets minder dan de helft van alle aandelen in handen hebben. Adam Presser, die voorheen aan het stuur stond van Warner Bros., is de ceo, terwijl Will Farrell - die eerder al bij TikTok aan het roer stond - de cso is.

Overigens is hiermee TikTok-eigenaar ByteDance niet helemaal buitenspel gezet: het bedrijf behoudt nog altijd bijna twintig procent van de aandelen van de Amerikaanse divisie, en TikTok-ceo Shou Chew maakt onderdeel uit van de raad van bestuur.

Wat verandert er aan TikTok?

De nieuwe Amerikaanse tak van TikTok zal niet veel invloed hebben op hoe we in Nederland TikTok consumeren. In de VS zal het Amerikaanse bedrijf echter modereren en bepalen hoe de algoritme werkt op basis van Amerikaanse data.

Het is echter niet duidelijk in hoeverre Amerikaanse gebruikers dat gaan merken, en deels voelt de oprichting van TikTok USDS Joint Venture LLC dan ook louter als een manier om de angst rondom Chinese invloed te sussen.

Tegelijkertijd is er onder sommige Amerikaanse gebruikers angst ontstaan dat juist de Amerikaanse overheid meer invloed gaat uitoefenen op de algoritme en dus politieke agenda's gaat pushen. Een heel gekke gedachte is dat niet: Oracle, een van de investeerders die nu over het Amerikaanse TikTok gaan, heeft nauwe banden met Trump.

Nieuw op ID: het complete plaatje

Misschien valt het je op dat er vanaf nu ook berichten over games, films en series op onze site verschijnen. Dat is een bewuste stap. Wij geloven dat technologie niet stopt bij hardware; het gaat uiteindelijk om wat je ermee beleeft. Daarom combineren we onze expertise in tech nu met het laatste nieuws over entertainment. Dat doen we met de gezichten die mensen kennen van Power Unlimited, dé experts op het gebied van gaming en streaming. Zo helpen we je niet alleen aan de beste tv, smartphone of laptop, maar vertellen we je ook direct wat je erop moet kijken of spelen. Je vindt hier dus voortaan de ideale mix van hardware én content.