Ein Daemon (ausgesprochen wie „dä-mon“, nicht wie das englische „demon“) ist ein Hintergrundprozess, der auf einem Computersystem läuft – meist ohne direkte Benutzerinteraktion.
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.
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.
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.
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) 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.
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:
Python (teilweise, re
-Modul ähnelt PCRE)
JavaScript (mit leichten Abweichungen)
grep-Varianten wie pcregrep
Texteditoren wie VS Code, Sublime Text etc.
✅ 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).
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“ 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.
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.
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.
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.
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:
Einfügen eines Zeichens
Löschen eines Zeichens
Ersetzen eines Zeichens durch ein anderes
Die Levenshtein-Distanz zwischen den Wörtern "Haus"
und "Maus"
ist 1, weil nur ein Buchstabe (H → M) geändert werden muss.
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
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.
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.
Wenn du z. B. ein Online-Formular zur Registrierung entwickelst, sieht der Happy Path so aus:
Der Benutzer gibt alle Daten korrekt ein (z. B. gültige E-Mail, sicheres Passwort).
Er klickt auf „Registrieren“.
Das System erstellt erfolgreich einen Account.
Der Benutzer wird zur Willkommensseite weitergeleitet.
➡️ Keine Validierungsfehler, keine Serverprobleme, kein unerwartetes Verhalten.
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“.
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.
Ein Guard ist wie ein Türsteher: Er lässt nur das durch, was erlaubt ist – und alles andere wird frühzeitig beendet.
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.
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
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)!")
}
Der Fully Qualified Domain Name (FQDN) ist der vollständige und eindeutige Name eines Computers oder Hosts im Internet oder in einem lokalen Netzwerk. Er besteht aus mehreren Teilen, die eine hierarchische Struktur widerspiegeln.
Ein FQDN setzt sich aus drei Hauptbestandteilen zusammen:
Hostname – Der spezifische Name eines Computers oder Dienstes (z. B. www
).
Domainname – Der Name der übergeordneten Domain (z. B. example
).
Top-Level-Domain (TLD) – Die oberste Ebene der Domainstruktur (z. B. .com
).
Beispiel eines FQDN:
👉 www.example.com.
www
→ Hostname
example
→ Domainname
.com
→ Top-Level-Domain
Der abschließende Punkt (.
) ist optional und steht für die Root-Domain des DNS-Systems.
✅ Eindeutigkeit: Jeder FQDN ist weltweit einzigartig und verweist auf eine bestimmte Ressource im Internet.
✅ DNS-Auflösung: Er wird von DNS-Servern genutzt, um IP-Adressen für Webseiten und Server zu finden.
✅ SSL-Zertifikate: Ein FQDN wird oft in SSL/TLS-Zertifikaten verwendet, um sichere Verbindungen zu gewährleisten.
✅ E-Mail-Zustellung: Mailserver verwenden FQDNs, um Mails an die richtigen Hosts zu senden.
FQDN: mail.google.com
(vollständig spezifiziert)
Einfache Domain: google.com
(kann mehrere Hosts enthalten, z. B. www
, mail
, ftp
)
Zusammengefasst ist der FQDN die vollständige Adresse eines Geräts oder Dienstes im Internet, während eine einfache Domain eine allgemeine Adresse ist.
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.
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.
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.
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 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:
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.
Hot Module Replacement (HMR): Der HMR funktioniert extrem schnell, indem er nur die geänderten Module aktualisiert, ohne die gesamte Anwendung neu zu laden.
Modernes Build-System: Vite verwendet Rollup unter der Haube, um die endgültige Produktion zu bundeln, was optimierte und effizientere Builds ermöglicht.
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.).
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.
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.
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.
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.
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.