Muster „Schnappschuss“

In diesem Beitrag werde ich das Muster „Snapshot“ beschreiben. oder “Memento”

Dieses Muster bezieht sich auf „Verhaltensmuster“. Designmuster.

Angenommen, wir entwickeln einen Grafikeditor und müssen die Möglichkeit hinzufügen, Aktionen bei einem Benutzerbefehl rückgängig zu machen. Es ist auch sehr wichtig, dass die Systemkomponenten bei der Implementierung dieses Musters keinen Zugriff auf den internen Status der zurückgesetzten „Aktionen“ haben; andere Systemkomponenten haben nur Zugriff auf das Snapshot-Objekt, ohne die Möglichkeit, Änderungen vorzunehmen seinen internen Zustand und stellt eine klare, einfache externe Schnittstelle bereit. Um dieses Problem zu lösen, wird das „Snapshot“-Muster verwendet. oder “Keeper”.

Beispiel für die Arbeit „Snapshot“; unten dargestellt:


Wenn Sie darauf klicken, erscheint ein Sprite. Wenn Sie auf den gewellten Pfeil klicken, wird die Aktion abgebrochen – Der Sprite verschwindet. Das Beispiel besteht aus drei Klassen:

  1. Leinwand, auf der Sprites und die grafische Oberfläche angezeigt werden.
  2. Bildschirm-Controller, er verarbeitet Klicks und steuert die Logik des Bildschirms.
  3. Canvas-Zustände, die bei jeder Änderung bestehen bleiben, werden bei Bedarf mithilfe des Bildschirm-Controllers zurückgesetzt.

Im Kontext des Musters “Snapshot” Klassen sind:

  1. Leinwand – Quelle: Die Zustände dieser Klasse werden als „Schnappschüsse“ gespeichert, für ein späteres Rollback auf Anfrage. Außerdem muss die Quelle in der Lage sein, den Status wiederherzustellen, wenn ein „Snapshot“ an sie übertragen wird.
  2. Controller – Depotbank, diese Klasse weiß, wie und wann Zustände gespeichert/zurückgesetzt werden müssen.
  3. Status – Snapshot, eine Klasse, die den Status der Quelle sowie Datumsinformationen oder einen Index speichert, anhand dessen die Rollback-Reihenfolge genau festgelegt werden kann.

Ein wichtiges Merkmal des Musters ist, dass nur die Quelle Zugriff auf die internen Felder des gespeicherten Zustands im Snapshot haben sollte. Dies ist notwendig, um Snapshots vor Änderungen von außen zu schützen (durch geschickte Entwickler, die unter Umgehung der Kapselung etwas ändern möchten). , die Systemlogik brechen). Um die Kapselung zu implementieren, werden integrierte Klassen verwendet, und in C++ nutzen sie die Möglichkeit, Freundklassen anzugeben. Persönlich habe ich eine einfache Version ohne Kapselung für Rise implementiert und bei der Implementierung für Swift Generic verwendet. In meiner Version – Memento gibt seinen internen Status nur an Entitäten desselben Klassenstatus weiter:

Quellen

https://refactoring.guru/design-patterns/memento

Quellcode

https://gitlab.com/demensdeum/patterns/< /p>

Besuchermuster

In diesem Beitrag beschreibe ich ein Designmuster namens „Besucher“. oder „Besucher“
Dieses Muster gehört zur Gruppe der Verhaltensmuster.

Lass uns ein Problem finden

Dieses Muster wird hauptsächlich verwendet, um die Beschränkung des Einzelversands in Sprachen mit früher Bindung zu umgehen.

Alice X von NFGPhoto (CC-2.0)
Lassen Sie uns eine abstrakte Klasse/ein abstraktes Protokoll Band erstellen, eine Unterklasse von MurpleDeep erstellen und eine Besucherklasse mit zwei Methoden erstellen – Eine für die Ausgabe aller Nachkommen von Band an die Konsole, die zweite für die Ausgabe von MurpleDeep. Hauptsache, die Namen (Signaturen) der Methoden sind gleich und die Argumente unterscheiden sich nur je nach Klasse. Mithilfe der Zwischenausdruckmethode mit dem Band-Argument erstellen wir eine Instanz von Visitor und rufen die Visit-Methode für MurpleDeep auf.
Unten ist der Code in Kotlin:

Die Ausgabe lautet: „Dies ist die Band-Klasse

Wie ist das möglich?!

Warum das passiert, wird in vielen Artikeln mit klugen Worten beschrieben, auch auf Russisch, aber ich schlage vor, Sie stellen sich vor, wie der Compiler den Code sieht, vielleicht wird alles sofort klar:

Das Problem lösen

Es gibt viele Lösungen, um dieses Problem zu lösen. Als nächstes betrachten wir eine Lösung, die das Besuchermuster verwendet.
Wir fügen der abstrakten Klasse/dem abstrakten Protokoll die Methode „accept“ mit dem Argument „Visitor“ hinzu, rufen „visitator.visit(this)“ innerhalb der Methode auf und fügen dann eine Überschreibung/Implementierung der Methode „accept“ zur Klasse „MurpleDeep“ hinzu, wodurch wir wiederum entschieden und ruhig gegen DRY verstoßen Besucher.visit(this).< br />Endgültiger Code:

Quellen

https://refactoring.guru/ru/ design-patterns/visitor-double-dispatch

Quellcode

https://gitlab.com/demensdeum/patterns

Fliegengewichtsmuster

In diesem Beitrag werde ich das Strukturmuster „Lightweight“ beschreiben. oder „opportunistisch“; (Fliegengewicht)
Dieses Muster gehört zur Gruppe der Strukturmuster

Sehen wir uns unten ein Beispiel an, wie das Muster funktioniert:


Warum wird es benötigt? Um RAM zu sparen. Ich stimme zu, dass dies in Zeiten der weit verbreiteten Verwendung von Java (das umsonst CPU und Speicher verbraucht) nicht mehr so ​​wichtig ist, aber es lohnt sich, es zu verwenden.
Im obigen Beispiel werden nur 40 Objekte ausgegeben, aber wenn Sie die Anzahl auf 120.000 erhöhen, erhöht sich der Speicherverbrauch entsprechend.
Schauen wir uns den Speicherverbrauch an, ohne das Flyweight-Muster im Chromium-Browser zu verwenden:

