bg_image
header

Entity Manager

Ein Entity Manager ist ein zentraler Bestandteil von ORM-Frameworks (Object-Relational Mapping), vor allem im Zusammenhang mit Java (JPA – Java Persistence API), aber auch in anderen Sprachen wie PHP (Doctrine ORM).

Hier ist eine verständliche Erklärung:


💡 Definition:

Ein Entity Manager ist eine Komponente, die sich um die Verwaltung von Datenbank-Entities (also Objekten/Datensätzen) kümmert. Er bildet die Schnittstelle zwischen der objektorientierten Welt des Codes und der relationalen Welt der Datenbank.


📦 Aufgaben eines Entity Managers:

  1. Persistieren (Speichern):

    • Speichert ein neues Objekt (Entity) in der Datenbank.

    • Beispiel: $entityManager->persist($user);

  2. Finden/Laden:

    • Holt ein Objekt anhand seiner ID oder anderer Kriterien.

    • Beispiel: $entityManager->find(User::class, 1);

  3. Aktualisieren:

    • Änderungen an einem Objekt werden verfolgt und in die Datenbank geschrieben (z. B. beim flush()).

  4. Entfernen/Löschen:

    • Löscht ein Objekt aus der Datenbank.

    • Beispiel: $entityManager->remove($user);

  5. Transaktionen verwalten:

    • Beginnt, commitet oder rollt Transaktionen zurück.

  6. Query-Handling:


🔁 Lebenszyklus von Entities:

Der Entity Manager verwaltet den „Zustand“ von Objekten:

  • managed (verfolgt Änderungen),

  • detached (nicht mehr verwaltet),

  • removed (zum Löschen markiert),

  • new (noch nicht gespeichert).


🛠 Beispiel mit Doctrine (PHP):

$user = new User();
$user->setName('Max Mustermann');

$entityManager->persist($user); // Zum Speichern vormerken
$entityManager->flush();        // Tatsächlich in DB schreiben

Fazit:

Der Entity Manager ist der zentrale Ansprechpartner, wenn es darum geht, mit Datenbankobjekten zu arbeiten – lesen, schreiben, ändern, löschen. Er abstrahiert die SQL-Ebene und macht die Datenbankarbeit objektorientiert steuerbar.


Join Point

Ein Join Point ist ein Begriff aus der Aspect-Oriented Programming (AOP), also der aspektorientierten Programmierung.

Definition:

Ein Join Point ist eine definierte Stelle im Ablauf eines Programms, an der zusätzlicher Code (ein sogenannter Aspekt) eingefügt werden kann.

Typische Beispiele für Join Points:

  • Aufruf einer Methode

  • Ausführung einer Methode

  • Zugriff auf ein Attribut (lesen oder schreiben)

  • Werfen einer Ausnahme

Kontext:

In AOP wird Programmcode modularisiert, indem Querschnittsfunktionen (wie Logging, Sicherheit, Transaktionsmanagement) aus dem eigentlichen Anwendungscode ausgelagert werden. Diese Funktionen werden dann an bestimmten Punkten im Programmablauf (den Join Points) „eingeschnitten“.

Weitere Begriffe im Zusammenhang:

  • Pointcut: Eine Ausdrucksweise, mit der beschrieben wird, welche Join Points betroffen sind (z. B. „alle Methoden mit dem Namen save*“).

  • Advice: Der Code, der an einem Join Point ausgeführt wird (z. B. „logge diesen Methodenaufruf“).

  • Aspect: Eine Kombination aus Pointcut(s) und Advice(s) – also ein vollständiges Modul, das eine Querschnittsfunktion implementiert.

Beispiel (in Spring AOP):

@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
    System.out.println("Aufruf von: " + joinPoint.getSignature().getName());
}

→ Hier wird vor jedem Methodenaufruf in einem bestimmten Package ein Logging-Code ausgeführt – und joinPoint.getSignature() liefert Details zum konkreten Join Point.


Aspect Oriented Programming - AOP

Aspect-Oriented Programming (AOP) ist ein Programmierparadigma, das sich darauf konzentriert, Querschnittsfunktionen (Cross-Cutting Concerns) modular zu kapseln. Es ergänzt objektorientierte oder funktionale Programmierung, indem es Code, der sich durch viele Klassen oder Module zieht, auslagert und separat behandelt.


💡 Ziel:

