Arjen Wiersma

A blog on Emacs, self-hosting, programming and other nerdy things

Today the academic world is remembering Bastiaan Heeren, who passed away last week.

I spent the better time of a year working on my thesis, and before that I enjoyed lectures given by Bastiaan. He was a person with a great love for teaching, especially when you can get into the nitty gritty details of software quality and the benefits of functional programming.

I look back fondly on my time with Bastiaan. He was an open, warm, critical and encouraging human being. He had a great love for his family and work.

Right after I graduated his illness progressed and as a result he was unable to join the graduation ceremony last September. We exchanged gratitude through email and in a blink of an eye, it is over. He was only 46.

You will be missed.

I recently came across Traefik. It is a reverse proxy built specifically for services in the cloud. I was searching for a convenient (up-to-date) way to expose my project using a reverse proxy within docker-compose. I used to use nginx for this, but it then requires a generator and an lets encrypt listener (so 3 containers). Traefik only requires a single container and allows you to label your docker containers to apply rules to them.

The below configuration creates a traefik instance, sets it up to host port 80 and 443 for web, and 8080 for its dashboard (protect that port in your firewall). It also sets up letsencrypt certificates and automatic redirection from port 80 to 443.

version: '3'

services:
  reverse-proxy:
    image: traefik:v3.1
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro # Traefik config file
      - traefik-certs:/certs # Docker volume to store the acme file for the Certifactes

  app:
    image: your/image
    ports:
      - 8081:8080
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app-http.rule=Host(`example.com`) || Host(`www.example.com`)"
      - "traefik.http.routers.app-http.entrypoints=web"
      - "traefik.http.routers.app-http.middlewares=redirect-to-https"
      - "traefik.http.routers.app-https.rule=Host(`example.com`) || Host(`www.example.com`)"
      - "traefik.http.routers.app-https.entrypoints=websecure"
      - "traefik.http.routers.app-https.tls=true"
      - "traefik.http.routers.app-https.tls.certresolver=letencrypt"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
volumes:
  traefik-certs:
    name: traefik-certs

The mentioned config file is reproduced below:

api:
  dashboard: true # Optional can be disabled
  insecure: true # Optional can be disabled
  debug: false # Optional can be Enabled if needed for troubleshooting
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"
serversTransport:
  insecureSkipVerify: true
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: proxy # Optional; Only use the "proxy" Docker network, even if containers are on multiple networks.
certificatesResolvers:
  letencrypt:
    acme:
      email: contact@example.com
      storage: /certs/acme.json
      #caServer: https://acme-v02.api.letsencrypt.org/directory # prod (default)
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory # staging
      httpChallenge:
        entryPoint: web

#development

This is my first article in a series called Rock Solid Software. In it I explore different dimensions of software that does not simply break. You can write good software in any programming language, although some are more suited to a disciplined practice then others, Clojure is definitely in the relaxed space of discipline here.

Today I am exploring the use of Selmer templates in Clojure. If you have explored Biff at all you will know that all the UI logic works by sending Hiccup through a handler, which will turn into HTML through rum (specifically the wrap-render-rum middleware). If you provide a vector as a result for an endpoint, it will be converted to HTML.

;; You provide this...
[:h1 "test"]
;; => [:h1 "test"]

;; It will then be converted to HTML
(rum/render-static-markup
  [:h1 "test"])
;; => "<h1>test</h1>"

This is absolutely great for rapid prototyping, however it becomes quite tedious if you want to test it. The idea of testing a function is to provide it some inputs and to validate if the outputs match the expectation. Verifying if HTML matches an expectation, or a vector of hiccup for that matter, is quite difficult.

To increase testability I added selmer to my project. This separates presentation from data by having selmer render templates with a map of data. Selmer is based on Django templates, which means that it has a rich set of features, such as extending base templates, defining blocks and providing control structures such as if and for loops. A very simple template looks like this:

{% extends "_layout.html" %}

{% block content %}
<article>
Hallo <b>{{name}}</b> from simple template
</article>
{% endblock %}

As the template extends _layout.html, lets take a look at that as well. I have stripped it down to the bare minimum here, but you might expect scripts, css, nav bars and many other things in the base template. The important thing here is that the block has the name of content, and our snippet above also has a block called content, the above article will be put inside the main below.

<!doctype html>
<html class="no-js" lang="">
  <head>
    <title>{{title}}</title>
  </head>
  <body>
    <main id="main">
      {% block content %}
      {% endblock %}
    </main>
  </body>
</html>

