Auch wenn der Ausdruck Blog
ursprünglich unschöne Assoziationen (roughly onomatopoeic of vomiting
) wecken sollte, hat sich das Format durchgesetzt und wird von sturen Menschen wie Jason Kottke weiterhin nach dem POSIOP-Prinzip hergestellt:
I will continue to forgo publishing on platforms with ever-shifting strategies, morals, and agreements in favor of my patchwork "system" of publishing tools held together with chewing gum. At least it's *my* chewing gum.
Hear, hear. Nachdem verschiedene Anwendungen in meiner lokalen Arbeitsumgebung aktualisiert wurden, habe ich die Option, neues Kaugummi auf dem Webserver zu applizieren oder den Kaugummibedarf (die Komplexität des Systems) zu reduzieren. Konkret besteht eine Inkompatibilität zwischen PostgreSQL 9 und PostgreSQL 13, die das Import-Skript für den lokalen Datenbankdump auf dem Server scheitern lässt. Die Aussicht, einen kompletten Webstack bei laufendem Betrieb neu aufzusetzen, ist nicht sehr attraktiv, und ich greife auf ein Konzept zurück, das für Notzeiten gedacht war.
Die vorbereitete nginx-Konfiguration auf dem Server ergänze ich um Caching-Anweisungen –
http { map $sent_http_content_type $expires { default off; text/html 1d; text/css 30d; application/pdf 30d; ~image/ 30d; } server { expires $expires; } }
– und im Backrezept make_static
korrigiere ich die Anweisungen für Blog-Seiten, um (wie in der dynamisch generierten Version) jeweils die jüngsten 20 Blogeinträge anzuzeigen. Weil das Modul django.utils.feedgenerator
mittlerweile selbständig Bytestrings UTF-8-kodiert, muss ich die Funktion feed_creator()
geringfügig anpassen (page.content.encode('utf-8')
→ page.content
). Das Skript zur CSS-Minimierung und -Komprimierung –
#!/usr/local/bin/python3 import gzip import cssmin import scriptmail import time from rbackup import BackupProfile css_djangopath = '/var/www/django/css/' css_staticpath = '/var/www/static/css/' css_editpath = 'mysites_editfile.css' css_minimizedpath = 'mysites.css' css_gzippedpath = 'mysites.css.gz' def minimize_css(): with open(f'{css_djangopath}{css_editpath}', encoding='utf-8') as file: print('Reading editfile...') css_editfile = file.read() css_minimized = cssmin.cssmin(css_editfile) with open(f'{css_djangopath}{css_minimizedpath}', encoding='utf-8') as file: print('Reading minimized file...') css_minimizedfile = file.read() if css_minimized != css_minimizedfile: print('CSS was changed!') with open(f'{css_djangopath}{css_minimizedpath}', 'w') as file: print('Writing new minimized file...') file.write(css_minimized) with gzip.open(f'{css_djangopath}{css_gzippedpath}', 'w') as file: print('Writing new gzipped file...') file.write(css_minimized.encode('utf-8')) return True else: print('No changes.') return False def copy_to_static(): css_dir = BackupProfile('css') css_dir.backup() def main(): if minimize_css(): scriptmail.send_message('CSS files updated', f'CSS files {css_editpath}, {css_minimizedpath} and {css_gzippedpath} were updated.') # make sure the messages arrive in the right order time.sleep(2) copy_to_static() else: scriptmail.send_message('CSS files unchanged', 'No updates were necessary.') print('Sending message...') if __name__=='__main__': main()
– könnte wie die Generierung der statischen Website automatisiert werden
und den watchpath /var/www/django/css
auf Änderungen des menschenlesbaren mysites_editfile.css
beobachten, aber bei einer CSS-Änderung pro Dekade und ohne elaborierten Staging-Mechanismus wäre das reichlich sinnlos. So muss ich lediglich meinem rsync-Wrapper rbackup.py
eine Konfiguration zur Synchronisation mit dem Webserver hinzufüge. Aus Solidarität mit den gebeutelten Zeitungsverlagen automatisiere ich auch diesen Schritt nicht, sondern leiste mir eine manuelle Endredaktion.
Google PageSpeed blickt weiterhin sehr wohlwollend auf diese Website (100/100), und laut ab wird die Startseite in durchschnittlich 171 Millisekunden ausgeliefert (ab -n100 -c10 https://eden.one/
).