Swift in WSL2 (Linux) erstellen

Das Swift-Ökosystem entwickelt sich aktiv außerhalb der Apple-Plattformen, und heute ist es recht komfortabel, darin unter Windows mit dem Windows-Subsystem für Linux (WSL2) zu schreiben. Es ist zu bedenken, dass für Assemblys unter Linux/WSL eine schlanke Version von Swift verfügbar ist – ohne proprietäre Apple-Frameworks (wie SwiftUI, UIKit, AppKit, CoreData, CoreML, ARKit, SpriteKit und andere iOS/macOS-spezifische Bibliotheken), aber für Konsolen-Dienstprogramme und das Backend ist dies mehr als ausreichend. In diesem Beitrag werden wir den Prozess der Vorbereitung der Umgebung und der Erstellung des Swift-Compilers aus dem Quellcode in WSL2 Schritt für Schritt durchgehen (am Beispiel von Ubuntu/Debian).

Wir aktualisieren die Liste der Pakete und das System selbst:

sudo apt update && sudo apt upgrade -y

Installieren Sie die erforderlichen Abhängigkeiten für den Build:

sudo apt install -y \
  git cmake ninja-build clang python3 python3-pip \
  libicu-dev libxml2-dev libcurl4-openssl-dev \
  libedit-dev libsqlite3-dev swig libncurses5-dev \
  pkg-config tzdata rsync

Installieren Sie den Compiler und Linker (LLVM und LLD):

sudo apt install -y llvm lld

Klonen Sie das Swift-Repository mit allen Abhängigkeiten:

git clone https://github.com/apple/swift.git
cd swift
utils/update-checkout --clone

Installieren Sie „swiftly“ und fertiges Swift mit Swiftc

curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz && \
tar zxf swiftly-$(uname -m).tar.gz && \
./swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh" && \
hash -r

Beginnen wir mit dem Build (dies wird lange dauern):

utils/build-script \
  --release-debuginfo \
  --swift-darwin-supported-archs="x86_64" \
  --llvm-targets-to-build="X86" \
  --skip-build-benchmarks \
  --skip-test-cmark \
  --skip-test-swift \
  --skip-ios \
  --skip-tvos \
  --skip-watchos \
  --skip-build-libdispatch=false \
  --skip-build-cmark=false \
  --skip-build-foundation \
  --skip-build-lldb \
  --skip-build-xctest \
  --skip-test-swift

Nachdem der Build abgeschlossen ist, fügen Sie den Pfad zum Compiler zu PATH hinzu (geben Sie Ihren Pfad zum Build-Ordner an):

export PATH=/root/Sources/3rdparty/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin/swiftc:$PATH

Wir überprüfen, ob die installierte Version von Swift funktioniert:

swift --version

Erstellen Sie eine Testdatei und führen Sie sie aus:

echo "print(\"Hello, World!\")" > hello.swift
swift hello.swift

Sie können die Binärdatei auch kompilieren und ausführen:

swiftc hello.swift
./hello

Quellen

Teflecher

Teflecher ist eine schnelle, interaktive, plattformübergreifende Quizanwendung, die auf Kotlin Multiplatform (KMP) und Compose Multiplatform basiert. Es ermöglicht Benutzern, Quizfragen intuitiv aus lokalen JSON-Dateien oder Remote-URLs zu laden, Multiple-Choice-Fragen zu beantworten, sofortiges Feedback zu richtigen Antworten zu erhalten und ihre Ergebnisse zu verfolgen.

Web:
https://demensdeum.com/software/teflecher/

GitHub:
https://github.com/zefir1990/teflecher

Außerdem ein Quiz-Editor im Teflecher-Editor-Format, der auf Ionic + Capacitor-Technologien basiert

Web:
https://demensdeum.com/software/teflecher-editor/

GitHub:
https://github.com/zefir1990/teflecher-editor

Musterinterpreter in der Praxis

Im letzten Artikel haben wir uns mit der Theorie des Interpreter-Musters befasst, gelernt, was ein AST-Baum ist und wie man terminale und nicht-terminale Ausdrücke abstrahiert. Lassen Sie uns dieses Mal von der Theorie Abstand nehmen und sehen, wie dieses Muster in ernsthaften kommerziellen Projekten angewendet wird, die wir alle täglich verwenden!

Spoiler: Möglicherweise verwenden Sie gerade das Interpreter-Muster, indem Sie einfach diesen Text in Ihrem Browser lesen!

Eines der auffälligsten und vielleicht wichtigsten Beispiele für die Verwendung dieses Musters in der Branche ist JavaScript. Die ursprünglich „auf dem Knie“ entstandene Sprache funktioniert heute dank des Interpretationskonzepts auf Milliarden von Geräten.

10 Tage, die das Internet verändert haben

Die Geschichte von JavaScript ist voller Legenden. Im Jahr 1995 erhielt Brendan Eich während seiner Arbeit bei Netscape Communications die Aufgabe, eine einfache Skriptsprache zu entwickeln, die direkt in einem Browser (Netscape Navigator) ausgeführt werden konnte, um Webseiten interaktiv zu gestalten. Das Management wollte etwas mit einer Syntax, die dem damals sehr beliebten Java ähnelte, aber nicht für professionelle Ingenieure, sondern für Webdesigner gedacht war.

Eich hatte nur 10 Tage Zeit, um den ersten Prototyp der Sprache zu schreiben, die damals Mocha hieß (damals LiveScript und aus Marketinggründen erst JavaScript). Der Ansturm kam nicht von ungefähr: Microsoft war ihm dicht auf den Fersen und bereitete gleichzeitig aktiv seine eigene Skriptsprache VBScript für die Einbettung in den Internet Explorer-Browser vor. Netscape musste dringend seine Antwort veröffentlichen, um im drohenden Browserkrieg nicht zu verlieren.

Es war einfach keine Zeit, einen komplexen Compiler in Maschinencode zu schreiben. Die offensichtlichste und schnellste Lösung für Eich war die Architektur des klassischen Interpreter.

Der erste Interpreter (SpiderMonkey) funktionierte folgendermaßen:

  1. Der Textquellcode des Skripts wurde von der Seite gelesen.
  2. Der lexikalische Analysator hat den Text in Token zerlegt.
  3. Der Parser hat einen Abstract Syntax Tree (AST) erstellt. In Bezug auf das Interpreter-Muster bestand dieser Baum aus terminalen Ausdrücken (Zeichenfolgen, Zahlen wie 42) und nicht-terminalen Ausdrücken (Funktionsaufrufe, Anweisungen wie If, ​​​​While).
  4. Dann „durchlief“ die virtuelle Maschine diesen Baum Schritt für Schritt und führte die darin eingebetteten Anweisungen an jedem Knoten aus (wobei sie eine Methode ähnlich Interpret() aufrief).

Kontext und Objekte

Erinnern Sie sich an das Context-Objekt, das wir in der klassischen Implementierung an die Methode Interpret(Context context) übergeben mussten? Der Interpreter benötigt es, um den aktuellen Speicherzustand zu speichern.

Im Fall von JavaScript wird die Rolle dieses Kontexts auf der obersten Ebene von einem globalen Objekt (z. B. einem Fenster in einem Browser) übernommen. Wenn Ihr AST-Knoten versucht, beispielsweise über document.write(“Hello”) Text auf den Bildschirm zu schreiben, greift der Interpreter auf seinen Kontext (das Dokumentobjekt) zu und ruft die gewünschte interne Browser-API auf.

Dank des Interpreters kann JavaScript so einfach mit dem DOM (Document Object Model) interagieren – das sind alles nur Objekte in einem Kontext, auf die über Baumknoten zugegriffen wird.

Entwicklung des Interpreters: JIT-Kompilierung

Historisch gesehen ist JS in Browsern lange Zeit ein „reiner“ Interpreter geblieben. Und das hatte einen großen Nachteil: langsame Geschwindigkeit. Das Parsen des Baums und das langsame Durchlaufen jedes Knotens bei jeder Ausführung des Skripts verlangsamte komplexe Webanwendungen.

Mit der Einführung der V8-Engine von Google (integriert in Chrome) im Jahr 2008 kam es zu einer Revolution. Ingenieure erkannten, dass ein Dolmetscher für das moderne Web nicht ausreicht. Die Engine ist komplexer geworden: Sie erstellt immer noch den AST-Baum, verwendet aber jetzt die JIT-Kompilierung (Just-In-Time).

Moderne JS-Engines (V8, SpiderMonkey) funktionieren wie eine komplexe Pipeline:

  1. Der schnelle und einfache Basisinterpreter beginnt sofort mit der Ausführung Ihres JS-Codes, ohne überhaupt auf die Kompilierung warten zu müssen (das klassische Muster funktioniert hier immer noch).
  2. Parallel dazu überwacht die Engine „heiße“ Codeabschnitte (Schleifen oder Funktionen, die tausende Male aufgerufen werden).
  3. Diese Abschnitte werden vom JIT-Compiler unter Umgehung des langsamen Interpreters direkt in optimierten Maschinencode kompiliert.

Es war diese Kombination aus dem sofortigen Start des Interpreters und der Rechenleistung der Kompilierung, die es JavaScript ermöglichte, die Welt zu erobern und zur Sprache von Servern (Node.js) und mobilen Anwendungen (React Native) zu werden.

Dolmetscher in der Spielebranche

Trotz der Dominanz von C++ im Heavy Computing ist das Interpreter-Muster ein Industriestandard in der Spieleentwicklung zum Erstellen von Spiellogik. Wofür? Damit Spieleentwickler Spiele erstellen können, ohne das Risiko einzugehen, die Engine „abzuwerfen“ oder sie ständig neu kompilieren zu müssen.

Ein hervorragendes historisches Beispiel ist UnrealScript – die Sprache, in der die Logik der Spiele Unreal Tournament und Gears of War in den Unreal Engines 1, 2 und 3 geschrieben wurde. Der Text wurde in einen kompakten abstrakten Maschinenbytecode kompiliert, der dann Schritt für Schritt von der virtuellen Maschine der Engine (interpretiert) wurde.

Visuelle Diagrammskripte (Blueprints)

Heute wurde Text durch visuelle Programmierung ersetzt – das Blueprints-System in Unreal Engine 4 und 5.

Wenn Sie jemals einen Blueprint in Unreal Engine geöffnet haben, haben Sie viele Knoten gesehen, die durch Kabel verbunden sind. Architektonisch gesehen ist das gesamte Blueprints-Diagramm ein riesiger abstrakter Syntaxbaum (AST), der auf dem Bildschirm gezeichnet wird:

  1. Terminalausdrücke: Konstante Knoten. Zum Beispiel ein Knoten, der einfach die Zahl 42 oder einen String speichert. Sie geben bei der Interpretation einen bestimmten Wert zurück.
  2. Nicht-terminale Ausdrücke: Rechenknoten (Hinzufügen) oder Flusskontrollknoten (Zweig). Sie verfügen über Argumenteingänge, die der Interpreter zunächst rekursiv auswertet, bevor er das Ergebnis als Ausgabepin erzeugt.

Und die Rolle des Kontexts spielt hier die Erinnerung an eine Instanz eines bestimmten Spielobjekts (Akteur). Die Interpretermaschine „geht“ sicher durch dieses Diagramm, fordert Daten an und führt Übergänge durch.

Wo wird der Interpreter sonst noch verwendet?

Das Interpretermuster kann in fast jedem komplexen System gefunden werden, in dem dynamische Anweisungen ausgeführt werden müssen. Hier sind nur einige Beispiele aus kommerzieller Software:

  • Interpretierte Programmiersprachen (Python, Ruby, PHP). Ihre gesamte Laufzeit basiert auf dem klassischen Muster. Beispielsweise analysiert die CPython-Referenzimplementierung Ihr .py-Skript zunächst in ein AST, kompiliert es in Bytecode und dann interpretiert eine riesige virtuelle Maschine (Rechenschleife) diesen Bytecode Schritt für Schritt.
  • Java Virtual Machine (JVM). Zunächst wird Java-Code nicht in Maschinenanweisungen, sondern in Bytecode kompiliert. Wenn Sie die Anwendung ausführen, fungiert die JVM als Interpreter (allerdings mit aggressiver JIT-Kompilierung, genau wie in V8).
  • Datenbanken und SQL Wenn Sie eine SQL-Abfrage (SELECT * FROM user) in PostgreSQL oder MySQL ausgeben, fungiert die Datenbank-Engine als Interpreter. Es führt eine lexikalische Analyse durch, erstellt einen AST-Abfragebaum, generiert einen Ausführungsplan und „interpretiert“ diesen Plan dann buchstäblich, indem es über die Zeilen der Tabellen iteriert.
  • Reguläre Ausdrücke (RegEx). Jede Engine für reguläre Ausdrücke analysiert intern ein Zeichenfolgenmuster (z. B. ^\d{3}-\d{2}$) in ein Zustandsdiagramm (NFA/DFA-Automaten), das der interne Interpreter dann durchläuft und jedes Eingabezeichen mit den Eckpunkten dieses Diagramms abgleicht.
  • Unity Shader Graph / Unreal Material Editor – visuelle Knoten in modularen Shader-Code (GLSL/HLSL) interpretieren.
  • Blender Geometry Nodes – interpretieren mathematische und geometrische Operationen, um prozedural 3D-Modelle in Echtzeit zu generieren.

Gesamt

Das Interpreter-Muster geht längst über den Rahmen des „Schreibens eines eigenen Taschenrechners“ hinaus. Dies ist der leistungsstärkste Industriestandard. Von JavaScript-Engines, die täglich Gigabytes an Code hinter den Kulissen von Browsern ausführen, bis hin zu Spieledesignern, die es Ihnen ermöglichen, komplexe Logik ohne Kenntnisse von C++ zu erstellen, bleiben Interpreter eines der wichtigsten Architekturkonzepte in der modernen IT-Entwicklung.

Glazki TV: Moderner Player für Internetfernsehen

Glazki TV ist ein moderner, leistungsstarker Player für Internetfernsehen (IPTV), der auf Basis von React Native und Expo entwickelt wurde. Das Projekt konzentriert sich auf Benutzerfreundlichkeit und Geschwindigkeit und bietet eine praktische Schnittstelle zum Anzeigen von IPTV-Kanälen sowohl auf Mobilgeräten als auch im Browser.