All that is left is to provide a middleware that will handle the selmer return type from an endpoint. In this case a map with a :template and :content key. If both keys are inside the response, the given template will be rendered using the content map.

(defn wrap-render-selmer [handler]
  (fn [ctx]
    (let [response (handler ctx)]
      (if (and (map? response) (every? response [:template :content]))
        (let [res (selmer/render-file (:template response) (:content response))]
          {:status 200
           :headers {"content-type" "text/html"}
           :body res})
        response))))

My new authentication function has become quite simple, provide a login page using the auth/login.html template. Of course it requires a whole bunch of different attributes in order to render the whole page, but another wrapper adds all the required metadata known to the application already, such as css and script files, application settings and even theme information. All the endpoint has to take into account is its own required information.

(defn login [{:keys [params] :as ctx}]
  (let [err (:error params)]
    (ui/page ctx {:template "auth/login.html"
                  :content (merge {} (when err {:errors [err]}))})))

This is all great and all, but it has nothing to do with testability, right? Well, a map is easier tested then an unstructured vector, right? In other languages, such as Rust, you can get compile time validation of templates, which is great! Sadly selmer does not have that, however we can just simply render a template file and see if there are any missing values.

The below snippet takes the “missing” value and replaces it with a placeholder. So, given a template and an endpoint function we can easily check if all required entries are provided in the map. The below function renders the template, provides a csrf token which is not available inside testing, and verifies that the template does not have any missing values.

(defn missing-value-fn [tag _context-map]
  (str "<Missing value: " (or (:tag-value tag) (:tag-name tag)) ">"))

(selmer.util/set-missing-value-formatter! missing-value-fn)

;; Ensure all the page's required fields are present.
(deftest selmer-validation
  (let [s (sut/page {} {:template "_layout.html" :content {}})
        ;; CSRF is not set during testing...
        res (selmer.parser/render-file (:template s) (assoc (:content s) :csrf "csrf"))]
    (is (not (str/blank? res)))
    (is (not (str/includes? res "<Missing value:")))))

Another step into building rock solid software.

#clojure #development

{{< figure src=“/ox-hugo/20240722203307screenshot.png” >}}

Je hebt tijd gereserveerd om te gaan studeren en je volgt een ritueel om goed in jouw “Deep Work” modus te komen, dat studeren gaat echt goed lukken! Tijdens de colleges en in de lesmaterialen vind je allerlei links naar papers, websites, YouTube videos en haal je veel informatie uit boeken. Al deze bronnen zijn zeer waardevol en bij de eindopdracht zul je veel van deze bronnen weer moeten gebruiken om argumenten te onderbouwen of juist iets te ontkrachten. Hoe ga je dan om met die bronnen zonder dat je gek wordt van allerlei documentjes?

Een natuurlijk reactie is om hiervan allemaal bladwijzers te maken in jouw browser als het op het web is, en voor andere bronnen juist weer in een bestandje bij te houden met wat je hebt gelezen. Dit gaat een tijdje goed, en dan begin je aan jouw opdracht.

Eerst kom je erachter dat je een of ander speciaal formaat moet gebruiken om naar bronnen te verwijzen, APA of IEEE, en dat je dus een lijst bijhoudt van de artikelen die je daadwerkelijk in de opdracht gebruikt. Er mogen geen bronnen in de lijst staan die je niet in de tekst gebruikt en in de tekst mag je niet verwijzen naar iets wat niet in de bronnenlijst staaat. Dan wordt het opeens lastig. Nu blijkt een programma zoals Word wel een bronnenbeheersysteem te hebben, maar dat is echt wel veel werk omdat het per document bronnen opslaat en op macOS werkt het zelfs niet naar behoren. Het systeem van bladwijzers en losse documentjes blijkt toch niet zo handig.

Wat werkt dan wel? Mijn advies is om Zotero te gebruiken (alternatieven). Het programma wordt omschreven als een research assistant. Het idee is dat je alle bronnen die je raadpleegt toevoegt aan Zotero. In Zotero administreer je wie de auteur is, sla je een korte omschrijving (abstract) van de bron op en geef je aan wanneer je de bron hebt geraadpleegd. In onderstaande screenshot zie je een (bijna) lege Zotero bibliotheek met enkel mijn vorige artikel als geraadpleegde bron. Aan de rechterkant zie je alle meta informatie over de bron.

{{< figure src=“/ox-hugo/Zotero-empty.png” caption=”Figure 1: Zotero met een artikel” >}}