Ohne Verwendung eines Musters beträgt der Speicherverbrauch etwa 300 Megabyte.

Jetzt fügen wir der Anwendung ein Muster hinzu und sehen uns den Speicherverbrauch an:

Bei Verwendung des Musters beträgt der Speicherverbrauch ~200 Megabyte, sodass wir in der Testanwendung 100 Megabyte Speicher eingespart haben. Bei ernsthaften Projekten kann der Unterschied viel größer sein.

Wie funktioniert es?

Im obigen Beispiel zeichnen wir 40 Katzen, der Übersichtlichkeit halber also 120.000. Jede Katze wird als PNG-Bild in den Speicher geladen und dann in den meisten Renderings zum Rendern in eine Bitmap (eigentlich BMP) konvertiert. Dies geschieht aus Geschwindigkeitsgründen, da das Rendern eines komprimierten PNG sehr lange dauert. Ohne das Muster zu verwenden, laden wir 120.000 Bilder von Katzen in den RAM und zeichnen, aber wenn wir das Muster „leichtgewichtig“ verwenden, können wir es nicht verwenden. Wir laden eine Katze in den Speicher und zeichnen sie 120.000 Mal mit unterschiedlichen Positionen und unterschiedlicher Transparenz. Die ganze Magie besteht darin, dass wir beim Rendern Koordinaten und Transparenz getrennt vom Katzenbild implementieren. Das Rendern benötigt nur eine Katze und verwendet ein Objekt mit Koordinaten und Transparenz für das korrekte Rendern.

Wie sieht es im Code aus?

Im Folgenden finden Sie Beispiele für die Sprache Rise< /p>

Ohne Verwendung eines Musters:


Das Katzenbild wird für jedes Objekt in der Schleife separat geladen – catImage.

Muster verwenden:

Ein Bild einer Katze wird von 120.000 Objekten verwendet.

Wo wird es verwendet?

Wird in GUI-Frameworks verwendet, zum Beispiel Apples “Wiederverwendung” (Wiederverwendung) von UITableViewCell-Tabellenzellen, was die Einstiegshürde für Anfänger erhöht, die dieses Muster nicht kennen. Wird auch häufig in der Spieleentwicklung verwendet.

Quellcode

https://gitlab.com/demensdeum/patterns/< /p>

Quellen

https://refactoring.guru/ru/design-patterns/ Fliegengewicht
http://gameprogrammingpatterns.com/flyweight.html

Der gute, der schlechte und der hässliche Singleton

In dieser Notiz beschreibe ich meine Erfahrungen und die Erfahrungen meiner Kollegen bei der Arbeit mit dem Singleton-Muster (Singleton in der ausländischen Literatur) während der Arbeit an verschiedenen (erfolgreichen und weniger erfolgreichen) Projekten. Ich werde beschreiben, warum ich persönlich denke, dass dieses Muster nirgendwo verwendet werden kann, und ich werde auch beschreiben, welche psychologischen Faktoren im Team die Integration dieses Antimusters beeinflussen. Gewidmet allen gefallenen und verkrüppelten Entwicklern, die zu verstehen versuchten, warum alles damit begann, dass eines der Teammitglieder einen kleinen süßen Welpen mitbrachte, der leicht zu handhaben war und keine besondere Pflege und Kenntnisse erforderte, um ihn zu pflegen, und mit dem aufgezogenen Biest endete Ihr Projekt als Geisel zu nehmen, erfordert immer mehr Arbeitsstunden und frisst die Nerven des Benutzers, Ihr Geld und schafft absolut monströse Zahlen für die Beurteilung der Umsetzung scheinbar einfacher Dinge Dinge.


Wolf in sheep’s clothing by SarahRichterArt

Die Geschichte spielt in einem alternativen Universum, alle Zufälle sind zufällig…

Streicheln Sie die Katze zu Hause mit Cat@Home

Jeder Mensch verspürt manchmal im Leben den unwiderstehlichen Wunsch, eine Katze zu streicheln. Analysten auf der ganzen Welt gehen davon aus, dass das erste Startup, das eine Anwendung für die Lieferung und Vermietung von Katzen entwickelt hat, äußerst beliebt sein wird und in naher Zukunft für Billionen Dollar von Moogle gekauft wird. Bald passiert das – Ein Mann aus Tjumen erstellt die Anwendung Cat@Home und wird bald zum Billionär, die Firma Moogle erhält eine neue Einnahmequelle und Millionen gestresster Menschen erhalten die Gelegenheit dazu Bestellen Sie eine Katze zum weiteren Bügeln und Beruhigen zu sich nach Hause.

Angriff der Klonkrieger

Ein äußerst reicher Zahnarzt aus Murmansk, Alexey Goloborodko, beeindruckt von einem Artikel über Cat@Home von Forbes, beschließt, dass er auch astronomisch reich sein möchte. Um dieses Ziel zu erreichen, findet er über seine Freunde eine Firma aus Goldfield – Wakeboard DevPops, ein Anbieter von Softwareentwicklungsdiensten, beauftragt das Unternehmen mit der Entwicklung eines Cat@Home-Klons.

Siegerteam

Das Projekt heißt Fur&Pure und wird einem talentierten Entwicklungsteam von 20 Leuten anvertraut; Konzentrieren wir uns als Nächstes auf ein mobiles Entwicklungsteam von 5 Personen. Jedes Teammitglied erhält seinen Teil der Arbeit, bewaffnet mit Agile und Scrum, das Team schließt die Entwicklung pünktlich (in sechs Monaten) ohne Fehler ab, veröffentlicht die Anwendung im iStore, wo sie von 100.000 Benutzern mit 5 bewertet wird, davon gibt es viele Kommentare darüber, wie großartig die Anwendung ist, wie ausgezeichneter Service (immerhin ein alternatives Universum). Die Katzen sind gebügelt, die App ist veröffentlicht, alles scheint gut zu laufen. Allerdings hat Moogle es nicht eilig, ein Startup für Billionen Dollar zu kaufen, denn in Cat@Home sind bereits nicht nur Katzen, sondern auch Hunde aufgetaucht.

Der Hund bellt, die Karawane zieht weiter