Hauptmerkmale

  • 📺 Kanalsuche: Durchsuchen Sie Tausende von Kanälen, kategorisiert für eine einfache Navigation.
  • 🔍 Suche: Finden Sie schnell die gewünschten Kanäle anhand des Namens.
  • ❤️ Favoriten: Speichern Sie Ihre Lieblingskanäle für den schnellen Zugriff (Daten werden lokal gespeichert).
  • 🔗 Deep Linking: Teilen Sie direkte Links zu Kanälen, die automatisch geöffnet werden.
  • 🌓 Theme-Unterstützung: Die Benutzeroberfläche passt sich automatisch an das dunkle oder helle Theme des Systems an.
  • 🌐 Web-Unterstützung: Der Player ist im Browser mit URL-Synchronisierung voll funktionsfähig.

Technologie-Stack

Das Projekt basiert auf modernen Entwicklungstools:

  • Framework: React Native + Expo
  • Video Player: expo-video (замена устаревшему expo-av)
  • UI-Toolkit: React-Native-Paper
  • Playlist-Parser: iptv-playlist-parser

Webversion:
https://demensdeum.com/software/glazki-tv/

Google Play-Version:
https://play.google.com/store/apps/details?id=com.demensdeum.glazkitv

Das Projekt entwickelt sich weiter und ich würde mich über jedes Feedback freuen!

Flammenstahl: Todesmaske 2

In den dunklen, neonflackernden Tiefen der digitalen Unterwelt wartet eine neue Herausforderung. Wir freuen uns, den Vorhang für Flame Steel: Death Mask 2 zu öffnen, einen Multiplayer-3D-Dungeon-Crawler, der Retro-Cyberpunk-Ästhetik mit modernem Echtzeit-Gameplay verbindet.

🕹️ Was ist Flame Steel: Death Mask 2?

Stellen Sie sich vor, Sie wachen in einem prozedural erzeugten Labyrinth auf, in dem jeder Schatten ein anderer Spieler oder eine feindliche „Filter“-Entität sein könnte. Flame Steel: Death Mask 2 versetzt Sie in die Rolle eines Suchers und navigiert durch eine Welt, die auf der Flame Steel Engine 2 und Three.js basiert.

Das Spiel befindet sich derzeit in einem frühen Entwicklungsstadium, aber das Kernerlebnis ist bereits live und bereit zur Erkundung.

🚀 Hauptfunktionen

  • Mehrspieler-Erkundung: Sie sind nicht allein im Raster. Sehen Sie andere Spieler in Echtzeit, während Sie durch die labyrinthischen Korridore navigieren.
  • Prozedurale Dungeons: Kein Lauf gleicht dem anderen. Der Server generiert neue Karten voller Geheimnisse und Gefahren.
  • Das Terminal: Für diejenigen, die einen eher „praktischen“ Ansatz bevorzugen, ermöglicht eine integrierte Befehlszeilenschnittstelle die direkte Interaktion mit dem System – führen Sie erweiterte Aktionen aus, debuggen Sie oder chatten Sie einfach mit anderen Suchern.
  • Kampf & Überleben: Treten Sie gegen Filter an, um Bits zu verdienen, und verwenden Sie diese Bits dann, um Truhen freizuschalten und Ihre Statistiken zu verbessern. Behalten Sie Ihre Gesundheit im Auge; Das Überleben ist nicht garantiert.
  • Retro-Cyberpunk-Ästhetik: Kontrastreiche Grafik und eine düstere Atmosphäre, die eine Hommage an die klassische Cyberpunk-Ära darstellt.

🛠️ Die Technik hinter der Maske

Das für den Browser entwickelte Spiel nutzt Folgendes:

  • Frontend: Vanilla JavaScript und Three.js für reibungsloses 3D-Rendering.
  • Backend: Node.js und WebSockets (ws) für blitzschnelle Multiplayer-Synchronisierung.
  • Infrastruktur: MongoDB für Datenpersistenz und Redis für räumliche Echtzeitindizierung.

🗺️ Was kommt als nächstes?

Wir fangen gerade erst an. Als Early-Access-Projekt wird Death Mask 2 regelmäßig aktualisiert, darunter:

  • Neue Entitätstypen und komplexe Kampfmechaniken.
  • Tieferes Geschichtenerzählen über Geschichte und Umwelt.
  • Verbesserte Terminalbefehle und soziale Funktionen.
  • Optischer und leistungstechnischer Feinschliff.

🔗 Treten Sie dem Grid bei

Möchten Sie Ihr Können testen? Geben Sie Ihren Codenamen ein und initialisieren Sie noch heute Ihre Identität:

👉 Flame Steel: Death Mask 2 spielen

Bleiben Sie gespannt auf weitere Updates, während wir die digitalen Grenzen weiter ausbauen. Willkommen im Service. Es erfordert Sie.

Uschki-Radio

Ushki-Radio ist ein plattformübergreifender Radioplayer für Online-Radio, bei dessen Entwicklung Einfachheit und Hörvergnügen im Vordergrund stehen. Keine unnötigen Funktionen, keine überlasteten Schnittstellen – einfach einschalten und zuhören.


https://demensdeum.com/software/ushki-radio

Das Projekt nutzt den Open-Source-Radiobrowser, wodurch Tausende von Radiosendern aus aller Welt in der Anwendung verfügbar sind. Sie können sie nach Name, Genre oder Beliebtheit suchen, sie zu Ihren Favoriten hinzufügen und schnell zu Ihren Lieblingssendern zurückkehren.

Ushki-Radio eignet sich perfekt für die Rolle eines Hintergrundradioplayers: Es merkt sich den letzten Sender, ermöglicht die Steuerung der Lautstärke und erfordert keine komplexen Einstellungen. Die Benutzeroberfläche ist prägnant und verständlich – alles ist so gestaltet, dass nichts von Musik, Gesprächen und Übertragungen ablenkt.

Technisch basiert das Projekt auf React Native und Expo, funktioniert also sowohl im Browser als auch als native Anwendung. Unter der Haube wird expo-av zum Abspielen von Audio verwendet und Benutzereinstellungen werden lokal gespeichert. Es werden mehrere Sprachen unterstützt, darunter Russisch und Englisch.

Ushki-Radio ist ein gutes Beispiel dafür, was ein moderner Internetradio-Player sein kann: offen, leichtgewichtig, erweiterbar und in erster Linie auf den Hörer ausgerichtet. Das Projekt wird unter der MIT-Lizenz vertrieben und eignet sich sowohl für den persönlichen Gebrauch als auch als Grundlage für eigene Experimente mit Audioanwendungen.

GitHub:
https://github.com/demensdeum/Ushki-Radio

Coverer

Coverseer – intelligenter Prozessbeobachter mit LLM

Coverseer ist ein Python-CLI-Tool zur intelligenten Überwachung und zum automatischen Neustart von Prozessen. Im Gegensatz zu klassischen Watchdog-Lösungen analysiert es die Textausgabe der Anwendung mithilfe des LLM-Modells und trifft Entscheidungen basierend auf dem Kontext und nicht nur auf dem Exit-Code.

Das Projekt ist Open Source und auf GitHub verfügbar:
https://github.com/demensdeum/coverseer

Was ist Coverser?

Coverseer startet den angegebenen Prozess, überwacht kontinuierlich dessen stdout und stderr, leitet die neuesten Ausgabeblöcke an das lokale LLM (über Ollama) weiter und stellt fest, ob sich der Prozess im korrekten Ausführungszustand befindet.

Wenn das Modell einen Fehler, ein Einfrieren oder ein falsches Verhalten erkennt, bricht Coverseer den Prozess automatisch ab und startet ihn erneut.

Hauptfunktionen

  • Kontextbezogene Analyse der Ausgabe – Anstelle der Überprüfung des Exit-Codes wird eine Protokollanalyse mit LLM verwendet
  • Automatischer Neustart – der Prozess wird neu gestartet, wenn Probleme oder ein abnormaler Abbruch erkannt werden
  • Arbeiten mit lokalen Modellen – Ollama wird verwendet, ohne Daten an externe Dienste zu übertragen
  • Detaillierte Protokollierung – alle Aktionen und Entscheidungen werden zur späteren Diagnose aufgezeichnet
  • Eigenständige Ausführung – kann in eine einzelne ausführbare Datei (z. B. .exe) gepackt werden

Wie es funktioniert

  1. Coverseer führt den über die CLI übergebenen Befehl aus
  2. Sammelt und puffert die Textausgabe des Prozesses
  3. Sendet die letzten Zeilen an das LLM-Modell
  4. Erhält eine semantische Bewertung des Prozessstatus
  5. Beendet den Prozess bei Bedarf und startet ihn neu

Mit diesem Ansatz können Sie Probleme identifizieren, die von Standardüberwachungstools nicht erkannt werden können.

Anforderungen

  • Python 3.12 oder höher
  • Ollama installiert und läuft
  • Geladenes Modell gemma3:4b-it-qat
  • Python-Abhängigkeiten: requests, ollama-call

Beispiel verwenden


python Coverseer.py „Ihr Befehl hier“

Beobachten Sie beispielsweise das Laden des Ollama-Modells:


Python Coverseer.py „Ollama Pull Gemma3:4b-it-qat“

Coverseer analysiert die Befehlsausgabe und reagiert automatisch auf Ausfälle oder Fehler.

Praktische Anwendung

Coverseer ist besonders nützlich in Szenarien, in denen Standard-Supervisor-Mechanismen nicht ausreichen:

  • CI/CD-Pipelines und automatische Builds
  • Hintergrunddienste und Agenten
  • Experimentelle oder instabile Prozesse
  • Tools mit großen Mengen an Textprotokollen
  • Entwicklungsumgebungen, in denen Selbstheilung wichtig ist

Warum der LLM-Ansatz effektiver ist

Klassische Überwachungssysteme reagieren auf Symptome. Coverser analysiert Verhalten. Das LLM-Modell ist in der Lage, Fehler, Warnungen, wiederholte Ausfälle und logische Sackgassen zu erkennen, selbst wenn der Prozess formal weiterläuft.

Dadurch wird die Überwachung genauer und die Zahl der Fehlalarme verringert.

Schlussfolgerung

Coverseer ist ein klares Beispiel für die praktische Anwendung von LLM bei DevOps und Automatisierungsaufgaben. Es erweitert das traditionelle Verständnis der Prozessüberwachung und bietet einen intelligenteren, kontextbasierten Ansatz.

Das Projekt wird insbesondere für Entwickler interessant sein, die mit KI-Tools experimentieren und nach Möglichkeiten suchen, die Stabilität ihrer Systeme zu verbessern, ohne die Infrastruktur zu verkomplizieren.

Flame Steel: Mars-Minenarbeiter

Flame Steel: Mars Miners ist ein taktisches Strategiespiel mit ungewöhnlichem Tempo und einem Schwerpunkt auf Entscheidungsfindung statt auf Reflexen. Das Spiel findet auf dem Mars statt, wo die Spieler angesichts begrenzter Informationen und ständigem Druck von Rivalen um die Kontrolle über Ressourcen und Gebiete konkurrieren.

Das Gameplay basiert auf dem Bau von Hub-Stationen, die die Infrastruktur Ihrer Expedition bilden. Mit Knoten können Sie Ressourcen gewinnen, Ihren Einflussbereich erweitern und Logistik aufbauen. Jede Platzierung zählt: Ein Fehler kann dem Feind den Weg zu Schlüsselsektoren ebnen oder Ihnen einen strategischen Vorteil nehmen.

Der Spielrhythmus ist bewusst kontrolliert und intensiv. Es liegt irgendwo zwischen Schach, Go und Seekampf: Positionierung, Vorhersage der Aktionen des Gegners und die Fähigkeit, mit Unsicherheit zu arbeiten, sind hier wichtig. Ein Teil der Karte und die Absichten des Feindes bleiben verborgen, sodass der Erfolg nicht nur von der Berechnung, sondern auch vom Erfassen der Situation abhängt.

Flame Steel: Mars Miners unterstützt das Online-Spielen, was jedes Spiel einzigartig macht – Strategien entwickeln sich und die Meta wird gerade geformt. Das Spiel befindet sich in einem frühen Entwicklungsstadium und darin liegt seine Stärke: Spieler haben die Möglichkeit, als Erste in ein neues, nicht standardmäßiges Projekt einzutauchen, dessen Entwicklung zu beeinflussen und Mechaniken zu entdecken, die nicht die üblichen Vorlagen des Genres kopieren.

Wenn Sie sich für taktische Spiele mit Tiefe, experimentellem Design und einem Schwerpunkt auf Denken interessieren, sollten Sie sich jetzt Flame Steel: Mars Miners ansehen.

SPIELREGELN

* Das Spielfeld besteht aus Feldern, auf denen die Spieler nacheinander ihre Objekte platzieren. In jeder Runde kann ein Spieler eine Bauaktion durchführen.

* Es dürfen nur zwei Arten von Objekten gebaut werden: Hub-Stationen und Minen. Jede Konstruktion ist ausschließlich auf einer freien Zelle möglich, die sich vertikal oder horizontal neben einem vorhandenen Spielerknoten befindet. Eine diagonale Platzierung ist nicht zulässig.

* Hub-Stationen bilden die Grundlage der Gebietskontrolle und dienen als Erweiterungspunkte. Minen werden nach den gleichen Regeln platziert, gelten jedoch als Ressourcenobjekte und wirken sich direkt auf das Endergebnis der Gruppe aus.

* Wenn ein Spieler vertikal oder horizontal eine durchgehende Linie seiner Knotenstationen baut, wird eine solche Linie automatisch zu einer Waffe. Die Waffe ermöglicht es, den Feind anzugreifen und seine Infrastruktur zu zerstören.

* Um eine Waffe abzufeuern, wählt der Spieler ein zu seiner Waffe gehörendes Feld aus und zeigt auf eine beliebige feindliche Knotenstation auf dem Spielfeld. Die ausgewählte feindliche Knotenstation wird zerstört und vom Spielfeld entfernt. Minen können nicht direkt angegriffen werden – nur durch die Zerstörung von Knotenpunkten, die den Zugang zu ihnen ermöglichen.

* Das Spiel läuft bis zum festgelegten Spielende. Sieger ist der Spieler, der zu diesem Zeitpunkt die meisten Rohstoffminen auf dem Spielfeld hat. Bei Gleichheit können die Gebietskontrolle oder zusätzliche durch den Spielmodus bedingte Bedingungen ausschlaggebend sein.

https://mediumdemens.vps.webdock.cloud/mars-miners

Antigravitation

