Synology-Forum.nl
OS Specifieke ondersteuning => Mac OS X => Topic gestart door: FCU4ever op 30 maart 2024, 09:37:34
-
Goedemorgen,
Ik heb een NAS bij mijn moeder thuis staan zodat deze kan dienen als externe backup. Mocht er thuis een blikseminslag o.i.d. zijn dan heb ik altijd nog een backup elders. Nu benader ik deze NAS via een VPN verbinding met OpenVPN. Dit werkt allemaal naar behoren. Echter wil ik dat wanneer de Mac opstart deze direct verbindt met de netwerkschijf. Dit heb ik ingesteld via systeemvoorkeuren --> gebruikers en groepen --> inloggen en dan de netwerkschijf toevoegen. Echter wanneer ik opnieuw opstart duurt het enige tijd voordat OpenVPN is verbonden maar heeft de Mac al wel geprobeerd verbinding met de netwerkschijf te maken en die mislukt logischer wijs dan ook omdat de VPN pas na een minuut of 2 is verbonden.
Hoe kan ik instellen dat de Mac een bepaald aantal minuten moet proberen met de netwerkschijf te verbinden?
-
Buiten het feit dat er misschien andere manieren zijn om wél automatisch te verbinden zonder problemen, kan je eventueel gebruik maken van 'automator'.
Ik heb een verbinding met webdav opgezet, werkt prima. Veilig? Voor mij voldoende denk ik.
-
Met wat maak je een backup naar de externe NAS en moet je daarom per se een netwerkschijf hebben ?
-
TimeMachine op Mac laat ik automatisch een backup maken naar de externe NAS via een VPN verbinding. Dit gaat allemaal automatisch dus zou handig zijn als de netwerkschijf probeert te verbinden nadat openvpn een verbinding tot stand heeft gebracht.
-
Met WebDAV heb ik tot nu toe de ervaring dat het giga langzaam gaat vandaar de overstap naar een VPN
-
Bij mij gaat die alleszins niet langzaam. Maar goed, ik denk dat je op een andere manier backup moet maken. Er zijn zoveel manieren. Time Machine zou ik niet extern laten lopen, dat is vragen om problemen.
-
Met VPN is het niet "extern", de Mac en NAS zitten dan immers samen in 1 netwerk.
-
Ja dat klopt. Tot zover de theorie. In de praktijk loopt Time Machine wel eens mis, en als je het op die manier doet loopt het wel eens vaker mis. A. Backup die mis kan lopen. B. Het moet ook nog werken om hem (via dezelfde weg) terug te zetten.
Ik spreek uit ervaring. Ik hou de T/M lokaal. De andere backups gaan grotendeels naar 2 externe locaties.
-
Ik heb daar geen ervaring mee, ik heb nl geen Windows allergie. :lol:
Maar, ik kan het mij niet echt voorstellen, Apple maakt toch altijd betrouwbare software ? ;)
-
Het mooiste zou zijn dat het VPN programma een script kan starten als een verbinding tot stand komt. Maar als ik in Tunnelblick kijk, wat Synology aan mac-gebruikers aanraad, is het starten van een script geen optie van dit VPN programma. Zoiets leek me een zinvolle optie bij een vpn prgramma. ;)
-
OpenVPN heeft "hooks" waarmee allerlei zaken geautomatiseerd kunnen worden.
In dit geval kun je een script aanroepen die de netwerkverbinding tot stand brengt zodra de VPN link tot stand is gekomen.
Zie daarvoor
--script-security level
--up
--down
in de manual.
script-security zou dan 2 moeten zijn.
Lees dus het deel
SCRIPTING INTEGRATION
in de manual: https://build.openvpn.net/man/openvpn-2.6/openvpn.8.html
-
Hartelijk dank voor dit antwoord.
Ziet er ingewikkeld uit. Kijken of het lukt als ik me er even in ga verdiepen.
-
Via dit commando zou ik een script kunnen oproepen.
--script-security 2 --up /path/to/your/script
Echter is het voor mij abracadabra hoe ik dan vervolgens een script moet maken die de verbinding met de netwerkschijf tot stand brengt. Hopelijk kunt u mij daarbij helpen.
-
Ik gebruik bv het volgende applescript om met één klik 3 shares te mounten. In mijn geval heb ik het script als programma laten exporteren en run dat programma.
(*
Mount shares to the desktop. Finder will ask for a password the first time.
You than can choose to store it in the keychain to let it automount the next time.
Duplicate the "mount_share" command to add more shares.
*)
mount_share("smb", "Briolet", "GedeeldeData.local", "GH-Data")
mount_share("smb", "Briolet", "GedeeldeData.local", "Macintosh")
mount_share("smb", "Briolet", "GedeeldeData.local", "home")
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Maar waarschijnlijk is een bash script van 1 regel ook voldoende.
-
Het is gelukt dmv een simpel applescript waarin ik een delay heb toegevoegd. Het script is als volgt:
tell application "Finder"
delay 30
mount volume "smb://ip-adres_NAS/mapnaam" as user name "USERNAME"
end tell
sla dit script op als een app en voeg deze toe aan systeemvoorkeuren -> Gebruikers en groepen -> Inloggen
-
Goedemorgen,
Ik heb een NAS buiten mijn thuisnetwerk draaien waarmee ik via onderstaande applescript automatisch verbinding maak wanneer mijn MacBook opstart:
tell application "Finder"
delay 30
mount volume "smb://ip-adres_NAS/mapnaam" as user name "USERNAME"
end tell
Nu komt het wel eens voor dat de verbinding met de NAS wordt verbroken en dat ik dan weer handmatig verbinding moet maken. Kan iemand mij helpen om het script zo aan te passen dat deze elke minuut o.i.d. controleert of de verbinding nog in stand is en wanneer dit niet het geval is deze verbinding weer hersteld wordt?
-
Ik heb je 2 Topics maar samengevoegd, dan wordt het eenduidiger............
-
Even zoeken met DDG leverde op:
if you want to run applescript periodically, use "Idle" handler :
On idle
-- do this and this / add you code
return xxx
end idle
you run your code and it will keep running for ever (except if your code contains a quit command). the xxx value after the return is the number of seconds (positive !) before the next run. in your code, you can check application current status, or any other things. If not enough, you can use launchd method (see Apple launchd).
Jouw code kun je er dan in plakken.
Edit: Ik mijn script eens aangepast met dit idle commando, maar dan mount hij bij mij niets. op mijn mac met OS Sonoma. Wat zeker moet werken is het maken van een "launchd". Ik heb het nooit gedaan, maar dan wordt een timer in het systeem gezet en periodiek een opdracht uitgevoerd.
Zie: Scriptbeheer met 'launchd' in Terminal op de Mac (https://support.apple.com/nl-nl/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac) of https://launchd.info
En de launchd files zijn tekstfiles in het 'plist' formaat. zie b.v. How do I set a task to run every so often? (https://stackoverflow.com/questions/132955/how-do-i-set-a-task-to-run-every-so-often)
Dit is vergelijkbaar met de cronjobs op de nas.
-
Het is mij wel gelukt met het idl handler commando. Het script wordt dan als volgt (vergeet niet om hem op te slaan als met het vinkje bij 'Niet sluiten na uitvoerhandler'):
on idle
tell application "Finder"
delay 30
mount volume "smb://ip-adres_NAS/mapnaam" as user name "USERNAME"
end tell
return 300
end idle
-
Goed dat je het toch geprobeerd hebt. Het werkt hier nu ook.
Ik had het script eerst binnen de script editor gerund en daar deed hij niets. Daarna dacht ik dat deze idle handler misschien alleen werkte als het script gecompileerd werd tot app. Maar hierbij heb ik niet op de 3 checkboxjes gelet die ik nog kon aanvinken.
Inderdaad zorgt 'Niet sluiten na uitvoerhandler' ervoor dat de app dan open blijft en blijft zijn werk op de achtergrond uitvoeren.
Ik houd van het gebruik van functies, dus mijn eerdere script wordt dan:
on idle
mount_share("smb", "Briolet", "GedeeldeData.local", "GH-Data")
mount_share("smb", "Briolet", "GedeeldeData.local", "Macintosh")
mount_share("smb", "Briolet", "GedeeldeData.local", "home")
return 120
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Het verschil met jouw script is dat hij niet elke keer de share probeert te mounten, ook al is hij al gemount. Dit script kijkt eerst of hij al gemout is en mount alleen als hij hem nog niet ziet. En probeert het 4 keer, voor het geval de nas erg traag reageert, b.v. omdat hij eerst uit een slaapstand moet komen. En als de share al gemount is, wordt het commando "delay 30" ook nooit uitgevoerd.
-
Ik zou dit script graag willen gebruiken.
Volgens mij hoef ik alleen het eerste gedeelte aan te passen naar mijn NAS. Ik kan alleen niet zo goed herleiden waar ik welke gegevens in moet vullen.
mount_share("smb", "Briolet", "GedeeldeData.local", "GH-Data")
Briolet = gebruikersnaam?
GedeeldeData.local = NAS naam?
GH-Data = Mapnaam?
Kunt u mij opweg helpen?
-
Precies zoals je schrijft.
GedeeldeData.local is het IP adres van de nas of de domeinnaam van de nas.
-
Hartelijk dank. Script werkt naar behoren
on idle
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Backup Lisa")
return 120
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
-
Ik ben nog niet helemaal tevreden met het script.
Wat is nu het probleem? Wanneer ik de Mac afsluit of uitlog wordt dit verhinderd door het script dat ik vervolgens via forceer stop moet afsluiten voordat ik het account kan uitloggen of de Mac kan afsluiten.
Mogelijk komt het door mijn wat bijzondere set up. Ik heb namelijk 1 NAS thuis staan en 1 NAS extern staan. Om met beide NASsen te verbinden heb ik 2 verschillende scripts gemaakt (kan vast ook in 1 script maar ik heb geen idee hoe).
Script 1 start direct bij het opstarten van de Mac en verbindt met de NAS in het thuisnetwerk. Iets daarna start automatisch de OpenVPN app en verbindt de DDNS van de externe NAS. Met een delay van 30 seconde start script 2 welke verbindt met de externe NAS.
Vervolgens blijven beide scripts controleren of de verbinding nog in stand is en wanneer er 1 is weggevallen probeert hij deze te herstellen. Dit werkt allemaal naar behoren behalve dat het afsluiten of uitloggen problemen oplevert.
Heeft iemand een oplossing voor dit probleem?
-
Geen oplossing, maar dit lijkt me een bug in de scripteditor. Die genereert blijkbaar een app die niet reageert op een sluiten opdracht. Ik kon mijn test app wel gewoon via het quit commando sluiten.
-
Dat zou dan een vervelende bug zijn. Vreemde is wel dat het lijkt of alleen het script dat mijn externe NAS benadert problemen heeft met het afsluiten. Het script dat de NAS in het thuisnetwerk benadert sluit wel netjes af.....
Wellicht een idee om eerst te proberen om 1 script te maken (ipv 2 scripts) en dan te bedenken hoe we een shutdown commando kunnen toevoegen.
Ik gebruik momenteel 2x dit script (1x voor NAS thuisnetwerk en 1x met een 30 seconde vertraging voor NAS extern)
Script 1
on idle
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Data")
return 120
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Script 2 (wordt doormiddel van de app Autostarter 30 seconde later opgeroepen)
on idle
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Backup Lisa")
return 120
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Hoe kan ik deze 2 scripts combineren waarin na opstarten Mac direct verbinding wordt gemaakt met de NAS in het thuisnetwerk en met een 30 seconde vertraging (wanneer OpenVPN is opgestart en verbonden) verbinding gemaakt met de NAS extern?
Wanneer dat werkend is kunnen we kijken of een commando mogelijk is om het script te stoppen wanneer de Mac afsluit of uitlogt.
-
Volgens mij kom je op zoiets. (ongetest)
global eerste_keer
set eerste_keer to true
on idle
if eerste_keer then
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Data")
set eerste_keer to false
return 30
else
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Data")
mount_share("smb", "Lisa", "xx.xx.xx.xx", "Backup Lisa")
return 120
end if
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
De eerste keer probeert hij alleen de ene disk te mounten en wacht dan 30 seconden. Daarna probeert hij beide te mounten en wacht 120 sconden
-
Wanneer ik het script opsla als een app die niet wordt gesloten na de uitvoerhandler en ik open die vervolgens krijg ik de foutmelding:
De variabele eerste_keer is niet gedefinieerd
De variabele eerste_keer is niet gedefinieerd. (-2753)
-
Ik ben niet echt thuis in de apple script taal. Ik zou verwachten dat die variabele globaal gedefinieerd wordt en dus ook binnen die idle loop bestaat.
Ik heb even gezocht en je moet globale variabelen inderdaad expliciet definieren.
Het script moet dus beginnen met
global eerste_keer
(Ik heb het vorige script hierop aangepast.)
Het voelt voor mij een beetje vreemd dat variabelen binnen een functie automatisch gedefinieerd worden door ze te gebruiken, maar daarbuiten niet. Voor de fanatiekeling: "Apple Script language guide (https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/conceptual/ASLR_variables.html#//apple_ref/doc/uid/TP40000983-CH223-SW10)"
-
Sowieso hartstikke fijn dat u probeert te helpen.
De errorcode is veranderd naar:
1 kan niet in type boolean worden omgezet. (-1700)
-
Ik dacht dat Apple Script zo'n meedenkend taaltje was. En in talen als JavaScript kun je een getal gewoon als boolean gebruiken. Volgens mij zelfs in objective-C. Dan moet je er blijkbaar een expliciete vergelijking van maken.
if eerste_keer = 1 then
Of de variabele direct als boolean definiëren met een false/true waarde. Dat is mooier en ik zal het script hierboven op die manier aanpassen
global eerste_keer
set eerste_keer to true
En dan false maken na de eerste uitvoering
-
We zijn een stap verder. Met de aanpassing Mount het script netjes de schijf in het lokale netwerk. Echter Mount hij na 30 seconde daarna niet de externe schijf. Het lijkt alsof hij dus in een loop blijft zitten van het eerste gedeelte. Als ik namelijk de schijf in het thuisnetwerk unmount dan is hij heel snel weer gemount.
global eerste_keer
set eerste_keer to true
on idle
if eerste_keer then
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
set eerste_keer to false
return 30
else
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
mount_share("smb", "Lisa", "IP-externe NAS", "Backup Lisa")
return 120
end if
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
-
Ik zou het zo even ook niet weten. Meestal voeg ik dan allerlei logging regels toe aan een script zodat ik kan volgen waar hij wat doet.
Of inplaats van logging de regel
Say "Beep!"
ergens in de tweede lus toevoegen om the checken of hij daar ooit komt.
Of de volgende twee regels op een handige plek toegoegen:
say "Loop een"
Say "Loop twee"
-
Ik snap je werkmethodiek. Echter ben ik helaas helemaal niet thuis in programmeren/scripten (helaas).
Wat ik nu geprobeerd heb om te kijken waar het script stopt is het volgende:
Als ik het script zoals in mijn vorige post 'run' dan krijg ik als uitvoer het bericht 'true' en de netwerkschijf in het thuisnetwerk wordt gemount. Vervolgens wordt na 30 seconde niet de externe schijf gemount.
Als ik het script aanpas en de begrippen 'true' en 'false' omdraai dan verwacht ik dat ik als uitvoer 'false' krijg en dat er niets gemount wordt. Na een run van het script is dit exact de uitkomst.
Het lijkt er dus op dat het eerste gedeelte werkt
global eerste_keer
set eerste_keer to true
on idle
if eerste_keer then
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
set eerste_keer to false
return 30
maar dat hij in een loop zit en eerste_keer gewoon weer op true zet.
-
Ik heb het script nu toch even zelf tot app gekompileerd
else
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
mount_share("smb", "Lisa", "IP-externe NAS", "Backup Lisa")
Say "Loop twee"
return 120
end if
En elke 120 seconden zegt hij "Loop twee". En de disk mount opnieuw als ik heb weer weggegooid had. Dus die code loopt wel goed.
En als ik de app dubbelklik, zodat hij op de voorgrond komt, en dan Cmd-Q doe, sluit hij netjes. Geforceerd sluiten is hier niet nodig.
-
Dan ga ik dat proberen om in mijn script toe te voegen en kijken of ik ook die melding van loop 1 en loop 2 krijg. Want zoals ik het begrijp werkt het script bij jou wel
-
Het zal aan mij liggen maar ik krijg niet de melding Loop een en/of Loop twee (terwijl wel mijn lokale disk wordt gemount).
Ik kan het script in de Dock ook niet openen om hem via kruisje af te sluiten. Vandaar dus ook de geforceerde stop.
Op de een of andere manier zit er een fout in mijn script of de manier van opslaan (vink alleen 'Niet sluiten na uitvoerhandler' aan).
global eerste_keer
set eerste_keer to true
on idle
if eerste_keer then
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
say "Loop een"
set eerste_keer to false
return 30
else
mount_share("smb", "Lisa", "NAS_naam", "Data/Mijn Afbeeldingen")
mount_share("smb", "Lisa", "IP-adres externe NAS", "Backup Lisa")
say "Loop twee"
return 120
end if
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or (list disks) contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
-
Na dit topic en mijn pogingen tot een succesvol script even te staken ben ik vandaag weer wat aan het proberen geweest. Ik heb het script van boven naar beneden opnieuw opgebouwd en gekeken tot welke regel het script werkt. Ik kwam er al vrij snel achter waar het fout ging, namelijk bij het commando Mount_share dit is kennelijk in de laatste OS een onbekend commando en werkt wel wanneer ik dit vervang voor Mount volume. Nu wordt het script als volgt:
on idle
mount volume "smb://NASNAAM_lokaal/Data/Mijn Afbeeldingen" as user name "Lisa"
delay 30
mount volume "smb://NASIP_extern/Backup Lisa" as user name "Lisa"
return 120
end idle
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or mounted_shares() contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Met dit script Mount de lokale NAS direct bij opstarten en de externe NAS volgt een 30 seconde later. Ook wanneer de verbinding is verbroken re-mount het script de schijven weer. Ook het afsluiten van het script loopt zonder problemen (geen gedoe meer met force uit).
Ik ben wel nog benieuwd of het tweede gedeelte van de code nu nog werkt (vanaf on mount_share(protocol, account, server, share) aangezien ik Mount_share heb gewijzigd in Mount volume.
Kan iemand hier uitsluitsel over geven of aangeven hoe het script anders gewijzigd moet worden?
-
Heb geen MAC dus kan ik niet testen maar, mount_share is alleen maar de naam van loop, volgens mij, net zoals idle.
-
het commando Mount_share dit is kennelijk in de laatste OS een onbekend commando
Natuurlijk is dit een onbekend commando voor het OS. Het is een functie die in dit script gedefinieerd wordt en dan vanuit de idle loop aangeroepen.
-
Ik heb nog een hoop te leren als het gaat om applescript.
Volgens mij betekent dit wel dat dit gedeelte niet werkt omdat ik mount volume gebruik ipv mount_share:
on mount_share(protocol, account, server, share)
set x to 0
-- try a few time in case the server has to wake up first.
-- don't do anything if the share is already mounted
repeat until x > 4 or mounted_shares() contains share
tell application "Finder"
try
mount volume protocol & "://" & account & "@" & server & "/" & share
on error
set x to x + 1
delay 30
end try
end tell
end repeat
end mount_share
Is dit eenvoudig opgelost door mount_share te vervangen voor mount volume of zie ik dat verkeerd?
-
Volgens mij maakt het niet uit omdat ik denk dat het alleen maar een naam van de loop is (zoals eerder aangegeven).
Dus:
on mount_share
Doe wat
end mount_share
Kan dus ook zijn:
on pietje
Doe wat
end pietje
Maar, een progrmameur die een script maakt, vraagt om duidelijkheid in het script dus, ik zou doen:
on mount_volume
Doe wat
end mount_volume
Test maar.
PS: Ik kan ook fout zitten te denken ;)
-
Het stuk:
on mount_share(protocol, account, server, share)
…
end mount_share
is een zelf gedefinieerde functie in het script. Het doet in beginsel niets uit zichzelf. En de naam kan gekozen worden zoals je wilt, maar ik heb hier een naam gekozen die het doel direct duidelijk moet maken.
Deze functie moet worden aangeroepen vanuit andere onderdelen van het script. En dat gebeurt hier vanuit de "on idle" loop. Deze loop wordt wel steeds periodiek vanuit het OS geactiveerd.
Als ik een bepaald stukje code minimaal 2x binnen een script gebruik, maak ik er liever een functie van dan een serie herhalende code onder elkaar te tikken. Dat vind ik overzichtelijker als je door de hoofdlus scrolt omdat de hoofdlus dan compact blijft. In dit geval slechts twee regels in de on idle loop.
Bij zo'n kort stukje code maakt het voor het overzicht niet veel uit, maar bij lange code heb ik liever 5 pagina's met functies dan 100 paginas zonder functies. ;)