Probleme wie Logging, Sicherheitsprüfungen, Fehlerbehandlung, Transaktionsmanagement oder Performance-Messungen sind typische Cross-Cutting Concerns. Diese wiederholen sich oft in vielen Klassen und Methoden – AOP ermöglicht es, solchen Code zentral zu schreiben und automatisch an den richtigen Stellen auszuführen.


🔧 Grundbegriffe:

  • Aspect: Ein Modul, das eine Querschnittsfunktion kapselt.

  • Advice: Der eigentliche Code, der ausgeführt wird (z. B. vor, nach oder anstatt einer Methode).

  • Join Point: Ein Punkt im Programmablauf, an dem ein Aspect eingreifen kann (z. B. Methodenaufruf).

  • Pointcut: Eine Definition, welche Join Points betroffen sind (z. B. "alle Methoden in Klasse X").

  • Weaving: Der Prozess, bei dem Aspect-Code mit dem eigentlichen Code „verwoben“ wird – zur Laufzeit, beim Kompilieren oder beim Laden.


🛠 Beispiel (in Java mit Spring AOP):

@Aspect
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Methode wird aufgerufen: " + joinPoint.getSignature().getName());
    }
}

Dieser Code führt automatisch Logging aus, bevor jede Methode im com.example.service-Paket ausgeführt wird.


✅ Vorteile:

  • Bessere Modularität

  • Weniger Code-Duplikate

  • Trennung von Fachlogik und Querschnittslogik


❌ Nachteile:

  • Kann die Lesbarkeit erschweren (man sieht nicht sofort, was alles beim Methodenaufruf passiert).

  • Debugging kann komplexer sein.

  • Oft framework-abhängig (z. B. Spring, AspectJ).


Assertion

Assertions (auf Deutsch: Behauptungen oder Zusicherungen) sind Programmierkonstrukte, mit denen du Annahmen über den Zustand deines Programms überprüfst. Eine Assertion prüft, ob eine bestimmte Bedingung wahr ist – wenn nicht, wird typischerweise ein Fehler ausgelöst und das Programm abgebrochen.

Beispiel (in Python):

x = 10
assert x > 0   # läuft problemlos
assert x < 5   # AssertionError, weil x nicht kleiner als 5 ist

Zweck von Assertions:

  • Sie helfen beim Debuggen: Du überprüfst, ob bestimmte Voraussetzungen im Code erfüllt sind.

  • Sie dokumentieren implizite Annahmen: z. B. „An dieser Stelle muss die Liste mindestens ein Element haben.“

  • Sie dienen der Fehlersuche in der Entwicklungsphase – im Produktivcode werden sie oft deaktiviert.

Wichtiger Unterschied zu regulären Fehlerbehandlungen:

Assertions sollen Programmfehler aufdecken, nicht Benutzereingaben oder äußere Einflüsse abfangen. Beispiel:

  • assert age > 0 → falsch, wenn age aus Benutzereingabe stammt.

  • Stattdessen: if age <= 0: raise ValueError("Alter muss positiv sein.")

 


Design by Contract - DbC

Design by Contract (DbC) ist ein Konzept aus der Softwareentwicklung, das von Bertrand Meyer eingeführt wurde. Es beschreibt eine Methode zur Sicherstellung der Korrektheit und Zuverlässigkeit von Software, indem Verträge zwischen den verschiedenen Komponenten (z.B. Methoden, Klassen) definiert werden.

Grundprinzipien von Design by Contract

Bei DbC wird jede Software-Komponente wie eine Vertragspartei gesehen, die bestimmte Verpflichtungen und Garantien einhält:

  1. Vorbedingungen (Preconditions)
    Bedingungen, die erfüllt sein müssen, bevor eine Methode oder Funktion korrekt ausgeführt werden kann.
    → Verantwortung des Aufrufers.

  2. Nachbedingungen (Postconditions)
    Bedingungen, die nach der Ausführung garantiert werden.
    → Verantwortung der Methode/Funktion.

  3. Invariant (Klasseninvariante)
    Bedingungen, die während der gesamten Lebenszeit eines Objekts wahr bleiben müssen.
    → Verantwortung sowohl der Methode als auch des Aufrufers.

Ziel von Design by Contract

  • Klare Spezifikation der Verantwortlichkeiten.

  • Robustere und besser testbare Software.

  • Fehler werden frühzeitig erkannt (z.B. durch Verletzung des Vertrags).

Beispiel in Pseudocode

class BankAccount {
    private double balance;

    // Invariante: balance >= 0

    void withdraw(double amount) {
        // Vorbedingung: amount > 0 && amount <= balance
        if (amount <= 0 || amount > balance) throw new IllegalArgumentException();

        balance -= amount;

        // Nachbedingung: balance wurde um amount verringert
    }
}

Vorteile

  • Klare Verträge führen zu weniger Missverständnissen.

  • Bessere Fehlersuche, da Verstöße gegen Verträge sofort auffallen.

  • Unterstützt die defensive Programmierung.

Nachteile


Daemon

Ein Daemon (ausgesprochen wie „dä-mon“, nicht wie das englische „demon“) ist ein Hintergrundprozess, der auf einem Computersystem läuft – meist ohne direkte Benutzerinteraktion.

Merkmale eines Daemons:

  • Startet automatisch beim Hochfahren des Systems.

  • Läuft dauerhaft im Hintergrund.

  • Erledigt Aufgaben, ohne dass der Benutzer direkt mit ihm arbeitet.

  • Hört auf Anforderungen von anderen Programmen oder Netzwerken.

Beispiele:

  • cron-Daemon: Führt zeitgesteuerte Aufgaben aus (z. B. tägliche Backups).

  • sshd: Behandelt SSH-Verbindungen von außen.

  • httpd oder nginx: Webserver-Dienste.

  • cupsd: Druckaufträge verwalten.

Technischer Hintergrund:

  • In Unix/Linux endet ein Daemon-Prozessname oft mit „d“ (z. B. httpd, systemd).

  • Ein Daemon wird oft beim Systemstart durch Init-Systeme wie systemd oder init gestartet.

Ursprung des Begriffs:

Der Begriff stammt aus der griechischen Mythologie, wo „Daimon“ eine Art Geist oder übernatürliches Wesen war, das im Hintergrund wirkte – passend zur Funktion im Betriebssystem.


Perl Compatible Regular Expressions - PCRE

Perl Compatible Regular Expressions (PCRE) sind eine Implementierung von regulären Ausdrücken, die sich an der Syntax und Funktionalität der Programmiersprache Perl orientiert. Sie bieten eine sehr mächtige, flexible und erweiterte Syntax, die über einfache reguläre Ausdrücke hinausgeht.

Warum „Perl Compatible“?

Perl war eine der ersten Sprachen, die besonders leistungsstarke reguläre Ausdrücke eingeführt hat. Die PCRE-Bibliothek wurde entwickelt, um diese Funktionen auch in anderen Programmiersprachen und Tools verfügbar zu machen – zum Beispiel in:

  • PHP

  • Python (teilweise, re-Modul ähnelt PCRE)

  • JavaScript (mit leichten Abweichungen)

  • grep-Varianten wie pcregrep

  • Texteditoren wie VS Code, Sublime Text etc.


Wichtige Features von PCRE:

Lookahead & Lookbehind:

  • (?=...) – positive Lookahead

  • (?!...) – negative Lookahead

  • (?<=...) – positive Lookbehind

  • (?<!...) – negative Lookbehind

Nicht-gierige Quantifizierer:

  • *?, +?, ??, {m,n}?

Benannte Gruppen:

  • (?P<name>...) oder (?<name>...)

Unicode-Support:

  • \p{L} für Unicode-Buchstaben usw.

Assertions und Grenzen:

  • \b, \B, \A, \Z, \z

Modifikatoren:

  • (?i) für case-insensitive

  • (?m) für multiline usw.

(?<=\buser\s)\w+

Dieser Ausdruck findet Wörter, die nach "user " stehen (Lookbehind).


Fazit:

PCRE sind die "Deluxe-Version" regulärer Ausdrücke – sie sind leistungsfähig, weit verbreitet und flexibel. Wenn du in einem Tool oder einer Sprache arbeitest, die „PCRE unterstützt“, kannst du dich auf die mächtige Perl-ähnliche Syntax freuen.


Link Juice

„Link Juice“ ist ein Begriff aus der Suchmaschinenoptimierung (SEO) und bezeichnet den Wert oder die Kraft, die ein Hyperlink von einer Webseite auf eine andere überträgt. Diese „Kraft“ beeinflusst, wie gut eine Seite in den Suchmaschinenergebnissen (vor allem bei Google) rankt.

Einfach erklärt:

Wenn eine Webseite A auf Webseite B verlinkt, gibt sie etwas von ihrem „Ruf“ oder ihrer Autorität weiter – das ist der „Link Juice“. Je vertrauenswürdiger und themenrelevanter Seite A ist, desto mehr Link Juice wird übertragen.


Wichtige Faktoren, die Link Juice beeinflussen:

  • Autorität der verlinkenden Seite (z. B. eine große Nachrichtenseite vs. ein kleines Blog)

  • Anzahl der ausgehenden Links: Je mehr Links auf einer Seite sind, desto weniger „Juice“ bekommt jeder einzelne.

  • Follow vs. Nofollow: Nur „dofollow“-Links übertragen Link Juice; „nofollow“-Links (z. B. mit rel="nofollow") tun das in der Regel nicht.

  • Platzierung des Links: Ein Link im Haupttext ist stärker als einer in der Fußzeile oder Seitenleiste.

  • Relevanz: Ein Link von einer thematisch passenden Seite zählt mehr.


Beispiel:

Ein Backlink von Wikipedia auf deine Website gibt dir enorm viel Link Juice – Google wertet das als Zeichen von Vertrauenswürdigkeit. Ein Link von einer unbekannten oder spammy Seite dagegen bringt wenig bis gar nichts oder kann sogar schaden.

 


Levenshtein Distanz

Die Levenshtein-Distanz ist ein Maß für den Unterschied zwischen zwei Zeichenketten (Strings). Sie gibt an, wie viele einzelne Bearbeitungsschritte (Operationen) notwendig sind, um eine Zeichenkette in eine andere zu überführen. Dabei sind die folgenden Operationen erlaubt:

  1. Einfügen eines Zeichens

  2. Löschen eines Zeichens

  3. Ersetzen eines Zeichens durch ein anderes

Beispiel:

Die Levenshtein-Distanz zwischen den Wörtern "Haus" und "Maus" ist 1, weil nur ein Buchstabe (H → M) geändert werden muss.

Anwendung:

Die Levenshtein-Distanz wird in vielen Bereichen verwendet, z. B.:

  • Rechtschreibprüfung (Vorschlag ähnlicher Wörter)

  • DNA-Sequenzvergleiche

  • Plagiaterkennung

  • Fuzzy-Suche in Datenbanken oder Suchmaschinen

Formel (rekursiv, vereinfacht):

Für zwei Strings a und b, mit Längen i und j:

lev(a, b) = min(
  lev(a-1, b) + 1,        // löschen
  lev(a, b-1) + 1,        // einfügen
  lev(a-1, b-1) + cost    // ersetzen (cost = 0, wenn Zeichen gleich; sonst 1)
)

Es gibt auch effizientere dynamische Programmieralgorithmen, um diese Distanz zu berechnen.


Happy Path

Der "Happy Path" (auch "Happy Flow" genannt) bezeichnet in der Softwareentwicklung oder im Testing den idealen Ablauf eines Prozesses oder Programms, bei dem alles wie geplant funktioniert, keine Fehler auftreten und alle Eingaben gültig sind.

Beispiel:

Wenn du z. B. ein Online-Formular zur Registrierung entwickelst, sieht der Happy Path so aus:

  1. Der Benutzer gibt alle Daten korrekt ein (z. B. gültige E-Mail, sicheres Passwort).

  2. Er klickt auf „Registrieren“.

  3. Das System erstellt erfolgreich einen Account.

  4. Der Benutzer wird zur Willkommensseite weitergeleitet.

➡️ Keine Validierungsfehler, keine Serverprobleme, kein unerwartetes Verhalten.


Wozu dient der Happy Path?

  • Erstes Testziel: Beim Entwickeln oder Testen schaut man sich oft zuerst den Happy Path an, um sicherzugehen, dass das Grundgerüst funktioniert.

  • Basis für Use Cases: In der Dokumentation von Anforderungen oder Prozessen ist der Happy Path oft der zentrale Anwendungsfall, bevor man Sonderfälle beschreibt.

  • Abgrenzung zu Edge Cases / Error Paths: Alles, was vom Happy Path abweicht (z. B. leeres Passwortfeld, Serverfehler), gehört zu den „unhappy paths“ oder „alternate flows“.