Der Eigentümer des Antrags entscheidet, dass es an der Zeit ist, Hunde zum Antrag hinzuzufügen, bittet das Unternehmen um eine Bewertung und erhält ungefähr mindestens sechs Monate Zeit, um Hunde zum Antrag hinzuzufügen. Tatsächlich wird die Anwendung erneut von Grund auf neu geschrieben. Während dieser Zeit wird Moogle Schlangen, Spinnen und Meerschweinchen zur Anwendung hinzufügen und Fur&Pur wird nur Hunde erhalten.
Warum ist das passiert? Schuld daran ist der Mangel an flexibler Anwendungsarchitektur; einer der häufigsten Faktoren ist das Singleton-Anti-Pattern.

Was ist los?

Um eine Katze zu Hause zu bestellen, muss der Verbraucher eine Anfrage erstellen und diese an das Büro senden, wo das Büro die Anfrage bearbeitet und einen Kurier mit der Katze schickt. Der Kurier erhält bereits die Zahlung für die Dienstleistung.
Einer der Programmierer beschließt, eine Klasse „Cat Application“ zu erstellen. mit den notwendigen Feldern bringt diese Klasse über einen Singleton in den globalen Anwendungsraum. Warum macht er das? Um Zeit zu sparen (einen Penny von einer halben Stunde), weil es einfacher ist, eine Anwendung öffentlich zu machen, als die Anwendungsarchitektur zu durchdenken und Abhängigkeitsinjektion zu verwenden. Dann greifen andere Entwickler auf dieses globale Objekt zurück und binden ihre Klassen daran.
Zum Beispiel greifen alle Bildschirme selbst auf das globale Objekt „Cat Request“ zu. und Daten zur Anwendung anzeigen. Als Ergebnis wird eine solche monolithische Anwendung getestet und freigegeben.
Alles scheint in Ordnung zu sein, aber plötzlich erscheint ein Kunde mit der Anforderung, Hundewünsche in den Antrag aufzunehmen. Das Team beginnt verzweifelt abzuschätzen, wie viele Komponenten im System von dieser Änderung betroffen sein werden. Am Ende der Analyse stellt sich heraus, dass 60 bis 90 % des Codes wiederholt werden müssen, um der Anwendung beizubringen, nicht nur „Request For Cat“ zu akzeptieren. Aber auch „Bewerbung für einen Hund“ ist es in diesem Stadium bereits sinnlos, die Hinzufügung weiterer Tiere zu bewerten, um mit mindestens zwei zurechtzukommen.

So verhindern Sie Singleton

Machen Sie in der Phase der Anforderungserfassung zunächst ausdrücklich deutlich, dass eine flexible, erweiterbare Architektur erforderlich ist. Zweitens lohnt es sich, nebenbei eine unabhängige Prüfung des Produktcodes durchzuführen und dabei zwingend Schwachstellen zu recherchieren. Wenn Sie Entwickler sind und Singletons lieben, empfehle ich Ihnen, zur Besinnung zu kommen, bevor es zu spät ist, sonst sind schlaflose Nächte und ausgefranste Nerven garantiert. Wenn Sie an einem Legacy-Projekt arbeiten, das viele Singletons enthält, versuchen Sie, diese oder das Projekt so schnell wie möglich zu entfernen.
Sie müssen vom Anti-Pattern von Singletons-globalen Objekten/Variablen zur Abhängigkeitsinjektion wechseln – das einfachste Entwurfsmuster, bei dem alle erforderlichen Daten in der Initialisierungsphase an eine Instanz einer Klasse übergeben werden, ohne dass eine weitere Bindung an den globalen Raum erforderlich ist.

Quellen

https://stackoverflow. com/questions/137975/what-is-so-bad-about-singletons
http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
https://blog.ndepend.com/singleton-pattern-costs/

Death Mask-Entwicklerbericht 1

Neuer nicht permanenter Abschnitt „Entwicklertagebücher“; oder Dev Diary im fremden Stil.
Die Entwicklung des Spiels Death-Mask ist in vollem Gange, so das Engine-Logo wurde für Flame Steel Engine-Spiele 2019 hinzugefügt, Bildschirm zur Auswahl der anfänglichen Karte nach Insel (grün, rot, schwarz, weiß), Ausgabe von Texturen für Wände, Decke, Boden des Labyrinths, vergrößerte Größe des Spielbereichs.


Karte der Stadt der Roten Zone

Als nächstes planen wir, 3D-Modelle für die Umgebung anstelle von Sprites im Doom-Stil hinzuzufügen, und wir planen, Modelle für Waffen, Kisten, Feinde und Freunde hinzuzufügen. Im Gameplay ist geplant, Währung, Geschäfte, die Möglichkeit, Teile der Spielkarte zu kaufen, die interessante Orte mit Beute anzeigen, und den möglichen Standort der „Todesmaske“ hinzuzufügen. Ich möchte auch die Möglichkeit hinzufügen, Begleiter für die Wanderung durch das Cyberlabyrinth anzuheuern.
Verfolgen Sie die Nachrichten.

Swift 4.2.3 – Ubuntu 18.10

Swift mit den notwendigen Bibliotheken für die Ausführung unter Ubuntu 18.10 erstellen. Neueste verfügbare Version auf der Apple-Website – für Ubuntu 18.04. Basierend auf der Zusammenstellung von der offiziellen Website mit zusätzlichen Bibliotheken von Ubuntu 18.04. Außerdem wurde ein Beispielskript zum Hinzufügen von PATH und LD_LIBRARY_PATH für das Bash-Terminal hinzugefügt:
http://www.mediafire.com/file/lrs74mvoj3fti03/swift4.2.3.ubuntu.18.10.x86_64.tar.gz/file

Erklärungssprache Zakaz

Ich präsentiere Ihnen eine reine deklarative Programmiersprache – Zakaz. Die Hauptidee der neuen Sprache – Die Anwendung enthält in freier Form geschriebene Ausführungsbefehle, die von „Ausführern“ ausgeführt werden müssen. Wenn kein “Performer” Wenn der Befehl nicht ausgeführt werden kann, stoppt die Programmausführung. Anwendungen werden technische Spezifikationen (tez) genannt und müssen die Erweiterung .tez haben. Die Zakaz-Syntax erfordert zwei Regeln:

  • Jeder Befehl beginnt in einer neuen Zeile
  • Jeder Befehl muss in einer formalen Sprache geschrieben sein, die für Menschen verständlich ist

Beispiel Hello World.tez:

Zeigen Sie den Text „Hello World“ auf dem Bildschirm anZeigen Sie den Text "Zakaz 'tez' example" auf dem Bildschirm an

Ein Beispiel für eine Spezifikation, die eine Beschreibung des Funktionsprinzips und das Öffnen der Website http://demensdeum.com im Firefox-Browser anzeigt

Text "Website-Demo anzeigen" auf dem Bildschirm anzeigenShow "Sie müssen Firefox auf Ihrem System installiert haben, um dieses 'tez' auszuführen, und es sollte über \"system\"C-Funktion" Text auf dem BildschirmShow "Außerdem sollte \"FirefoxPerformer\" Zakaz Runtime zugewiesen, bitte überprüfen Sie das Handbuch Für weitere Informationen“ Text auf dem BildschirmWebsite mit Adresse "http://demensdeum.com" in Firefox anzeigen

Sie müssen das obige Beispiel zusammen mit dem „Executor“ ausführen. FirefoxPerformer, der den neuesten Befehl zum Rendern einer Site über Firefox verarbeiten kann

./ZakazRuntime openDemensdeumSite.tez FirefoxPerformer

Um Ihren Executor zu implementieren, müssen Sie ihn als dynamische Bibliothek mithilfe der abstrakten Klasse ZakazRuntime::Performer implementieren und ihn zusammen mit einem intelligenten Zeiger von der globalen Funktionsmethode createPerformer() zurückgeben. Sie können die FirefoxPerformer-Implementierung als Beispiel verwenden.

Quellcode

https://gitlab.com/demensdeum/zakaz

С++ Application Plugins

In this post I will describe an example of adding functionality to a C ++ application using plugins. The practical part of the implementation for Linux is described; the theory can be found at the links at the end of the article.

Composition over inheritance!

To begin with, we will write a plugin – a function that we will call:

#include "iostream"

using namespace std;

extern "C" void extensionEntryPoint() {
	cout << "Extension entry point called" << endl;
};

Next, we will build the plugin as a dynamic library “extension.so”, which we will connect in the future:
clang++ -shared -fPIC extension.cpp -o extension.so

Next we write the main application that will load the file “extension.so”, look for a pointer to the function “extensionEntryPoint” there, and call it, typing errors if necessary:

#include "iostream"
#include "dlfcn.h"

using namespace std;

typedef void (*VoidFunctionPointer)();	

int main (int argc, char *argv[]) {

	cout << "C++ Plugins Example" << endl;

	auto extensionHandle = dlopen("./extension.so", RTLD_LAZY);
	if (!extensionHandle) {
		string errorString = dlerror();
		throw runtime_error(errorString);
	}

	auto functionPointer = VoidFunctionPointer();
	functionPointer = (VoidFunctionPointer) dlsym(extensionHandle, "extensionEntryPoint");
	auto dlsymError = dlerror();
 	if (dlsymError) {
		string errorString = dlerror();
		throw runtime_error(errorString);
 	}

	functionPointer();

	exit(0);
} 

The dlopen function returns a handler for working with a dynamic library; dlsym function returns a pointer to the required function by string; dlerror contains a pointer to the string with the error text, if any.

Next, build the main application, copy the file of the dynamic library in the folder with it and run. The output should be the “Extension entry point called”

Difficult moments include the lack of a single standard for working with dynamic libraries, because of this there is a need to export the function to a relatively global scope with extern C; the difference in working with different operating systems associated with this subtlety of work; the lack of a C ++ interface to implement OOP approach to working with dynamic libraries, however, there are open-source wrappers, for example m-renaud/libdlibxx

Example Source Code

https://gitlab.com/demensdeum/cpppluginsexample

Documents

http://man7.org/linux/man-pages/man3/dlopen.3.htm
https://gist.github.com/tailriver/30bf0c943325330b7b6a
https://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work

Flattern wie Michelle

[Spüren Sie die Kraft der künstlichen Intelligenz]
In diesem Beitrag werde ich Ihnen sagen, wie Sie die Zukunft vorhersagen.

In der Statistik gibt es eine Klasse von Problemen – Zeitreihenanalyse. Wenn Sie ein Datum und den Wert einer bestimmten Variablen haben, können Sie den Wert dieser Variablen in der Zukunft vorhersagen.
Zuerst wollte ich eine Lösung für dieses Problem implementieren, indem ich TensorFlow, aber die Bibliothek Prophet von Facebook.
Prophet ermöglicht es Ihnen, eine Prognose basierend auf Daten (csv) zu erstellen, die Datumsspalten (ds) und Variablenwertspalten (y) enthalten. Wie man damit arbeitet, erfahren Sie in der Dokumentation auf der offiziellen Website im Abschnitt Schnellstart
Als Datensatz habe ich einen CSV-Upload von der Website https://www.investing.com, bei der Implementierung habe ich R-Sprache und Prophet-API für ihn. Mir hat R sehr gut gefallen, weil seine Syntax die Arbeit mit großen Datenmengen vereinfacht, ein einfacheres Schreiben ermöglicht und weniger Fehler macht als bei der Arbeit mit herkömmlichen Sprachen (Python), da man mit Lambda-Ausdrücken arbeiten müsste, und in R haben Sie bereits alle Lambda-Ausdrücke.
Um die Daten nicht für die Verarbeitung vorzubereiten, habe ich das Paket anytime, das Zeichenfolgen ohne Vorverarbeitung in ein Datum konvertieren kann. Die Konvertierung von Währungszeichenfolgen in Zahlen erfolgt mit dem readr-Paket .

Als Ergebnis erhielt ich eine Prognose, wonach Bitcoin bis Ende 2019 8.400 US-Dollar kosten wird und der Dollarkurs 61 Rubel betragen wird. Sollten wir diesen Prognosen Glauben schenken? Persönlich denke ich, dass es sich nicht lohnt, weil… Man kann mathematische Methoden nicht anwenden, ohne ihr Wesen zu verstehen.

Quellen

https:// facebook.github.io/prophet
https://habr.com/company/ods/blog/323730/
https://www.r-project.org/

Quellcode

https://gitlab.com/demensdeum/MachineLearning/tree/master/4prophet

Tesla spricht

In diesem Beitrag beschreibe ich den Prozess der Erstellung eines Zitatgenerators.

TL;DR

Für Schulung und Textgenerierung – Verwenden Sie die Bibliothek textgenrnn, um Phrasen zu filtern, müssen Sie die Rechtschreibprüfung mit hunspell und seine Bibliotheken für C/Python. Nach dem Training in Colaboratory, Sie können mit der Textgenerierung beginnen. Etwa 90 % des Textes werden erstellt völlig unlesbar, die restlichen 10 % enthalten jedoch ein wenig Bedeutung, und mit manueller Änderung sehen die Phrasen recht gut aus.
Am einfachsten ist es, ein vorgefertigtes neuronales Netzwerk in Colaboratory zu starten:
https://colab.research.google.com/drive/1-wbZMmxvsm3SoclJv11villo9VbUesbc(öffnet sich in einem neuen Tab)”>https://colab.research.google.com/drive/1-wbZMmxvsm3SoclJv11villo9VbUesbc

Quellcode

https://gitlab.com/demensdeum/MachineLearning/tree/master/3quotesGenerator

Quellen

https://karpathy.github.io/2015/05/21/rnn-effectiveness/https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5dhttps://minimaxir.com/2018/05/text-neural-networks/
https://github.com/wooorm/dictionaries (opens in a new tab)” href=”https://minimaxir.com/2018/05/text-neural-networks/” target=”_blank”>https://minimaxir.com/2018/05/text-neural-networks/
https://karpathy.github.io/2015/05/21/rnn-effectiveness/
https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d
https://karpathy.github.io/2015/05/21/rnn-effectiveness/ (opens in a new tab)” href=”https://karpathy.github.io/2015/05/21/rnn-effectiveness/” target=”_blank”>https://karpathy.github.io/2015/05/21/rnn-effectiveness/
https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d
https://karpathy.github.io/2015/05/21/rnn-effectiveness/https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5dhttps://github.com/wooorm/dictionaries

” rel=”noopener” target=”_blank”>https://github.com/wooorm/dictionaries (opens in a new tab)”>https://github.com/wooorm/dictionaries

Wie viele Fehler hast du da?

Auf Hacker News habe ich einen sehr interessanten Artikel gefunden, in dem der Autor die Verwendung von vorschlägt Petersen-Lincoln-Methode, die von Biologen verwendet wird, um die Population von Vögeln, Affen und anderen Tieren zu zählen, zum *Trommelwirbel* Zählen von Käfern in der Anwendung.

Käfer im natürlichen Lebensraum – Bigfoot-Sichtung von Derek Hatfield

Die Methode ist sehr einfach, wir nehmen zwei Ornithologen, finden sie Vögel einer bestimmten Art, ihre Aufgabe – Bestimmen Sie die Populationsgröße dieser Vögel. Die gefundenen Vögel werden von beiden Ornithologen markiert, dann wird die Anzahl der häufigen Vögel berechnet, in die Lincoln-Indexformel eingesetzt und wir erhalten die ungefähre Populationsgröße.
Nun zu den Bewerbungen – Die Methode ist auch sehr einfach: Wir nehmen zwei Qualitätssicherungskräfte und sie finden Fehler in der Anwendung. Nehmen wir an, ein Tester hat 10 Fehler gefunden (E1) und der zweite Tester hat 20 Fehler gefunden (E2). Jetzt nehmen wir die Anzahl der Gesamtfehler – 3 (S), dann erhalten wir mit der Formel den Lincoln-Index:

Dies ist eine Prognose der Anzahl der Fehler in der gesamten Anwendung. Im angegebenen Beispiel sind es etwa 66 Fehler.

Schnelles Beispiel

Ich habe einen Prüfstand implementiert, um die Methode zu testen, Sie können ihn hier sehen:
https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw?language=swift

Parameter, die geändert werden können:

let aliceErrorFindProbability = 20 – Prozentsatz der von QA Alice gefundenen Fehler (20 %)
let bobErrorFindProbability = 60 – Prozentsatz der von QA Bob gefundenen Fehler (60 %)
let currentBugsCount = 200 – Wie viele Fehler gibt es wirklich in der Anwendung?

Im letzten Durchlauf habe ich folgende Daten erhalten:
Anzahl der Schätzungsfehler: 213
Tatsächliche Anzahl der Fehler: 200

Das heißt, es gibt 200 Fehler in der Anwendung, der Lincoln Index gibt eine Prognose – 213:
„Alice hat 36 Fehler gefunden.“
„Bob hat 89 Fehler gefunden.“
“Anzahl häufiger Fehler: 15”

Anzahl der Schätzungsfehler: 213
Tatsächliche Anzahl der Fehler: 200

Schwächen

Diese Methode kann verwendet werden, um die Anzahl der Fehler in der Anwendung in allen Phasen der Entwicklung zu bewerten. Im Idealfall sollte die Anzahl der Fehler sinken. Zu den Schwächen der Methode gehört unter anderem der menschliche Faktor, da die Anzahl der von zwei Testern gefundenen Fehler unterschiedlich sein sollte und unterschiedliche Fehler gefunden wurden häufige Fehler müssen gefunden werden, andernfalls funktioniert die Methode nicht (null häufige Fehler – Division durch Null)< br />Außerdem erfordert ein Konzept wie häufige Fehler die Anwesenheit eines Experten, um ihre Gemeinsamkeiten zu verstehen.

Quellen

Wie viele Fehler müssen noch gefunden werden? – John D. Cook, PhD, Präsident
The thrill of the chase – Brian Hayes

Quellcode

https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw ?Sprache=swift
https://gitlab.com/demensdeum/statistics/tree/master/1_BugsCountEstimation/src

Zahnräder schleifen

Oh Muse, wie schwer ist es manchmal, dich zu erwischen.
Die Entwicklung von Death-Mask und zugehörigen Frameworks (Flame Steel Core, Game Toolkit usw.) wird für mehrere Monate ausgesetzt, um über den künstlerischen Teil des Spiels, Musik, Sound und Gameplay zu entscheiden.
Pläne – Erstellen Sie einen Editor für das Flame Steel Game Toolkit, schreiben Sie einen Interpreter für Spielskripte (basierend auf der Rise-Syntax) und implementieren Sie das Death-Mask-Spiel für so viele Plattformen wie möglich.
Die schwierigste Etappe ist geschafft – In der Praxis hat sich die Möglichkeit bewährt, eine eigene plattformübergreifende Spiel-Engine, eine eigene IDE und eine Reihe von Bibliotheken zu schreiben.
Ich bin dabei, ein wirklich durchdachtes und interessantes Projekt zu erstellen. Bleiben Sie dran.

Totenmaske im öffentlichen Bereich

Ab heute geht das Spiel Death-Mask in den Open Access – Sie können den Fortschritt der Spielimplementierung unter dem Link verfolgen: (Wow!)
[Death-Mask Wild]

Aktuelle Version – 0.1 enthält grundlegende Pfeilsteuerungen, WSAD, Generierung von Karten, Gegenständen (einschließlich der Totenmaske!), Rendering.
Es gibt noch viel zu tun und ich bin sehr an Ihrem Feedback interessiert – So können Sie Kommentare auf der Seite mit der Wild-Version des Spiels schreiben.
In der endgültigen Version endet das Spiel, nachdem der Spieler den Gegenstand gefunden hat – Totenmaske
Viel Spaß beim Testen : )

Авторы ресурсов

Hangar18-Quellcode-Indizierungsdienstprogramm

Hangar18 – In Rust geschriebenes C++-Quellcode-Indizierungsdienstprogramm. Dieses Dienstprogramm implementiert die Funktionalität „Gehe zur Definition“. in der Sabre-Plus-IDE.
Die Eingabe in das Dienstprogramm ist der absolute Pfad zum Quellcodeverzeichnis und die Deklarationszeile, die gefunden werden muss. Die Ausgabe ist eine grep-ähnliche Ausgabe.

Quellcode:
https://gitlab.com/demensdeum/hangar18

Taytay überwacht den Status von Git-Repositories

Ich präsentiere Ihnen Taytay – ein Dienstprogramm zur Überwachung des Status von Git-Repositorys für die Swift-Sprache. Derzeit kann Swift auf allen gängigen Desktop-Betriebssystemen installiert werden. Für Ubuntu empfehle ich die Verwendung von Swiftenv. Taytay mit dem Dienstprogramm git-cola, aber Sie können die Quelle bearbeiten und in jedes andere Programm ändern.

Quellcode:
https://gitlab.com/demensdeum/taytay

Wir haben Malevich, Black Squares OpenGL geschlagen

Malevich kommt regelmäßig jedem Entwickler auf OpenGL. Dies geschieht unerwartet und mutig.

Heute werde ich beschreiben, aus welchem Grund ich von einem schwarzen Quadrat besucht wurde.

Verwenden Sie Tools

Für das Debuggen von OpenGL haben mir zwei Tools geholfen: renderdoc und und Apitrace . Renderdoc – Tool zum Debuggen des OpenGL -Rendering -Prozesses können Sie alles anzeigen – Scheitelpunkte, Shader, Texturen, Schuldennachrichten des Fahrers. Apitrace – Ein Werkzeug für die Verfolgung von Herausforderungen einer grafischen API macht einen Dump -Anruf und zeigt Argumente an. Es gibt auch eine großartige Gelegenheit, zwei Dumps über WDIFF (oder ohne, aber nicht so bequem) zu vergleichen

Überprüfen Sie, mit wem Sie arbeiten

Ich habe ein Betriebssystem Ubuntu 16.10 mit alten Abhängigkeiten SDL2, GLM, Anlage, Glew. In der neuesten Version von Ubuntu 18.04 erhalte ich die Zusammenstellung des Spiels Todesmaske Das zeigt nichts auf dem Bildschirm (nur ein Black Square). Wenn Sie Chroot und Assembly bei 16.10 i verwenden, erhalte ich eine Arbeitsanordnung des Spiels mit Graphics .

In Ubuntu 18.04

scheint etwas gebrochen zu sein

ldd zeigte die Linkka zu identischen Bibliotheken SDL2, GL. Als ich einen nicht bearbeiteten Build in Renderdoc fuhr, sah ich Müll am Eingang zum Scheitelpunkt -Shader, aber ich brauchte eine solide Bestätigung. Um den Unterschied zwischen der Binarik zu verstehen, habe ich sie beide durch apitrace gefahren. Der Vergleich von Dumps hat mir gezeigt, dass die Versammlung auf einem frischen Ubunta das Programm der Aussichten in OpenGL bricht und tatsächlich Müll dorthin schickt:

Matrizen sammeln sich in der GLM -Bibliothek. Nach dem Kopieren von GLM von 16.04 – Ich habe wieder den Arbeitsaufbau des Spiels bekommen. Das Problem war der Unterschied in der Initialisierung einer einzelnen Matrix in GLM 9.9.0, es ist notwendig, das Argument MAT4 (1.0F) im Konstruktor eindeutig anzuzeigen. Nachdem ich die Initialisierung und geändert habe, indem ich der Autor der Bibliothek abgeschrieben habe. “Noopener”> Tests für FSGL . Beim Schreiben, den ich in FSGL fand, werde ich sie weiter beschreiben.

Bestimmen Sie, wer im Leben ist

Für die richtige Arbeit mit OpenGL müssen Sie freiwillig gewaltsam den Kontext einer bestimmten Version anfordern. So sucht es nach SDL2 (Sie müssen die Version streng einsetzen, bevor Sie den Kontext initialisieren):


 SDL_GL_SETTRTRIBUT (SDL_GL_CONTEXT_MAJOR_VERSION,  3 );
Sdl_gl_settribute (sdl_gl_context_minor_version, 2 );
Sdl_gl_settribute (sdl_gl_context_profile_mask, sdl_gl_context_profile_core);

zum Beispiel funktioniert Renderdoc nicht mit Kontexten unter 3.2. Ich möchte feststellen, dass nach dem Umschalten des Kontextes eine hohe Wahrscheinlichkeit besteht, dass der gleiche schwarze Bildschirm angezeigt wird. Warum?
Denn der -Kontext von OpenGL 3.2 muss das Vorhandensein von VAO -Puffer erfordern, ohne dass 99% der grafischen Treiber nicht funktionieren. Fügen Sie es einfach hinzu:


 GlGenvertexArrays ( 1 ,  &  vao);
Glbindvertexaray (vao);

schlaf nicht, friere ein.

Ich habe auch ein interessantes Problem auf Kubuntu getroffen, anstatt auf ein schwarzes Quadrat wurde mir transparent angezeigt, und Manchmal wurde alles richtig gemacht. Ich fand die Lösung für dieses Problem beim Stack -Überlauf:
https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes

Der FSGL -Test -Render -Code war ebenfalls vorhanden Schlaf (2S) ; Also erhielt ich auf dem Xubuntu und Ubuntu das richtige Rendern und schickte den Antrag in den Schlaf, aber auf Kubuntu erhielt ich einen transparenten Bildschirm in 80% des Starts von Delphin und 30% der Starts und Terminal. Um dieses Problem zu lösen, fügte ich nach einer Sdlevent -Umfrage in jedem Frame Rendering hinzu, wie in der Dokumentation empfohlen.

Testcode:
https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/

Sprechen Sie mit dem Treiber

OpenGL unterstützt den Kommunikationskanal zwischen der Anwendung und dem Treiber, um ihn zu aktivieren. .
Hier kann ein Beispiel für die Initialisierung aufgenommen werden:
https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp

Hab keine Angst, sieh zu, wie es wächst

In diesem Beitrag werde ich über meine Missgeschicke mit shared_ptr Smart Pointern sprechen. Nachdem ich die Next-Level-Generation in meinem Spiel Death-Mask implementiert hatte, bemerkte ich eine Erinnerung Leck . Jede neue Stufe erhöhte den verbrauchten RAM um + 1 Megabyte. Es ist offensichtlich, dass einige Objekte im Speicher verblieben und nicht freigegeben wurden. Um diesen Umstand zu korrigieren, war es notwendig, die korrekte Implementierung von Ressourcen bei Überlastung des Levels zu implementieren, was offenbar nicht geschehen ist. Da ich intelligente Zeiger verwendet habe, gab es mehrere Möglichkeiten, dieses Problem zu lösen. Die erste bestand darin, den Code manuell zu überprüfen (lang und langweilig), während die zweite darin bestand, die Fähigkeiten des lldb-Debuggers und des libstdc++-Quellcodes auf die Möglichkeit einer automatischen Nachverfolgung zu untersuchen Zähleränderungen.

Im Internet liefen alle Ratschläge darauf hinaus, den Code manuell zu überprüfen, ihn zu reparieren und sich selbst mit Peitschenhieben zu schlagen, nachdem man die problematische Codezeile gefunden hatte. Es wurde auch vorgeschlagen, ein eigenes System für die Arbeit mit dem Speicher zu implementieren, wie es alle großen Projekte tun, die seit den 90er und 2000er Jahren entwickelt wurden, bevor intelligente Zeiger im C++11-Standard eingeführt wurden. Ich habe versucht, Haltepunkte im Konstruktor einer Kopie aller shared_ptrs zu verwenden, aber nach mehreren Tagen passierte nichts Nützliches. Es gab die Idee, Protokollierung zur libstdc++-Bibliothek hinzuzufügen, aber der Arbeitsaufwand erwies sich als enorm.


Cowboy Bebop (1998)

Die Lösung kam mir plötzlich in Form der Verfolgung von Änderungen in der privaten Variablen shared_ptr – use_count. Dies kann mithilfe von in lldb integrierten Watchpoints erfolgen. Nach dem Erstellen eines shared_ptr über make_shared können Änderungen am Zähler in lldb mithilfe der Zeile:
verfolgt werden

watch set var camera._M_refcount._M_pi->_M_use_count

Wo “Kamera” Dies ist ein shared_ptr-Objekt, dessen Zählerstand verfolgt werden muss. Natürlich variieren die Interna von shared_ptr je nach Version von libstdc++, aber das allgemeine Prinzip ist verständlich. Nach der Installation des Watchpoints starten wir die Anwendungen und lesen den Stacktrace jeder Zähleränderung, dann schauen wir uns den Code an (sic!), finden das Problem und beheben es. In meinem Fall wurden Objekte nicht aus Cache-Tabellen und Spiellogiktabellen befreit. Ich hoffe, dass diese Methode Ihnen beim Umgang mit Lecks bei der Arbeit mit shared_ptr hilft, und ich liebe dieses Speichertool noch mehr. Viel Spaß beim Debuggen.

Spielevision Nr. 3

Die dritte Ausgabe einer nicht permanenten Kolumne über Spiele Games Vision.

Observer (PC und Konsolen, Bloober Team) – Cyberpunk-Horror von den tapferen Polen. Ein kurzer und sehr atmosphärischer Horrorfilm mit Rutger Hauer in der Hauptrolle. Als Cyberpunk-Fan gefiel mir absolut alles an dem Spiel. Nicht sehr schwierige Rätsel, charmante Pannen der Hauptfigur, Gameplay mit ruhigen Momenten gemischt mit Action, die Möglichkeit, buchstäblich in die Erinnerungen der Toten einzutauchen, eine Handlung im Ghost in the Shell-Stil + viele Anspielungen auf die Sci-Fi-Popkultur. Von den Minuspunkten – Zu viele Pannen, manchmal scheint es, dass es aufgrund ihrer Fülle unmöglich ist, sie zu spielen, außerdem wurden einige Spieler durch bestimmte Horrorelemente wütend, die so beängstigend waren, dass sie nicht weiterspielen konnten.
Bewertung: 8/10

Paradigma (Windows/OS X, Jacob Janerka) – Eine Suche, die es schafft, alles auf einmal zu parodieren und darüber zu lachen. Es gibt Spott über die UdSSR, Amerika, das Quest-Genre, Glam Rock, alte Konsolen, Menschen, Denkmäler, IT-Leute, Kegel, Computer, Frauen, Kinder, Eltern, Künstler, Liebe, Wissenschaftler, die Spieleindustrie, die Spieler selbst & #8211; Im Allgemeinen ist es unmöglich, alles aufzulisten. Absolut unvorhersehbare Handlung, absurde Atmosphäre und Kunst, keine besonders schwierigen Rätsel. Das Spiel weist seltene Bugs und Abstürze auf, einige Momente und Witze sind leicht vorhersehbar und nicht originell.
Bewertung: 9/10

