Alle Notizen stehen in einer Übersicht auch hier.
07 Juni 2025
(Spring Boot 3)
Die Security-Konfiguration hat sich in Spring Security 6 deutlich verändert. Beispielsweise wurde die WebSecurityConfigurerAdapter-Klasse entfernt und durch eine SecurityFilterChain-Bean ersetzt.
Das Projekt realisiert einen Spring Boot Webservice. Der Service bietet frei zugängliche und administrative Resourcen an. Die administrativen Resourcen benötigen einen Api-Key zur Authentifikation des Benutzers.
| Dieses Projekt wird intern verwendet. Das Passwort ist in Form eines Hash in der Konfiguration abgelegt. Grundsätzlich und vor allem bei öffentlich bereitgestellten Resourcen sollten Passwörter in einem Key-Vault, z.B. einem Hashicorp Vault, einem OpenBao-Vault oder etwas ähnlichem vorgehalten werden. |
:
:
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration
{
private final ApiKeyAuthenticationFilter authenticationFilter; (1)
@Bean
public SecurityFilterChain securityFilterChain( HttpSecurity http ) throws Exception
{
return http
.sessionManagement( session -> session.sessionCreationPolicy( SessionCreationPolicy.STATELESS ) ) (2)
.formLogin(AbstractHttpConfigurer::disable) (3)
.csrf( AbstractHttpConfigurer :: disable ) (4)
.securityMatcher( "/**" ) (5)
.authorizeHttpRequests( registry -> registry
.requestMatchers( AntPathRequestMatcher.antMatcher( "/internal/**" ) ).authenticated() (6)
.anyRequest().permitAll() (7)
)
.addFilterBefore( authenticationFilter, UsernamePasswordAuthenticationFilter.class ) (8)
.build();
}
}
:
:
| 1 | ApiKeyAuthenticationFilter ist ein Requestfilter, der den eingehenden Request anhand der Security-Regeln filtert und bei Bedarf die Authentifizierungslogik anwendet. Dazu wird die Methode "doFilterInternal" überschrieben, die als Parameter u.a. die FilterChain-Bean und den Request enthält. |
| 2 | Stateless Sessions stellen sicher, dass jeder Request neu authetifiziert wird, da keine Cookies verwendet werden. |
| 3 | Damit wird die Out-of-the-box Authentifizierung über ein Formular, d.h. die Weiterleitung auf eine Default-Loginseite verhindert. |
| 4 | Spring Security schützt standardmäßig vor CSRF-Angriffen für unsichere HTTP-Methoden, wie z. B. eine POST-Anfrage, sodass kein zusätzlicher Code erforderlich ist. Um POST-Anfragen durchführen zu können, muss CSRF disabled sein. |
| 5 | hier kann festgelegt werden, für welche Endpunkte die Sicherheitskonfiguration gültig ist (in diesem Fall für alle Endpunkte). |
| 6 | Dieser Matcher legt fest, dass alle Resourcen, die "internal" in der Url enthalten authentifiziert werden müssen. |
| 7 | Dieser Matcher legt fest, dass alle weiteren Resourcen keiner Authentifizierung unterliegen. |
| 8 | Es wird sichergestellt, dass die individuelle Filterung immer vor der sonst an erster Stelle (default) stehenden User:Password Filterung durchgeführt wird. |
Der Controller enthält Resourcen, die keiner Zugangsbeschränkung unterliegen und administrative Resourcen, die mit einem Api-Key abgesichert werden.
:
:
@GetMapping("/doSomething")
public ResponseEntity<String> getDoSomething() {
return ResponseEntity.ok("This is a public resource.");
}
@GetMapping("/internal/doAdmin")
public ResponseEntity<String> getDoAdmin() {
return ResponseEntity.ok("This is a a protected resource.");
}
:
:
ApiKeyAuthenticationFilter erbt von einem Requestfilter, der den eingehenden Request anhand der Security-Regeln filtert und bei Bedarf die Authentifizierungslogik anwendet. Dazu wird die Methode "doFilterInternal" überschrieben.
:
:
@Component
@RequiredArgsConstructor
public class ApiKeyAuthenticationFilter extends OncePerRequestFilter
{
private final ApiKeyAuthExtractor extractor; (1)
@Override
protected void doFilterInternal( HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain ) throws ServletException, IOException
{
extractor.extract( request )
.ifPresent( SecurityContextHolder.getContext() :: setAuthentication ); (2)
filterChain.doFilter( request, response );
}
}
:
:
| 1 | Der Extractor ist die Klasse, die die Authentifizierung durchführt, d.h. in diesem Fall den übergebenen Api-Key überprüft. |
| 2 | Abhängig vom Ergebnis der Extractor-Klasse wird ein Request als authentifiziert bzw. nicht authentifiziert angesehen. |
ApiKeyAuthExtractor ist ein Handler, der in der Methode "extract" in diesem Fall den im Request übergebenen Key mit einem vorhandenen Wert, z.B. aus einem Key-Vault oder Properties-File vergleicht und damit eine erfolgreiche/nicht erfolgreiche Authentifizierung anzeigt.
:
:
@Value("${security.key}")
private String apiKey;
public Optional<Authentication> handle( HttpServletRequest request) {
String providedKey = request.getHeader("api-key");
if (providedKey == null || !providedKey.equals(apiKey))
return Optional.empty();
return Optional.of(new ApiKeyAuthentication( providedKey, AuthorityUtils.NO_AUTHORITIES));
}
:
:
ApiKeyAuthentication ist ein Authentifizierungs-Object, d.h. ein Token der bei einer erfolgreichen Authetifizierung erzeugt wird, d.h. wenn im Requestheader ein korrekter API-Schlüssel gefunden wird.
:
:
public class ApiKeyAuthentication extends AbstractAuthenticationToken
{
private final String apiKey;
public ApiKeyAuthentication(String apiKey, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.apiKey = apiKey;
setAuthenticated(true);
}
@Override
public Object getCredentials() {
return null;
}
@Override
public Object getPrincipal() {
return apiKey;
}
}
:
:
10 Februar 2024
Kubernetes (K8s) ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen.
"kubectl" ist die Kommandozeilen-Applikation zur Verwaltung eines Kubernetes-Clusters.
Minikube stellt einen lokalen Kubernetes Cluster zur lokalen Entwicklung zur Verfügung.
(Die Überschriften der einzelnen Listings sind Links auf die entsprechenden Kubernetes-Seiten)
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl
# Download the public signing key for the Kubernetes package repositories. The same signing key is used for all repositories so you can disregard the version in the URL:
# If the folder `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Update apt package index, then install kubectl:
sudo apt-get update
sudo apt-get install -y kubectl
apt-get install bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
# Wenn es keinen alias gibt:
echo 'alias k=kubectl' >>~/.bashrc
# Wenn der alias angelegt ist
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb
minikube start
minikube stop
15 Oktober 2023
Standardvorgehen, um Datenbank-Daten mit Go zu lesen oder zu schreiben ist die Benutzung des "database/sql" Package. Selects werden in der Regel, d.h. wenn es sich nicht um einen einzelnen Spaltenwert handelt mit einem "struct" oder einer Liste von "structs" verarbeitet.
Ein "struct" bildet dabei jeweils eine Datenbanktabelle ab. Es ist mühsam und fehleranfällig, "structs" für jede Tabelle manuell zu pflegen.
Tables-To-Go kann structs reverse aus einem vorhandenen Datenbankmodell erstellen. Dies funktioniert z.B. mit MySQL, Postgres und (über einen im Repository beschriebenen Umweg, d.h. Klonen des Repositories und Ausführen von " make sqlite3" auch) mit SQLite.
Tables-To-Go lässt sich mit diesem Befehl installieren:
go install github.com/fraenky8/tables-to-go@latest
Nach der Installation mit "go install" oder "make sqlite3" steht eine ausführbare Datei "tables-to-go" im Verzeichnis "~/go/bin" bereit"
Die structs für alle Tabellen einer Datenbank lassen sich für Postgres (dem Standardfall) mit folgendem Befehl erstellen
tables-to-go -h <ip der Datenbank> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname>
oder mit weiteren Parametern
tables-to-go -v -t pg -h <ip der Datenbank> -port <DB-Port> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname> -pre <Prefix> -suf <Postfix> -of <Ausgabeverzeichnis>
Die structs für alle Tabellen einer Datenbank lassen sich für SQLite3 mit folgendem Befehl erstellen
tables-to-go -v -t sqlite3 -d <..Pfad/zur/Datenbank/dbname.sqlite> -of <Ausgabeverzeichnis> -suf <Postfix>
Die Tabelle "app_user" in einer Postgres-Datenbank sieht folgendermaßen aus:
Der Befehl:
tables-to-go -v -t pg -h localhost -port 15432 -d mp3 -u psqladmin -p postgres -pn model -suf _entity -of model
erzeugt das "struct" "AppUserEntity" im Unterverzeichnis "model" (Das Verzeichnis muss bereits existieren).
package model
import (
"database/sql"
"time"
)
type AppUserEntity struct {
ID int `db:"id"`
UserCode string `db:"user_code"`
LastName string `db:"last_name"`
FirstName sql.NullString `db:"first_name"`
Email string `db:"email"`
Password string `db:"password"`
Role sql.NullString `db:"role"`
Enabled sql.NullBool `db:"enabled"`
Created time.Time `db:"created"`
}
17 September 2023
Schwachstelle des RaspberryPi ist die SDCard, auf der das Betriebssystem untergebracht ist. Diese Karten sind für das Speichern von Informationen gedacht. Die ständigen Lese- und Schreibvorgänge des Betriebssystems strapazieren die Karte derartig, dass es keine Frage ist, ob Karte ausfällt, sondern nur wann das passiert.
Der RaspberryPi ab Version 3 lässt sich ohne Einschränkungen betreiben, wenn das Betriebssystem auf eine externe Festplatte ausgelagert wird. Das sollte im Idealfall eine SSD sein, da diese stromsparender als eine mechanische HDD arbeitet und auch die Gefahr eines thermischen Schadens gering ist, da in der Regel keine zusätzliche Kühlung notwendig ist.
Der RaspberryPi ist, wenn er fabrikneu in Betrieb genommen wird so eingestellt, dass er von USB bootet, sofern keine SD-Karte eingesetzt worden ist. Sollte das nicht funktionieren oder ist der Raspberry bereits in Gebrauch gewesen, würde ich eine zusätzliche SD-Karte verwenden und diese mit einem aktuellen Raspberry Pi OS versehen. Das kann man direkt herunterladen oder aber mit dem "Imager" auf die Karte übertragen.
Die Karte verwendet man dann zum Start des Raspberry und zum Aufruf der Konfiguration.
sudo raspi-config
Unter dem Menüpunkt "Advanced Options → Boot Order" lässt sich die Bootreihenfolge ändern. Danach wird die SD-Karte nicht mehr benötigt.
Die externe Disk muss analog zur SD-Karte mit einem Betriebssystem für den Raspberry Pi versehen werden. Verwendet man ein Raspberry Pi OS kann man dazu ebenfalls den Imager verwenden.
|
In den Zusatzoptionen können gleich die Zugangsdaten für den SSH-Zugfriff und das WLAN, sowie die Länder- und Tastatureinstellungen festgelegt werden.
|
Angeschlossen wird die externe Platte an den schnbellen blauen USB-3-Ports des Raspberry Pi (in der Version 4).
16 September 2023
Aktuell basiert die "stable" Version des https://www.raspberrypi.com/software [Raspberry Pi OS] noch auf Debian Bullseye (Debian 11) und es ist nicht sicher, wann ein Upgrade erfolgen wird. Mit folgenden Schritten kann man auf die neue Version "Bookworm" upgraden.
Als erstes ein Backup anlegen, Daten sichern usw. !!
sudo apt update
sudo apt upgrade
sudo nano /etc/apt/sources.list (1)
| 1 | In der Datei /etc/apt/sources.list alle Vorkommen von "bullseye" zu "bookworm" ändern und die einzelnen Zeilen um "…-firmware" Einträge ergänzen. |
Das Ergenis sieht dann etwa so aus:
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
Die Fragen, die während des Update-Vorganges im Terminal autauchen jeweils mit den Default-Werten (Enter) bestätigen.
Die Änderungs Protokolle mit "q" beenden.
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
Neu Starten (reboot)
Die neue Version (12) kann jetzt überprüft werden:
cat /etc/debian_version
16 September 2023
Docker ist mit wenigen Befehlen installiert
sudo apt update (1)
sudo apt upgrade (2)
sudo curl -sSL https://get.docker.com | sh (3)
sudo usermod -aG docker $USER (4)
| 1 | Update des Systems |
| 2 | Gegebenenfalls Upgrade einzelner Pakete |
| 3 | Installation von Docker |
| 4 | Hinzufügen des aktuellen Users zur Gruppe "docker" |
03 April 2023
Wenn der Rechner "normal" bootet, dabei aber Fehlermeldungen wirft:
ACPI BIOS Error (bug): Failure creating named object ... : .... ACPI Error: AE_ALREADY_EXISTS, During name ... :
kann das mit der verwendeten Grafikkarte zusammenhängen. Es handelt sich um einen bekannten Ubuntu-Bug ohne weitere Auswirkungen. Die Meldungen können durch das Ändern des Log-Levels ausgeblendet und ignoriert werden.
In der Datei /etc/default/grub die Zeile
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
um loglevel=3 ergänzen. Ergebnis:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash loglevel=3"
Danach sudo update-grub ausführen.
02 April 2023
Quellcodeabschnitte werden mit Kommentarzeichen und "tag:name[]", bzw. "end:name[]" unterteilt.
public class HelloWorld {
// tag::mainMethod[]
public static void main(String[] args) {
System.out.println("Hello World!");
}
// end::mainMethod[]
}
Der tag-Abschnitt kann dann im Asciidoc-Test eingefügt werden
[source,java]
----
include::HelloWorld.java[tags=mainMethod]
----
das ergibt dann in der Dokumentation
Text vor dem Tag
public static void main(String[] args) {
System.out.println("Hello World!");
}
Text nach dem Tag
01 April 2023
Unter Linux Mint 21 lässt sich aus den Repositories VirtualBox nur in Version 6.x installieren. So wird die aktuelle Version (7.x) direkt von VirtualBox installiert.
wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] http://download.virtualbox.org/virtualbox/debian jammy contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
# update der Paketquellen und Installation
sudo apt update
sudo apt install virtualbox-7.0
# Exakte VirtualBox-Version feststellen
vboxmanage -v | cut -dr -f1
# Extension Pack herunterladen
Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
wget https://download.virtualbox.org/virtualbox/7.0.6/Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
# Extension Pack installieren
sudo vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
# Installation des Extension Packs prüfen
vboxmanage list extpacks
sudo usermod -a -G vboxusers $USER
01 Februar 2023
JBake ist ein Generator statischer Webseiten. (Meine Notizen zu JBake)
| Windows | Linux |
|---|---|
|
Unter Linux ist in der Regel ein JRE vorhanden. Es kann, wenn notwendig mit "sudo apt-get install default-jre" (bei Debian basierten Distributionen) installiert werden. |
JBake wird einfach von hier heruntergeladen und in einem beliebigen Verzeichnis ausgepackt. Es ist komfortabel, den Pfad der JBake-Startdatei (Verzeichnis: bin) in den Umgebungsvariablen bekannt zu geben, um das Eintippen des Pfades in der Konsole zu vermeiden.
| Windows | Linux |
|---|---|
|
Unter Linux kann je nach Distribution und verwendeter Shell der Pfad des bin-Verzeichnisses mit einer Ergänzung in z.B. der Datei .bashrc exportiert werden. |
Danach kann in der Eingabeaufforderung oder einem Terminal überprüft werden, ob JBake ohne Angabe des Installationspfades gefunden wird.

