bg_image
header

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.


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.


Guard

In der Softwareentwicklung bezeichnet ein Guard (auch Guard Clause oder Guard Statement) eine Art von Schutzmechanismus innerhalb einer Funktion oder Methode, der sicherstellt, dass bestimmte Bedingungen erfüllt sind, bevor der restliche Code ausgeführt wird.

Einfach erklärt:

Ein Guard ist wie ein Türsteher: Er lässt nur das durch, was erlaubt ist – und alles andere wird frühzeitig beendet.

Typisches Beispiel (in Python):

def divide(a, b):
    if b == 0:
        return "Division durch null nicht erlaubt"  # Guard Clause
    return a / b

In diesem Beispiel schützt der Guard davor, dass eine Division durch null passiert.


Vorteile von Guards:

  • Frühes Beenden bei ungültigen Zuständen

  • Verbesserte Lesbarkeit durch weniger verschachtelte if-else-Strukturen

  • Saubererer Codefluss, da der "Happy Path" (also der normale Ablauf) nicht durch viele Sonderfälle unterbrochen wird


Beispiele in anderen Sprachen:

JavaScript:

function login(user) {
  if (!user) return; // Guard
  // Weiter mit Login-Logik
}

Swift (hat sogar ein eigenes Schlüsselwort guard):

func greet(person: String?) {
  guard let name = person else {
    print("Kein Name übergeben")
    return
  }
  print("Hallo, \(name)!")
}

Materialized View

Eine Materialized View (auf Deutsch: „materialisierte Sicht“) ist ein spezielles Datenbankobjekt, das das Ergebnis einer SQL-Abfrage dauerhaft speichert – im Gegensatz zu einer normalen View, die bei jeder Abfrage dynamisch berechnet wird.

Eigenschaften einer Materialized View:

  • Speicherung auf Festplatte: Die Daten der Abfrage werden tatsächlich gespeichert, nicht nur die Abfrage selbst.

  • Schnellere Abfragen: Da die Daten bereits berechnet und gespeichert sind, können Anfragen deutlich schneller beantwortet werden.

  • Aktualisierung notwendig: Da sich die zugrundeliegenden Daten ändern können, muss die Materialized View explizit oder automatisch aktualisiert (refreshed) werden, um aktuell zu bleiben.

Vergleich: View vs. Materialized View

Merkmal View Materialized View
Speicherung Nur Abfrage, keine Daten Abfrage und Daten gespeichert
Performance Langsamer bei komplexen Abfragen Schneller, da Daten vorgerechnet
Aktualität Immer aktuell Kann veraltet sein
Aktualisierung notwendig Nein Ja (manuell oder automatisch)

Beispiel:

-- Erstellen einer Materialized View in PostgreSQL
CREATE MATERIALIZED VIEW top_customers AS
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id;

Um die Daten zu aktualisieren:

REFRESH MATERIALIZED VIEW top_customers;

Wann ist sie sinnvoll?

  • Bei komplexen Aggregationen, die häufig gebraucht werden

  • Wenn Performance wichtiger ist als Echtzeit-Aktualität

  • In Data Warehouses oder Reporting-Systemen


Early Exit

Ein Early Exit bezeichnet in der Programmierung eine Technik, bei der eine Funktion oder ein Algorithmus vorzeitig beendet wird, sobald eine bestimmte Bedingung erfüllt ist. Das Ziel ist meist eine effizientere oder lesbarere Code-Struktur.

Beispiel in einer Funktion:

function getDiscount($age) {
    if ($age < 18) {
        return 10; // 10% Rabatt für Minderjährige
    }
    if ($age > 65) {
        return 15; // 15% Rabatt für Senioren
    }
    return 0; // Kein Rabatt für andere Altersgruppen
}

Hier sorgt der Early Exit dafür, dass die Funktion direkt einen Wert zurückgibt, sobald eine Bedingung zutrifft. Das verhindert überflüssige else-Blöcke und macht den Code übersichtlicher.

Vergleich mit einer verschachtelten Variante:

function getDiscount($age) {
    $discount = 0;
    if ($age < 18) {
        $discount = 10;
    } else {
        if ($age > 65) {
            $discount = 15;
        }
    }
    return $discount;
}