Een hele gave feature van Zotero is dat het ook een snapshot van online bronnen bewaard. In dit geval heeft het een offline versie van mijn artikel gemaakt, precies zoals het eruit zag toen ik het opsloeg. Op deze wijze is altijd de bron beschikbaar, ook al haal ik mijn website morgen offline. Met PDF bronnen slaat het zelfs een kopietje van het bestand op. Super handig, en jij hebt altijd de informatie bij je die je nodig hebt.

{{< figure src=“/ox-hugo/Zotero-snapshot.png” caption=”Figure 2: Een snapshot in Zotero” >}}

Je kan een gratis Zotero account aanmaken als je de zekerheid van een goede backup wil hebben. Dat is optioneel, maar anders moet jij zorgen voor een goede backup van jouw database, dus het is zeker een aanrader. In mijn eigen Zotero staan duizenden papers en websites opgeslagen. Ik gebruik verschillende plugins waar ik later meer over ga schrijven. Met die plugins haal ik bronnen van het web, mijn telefoon en zorg ik voor goede notities over de bronnen.

Zotero heeft mij echt zoveel tijd gescheeld, en ik hoop dat jij hiermee ook een tool krijgt om net iets relaxter te gaan studeren.

#learnToStudy

{{< figure src=“/ox-hugo/20240720225806screenshot.png” >}}

In mijn vorige artikel heb ik uitgelegd hoe je tijd kunt vinden om te studeren, de vraag is echter, is alle tijd hetzelfde? Het simpele antwoord is “nee”. Maar waarom niet, zul je vragen, en daarmee komen we op het onderwerp van dit artikel.

Cal Newport heeft een fantastisch boek geschreven, “Deep Work: Rules for Focused Success in a Distracted World”. In dit boek onderzoekt hij hoe je gefocust werkt en wat er voor nodig is om gefocust te blijven [1]. In het boek identificeert hij 2 soorten werk; “Deep Work” en “Shallow Work”. Deze concepten hebben voor mij de aanpak van mijn dagelijkse werk zelfs veranderd, maar dat is een verhaal voor een andere keer.