Innerhalb weniger Tage habe ich mit Hilfe von Antigravity das Masonry-AR-Backend von PHP + MySQL auf Node.js + MongoDB + Redis -> Docker übertragen. Die Fähigkeiten der KI sind wirklich erstaunlich. Ich erinnere mich, wie ich 2022 über ChatGPT die einfachsten Shader auf Shadertoy.com geschrieben habe und es schien, als könnte dieses Spielzeug nichts Höheres leisten.
https://www.shadertoy.com/view/cs2SWm

Vier Jahre später beobachte ich, wie ich in ca. 10 Eingabeaufforderungen mein Projekt mühelos von einer Back-Plattform auf eine andere übertragen und dabei Containerisierung hinzugefügt habe.
https://mediumdemens.vps.webdock.cloud/masonry-ar/

Cool, wirklich cool.

Kaban-Vorstand

KabanBoard ist eine Open-Source-Webanwendung zur Verwaltung von Aufgaben im Kanban-Format. Der Fokus des Projekts liegt auf Einfachheit, verständlicher Architektur und der Möglichkeit der Anpassung an die spezifischen Aufgaben eines Teams oder eines einzelnen Entwicklers.

Die Lösung eignet sich für kleine Projekte, interne Teamprozesse oder als Basis für Ihr eigenes Produkt ohne Bindung an SaaS-Dienste Dritter.

Das Projekt-Repository ist auf GitHub verfügbar:
https://github.com/demensdeum/KabanBoard

Hauptmerkmale

KabanBoard implementiert eine Reihe grundlegender und praktischer Funktionen für die Arbeit mit Kanban-Boards.

  • Erstellen mehrerer Boards für verschiedene Projekte
  • Spaltenstruktur mit Aufgabenstatus
  • Aufgabenkarten mit der Möglichkeit zum Bearbeiten und Löschen
  • Aufgaben zwischen Spalten verschieben (Drag & Drop)
  • Farbcodierung von Karten
  • Dunkles Interface-Design

Die Funktionalität ist nicht überladen und konzentriert sich auf die alltägliche Arbeit mit Aufgaben.

Verwendete Technologien

Das Projekt basiert auf einem gemeinsamen und verständlichen Stack.

  • Frontend:Vue 3, Vite
  • Backend: Node.js, Express
  • Datenspeicher: MongoDB

Die Trennung von Client- und Serveranteil erleichtert die Betreuung und Weiterentwicklung des Projekts.

Projektbereitstellung

Für die lokale Ausführung benötigen Sie eine Standardumgebung.

  • Node.js
  • MongoDB (lokal oder über die Cloud)

Das Projekt kann entweder im normalen Modus über npm oder mit Docker gestartet werden, was für eine schnelle Bereitstellung in einer Test- oder internen Umgebung praktisch ist.

Praktische Anwendung

KabanBoard kann in verschiedenen Szenarien eingesetzt werden.

  • Internes Aufgabenverwaltungstool
  • Basis für eine individuelle Kanban-Lösung
  • Ausbildungsprojekt zum Studium der SPA-Architektur
  • Ausgangspunkt für ein Lieblingsprojekt oder Portfolio

Schlussfolgerung

KabanBoard ist eine übersichtliche und praktische Lösung für die Arbeit mit Kanban-Boards. Das Projekt erhebt nicht den Anspruch, große Unternehmenssysteme zu ersetzen, sondern eignet sich gut für kleine Teams, den individuellen Einsatz und die Weiterentwicklung für spezifische Aufgaben.

Gofis

Gofis ist ein leichtes Befehlszeilentool zum schnellen Durchsuchen von Dateien im Dateisystem.
Es ist in Go geschrieben und nutzt stark Parallelität (Goroutinen), was es besonders effizient macht
bei der Arbeit mit großen Verzeichnissen und Projekten.

Das Projekt ist auf GitHub verfügbar:
https://github.com/demensdeum/gofis

🧠 Was ist Gofis?

Gofis ist ein CLI-Dienstprogramm zum Durchsuchen von Dateien nach Namen, Erweiterung oder regulärem Ausdruck.
Im Gegensatz zu klassischen Tools wie find wurde gofis ursprünglich entwickelt
mit Schwerpunkt auf Geschwindigkeit, lesbarer Ausgabe und paralleler Verzeichnisverarbeitung.

Das Projekt wird unter der MIT-Lizenz vertrieben und kann frei verwendet werden
für persönliche und kommerzielle Zwecke.

⚙️ Hauptfunktionen

  • Parallele Verzeichnisdurchquerung mithilfe von Goroutinen
  • Suche nach Dateinamen und regulären Ausdrücken
  • Nach Erweiterungen filtern
  • Schwere Verzeichnisse (.git, node_modules, Vendor) werden ignoriert
  • Menschenlesbare Ausgabe der Dateigrößen
  • Minimale Abhängigkeiten und schnelle Erstellung

🚀 Installation

Damit Go funktioniert, muss Go installiert sein.

git clone https://github.com/demensdeum/gofis
cd gofis
go build -o gofis main.go

Sobald die Binärdatei erstellt ist, kann sie direkt verwendet werden.

Auf der Release-Seite gibt es auch eine eigenständige Version für moderne Windows-Versionen:
https://github.com/demensdeum/gofis/releases/

🔍 Anwendungsbeispiele

Dateien nach Namen suchen:

./gofis -n "config" -e ".yaml" -p ./src

Schnelle Positionssuche:

./gofis "main" "./projects" 50

Suche mit regulärem Ausdruck:

./gofis "^.*\.ini$" "/"

🧩 Wie es funktioniert

Gofis basiert auf dem Wettbewerbsmodell von Go:

  • Jedes Verzeichnis wird in einer separaten Goroutine verarbeitet
  • Verwendet ein Semaphor, um die Anzahl aktiver Aufgaben zu begrenzen
  • Kanäle werden zur Übermittlung von Suchergebnissen verwendet

Dieser Ansatz ermöglicht eine effiziente Nutzung der CPU-Ressourcen
und beschleunigt die Suche in großen Dateibäumen erheblich.

👨‍💻 Für wen ist Gofis geeignet?

  • Entwickler, die mit großen Repositories arbeiten
  • DevOps und Systemadministratoren
  • Benutzer, die eine schnelle Suche über das Terminal benötigen
  • Für diejenigen, die die praktischen Anwendungen der Parallelität in Go erlernen

📌 Fazit

Gofis ist ein einfaches, aber effektives Tool, das eines tut und es gut macht.
Wenn Sie in großen Projekten häufig nach Dateien suchen und Wert auf Geschwindigkeit legen,
Dieses CLI-Tool ist auf jeden Fall einen Blick wert.

Ollama-Anruf

Wenn Sie Ollama verwenden und nicht jedes Mal Ihren eigenen API-Wrapper schreiben möchten,
Das Projekt ollama_call vereinfacht die Arbeit erheblich.

Dies ist eine kleine Python-Bibliothek, die es Ihnen ermöglicht, mit einer Funktion eine Anfrage an ein lokales LLM zu senden
und erhalten sofort eine Antwort, auch im JSON-Format.

Installation

pip install ollama-call

Warum wird es benötigt

  • Minimalcode für die Arbeit mit dem Modell;
  • Strukturierte JSON-Antwort zur weiteren Verarbeitung;
  • praktisch für schnelle Prototypen und MVPs;
  • unterstützt bei Bedarf die Streaming-Ausgabe.

Beispiel verwenden

from ollama_call import ollama_call

response = ollama_call(
    user_prompt="Hello, how are you?",
    format="json",
    model="gemma3:12b"
)

print(response)

Wenn es besonders nützlich ist

  • Sie schreiben Skripte oder Dienste auf Basis von Ollama;
  • benötigen ein vorhersehbares Antwortformat;
  • Es besteht kein Wunsch, schwere Frameworks zu verbinden.

Gesamt

ollama_call ist ein leichter und übersichtlicher Wrapper für die Arbeit mit Ollama aus Python.
Eine gute Wahl, wenn Einfachheit und schnelle Ergebnisse wichtig sind.

GitHub
https://github.com/demensdeum/ollama_call

SFAP: ein modulares Framework für die moderne Datenerfassung und -verarbeitung

Im Rahmen der aktiven Entwicklung von Automatisierung und künstlicher Intelligenz besteht die Aufgabe, effektiv zu sammeln,
Das Bereinigen und Transformieren von Daten wird von entscheidender Bedeutung. Die meisten Lösungen schließen nur
Dabei handelt es sich um separate Phasen dieses Prozesses, die eine komplexe Integration und Unterstützung erfordern.

SFAP (Seek · Filter · Adapt · Publish) ist ein Open-Source-Projekt in Python,
das einen ganzheitlichen und erweiterbaren Ansatz für die Verarbeitung von Daten in allen Phasen ihres Lebenszyklus bietet:
von der Quellensuche bis zur Veröffentlichung des fertigen Ergebnisses.

Was ist SFAP?

SFAP ist ein asynchrones Framework, das auf einem klaren Konzept einer Datenverarbeitungspipeline basiert.
Jede Stufe ist logisch getrennt und kann unabhängig erweitert oder ersetzt werden.

Das Projekt basiert auf dem Architekturmuster Chain of Responsibility, das Folgendes bietet:

  • Flexibilität der Pipeline-Konfiguration;
  • einfaches Testen einzelner Stufen;
  • Skalierbarkeit für hohe Lasten;
  • saubere Aufgabentrennung zwischen den Komponenten.

Hauptphasen der Pipeline

Seek – Datensuche

In dieser Phase werden Datenquellen entdeckt: Webseiten, APIs, Dateispeicher
oder andere Informationsflüsse. SFAP erleichtert die Anbindung neuer Quellen ohne Änderungen
der Rest des Systems.

Filter – Filtern

Die Filterung soll Rauschen entfernen: irrelevante Inhalte, Duplikate, technische Elemente
und Daten von geringer Qualität. Dies ist entscheidend für nachfolgende Verarbeitungsschritte.

Anpassen – Anpassung und Verarbeitung

Die Anpassungsphase ist für die Datentransformation verantwortlich: Normalisierung, Strukturierung,
semantische Verarbeitung und Integration mit KI-Modellen (einschließlich generativer).

Veröffentlichen – Veröffentlichung

Im letzten Schritt werden die Daten im Zielformat veröffentlicht: Datenbanken, APIs, Dateien, externe Dienste
oder Content-Plattformen. SFAP schränkt die Art und Weise, wie das Ergebnis geliefert wird, nicht ein.

Hauptmerkmale des Projekts

  • Asynchrone Architektur basierend auf asyncio
  • Modularität und Erweiterbarkeit
  • Unterstützung für komplexe Verarbeitungspipelines
  • Bereit für die Integration mit AI/LLM-Lösungen
  • Geeignet für hochbelastete Systeme

Praktische Anwendungsfälle

  • Aggregation und Analyse von Nachrichtenquellen
  • Datensätze für maschinelles Lernen vorbereiten
  • Automatisierte Content-Pipeline
  • Bereinigung und Normalisierung großer Datenströme
  • Integration von Daten aus heterogenen Quellen

Erste Schritte mit SFAP

Alles, was Sie brauchen, um loszulegen, ist:

  1. Klonen Sie das Projekt-Repository;
  2. Python-Abhängigkeiten installieren;
  3. Definieren Sie Ihre eigenen Pipeline-Schritte;
  4. Starten Sie einen asynchronen Datenverarbeitungsprozess.

Das Projekt lässt sich leicht an spezifische Geschäftsaufgaben anpassen und kann mit dem System wachsen,
ohne sich in einen Monolithen zu verwandeln.

Schlussfolgerung

SFAP ist nicht nur ein Parser oder Datensammler, sondern ein vollwertiges Framework zum Erstellen
moderne Daten-Pipeline-Systeme. Es eignet sich für Entwickler und Teams, die sich darum kümmern
skalierbar, architektonisch sauber und datenbereit.
Der Quellcode des Projekts ist auf GitHub verfügbar:
https://github.com/demensdeum/SFAP

FlutDataStream

Eine Flutter-App, die jede Datei in eine Folge maschinenlesbarer Codes (QR und DataMatrix) für Hochgeschwindigkeits-Datenstreaming zwischen Geräten umwandelt.

Besonderheiten
* Duale Kodierung: Stellt jeden Datenblock sowohl als QR-Code als auch als DataMatrix-Code dar.
*Hochgeschwindigkeits-Streaming: Unterstützt automatische Umschaltintervalle von bis zu 330 ms.
* Smart Chunking: Teilt Dateien automatisch in benutzerdefinierte Blöcke auf (Standard: 512 Byte).
* Detaillierter Scanner: Lesen Sie ASCII-Code in Echtzeit für Debugging und sofortiges Feedback.
* Automatische Wiederherstellung: Stellt Dateien sofort wieder her und speichert sie in Ihrem Download-Verzeichnis.
* Systemintegration: Öffnet die gespeicherte Datei nach Abschluss automatisch mit der Standardsystemanwendung.

https://github.com/demensdeum/FlutDataStream

Warum kann ich den Fehler nicht beheben?

Sie verbringen Stunden damit, am Code zu arbeiten, Hypothesen durchzugehen und die Bedingungen anzupassen, aber der Fehler wird trotzdem reproduziert. Kommt Ihnen das bekannt vor? Dieser Zustand der Frustration wird oft als „Geisterjagd“ bezeichnet. Das Programm scheint sein eigenes Leben zu führen und Ihre Korrekturen zu ignorieren.

Einer der häufigsten – und ärgerlichsten – Gründe für diese Situation ist die Suche nach einem Fehler an der völlig falschen Stelle in der Anwendung.

Die Falle der „falschen Symptome“

Wenn wir einen Fehler sehen, wird unsere Aufmerksamkeit auf die Stelle gelenkt, an der er „geschossen“ hat. Aber in komplexen Systemen ist das Auftreten eines Fehlers (Absturz oder falscher Wert) nur das Ende einer langen Kette von Ereignissen. Wenn Sie versuchen, das Ende zu beheben, bekämpfen Sie die Symptome, nicht die Krankheit.

Hier kommt das Flussdiagramm-Konzept ins Spiel.

Wie es in der Realität funktioniert

Natürlich ist es nicht notwendig, jedes Mal direkt ein Flussdiagramm auf Papier zu zeichnen, aber es ist wichtig, es im Kopf zu haben oder als architektonischen Leitfaden zur Hand zu haben. Mit einem Flussdiagramm können Sie den Betrieb einer Anwendung als Ergebnisbaum visualisieren.

Ohne diese Struktur zu verstehen, tappt der Entwickler oft im Dunkeln. Stellen Sie sich die Situation vor: Sie bearbeiten die Logik in einem Bedingungszweig, während die Anwendung (aufgrund eines bestimmten Parametersatzes) zu einem völlig anderen Zweig wechselt, an den Sie noch nicht einmal gedacht haben.