Hier wird die Logik unnötig verschachtelt, was die Lesbarkeit verschlechtert.

Weitere Anwendungsfälle:

  • Fehlertests am Anfang einer Funktion (return oder throw bei ungültigen Eingaben)

  • Schleifen schneller abbrechen, wenn das gewünschte Ergebnis gefunden wurde (break oder return)

Ein Early Exit verbessert also Lesbarkeit, Wartbarkeit und Performance eines Codes.


Vite

Vite ist ein modernes Build-Tool und Entwicklungsserver für Webanwendungen, das von Evan You, dem Schöpfer von Vue.js, entwickelt wurde. Es ist darauf ausgelegt, die Entwicklungs- und Build-Prozesse schneller und effizienter zu gestalten. Der Name "Vite" stammt vom französischen Wort für "schnell" und spiegelt das Hauptziel der Software wider: eine blitzschnelle Entwicklungsumgebung.

Die Hauptmerkmale von Vite sind:

  1. Schneller Entwicklungsserver: Vite nutzt die modernen ES-Module (ESM) und bietet durch diese Technik einen ultraschnellen Entwicklungsserver. Es wird nur das neueste Modul geladen, was die Initialisierung deutlich schneller macht als traditionelle Bundler.

  2. Hot Module Replacement (HMR): Der HMR funktioniert extrem schnell, indem er nur die geänderten Module aktualisiert, ohne die gesamte Anwendung neu zu laden.

  3. Modernes Build-System: Vite verwendet Rollup unter der Haube, um die endgültige Produktion zu bundeln, was optimierte und effizientere Builds ermöglicht.

  4. Zero-Konfiguration: Vite ist sehr benutzerfreundlich und erfordert keine umfangreiche Konfiguration. Es funktioniert sofort mit der Standard-Konfiguration, wobei es viele gängige Web-Technologien out-of-the-box unterstützt (z. B. Vue.js, React, TypeScript, CSS-Preprozessoren usw.).

  5. Optimierte Produktion: Für die Produktion wird Rollup verwendet, das für seine effizienten und optimierten Bundles bekannt ist.

Vite richtet sich hauptsächlich an moderne Web-Anwendungen und ist besonders beliebt bei Entwicklern, die mit Frameworks wie Vue, React oder Svelte arbeiten.

 


Partial Mock

Ein Partial Mock (teilweises Mocking) ist eine Technik beim Testen von Software, bei der nur ein Teil eines Objekts durch ein Mock ersetzt wird, während der Rest der echten Implementierung erhalten bleibt. Dies ist besonders nützlich, wenn du nur bestimmte Methoden eines Objekts stubben oder mocken möchtest, während andere Methoden normal ausgeführt werden.

Wann wird ein Partial Mock verwendet?

  • Wenn du eine Klasse testen möchtest, aber bestimmte Methoden von ihr isolieren musst.

  • Wenn einige Methoden schwer zu testen sind (z. B. weil sie externe Abhängigkeiten haben), aber andere weiterhin mit ihrer echten Logik arbeiten sollen.

  • Wenn du nur einige Methoden stubben möchtest, um den Testablauf zu steuern.

Beispiel in PHP mit PHPUnit

Angenommen, du hast eine Klasse Calculator, aber möchtest die Methode multiply() mocken, während add() normal funktioniert.

class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }

    public function multiply($a, $b) {
        return $a * $b;
    }
}

// PHPUnit Test mit Partial Mock
class CalculatorTest extends \PHPUnit\Framework\TestCase {
    public function testPartialMock() {
        // Partial Mock von Calculator
        $calculator = $this->getMockBuilder(Calculator::class)
                           ->onlyMethods(['multiply']) // Nur diese Methode mocken
                           ->getMock();

        // Definiere Verhalten für multiply()
        $calculator->method('multiply')->willReturn(10);

        // Teste echte Methode add()
        $this->assertEquals(5, $calculator->add(2, 3));

        // Teste gemockte Methode multiply()
        $this->assertEquals(10, $calculator->multiply(2, 3));
    }
}

Hier bleibt add() unverändert und arbeitet mit der echten Implementierung, während multiply() immer 10 zurückgibt.

Fazit