Late Shift (PC und Konsolen, CtrlMovie Ltd) – interaktiver Film. Es tut mir wirklich leid, dass eine grundsätzlich gute Idee so schlecht umgesetzt wurde. Alles ist schlecht – Handlung, Mangel an Hauptdarstellern, Schauspiel, ständige Einfrierungen in der PC-Version, fast keine Variabilität (illusorisch). Es ist völlig unverständlich, wie es in den 2010er Jahren möglich war, ein Spiel mit so vielen Problemen zu veröffentlichen, denn tatsächlich handelt es sich um einen gewöhnlichen Videoplayer, das gesamte Spiel hätte im Internet, beispielsweise auf YouTube, veröffentlicht werden können, aber stattdessen wurde es verwendet Unity hat es geschafft, eine so leistungsstarke Spiel-Engine auszugleichen. Das offizielle Forum auf Steam ist Fixes, Hotfixes, Workarounds usw. gewidmet. Es gibt eine technische Katastrophe, mangelnde Benutzerunterstützung, alle Tests finden direkt auf den Spielern statt. Habe begeisterte Kritiken und Erfahrungsberichte gekauft.
Bewertung: 3/10

Rise-Programmiersprache

Ich präsentiere Ihnen meine eigene Programmiersprache namens – Aufstieg. Ein Transpiler von Rise nach JavaScript ist derzeit verfügbar.

Sie können es unter dem folgenden Link sehen und verwenden – Aufstieg in JavaScript (ECMAScript 5-Dialekt):
https://gitlab.com/demensdeum/Rise

Ich präsentiere Ihnen auch eine Demoanwendung, die vollständig in Rise geschrieben ist:

Quellcode der Rise-Demoanwendung:
https://gitlab.com/demensdeum/RiseDemoApplication

Sie können mir schreiben, wenn Sie möchten Habe ich Ideen, Vorschläge, Kommentare zur neuen Sprache?

Kern der Korruption

Das Atmen fiel mir schwer; das Helmdisplay zeigte genau eine halbe Stunde lang die Sauerstoffversorgung an. Während dieser Zeit plante Revil, das Stadtzentrum zu erreichen und die Todesmaske zu beschaffen. Überall war ein beißender grüner Nebel, hier gab es keine Luft, halbtote Menschen irrten durch die Straßen, Kreaturen, die vom Einfluss der Maske gefangen genommen wurden.
Das Geräusch von Schritten breitete sich durch die leeren Räume des verlassenen Gebäudes aus. Revil bewegte sich vorsichtig, da er nicht wusste, was ihn am gefährlichsten Ort des Technolabs erwarten würde.

Bewegen Sie sich nicht!
von M-Delcambre

Die Stadt ist seit langem von der Korruption erfasst, nicht jedoch von der irdischen, die den Geist von Politikern und Machthungrigen versklavt. Die Korruption von Death Mask übernimmt den Geist der Lebewesen, sie verlieren die Kontrolle über sich selbst und beginnen zu leben, um ihre Wünsche zu erfüllen. Alle, die unter den Einfluss gerieten, begannen zu glauben, dass sie als Ergebnis ihres Dienstes ewiges Leben erhalten würden. Um die Kontrolle zu behalten, benötigt die Maske einen ständigen Zustrom neuer Sklaven und die Eroberung neuer Gebiete mit reinen Kreaturen.

Im Nordwesten sah Revil das blaue Leuchten, von dem Alice ihm erzählte; in der Mitte befand sich ein riesiges Gebäude, das von den Technolab-Bauherren geschaffen wurde. Eine seltsame, groteske Ansammlung hervorstehender Rahmen und mechanischer Teile, als ob sie von einem Verrückten geschaffen worden wäre, hatte ein erschreckendes Aussehen.

Revil stieg aus dem Fenster des Gebäudes auf die Straße, um seine Reise fortzusetzen, als er plötzlich das laute Aufschlagen von Metallgliedern auf dem Asphalt hörte. Als er sich umdrehte, sah er den Dämon vor sich – Ein biomechanisches Wesen mit drei menschlichen Köpfen, ähnlich einer Spinne, bewegte sich langsam auf ihn zu. Ein Kreis von seltsamer, spiegelschwarzer Farbe erschien am Himmel; es war schwer, den Blick abzuwenden. Es gab ein ohrenbetäubendes Brüllen der Stadtsirene, die Sklavenkreaturen rief, um dem Dämon zu helfen. Die Situation war verdammt schlimm, aber Revil hatte für diesen Fall eine Überraschung parat…

Sabre-Plus C++ IDE

Begann mit der Entwicklung meiner eigenen IDE für C++ – Sabre-Plus. Die Hauptideen der neuen IDE – Seien Sie einfach, schnell und *hilfreich* in der Entwicklung. Derzeit ist der Quellcode unter der MIT-Lizenz auf GitHub verfügbar; Qt wird für die Arbeit mit der Benutzeroberfläche verwendet. In Zukunft plane ich, die gesamte Entwicklung im Zusammenhang mit C++ auf Sabre-Plus zu übertragen – Death-Mask wird definitiv migriert. Weitere Details zu den Punkten:

  • Einfach – Es ist geplant, nicht mehr als nötig hinzuzufügen – enthalten beispielsweise keine Quellcodeverwaltungs-Clients, integrierte Terminals und ähnliche Dinge. Die Funktionalität konzentriert sich ausschließlich auf die Codebearbeitung und Fehleranalyse. Der Editorcode sollte in einfache Klassen unterteilt werden, die ihren Teil der Arbeit korrekt erledigen (Unix-artig)
  • Schnell – betrifft sowohl die IDE-Codebasis als auch das Verhalten des Editors selbst. Alle Aktionen in der IDE sollten so schnell wie möglich sein, auch solche, die oft langwierig und komplex sind wie das Erstellen/Importieren von Projekten.
  • Helfen – Analyse typischer Fehler beim Schreiben und Kompilieren von Code. Korrigieren von Fehlern und Warnungen auf Benutzeranfrage. Geplant ist, eine Analyse des Anwendungsaufbaus auf einer bestimmten Plattform hinzuzufügen und Hilfeinformationen zur Installation der erforderlichen Bibliotheken und Komponenten anzuzeigen.

Um den Editor für Ihr Betriebssystem zu erstellen, müssen Sie das Qt 5 SDK installieren, den IDE-Code aus dem Repository herunterladen, die Datei Sabre-Plus.pro in Qt Creator öffnen und den Build ausführen:

https://github.com/demensdeum/saberplus