Ergebnis: Sie verbringen Stunden mit der „perfekten“ Codekorrektur in einem Teil des Algorithmus, was natürlich nicht dazu beiträgt, das Problem in einem anderen Teil des Algorithmus zu beheben, wo es tatsächlich fehlschlägt.


Algorithmus zur Beseitigung eines Fehlers

Um nicht mehr an einer verschlossenen Tür herumzurütteln, müssen Sie Ihre Herangehensweise an die Diagnose ändern:

  • Finden Sie den Status im Ergebnisbaum:Bevor Sie Code schreiben, müssen Sie den Pfad genau bestimmen, den die Anwendung genommen hat. An welchem ​​Punkt hat die Logik eine falsche Wendung genommen? Welcher konkrete Staat (Staat) hat zu dem Problem geführt?
  • Reproduktion ist 80 % des Erfolgs: Dies wird normalerweise durch Tester und automatisierte Tests durchgeführt. Wenn der Fehler „schwebt“, wird die Entwicklung in den Prozess einbezogen, um gemeinsam nach Bedingungen zu suchen.
  • Verwenden Sie so viele Informationen wie möglich: Protokolle, Betriebssystemversion, Geräteparameter, Verbindungstyp (WLAN/5G) und sogar ein bestimmter Telekommunikationsbetreiber sind für die Lokalisierung wichtig.

„Foto“ vom Moment des Fehlers

Um das Problem zu beheben, müssen Sie im Idealfall über den vollständigen Status der Anwendung zum Zeitpunkt der Reproduktion des Fehlers verfügen. Auch Interaktionsprotokolle sind von entscheidender Bedeutung: Sie zeigen nicht nur den Endpunkt, sondern auch den gesamten Benutzerpfad (welche Aktionen dem Fehler vorausgingen). Dies hilft zu verstehen, wie ein ähnlicher Zustand wieder hergestellt werden kann.

Zukunftstipp: Wenn Sie auf einen komplexen Fall stoßen, fügen Sie diesem Codeabschnitt erweiterte Debug-Protokollierungsinformationen hinzu, für den Fall, dass die Situation erneut auftritt.


Das Problem „schwer fassbarer“ Zustände im Zeitalter der KI

In modernen Systemen, die LLM (Large Language Models) verwenden, wird der klassische Determinismus („ein Eingang, ein Ausgang“) häufig verletzt. Sie können genau die gleichen Eingabedaten übergeben, erhalten aber ein anderes Ergebnis.

Dies geschieht aufgrund des Nichtdeterminismus moderner Produktionssysteme:

  • GPU-Parallelität: GPU-Gleitkommaoperationen sind nicht immer assoziativ. Aufgrund der parallelen Ausführung von Threads kann sich die Reihenfolge, in der Zahlen hinzugefügt werden, geringfügig ändern, was sich auf das Ergebnis auswirken kann.
  • GPU-Temperatur und -Drosselung: Ausführungsgeschwindigkeit und Lastverteilung können vom physischen Zustand der Hardware abhängen. In großen Modellen häufen sich diese mikroskopischen Unterschiede und können dazu führen, dass am Ausgang ein anderer Token ausgewählt wird.
  • Dynamisches Batching: In der Cloud wird Ihre Anfrage mit anderen kombiniert. Unterschiedliche Batch-Größen verändern die Mathematik der Berechnungen in den Kerneln.

Unter solchen Bedingungen wird es fast unmöglich, „denselben Zustand“ zu reproduzieren. Nur ein statistischer Testansatz kann Sie hier retten.


Wenn die Logik versagt: Speicherprobleme

Wenn Sie mit „unsicheren“ Sprachen (C oder C++) arbeiten, kann der Fehler aufgrund einer Speicherbeschädigung auftreten.

Dies sind die schwerwiegendsten Fälle: Ein Fehler in einem Modul kann Daten in einem anderen „überschreiben“. Dies führt zu völlig unerklärlichen und isolierten Fehlern, die mit der normalen Anwendungslogik nicht nachvollzogen werden können.

Wie schützt man sich auf architektonischer Ebene?

Um solche „mystischen“ Fehler zu vermeiden, sollten Sie moderne Ansätze verwenden:

  • Multithread-Programmiermuster:Eine klare Synchronisierung eliminiert Race Conditions.
  • Thread-sichere Sprachen: Tools, die Speichersicherheit zur Kompilierungszeit garantieren:
    • Rust: Das Eigentümersystem eliminiert Speicherfehler.
    • Swift 6-Parallelität:Starke Datenisolationsprüfungen.
    • Erlang: Vollständige Prozessisolation durch das Akteurmodell.

Zusammenfassung

Bei der Behebung eines Fehlers geht es nicht darum, neuen Code zu schreiben, sondern darum, zu verstehen, wie der alte funktioniert. Denken Sie daran: Sie könnten Zeit damit verschwenden, einen Zweig zu bearbeiten, den das Management nicht einmal berührt. Erfassen Sie den Zustand des Systems, berücksichtigen Sie den Faktor des KI-Nichtdeterminismus und wählen Sie sichere Tools aus.

Ferral

Ferral ist eine High-Level-Multiparadigmen-Programmiersprache, die speziell für die Codegenerierung aus großen Sprachmodellen (LLMs) entwickelt wurde. Während traditionelle Sprachen unter Berücksichtigung der menschlichen Ergonomie entwickelt wurden, ist Ferral darauf optimiert, wie große Sprachmodelle (LLMs) Logik begründen, tokenisieren und ableiten.

Der Name wird mit zwei R geschrieben, was auf einen „neu konzipierten“ Ansatz für die Unvorhersehbarkeit von KI-generiertem Code hinweist.

https://github.com/demensdeum/ferral

DemensDeum Coding Challenge #2

Ich starte die Demensdeum Coding Challenge Nr. 2:
1. Sie müssen die Webanwendung mit einem Vibecode versehen, um eine Liste der Partys/Veranstaltungen im Benutzerbereich anzuzeigen.
2. Die Datenquelle kann Web-Scraping von vorne oder eine lokale/Remote-Datenbank sein.
3. Zeigen Sie Veranstaltungen/Partys nur für heute auf der Karte an.
4. Sie können den Suchradius ändern.
5. Senden Sie sie als Folge von Textaufforderungen, die in kostenlosen Codegeneratoren wie Google AI Studio reproduziert werden können.
6. Sollte im Web für iOS, Android und PC funktionieren
7. Das beste Design gewinnt
8. Zeigen Sie detaillierte Informationen zur Veranstaltung an, indem Sie auf der Karte auf die Veranstaltung tippen.
9. Zoomen Sie Karten mit Ihren Fingern oder der Maus.
10. Der Gewinner wird von der Jury ausgewählt (schreiben Sie mir, um an der Jury teilzunehmen)
11. Preis 200 USDT
12. Fälligkeitsdatum: 1. Juli.

Gewinner der vergangenen DemensDeum Coding Challenge #1
https://demensdeum.com/blog/ru/2025/06/03/demensdeum-code-challenge-1-winner/

Masonry-AR-Update

Dem Masonry-AR-Spiel wurde die Möglichkeit hinzugefügt, Münzen gegen Kryptowährung zu kaufen! Für 1 $ können Sie 5000 MOS bekommen. Dem Spiel wurden auch Empfehlungslinks hinzugefügt. Für jeden Einkauf eines Freundes erhält der Empfehlungsgeber 50.000 MOS. Details im Freimaurer-Wiki. Außerdem wurde ein Selbstlaufmodus hinzugefügt: Wenn kein Zugriff auf das GPS-Modul besteht, beginnt der Mason automatisch von einer der Hauptstädte der Welt aus zu laufen, nur vorwärts.

Spiellink:
https://demensdeum.com/demos/masonry-ar/client/

Esel-Experte

„Donkey Adept“ ist ein atemberaubendes, elektrisierendes Stück pixeliger Surrealismus. In der Mitte steht eine Figur in einer schwarzen Lederjacke, deren Kopf ein flammender, statisch aufgeladener Fernseher mit feurigen Eselsohren ist. Das Subjekt hält eine mächtige Laterne in der Hand und fungiert als einsamer Wächter, der inmitten des Lärms nach der Wahrheit sucht. Es ist eine wütende Meditation im Retro-Stil über Medien, Wahnsinn und die unerbittliche Suche nach Licht.

https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/5

Cube Art Project 2 Online

Treffen Sie das Cube Art Project 2 Online – Light, Fast und Ganzgeschriebene Redakteur des Stationsplans, der direkt im Browser funktioniert. Jetzt mit der Möglichkeit der gemeinsamen Kreativität!

Dies ist nicht nur ein Werkzeug, sondern ein Experiment mit Farbe, Geometrie und einer meditativen 3D -Kreation, mit der Sie Freunde verbinden können. Das Projekt wurde auf reinem JavaScript und drei.js ohne Frameworks und WebAssembly erstellt, wodurch die Funktionen von WebGL und Shaaders demonstriert wurden.

Neu: Mehrspielermodus! Kooperieren Sie in Echtzeit mit anderen Benutzern. Alle Änderungen, die Zugabe und Färbung von Würfeln werden sofort synchronisiert, sodass Sie gemeinsam Station -Meisterwerke erstellen können.

Kontrolle:
– WASD – Verschieben der Kamera
– Maus – Rotation
– GUI – Farbeinstellungen

Online:
https://demensdeum.com/software/cube-art-project-2-online/

Quellen auf Github:
https://github.com/demensdeum/cube-art-project-2-online

Das Projekt ist mit drei.js auf reinem JavaScript geschrieben.
Ohne Frameworks, ohne Sammler, ohne WebAssembly – nur WebGL, Shader und ein wenig Liebe zur Pixelgeometrie.

Donki Hills Dampf

Donki Hills ist ein Comedy -Horrorspiel, eine aufregende Erzählungserfahrung in der ersten Person, die Spieler in ein tiefes Geheimnis mit einer Beimischung unerwarteter Humor eintaucht. Das von Demensdeum in der Unreal Engine Engine entwickelte und veröffentlichte und veröffentlichte Spiel ermöglicht es Ihnen, James, eine gewöhnliche Person, deren Leben nach dem mysteriösen Verschwinden seiner Online -Bekannten Maria eine ungewöhnliche Wendung nimmt. Sein einziger Hinweis ist ein einziges Foto, das auf ein abgelegenes russisches Dorf namens Quiet Donki in der Nähe von Novosibirsk hinweist. Mit einer unerschütterlichen Verbindung und einem verzweifelten Bedarf an Antworten (und möglicherweise mit mehreren nervösen Lachen) fährt James auf eine epische Reise, um die Wahrheit über das Verschwinden von Maria zu enthüllen.

Das Spiel ist auf Steam erhältlich:
https://store.steampowered.com/app/3476390/Donki_Hills/

Entropie in der Programmierung

[Ergänzungen]

Entropie in der Programmierung ist eine leistungsstarke, aber oft unauffällige Kraft, die die Variabilität und Unvorhersehbarkeit des Softwareverhaltens bestimmt. Von einfachen Fehlern bis hin zu komplexen Großfliegen ist Entropie der Grund, warum sich unsere Programme nicht immer so verhalten, wie wir es erwarten.

Was ist Entropie in der Software?

Entropie in der Software ist ein Maß für unerwartete Ergebnisse von Algorithmen. Der Benutzer nimmt die ersten Ergebnisse als Fehler oder Fehler wahr, aber aus der Sicht der Maschine führt der Algorithmus genau die Anweisungen aus, die der Programmierer darin festgelegt hat. Unerwartetes Verhalten entsteht aufgrund einer großen Anzahl möglicher Kombinationen von Eingabedaten, Systembedingungen und Interaktionen.

Ursachen der Entropie:

* Ändern des Zustands: Wenn das Objekt seine internen Daten ändern kann, hängt das Ergebnis seiner Arbeit von der gesamten Geschichte seiner Verwendung ab.

* Die Komplexität der Algorithmen: Wenn das Programm wächst, wird die Anzahl der möglichen Möglichkeiten zur Ausführung des Codes exponentiell wächst, was die Vorhersage aller Ergebnisse fast unmöglich macht.

* Externe Faktoren: Betriebssystem, andere Programme, Netzwerkverzögerungen – All dies kann die Ausführung Ihres Codes beeinflussen und zusätzliche Variabilitätsquellen erstellen.

Ursachen der Entropie:

* Ändern des Zustands: Wenn das Objekt seine internen Daten ändern kann, hängt das Ergebnis seiner Arbeit von der gesamten Geschichte seiner Verwendung ab.

* Die Komplexität der Algorithmen: Wenn das Programm wächst, wird die Anzahl der möglichen Möglichkeiten zur Ausführung des Codes exponentiell wächst, was die Vorhersage aller Ergebnisse fast unmöglich macht.

* Externe Faktoren: Betriebssystem, andere Programme, Netzwerkverzögerungen – All dies kann die Ausführung Ihres Codes beeinflussen und zusätzliche Variabilitätsquellen erstellen.

Globale Variablen als Entropiequelle

In seiner Arbeit “Globale Variable Bysble konstruiert schädlich” (1973) W. A. Wulf und M. Shaw zeigten, dass globale Variablen eine der Hauptquellen für unvorhersehbares Verhalten sind. Sie erzeugen implizite Abhängigkeiten und Nebenwirkungen, die schwer zu verfolgen und zu kontrollieren sind, was eine klassische Manifestation der Entropie darstellt.

Gesetze von Leman und Entropie

Die Idee, die Komplexität von Softwaresystemen zu wachsen, formulierte Manny Leman in seinen Softwareentwicklungsgesetzen perfekt. Zwei von ihnen spiegeln direkt das Konzept der Entropie wider:

Das verwendete Computerprogramm wird geändert. Diese Erklärung legt nahe, dass die Software nicht statisch ist. Es lebt, entwickelt und ändert sich, um neue Anforderungen und Umwelt zu erfüllen. Jede neue “Runde” der Lebensdauer des Programms ist eine potenzielle Entropiequelle.

Wenn das Computerprogramm geändert wird, nimmt seine Komplexität zu, sofern niemand dies verhindert. Dieses Gesetz ist eine direkte Folge der Entropie. Ohne gezielte Komplexitätsmanagementbemühungen führt jede neue Änderung zusätzliche Variabilität und Unvorhersehbarkeit in das System ein. Es gibt neue Abhängigkeiten, Bedingungen und Nebenwirkungen, die die Wahrscheinlichkeit von Fehlern und unerwünschtem Verhalten erhöhen.

Entropie in der Welt von AI und LLM: unvorhersehbarer Code

Auf dem Gebiet der künstlichen Intelligenz und der großartigen Sprachmodelle (LLM) ist Entropie besonders akut, da wir hier mit nicht -metnamischen Algorithmen zu tun haben. Im Gegensatz zu herkömmlichen Programmen, bei denen der gleiche Zugang immer den gleichen Weg gibt, kann LLM verschiedene Antworten auf dieselbe Anfrage geben.

Dies schafft ein großes Problem: Die Richtigkeit des Algorithmus kann nur an einem bestimmten, begrenzten Satz von Eingabedaten mit Autoren bestätigt werden. Bei der Arbeit mit unbekannten Eingabedaten (Anfragen von Benutzern) wird das Verhalten des Modells jedoch unvorhersehbar.

Beispiele für Entropie in LLM

Innordative Vokabeln und rassistische Aussagen: Bekannte Fälle, in denen Chat -Bots wie Tay von Microsoft oder Grok von XII nach dem Training über Daten aus dem Internet anfingen, anstößige oder rassistische Aussagen zu generieren. Dies war das Ergebnis der Entropie: Unbekannte Eingabedaten in Kombination mit einem großen Volumen der Trainingsprobe führten zu unvorhersehbarem und falschem Verhalten.

Illegale Berufungen: Solche Probleme treten auf, wenn ein neuronales Netzwerk beginnt, Inhalte auszugeben, die gegen Urheberrechte oder ethische Normen verstoßen.

Ai Bota in Spielen: Die Einführung von KI -Charakteren in Spielen mit der Möglichkeit des Lernens beispielsweise in Fortnite führte dazu, dass AI Bot ausgeschaltet und zur Verfolgung der Richtigkeit der Aktivität hinzugefügt werden musste, um illegale Aktionen aus dem LLM -Bot zu verhindern.

technische Schulden: Angesammelte Zinsen für Mängel

Schlecht geschriebener Code und Bypass -Lösungen
Die technische Pflicht ist ein bewusster oder unbewusster Kompromiss, bei dem die rasche Lieferung der Langzeitunterstützung und -qualität eine schnelle Lieferung erfolgt. Schnelle Korrekturen und undokumentierte Bypass -Lösungen, die häufig in kurzer Zeit implementiert sind, sammeln sich an und bilden ein “Minenfeld”. Dies macht die Codebasis auch für geringfügige Änderungen äußerst empfindlich, da es schwierig wird, absichtliche Bypass -Lösungen von der tatsächlichen fehlerhaften Logik zu unterscheiden, was zu einer unerwarteten Regression und einer Zunahme der Anzahl der Fehler führt.

Dies zeigt den direkten kumulativen Effekt der technischen Pflicht auf die Ausbreitung von Fehlern und die Integrität von Algorithmen, bei denen jede angewendete aktuelle Reduktion zu komplexeren und häufigeren Fehlern in der Zukunft führt.

unzureichende Tests und sein kumulativer Effekt

Wenn die Softwaresysteme nicht sorgfältig getestet werden, sind sie viel anfälliger für Fehler und unerwartetes Verhalten. Diese Unzulänglichkeit ermöglicht es, Fehler im Laufe der Zeit zu sammeln und ein System zu erstellen, das schwer zu unterstützen ist und für weitere Fehler sehr anfällig ist. Die Vernachlässigung von Tests von Anfang an erhöht nicht nur die technische Verschuldung, sondern hilft auch direkt, die Anzahl der Fehler zu erhöhen. Die „Theorie von zerbrochenen Fenstern“ in der Softwareentropie legt nahe, dass unbedeutende, ignorierte Fehler oder Designprobleme im Laufe der Zeit akkumuliert und zu ernsthafteren Problemen führen und die Softwarequalität verringern können.

Dies stellt eine direkte kausale Beziehung her: Der Mangel an Tests führt zu einer Ansammlung von Fehlern, was zu einer Erhöhung der Entropie führt, was zu komplexeren und häufigeren Fehlern führt, was die Richtigkeit und Zuverlässigkeit von Algorithmen direkt beeinflusst.

Mangel an Dokumentation und Informationssilos

Bei der Entwicklung von Software wird häufig eine ordnungsgemäße Dokumentation ignoriert, was zu Fragmentierung oder Wissensverlust darüber führt, wie das System funktioniert und wie sie unterstützt werden. Dies zwingt die Entwickler, das System zur Änderung von Veränderungen zu „unterstützen“ und die Wahrscheinlichkeit von Missverständnissen und falschen Änderungen erheblich zu erhöhen, was direkt zu Fehlern führt. Es erschwert auch die Anpassung neuer Entwickler ernsthaft, da kritische Informationen nicht verfügbar oder irreführend sind.

Programmentropie tritt aufgrund von “mangelnden Wissen” und “Diskrepanzen zwischen allgemeinen Annahmen und dem tatsächlichen Verhalten des vorhandenen Systems” auf. Dies ist eine tiefere organisatorische Beobachtung: Entropie manifestiert sich nicht nur auf Codeebene, sondern auch auf der Ebene des Wissens. Diese informellen, impliziten Kenntnisse sind fragil und sind leicht verloren (z. B. wenn sie die Teammitglieder verlassen), was bei der Versuch, zu ändern, insbesondere neue Mitglieder des Teams, direkt zu Fehlern führt, wodurch die Integrität der algorithmischen Logik gefährdet wird, da die Hauptannten aufgehalten werden, klar zu werden.

Inkonsistente Entwicklungsmethoden und Eigentümerverlust

Der menschliche Faktor ist ein signifikanter, oft unterschätzter und treibender Faktor in der Softwareentropie. Verschiedene Fähigkeiten, Kodierung und Qualitätserwartungen unter Entwicklern führen zu Inkonsistenzen und Abweichungen im Quellcode. Das Fehlen standardisierter Prozesse für Linting, Codeüberprüfungen, Testen und Dokumentation verschärft dieses Problem. Darüber hinaus führt ein unklarer oder instabiler Code des Codes, wenn mehrere Befehle Teil des Codes besitzen oder niemanden besitzt, zu Vernachlässigung und Erhöhung des Zerfalls, was zu einer Duplikation von Komponenten führt, die dieselbe Funktion auf unterschiedliche Weise ausführen und Fehler verbreiteten.

Dies zeigt, dass Entropie nicht nur ein technisches Problem ist, sondern auch ein soziotechnisches, tief in der organisatorischen Dynamik und des menschlichen Verhaltens verwurzelten. “Kollektive Inkonsistenz”, die aufgrund inkonsistenter Praktiken und fragmentierter Besitz direkt entstehen, führt direkt zu Inkonsistenzen und Defekten, wodurch das System unvorhersehbar und schwer zu kontrollieren ist, was die Integrität der Algorithmen stark beeinflusst.

kaskadierende Fehlfunktionen in miteinander verbundenen Systemen

Moderne Softwaresysteme sind oft komplex und sehr miteinander verbunden. In solchen Systemen erhöht ein hohes Maß an Komplexität und eng verwandte Komponenten die Wahrscheinlichkeit von Kaskadierungsfehlern, wenn die Ablehnung einer Komponente eine Kettenreaktion von Fehlern bei anderen verursacht. Dieses Phänomen verschärft den Einfluss von Fehlern und unsachgemäßer Verhalten von Algorithmen und verwandelt lokalisierte Probleme in systemische Risiken. Die Ergebnisse der Algorithmen in solchen Systemen werden sehr anfällig für Fehler, die weit entfernt von ihrem direkten Ausführungspfad entstehen, was zu weit verbreiteten falschen Ergebnissen führt.

Die architektonische Komplexität, direkte Manifestation der Entropie, kann isolierte algorithmische Fehler in große Systemausfälle verwandeln, wodurch das allgemeine System unzuverlässig ist, und seine Ausgangsdaten sind unzuverlässig. Dies betont die Notwendigkeit der architektonischen Stabilität, um die Ausbreitung von Entropieeffekten einzudämmen.

Eines der jüngsten Beispiele ist das bekannte Stopp der Flughäfen in Amerika und Europa, da der Blue Death Screen nach der Aktualisierung der Antiviren -Software im Jahr 2024 das fehlerhafte Ergebnis des Antivirus -Algorithmus und des Betriebssystems zum Flugverkehr der Welt führte.

Praktische Beispiele

Beispiel 1: Entropie in Unicode und Byte -Restriktion

Schauen wir uns ein einfaches Beispiel mit einem Textfeld an, das durch 32 Bytes begrenzt ist.

Szenario mit ASCII (niedrige Entropie)

Wenn das Feld nur ASCII -Symbole akzeptiert, nimmt jedes Symbol 1 Bytes. So werden genau 32 Zeichen im Feld platziert. Jedes andere Symbol wird einfach nicht akzeptiert.

@Startuml
Titelbeispiel mit ASCII (niedrige Entropie)
Schauspielerbenutzer
Teilnehmer “Textfeld”

Benutzer -> TextField: führt 32 Symbole ASCII ein
Textfeld -> Textfeld: Überprüft die Länge (32 Bytes)
Beachten Sie rechts
Alles ist in Ordnung.
Endnote
TextField -> Benutzer: ACCEPS -Eingaben
@enduml

Szenario mit UTF-8 (hohe Entropie):

Jetzt fällt unser Programm ihrer 80er Jahre 2025. Wenn das Feld UTF-8 nimmt, kann jedes Symbol von 1 bis 4 Bytes einnehmen. Wenn der Benutzer eine Zeile von mehr als 32 Bytes einführt, kann das System sie falsch abschneiden. Zum Beispiel nimmt Emoji 4 Bytes ein. Wenn das Beschneiden im Symbol auftritt, erhalten wir ein „zerbrochenes“ Symbol.

@Startuml
Titelbeispiel mit UTF-8 (hohe Entropie)
Schauspielerbenutzer
Teilnehmer “Textfeld”

Benutzer -> TextField: Fführt “Hi” vor (37 Byte)
Textfield -> Textfeld: Schnitt die Linie bis zu 32 Bytes ab
Beachten Sie rechts
Plötzlich! Symbol
Durch Bytes geschnitten.
Endnote
TextField -> Benutzer: Zeigt “Hallo” an
Beachten Sie links
Falsches Symbol.
Endnote
@enduml

Hier zeigt sich die Entropie darin, dass der gleiche Schnittbetrieb für verschiedene Eingabedaten zu unvorhersehbaren und falschen Ergebnissen führt.

Beispiel 2: Entropie in CSS und Inkompatibilität von Browsern

Selbst in scheinbar stabilen Technologien wie CSS kann Entropie aufgrund unterschiedlicher Interpretationen von Standards auftreten.

Stellen Sie sich vor, der Entwickler hat den gewählten Benutzer angewendet: keine; An alle Elemente, um die Textausgabe auszuschalten.

Browser 10 (alte Logik)

Browser 10 macht eine Ausnahme für Eingabefelder. Trotz des Flaggen kann der Benutzer Daten eingeben.

@Startuml
Titelbrowser 10
Schauspielerbenutzer
Teilnehmer “Browser 10” als Browser10

Benutzer -> Browser10: Eingabe in Eingaben
Browser10 -> Browser10: Überprüft CSS
Beachten Sie rechts
-User-Elektrik: Keine;
Für die Eingabe ignoriert
Endnote
Browser10 -> Benutzer: Ermöglicht das Eingeben
@enduml

Browser 11 (neue Logik)

Die Entwickler des neuen Browsers beschlossen, die Spezifikationen strikt zu befolgen und die Regel ausnahmslos auf alle Elemente anzuwenden.

@Startuml
Titelbrowser 11
Schauspielerbenutzer
Teilnehmer “Browser 11” als Browser11

Benutzer -> Browser11: Eingabeeingabe
Browser11 -> Browser11: Überprüft CSS
Beachten Sie rechts
-User-Elektrik: Keine;
Auf alle Elemente angewendet, einschließlich Eingabe
Endnote
Browser11 -> Benutzer: weigert sich zu betreten
Beachten Sie links
Der Benutzer kann nichts tun
Typ.
Endnote
@enduml

Dieses klassische Beispiel für Entropie – dieselbe Regel führt je nach “System” (Version des Browsers) zu unterschiedlichen Ergebnissen.

Beispiel 3: Entropie aufgrund eines mehrdeutigen TK

Eine mehrdeutige technische Aufgabe (TK) ist eine weitere leistungsstarke Entropiequelle. Wenn zwei Entwickler, Bob und Alice, die gleiche Anforderung auf unterschiedliche Weise verstehen, führt dies zu inkompatiblen Implementierungen.

TK: “Um einen Generator mit Fibonacci -Zahlen zu implementieren. Für die Optimierung muss eine Liste generierter Zahlen im Generator gespeist werden.”

Bobs mentales Modell (OOP mit einer variablen Erkrankung)
Bob konzentrierte sich auf den Ausdruck “Liste … muss gespannt werden”. Er implementierte eine Klasse, die denselben Zustand (Selbst.Sequenz) speichert und sie mit jedem Anruf erhöht.

    def __init__(self):
        self.sequence = [0, 1]

    def generate(self, n):
        if n <= len(self.sequence):
            return self.sequence

        while len(self.sequence) < n:
            next_num = self.sequence[-1] + self.sequence[-2]
            self.sequence.append(next_num)

        return self.sequence

Alices mentales Modell (funktionaler Ansatz)

Alice konzentrierte sich auf den Ausdruck "Gibt die Sequenz zurück". Sie schrieb eine reine Funktion, die jedes Mal eine neue Liste zurückgibt, wobei Cache nur als interne Optimierung verwendet wurde.

    sequence = [0, 1]
    if n <= 2:
        return sequence[:n]

    while len(sequence) < n:
        next_num = sequence[-1] + sequence[-2]
        sequence.append(next_num)

    return sequence

Wenn Alice beginnt, den Bob -Generator zu verwenden, erwartet sie, dass generiert wird (5) immer 5 Zahlen zurückgibt. Wenn jedoch vor diesem Bob generate (8) bei demselben Objekt generiert wurde, erhält Alice 8 Nummern.

Fazit: Entropie hier ist eine Folge von mentalen mentalen Modellen. Der veränderbare Zustand bei der Implementierung von Bob macht das System für Alice unvorhersehbar, was auf das Verhalten der reinen Funktion wartet.

Entropie und Multi -Setess: Der Zustand des Rennens und des Großvaters

Bei der Multi -Flowing -Programmierung zeigt sich insbesondere Entropie. Mehrere Ströme werden gleichzeitig durchgeführt, und das Verfahren für ihre Implementierung ist unvorhersehbar. Dies kann zu der Rennbedingung führen, wenn das Ergebnis davon abhängt, welcher Stream der erste ist, der auf die gemeinsame Ressource zugreift. Der Extremfall ist Großvater, wenn zwei oder mehr Streams aufeinander warten und das Programm einfriert.

Beispiel für die Lösung von Dedlok:

Das Problem von Dedlok tritt auf, wenn sich zwei oder mehr Stream blockieren und auf die Veröffentlichung der Ressource warten. Die Lösung besteht darin, ein einzelnes, festes Verfahren für die Beschlagnahme von Ressourcen festzulegen, beispielsweise durch Erhöhen der ID zu blockieren. Dies schließt eine zyklische Erwartung aus, die die Sackgasse verhindert.

@Startuml
Titellösung: Unified Blocking Procedur
Teilnehmer "Stream 1" als Thread1
Teilnehmer "Stream 2" als Thread2
Teilnehmer "als" als Accounta
Teilnehmer "Konto B" als Kontob

Thread1 -> Accounta: Blocks Konto a
Hinweis über Thread1
Die Regel folgt:
Block -ID
Endnote
Thread2 -> Accounta: Warten auf das Konto A wird befreit
Hinweis über Thread2
Die Regel folgt:
Warten auf das Sperren a
Endnote
Thread1 -> Konto: Blocks Konto B
Thread1 -> Accounta: Frees Account a
Thread1 -> AccountB: Releases Score B B
Hinweis über Thread1
Die Transaktion ist abgeschlossen
Endnote
Thread2 -> Accounta: Blockiert das Konto a
Thread2 -> Konto: Blocks Konto B
Hinweis über Thread2
Die Transaktion endet
Endnote
@enduml

Dieser Ansatz - geordnete Blockierung (Schlossbestellung) - ist eine grundlegende Strategie zur Verhinderung von Deadllen in paralleler Programmierung.

Great, lassen Sie uns analysieren, wie der veränderliche Zustand im OOP -Ansatz die Entropie erhöht, indem wir das Beispiel für Leinwand anhand von Leinwand stützen, und dies mit einer reinen Funktion vergleichen.

Problem: Veränderter Zustand und Entropie

Wenn das Objekt einen veränderten Zustand hat, wird sein Verhalten unvorhersehbar. Das Ergebnis der Aufrufen der gleichen Methode hängt nicht nur von seinen Argumenten ab, sondern auch von der gesamten Geschichte der Interaktion mit diesem Objekt. Dies bringt Entropie in das System.

Betrachten Sie die beiden Ansätze zum Rechteck, das auf Leinwand zeichnet: einen im OOP-Stil mit einer variablen Erkrankung, die andere in einer Funktion, mit einer reinen Funktion.

1. OOP -Ansatz: Klasse mit einem variablen Zustand
Hier erstellen wir eine Cursorklasse, die in diesem Fall ihren inneren Zustand speichert. Die Zeichnungsmethode zeichnet ein Rechteck mit diesem Zustand.

  constructor(initialColor) {
    // Внутреннее состояние объекта, которое может меняться
    this.color = initialColor;
  }

  // Метод для изменения состояния
  setColor(newColor) {
    this.color = newColor;
  }

  // Метод с побочным эффектом: он использует внутреннее состояние
  draw(ctx, rect) {
    ctx.fillStyle = this.color;
    ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
  }
}

// Использование
const myCursor = new Cursor('red');
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

myCursor.draw(ctx, rectA); // Используется начальный цвет: red
myCursor.setColor('blue'); // Изменяем состояние курсора
myCursor.draw(ctx, rectB); // Используется новое состояние: blue

UML -Diagramm des OOP -Ansatzes:

Dieses Diagramm zeigt deutlich, dass der Ruf der Zeichnung unterschiedliche Ergebnisse liefert, obwohl sich ihre Argumente möglicherweise nicht ändern. Dies ist auf einen separaten SetColor -Aufruf zurückzuführen, der den internen Zustand des Objekts geändert hat. Dies ist eine klassische Manifestation der Entropie in einem veränderlichen Zustand.

title ООП-подход
actor "Программист" as Programmer
participant "Класс Cursor" as Cursor
participant "Canvas" as Canvas

Programmer -> Cursor: Создает new Cursor('red')
note left
  - Инициализирует состояние
    с цветом 'red'.
end note
Programmer -> Cursor: draw(ctx, rectA)
note right
  - Метод draw использует
    внутреннее состояние
    объекта (цвет).
end note
Cursor -> Canvas: Рисует 'red' прямоугольник
Programmer -> Cursor: setColor('blue')
note left
  - Изменяет внутреннее состояние!
  - Это побочный эффект.
end note
Programmer -> Cursor: draw(ctx, rectB)
note right
  - Тот же метод draw,
    но с другим результатом
    из-за измененного состояния.
end note
Cursor -> Canvas: Рисует 'blue' прямоугольник
@enduml

2. Funktioneller Ansatz: Reine Funktion

Hier verwenden wir eine reine Funktion. Seine Aufgabe ist es, einfach ein Rechteck mit allen erforderlichen Daten zu zeichnen, die darauf übertragen werden. Sie hat keinen Zustand und ihre Herausforderung wird nichts außerhalb ihrer Grenzen betreffen.

  // Функция принимает все необходимые данные как аргументы
  ctx.fillStyle = color;
  ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}

// Использование
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

drawRectangle(ctx, rectA, 'red'); // Рисуем первый прямоугольник
drawRectangle(ctx, rectB, 'blue'); // Рисуем второй прямоугольник

UML -Diagramm eines funktionalen Ansatzes:

Dieses Diagramm zeigt, dass die DrawRectangle -Funktion immer die äußere Farbe erhält. Ihr Verhalten hängt vollständig von den Eingabeparametern ab, was es sauber und mit einem geringen Entropiegrad macht.

@Startuml
Titelfunktionalansatz
Schauspieler "Programmierer" als Programmierer
Teilnehmer "Funktion \ n DrawRectangle" als Drawfunc
Teilnehmer "Leinwand" als Leinwand

Programmierer -> Drawfunc: Drawerctangle (CTX, Rekta, 'Rot')
Beachten Sie rechts
- Rufen Sie mit Argumenten an:
- CTX
- Rekta (Koordinaten)
- 'rot' (Farbe)
- Die Funktion hat keine Bedingung.
Endnote

Drawfunc -> Leinwand: Überschwemmungen mit der Farbe 'rot'
Programmierer -> Drawfunc: Drawerctangle (CTX, RECTB, 'Blue')
Beachten Sie rechts
- Rufen Sie mit neuen Argumenten an:
- CTX
- RECTB (Koordinaten)
- 'Blau' (Farbe)
Endnote
Drawfunc -> Leinwand: Überschwemmungen mit der Farbe 'Blau'
@enduml

In einem Beispiel mit einer reinen Funktion ist das Verhalten vollständig vorhersehbar, da die Funktion keine Bedingung hat. Alle Informationen für die Arbeit werden durch Argumente übertragen, was es isoliert und sicher macht. In einem OOP -Ansatz mit einem variablen Zustand für das Verhalten der Zeichnungsmethode kann die gesamte Geschichte der Interaktion mit dem Objekt beeinflussen, was Entropie einführt und den Code weniger zuverlässig macht.

Modulares Design und Architektur: Isolierung, Testbarkeit und Re -use

Die Aufteilung komplexer Systeme in kleinere, unabhängige, selbstfürchtige Module vereinfacht das Design, die Entwicklung, das Testen und die Wartung. Jedes Modul verarbeitet bestimmte Funktionen und interagiert durch klar definierte Schnittstellen, reduziert die gegenseitige Abhängigkeit und trägt zur Trennung der Verantwortung bei. Dieser Ansatz verbessert die Lesbarkeit, vereinfacht die Wartung, erleichtert die parallele Entwicklung und vereinfacht das Testen und Debuggen durch Isolieren von Problemen. Es ist wichtig, dass dies den "Radius der Niederlage" von Fehlern verringert, Defekte in getrennten Modulen hält und Kaskadierungsfehler verhindert. Microservice -Architektur ist eine leistungsstarke Verwirklichung der Modalität.

Modularität ist nicht nur eine Möglichkeit, Code zu organisieren, sondern auch ein grundlegender Ansatz, um Mängel zu enthalten und die Stabilität zu erhöhen. Die Modalität begrenzt die Auswirkung des Fehlers in einem Modul und erhöht die Gesamtstabilität des Systems auf Entropieabfall und garantiert, dass ein Ablehnungspunkt nicht die Richtigkeit der gesamten Anwendung beeinträchtigt. Dies ermöglicht es den Teams, sich auf kleinere, kontrollierte Teile des Systems zu konzentrieren, was zu gründlicheren Tests und einer schnelleren Erkennung und Korrektur von Fehlern führt.

Praktiken des reinen Code: Kuss, Drys und solide Prinzipien für die Zuverlässigkeit

Kuss (halte es einfach, dumm):
Diese Designphilosophie steht für Einfachheit und Klarheit und vermeidet aktiv unnötige Komplexität. Ein einfacher Code ist von Natur aus einfacher zu lesen, zu verstehen und zu ändern, was direkt zu einer Abnahme der Tendenz zu Fehlern und der Verbesserung der Unterstützung führt. Die Komplexität ist klar als Nährstoffumgebung für Fehler definiert.

Kuss ist nicht nur eine ästhetische Präferenz, sondern auch eine absichtliche Auswahl des Designs, die die Oberfläche des Angriffs auf Fehler verringert und den Code widerstandsfähiger gegen zukünftige Änderungen macht, wodurch die Richtigkeit und Vorhersehbarkeit von Algorithmen aufrechterhalten wird. Dies ist eine proaktive Maßnahme gegen Entropie auf einer detaillierten Codeebene.

Trocken (Donat wiederholt sich):
Das Trockenprinzip zielt darauf ab, die Wiederholung von Informationen und die Duplikation von Code zu verringern, ihn durch Abstraktionen oder die Verwendung von Datennormalisierung zu ersetzen. Seine Hauptposition ist, dass "jedes Wissensfragment eine einzelne, eindeutige, maßgebliche Darstellung im System haben sollte". Dieser Ansatz beseitigt Redundanz, was wiederum die Inkonsistenzen reduziert und die Ausbreitung von Fehlern oder deren inkonsistente Korrektur in mehreren Kopien einer doppelten Logik verhindert. Es vereinfacht auch die Unterstützung und Debuggierung der Codebasis.

Die Duplikation von Code führt zu inkonsistenten Änderungen, die wiederum zu Fehlern führen. Trocken verhindert dies und liefert eine einzelne Wahrheitsquelle für Logik und Daten, die direkt zur Richtigkeit von Algorithmen beiträgt, und garantiert, dass sich die allgemeine Logik im gesamten System einheitlich und vorhersehbar verhält und dünn und schwer zu fehlern zu gehen.

Solid Prinzipien

Dieses mnemonische Akronym präsentiert fünf grundlegende Designprinzipien (einheitliche Verantwortung, Offenheit/Nähe, Substitution von Liskin, Trennung von Schnittstellen, Inversionen von Abhängigkeiten), die für die Erstellung von Projekten, die klar, flexibel und unterstützend sind, entscheidend für die Erstellung von Objektorientierungen sind. Das Einhalten an soliden Softwareentitäten wird einfacher zu unterstützen und anzupassen, was zu einer geringeren Anzahl von Fehlern und schnelleren Entwicklungszyklen führt. Sie erreichen dies durch Vereinfachung des Dienstes (SRP), sicherstellen, dass die skalierbaren Hinzufügenfunktionen ohne Modifikation (OCP) sicherstellen, die Verhaltenskonsistenz (LSP) sicherstellen, die Kohärenz (ISP) minimieren und die Flexibilität aufgrund der Abstraktion (DIP) erhöhen.

Solide Prinzipien bieten einen ganzheitlichen Ansatz für die strukturelle Integrität, was das System im Wesentlichen gegen Stunt -Effekte von Veränderungen resistenter macht. Wenn sie Modularität, Trennung und klare Verantwortlichkeiten fördern, verhindern sie Kaskadierfehler und behalten die Richtigkeit von Algorithmen, auch wenn das System kontinuierlich Evolution ist, und wirkt als grundlegende Maßnahmen zur Bekämpfung der Entropie.

Entropie und domänengesteuerte Design (DDD)

Das Domain-gesteuerte Design (DDD) ist nicht nur eine Philosophie, sondern eine vollwertige Methodik, die spezifische Muster für das Aufbrechen der Anwendung in Domänen bietet, mit der Sie die Komplexität effektiv steuern und die Entropie bekämpfen können. DDD hilft dabei, ein chaotisches System in eine Reihe vorhersehbarer, isolierter Komponenten zu verwandeln.

Muster der Bande von vier Designs als einzelne Konzeptapparat

Das Buch "Designmuster: Elemente wiederverwendbarer objektorientierter Software" (1994), geschrieben von einer "Bande von vier" (GOF), bot eine Reihe bewährter Lösungen für typische Probleme. Diese Muster sind hervorragende Werkzeuge zur Bekämpfung der Entropie, da sie strukturierte, vorhersehbare und kontrollierte Systeme erzeugen.

Eines der Schlüsseleffekte von Mustern ist die Erstellung eines einzelnen konzeptionellen Apparats. Wenn der Entwickler in einem Team über die "Fabrik" oder "Einzelgänger" spricht, verstehen seine Kollegen sofort, über welche Art von Code wir sprechen. Dies reduziert die Entropie in der Kommunikation erheblich, weil:

Die Mehrdeutigkeit nimmt ab: Die Muster haben klare Namen und Beschreibungen, die unterschiedliche Interpretationen ausschließen, wie im Beispiel mit Bob und Alice.

Beschleunigt sich ein: Die neuen Teammitglieder werden schneller in das Projekt eingegossen, da sie die Logik, die hinter komplexen Strukturen steht, nicht erraten müssen.

Refactoring wird erleichtert: Wenn Sie den Teil des Systems nach dem Muster ändern müssen, weiß der Entwickler bereits, wie es angeordnet ist und welche Teile sicher geändert werden können.

Beispiele für GOF -Muster und deren Einfluss auf die Entropie:

Muster "Strategie": Ermöglicht Ihnen, verschiedene Algorithmen in einzelnen Klassen zu verkapulieren und sie austauschbar zu machen. Dies reduziert die Entropie, da Sie das Verhalten des Systems ändern können, ohne seinen Hauptcode zu ändern.

Muster "Befehl" (Befehl): Inkapseln Die Methode der Methode zum Objekt. Auf diese Weise können Sie die Ausführung verschieben, die Befehle in die Warteschlange einfügen oder abbrechen. Das Muster reduziert die Entropie, da es den Absender des Teams von seinem Empfänger trennt und sie unabhängig macht.

Beobachtermuster (Beobachter): Bestimmt die Abhängigkeit des "Eins-zu-Many", bei dem eine Änderung des Zustands eines Objekts automatisch alle davon abhängig ist. Dies hilft, Nebenwirkungen zu kontrollieren und sie offensichtlich und vorhersehbar und nicht chaotisch und verborgen zu machen.

Muster "Factory -Methode": Definiert die Schnittstelle zum Erstellen von Objekten, ermöglicht es Unterklassen, zu entscheiden, welche Klasse ein Institut ist. Dies reduziert die Entropie, da Sie es ermöglicht, Objekte flexibel zu erstellen, ohne bestimmte Klassen zu kennen und die Verbundenheit zu verringern.

Diese Muster helfen den Programmierern, vorhersehbarere, getestete und kontrollierte Systeme zu erstellen, wodurch die Entropie verringert wird, was in komplexen Projekten zwangsläufig auftritt.

DDD -Schlüsselmuster zur Steuerung der Entropie

Begrenzte Kontexte: Dieses Muster ist die DDD -Stiftung. Es bietet ein großes System in kleine, autonome Teile. Jeder Kontext hat sein eigenes Modell, ein Wörterbuch von Begriffen (allgegenwärtige Sprache) und Logik. Dies schafft strenge Grenzen, die die Ausbreitung von Veränderungen und Nebenwirkungen verhindern. Eine Änderung in einem begrenzten Kontext beispielsweise im "Kontext von Bestellungen" wirkt sich nicht auf den "Lieferkontext" aus.

Aggregate (Aggregate): Das Gerät ist ein Cluster verwandter Objekte (z. B. "Ordnung", "Zeilen der Reihenfolge"), die als Ganzes betrachtet werden. Das Gerät verfügt über ein Stammobjekt (Aggregat Root), das der einzige Eingangspunkt für alle Änderungen ist. Dies bietet Konsistenz und garantiert, dass der Zustand der Einheit immer integral bleibt. Indem wir das Gerät nur durch sein Wurzelobjekt ändern, steuern wir, wie und wann sich die Erkrankung ändert, was die Entropie erheblich verringert.

Domänendienste: Für Operationen, die nicht zu einem bestimmten Objekt des Themasbereichs gehören (z. B. Geldübertragung zwischen Konten), schlägt DDD die Nutzung von Domänendiensten vor. Sie koordinieren die Handlungen zwischen mehreren Einheiten oder Objekten, halten jedoch nicht den Zustand selbst. Dies macht die Logik transparenter und vorhersehbarer.

Die Ereignisse des Fachbereichs (Domänenereignisse): Anstelle von direkten Anrufmethoden aus verschiedenen Kontexten bietet DDD an, Ereignisse zu verwenden. Wenn in einem Kontext etwas Wichtiges passiert, "veröffentlicht" er die Veranstaltung. Andere Kontexte können dieses Ereignis abonnieren und darauf reagieren. Dies schafft eine schwache Verbundenheit zwischen den Komponenten, was das System zu einem skalierbaren und resistenten Veränderungen macht.

DDD hilft bei der Steuerung der Entropie und der Schaffung klarer Grenzen, strengen Regeln und isolierten Komponenten. Dies verwandelt ein komplexes, verwirrendes System in eine Reihe unabhängiger, kontrollierter Teile, von denen jedes ein eigenes „Gesetz“ und ein vorhersehbares Verhalten hat.

komplexe und lebhafte Dokumentation

Die Aufrechterhaltung detaillierter und relevanter Dokumentation zu Codeänderungen, Designlösungen, Architekturdiagrammen und Benutzerhandbüchern ist von größter Bedeutung. Diese „Live -Dokumentation“ hilft Entwicklern, die Feinheiten des Systems zu verstehen, Änderungen zu verfolgen und künftige Änderungen oder korrekte Fehler korrekt vorzunehmen. Es reduziert die Zeit, die für die „Reopening“ oder das umgekehrte Design des Systems aufgewendet wird, bei der häufigen Fehlerquellen.

Programmentropie tritt aufgrund von "mangelnden Wissen" und "Diskrepanzen zwischen allgemeinen Annahmen und dem tatsächlichen Verhalten des vorhandenen Systems" auf. Die Dokumentation fungiert nicht nur als Leitfaden, sondern auch als als

Der kritische Mechanismus zur Erhaltung von Wissen, der direkt mit der "Entropie des Wissens" kämpft. Indem es implizite Wissen explizit und erschwinglich macht, verringert es Missverständnisse und die Wahrscheinlichkeit, Fehler aufgrund falscher Annahmen über das Verhalten von Algorithmen oder Systeminteraktionen zu machen, wodurch die funktionale Richtigkeit geschützt wird.

Strenge Tests und kontinuierliche Qualitätssicherung

Automatisierte Tests: Modulare, Integration, System und Regressionstests
Automatisierte Tests sind ein unverzichtbares Werkzeug zum Erweichen der Softwareentropie und zur Verhinderung von Fehlern. Es ermöglicht eine frühzeitige Erkennung von Problemen und garantiert, dass Codeänderungen nicht gegen die vorhandene Funktionalität verstoßen und schnell und konsistentes Feedback liefert. Zu den Schlüsseltypen gehören modulare Tests (für isolierte Komponenten), Integrationstests (für Wechselwirkungen zwischen Modulen), Systemtests (für ein vollständig integriertes System) und Regressionstests (um sicherzustellen, dass neue Änderungen nicht zu wiederholtem Erscheinungsbild alter Fehler führen). Automatisierte Tests reduzieren den menschlichen Faktor erheblich und erhöhen die Zuverlässigkeit.

Automatisierte Tests sind der Hauptschutz gegen die Akkumulation versteckter Defekte. Es „verschiebt“ die Entdeckung von Fehlern im Entwicklungszyklus aktiv nach links, was bedeutet, dass Probleme gefunden werden, wenn ihre Korrektur am billigsten und einfachsten ist und ihren Beitrag zur Wirkung des Schneekomas der Entropie verhindert. Dies wirkt sich direkt auf die Richtigkeit der Algorithmen aus und überprüft das erwartete Verhalten auf mehreren Detailebenen ständig.

Entwicklung durch Tests (TDD): Verschiebung nach links bei der Erkennung von Fehlern

Die Entwicklung durch Tests (TESTD) ist ein Prozess der Softwareentwicklung, der das Schreiben von Tests für Code vor dem Schreiben des Codes selbst umfasst. Dieser iterative Zyklus "rot-grün-refaktorierend" fördert schnelles Feedback, wodurch ein frühzeitiges Erkennung von Fehlern ermöglicht und das Risiko komplexer Probleme in späteren Entwicklungsstadien signifikant verringert wird. Es wurde gezeigt, dass TDD zu einer geringeren Anzahl von Fehlern und der optimalen Qualität des Codes führt, wodurch die Philosophie von Trocken gut koordiniert wird (Donat wiederholt sich). Empirische Studien von IBM und Microsoft zeigen, dass TDD die Fehlerdichte auf beeindruckende 40-90%verringern kann. Testbeispiele dienen auch als Live -Dokumentation.

TDD fungiert als proaktive Qualitätskontrolle, die direkt in den Entwicklungsprozess eingebaut ist. Die Entwickler zwingen, das erwartete Verhalten vor der Implementierung zu bestimmen, und minimiert die Einführung logischer Fehler und garantiert, dass der Code gezielt erstellt wird, um die Anforderungen zu erfüllen, wodurch die Richtigkeit und Vorhersehbarkeit von Algorithmen von Anfang an verbessert wird.

Kontinuierliche Integration und Lieferung (CI/CD): Frühes Feedback und stabile Veröffentlichungen
CI/CD -Praktiken sind für die moderne Softwareentwicklung von grundlegender Bedeutung, was dazu beiträgt, Fehler in den frühen Stadien zu identifizieren, die Entwicklung zu beschleunigen und einen ununterbrochenen Bereitstellungsprozess zu gewährleisten. Die häufige Integration kleiner Codepakete in das zentrale Repository ermöglicht eine frühzeitige Erkennung von Fehlern und eine kontinuierliche Verbesserung der Codequalität durch automatisierte Baugruppen und Tests. Dieser Prozess bietet schnelles Feedback, sodass die Entwickler Probleme schnell und effektiv beseitigen und die Stabilität des Codes erheblich erhöhen können, wodurch die Akkumulation von nicht überprüftem oder instabilem Code verhindert wird.

CI/CD -Förderer fungieren als kontinuierlicher Mechanismus zur Reduzierung der Entropie. Durch die Automatisierung von Integration und Test verhindern sie die Ansammlung von Integrationsproblemen, bieten einen ständig entfalteten Zustand und bieten eine sofortige Sichtbarkeit der Regression. Dieser systematische und automatisierte Ansatz wirkt direkt der Störung aus, die durch kontinuierliche Änderungen vorgenommen wird, die Stabilität von Algorithmen aufrechterhalten und die Ausbreitung von Fehlern im gesamten System verhindern.

systematisches Management technischer Schulden

Inkrational Refactoring: Strategische Codeverbesserung

Refactoring ist der Prozess der Umstrukturierung des vorhandenen Code, um seine interne Struktur zu verbessern, ohne sein externes Verhalten zu ändern. Dies ist ein direktes Mittel zur Bekämpfung von Software -Verrottung und Reduzierung der Komplexität. Obwohl das Refactoring normalerweise als Möglichkeit angesehen wird, die Anzahl der Fehler zu verringern, ist es wichtig zuzugeben, dass ein paar Refraktiven unbeabsichtigt neue Fehler leisten können, was strenge Tests erfordert. Studien bestätigen jedoch im Allgemeinen, dass der refrakturierte Code fehlerfreie als unversehrt unterliegt. Das Inkreting Refactoring, in dem das Schuldenmanagement in den aktuellen Entwicklungsprozess integriert ist und nicht verschoben wird, ist entscheidend, um die exponentielle Anhäufung technischer Schulden zu verhindern.

Refactoring ist eine absichtliche Maßnahme zur Reduzierung der Entropie, der proaktiven Umstrukturierung von Code, um es resistenter gegen Änderungen zu machen, wodurch die Wahrscheinlichkeit künftiger Fehler verringert und die Klarheit von Algorithmen verbessert wird. Es verwandelt reaktive Löschen von Bränden in eine proaktive Behandlung der strukturellen Gesundheit.

Rückstände technischer Schulden: Priorisierung und Verteilung von Ressourcen

Die Aufrechterhaltung eines aktuellen Bablogs technischer Schulden ist eine kritische Praxis für das systematische Management und die Beseitigung technischer Schulden. Dieser Rückstand dient als umfassendes Register identifizierter Elemente der technischen Pflicht und der Bereichen, die eine Verbesserung erfordern, und garantiert, dass diese Probleme nicht übersehen werden. Es ermöglicht Projektmanagern, Schuldenelemente auf der Grundlage ihres Schwerpunkts des Einflusses und des potenziellen Risikos zu priorisieren. Die Integration des Bablogs während des Projekts stellt sicher, dass Refactoring, Fehlerkorrektur und Codereinigung regelmäßige Teile des täglichen Managements des Projekts sind und die langfristigen Rückzahlungskosten verringern.

Der Baclog der technischen Schulden verwandelt ein abstraktes, wachsendes Problem in eine kontrollierte, wirksame Aufgaben. Dieser systematische Ansatz ermöglicht es Unternehmen, angemessene Kompromisse zwischen der Entwicklung neuer Funktionen und den Anlagen in die Qualität einzugehen, wob Es bietet Sichtbarkeit und Kontrolle über die wichtige Entropieleistung.

Statische und dynamische Codeanalyse: Proaktive Identifizierung von Problemen

Statische Analyse

Diese Technik beinhaltet eine Analyse des Quellcode ohne ihre Implementierung, um Probleme wie Fehler, Codegerüche, Sicherheitsanfälligkeit und gestörte Codierungsstandards zu identifizieren. Es dient als „erste Schutzlinie“, die Probleme in den frühen Phasen des Entwicklungszyklus identifiziert, die Gesamtqualität des Code verbessert und die technischen Schulden verringert, indem problematische Vorlagen identifiziert werden, bevor sie während der Ausführung als Fehler auftreten.

Die statische Analyse fungiert als automatisierte "Codes Quality Police". Identifizieren potenzieller Probleme (einschließlich solcher, die die algorithmische Logik beeinflussen) vor der Durchführung ihre Manifestation in Form von Fehlern oder architektonischen Nachteilen verhindert. Dies ist eine skalierbare Methode zur Gewährleistung der Codierungsstandards und der Identifizierung häufiger Fehler, die zur Softwareentropie beitragen.

Dynamische Analyse

Diese Methode bewertet das Softwareverhalten während der Ausführung und liefert wertvolle Informationen über Probleme, die sich nur während der Ausführung manifestieren. Es entdeckt hervorragende Fehler während der Ausführung, wie z. B. Speicherlecks, den Zustand des Rennens und den Ausschluss des Nullzeigers sowie schmale Stellen in Bezug auf Leistung und Sicherheitsanfälligkeit.

Die dynamische Analyse ist entscheidend für die Identifizierung von Verhaltensnachteilen während der Ausführung, die durch statische Analyse nicht erkannt werden können. Die Kombination aus statischer und dynamischer Analyse sorgt für eine umfassende Vorstellung von der Struktur und dem Verhalten des Codes, sodass die Teams Mängel identifizieren können, bevor sie sich zu schwerwiegenden Problemen entwickeln.

Überwachung der Produktion und Büro von Vorfällen

APM (Überwachung der Anwendungsleistung):
APM -Tools sind so konzipiert, dass sie die Leistung der Anwendungen überwachen und optimieren. Sie tragen dazu bei, komplexe Leistungsprobleme zu identifizieren und zu diagnostizieren sowie die Hauptursachen für Fehler zu erkennen, wodurch ein Einkommensverlust durch Ausfallzeiten und Verschlechterung verringert wird. APM-Systeme überwachen verschiedene Metriken, wie die Reaktionszeit, die Verwendung von Ressourcen und die Fehlerhäufigkeit sowie die Bereitstellung von Echtzeitinformationen, mit denen Sie Probleme proaktiv lösen können, bevor sie die Benutzer betreffen.

APM -Tools kritisieren proaktive Lösungen für Probleme und die Aufrechterhaltung der Servicestufen. Sie bieten eine tiefe Sichtbarkeit in der Produktionsumgebung, sodass die Teams Probleme schnell identifizieren und beseitigen können, die die korrekten Algorithmen oder Fehler verursachen, wodurch Ausfallzeiten minimiert und die Benutzererfahrung verbessert werden.

Beobachtbarkeit (Protokolle, Metriken, Tracer):

Die Beobachtbarkeit bezieht sich auf die Fähigkeit zur Analyse und Messung der internen Systemzustände auf der Grundlage ihrer Ausgangsdaten und Wechselwirkungen zwischen Vermögenswerten. Drei Hauptsäulen der Beobachtbarkeit sind Metriken (quantitative Daten zur Produktivität und Verwendung von Ressourcen), Protokolle (detaillierte chronologische Aufzeichnungen von Ereignissen) und Verfolgung (Verfolgung des Anforderungen durch Systemkomponenten). Zusammen helfen sie, Probleme zu identifizieren und zu lösen und ein umfassendes Verständnis des Verhaltens des Systems zu vermitteln. Die Beobachtbarkeit geht über die traditionelle Überwachung hinaus, hilft, "unbekannte Unbekannte" zu verstehen und die Zeit der störenden Anwendung von Anwendungen zu verbessern.

Die Beobachtbarkeit ermöglicht es den Teams, flexibel zu untersuchen, was passiert, und schnell die Ursache für die Probleme zu bestimmen, die sie möglicherweise nicht vorgesehen haben. Dies bietet ein tieferes, flexibles und proaktives Verständnis des Verhaltens des Systems, sodass die Teams unvorhergesehene Probleme schnell identifizieren und beseitigen und eine hohe Zugänglichkeit von Anwendungen aufrechterhalten können.

Analyse der Ursache (RCA)

Die Analyse der Grundursachen (RCA) ist ein strukturierter Prozess, der auf Daten basiert, die die grundlegenden Ursachen von Problemen in Systemen oder Prozessen zeigen, die es Unternehmen ermöglichen, effektive, langfristige Lösungen zu implementieren und nicht nur Symptome zu beseitigen. Es enthält die Definition des Problems, die Erfassung und Analyse der relevanten Daten (z. RCA ist von entscheidender Bedeutung, um das Auftreten von Problemen und Schulungen in Vorfällen zu verhindern.

RCA ist entscheidend für die langfristige Prävention von Problemen und Schulungen in Vorfällen. Die wichtigsten Ursachen und nicht nur die Symptome identifizieren und beseitigen, können Organisationen das Auftreten von Fehlern und Algorithmenversagen verhindern, wodurch das Gesamtsystem des Systems verringert und die Zuverlässigkeit erhöht wird.

Flexible Methoden und Teampraktiken

Fehlerverwaltung in Agile:

In der agilen Umgebung ist das Fehlermanagement von entscheidender Bedeutung, und es wird empfohlen, Zeit in Sprints zuzuweisen, um sie zu korrigieren. Fehler sollten in einem einzelnen Produkt des Produkts aufgezeichnet und mit der entsprechenden Anamnese verbunden werden, um die Analyse von Ursachen zu erleichtern und den Code in nachfolgenden Sprints zu verbessern. Die Teams sollten sich bemühen, Fehler so bald wie möglich zu korrigieren, vorzugsweise im aktuellen Sprint, um deren Akkumulation zu verhindern. Die Erfassung von Fehlerstatistiken (die Anzahl der aufgelösten, die Anzahl der registrierten Stunden, die für die Korrektur aufgewendete Stunden) trägt dazu bei, eine Vorstellung von Codequalität zu erhalten und Prozesse zu verbessern.

Dies betont die Bedeutung sofortiger Korrekturen, Analyse von Ursachen und kontinuierliche Verbesserung. Flexible Methoden bieten einen Rahmen für die proaktive Steuerung von Fehlern, die ihren Beitrag zur Entropie des Systems verhindern und die Richtigkeit von Algorithmen durch konstante Überprüfung und Anpassung aufrechterhalten.

DevOps Praktiken

DevOps -Praktiken helfen dazu, Softwarefehler zu reduzieren und die Qualität durch verschiedene wichtige Ansätze zu verbessern. Dazu gehören die Entwicklung einer Kultur der Zusammenarbeit und einer unverwechselbaren Kommunikation, der Einführung kontinuierlicher Integration und Abgabe (CI/CD), der Konfiguration automatisierter Tests, der Fokussierung der Aufmerksamkeit auf Beobachtbarkeit und Metriken, die vermiedene handgefertigte Arbeiten, einschließlich Sicherheit in den frühen Stadien des Entwicklungszyklus und der Ausbildung von Vorfällen. Diese Praktiken verringern die Anzahl der Fehler, verbessern die Qualität und tragen zu einer ständigen Verbesserung bei.

DevOps trägt zur kontinuierlichen Verbesserung und Verringerung der Entropie durch Automatisierung, schnelles Feedback und zu einer Kultur der allgemeinen Verantwortung bei. Integration von Entwicklungs- und Betriebsprozessen schafft DevOps eine Umgebung, in der Probleme schnell erkannt und beseitigt werden, wodurch ihre Akkumulation und deren Abbau von Systemen verhindern, was die Integrität der Algorithmen direkt unterstützt.

Schlussfolgerung

Programmentropie ist eine unvermeidliche Kraft, die ständig nach Abbau von Softwaresystemen strebt, insbesondere im Zusammenhang mit der Richtigkeit von Algorithmen und Fehlern. Dies ist nicht nur physisches Altern, sondern eine dynamische Interaktion zwischen dem Code, seiner Umgebung und menschlichen Faktoren, die ständig ein Chaos ausmachen. Zu den wichtigsten treibenden Kräften dieses Verfalls gehören die wachsende Komplexität, die Akkumulation technischer Schulden, unzureichende Dokumentation, ständig wechselnde externe Umgebungen und inkonsistente Entwicklungsmethoden. Diese Faktoren führen direkt zu falschen Ergebnissen der Arbeit von Algorithmen, dem Verlust der Vorhersehbarkeit und einer Zunahme der Anzahl der Fehler, die sich kaskadisch durch miteinander verbundene Systeme ausbreiten können.

Der Kampf gegen die Softwareentropie erfordert einen vielfältigen, kontinuierlichen und proaktiven Ansatz. Es reicht nicht aus, nur Fehler zu korrigieren, sobald sie auftreten. Es ist notwendig, systematisch die Hauptgründe zu beseitigen, die sie generieren. Die Einführung der Prinzipien des modularen Designs, des sauberen Code (Kuss, Trocken, solide) und komplexer Dokumentation ist für die Erstellung stabiler Systeme von grundlegender Bedeutung, die im Wesentlichen weniger anfällig für Entropie sind. Strikte automatisierte Tests, Entwicklung durch Tests (TDD) und kontinuierliche Integration/Lieferung (CI/CD) wirken als kritische Mechanismen der Früherkennung und Verhinderung von Defekten, wodurch die Codebasis ständig überprüft und stabilisiert wird.

Darüber hinaus ermöglicht das systematische Management technischer Schulden durch Nebenrefaktoring und Bafflogiker technischer Schulden sowie die Verwendung statischer und dynamischer Code -Analyse -Tools, um Problembereiche aktiv zu identifizieren und zu beseitigen, bevor sie zu kritischen Ausfällen führen. Schließlich gewährleistet die zuverlässige Produktionsüberwachung mit Hilfe von APM -Tools und Observabilitätsplattformen in Kombination mit einer disziplinierten Analyse der Grundursachen und flexiblen Teampraktiken eine schnelle Reaktion auf aufkommende Probleme und schafft einen kontinuierlichen Verbesserungszyklus.

Letztendlich sicherstellen Sie die Integrität von Algorithmen und die Minimierung von Fehlern unter den Bedingungen der Softwareentropie - dies ist keine einszeitliche Anstrengung, sondern eine ständige Verpflichtung, die Reihenfolge in einer dynamischen und sich ständig ändernden Umgebung aufrechtzuerhalten. Durch die Anwendung dieser Strategien können Unternehmen die Zuverlässigkeit, Vorhersehbarkeit und Haltbarkeit ihrer Softwaresysteme erheblich erhöhen und garantieren, dass Algorithmen wie geplant funktionieren, auch wenn sie sich entwickeln.

Blockierungen in der Praxis ohne Formalin blockieren

Das Blockdiagramm ist ein visuelles Werkzeug, das dazu beiträgt, einen komplexen Algorithmus in eine verständliche und strukturierte Folge von Aktionen zu verwandeln. Von der Programmierung bis zum Geschäftsprozessmanagement dienen sie als universelle Sprache für die Visualisierung, Analyse und Optimierung der komplexesten Systeme.

Stellen Sie sich eine Karte vor, auf der anstelle von Straßen Logik und anstelle von Städten – Aktionen ist. Dies ist ein Blockdiagramm-ein unverzichtbares Werkzeug für die Navigation in den verwirrendsten Prozessen.

Beispiel 1: vereinfachtes Spielstartschema
Um das Arbeitsprinzip zu verstehen, präsentieren wir ein einfaches Spielstartschema.

Dieses Schema zeigt das perfekte Skript, wenn alles ohne Fehler passiert. Aber im wirklichen Leben ist alles viel komplizierter.

Beispiel 2: Erweitertes Schema zum Starten des Spiels mit Datenladen
Moderne Spiele erfordern häufig eine Internetverbindung, um Benutzerdaten, Speichern oder Einstellungen herunterzuladen. Fügen wir diese Schritte zu unserem Schema hinzu.

Dieses Schema ist bereits realistischer, aber was wird passieren, wenn etwas schief geht?

Wie war es: Ein Spiel, das mit dem Verlust des Internets “brach”

“brach”

Zu Beginn des Projekts konnten Entwickler nicht alle möglichen Szenarien berücksichtigen. Zum Beispiel konzentrierten sie sich auf die Hauptlogik des Spiels und überlegten nicht, was passieren würde, wenn der Spieler eine Internetverbindung hat.

In einer solchen Situation würde das Blockdiagramm ihres Codes so aussehen:

In diesem Fall hat das Spiel in der Phase des Wartens auf Daten, die sie aufgrund des Fehlens einer Verbindung nicht erhielt, anstatt einen Fehler oder korrekt zu schließen. Dies führte zum “schwarzen Bildschirm” und zum Einfrieren der Anwendung.

Wie es wurde: Korrektur bei Benutzerbeschwerden

Nach zahlreichen Beschwerden der Benutzer über das Schwebewesen erkannte das Entwicklerteam, dass wir den Fehler korrigieren mussten. Sie nahmen Änderungen am Code vor, indem sie eine Fehlerverarbeitungseinheit hinzufügen, mit der die Anwendung auf den mangelnden Verbindungsmangel korrekt reagiert.

So sieht das korrigierte Blockdiagramm aus, in dem beide Szenarien berücksichtigt werden:

Dank dieses Ansatzes informiert das Spiel jetzt den Benutzer über das Problem und kann in einigen Fällen sogar in den Offline -Modus gehen, sodass Sie das Spiel fortsetzen können. Dies ist ein gutes Beispiel dafür, warum Blockdiagramme so wichtig sind.

Unsicheres Verhalten

Das Hängen und Fehler sind nur ein Beispiel für unvorhersehbare Verhalten des Programms. Bei der Programmierung gibt es ein Konzept von unsicherem Verhalten (undefiniertes Verhalten) – Dies ist eine Situation, in der der Standard der Sprache nicht beschreibt, wie sich das Programm in einem bestimmten Fall verhalten sollte.

Dies kann zu allem führen: vom zufälligen „Müll“ beim Rückzug zum Versagen des Programms oder sogar der schwerwiegenden Sicherheitsanfälligkeit. Unbestimmte Verhalten tritt häufig bei der Arbeit mit dem Gedächtnis auf, zum Beispiel mit Zeilen in der Sprache von C.

Ein Beispiel aus der Sprache c:

Stellen Sie sich vor, der Entwickler hat die Linie in den Puffer kopiert, aber vergessen, das Ende des Null -Symbols (\ 0`) zu addieren, das das Ende der Linie markiert.

So sieht der Code aus:

#include 

int main() {
char buffer[5];
char* my_string = "hello";

memcpy(buffer, my_string, 5);

printf("%s\n", buffer);
return 0;
}

Erwartete Ergebnis: “Hallo”
Das wirkliche Ergebnis ist unvorhersehbar.

Warum passiert das? Die Funktion “printf`) mit dem Spezifizierer%S` erwartet, dass die Linie mit einem Nullsymbol endet. Wenn er nicht ist, wird sie die Erinnerung außerhalb des hervorgehobenen Puffers weiter lesen.

Hier ist das Blockdiagramm dieses Prozesses mit zwei möglichen Ergebnissen:

Dies ist ein klares Beispiel dafür, warum die Blockdiagramme so wichtig sind: Sie lassen den Entwickler nicht nur über die ideale Ausführungsweise nachdenken, sondern auch über alle möglichen Fehler, einschließlich solcher Probleme mit niedrigem Niveau, was das Endprodukt viel stabiler und zuverlässiger macht.

LLM Fine-Tune

Derzeit verwenden alle beliebten LLM-Dienstanbieter eine Feinabstimmung mit JSONL-Dateien, die die Eingaben und Ausgänge des Modells mit kleinen Variationen beschreiben, beispielsweise für Gemini OpenAI, das Format etwas unterschiedlich.

Nach dem Herunterladen einer speziell geformten JSONL -Datei beginnt der Prozess der Spezialisierung des LLM -Modells auf dem angegebenen Datensatz für alle aktuellen, bekannten LLM -Anbieter, die dieser Dienst bezahlt wird.

Für die Feinabstimmung auf einer lokalen Maschine mit Ollama empfehle ich, mich auf ein detailliertes Video des YouTube Channel Tech zu verlassen, um ein LLM und uns mit Alloma zu optimieren:
https://www.youtube.com/watch?v=pTaSDVz0gok

Ein Beispiel für einen Jupyter-Laptop mit der Vorbereitung des JSONL-Datensatzes aus Exporten aller Telegrammnachrichten und dem Start des lokalen Feinabstiegsprozesses finden Sie hier:
https://github.com/demensdeum/llm-train-example