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

React native kurze Überprüfung reagieren

React Native hat sich als leistungsstarkes Werkzeug für die plattformübergreifende Entwicklung von mobilen und Webanwendungen etabliert. Sie können native Anwendungen für Android und iOS sowie Webanwendungen erstellen, indem Sie eine einzelne Codebasis auf JavaScript/TypeScript verwenden.

Grundlagen der Architektur und Entwicklung

React National Architecture basiert auf nativen Bindungen von JavaScript/TypeScript. Dies bedeutet, dass die grundlegende Geschäftslogik und eine Anwendung in der Anwendung auf JavaScript oder TypeScript geschrieben werden. Wenn Zugriff auf bestimmte native Funktionen (z. B. die Gerät oder die GPS-Kamera) erforderlich ist, werden diese nativen Bindungen verwendet, mit denen Sie den auf Swift/Objective-C für iOS oder Java/Kotlin geschriebenen Code für Android aufrufen können.

Es ist wichtig zu beachten, dass die resultierenden Plattformen in der Funktionalität variieren können. Beispielsweise kann eine bestimmte Funktionalität nur für Android und iOS verfügbar sein, jedoch nicht für Web oder umgekehrt, abhängig von den nativen Funktionen der Plattform.

Konfiguration und Updates
Die Konfiguration nativer Bindungen erfolgt über den Plugins -Schlüssel. Für eine stabile und sichere Entwicklung ist es wichtig, die neuesten Versionen von React Native -Komponenten zu verwenden und sich immer der aktuellen Dokumentation zuzuwenden. Dies hilft, Kompatibilitätsprobleme zu vermeiden und alle Vorteile der neuesten Updates zu nutzen.

Merkmale der Entwicklung und Optimierung

React Native kann resultierende Projekte für bestimmte Plattformen generieren (z. B. Android- und iOS -Ordner). Dies ermöglicht den Entwicklern gegebenenfalls die Dateien der resultierenden Projekte manuell für Feinoptimierung oder spezifische Einstellungen, was besonders für komplexe Anwendungen nützlich ist, die einen individuellen Ansatz für die Leistung erfordern.

Für typische und einfache Anwendungen reicht es häufig aus, Expo -Bandle mit gebauten nativen Bindungen zu verwenden. Wenn die Anwendung jedoch über eine komplexe Funktionalität verfügt oder eine tiefe Anpassung erfordert, wird empfohlen, native benutzerdefinierte Assemblys zu verwenden.

Essensbarkeit von Entwicklung und Aktualisierungen


Einer der wichtigsten Vorteile von React Native ist die Hot Reload -Unterstützung für Typscript/JavaScript -Code während der Entwicklung. Dies beschleunigt den Entwicklungsprozess erheblich, da die Codeänderungen sofort in der Anwendung angezeigt werden, sodass der Entwickler das Ergebnis in Echtzeit erkennen kann.

React Native unterstützt außerdem „Silent Update), um den Prozess des Google Play- und Apple App Store umzugehen. Dies gilt jedoch nur für Typscript/JavaScript -Code. Auf diese Weise können Sie schnell Fehler oder kleine Funktionalitätsaktualisierungen freigeben, ohne einen vollständigen Zyklus der Publikation über Anwendungsspeicher durchzuführen.

Es ist wichtig zu verstehen, dass der TS/JS -Code mithilfe von Fingerabdruck in einer bestimmten Version von nativen Abhängigkeiten bandiert wird, die die Koordination zwischen JavaScript/TypeScript -Teil und nativem Teil der Anwendung sicherstellt.

Verwendung von LLM in der Entwicklung

Obwohl die Codhegeneration mit LLM (Großsprachenmodelle) möglich ist, ist seine Eignung nicht immer hoch, da potenziell veraltete Datensätze, auf denen die Modelle trainiert wurden, geschult wurden. Dies bedeutet, dass der generierte Code möglicherweise nicht den neuesten Versionen von React Native oder den Best Practices entspricht.

React Native entwickelt sich weiter und bietet Entwicklern einen flexiblen und effektiven Weg, um Cross -Plattform -Anwendungen zu erstellen. Es kombiniert die Entwicklungsgeschwindigkeit mit der Möglichkeit eines Zugangs zu nativen Funktionen, was es für viele Projekte zu einer attraktiven Wahl macht.

Pixel perfekt: Mythos oder Realität in der Ära der Deklarativität?

In der Welt der Schnittstellenentwicklung gibt es ein gemeinsames Konzept – “Pixel perfekt in der Lodge” . Es impliziert die genaueste Reproduktion der Konstruktionsmaschine auf das kleinste Pixel. Lange Zeit war es ein Goldstandard, insbesondere in der Ära eines klassischen Webdesigns. Mit der Ankunft der deklarativen Meile und dem schnellen Wachstum der Vielfalt der Geräte wird das Prinzip von “Pixel Perfect” jedoch zunehmend kurzlebiger. Versuchen wir herauszufinden, warum.

Imperial Wysiwyg vs. Deklarativer Code: Was ist der Unterschied?

Traditionell wurden viele Schnittstellen, insbesondere der Desktop, mit imperativen Ansätzen oder wysiwyg (was Sie sehen, was Sie erhalten) von Herausgebern erstellt. In solchen Tools manipuliert der Designer oder Entwickler direkt mit Elementen und platziert sie auf Leinwand mit Genauigkeit zum Pixel. Es ähnelt der Arbeit mit einem Grafikeditor – Sie sehen, wie Ihr Element aussieht, und Sie können es definitiv positionieren. In diesem Fall war die Leistung von “Pixel Perfect” ein sehr reales Ziel.

Die moderne Entwicklung basiert jedoch zunehmend auf deklarativen Meilen . Dies bedeutet, dass Sie dem Computer nicht sagen, dass er “diese Schaltfläche hier einstellen”, sondern beschreiben, was Sie bekommen möchten. Anstatt die spezifischen Koordinaten des Elements anzuzeigen, beschreiben Sie beispielsweise seine Eigenschaften: “Diese Schaltfläche sollte rot sein, 16px -Eindringlinge von allen Seiten haben und in der Mitte des Behälters stehen.” Freiimvorki wie React, Vue, Swiftui oder Jetpack komponieren nur dieses Prinzip.

Warum “Pixel Perfect” für viele Geräte nicht mit einer deklarativen Meile funktioniert

Stellen Sie sich vor, Sie erstellen eine Anwendung, die auf dem iPhone 15 Pro Max, Samsung Galaxy Fold, iPad Pro und einer 4K -Auflösung gleich gut aussehen soll. Jedes dieser Geräte hat eine unterschiedliche Bildschirmauflösung, Pixeldichte, Parteien und physische Größen.

Wenn Sie den deklarativen Ansatz verwenden, entscheidet das System selbst unter Berücksichtigung aller Parameter, wie Sie Ihre beschriebene Schnittstelle auf einem bestimmten Gerät anzeigen. Sie setzen die Regeln und Abhängigkeiten, nicht die harten Koordinaten.

* Anpassungsfähigkeit und Reaktionsfähigkeit: Das Hauptziel der deklarativen Meilen ist es, adaptive und reaktionsschnelle Schnittstellen zu erstellen. Dies bedeutet, dass sich Ihre Schnittstelle automatisch an die Größe und Ausrichtung des Bildschirms anpassen sollte, ohne die Lesbarkeit zu brechen und aufrechtzuerhalten. Wenn wir auf jedem Gerät „Pixel Perfect“ beantragen möchten, müssten wir unzählige Optionen für dieselbe Schnittstelle erstellen, was die Vorteile des deklarativen Ansatzes vollständig ausgleichen wird.
* Pixeldichte (DPI/PPI): Die Geräte haben eine unterschiedliche Pixeldichte. Das gleiche Element mit der Größe von 100 “virtuellen” Pixeln auf einem Gerät mit hoher Dichte sieht viel kleiner aus als bei einem Gerät mit niedrigem Dichte, wenn Sie die Skalierung nicht berücksichtigen. Deklarative Rahmenbedingungen werden von physischen Pixeln abstrahiert und arbeiten mit logischen Einheiten.
* Dynamischer Inhalt: Inhalt in modernen Anwendungen ist häufig dynamisch – sein Volumen und die Struktur können variieren. Wenn wir hart auf die Pixel gerissen würden, würde jede Änderung des Textes oder des Bildes zum “Zusammenbruch” des Layouts führen.
* Verschiedene Plattformen: Zusätzlich zur Vielfalt der Geräte gibt es verschiedene Betriebssysteme (iOS, Android, Web, Desktop). Jede Plattform verfügt über eigene Design, Standardsteuerungen und Schriftarten. Ein Versuch, auf allen Plattformen eine absolut identische Pixel -Perfect -Schnittstelle zu erstellen, würde zu einem unnatürlichen Typ und einer schlechten Benutzererfahrung führen.

Die alten Ansätze gingen nicht verschwunden, sondern entwickelten

Es ist wichtig zu verstehen, dass der Ansatz zu Schnittstellen keine binäre Wahl zwischen “imperativ” und “deklarativ” ist. Historisch gesehen gab es für jede Plattform ihre eigenen Werkzeuge und Ansätze zur Erstellung von Schnittstellen.

* Native Schnittstellendateien: Für iOS waren es XIB/Storyboards für Android-XML-Markierungsdateien. Diese Dateien sind ein Pixel-Perfekt-Wysiwyg-Layout, das dann wie im Editor im Radio angezeigt wird. Dieser Ansatz ist nirgendwo verschwunden und entwickelt sich weiter und integriert sich in moderne deklarative Rahmen. Zum Beispiel haben Swiftui in Apple und Jetpack in Android auf dem Pfad eines rein deklarativen Code eingeschaltet, behielten gleichzeitig die Möglichkeit, ein klassisches Layout zu verwenden.
* Hybridlösungen: häufig in realen Projekten wird eine Kombination von Ansätzen verwendet. Beispielsweise kann die Grundstruktur der Anwendung deklarativ implementiert werden und für spezifische, die eine genaue Positionierung von Elementen, niedrigere Level, imperative Methoden erfordern, oder native Komponenten, die unter Berücksichtigung der Einzelheiten der Plattform entwickelt wurden.

vom Monolith zur Anpassungsfähigkeit: Wie die Entwicklung von Geräten eine deklarative Meile bildete

Die Welt der digitalen Schnittstellen hat sich in den letzten Jahrzehnten enorme Veränderungen verändert. Von stationären Computern mit festen Genehmigungen kamen wir in die Ära des exponentiellen Wachstums der Vielfalt der Benutzergeräte . Heute sollten unsere Bewerbungen gleich gut funktionieren:

* Smartphones aller Formfaktoren und Bildschirmgrößen.
* Tablets mit ihren einzigartigen Ausrichtungsmodi und einem getrennten Bildschirm.
* Laptops und Desktops mit verschiedenen Monitorengenehmigungen.
* TVS- und Medienzentren , kontrolliert remote. Es ist bemerkenswert, dass selbst für Fernseher, deren Bemerkungen mit einem Minimum an Schaltflächen, oder umgekehrt, mit vielen Funktionen überladen sind, selbst für die Schnittstellen so einfach sind, dass der Code keine spezifische Anpassung für diese Eingabefunktionen benötigt. Die Schnittstelle sollte “als ob für sich selbst” funktionieren, ohne eine zusätzliche Beschreibung des “Wie” mit einer bestimmten Fernbedienung zu interagieren.
* Smart Watches und Wearable -Geräte mit minimalistischen Bildschirmen.
* Virtual Reality Helme (VR) , die einen völlig neuen Ansatz für eine räumliche Schnittstelle erfordern.
* Augmented Reality Device Devices (AR) , die Informationen über die reale Welt anwenden.
* Automobilinformationen und Unterhaltungssysteme .
* Und sogar Haushaltsgeräte : Von Kühlschränken mit sensorischen Bildschirmen und Waschmaschinen mit interaktiven Displays bis hin zu intelligenten Öfen und Systemen des Smart House.