Deep work vs Shallow work {#deep-work-vs-shallow-work}

Deep Work is feitelijk het werk waarbij je volledige aandacht (concentratie) nodig is, bijvoorbeeld het lezen van een ingewikkeld stuk theorie in een paper of een boek, of het programmeren van een algoritme voor een lesopdracht. Het gaat hier dus om het type werk waarbij een afleiding zorgt dat je helemaal kwijt raakt waar je was gebleven en afleiding dus zeer ongewenst is.

Shallow Work, daarentegen, is het werk waarvoor je maar weinig focus nodig hebt. Denk bijvoorbeeld aan je email bijwerken, of met medestudenten overleggen. In essentie, werk waarbij je even afgeleid kan worden en meteen weer verder kan gaan.

Een studie, net als een werkomgeving, heeft een combinatie van Deep Work en Shallow Work. Dit feit kun je gebruiken om jouw tijd nog beter in te delen.

Tijd blokkeren {#tijd-blokkeren}

In mijn vorige artikel hebben we blokken van ongeveer 4 uren kunnen reserveren in de kalender. Dit is niet per toeval. Cal Newport beschreef dat geoefende “Deep Workers” in staat zijn om maximaal 3 uren achterelkaar in volle focus te werken. Dat betekent 3 uurtjes werken aan een paper of opdracht, en dan is het wel klaar. Je hersenen hebben er dan ook even genoeg van. Om die 3 uren gefocust te werken heb je wel oefening nodig. Als je nog nooit zo lang aan iets hebt gezeten, dan moet je eerst je hersenen trainen. Dit doe je door met een uurtje te beginnen en dan langzaam op te bouwen. Niet te snel, natuurlijk.

Newport identificeerde ook dat om gefocust te gaan werken de meeste mensen een ritueel ontwikkelen. Een soort mentaal stappenplan om je hersenen zover te krijgen dat je er even echt voor kan gaan zitten. Hij beschrijft de rituelen van grote denkers uit het verleden, maar in dit artikel zal ik mijn strategie uitleggen. Het is zeer de moeite waard om de verschillende strategieën in zijn boek te onderzoeken.

Een ritueel om te focussen {#een-ritueel-om-te-focussen}

Een techniek die ik veel inzet is om eerst Shallow Work tijd te reserveren om zoveel mogelijk de taken voor een week (of leerlijn) uit te schrijven en na te lezen. Simpelweg een todolijst is al meer dan voldoende. Op deze wijze hebben mijn hersenen niet de neiging om te gaan denken “zouden we iets vergeten?”. Elke keer als ik ga zitten om te studeren neem ik eerst een periode van 10 tot 15 minuten om:

  1. De todolijst na te lopen of het nog up-to-date is.
  2. Alle middelen die ik nodig heb te verzamelen.
  3. Mijn omgeving leeg te maken, alleen dat wat ik nodig heb mag er zijn.

De todolijst, in mijn geval een notitie waarin ik alle onderdelen van een leerlijn heb beschreven (welke boeken, papers, websites moet ik lezen? Wat is de eindopdracht?) en waarbij ik al mijn vragen in een eigen sectie zet. Deze vragen worden (als het goed is) gedurende de leerlijn beantwoord, en zo niet, dan heb ik op het einde iets om te vragen aan de docent.

Laat ik een voorbeeld geven. Voor de cursus “Software Quality Management” kreeg ik een waslijst aan artikelen om te lezen, echt een serieuze stapel. De artikelen hadden relatie op onderdelen van de lesstof en ik heb vervolgens voor mijzelf een planning gemaakt welk paper ik in welke week gelezen moest hebben (waar ze relevant waren voor het lesonderwerp). Ook heb ik ze gekoppeld aan onderdelen van de eindopdracht, zodat ik altijd een startpunt heb. Zo kun je natuurlijk alles van een leerlijn uitzoeken en uitstippelen, vaak is een syllabus of lesindeling hier heel handig als leidraad. Hieronder zie je daadwerkelijke screenshots van mijn “planning” voor de leerlijn.

{{< figure src=“/ox-hugo/20240718232022screenshot.png” caption=”Figure 1: Papers in een weekplanning” >}}

{{< figure src=“/ox-hugo/20240718235148screenshot.png” caption=”Figure 2: Een simpele planning om bij te houden of ik op schema zit” >}}

Geen afleidingen {#geen-afleidingen}

Als je voor jezelf alles op een rijtje hebt, dan kun je met een snelle review al vrij eenvoudig in een goede flow terecht komen. Ik zorg er daarna voor dat ik alles wat ik nodig heb op mijn bureau leg, of digitaal beschikbaar heb. Er is niets zo vervelends als beginnen en er dan achter te komen dat je iets in de mail moet opzoeken om dan afgeleid te worden door een gekke meme die door een medestudent is opgestuurd, weg is je studietijd.

{{< figure src=“/ox-hugo/20240720232155screenshot.png” caption=”Figure 3: Een opmerking waar je wel op moet reageren, toch?” >}}

En dat is ook meteen het 3de punt. Alles leeg (of uit). Zet je telefoon op stil en “niet storen”, alles wat notificaties op de computer kan maken afsluiten en de niet storen modus aanzetten. Soms vraagt dit thuis ook afspraken zoals “als de deur dicht is, niet storen”. Dat is misschien gek, maar als je deeltijd studeert is een gemiste studiesessie al snel een beetje vertraging bij het afronden, en als het te vaak gebeurt dan loop je echt achter.

TIP: Voor je telefoon zijn apps zoals [Forest](https://play.google.com/store/apps/details?id=cc.forestapp&hl=en_US) echt ideaal. Je krijgt geen notificaties, en je kan niks met jouw telefoon. En voor elke sessie plant je weer boompjes in jouw digitale bos, hoe leuk is dat?

Dit doe je allemaal in dat ene kwartiertje (of een uur afhankelijk van hoe duidelijk je al hebt wat je moet gaan doen), en dan is het tijd om echt aan de gang te gaan, je begint feitelijk aan jouw Deep Work sessie. Ik zet dan vaak nog een zacht achtergrond muziekje aan om complexe papers te lezen of code te schrijven en gaan maar.

Niet alle tijd is hetzelfde. Om effectief te studeren moet je het voor jezelf mogelijk maken om te concentreren. Zorg dat je al je vragen en zorgen hebt opgeschreven, dat er geen afleidingen zijn en dat alles wat je nodig hebt er gewoon al is. Bouw het tijdens jouw studie langzaam op, eerst sessie van een uur en dan op het einde echt knallen!

Bronnen {#bronnen}

[1] Newport (2016) Deep Work: Rules for Focused Success in a Distracted World, Grand Central Publishing.

#learnToStudy

This is a Dutch artcile, there is also an English version.

Dus, jij hebt besloten om te gaan studeren? Misschien wil je jouw HBO- of Masterdiploma halen, of juist dat ene supertechnische certificaat bemachtigen. Het is geweldig dat je deze stap gaat zetten, maar zodra je begint, zul je vrij snel de vraag moeten beantwoorden waar je de tijd vandaan haalt.

Tijd is onze meest waardevolle, niet-hernieuwbare bron. Studeren vergt tijd – en niet zo'n klein beetje ook – dus wil je het natuurlijk goed doen. De meeste studies verwachten dat je wekelijks ergens tussen de 12 en 24 uur investeert om bij te blijven, en dat is flink wat! Als je nog niet studeert, probeer dan eens na te denken over welke dagen en momenten je die tijd kunt vrijmaken. Ga je minder uit eten of juist minder sporten? Vroeg opstaan in het weekend, of juist extra laat naar bed?

De meeste studenten lopen tegen dit probleem aan wanneer ze beginnen met studeren; ik zie het maar al te vaak. Je start vol vertrouwen aan een studie, maar dan realiseer je je dat je niet hebt nagedacht over hoe het in jouw leven past en wat je moet opofferen om te kunnen studeren. Veel studenten proberen dan ook alles tegelijk te doen, met alle gevolgen van dien. Gelukkig is er een strategie die je kunt toepassen. Ik heb deze strategie zelf gebruikt tijdens mijn deeltijd HBO- en Masterstudies, en voor mij werkte het perfect.

De kern van de strategie is het gebruik van je agenda. Om goed de baas te zijn over je tijd, moet je precies weten wanneer je wat gaat doen. Dit klinkt eenvoudig, maar de meeste mensen noteren alleen belangrijke zaken in hun agenda, zoals de tandartsafspraak of de verjaardag van tante Loes.

Op een dag doe je natuurlijk heel veel. Zelf heb ik een baan van 40 uur per week, ga ik naar de sportschool, wil ik tijd doorbrengen met mijn gezin, en nog veel meer. Als ik die activiteiten niet zou inplannen, raak ik al snel het overzicht kwijt. Zonder overzicht wordt het ook moeilijk om effectief te studeren, want dan staat opeens tante Loes op de stoep.

De strategie omvat de volgende stappen:

  1. Gebruik een kalender die je overal kunt raadplegen.
  2. Blokkeer je werktijd en houd je hieraan.
  3. Blokkeer ook tijd voor je gezin en vrienden.
  4. Plan studiemomenten in.

Het maakt niet echt uit welke kalender je gebruikt, zolang deze maar voor jou beschikbaar is. In mijn voorbeelden zal ik de Proton Calendar gebruiken, die is lekker veilig en gevestigd in de EU. Zo heb je geen last van grote techbedrijven die meekijken in jouw planning.

Een lege kalender ziet er zo uit.

{{< figure src=“/ox-hugo/20240715193929screenshot.png” caption=”Figure 1: Een lege agenda, dat is nog eens rustig!” >}}

Zoals je kunt zien, heb ik elk gebied van mijn leven een eigen kleurtje gegeven. Dat is superhandig, want daarmee zie je in één oogopslag waar een afspraak bij hoort.

{{< figure src=“/ox-hugo/20240715194152screenshot.png” caption=”Figure 2: Elke kalender een eigen kleur, helaas ben ik niet goed in kleuren kiezen.” >}}

Als eerste stap plannen we de werkdagen in. Ik heb zelf al mijn werkafspraken in mijn agenda staan, maar ook dan blokkeer ik mijn werktijd met een kalenderafspraak. Op die manier weet ik altijd wanneer ik wel of niet beschikbaar ben op een gegeven tijdstip. Als je ook moet reizen naar en van je werk, plan dan ook die tijd in. Ik doe dat bijvoorbeeld op woensdag en vrijdag.

{{< figure src=“/ox-hugo/20240715195048screenshot.png” caption=”Figure 3: Stap 1, plan jouw werkdagen in” >}}

Dit lijkt misschien een beetje suf, want je weet toch dat je werkt? Natuurlijk is dat zo, maar voor het mentale model van jouw beschikbare tijd is het belangrijk om deze periode te blokkeren. Zo weet je zeker dat je die tijd niet kunt gebruiken om te studeren. En kijk, nu lijkt het alsof er nog heel veel tijd over is, toch?

Tijdens mijn studie vond ik het ook belangrijk om tijd te reserveren voor mijn gezin en om leuke dingen te doen. Studeren moet leuk zijn en mag niet aanvoelen als een straf waardoor je geen plezierige activiteiten meer kunt ondernemen. Laten we nu alle tijd voor gezin en vrienden ook in de kalender zetten.

{{< figure src=“/ox-hugo/20240715195810screenshot.png” caption=”Figure 4: Stap 2, tijd voor het gezin en vrienden” >}}

Dan wordt het al een ander verhaal. Voor mij was het weekend belangrijk. Iedereen werkt hard gedurende de week, dus er is ook tijd nodig waarin we allemaal kunnen ontspannen. Wat meteen opvalt, is dat er dan relatief weinig tijd over lijkt te zijn om te studeren, maar schijn bedriegt. Ik vond het heel fijn om 's avonds te studeren, zo ongeveer van 8 uur tot 12 uur. Dat zijn toch 4 uren op een dag die voor mij goed werkten. Laten we die tijd inplannen.

{{< figure src=“/ox-hugo/20240715200322screenshot.png” caption=”Figure 5: Stap 3, tijd om te studeren” >}}

Dat zijn 4 blokken van 4 uur, plus de zaterdagochtend van 3 uurtjes — in totaal 19 uur die beschikbaar zijn om te studeren. Tijdens het inplannen viel meteen op dat de sportsessie op donderdag niet handig uitkwam, dus die heb ik verplaatst naar de ochtend. Met al deze ingeplande studietijd blijft er ook ruimte over voor familie en vrienden, precies op die momenten dat het voor iedereen goed uitkomt.

Wat nu als je geen avondmens bent? Ik begeleid ook studenten tijdens hun afstudeertraject, en sommigen zijn meer een ochtendmens. Zij staan om 5 uur 's ochtends op en studeren tot 7 uur. Dit doen ze vaak omdat ze kleine kinderen hebben en niet willen dat hun partner met alle zorg achterblijft. Zelf geef ik de voorkeur aan de avond, maar goed, ieder zijn ding.

Wanneer het nodig is, bijvoorbeeld als je dicht bij een deadline zit, kun je natuurlijk altijd tijd van een ander blok gebruiken. Doe dat echter altijd in overleg. Het voordeel van alles uitplannen is dat het duidelijkheid schept, maar daardoor ontstaan ook verwachtingen. Als je dan iets verandert, ook al is het tijdelijk, leg het uit zodat je geen problemen krijgt. Ik paste mijn schema vaak aan door naar de studielast van een module te kijken en een studieplan te maken; daarover zal ik later meer schrijven.

Zelf had ik ook nog bonustijd in mijn schema. De zondagochtend was vaak beschikbaar, afhankelijk van hoe mijn zoon naar een bouldersessie keek. Daarnaast had ik 's ochtends vaak nog een uurtje tijd, tussen het moment dat iedereen naar werk en school gaat en dat ik daadwerkelijk aan mijn werk begin. Die tijd gebruikte ik om papers te lezen en mijn eerste aantekeningen te maken. Maar ook daarover zal ik later meer schrijven.

Het “goed” gebruiken van de kalender om tijd te reserveren is natuurlijk niet revolutionair. Er zijn ook andere methoden zoals de “Trident Method” (uitgelegd door Ali Abdaal), en talloze andere technieken om tijd goed in te delen. Maar dit is de methode die voor mij goed werkte.

Hopelijk begin je jouw studietijd nu met een goed systeem om je tijd in te delen. Dit is de eerste stap naar een succesvolle studietijd!

#writing #learnToStudy

This is an English article, there is also a Dutch version.

So, you've decided to start studying? Maybe you want to earn your Bachelor or Master's degree, or perhaps you're aiming for that highly technical certificate. It's great that you're taking this step, but once you begin, you'll quickly need to answer the question of where you'll find the time.

Time is our most valuable, non-renewable resource. Studying requires time – and not just a little – so you naturally want to use it well. Most programs expect you to invest between 12 and 24 hours per week to keep up, and that's quite a bit! If you're not currently studying, try thinking about which days and times you could free up that time. Will you eat out less or exercise less? Get up early on weekends or stay up late?

Most students run into this problem when they start studying; I've seen it all too often. You start your studies with full confidence, only to realize you haven't considered how it fits into your life and what you need to sacrifice to make it work. Many students try to do everything at once, with predictable results. Thankfully, there is a strategy you can apply. I used this strategy during my part-time Bachelor and Master's studies, and it worked perfectly for me.

The core of the strategy is using your calendar. To manage your time effectively, you need to know exactly when you'll do what. This sounds simple, but most people only note important things in their calendar, like dentist appointments or Aunt Loes's birthday.

You do a lot in a day. Personally, I have a 40-hour workweek, go to the gym, spend time with my family, and much more. If I didn't plan these activities, I'd quickly lose track. Without an overview, it becomes difficult to study effectively because suddenly Aunt Loes will show up at the door.

The strategy includes the following steps:

  1. Use a calendar that you can access anywhere.
  2. Block out your work hours and stick to them.
  3. Also block time for your family and friends.
  4. Schedule study sessions.

It doesn't really matter which calendar you use, as long as it's accessible to you. In my examples, I'll use the Proton Calendar because it's secure and based in the EU. This way, you don't have to worry about big tech companies snooping into your schedule.

An empty calendar looks like this:

{{< figure src=“/ox-hugo/20240715193929screenshot.png” caption=”Figure 1: An empty calendar, that's quite calm!” >}}

As you can see, I've given each area of my life its own color. This is super handy because you can immediately see which appointment belongs to which area.

{{< figure src=“/ox-hugo/20240715194152screenshot.png” caption=”Figure 2: Each calendar its own color, though I'm not great at choosing colors.” >}}

As the first step, let's plan the workdays. I already have all my work appointments in my calendar, but I also block my work time with a calendar event. This way, I always know when I am or am not available. If you also have to travel to and from work, plan that time as well. I do this on Wednesdays and Fridays.

{{< figure src=“/ox-hugo/20240715195048screenshot.png” caption=”Figure 3: Step 1, plan your workdays” >}}

This may seem a bit silly because you know you're working, right? Of course, but for the mental model of your available time, it's essential to block this period. This way, you know you can't use that time for studying. See, now it seems like there's still a lot of time left, right?

During my study, I also found it important to reserve time for my family and to do fun things. Studying should be enjoyable and not feel like a punishment that prevents you from doing pleasant activities. Let’s now add all the family and friends' time to the calendar.

{{< figure src=“/ox-hugo/20240715195810screenshot.png” caption=”Figure 4: Step 2, time for family and friends” >}}

Now it's a different story. Weekends were important for me. Everyone works hard during the week, so time is needed to relax together. What's immediately noticeable is that there seems to be relatively little time left for studying, but appearances can be deceiving. I found it very convenient to study in the evenings, from around 8 PM to 12 AM. That's 4 hours in a day that worked well for me. Let's schedule that time.

{{< figure src=“/ox-hugo/20240715200322screenshot.png” caption=”Figure 5: Step 3, time to study” >}}

That amounts to 4 blocks of 4 hours, plus 3 hours on Saturday morning — totaling 19 hours available for studying. While planning, it immediately became apparent that the workout session on Thursday didn't fit well, so I moved it to the morning. With all this scheduled study time, there's also room for family and friends, at times that are often convenient for everyone.

But what if you're not a night owl? I also guide students during their graduation projects, and some are more morning people. They get up at 5 AM and study until 7 AM, often because they have small children and don't want to leave their partner with all the care. Personally, I prefer the evening, but to each their own.

When necessary, such as when a deadline is approaching, you can always borrow time from another block, but always do this in consultation. The advantage of planning everything is that it provides clarity, but it also creates expectations. If you change something, even temporarily, explain it, so you don't run into problems. I often adjusted my schedule by looking at the workload of a module and creating a study plan; I'll write more about that later.

I also had bonus time in my schedule. Sunday morning was often available, depending on my son's interest in a bouldering session. Additionally, I often had an hour in the morning, between when everyone left for work and school and when I started working. I used that time to read papers and make my initial notes. But more on that later.

Using the calendar effectively to reserve time is not revolutionary. There are other methods such as the “Trident Method” (explained by Ali Abdaal), and many other techniques for good time management. But this is the method that worked well for me.

Hopefully, you'll start your study time now with a good system to manage your time. This is the first step towards a successful study period!

#learnToStudy #writing

So, on Thursday I defended my thesis in front of the graduation committee, and passed! This means that the work I have been doing for the last year comes to an end. From now on there are not long nights and weekends working on my thesis anymore.

Back in 2021 I started my journey of achieving a Master's degree, first with a connecting program and then with the 2 year Master program. Even though I have been in computer science in some form for the last 30 years I still found it to be quite a learning experience.

I greatly enjoyed the track on formal verification of systems and found logic quite enjoyable to work with. My least favorite topic was the security course, mainly due to its reliance on a lot of relatively old literature, but that is only a small “unhappiness”. The courses were well structured and very do-able in the time given.

So happy to be free of the work now. Here is to picking up some fun things again!

So, today I have some news. I will be resigning as Ambassador for Hack The Box after our in-person meetup in June (2024). This means that I will be stepping down from organizing the monthly virtual and quarterly in-person Hack The Box meetups. Let me explain how I got to this decision.

The beginning {#the-beginning}

So, in 2019, I started out building a cyber security curriculum for NOVI Hogeschool. I had the ability to greenfield the courses and create something that is of value to students. In this curriculum I started using Hack The Box for exercises and training next to the regular classwork.

As more and more of my students went through the program I thought it would be cool to get together with the community in a meetup. I contacted Hack The Box and after a little work, the Hack The Box NL meetup was born. This was end of February 2020, and we were aiming for our first meetup in April of 2020. As you all know, the world changed in those days and our plans went into the dumpster. Instead we started hosting a monthly online meetup.

Only when our meetup turned 2 were we able to have our first in-person event. For me and my co-hosts it was a great learning experience to understand how to successfully organize an in-person event, from WiFi to the amount of pizza's that a group of hungry cyber-nerds will consume. For the first event we had our great friends from Hack The Box come over and join us. Check out this after-movie to get a sense of the scale and spot my “psycho”-face somewhere in the video.

The community {#the-community}

Since the early days the community has grown so rapidly. At the time of the blog post we are well past the 1800 members and we are growing to 1900! Of course these are not all people that show up at every meetup, but they come and go. Generally an in-peron meetup will have somewhere between 50 and 100 people attending. Our online meetups will have about 30 to 50 people RSVP-ing to join.

{{< figure src=“/ox-hugo/meetup-christmas-scaled.jpg” caption=”Figure 1: Christmas meetups require a \“foute\” christmas sweater” >}}

The community is full of regulars, people that only swing by for the in-person meetups, and people that just try to figure out if cyber security is a fit for them. I loved meeting every single one of you all. It was such an experience to see friendships grow, skill-sets expand and people step up to actually present in front of a crowd.

Making Friends {#making-friends}

The very first person to ever log into the meetup was @GevuldCookie. She entered the zoom call when I was anxiously waiting for somebody to actually show up. In the same first meetup @DutchPyro joined and after some chatting and exchanging ideas we have been organizing the discord and meetups together ever since. A few years in and @Salp joined as a co-organizer.

Earlier this year we even had our first meetup-baby being born. How special is that?

As the meetup has been online most of the time I have made friends all over the globe, from Egypt to India, from South Africa to Ottowa. It has been quite extraordinary. Charles, from the Texas meetup, dropped by in Utrecht while on holiday in Europe. I went to Lissabon and met up with Pedro and we became such good friends.

{{< figure src=“/ox-hugo/pedro.jpg” caption=”Figure 2: Meeting up with Pedro in Portugal” >}}

The list of people that have meant something to me and the meetup is extremely long, from Hack The Box we have had Soti, Kristi, Stella, Emma, Austin, Shaun, Bran and so many more. We also have had a quite large regular group of people joining every month. I started listing names here, but that entire list would be so long and I would certainly forget specific people. So just know that if you were a regular I loved the time that I spent with you!

The cost of a meetup {#the-cost-of-a-meetup}

As a meetup we were extremely lucky that NOVI flipped the bill for our in-person events. Imagine ordering 40 to 60 pizza's at your favorite place.... But the cost of organizing is much greater then just that, the amount of personal time that I have spent working on getting the meetups together, chasing down guests and getting things organized is quite something and this is exactly the point where it breaks for me.

After more then 4 years constantly worrying and working on the meetup, even planning my own family life around the meetups (I kid you not, we planned our family holidays so that they did not conflict with the meetups), it has been enough.

Being so involved has taken the joy out of Hack The Box for me, a price I have gladly paid, but a joy which I would like to get back. So for me that means stepping back, letting other people pick up a great meetup and giving it a bright new future.

The end {#the-end}

Every beginning must have an end, and an end makes way to new beginnings. So does this step. Yes, the Hack The Box meetups are over for me after the June meetup, but with NOVI I will continue working for our community. I will continue being involved in the Hack The Box community in various ways, just not organizing monthly meetups.

We (NOVI) already host a weekly hacking session on Friday morning where we tackle Hack The Box machines and other types of challenges. Besides that we organize many different types of workshops and events across the areas of our curriculum (cyber security, development and business).

In the next year we will be hosting a quarterly event dedicated to security in a broader sense, and crossing over to the development realm. These events will line up with our starting moments in the school year. You can stay in the loop by registering on our meetup (https://www.meetup.com/workshops-novi-hogeschool/) page or follow me on LinkedIn (https://www.linkedin.com/in/credmp/).

As I am stepping back from my work on the Dutch Hack The Box meetup I am looking forward to exploring new events and opportunities to teach people about this wonderful field.

Last week I was a guest on the Cyber Cafe podcast by rootsec. It was a fun discussion on education and the current xz backdoor story. It is in the Dutch language. It is available on youtube and included below: