Filezilla has Directory filters

Today I discovered filezilla has a feature “directory list filters” to exclude certain directories/files: (View > Directory list filters (cmd+I on macos)). You can use this to exclude files like .git, or .DS_Store (you have to add .DS_Store)

I’m using filezilla since the dawn of time, yet I only discovered this now.

Skyz 2.0 Rewrite update: July 2025

Update 2025-07-05: Ik heb de update uitgesteld tot Augustus. Ik wil wachten tot ik de nieuwe infrastructuur getest heb op de komende Debian 13 release.

6 maanden geleden ben ik aan de rewrite van Skyz 2.0 gestart. De rewrite is bijna af dus ik post even een update. Er is nog geen vaste releasedatum (ik wil dat het goed is). Ik verwacht dat het ergens volgende week of midden augustus gereleased word (te zien hoeveel ik kan afkrijgen ik kan doen voordat ik op vakantie vertrek).

Lees verder

Automatische HTTPS met Apache

HTTPS is de dag van vandaag een must voor een website. Er zijn tools om certificaten automatisch aan te vragen (certbot etc), en webservers die gekend zijn om dit automatisch te doen (zoals Caddy), maar wist je dat je met Apache ook geen nood hebt voor Certbot? Met mod_md kan je apache automatisch HTTPS certificaten laten aanvragen via ACME (hetzelfde systeem dat Certbot en de caddy server gebruiken).

Lees verder

Coderunner.app en python virtual environments

Ik ben de laatste tijd wat aan het experimenteren met CodeRunner als mijn IDE, maar ik stuitte op 1 probleem: Ik gebruik Python Virtual Environments maar Coderunner gebruikte deze standaard niet. Gelukkig is er niets dat je niet kan oplossen met wat scripting en code, en CodeRunner laat je toe een compilatiescript te gebruiken voor het uitvoeren.

Als Python compiler script kan je het volgende gebruiken:

# Initialize the current directory
dir="$(pwd)"

# Search up to three parent directories
for i in {1..4}; do
	# Check if the .venv directory exists
	if [[ -d "$dir/.venv" ]]; then
		echo "$dir/.venv/bin/activate"
		exit 0
	fi
	# Move up one directory
	dir="$(dirname "$dir")"
done

# If no .venv is found, print a message and exit with non-zero status
echo "No .venv directory found within the current or parent directories."
exit 1

Vervolgens moet je het volgende toevoegen als compiler commando

source $compiler; python3 $filename

Viola, als je nu een script uitvoert binnen CodeRunner, gebruikt het automatisch de juiste .venv!

Debian herinstalleren over SSH

Ik wou onlangs mijn nuc herinstalleren, maar omdat er geen scherm is waar mijn nuc staat (hij draait momenteel als headless server), besloot ik om te experimenteren met de Debian installer over SSH. Tijdens het installeren moest ik wel even mijn Nuc gaan halen en aan een scherm hangen (omdat ik een typo gemaakt had), maar ik ben er wel in geslaagd om Debian volledig over SSH te installeren. In deze post ga ik over het proces dat ik gebruikt heb om dit te doen.

Lees verder

Page generation time tonen in Django

Bij het bouwen van een django applicatie kan het soms handig zijn om te weten hoe lang het duurde om een pagina te genereren. We kunnen namelijk wel zien hoe lang het duurde om een pagina te laden in de developer tools van onze browser, maar niet hoelang het werkelijk duurde om de pagina te genereren. In Django kunnen we dit oplossen met een stukje middleware

In een bestand (bijvoorbeeld “app/middleware.py” kunnen we het volgende toevoegen:

import time
class StatsMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        request.start_time = time.time()

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.
        duration = time.time() - request.start_time
        response["X-Page-Generation-Duration"] = str(round(duration,3))+"s"
        return response

Vervolgens kunnen we de middleware laden. Het is belangrijk dat deze middleware als eerste in de MIDDLEWARE configuratie instelling.

Deze middleware zal een header “X-Page-Generation-Duration” toevoegen met de tijd die het duurde om de pagina te genereren.

 

Django Caching, i18n en Authenticatie

Django bied geweldige tools voor caching eenvoudig maken. Het heeft naar mijn mening wel 2 grote beperkingen:

  • Het stuurt automatisch Cache-control headers, waardoor de client’s cache verhinderd dat de pagina goed herlaad als de taal gewijzigd word en er geen taal prefix in de url gebruikt word
  • Het cached niet per gebruiker, waardoor als we niet opletten er mogelijks private informatie gelekt kan worden.

Beide van deze beperkingen waren oorspronkelijk een probleem bij het herschrijven van Skyz. Het eerste probleem kon deels verholpen worden door taalprefixes toe te voeren aan de url’s, de andere problemen kon ik oplossen op de volgende manieren.

Lees verder

Notes on caching

In een vorige post heb ik toegelicht hoe je caching kan toevoegen aan Django (en in de toekomst zal ik een post maken hoe je ook kan cachen op de webserver). Ik heb wat geëxperimenteerd met caching en ik heb enkele dingen geleerd.

there are two things hard in computer science: cache invalidation and naming things
— Phil Karlton

Wat te cachen

Statische assets (CSS, Javascript etc) kunnen eigenlijk permanent gecached worden (of toch een langere periode, zoals een maand of een jaar), idealiter ook op de client. Alle andere inhoud moeten we mee opletten.

De homepagina op een drukbezochte site heeft vaak wel baat bij volledig gecached te worden (ook door downstream caches zoals de webserver of een CDN), maar eigenlijk enkel als de site geregeld bezoekerspieken krijgt. Pagina’s die niet veel bezoek krijgen worden beter niet gecached, omdat de kans groot is dat de gecachede versie nooit gebruikt zal worden.

Dure databasequeries worden vaak best gecached, net als externe API calls. Deze worden best gecached in bijvoorbeeld memcached voor zolang het acceptabel is dat deze gegevens “out of date” zijn, bijvoorbeeld 5 tot 10 minuten.

Cachen om te cachen is vaak de moeite niet, als een gecachede pagina nooit cache hits krijgt word er enkel geheugen verspild. In zo’n geval word er beter gekeken naar het optimaliseren van de site/code.