Jedes dieser Geräte verfügt über eigene Merkmale: physikalische Dimensionen, Parteienverhältnisse, Pixeldichte, Eingabemethoden (Touchscreen, Maus, Controller, Gesten, Stimmbefehle) und vor allem die Feinheiten der Benutzerumgebung . Beispielsweise erfordert ein VR Shlesh ein tiefes Eintauchen und eine Smartphone-schnelle und intuitive Arbeit unterwegs, während die Kühlschrankschnittstelle für schnelle Navigation genauso einfach und groß sein sollte.

Klassischer Ansatz: Die Belastung für die Unterstützung einzelner Schnittstellen

In der Zeit der Dominanz von Desktops und der ersten mobilen Geräte war das übliche Geschäft die Erstellung und Unterstützung von von einzelnen Schnittstellendateien oder sogar eines vollständig separaten Schnittstellencodes für jede Plattform .

* Die Entwicklung unter iOS erforderte häufig die Verwendung von Storyboards oder XIB-Dateien in Xcode, das Code auf Objective-C oder Swift schreibt.
* Für Android wurden die XML -Markierungsdateien und der Code auf Java oder Kotlin erstellt.
* Web -Schnittstellen haben HTML/CSS/JavaScript eingeschaltet.
* Für Anwendungen c ++ auf verschiedenen Desktop -Plattformen wurden ihre spezifischen Frameworks und Tools verwendet:
* In Windows waren dies MFC (Microsoft Foundation Classes), Win32 -API mit manuellen Zeichnungselementen oder Verwendung von Ressourcendateien für Dialogfenster und Steuerelemente.
* Kakao (Objektiv-C/Swift) oder die alte Kohlenstoff-API zur direkten Kontrolle der grafischen Grenzfläche wurden in macOS verwendet.
* In Linux/UNIX-ähnlichen Systemen wurden häufig Bibliotheken wie GTK+ oder QT verwendet, die ihre Widgets und Mechanismen zum Erstellen von Schnittstellen bereitstellten, häufig über XML-ähnliche Markierungsdateien (z.

Dieser Ansatz sorgte für eine maximale Kontrolle über jede Plattform, sodass Sie alle spezifischen Funktionen und nativen Elemente berücksichtigen können. Er hatte jedoch einen großen Nachteil: Duplizierung von Bemühungen und enorme Kosten für Unterstützung . Die geringste Änderung des Designs oder der Funktionalität erforderte die Einführung eines Rechts auf mehrere unabhängige Codebasen. Dies wurde zu einem echten Albtraum für Entwicklerteams, verlangsamte die Ausgabe neuer Funktionen und erhöhte die Wahrscheinlichkeit von Fehlern.

deklarative Meilen: Eine einzelne Sprache für Vielfalt

Als Reaktion auf diese schnelle Komplikation erschien die deklarativen Meilen als dominantes Paradigma. Framws wie React, Vue, Swiftui, Jetpack Compose und andere sind nicht nur eine neue Art, Code zu schreiben, sondern eine grundlegende Verschiebung des Denkens.

Die Hauptidee des deklarativen Ansatzes : Anstatt das System zu sagen, wie man jedes Element zeichnet (imperativ), beschreiben wir „was“ wir sehen wollen (deklarativ). Wir setzen die Eigenschaften und den Zustand der Schnittstelle, und das Framework entscheidet, wie Sie sie am besten auf einem bestimmten Gerät anzeigen können.

Dies wurde dank der folgenden wichtigen Vorteile möglich:

1. Abstraktion aus den Details der Plattform: deklarative Fraimvorki sind speziell so konzipiert, dass sie die Details mit niedrigem Level für jede Plattform vergessen. Der Entwickler beschreibt die Komponenten und ihre Beziehungen auf einer höheren Abstraktionsebene unter Verwendung eines einzelnen, übertragenen Codes.
2. Automatische Anpassung und Reaktionsfähigkeit: Freiimvorki Übernehmen Sie die Verantwortung für die automatische Skalierung , ändern Sie das Layout und die Anpassung von Elementen in verschiedene Größen von Bildschirmen, Pixeldichte und Eingabemethoden. Dies wird durch die Verwendung flexibler Layoutsysteme wie Flexbox oder Grid und Konzepte erreicht, die “logischen Pixeln” oder “DP” ähneln.
3.. Dies vereinfacht den Testprozess und bietet vorhersehbarere Benutzererfahrung.
V. Die Teams können sich auf Funktionalität und Design konzentrieren und nicht auf wiederholte Umschreiben derselben Schnittstelle.
5. Freiimvorki kann aktualisiert werden, um neue Technologien zu unterstützen, und Ihr bereits geschriebener Code erhält. Diese Unterstützung ist relativ nahtlos.

Schlussfolgerung

Die deklarative Meile ist nicht nur ein Modetrend, sondern auch die notwendige evolutionäre Stufe , die durch die schnelle Entwicklung von Benutzergeräten verursacht wird, einschließlich der Sphäre des Internet der Dinge (IoT) und intelligente Haushaltsgeräte. Es ermöglicht Entwicklern und Designern, komplexe, adaptive und gleichmäßige Schnittstellen zu erstellen, ohne in endlosen spezifischen Implementierungen für jede Plattform zu ertrinken. Der Übergang von der imperativen Kontrolle über jedes Pixel zur deklarativen Beschreibung des gewünschten Zustands ist eine Erkenntnis, dass in der Welt der zukünftigen Schnittstellen flexibel, übertragen und intuitiv unabhängig davon, welcher Bildschirm angezeigt wird.

Programmierer, Designer und Benutzer müssen lernen, wie man in dieser neuen Welt lebt. Die zusätzlichen Details des Pixel Perfect, das auf ein bestimmtes Gerät oder eine bestimmte Auflösung ausgelegt ist, führen zu unnötigen Zeitkosten für die Entwicklung und Unterstützung. Darüber hinaus funktionieren solche harten Layouts möglicherweise nicht auf Geräten mit nicht standardmäßigen Schnittstellen wie begrenzten Eingangsfernsehern, VR- und AR-Verschiebungen sowie anderen Geräten der Zukunft, von denen wir heute noch nicht einmal wissen. Flexibilität und Anpassungsfähigkeit – Dies sind die Schlüssel zur Schaffung erfolgreicher Schnittstellen in der modernen Welt.

Warum tun Programmierer auch mit neuronalen Netzwerken nichts?

Heute werden überall neuronale Netze verwendet. Programmierer verwenden sie, um Code zu generieren, andere Lösungen zu erläutern, Routineaufgaben zu automatisieren und sogar ganze Anwendungen von Grund auf neu zu erstellen. Es scheint, dass dies zu einer Erhöhung der Effizienz, der Verringerung der Fehler und der Beschleunigung der Entwicklung führen sollte. Aber die Realität ist viel prosaischer: Viele gelingt es immer noch nicht. Die neuronalen Netze lösen keine wichtigen Probleme – sie beleuchten nur die Tiefe der Unwissenheit.

Vollständige Abhängigkeit von LLM anstatt zu verstehen

Der Hauptgrund ist, dass sich viele Entwickler vollständig auf LLM verlassen und die Notwendigkeit eines tiefen Verständnisses der Werkzeuge ignorieren, mit denen sie arbeiten. Anstatt Dokumentation zu studieren – eine Chat -Anfrage. Anstatt die Gründe für den Fehler zu analysieren – kopieren Sie die Entscheidung. Anstelle von architektonischen Lösungen – die Erzeugung von Komponenten gemäß der Beschreibung. All dies kann auf oberflächlicher Ebene funktionieren, aber sobald eine nicht standardmäßige Aufgabe entsteht, ist die Integration in ein echtes Projekt oder die Notwendigkeit einer Feinabstimmung erforderlich, alles bröckelt.

Mangel an Kontext und veralteten Praktiken

Die neuronalen Netzwerke generieren den Code verallgemeinert. Sie berücksichtigen die Einzelheiten Ihrer Plattform, der Version von Bibliotheken, Umgebungsbeschränkungen oder architektonischen Lösungen des Projekts nicht. Was generiert wird, sieht oft plausibel aus, hat aber nichts mit dem realen, unterstützten Code zu tun. Selbst einfache Empfehlungen funktionieren möglicherweise nicht, wenn sie zur veralteten Version des Frameworks oder zur Verwendung von Ansätzen angehören, die seit langem als unwirksam oder unsicher anerkannt werden. Modelle verstehen den Kontext nicht – sie stützen sich auf Statistiken. Dies bedeutet, dass Fehler und Antipatttern, die im offenen Code beliebt sind, immer wieder reproduziert werden.

Redundanz, Ineffizienz und Mangel an Profilerstellung

Der generierte KI ist oft überflüssig. Es enthält unnötige Abhängigkeiten, doppelte Logik, fügt unnötig Abstraktionen hinzu. Es stellt sich eine ineffektive, schwere Struktur heraus, die schwer zu unterstützen ist. Dies ist besonders akut in der mobilen Entwicklung, wo die Größe der Bande, die Reaktionszeit und der Energieverbrauch von entscheidender Bedeutung sind.

Das neuronale Netzwerk führt keine Profilerstellung durch, berücksichtigt nicht die Einschränkungen der CPU und der GPU und kümmert sich nicht um die Speicherlecks. Es wird nicht analysiert, wie effektiv der Code in der Praxis ist. Die Optimierung ist immer noch handgefertigt und erfordert eine Analyse und Untersuchung. Ohne sie wird die Anwendung langsam, instabil und ressourcenintensiv, auch wenn sie aus Sicht der Struktur „rechts“ aussehen.

Verwundbarkeit und eine Bedrohung für die Sicherheit

Vergessen Sie die Sicherheit nicht. Es sind bereits Fälle bekannt, in denen Projekte, die teilweise oder vollständig mit LLM erstellt wurden, erfolgreich gehackt wurden. Die Gründe sind typisch: Die Verwendung unsicherer Funktionen, mangelnde Überprüfung der Eingabedaten, Fehler in der Logik der Autorisierung, Lecks durch externe Abhängigkeiten. Das neuronale Netzwerk kann einen gefährdeten Code generieren, nur weil es in offenen Repositorys gefunden wurde. Ohne die Teilnahme von Sicherheitsspezialisten und eine vollständige Überarbeitung werden solche Fehler leicht zu Eingabepunkten für Angriffe.

Das Gesetz ist Pareto und die Essenz der Fehler

Das Pareto -Gesetz arbeitet eindeutig mit neuronalen Netzwerken zusammen: 80% des Ergebnisses werden aufgrund von 20% der Anstrengungen erzielt. Das Modell kann eine große Menge Code generieren, die Grundlage des Projekts erstellen, die Struktur verbreiten, Typen anordnen, Module verbinden. All dies kann jedoch veraltet sein, mit aktuellen Versionen von Bibliotheken oder Frameworks nicht kompatibel sein und eine erhebliche manuelle Überarbeitung erfordern. Die Automatisierung funktioniert hier eher als Entwurf, der überprüft, verarbeitet und an bestimmte Realitäten des Projekts angepasst werden muss.

Vorsichtsoptimismus

Trotzdem sieht die Zukunft ermutigend aus. Konstante Aktualisierung von Trainingsdatensätzen, Integration in die aktuelle Dokumentation, automatisierte Architekturprüfungen, Einhaltung von Design- und Sicherheitsmustern – all dies kann die Spielregeln radikal ändern. Vielleicht können wir in ein paar Jahren den Code wirklich schneller, sicherer und effizienter schreiben und sich als echter technischer Co -Autor auf LLM verlassen. Aber vorerst – leider – muss viel manuell überprüft, umgeschrieben und modifiziert werden.

Neuronale Netze sind ein leistungsstarkes Werkzeug. Aber damit er für Sie und nicht gegen Sie arbeitet, benötigen Sie eine Basis, ein kritisches Denken und eine Bereitschaft, die Kontrolle jederzeit zu übernehmen.

Gingerita -Prototypfenster

Ich präsentiere Ihre Aufmerksamkeit Gabel Kate Texteditor namens Gingerita. Warum Fork, warum, was ist das Ziel? Ich möchte die Funktionalität hinzufügen, die ich in meiner Arbeit benötige, um nicht auf die Korrektur zu warten, Funktionen vom Kate -Team oder die Übernahme meiner Korrekturen in den Hauptzweig hinzuzufügen.
Derzeit ist eine Prototypversion für Windows verfügbar, fast Vanilleversion von Kate mit minimalen Änderungen. Für Gingerita habe ich zwei Stecker entwickelt – ein Bild der Bilder direkt aus dem Editor und dem gebauten Browser, um meine Webprojekte zu debuggen oder mit AI mit Assistenten wie ChatGPT zu interagieren.

Die Version für Windows kann durch den folgenden Link getestet werden:
https://github.com/demensdeum/Gingerita/releases/tag/prototype

Unterstützung für Demensdeum -Produkte

Willkommen auf der Support -Seite!

Wenn Sie Fragen, Probleme mit Demensdeum -Produkten haben oder Verbesserungen anbieten möchten, sind wir immer bereit zu helfen.

Wie man uns in Verbindung setzt:
support@demensdeum.com

Wir versuchen, Berufungen innerhalb von 3-5 Werktagen zu beantworten.

Was im Brief anzeigen:

Der Name des Produkts
Version (falls bekannt)
Eine detaillierte Beschreibung des Problems
Screenshots oder Videos (wenn möglich)
Geräte- und Betriebssystem, bei dem das Problem auftrat

Wir danken Ihnen für die Verwendung unserer Produkte und bemühen uns, Ihre Erfahrung so bequem und angenehm wie möglich zu gestalten.

Aufrichtig,
Demensdeum -Team

Vibe-Core-Tricks: Warum LLM immer noch nicht mit festem, trockenem und sauberem funktioniert

Mit der Entwicklung von großsprachigen Modellen (LLM) wie Chatgpt verwenden immer mehr Entwickler sie, um Code, Designarchitektur und Beschleunigung der Integration zu generieren. Bei der praktischen Anwendung wird jedoch spürbar: Die klassischen Prinzipien der Architektur – solide, trocken, sauber – verstehen Sie die Besonderheiten der LLM -Codgendation schlecht.

Dies bedeutet nicht, dass die Prinzipien veraltet sind – im Gegenteil, sie arbeiten perfekt zur manuellen Entwicklung. Aber mit LLM muss der Ansatz angepasst werden.

Warum LLM nicht mit architektonischen Prinzipien fertig werden kann

Kapselung

Die Zusammenfassung erfordert das Verständnis der Grenzen zwischen Teilen des Systems, Kenntnissen über die Absichten des Entwicklers sowie den strengen Zugriffsbeschränkungen. LLM vereinfacht häufig die Struktur, macht Felder ohne Grund öffentlich oder dupliziert die Implementierung. Dies macht den Code anfälliger für Fehler und verstößt gegen die architektonischen Grenzen.

Abstracts und Schnittstellen

Entwurfsmuster wie eine abstrakte Fabrik oder Strategie erfordern eine ganzheitliche Sicht des Systems und das Verständnis seiner Dynamik. Modelle können eine Schnittstelle ohne klaren Zweck erstellen, ohne die Implementierung zu gewährleisten, oder gegen die Verbindung zwischen Schichten verstoßen. Das Ergebnis ist eine überschüssige oder nicht funktionsfähige Architektur.

trocken (Donolt wiederholt sich)

LLM bemüht sich nicht, den sich wiederholenden Code zu minimieren – im Gegenteil, es ist für sie einfacher, Blöcke zu duplizieren, als allgemeine Logik zu erstellen. Obwohl sie auf Anfrage auf Anfrage eingerichtet werden können, neigen Modelle neigen dazu, „selbstfassende“ Fragmente zu erzeugen, auch wenn dies zu Redundanz führt.

saubere Architektur

Clean impliziert eine strenge Hierarchie, Unabhängigkeit von Frameworks, gerichtete Abhängigkeit und minimale Verbindung zwischen Schichten. Die Erzeugung einer solchen Struktur erfordert ein globales Verständnis des Systems – und LLM arbeiten auf der Ebene der Wahrscheinlichkeit von Wörtern, nicht auf architektonischer Integrität. Daher ist der Code unter Verstoß gegen die Anweisungen der Abhängigkeit und eine vereinfachte Aufteilung in Ebenen gemischt.

Was funktioniert besser bei der Arbeit mit LLM

Nass statt trocken
Der nasses (zweimal alles schreiben) ist praktischer bei der Arbeit mit LLM. Die Duplikation von Code erfordert keinen Kontext aus dem Modell der Aufbewahrung, was bedeutet, dass das Ergebnis vorhersehbar ist und einfacher zu korrekt ist. Es reduziert auch die Wahrscheinlichkeit von nicht offenen Verbindungen und Fehler.

Darüber hinaus hilft die Duplikation, den kurzen Speicher des Modells zu kompensieren: Wenn ein bestimmtes Logikfragment an mehreren Stellen gefunden wird, berücksichtigt LLM es mit größerer Wahrscheinlichkeit mit weiterer Generation. Dies vereinfacht die Begleitung und erhöht den Widerstand gegen “Vergessen”.

einfache Strukturen anstelle von Kapselung

Vermeiden Sie eine komplexe Kapselung und stützen sich auf die direkte Übertragung von Daten zwischen den Teilen des Codes und können sowohl die Generation als auch das Debuggen erheblich vereinfachen. Dies gilt insbesondere für eine schnelle iterative Entwicklung oder Schaffung von MVP.

vereinfachte Architektur

Eine einfache, flache Struktur des Projekts mit einer minimalen Menge an Abhängigkeiten und Abstraktionen liefert während der Erzeugung ein stabileres Ergebnis. Das Modell passt einen solchen Code leichter an und verletzt die erwarteten Verbindungen zwischen den Komponenten.

SDK -Integration – Manuell zuverlässig


Die meisten Sprachmodelle werden auf veralteten Dokumentationsversionen geschult. Bei der Erstellung von Anweisungen zur Installation von SDK werden daher häufig Fehler angezeigt: veraltete Befehle, irrelevante Parameter oder Links zu unzugänglichen Ressourcen. Praxis zeigt: Es ist am besten, offizielle Dokumentation und manuelle Abstimmung zu verwenden und LLM eine Hilfsrolle zu hinterlassen – beispielsweise eine Vorlagencode oder eine Anpassung von Konfigurationen zu generieren.

Warum funktionieren die Prinzipien noch – aber mit manueller Entwicklung

Es ist wichtig zu verstehen, dass die Schwierigkeiten von festem, trockenem und sauberem Zusammenhang die Codhegeneration durch LLM betreffen. Wenn der Entwickler den Code manuell schreibt, demonstrieren diese Prinzipien weiterhin seinen Wert: Sie reduzieren die Verbundenheit, vereinfachen die Unterstützung und erhöhen die Lesbarkeit und Flexibilität des Projekts.

Dies liegt an der Tatsache, dass menschliches Denken anfällig für die Verallgemeinerung ist. Wir suchen nach Mustern, wir bringen wiederholte Logik in einzelne Entitäten und erstellen Muster. Wahrscheinlich hat dieses Verhalten evolutionäre Wurzeln: Reduzierung der Anzahl der Informationen spart kognitive Ressourcen.

LLM handelt anders: Sie erleben keine Lasten aus dem Datenvolumen und streben nicht nach Einsparungen. Im Gegenteil, es ist für sie einfacher, mit doppelten, fragmentierten Informationen zu arbeiten, als komplexe Abstraktionen aufzubauen und aufrechtzuerhalten. Aus diesem Grund ist es für sie einfacher, mit dem Code ohne Kapselung fertig zu werden, mit wiederholenden Strukturen und minimaler architektonischer Schwere.

Schlussfolgerung

Großsprachenmodelle sind ein nützliches Instrument in der Entwicklung, insbesondere in den frühen Stadien oder beim Erstellen eines Hilfscode. Es ist jedoch wichtig, den Ansatz an sie anzupassen: die Architektur zu vereinfachen, die Abstraktion zu begrenzen, komplexe Abhängigkeiten zu vermeiden und bei der Konfiguration von SDK nicht auf sie zu verlassen.

Die Prinzipien von fester, trocken und sauber sind immer noch relevant, aber sie haben den besten Effekt in den Händen einer Person. Bei der Arbeit mit LLM ist es vernünftig, einen vereinfachten, praktischen Stil zu verwenden, der es Ihnen ermöglicht, einen zuverlässigen und verständlichen Code zu erhalten, der leicht manuell abschließen kann. Und wo LLM vergisst – die Duplizierung von Code hilft ihm, sich zu erinnern.

Demens TV -Köpfe NFT

Ich möchte mein neues Projekt teilen-die NFT-Kollektion „Demens TV Heads“.

Dies ist eine Reihe digitaler Kunstwerke, die Menschen unterschiedlicher Charaktere und Berufe im Stil des Demensdeum -Logos widerspiegeln.
Die erste Arbeit ist heftig “Grozny” Dies ist ein stilisierter Selbstporträt.

Ich habe vor, nur 12 NFT zu veröffentlichen, einen jeden Monat.

Jede Arbeit existiert nicht nur in der Ethereum-Blockchain, sondern ist auch auf der Demensdeum-Website und in den Github-Roads zusammen mit Metadan verfügbar.

Wenn Sie interessiert sind, sehen oder einfach visuell bewerten, werde ich mich freuen:
https://opensea.io/collection/demens-tv-heads
https://github.com/demensdeum/demens-tv-heads-collection
https://demensdeum.com/collections/demens-tv-heads/fierce.png
https://demensdeum.com/collections/demens-tv-heads/fierce-metadata.txt

Superprogrammierer

Wer ist er – dieser mysteriöse, kurzlebige, fast mythische Superprogrammierer? Eine Person, deren Code beim ersten Mal kompiliert wird, wird aus dem halben Pike gestartet und geht sofort in den Produkt. Die Legende übertraf in Bytes von Senor bis Jun. Derjenige, der Bugs speziell schreibt, damit andere nicht gelangweilt sind. Lassen Sie uns ehrlich gesagt mit Wärme und Ironie herausfinden, welche Superkräfte er diesen digitalen Umhang tragen muss.

1. schreibt über C/C ++ ohne einheitliche Verwundbarkeit
Pufferüberlauf? Ich habe noch nie davon gehört.
Der Superprogrammierer in C ++ hat keine unpraktischen Variablen – sie selbst werden aus Respekt initialisiert. Er schreibt New Char [256], und der Compiler fügt stillschweigend eine Überprüfung der Grenzen hinzu. Wo andere einen Haltepunkt setzen – er schaut. Und der Fehler verschwindet.

2. schreibt Fichs ohne Fehler und Tests
Er braucht keine Tests. Sein Code testet sich nachts, wenn er schläft (obwohl … schläft er?). Jede Zeile ist eine endgültige stabile Version, sofort mit Unterstützung von 12 Sprachen und der NASA -zugänglichen Ebene. Und wenn der Fehler immer noch auftrat, testet das Universum ihn.

3. Es funktioniert schneller als AI
Während Chatgpt “Was für eine gute Frage!” Drucken, hat der Superprogrammierer das neue Betriebssystem bereits gesperrt, es auf den Toaster portiert und alles in Markdown mit Diagrammen dokumentiert. Er fragt Stackoverflow nicht – er unterstützt ihn mit seinen Fragen aus der Zukunft. GPT studiert über seine Gemeinden.

4. Er versteht den Code eines anderen besser als der Autor
“Natürlich habe ich es geschrieben … aber ich verstehe nicht, wie es funktioniert.” – ein gewöhnlicher Autor.
“Oh, dies ist auf den rekursiven Aufruf in Zeile 894 zurückzuführen, der mit dem Nebeneffekt im Regex -Filter gebunden ist.” Smart. ” – Superprogrammierer ohne Blinken.
Er liest Perl beim ersten Versuch, versteht die Abkürzungen in den Namen von Variablen, und Fehler erfasst durch Vibration des Cursors.

5. schreibt den Cross -Plattform -Code auf den Assembler
Warum auf reinem X86, ARM und RISC-V sofort auf Rost schreiben, mit einer Flagge “funktioniert überall überall”? Er hat seinen eigenen Tisch der Gegner. Sogar die CPU denkt, bevor er seine Anweisungen verwöhnt. Er optimiert nicht – er transzendiert.

6. Er beantwortet Fragen zu den Fristen bis zu einer Sekunde
“Wann wird es fertig sein?”
“Nach 2 Stunden, 17 Minuten und 8 Sekunden. Und ja, das berücksichtigt die Fehler, eine Rauchpause und eine philosophische Frage im Chat.”
Wenn jemand darum bittet, schneller zu tun, baut er einfach die Raumzeit durch Make-Jives wieder auf.

7. Umkehrt und reparieren proprietäre Rahmenbedingungen
Proprietary SDK fiel ab, API ohne Dokumentation, alles wird von Base92 verschlüsselt und hustet Segfaults? Für einen Super -Programmer ist dies ein gewöhnlicher Dienstag. Er wird ein binäres, einatme Hex, und eine Stunde später wird es einen Patch mit einem Fix, Verbesserungen der Leistung und dem hinzugefügten Dunklen Modus geben.

8. Designer und UX -Spezialist für sich selbst
Die UI kommt für ihn heraus, dass die Leute vor Schönheit weinen und die Knöpfe von Intuition erraten werden. Sogar Katzen Cope – verifiziert. Er zeichnet keine Schnittstelle – er öffnet seine innere Essenz, wie ein Bildhauer im Marmor. Jede Presse ist begeistert.

9. Durchführt Marketingforschung zwischen Commits
Zwischen Git Push und Coffee Pause schafft er es, Marktanalysen zu sammeln, einen Verkaufstrichter aufzubauen und die Monetarisierungsstrategie zu überdenken. Am Wochenende testet Hypothesen. Er hat A/B -Tests, die automatisch gestartet werden, wenn er einen Laptop eröffnet.

10. Wiederholt Microsoft allein
Das für Unternehmen 10 Jahre und tausend Ingenieure, für ihn – Freitagabend und gute Pizza. Windows 11? Hat Windows 12. Büro? Schon da. Excel? Er arbeitet am Sprachmanagement und hilft, einen Urlaub zu planen. Alles funktioniert besser und wiegt weniger.

11. Entfaltet und unterstützt die Infrastruktur für 1 Million Benutzer
Sein hausgemachtes Nas ist ein Kubernetes -Klistel. Überwachung? Grafana mit Meme. Es entfaltet die API schneller als einige, um den Postboten zu öffnen. Er hat alles dokumentiert, automatisiert und zuverlässig wie eine sowjetische Teekanne.

12. Technischer Support ist nicht erforderlich
Benutzer beschweren sich nicht darüber. Sie benutzen es einfach mit Ehrfurcht. FAQ? Nicht benötigt. Tutorials? Intuition wird es sagen. Er ist der einzige Entwickler, der die Schaltfläche “Hilfe” zur Dankbarkeitsseite hat.

13. Er schläft nicht, isst nicht, ist nicht abgelenkt
Er ernährt sich von Koffein und dem reinen Wunsch, einen Code zu schreiben. Anstelle des Schlafes, umzuarbeiten. Anstatt zu essen – Debian -Pakete. Sein Lebenszyklus ist ein kontinuierlicher Entwicklungszyklus. CI/CD ist keine Pipeline, dies ist ein Lebensstil.

14. Kommuniziert mit Kunden ohne Schmerzen
“Wir müssen Uber, aber in zwei Tagen nur besser machen.” – “Schau: Hier ist Roadmap, hier sind die Risiken, hier ist der MVP. Und lassen Sie uns zunächst über die Ziele entscheiden.”
Er weiß, wie man nein sagt “, damit der Kunde antwortet:” Danke, jetzt verstehe ich, was ich will. ”

15. Sofort programmiert Kernreaktoren
Wie viel Wärme wird freigesetzt, wenn der Urankern aufgeteilt ist? Der Super -Programmer weiß. Und er weiß, wie man es in Rost, C, Swift, auch in Excel stiehlt. Sein Reaktor ist nicht nur sicher – er wird auch von OTA aktualisiert.

16. hat Kenntnisse in allen möglichen Bereichen
Philosophie, Physik, Steuerberichterstattung in der Mongolei – alles in seinem Kopf. Er nimmt an Quiz teil, wo er ein Anführer ist. Wenn er etwas nicht weiß, hat er einfach vorübergehend die Erinnerung ausgeschaltet, um Platz für neue Kenntnisse zu schaffen. Jetzt wird es zurückkehren.

17. Kennt alle Algorithmen und Designmuster
Keine Notwendigkeit, ihm zu erklären, wie a*, Dijkstra oder Singleton funktioniert. Er kam mit ihnen. Mit ihm verhalten sich die Muster richtig. Auch Antipatttern werden selbst korrigiert – vor Scham.

18. arbeitete in Apple, Google und links Langeweile
Er war überall: Apple, Google, NASA, IKEA (getestet die Schrankschnittstelle). Dann wurde mir klar, dass es bereits zu gut war, und ging, um kostenlose Open-Source-Projekte zum Vergnügen zu entwickeln. Er braucht kein Geld, weil:

19. Er hat Pontid Bitcoin und er ist Satoshi Nakamoto
Ja, er ist es. Sagt einfach nicht. Alle Brieftaschen mit Millionen von BTC befinden sich tatsächlich auf seinem Flash -Antrieb, ummauert in Beton. In der Zwischenzeit schreibt er Backend für eine Bauerngenossenschaft im Outback, weil “es interessant war, Kotlin Multiplattform zu probieren”.

Schlussfolgerung: Ein wenig Ernsthaftigkeit
Tatsächlich sind Programmierer gewöhnliche Menschen.
Wir irren uns. Wir werden müde. Manchmal sind wir so zuversichtlich, dass wir das Offensichtliche nicht sehen – und es ist dann, dass die teuersten Fehler in der Geschichte gemacht werden.

Daher lohnt es sich zu erinnern:

* Es ist unmöglich, alles zu wissen – aber es ist wichtig zu wissen, wo man nachsehen soll.
* In einem Team zu arbeiten ist keine Schwäche, sondern ein Weg zu einer besseren Entscheidung.
* Die Werkzeuge, die uns schützen, sind nicht „Krücken“, sondern Rüstung.
* Fragen ist normal. Zweifel zu bezweifeln, ist richtig. Fehler zu machen ist unvermeidlich. Lernen ist notwendig.
* Ironie ist unser Schild. Der Code ist unsere Waffe. Verantwortung ist unser Kompass.

Und Legenden über einen Super -Programmer erinnern daran, dass wir alle manchmal nach dem Unmöglichen streben. Und genau das ist in diesem – echten Programmiermagie.

Warum Dokumentation Ihr bester Freund ist

(Und wie nicht ein Guru sein kann, dessen Rat nach dem Update nicht mehr funktioniert)

“Apps dürfen nur öffentliche APIs verwenden und müssen auf dem derzeit Versandbetrieb ausgeführt werden.” Apple App Review -Richtlinien

Wenn Sie jemals mit einem neuen Framework gearbeitet haben und sich erwischt haben: “Jetzt verstehe ich alles, Dokumentation ist für Bohrungen”-Sie sind definitiv nicht allein. Viele Entwickler haben einen natürlichen Instinkt: zuerst versuchen und nur dann – lesen. Das ist in Ordnung.

Aber zu diesem Zeitpunkt können Sie leicht den richtigen Weg ausschalten und sich in einer Situation befinden, in der der Code funktioniert … aber erst heute und nur “ich habe”.

Warum ist es einfach, es herauszufinden – ist es nicht genug?

Freiimvorki, insbesondere geschlossen und proprietär, sind komplex und mehrfach. Sie haben eine Menge versteckter Logik-, Optimierungs- und Implementierungsfunktionen, die:

* nicht dokumentiert;
* nicht garantiert;
* kann sich jederzeit ändern;
* sind ein kommerzielles Geheimnis und können durch Patente geschützt werden
* Enthält Fehler, Fehler, die nur den Entwicklern des Frameworks bekannt sind.

Wenn Sie “auf eine Ahnung” handeln, können Sie leicht Architektur in zufälligen Beobachtungen aufbauen, anstatt die klar beschriebenen Regeln zu unterstützen. Dies führt dazu, dass der Code anfällig für Aktualisierungen und Kantenfälle wird.

Dokumentation ist keine Einschränkung, sondern Unterstützung

Die Entwickler von Frameworks erstellen aus einem bestimmten Grund Handbücher – dies ist eine Vereinbarung zwischen Ihnen und ihnen. Während Sie als Teil der Dokumentation fungieren, versprechen sie:

* Stabilität;
* Unterstützung;
* vorhersehbares Verhalten.

Wenn Sie über diesen Framework hinausgehen, wird alles, was als nächstes passiert, ausschließlich zu Ihrer Verantwortung.

Experimente? Sicherlich. Aber im Rahmen der Regeln.
Neugier ist die Super -VIA des Entwicklers. Erforschen Sie, versuchen Sie, nicht standardmäßige, Testgrenzen – all dies ist notwendig. Aber es gibt ein wichtiges “aber”: “:

Sie müssen im Rahmen der Dokumentation und der Best Practices experimentieren.

Dokumentation ist kein Gefängnis, sondern eine Karte. Sie zeigt, welche Möglichkeiten wirklich geplant und unterstützt werden. Es sind solche Experimente, die nicht nur nützlich, sondern auch sicher sind.

Vorsicht: Guru

Manchmal können Sie echte “Experten” begegnen:

* Sie führen Kurse durch
* Auf Konferenzen aufführen,
* Bücher und Blogs schreiben,
* teilte “ihren Ansatz” zum Framework.

Aber selbst wenn sie überzeugend klingen, ist es wichtig, sich zu erinnern:
Wenn ihre Ansätze der Dokumentation widersprechen, sind sie instabil.

Solche “empirischen Muster” können:

* Arbeit nur an einer bestimmten Version des Frameworks;
* Seien Sie anfällig für Aktualisierungen;
* In unvorhersehbaren Situationen brechen.

Guru ist cool, wenn sie die Handbücher respektieren. Andernfalls müssen ihre Tipps durch offizielle Dokumentation gefiltert werden.

ein wenig solide

Drei Ideen aus soliden Prinzipien sind hier besonders relevant:

* Öffnen/geschlossenes Prinzip: Erweitern Sie das Verhalten durch eine öffentliche API, gehen Sie nicht in die Innenseiten.
* Liskov Substitionsprinzip: Verlassen Sie sich nicht auf die Umsetzung, verlassen Sie sich auf den Vertrag. Erkrankungen – Alles wird brechen, wenn die Implementierung ersetzt wird.
* Abhängigkeitsinversion: Hoch -Level -Module sollten nicht von Modulen mit niedrigem Level abhängen. Beide Typen sollten von Abstraktionen abhängen. Die Abstraktion sollte nicht von den Details abhängen. Details sollten von Abstraktionen abhängen.

Was bedeutet das in der Praxis? Wenn Sie ein Framework verwenden und direkt an seine internen Details gebunden sind, verstoßen Sie gegen dieses Prinzip.
Stattdessen müssen Sie die Abhängigkeit von öffentlichen Schnittstellen, Protokollen und Verträgen aufbauen, die der Rahmen offiziell unterstützt. Das gibt:

* Die beste Isolation Ihres Codes aus Änderungen im Framework;
* Die Fähigkeit, Abhängigkeiten einfach zu testen und zu ersetzen;
* Vorhersehbares Verhalten und Stabilität der Architektur.

Wenn Ihr Code von den Details und nicht von Abstraktionen abhängt, werden Sie buchstäblich in eine bestimmte Implementierung einbettet, die jederzeit verschwinden oder sich ändern kann.

Und wenn der Fehler?

Manchmal kommt es vor, dass Sie alles richtig gemacht haben, aber es funktioniert falsch. Dies passiert – Frameworks sind nicht perfekt. In diesem Fall:

* Sammeln Sie ein minimal reproduziertes Beispiel.
* Stellen Sie sicher, dass Sie nur dokumentierte API verwenden.
* Senden Sie einen Fehlerport-sie werden Sie definitiv verstehen und höchstwahrscheinlich helfen.

Wenn das Beispiel auf Hacks oder Bypass basiert, müssen die Entwickler es nicht unterstützen, und höchstwahrscheinlich wird Ihr Fall einfach vermissen.

wie man das Maximum aus dem Framework drückt

* Lesen Sie die Dokumentation. Ernsthaft.
* Befolgen Sie die Anleitungen und Empfehlungen der Autoren.
* Experiment – aber innerhalb des beschriebenen.
* Überprüfen Sie die Tipps (sogar die berühmtesten Lautsprecher!) Durch das Handbuch.
* Falten Sie Fehler mit minimalen Fällen und Respekt vor dem Vertrag.

Schlussfolgerung

Freiimvorki sind keine schwarzen Kisten, sondern Werkzeuge, die die Nutzungsregeln haben. Sie zu ignorieren bedeutet, den Code “nach zufällig” zu schreiben. Aber wir möchten, dass unser Code lange Zeit lebt, Benutzer begeistert und nicht vom kleinen Update abbricht.

Also: Vertrauen, aber überprüfen Sie. Und ja, lesen Sie die Handbücher. Sie sind Ihre Supermacht.

Quellen

https://developer.apple.com/app-store/review/guidelines/
https://en.wikipedia.org/wiki/SOLID
https://en.wikipedia.org/wiki/API
https://en.wikipedia.org/wiki/RTFM

Würfelkunstprojekt 2

Treffen – Cube Art Project 2

Die zweite Version des Stationseditors, die ohne WebAssembly vollständig auf reinem JavaScript umgeschrieben wurde.
Licht, schnell und startet direkt im Browser – nichts weiter.

Dies ist ein Experiment: Würfel, Farbe, Freiheit und eine kleine meditative 3D -Geometrie.
Sie können die Farben mit RGB-Sloders ändern, Szenen speichern und laden, sich im Raum bewegen und einfach spielen.

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

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

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

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.

Die Szenen können gespeichert und geladen werden. Erstellen Sie Ihre Welten, sparen Sie als JSON, teilen oder kehren später zur Verfeinerung zurück.

Docker -Sicherheit: Warum ist der Start von Root eine schlechte Idee

Docker ist zu einem unverzichtbaren Werkzeug in modernen DevOps und Entwicklung geworden. Sie können die Einkreisung isolieren, das Outfit vereinfachen und die Anwendungen schnell skalieren. Standardmäßig benötigt Docker jedoch eine Wurzel, und dies erzeugt eine potenziell gefährliche Zone, die in den frühen Stadien häufig ignoriert wird.

Warum arbeitet Docker von Root aus?

Docker verwendet die Funktionen der Linux: CGroups, Namespaces, Iptables, Mount, Networking und andere Systemfunktionen. Diese Operationen sind nur dem Super -Benutzer erhältlich.

Deshalb:
* Dockerd Dämon beginnt von der Wurzel,
* Docker -Befehle werden an diesen Dämon übertragen.

Dies vereinfacht die Arbeit und gibt die volle Kontrolle über das System, eröffnet jedoch gleichzeitig potenzielle Schwachstellen.

Warum ist es gefährlich: Container Breakout, CVE, RCE

Container Breakout

Bei schwacher Isolierung kann ein Angreifer Chroot oder Pivot_Root verwenden, um den Host einzugeben.

Beispiele für echte Angriffe:

* CVE-2019-5736-Vulnerabilität zum Runc, ermöglicht, die Anwendung umzuschreiben und den Code auf dem Host auszuführen.
* CVE-2021-3156-Vulnerabilität für sudo, dürfen eine Wurzel in den Container bekommen und herauskommen.

rce (Remote -Code -Ausführung)

Wenn die Anwendung im Container verwundbar ist und von der Stamme startet, ist RCE = vollständige Kontrolle über den Host.

rootloser Docker: Lösung des Problems

Um diese Risiken zu minimieren, erschien der rootless -Modus in Docker. In diesem Modus werden sowohl der Dämon als auch die Container im Namen des üblichen Benutzers ohne Root-Privilegies gestartet. Dies bedeutet, dass ein Angreifer auch dann nicht in der Lage sein wird, das Hostsystem zu schaden.
Es gibt Beschränkungen: Sie können keine Ports unter 1024 verwenden (z. B. 80 und 443), der -privilegierte Modus sowie einige Netzwerkmodi ist nicht verfügbar. In den meisten Entwicklungsszenarien und CI/CD Rootless Docker ist es jedoch mit seiner Aufgabe fertig und erhöht das Sicherheitsniveau erheblich.

Historisch gesehen starten Sie von Wurzel – Antipattern

In der Unix/Linux -Welt wurde von Anfang an das Prinzip der kleinsten Privilegien angewendet. Je weniger Rechte der Prozess, desto weniger Schaden kann es anrichten. Docker forderte zunächst einen Wurzelzugang, wird aber heute als potenzielle Bedrohung angesehen.

Quellen

https://docs.docker.com/engine/security/rootless/
https://rootlesscontaine.rs/

Das nicht bevorstehende Problem der Docker-Container: verborgene Schwachstellen

Das nicht bevorstehende Problem der Docker-Container: verborgene Schwachstellen

Was ist “abhängige Hölle” (DH)?

“Abhängigkeit Hell” (DH) ist ein Begriff, der ein Problem bezeichnet, das bei der Verwaltung von Abhängigkeiten in der Software auftritt. Die Hauptgründe sind im Konflikt der Versionen, die Schwierigkeiten bei der Integration verschiedener Bibliotheken und die Notwendigkeit, die Kompatibilität zwischen ihnen aufrechtzuerhalten. DH enthält die folgenden Aspekte:

– Versionskonflikte: Projekte erfordern häufig spezifische Versionen von Bibliotheken, und verschiedene Komponenten können von inkompatiblen Versionen derselben Bibliothek abhängen.
– Schwierigkeiten in Aktualisierungen: Die Aktualisierung der Abhängigkeiten kann zu unerwarteten Fehlern oder zu einer Zusammenbruch der Kompatibilität führen, auch wenn eine neue Version Korrekturen oder Verbesserungen enthält.
– Die Umgebung: Der Wunsch, die Umgebung zu isolieren und zu stabilisieren, führte zur Verwendung virtueller Umgebungen, Containerisierung und anderer Lösungen, die darauf abzielen, das Abhängigkeitsmanagement zu vereinfachen.

Es ist wichtig zu beachten, dass die Beseitigung von Schwachstellen zwar einer der Gründe für die Veröffentlichung aktualisierter Versionen der Bibliotheken ist, aber nicht die wichtigste treibende Kraft von DH ist. Das Hauptproblem besteht darin, dass jede Änderung – unabhängig davon, ob es Fehler korrigiert, eine neue Funktionalität hinzufügt oder Anfälligkeit eliminiert – eine Abhängigkeitskette verursachen kann, die die stabile Entwicklung und Unterstützung der Anwendung komplizieren.

Wie führte der Kampf gegen DH zur Schaffung von Docker?

Um die Probleme DH zu lösen, suchten die Entwickler nach Möglichkeiten, isolierte und stabile Umgebung für Anwendungen zu schaffen. Docker war eine Antwort auf diese Herausforderung. Containerisierung ermöglicht:

– Isolieren Sie die Umgebung: Alle Abhängigkeiten und Bibliotheken werden zusammen mit der Anwendung verpackt, wodurch stabile Arbeiten überall garantiert werden, wo Docker installiert ist.
– Vereinfachen Sie die Bereitstellung: Der Entwickler kann die Umgebung einmal konfigurieren und sie ohne zusätzliche Einstellungen auf Server bereitstellen.
– Konflikte minimieren: Da jede Anwendung in seinem eigenen Container arbeitet, wird das Risiko von Konflikten zwischen den Abhängigkeiten verschiedener Projekte erheblich reduziert.

Daher schlug Docker eine effektive Lösung vor, um das DH -Problem zu bekämpfen, sodass Entwickler sich auf die Logik der Anwendung und nicht auf die Schwierigkeiten bei der Einrichtung der Umgebung konzentrieren können.

Das Problem veralteter Abhängigkeiten im Docker

Trotz aller Vorteile von Docker ist eine neue Richtung der Probleme aufgetreten – die Veralterung von Abhängigkeiten. Dies geschieht aus mehreren Gründen:

1. Der Container friert rechtzeitig ein

Beim Erstellen eines Docker -Images wird ein bestimmter Status aller Pakete und Bibliotheken festgelegt. Selbst wenn nach dem Zusammenbau im Basisbild (z. Wenn das Bild nicht gesendet werden soll, kann die Anwendung jahrelang mit veralteten und potenziell gefährdeten Komponenten arbeiten.

2. Mangel an automatischen Updates

Im Gegensatz zu herkömmlichen Servern können Sie automatische Pakete über Systemmanager konfigurieren (z. B. “APT Upgrade” oder “NPM Update”), werden Container nicht automatisch aktualisiert. Das Update erfolgt nur, wenn das Bild erneut ausgewählt wird, was Disziplin und regelmäßige Kontrolle erfordert.

3.. Feste Abhängigkeiten

Um die Stabilität zu gewährleisten, beheben die Entwickler häufig die Version von Abhängigkeiten in Dateien wie `Redirements.txt` oder” package.json`. Dieser Ansatz verhindert unerwartete Änderungen, friert jedoch gleichzeitig den Zustand der Abhängigkeiten ein, auch wenn anschließend Fehler oder Anfälligkeit in ihnen festgestellt werden.

4. Verwenden von veralteten Basisbildern

Die für Behälter ausgewählten grundlegenden Bilder können im Laufe der Zeit ebenfalls veraltet sein. Wenn die Anwendung beispielsweise auf dem Bild von “Knoten: 16” basiert und die Entwickler aufgrund von Verbesserungen und Korrekturen bereits zu “Knoten: 18” umgestellt haben, bleibt Ihre Umgebung bei einer veralteten Version, auch wenn alles korrekt im Code funktioniert.

Wie vermeiden Sie Probleme mit veralteten Abhängigkeiten?

Fügen Sie regelmäßige Inspektionen für veraltete Abhängigkeiten und Schwachstellen im CI/CD -Prozess ein:

– für Python:

pip list --outdated

– für node.js:

npm outdated

– Verwenden Sie Tools, um Schwachstellen zu analysieren, z. B. “trivy”:

trivy image my-app

Überwachen Sie die Aktualisierungen der Grundbilder

Abonnieren Sie die Aktualisierungen der Basisbilder in Docker Hub oder die entsprechenden Repositorys auf GitHub, um rechtzeitig über kritische Korrekturen und Aktualisierungen zu erfahren.

Abschluss

Das Problem der Abhängigkeitshölle trat nicht nur aufgrund der Notwendigkeit auf, Verwundbarkeit zu beseitigen, sondern auch aufgrund von Schwierigkeiten bei der Verwaltung und Aktualisierung von Abhängigkeiten. Docker hat eine wirksame Lösung zur Bekämpfung von DH vorgeschlagen, die eine isolierte und stabile Umgebung für Anwendungen bereitstellt. Mit dem Aufkommen der Containerisierung entstand jedoch eine neue Aufgabe – die Notwendigkeit einer regelmäßigen Erneuerung von Bildern, um die Veralterung von Abhängigkeiten und das Erscheinen kritischer Anfälligkeit zu verhindern.

Für moderne DevOps -Spezialisten ist es wichtig, nicht nur die Probleme von Versionskonflikten zu lösen, sondern auch regelmäßig und automatisierte Steuerungspraktiken für die Relevanz von Abhängigkeiten einzuführen, damit die Behälter sicher und effektiv bleiben.

Builder -Muster: Phased Erstellen eines Objekts rechtzeitig

Einführung

Der letzte Artikel untersuchte den allgemeinen Fall der Verwendung des Builder -Musters, die Option wurde jedoch nicht berührt, wenn das Objekt rechtzeitig stadiert erstellt wird.
Builder Muster (Builder) ist eine generierende Designvorlage, mit der Sie nach und nach komplexe Objekte erstellen können. Es ist besonders nützlich, wenn das Objekt viele Parameter oder verschiedene Konfigurationen hat. Eines der interessanten Beispiele seiner Verwendung ist die Fähigkeit, den Prozess des Erstellens eines Objekts rechtzeitig zu trennen.
Manchmal kann das Objekt nicht sofort erstellt werden – seine Parameter können in verschiedenen Phasen des Programms bekannt werden.

Ein Beispiel auf Python

In diesem Beispiel wird das Objekt des Autos in Phasen erstellt: Zunächst wird ein Teil der Daten vom Server geladen, dann gibt der Benutzer die fehlenden Informationen ein.

import requests

def fetch_car_data():
    response = requests.get("https://api.example.com/car-info")
    return response.json()

builder = CarBuilder()

# Backend API data
car_data = fetch_car_data()
builder.set_model(car_data["model"])
builder.set_year(car_data["year"])

# User input
color = input("Car color: ")
builder.set_color(color)

gps_option = input("GPS feature? (yes/no): ").lower() == "yes"
builder.set_gps(gps_option)

car = builder.build()
print(car)

Stellen Sie sich einen API -Anruf vor, Dateneingabe treten in verschiedenen Teilen der Anwendung oder sogar in verschiedenen Bibliotheken auf. Dann wird die Verwendung des Builder -Musters offensichtlicher als in einem einfachen Beispiel oben.

Vorteile

– Die Ausgabe ist eine Immunstruktur, die keine optionalen Daten für die temporäre Montage speichern muss
– Das Objekt wird allmählich gesammelt
– Vermeiden Sie komplexe Designer
– Der Assembly -Code des Objekts ist nur in einer Essenz des Erbaus unvollständig
– Bequemlichkeit des Code verstehen

Quellen

https://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional-ebook/dp/B000SEIBB8
https://demensdeum.com/blog/2019/09/23/builder-pattern/

Demensdeum Coding Challenge #1

Starten Sie Demensdeum Coding Challenge #1
Preis 100 USDT
1. Wir müssen Render -Bilder für Windows 11 64 Bit schreiben
2. Rendern
https://demensdeum.com/logo/demens1.png
3. Das Bild sollte in die Anwendung integriert werden
4. Grafik -API – Direct3d oder DirectDraw
5. gewinnt, deren Anwendung in Bytes die kleinste Größe hat
6. Das Bild sollte 1 in 1 posely als original sein, speichern Sie Farben
7. Alle Sprachen/Frameworks erfordern keine zusätzliche Installation ->, damit Sie sofort mit der Anwendung starten können. Wenn die Lösung beispielsweise nur ein Python -Skript ist, ist eine solche Lösung nicht geeignet. Die Installation von Python, Pygame und manuellem Start ist erforderlich. Gutes Beispiel: Python -Drehbuch zusammen mit Python und Pygame in Exe, das ohne zusätzliche Installationen beginnt.
8. Geben Sie in Form eines Links zu einem öffentlichen Repository mit dem Quellcode Anweisungen zur Zusammenstellung der Anwendung. Gutes Beispiel: Ein Projekt mit den Anweisungen der Assembly bei der Visual Studio Community Edition

Frist: 1. Juni zusammenfassen den Wettbewerb

Referenzlösung auf ZIG + SDL3 + SDL3_IMAGE:
https://github.com/demensdeum/DemensDeum-Coding-Challenge-1

Geisterkontakte

In der App GhostContacts können Sie Kontakte zur geheimen Liste hinzufügen. Es gibt Unterstützung für dunkle und helle Themen, Lokalisierung, Export und Importe von CSV -Kontakten. Ein Notfallkennwort wird unterstützt, um die Liste der Kontakte zurückzusetzen, wenn der Benutzer plötzlich ein regelmäßiges Passwort für die Eingabe benötigt.

Anwendung online:
https://demensdeum.com/software/ghost-contacts/

Github:
https://github.com/demensdeum/GhostContacts

Warum ich mich für WordPress entschieden habe

Als ich 2015 begann, über die Gründung eines eigenen Blogs nachzudenken, stand ich vor der Frage: Welche Plattform sollte ich wählen? Nach langem Suchen und Vergleichen habe ich mich für WordPress entschieden. Dies war keine zufällige Wahl, sondern das Ergebnis einer Analyse der Fähigkeiten der Plattform sowie ihrer Vor- und Nachteile. Heute möchte ich meine Gedanken und Erfahrungen mit WordPress teilen.

Vorteile von WordPress

  • Benutzerfreundlichkeit
    Einer der Hauptgründe, warum ich mich für WordPress entschieden habe, ist die intuitive Benutzeroberfläche. Auch wenn Sie noch nie mit einem CMS gearbeitet haben, können Sie WordPress in wenigen Tagen beherrschen.
  • Eine riesige Anzahl an Plugins
    WordPress bietet Zugriff auf Tausende von kostenlosen und kostenpflichtigen Plugins. Mit diesen Erweiterungen können Sie nahezu alle Funktionen rund ums Bloggen hinzufügen, von der SEO-Optimierung bis zur Social-Media-Integration.
  • Skalierbarkeit
    WordPress eignet sich hervorragend für Blogs jeder Größe. Da ich mit einem einfachen persönlichen Blog begonnen habe, weiß ich, dass ich es durch das Hinzufügen neuer Features und Möglichkeiten leicht erweitern kann.
  • Große Themenauswahl
    Für WordPress stehen zahlreiche kostenlose und kostenpflichtige Themes zur Verfügung, mit denen Sie in kurzer Zeit ein recht ansprechendes Blog erstellen können. Das Erstellen eines individuellen Designs erfordert die sensible Hand eines Designers.
  • SEO-freundlich
    WordPress ist von Grund auf suchmaschinenfreundlich gestaltet. Mit Plugins wie Yoast SEO können Sie Ihre Inhalte einfach optimieren, um ihr Suchranking zu verbessern.
  • Community und Support
    WordPress hat eine der größten Communities der Welt. Wenn Sie ein Problem haben, finden Sie mit ziemlicher Sicherheit in Foren oder Blogs, die sich der Plattform widmen, eine Lösung.
  • Mehrsprachige Unterstützung
    Dank Plugins wie WPGlobus kann ich in mehreren Sprachen bloggen, was besonders wichtig ist, wenn ich mit Zielgruppen aus verschiedenen Ländern arbeite.

Nachteile von WordPress

  • Anfälligkeit für Angriffe
    Aufgrund seiner Popularität ist WordPress ein Ziel für Hacker. Ohne angemessenen Schutz kann eine Site Opfer von Angriffen werden. Regelmäßige Updates und die Installation von Sicherheits-Plugins helfen jedoch, Risiken zu minimieren.
  • Plugin-Abhängigkeit
    Manchmal erfordert die Funktionalität, die Sie hinzufügen möchten, die Installation mehrerer Plugins. Dies kann Ihr Blog verlangsamen und Konflikte zwischen Erweiterungen verursachen.
  • Leistungsschwierigkeiten
    Bei großen Blogs kann WordPress langsamer werden, insbesondere wenn Sie viele Plugins verwenden. Um dieses Problem zu lösen, müssen Sie die Datenbank optimieren, Caching implementieren und leistungsfähigeres Hosting verwenden.
  • Kosten einiger Funktionen
    Während die Basisversion von WordPress kostenlos ist, sind viele professionelle Themes und Plugins kostenpflichtig. Manchmal muss man investieren, um das Beste herauszuholen.

Fazit

WordPress ist ein Tool, das die perfekte Balance zwischen Einfachheit und Leistung bietet. Für mich überwiegen die Vorteile die Nachteile, insbesondere angesichts der großen Anzahl an Lösungen, mit denen diese überwunden werden können. Dank WordPress konnte ich einen Blog erstellen, der perfekt auf meine Bedürfnisse zugeschnitten ist.

Wordex – Schnellleseprogramm für iOS

Ich habe kürzlich eine Schnelllese-App gefunden, die ich Ihnen gerne empfehlen möchte.

Schnelllesen ist eine Fähigkeit, die Ihre Produktivität erheblich steigern, Ihr Leseverständnis verbessern und Zeit sparen kann. Es gibt viele Apps auf dem Markt, die versprechen, Ihnen dabei zu helfen, diese Fähigkeit zu erlernen, aber eine sticht heraus: Wordex für iOS. In diesem Artikel verraten wir Ihnen, was Wordex ist, welche Funktionen es hat, für wen es geeignet ist und warum es Aufmerksamkeit verdient.

Was ist Wordex?

Wordex ist eine iOS-App, die speziell für die Entwicklung von Schnelllesefähigkeiten entwickelt wurde. Es hilft Benutzern, Texte schneller zu lesen, sich auf wichtige Ideen zu konzentrieren und Ablenkungen zu vermeiden. Das Programm basiert auf wissenschaftlichen Ansätzen und bietet praktische Tools zur Verbesserung Ihrer Lesegeschwindigkeit.

Hauptfunktionen von Wordex

  • Schnelllesemodus: Der Text wird für eine schnelle Wahrnehmung optimiert angezeigt. Benutzer können die Geschwindigkeit der Textanzeige nach Bedarf anpassen.
  • Fortschrittsanalyse: Das Programm liefert detaillierte Statistiken, einschließlich Lesegeschwindigkeit und Verbesserungsdynamik. Dies hilft Ihnen, Ihren Fortschritt zu bewerten und Ihren Leseansatz anzupassen.
  • Texte importieren: Wordex ermöglicht es Ihnen, Ihre eigenen Texte zum Üben hochzuladen. Sie können Artikel, Bücher oder Lehrmaterialien direkt in der Anwendung lesen.
  • Intuitive Benutzeroberfläche: Die Anwendung ist in einem minimalistischen Stil gestaltet, was die Verwendung erleichtert. Selbst Anfänger können die Funktionalität leicht verstehen.


Wordex Screenshot 1

Für wen ist Wordex geeignet?

Wordex ist perfekt für:

  • Studenten:die Lernmaterialien schnell lesen und sich auf Prüfungen vorbereiten müssen.
  • Geschäftsleute und Büroangestellte:die eine große Menge an Informationen in kürzester Zeit verarbeiten möchten.
  • Leser:die mehr Bücher lesen und den Prozess genießen möchten.


Wordex Screenshot 2

Vorteile von Wordex

  • Mobilität:Dank der Anwendung auf Ihrem iPhone oder iPad können Sie überall und jederzeit lernen.
  • Personalisierung:die Möglichkeit, die Textanzeige an Ihre Bedürfnisse anzupassen.


Wordex Screenshot 3

Warum sollten Sie Wordex ausprobieren?

Wordex ist nicht nur ein Tool zum Erlernen des Schnelllesens. Dies ist ein Programm, das die Konzentration fördert, den Wortschatz erweitert und die Produktivität steigert. Wenn Sie Wordex ausprobieren, werden Sie feststellen, dass Lesen keine lästige Pflicht mehr ist, sondern zu einer spannenden Aktivität wird.

Schlussfolgerung

Wenn Sie Schnelllesen erlernen oder vorhandene Fähigkeiten verbessern möchten, ist Wordex eine gute Wahl. Die einfach zu bedienende und effektive Anwendung hilft Ihnen, Ihre Ziele zu erreichen und wertvolle Zeit zu sparen. Laden Sie Wordex aus dem App Store herunter und beginnen Sie noch heute mit dem Training!

AppStore:
https://apps.apple.com/us/app/speed-reading-book-reader-app/id1462633104

Warum TROCKEN wichtig ist

Es gibt viele Artikel zum Thema DRY, ich empfehle die Lektüre der Originalquelle „The Pragmatist Programmer“ von Andy Hunt und Dave Thomas. Allerdings sehe ich immer noch, wie viele Entwickler Fragen zu diesem Prinzip in der Softwareentwicklung haben.

Das DRY-Prinzip besagt, dass wir uns nicht wiederholen sollten. Dies gilt sowohl für den Code als auch für die Prozesse, die wir als Programmierer ausführen. Beispielcode, der gegen DRY verstößt:

class Client {
    public let name: String
    private var messages: [String] = []
    
    init(name: String) {
        self.name = name
    }
    
    func receive(_ message: String) {
        messages.append(message)
    }
}

class ClientController {
    func greet(client: Client?) {
        guard let client else {
            debugPrint("No client!")
            return
        }
        client.receive("Hello \(client.name)!")
    }

    func goodbye(client: Client?) {
        guard let client else {
            debugPrint("No client!!")
            return
        }
        client.receive("Bye \(client.name)!")
    }
}

Wie Sie in den Methoden „greet“ und „goodbye“ sehen können, wird eine optionale Instanz der Client-Klasse übergeben, die dann auf Null überprüft werden muss, und dann können Sie mit der Arbeit beginnen. Um der DRY-Methode zu entsprechen, müssen Sie die doppelte Nullprüfung für die Klasseninstanz entfernen. Dies kann auf viele Arten implementiert werden; eine Möglichkeit besteht darin, die Instanz an den Klassenkonstruktor zu übergeben, wonach keine Überprüfungen erforderlich sind.

Wir halten DRY ein, indem wir die ClientController-Spezialisierung auf einer einzelnen Client-Instanz verwenden:

class Client {
    public let name: String
    private var messages: [String] = []
    
    init(name: String) {
        self.name = name
    }
    
    func receive(_ message: String) {
        messages.append(message)
    }
}

class ClientController {
    private let client: Client

    init(client: Client) {
        self.client = client
    }

    func greet() {
        client.receive("Hello \(client.name)!")
    }

    func goodbye() {
        client.receive("Bye \(client.name)!")
    }
}

DRY betrifft auch Prozesse, die während der Softwareentwicklung auftreten. Stellen wir uns eine Situation vor, in der ein Entwicklungsteam selbst eine Version auf den Markt hochladen muss und sie dadurch von der Softwareentwicklung ablenkt. Dies ist ebenfalls ein Verstoß gegen DRY. Diese Situation wird durch die Anbindung einer CI/CD-Pipeline gelöst, in der das Release automatisch veröffentlicht wird, sofern bestimmte Bedingungen von den Entwicklern erfüllt werden.

Im Allgemeinen geht es bei DRY um das Fehlen von Wiederholungen sowohl in Prozessen als auch im Code. Dies ist auch aufgrund des menschlichen Faktors wichtig: Code, der weniger sich wiederholenden, verrauschten Code enthält, lässt sich leichter auf Fehler überprüfen; Automatisierte Prozesse machen es für Menschen unmöglich, bei der Ausführung Fehler zu machen, da kein Mensch beteiligt ist.

Steve Jobs hatte ein Sprichwort: „Eine Codezeile, die Sie nie schreiben mussten, ist eine Codezeile, die Sie nie debuggen mussten.“

Quellen

https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/
https://youtu.be/-msIEOGvTYM

Ich helfe Ihnen bei der Entwicklung von iOS für Swift oder Objective-C

Ich freue mich, Ihnen mitteilen zu können, dass ich meine Dienste jetzt als iOS-Entwickler auf Fiverr anbiete. Wenn Sie Hilfe bei der Entwicklung hochwertiger iOS-Apps oder der Verbesserung bestehender Projekte benötigen, schauen Sie sich mein Profil an:
https://www.fiverr.com/s/Q7x4kb6

Ich würde mich freuen, die Möglichkeit zu haben, an Ihrem Projekt mitzuarbeiten.
E-Mail: demensdeum@gmail.com
Telegramm: https://t.me/demensdeum

Dynamische Verknüpfung von Qt-Anwendungen unter macOS

Heute habe ich eine Version von RaidenVideoRipper für Apple-Geräte mit macOS und M1/M2/M3/M4-Prozessoren (Apple Silicon) veröffentlicht. RaidenVideoRipper ist eine schnelle Videobearbeitungsanwendung, mit der Sie einen Teil einer Videodatei in eine neue Datei schneiden können. Sie können auch GIFs erstellen und die Audiospur als MP3 exportieren.

Als nächstes werde ich kurz beschreiben, welche Befehle ich verwendet habe, um dies zu erreichen. Die Theorie, was hier passiert, die Dokumentation der Versorgungsunternehmen, kann unter den folgenden Links nachgelesen werden:
https://www.unix.com/man-page/osx/1/otool/
https://www.unix.com/man-page/osx/1/install_name_tool/
https://llvm.org/docs/CommandGuide/llvm-nm.html
https://linux.die.net/man/1/file
https://www.unix.com/man-page/osx/8/SPCTL/
https://linux.die.net/man/1/chmod
https://linux.die.net/man/1/ls
https://man7.org/linux/man-pages/man7/xattr.7.html
https://doc.qt.io/qt-6/macos-deployment.html

Installieren Sie zunächst Qt auf Ihrem macOS und installieren Sie auch die Umgebung für Qt Desktop Development. Anschließend stellen Sie Ihr Projekt beispielsweise in Qt Creator zusammen. Anschließend beschreibe ich, was erforderlich ist, um sicherzustellen, dass Abhängigkeiten mit externen dynamischen Bibliotheken bei der Verteilung der Anwendung an Endbenutzer korrekt verarbeitet werden.

Erstellen Sie ein Frameworks-Verzeichnis im Ordner YOUR_APP.app/Contents Ihrer Anwendung und platzieren Sie darin externe Abhängigkeiten. So sehen beispielsweise die Frameworks für die RaidenVideoRipper-Anwendung aus:

Frameworks
├── DullahanFFmpeg.framework
│   ├── dullahan_ffmpeg.a
│   ├── libavcodec.60.dylib
│   ├── libavdevice.60.dylib
│   ├── libavfilter.9.dylib
│   ├── libavformat.60.dylib
│   ├── libavutil.58.dylib
│   ├── libpostproc.57.dylib
│   ├── libswresample.4.dylib
│   └── libswscale.7.dylib
├── QtCore.framework
│   ├── Headers -> Versions/Current/Headers
│   ├── QtCore -> Versions/Current/QtCore
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
├── QtGui.framework
│   ├── Headers -> Versions/Current/Headers
│   ├── QtGui -> Versions/Current/QtGui
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
├── QtMultimedia.framework
│   ├── Headers -> Versions/Current/Headers
│   ├── QtMultimedia -> Versions/Current/QtMultimedia
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
├── QtMultimediaWidgets.framework
│   ├── Headers -> Versions/Current/Headers
│   ├── QtMultimediaWidgets -> Versions/Current/QtMultimediaWidgets
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
├── QtNetwork.framework
│   ├── Headers -> Versions/Current/Headers
│   ├── QtNetwork -> Versions/Current/QtNetwork
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
└── QtWidgets.framework
    ├── Headers -> Versions/Current/Headers
    ├── QtWidgets -> Versions/Current/QtWidgets
    ├── Resources -> Versions/Current/Resources
    └── Versions

Der Einfachheit halber habe ich nur die zweite Verschachtelungsebene gedruckt.

Als nächstes drucken wir die aktuellen dynamischen Abhängigkeiten Ihrer Anwendung aus:

otool -L RaidenVideoRipper 

Ausgabe für die RaidenVideoRipper-Binärdatei, die sich in RaidenVideoRipper.app/Contents/MacOS befindet:

RaidenVideoRipper:
	@rpath/DullahanFFmpeg.framework/dullahan_ffmpeg.a (compatibility version 0.0.0, current version 0.0.0)
	@rpath/QtMultimediaWidgets.framework/Versions/A/QtMultimediaWidgets (compatibility version 6.0.0, current version 6.8.1)
	@rpath/QtWidgets.framework/Versions/A/QtWidgets (compatibility version 6.0.0, current version 6.8.1)
	@rpath/QtMultimedia.framework/Versions/A/QtMultimedia (compatibility version 6.0.0, current version 6.8.1)
	@rpath/QtGui.framework/Versions/A/QtGui (compatibility version 6.0.0, current version 6.8.1)
	/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 2575.20.19)
	/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/Metal.framework/Versions/A/Metal (compatibility version 1.0.0, current version 367.4.0)
	@rpath/QtNetwork.framework/Versions/A/QtNetwork (compatibility version 6.0.0, current version 6.8.1)
	@rpath/QtCore.framework/Versions/A/QtCore (compatibility version 6.0.0, current version 6.8.1)
	/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
	/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers (compatibility version 1.0.0, current version 709.0.0)
	/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1800.101.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1351.0.0)

Wie im RaidenVideoRipper in den Qt- und dullahan_ffmpeg-Abhängigkeiten zu sehen ist. Dullahan FFmpeg ist ein Zweig von FFmpeg, der seine Funktionalität in einer dynamischen Bibliothek kapselt und die Möglichkeit bietet, den aktuellen Ausführungsfortschritt und den Abbruch mithilfe von C-Routinen abzurufen.
Ersetzen Sie als Nächstes die Pfade der Anwendung und aller erforderlichen Bibliotheken durch install_name_tool.

Der Befehl hierfür lautet:

install_name_tool -change old_path new_path target

Anwendungsbeispiel:

install_name_tool -change /usr/local/lib/libavfilter.9.dylib @rpath/DullahanFFmpeg.framework/libavfilter.9.dylib dullahan_ffmpeg.a

Nachdem Sie alle Pfade korrekt eingegeben haben, sollte die Anwendung korrekt starten. Überprüfen Sie, ob alle Pfade zu Bibliotheken relativ sind, übertragen Sie die Binärdatei und öffnen Sie sie erneut.
Wenn Sie einen Fehler sehen, überprüfen Sie die Pfade über otool und ändern Sie sie erneut über install_name_tool.

Es gibt auch einen Fehler bei der Verwechslung von Abhängigkeiten. Wenn die von Ihnen ersetzte Bibliothek kein Symbol in der Tabelle hat, können Sie das Vorhandensein oder Fehlen eines Symbols wie folgt überprüfen:

nm -gU path

Nach der Ausführung sehen Sie die gesamte Symboltabelle der Bibliothek oder Anwendung.
Es ist auch möglich, dass Sie die Abhängigkeiten der falschen Architektur kopiert haben. Sie können dies mit der Datei überprüfen:

file path

Das Dateidienstprogramm zeigt Ihnen, zu welcher Architektur die Bibliothek oder Anwendung gehört.

Qt benötigt außerdem einen Plugins-Ordner im Contents-Ordner Ihres YOUR_APP.app-Verzeichnisses. Kopieren Sie die Plugins von Qt nach Contents. Überprüfen Sie als Nächstes die Funktionalität der Anwendung. Anschließend können Sie mit der Optimierung des Plugins-Ordners beginnen, Elemente aus diesem Ordner löschen und die Anwendung testen.

macOS-Sicherheit

Nachdem Sie alle Abhängigkeiten kopiert und die Pfade für die dynamische Verknüpfung korrigiert haben, müssen Sie die Anwendung mit der Signatur des Entwicklers signieren und zusätzlich die Anwendungsversion zur Beglaubigung an Apple senden.

Wenn Sie keine 100 US-Dollar für eine Entwicklerlizenz haben oder nichts unterschreiben möchten, schreiben Sie Ihren Benutzern Anweisungen zum Starten der Anwendung.

Diese Anleitung funktioniert auch für RaidenVideoRipper:

  • Gatekeeper deaktivieren: spctl –master-disable
  • Start von beliebigen Quellen in „Datenschutz und Sicherheit“ zulassen: Wechseln von Anwendungen zu „Überall“ zulassen
  • Entfernen Sie die Quarantäne-Flagge nach dem Herunterladen aus einer ZIP- oder DMG-Anwendung: xattr -d com.apple.quarantine app.dmg
  • Überprüfen Sie, ob das Quarantäne-Flag (com.apple.quarantine) fehlt: ls -l@ app.dmg
  • Fügen Sie bei Bedarf eine Bestätigung zum Starten der Anwendung in Datenschutz und Sicherheit hinzu

Ein Fehler mit der Quarantäne-Flagge wird normalerweise dadurch reproduziert, dass auf dem Bildschirm des Benutzers die Fehlermeldung „Anwendung ist beschädigt“ erscheint. In diesem Fall müssen Sie das Quarantäne-Flag aus den Metadaten entfernen.

Link zum Erstellen von RaidenVideoRipper für Apple Silicon:
https://github.com/demensdeum/RaidenVideoRipper/releases/download/1.0.1.0/RaidenVideoRipper-1.0.1.0.dmg

Videostabilisierung mit ffmpeg

Wenn Sie Videos stabilisieren und Kameraverwacklungen entfernen möchten, bietet das Tool „ffmpeg“ eine leistungsstarke Lösung. Dank der integrierten Filter „vidstabdetect“ und „vidstabtransform“ können Sie professionelle Ergebnisse erzielen, ohne komplexe Videoeditoren zu verwenden.

Vorbereitung auf die Arbeit

Bevor Sie beginnen, stellen Sie sicher, dass Ihr „ffmpeg“ die „vidstab“-Bibliothek unterstützt. Unter Linux können Sie dies mit dem Befehl überprüfen:

bash  
ffmpeg -filters | grep vidstab  

Wenn die Bibliothek nicht installiert ist, können Sie sie hinzufügen:

sudo apt install ffmpeg libvidstab-dev  

Installation für macOS über brew:

brew install libvidstab
brew install ffmpeg

Kommen wir nun zum Prozess.

Schritt 1: Bewegungsanalyse

Zuerst müssen Sie die Bewegung des Videos analysieren und eine Datei mit Stabilisierungsparametern erstellen.

ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 transfile=transforms.trf -f null -  

Parameter:

Wackeligkeit: Video-Verwackelungsstufe (Standard 5, kann für komplexere Fälle auf 10 erhöht werden).
Genauigkeit: Analysegenauigkeit (Standard 15).
transfile: Dateiname zum Speichern der Bewegungsparameter.

Schritt 2: Stabilisierung anwenden

Jetzt können Sie die Stabilisierung mithilfe der Transformationsdatei anwenden:

ffmpeg -i input.mp4 -vf vidstabtransform=input=transforms.trf:zoom=5 output.mp4

Parameter:

Eingabe: Zeigt auf die Datei mit Transformationsparametern (im ersten Schritt erstellt).
Zoom: Zoomfaktor zum Entfernen schwarzer Ränder (z. B. 5 – automatischer Zoom, bis Artefakte entfernt sind).

Automatische Code-Analyse mit Bistr

Wenn Sie den Quellcode eines Projekts analysieren müssen, den Prozess aber automatisieren und die lokale Leistung Ihres Computers nutzen möchten, kann das Dienstprogramm Bistr eine großartige Lösung sein. In diesem Artikel werden wir uns ansehen, wie dieses Dienstprogramm bei der Analyse von Code mithilfe des Ollama-Modells für maschinelles Lernen hilft.

Was ist Bistr?

Bistr ist ein Dienstprogramm zur Quellcode-Analyse, mit dem Sie ein lokales LLM-Modell (Large Language Model) wie Ollama zur Code-Analyse und -Verarbeitung integrieren können. Mit Bistr können Sie Dateien in verschiedenen Programmiersprachen wie Python, C, Java, JavaScript, HTML und mehr analysieren.

Bistr nutzt das Modell, um Dateien anhand bestimmter Abfragen zu prüfen, beispielsweise um eine Antwort auf eine Frage zur Funktionalität des Codes oder eines Teils davon zu finden. Dies bietet eine strukturierte Analyse, die bei der Entwicklung, Prüfung und Wartung von Projekten hilft.

Wie funktioniert Bistr?

  • Ladestatus: Wenn Sie eine Analyse starten, prüft das Dienstprogramm, ob der Analysestatus zuvor gespeichert wurde. Dies hilft Ihnen, dort weiterzumachen, wo Sie aufgehört haben, ohne dieselben Dateien erneut analysieren zu müssen.
  • Code-Analyse: Jede Datei wird mithilfe des Ollama-Modells analysiert. Das Dienstprogramm sendet eine Anfrage an das Modell, um einen bestimmten Codeabschnitt zu analysieren. Das Modell gibt als Antwort auf die Abfrage Informationen über die Relevanz des Codes zurück und liefert außerdem eine Texterklärung, warum ein bestimmtes Fragment für die Aufgabe relevant ist.
  • Statusspeicherung: Nachdem jede Datei analysiert wurde, wird der Status aktualisiert, sodass Sie beim nächsten Mal mit den neuesten Informationen fortfahren können.
  • Ergebnisausgabe: Alle Analyseergebnisse können in eine HTML-Datei exportiert werden, die eine Tabelle mit einer Rangfolge der Dateien nach Relevanz enthält, die hilft zu verstehen, welche Teile des Codes für die weitere Analyse am wichtigsten sind.

Installation und Start

Um Bistr verwenden zu können, müssen Sie Ollama installieren und ausführen, eine Plattform, die LLM-Modelle auf Ihrem lokalen Computer bereitstellt. Nachfolgend werden Anweisungen zur Installation von Ollama für macOS, Windows und Linux beschrieben.

Laden Sie die neueste Version von Bistr von Git herunter:
https://github.com/demensdeum/Bistr/

Nach der Installation von Ollama und Bistr können Sie die Codeanalyse ausführen. Dazu müssen Sie den Quellcode vorbereiten und den Pfad zum Verzeichnis angeben, das die zu analysierenden Dateien enthält. Das Dienstprogramm ermöglicht es Ihnen, die Analyse dort fortzusetzen, wo Sie aufgehört haben, und bietet außerdem die Möglichkeit, Ergebnisse im HTML-Format zu exportieren, um die weitere Analyse zu erleichtern.

Beispielbefehl zum Ausführen der Analyse:


python bistr.py /path/to/code --model llama3.1:latest --output-html result.html --research "What is the purpose of this function?"

In diesem Team:

–model gibt das für die Analyse zu verwendende Modell an.
–output-html gibt den Pfad zum Speichern der Analyseergebnisse in einer HTML-Datei an.
–research ermöglicht es Ihnen, eine Frage zu stellen, deren Antwort Sie durch die Analyse des Codes beantworten möchten.

Vorteile der Verwendung von Bistr

  • Lokale Ausführung: Die Analyse erfolgt auf Ihrem Computer, ohne dass eine Verbindung zu Cloud-Diensten erforderlich ist, was den Prozess beschleunigt.
  • Flexibilität: Sie können Code in verschiedenen Programmiersprachen analysieren.
  • Automatisierung: Die gesamte Codeüberprüfung erfolgt automatisiert, was insbesondere bei der Arbeit mit großen Projekten Zeit und Aufwand spart.

Lokale neuronale Netze mit Ollama

Wenn Sie den Wunsch hatten, so etwas wie ChatGPT zu starten, und über einen ziemlich leistungsstarken Computer verfügen, beispielsweise mit einer Nvidia RTX-Grafikkarte, können Sie das Ollama-Projekt ausführen, mit dem Sie eines der vorgefertigten LLM-Modelle verwenden können Ihrem lokalen Computer, absolut kostenlos. Ollama bietet die Möglichkeit, mit LLM-Modellen zu kommunizieren. In der neuesten Version wurde auch die Möglichkeit angekündigt, Bilder zu lesen und die Ausgabedaten im JSON-Format zu formatieren.

Ich habe das Projekt selbst auch auf einem MacBook mit einem Apple M2-Prozessor ausgeführt und weiß, dass die neuesten Grafikkartenmodelle von AMD unterstützt werden.

Um es unter macOS zu installieren, gehen Sie zur Ollama-Website:
https://ollama.com/download/mac

Klicken Sie auf „Für macOS herunterladen“. Sie laden ein Archiv der Form ollama-darwin.zip herunter. Im Archiv befindet sich Ollama.app, das nach „Anwendungen“ kopiert werden muss. Starten Sie anschließend Ollama.app. Der Installationsvorgang wird höchstwahrscheinlich beim ersten Start ausgeführt. Danach haben Sie in der Taskleiste das Ollama-Symbol gesehen, die Taskleiste befindet sich oben rechts neben der Uhr.

Starten Sie anschließend ein normales macOS-Terminal und geben Sie den Befehl ein, um ein beliebiges Ollama-Modell herunterzuladen, zu installieren und auszuführen. Eine Liste der verfügbaren Modelle, Beschreibungen und ihre Eigenschaften finden Sie auf der Ollama-Website:
https://ollama.com/search

Wählen Sie das Modell mit den wenigsten Parametern, wenn es beim Start nicht in Ihre Grafikkarte passt.

Beispielbefehle zum Ausführen des Modells llama3.1:latest:


ollama run llama3.1:latest

Die Installation für Windows und Linux ist im Allgemeinen ähnlich, in einem Fall gibt es ein Ollama-Installationsprogramm und die weitere Arbeit damit über Powershell.
Bei Linux erfolgt die Installation über ein Skript, ich empfehle jedoch die Verwendung der Version Ihres spezifischen Paketmanagers. Unter Linux kann Ollama auch über ein normales Bash-Terminal gestartet werden.

Quellen
https://www.youtube.com/watch?v=Wjrdr0NU4Sk
https://ollama.com

Unreal Engine auf dem MacBook M2

Wenn Sie den Unreal Engine 5 Editor auf einem MacBook mit einem Apple-Prozessor ausführen konnten, ist Ihnen vielleicht aufgefallen, dass dieses Ding ziemlich langsam ist.

Um die Leistung des Editors und der Engine zu steigern, stellen Sie Engine-Skalierbarkeitseinstellungen -> Mittel ein. Danach fängt die Engine an, alles nicht mehr so ​​schön zu zeichnen, aber Sie können normal mit der Engine auf Ihrem MacBook arbeiten.