Die Versionsverwaltungssoftware Git wird nicht zum Erstellen der Webseiten benötigt. Git verwaltet die Quelldateien (Asciidoc, Markdown, HTML) für uns in Repositories lokal und auf z.B. GitHub. Sie sind dort gesichert und stehen zur Änderung, Ergänzung und nachfolgender Verwendung mit JBake bereit.
| Windows | Linux |
|---|---|
Das Konsolenprogramm Git kann von dieser Adresse heruntergeladen und mit einem Doppelklick installiert werden. |
Unter Linux kann git, wenn notwendig mit "sudo apt-get install git" (bei Debian basierten Distributionen) installiert werden. |
Abschließend sollten noch folgende Konfigurationsbefehle ausgeführt werden, da Git sonst danach fragt und keine Befehle ausführt. In einer Konsole oder z.B. der "Windows Eingabeaufforderung" müssen die folgenden Befehle ausgeführt werden (das terminal (cmd oder Konsole kann in jedem beliebigen Verzeichnis des Rechners geöffnet werden.):
git config --global user.email "ftp@posaunenchor-urberach.de" git config --global user.name "Posaunenchor"
Die Emailadresse und der Benutzername sin nicht vorgegeben, dort sollte etwas sinnvolles und gültiges eingetragen werden.
Lässt man "--global" weg, gelten die Einträge nur für den gerade angemeldeten Benutzer. Das ist Geschmackssache.
Wir arbeiten nur im Hauptbranch (master oder main), deshalb werden Branches hier nicht weiter berücksichtigt!
Filezilla ist ein FTP-Programm, das zum Übertragen der fertig "gebackenen" Webseiten auf den Webserver verwendet wird.
| Windows | Linux |
|---|---|
Filezilla kann z.B. von dieser Adresse in einer portablen Variante heruntergeladen und mit Doppelklick installiert werden. |
Unter Linux kann filezilla, wenn notwendig mit "sudo apt-get install filezilla" (bei Debian basierten Distributionen) installiert werden. |
|
Um einen Server einzurichten müssen nur die gelb hinterlegten Felder mit den bekannten Angaben ausgefüllt werden. |
FileZilla erklärt sich eigentlich selber. Server werden im Servermanager angelegt und dann oben links ausgewählt. Ist die Verbindung aufgebaut können unten links auf dem lokalen Rechner z.B. Dateien oder Verzeichnisses ausgewählt werden und dann mit einem rechten Mausklick und dem nachfolgenden Dialog auf den Server, der unten rechts angezeigt wird hochgeladen werden - fertig.

31 Januar 2023
JBake ist ein Generator statischer Webseiten. Dabei werden aus verschiedenen Quelldateien (Asciidoc, Markdown, HTML) statische HTML-Seiten auf dem lokalen Rechner erzeugt. Die fertigen Seiten werden dann per FTP z.B. auf gemieteten Webspace übertragen und von einem Webserver angezeigt.
Statische Webseiten sind lediglich eine Sammlung von Dateien und lassen sich mit minimalem Aufwand hosten. HTML- und CSS-Elemente werden direkt bei einer Veränderung des Codes gerendert und erst nach diesem "Prerendering" auf dem Webserver bereitgestellt. Dadurch wird die Performance des Webauftrittes erhöht, die Komplexität ist generell geringer und die statischen Seiten bieten keine Angriffspunkte, wie dies zum Beispiel bei einem CMS (z.B. Wordpress) der Fall ist.
Die Dokumentation für JBake 2.6.7 enthält einen Quickstart Guide, in dem beschrieben ist, wie mit wenigen Befehlen ein neues JBake Projekt erzeugt werden kann. Die folgenden Konsolenbefehle reichen dafür aus:
$ mkdir project (1)
$ cd project
$ jbake -i (2)
($ ODER: jabake -i -t groovy mit Groovy-Templates)
$ jbake -b -s (3)
| 1 | Anlegen eines Projektverzeichnises und Wechsel in dieses Verzeichnis. |
| 2 | Initialisieren des Projektes (Defaulttemplatesprache ist freemarker, wenn Groovy-Templates verwendet werden sollen mit dem Zusatz -t groovy) |
| 3 | Fertigstellen der vorhandenen Seiten und Starten des internen Servers. Die Seiten können nun im Browser unter der Adresse http://localhost:8820 (oder einem anderen Port, wenn dies in der properties-Datei angegeben ist.) angezeigt werden. Der JBake Server läuft im Watch-Mode und aktualisiert die bearbeiteten Seiten selbständig. |
projektverzeichnis
|-- assets
| |-- css
| |-- fonts
| |-- img
| |-- js
|-- content
| |-- blog
| | |-- 2022
| | |-- 2023
| |-- image
|-- output
|-- templates
assets - Verzeichnis mit allen für das Projekt statischen Dateien in Unterverzeichnissen, z.B. Javascript-Dateien, CSS-Dateien, Images
content - Inhalt der Webseiten, d.h. einzelne Asciidoc, Markdown oder HTML-Dateien. Das Verzeichnis "blog" enthält die Artikel (Posts) der Webseite. Es kann zur besseren Verwaltbarkeit in weitere Unterverzeichnisse aufgeteilt sein. Je nach Umfang ist es denkbar, auf Ebene von "blog" auch ein Verzeichnis "pages" anzulegen, das einzelne Seiten und Unterseiten enthält, wenn es der Übersicht dient.
output - Gerenderte Dateien, die mittels FTP auf den Wepräsenz-Server übertragen werden können.
templates - JBake Vorlagen-Dateien, aus denen JBake Seiten und Artikel erzeugt.
Die Erstellung der Webseiten lässt sich mit der Datei "jbake.properties" beeinflussen. Auf die einzelnen Einträge kann in den Templates mit Platzhaltern zugrgriffen werden. Sie ist in der JBake Dokumentation zur Konfiguration beschrieben.
JBake enthält eine Default-Konfiguration (default.properties), die in der individuellen Konfiguration (jbake.properties) überschrieben werden können. Die Konfiguration kann Kommentare enthalten. Dafür wird die entsprechende Zeile mit einem "#"" auskommentiert.
| Eintrag | Beschreibung |
|---|---|
site.host=https://eulon.de |
Host der Webseiten |
index.file=index.html |
Default-Dateinamen |
asset.folder=site/assets |
Namen der Projekt-Unterverzeichnisse (jeweils die Default-Werte) |
render.feed=false |
welche Content unabhängigen Seiten sollen angelegt werden? |
template.index.file=index.gsp |
Groovy-Vorlagendateien (jeweils die Default-Werte. Wird kein Groovy verwendet, können diese Einträge entfallen.) |
JBake verwendet je nach Initialisierung eines Projektes verschiedene Sprachen in den Templates, die zur Erstellung der eigentlichen Webseiten verwendet werden. Das sind Freemarker, Groovy, Thymeleaf oder Jade, die entsprechend in den Templates eingebettet sind.
Es sind Templates für verschiedene Seiten enthalten, die nicht direkt dem zu erstellenden Content zuzuordnen sind, z.B. index, archive, feed oder sitemap. Jede dieser Dateien kann beim rendern der Seiten übersprungen werden. Dazu werden sie in der Konfigurationsdatei deaktiviert (z.B. render.archive=false).
Weitere Templates werden zur Erzeugung von z.B. header, footer und menu verwendet. Diese sind in den Seiten-Templates inkludiert.
Weitere Konfigurationsmöglichkeiten sind in der JBake Dokumentation zur Konfiguration beschrieben.
29 September 2022
Bei der Entwicklung mit Python immer mit virtuellen Umgebungen
(Virtual Environments, kurz „venv“) arbeiten.
Eine virtuelle Umgebung enthält den Python-Interpreter und alle für das Projekt importierten Module in einem Unterverzeichnis, unabhängig davon, welche Version des Interpreters und welche Module auf dem Entwicklungs-System vorhanden sind.
Seit Python 3.3 gehört das venv-Modul zum Lieferumfang; eine neue virtuelle Umgebung mit dem Namen venv entsteht mit nur
einem Befehl:
python3 -m venv venv (1)
| 1 | python3 -m venv <Name des Verzeichnisses> In diesem Beispiel liegt das Verzeichnis venv unterhalb des Verzeichnisses, in dem der Befehl ausgeführt wurde. |
Aktivierung des venv der folgende Befehl:
source venv/bin/activate (1)
| 1 | Unter Windows: venv\Scripts\activate.bat |
Jetzt können beliebige Python-Modul installiert/deinstalliert werden.
pip3 install <modulname>
pip3 uninstall <modulname>
Nach der Installation ist das Modul im virtuellen Environment zu finden (unterhalb von venv\Lib\site-packages).
Um das virtuelle Environment wieder zu deaktivieren reicht "deactivate"
Um es zu löschen muss nur der Ordner (z.B. venv) gelöscht werden.
Die für ein Projekt installierten Module werden in einer Datei requirements.txt zusammengestellt.
pip3 freeze > requirements.txt
Diese Datei wird mit dem Projekt ausgeliefert. Auf dem Zielsystem muss dann,um alle notwendigen Module zu installieren, lediglich folgendes ausgeführt werden:
pip3 install -r requirements.txt
(oder)
pip3 install -r requirements.txt --user (1)
| 1 | Außerhalb eines virtuellen Environments werden Module nur im User-Verzeichnis und nicht global installiert, wenn --user angegeben worden ist. |
Alle Notizen stehen in einer Übersicht auch hier.