Partial Mocks sind nützlich, wenn du Teile einer Klasse isolieren möchtest, ohne sie vollständig zu ersetzen. Sie helfen, Tests stabiler und effizienter zu machen, indem nur bestimmte Methoden gemockt werden.


Salesforce Apex

Salesforce Apex ist eine objektorientierte Programmiersprache, die speziell für die Salesforce-Plattform entwickelt wurde. Sie ähnelt Java und wird hauptsächlich verwendet, um benutzerdefinierte Geschäftslogik, Automatisierungen und Integrationen in Salesforce zu implementieren.

Wichtige Merkmale von Apex:

  • Cloud-basiert: Läuft ausschließlich auf den Servern von Salesforce.

  • Syntaxähnlichkeit zu Java: Wer Java kennt, kann Apex schnell lernen.

  • Eng mit der Salesforce-Datenbank (SOQL & SOSL) verknüpft: Ermöglicht direkte Datenabfragen und Manipulationen.

  • Ereignisgesteuert: Wird oft durch Salesforce-Trigger (z. B. Änderungen an Datensätzen) ausgeführt.

  • Governor Limits: Salesforce begrenzt Ressourcenverbrauch (z. B. maximale Anzahl von SOQL-Abfragen pro Transaktion), um die Performance der Plattform zu sichern.

Verwendung von Apex:

  • Triggers: Automatische Aktionen bei Änderungen an Datensätzen.

  • Batch-Prozesse: Verarbeitung großer Datenmengen in Hintergrundjobs.

  • Web Services & API-Integrationen: Kommunikation mit externen Systemen.

  • Custom Controllers für Visualforce & Lightning: Steuerung von Benutzeroberflächen.

 


Memcached

Memcached ist ein verteiltes In-Memory-Caching-System, das häufig zur Beschleunigung von Webanwendungen eingesetzt wird. Es speichert häufig abgefragte Daten temporär im Arbeitsspeicher, um teure Datenbankabfragen oder API-Aufrufe zu vermeiden.

Wichtige Eigenschaften von Memcached:

  • Schlüssel-Wert-Speicher: Daten werden als Key-Value-Paare gespeichert.

  • In-Memory: Läuft vollständig im RAM, daher extrem schnell.

  • Verteilt: Unterstützt mehrere Server (Cluster), um die Last zu verteilen.

  • Einfach: Bietet eine minimalistische API mit grundlegenden Operationen wie set, get, delete.

  • Eviction (Ablaufstrategie): Verwendet LRU (Least Recently Used), um alte Daten bei Speicherüberlastung zu löschen.

Typische Anwendungsfälle:

  • Caching von Datenbankabfragen: Reduziert die Last auf Datenbanken wie MySQL oder PostgreSQL.

  • Session-Management: Speichert Benutzersitzungen bei skalierbaren Web-Apps.

  • Temporäre Datenspeicherung: Z.B. für API-Rate-Limiting oder kurze Zwischenspeicher.

Memcached vs. Redis:

  • Memcached: Schneller bei einfachen Key-Value-Speichern, skaliert gut horizontal.

  • Redis: Bietet mehr Features wie persistente Speicherung, Listen, Hashes, Sets und Pub/Sub.

Installation & Nutzung (Beispiel für Linux):

sudo apt update && sudo apt install memcached
sudo systemctl start memcached

Mit PHP oder Python kann Memcached über entsprechende Libraries verwendet werden.

 


System Under Test - SUT

Ein SUT (System Under Test) ist das System oder die Komponente, die in einem Testprozess geprüft wird. Der Begriff wird häufig in der Softwareentwicklung und Qualitätssicherung verwendet.

Bedeutung und Anwendung:

  • In Softwaretests bezeichnet der SUT das gesamte Programm, ein einzelnes Modul oder eine spezifische Funktion, die getestet wird.
  • In Hardwaretests kann der SUT ein elektronisches Gerät oder eine Maschine sein, die überprüft wird.
  • In automatisierten Tests wird der SUT oft mit Testframeworks und Tools getestet, um Fehler oder unerwartetes Verhalten zu identifizieren.

Ein typischer Testprozess umfasst:

  1. Definition der Testfälle basierend auf den Anforderungen.
  2. Ausführung der Tests auf dem SUT.
  3. Überprüfung der Testergebnisse und Abgleich mit den erwarteten Werten.