Beiträge von Lambdax

    Ich schreibe an einem Frontend für eine Modifikation welches einem Spiel einen Multiplayer modus gibt. Und mir ist über die zeit aufgefallen das spieler diesen mod auch nutzen können wenn sie es pirated haben. Das misfällt mir und ich will die externe anwendung dahingehend ausweiten das diese überprüft ob der nutzer auch wirklich das Spiel in seiner Steam Bibliothek besitzt. Oder anders gesagt ich will den zugang zu der mod zumindestens erschweren für die jenigen die die das spiel nicht legitim besitzen.


    Eine google suche war dabei jetzt nicht hilfreich also habe ich mir mal die Steam dateien angesehen. Im Ordner "Steam\steamapps" befinden sich appmanifests, die die ID's der spiele enthalten die via Steam installiert worden sind, aber so eine datei lässt sich zuleicht selbst erstellen.


    Dann ist mir eingefallen: Als ich mal gecrackte software untersucht habe ist mir aufgefallen das immer die "steam_api.dll", die sich im spiele ordner selbst befindet, verändert wird. Wenn ich davon einen hash hardcode oder auf einem server bereithalte und prüfe ob der stimmt bei jedem start dann würde das zumindestens solange funktionieren bis die "steam_api.dll", entweder durch steam selbst, oder durch das spiel geupdated wird. In anderen worten, ein update und der mod geht offline bis der hash aktualisiert wurde.


    Da das nicht so praktisch ist frage ich mich ob es eine möglichkeit gibt steam direkt zu fragen, entweder durch ein argument an die steam.exe oder durch einen dllcall, ob der angemeldete nutzer das spiel hat oder nicht. Ich halte das für laufzeitfreundlicher aber habe bisher nicht herausgefunden wie.


    Hat jemand eine idee? :S

    Mir ist bei der entwicklung der _storageS udf aufgefallen das maps langsamer werden je mehr elemente darin gespeichert werden. Das passiert beim dictionary auch, aber nicht so schnell.


    Hier mal veranschaulicht. Die map und das dictionary bekommen jeweils eine millionen elemente. Die zeit die beide je element brauchen wird in ein array gespeichert und am ende wird verglichen.

    Man sieht das die map ab ca. 120000 langsamer wird neue elemente hinzuzufügen als das dictionary. Mir ist das auch bei .Exists aufgefallen, hab ich in dem test aber nicht beachtet. Zwischendurch wird die map auch wieder schneller. Aber generell braucht es deutlich mehr zeit die eine millionen elemente der map zuzufügen als dem dictionary.


    Das script braucht einige minuten. Leider ist das ergebnis zu groß für den anhang.

    Bucket-Sort also. Noch nicht gehört von, danke fürs mitteilen :thumbup: Und die buckets müssen auch noch sortiert werden. Dann vielleicht so hier



    Zeit: 0.247 s

    Ich habs so gemacht: Quasi, keine ahnung ob sowas einen namen hat, ich nenne es mal ein kassen system. Jede wort länge hat eine eigene spalte (map in dem fall hier), wie in der kasse wo nach den münzen sortiert wird. Am ende werden die spalten (maps) einfach zusammen geworfen. Das braucht dann auch nur 0.231 s



    Edit: Hab nen bug gefunden, jetzt läuft es bei 0.203 s

    Dann müssen wir die Gesamtgröße (inkl. Script und aller Zusatzdateien) vergleichen. Das wird absurd kompliziert.

    Es geht hier ja nicht darum, eine Kompressions-UDF zu entwickeln. Da gibt es bereits zahlreiche Methoden, um Text/Grafik/Binaries zu komprimieren.

    Ich wollte einen Wettbewerb, was mit reinem AutoIt-Code möglich ist.

    Vielleicht um auch mal kuriose Lösungswege aufzuzeigen.

    Alles klar, dann ist diese Variante raus. Für was anderes reicht meine Erfahrung leider nicht. Bin also gespannt was hier nächsten monat rauskommt :theke:

    Ok, ich habe das nicht explizit gesagt/geschrieben, aber ich hielt das auch für selbstverständlich.

    Man muss die komprimierte Datei ja schließlich irgendwie wieder entpacken können, z.b auf einem anderen Rechner.

    Und wenn das Wörterbuch nicht mitzählt, dann kann man natürlich gigantische Kompressionsraten erzielen.

    Das halte ich nicht für Selbstverständlich. Mein Gedanke war, das zwei rechner auch die selbe Kompressions technik kennen müssen um den Text zu De/Komprimieren. Warum nicht also auch eine Standartisierte Wortliste, die die meißt verwendeten Wörter einer Sprache beinhaltet. Quasi das der Komprimierungsvorgang nur jene Worte austauscht die er auch kennt. Was AspirinJunkie da erzählt halte ich für ausgeschlossen, den dann müsste jeder Rechner jeden Text der je versendet werden würde, bereits vollständig kennen. Das wäre absurd platzbedürftig, je nach fall. Aber meine methode hingegen halte ich nicht für unrealistisch.

    Eine Kompressionsrate besser als beim ZIP-Format erscheint mir zu gut, um wahr zu sein.

    Nur um das nochmal deutlich zu sagen: Ein verwendetes Wörterbuch bzw. eine Ersetztabelle muss natürlich im Kompressionsformat mit enthalten sein, sodass es von der Größe her mitzählt.

    Ehh, wo hast du das gesagt? Lese ich zum ersten mal


    Edit: selbst beim nochmal lesen, sehe ich diese regel nirgends. Bin mittlerweile bei 72.584 %. Wenn diese art der komprimierung nicht erlaubt ist, dann bin ich raus

    Hab mit Kompressionen noch nie was am hut gehabt. Tu mich auch mit der nutzung von externen libaries schwer. Aber warum nicht mal selbst versuchen


    Bisheriger Stand

    Da ist noch Luft denke ich

    Ich kann nicht behaupten alles davon zu verstehen, aber ich denke ich kann es mir vorstellen.


    Jedenfalls hab ich mal ein wenig herum probiert umzusehen wer noch so davon profitiert in Autoit.


    Locale Variablen - Ja

    Arrays - Nein

    Maps - Nein

    DictObj - Nein


    Dann hab ich einfach mal eintausend variablen erstellt in ein script geschrieben

    Code
    ....
    Global $990 = _Data()
    Global $991 = _Data()
    Global $992 = _Data()
    Global $993 = _Data()
    Global $994 = _Data()
    Global $995 = _Data()
    ....

    und diese mit je 1 MB gefüllt. Das selbe dann nochmal mit Localen und ohne sie in einen Scope zusetzen.


    Und auch hier profitiert Autoit davon.

    Bin bei der arbeit mit einer UDF darauf gestoßen das Globale variablen die die gleichen Daten tragen anscheinend von Autoit nicht erneut in den Speicher geschrieben werden, sondern wohl möglich nur einen Pointer bekommen.


    Beispiel.

    1. Ich Erstelle ein test datensatz von 1 MB

    2. Ich schreibe diese per Assign in 1000 verschiedene globale variablen. Immer den selben datensatz.

    3. prüfe danach ob die variablen auch wirklich die daten tragen die sie sollen

    4. prüfe mit ProcessGetStats() wie der RAM verbrauch ist


    und stelle fest

    Vor dem schreiben: 15.3 MB

    nach dem schreiben: 15.7 MB


    Und das obwohl 1 GB an daten vorhanden sind und auch ohne probleme ausgelesen werden können.



    Jetzt verändere ich den Test

    1. Ich Erstelle ein test datensatz von 1 MB

    2. Ich schreibe diese per Assign in 1000 verschiedene globale variablen und füge dem datensatz noch $i hinzu

    3. prüfe danach ob die variablen auch wirklich die daten tragen die sie sollen

    4. prüfe mit ProcessGetStats() wie der RAM verbrauch ist


    und stelle jetzt fest

    Vor dem schreiben: 15.3 MB

    nach dem schreiben: 1,97 GB



    Ich fand das interessant zu sehen, ist mir so vorher noch nicht aufgefallen. Vielleicht findet ihr das auch interessant. Deshalb der Post.


    UDF gibts im Anhang oder hier zum selbst probieren: https://github.com/OfficialLambdax/_storageS-UDF

    Ich hab das Programmier handwerk nicht gelernt sondern mir selbst beigebracht. Dementsprechend fallen meine Antworten und Repositories regelrecht Amateurhaft aus.


    Momentan versuche ich zu bewerkstellen eine TCP libary zu programmieren welche zu gleich leicht zu bedienen ist, sichere verschlüsselungs techniken bereitstellt, stabil ist und auch so schnell ist wie es in Autoit nur möglich ist. Damit will ich erreichen das Anfänger und Amateur Programmierer, wie ich, endlich leichten zugang zu den modernen Sicherheitstechniken bekommen und somit das Internet sicherer machen. Zumindestens soweit es mir möglich ist. Gleichzeitig soll diese libary auch genug komplexität besitzen, das damit ausgefallene und große projekte umgesetzt werden können.


    Praktisch eine GoTo libary für Autoit wen es um Kommunikation zwischen computern geht.


    Allerdings ist das für mich eine ganz schöne aufgabe und ich sitze seit bereits Mitte 2021 daran.

    Finden kann man das gesammelt hier: https://github.com/OfficialLambdax/_netcode-UDF


    Anonsten habe ich einfach nur Spaß am programmieren :theke:


    Tschüss und schönen tag noch

    Ich würde nun gerne sagen "ich habs gewusst" aber musste selber erst mal wühlen und hatte das gleiche Ergebnis wie du.

    Irgendwo in einem Unterbeitrag hatten sie das www. davor - ausprobiert - funktioniert :P

    Manchmal ist es auch ein ww3. oder was anderes was davor muss. In der Regel teil der Browser dem proxy mit was er will. Ich hab die dinge aber immer alle abgeschnitten und nicht gedacht das sich je ein problem daraus ergeben würde. Ich hab dir jedenfalls auch ein Dank in dem Script gewidmet.