Beiträge von chesstiger

    Du hast recht, das muss AutoIt regeln.


    Beim Ausführen des folgenden Codes unter Windows springt der Speicherbedarf bei mir von 1.420K auf 1.054.092K.


    Dann frage ich mich wirklich, was da Jons Motivation war.


    Edit: Doch tatsächlich im Eifer des Gefechts src und dest bei memcpy verwechselt... Eben korrigiert. ^^


    Edit 2:

    Vielleicht passiert das doch in den Standard-Libs.

    Es gibt scheinbar Implementierungen von std::string, die über Referenzzähler eine Art Copy-on-Write realisieren.

    Je nach Version von libc++ kann das also automatisch passieren (Vgl Google-Suche nach "std string copy on write").

    AspirinJunkie Das wirft für mich jetzt die spannende Frage auf, wer von uns beiden im Detail richtig vermutet.

    Wird Copy on Write hier von AutoIt umgesetzt? Oder vom Betriebssystem? In den StdLibs auf keinen Fall, da hat das nichts verloren.


    Wie du selber schon sagst, wäre eigentlich nicht zu erwarten gewesen, dass AutoIt das selber umsetzt. Garantiert nicht auf String-Basis.

    Und auch wenn man an AutoIts komplette interne Speicherverwaltung denkt, halte ich das eigentlich für unplausibel.

    Was sollte das Motiv dafür sein? Das durchschnittliche AutoIt-Skript speichert ja keine Unmengen an Daten im RAM.

    Und bei der Programmierung wurde mit Sicherheit nicht berücksichtigt, wie sehr das deutsche Forum AutoIt schon mal missbraucht und verbiegt. :D


    Es scheint für mich logischer zu sein, dass das tatsächlich innerhalb der Windows-Speicherverwaltung umgesetzt wird.

    Das würde dann aber ja heißen, dass auch ein Programm ohne eigene Speicherverwaltung von dem Effekt betroffen sein müsste.

    Ich such mir grad mal eine Windows-Kiste zum Testen. ^^

    Klingt für mich nach (intelligentem) Copy on Write.


    Wikipedia


    Keine Ahnung, wie der NT-Kernel das handhabt, aber alle halbwegs modernen Linux und Unix Systeme verwenden CoW im Hauptspeicher auf Memory-Page-Basis.


    Im Linux-Kernel sind 4 KB als Standard-Page-Größe eingestellt.


    Falls die Windows-Speicherverwaltung sowas wie CoW intelligent und eigenständig (=> d.h. ohne Notwendigkeit einer expliziten Copy-Anweisung) umsetzt, könnte das das Phänomen erklären.


    1 MB wird in 250 Pages a 4 KB aufgeteilt. Ab dem zweiten 1MB-Block ist nur die letzte Page vom ersten Block verschieden, d.h. nur diese wird tatsächlich neu im RAM abgelegt.


    Edit: Das scheint Windows ja nicht so zu machen.

    Hast Du das hier wahrgenommen und umgesetzt?


    bplaced Wiki - Hilfe & Support :: Zugriffskontrolle
    bplaced Wiki - Hilfe & Support zu Datenbanken / Zugriffskontrolle
    wiki.bplaced.net


    Hatte gerade gezielt danach gesucht, weil es eigentlich normal ist, dass (Free-)Webspace-Hoster die dazugehörigen Datenbanken nur für den Zugriff von localhost aus freigeben.

    Es ist auch nicht wirklich üblich, einen Datenbankserver "direkt" ins Netz zu hängen. Normal baut man eher eine API in PHP oder Python oder so und regelt darüber auf dem Webspace die Datenzugriffe.

    Das Makes Variante schneller ist, war zu erwarten. Grundsätzlich lassen sich rekursive Algorithmen immer sehr schön schreiben und lesen... Aber in der Ausführung sind fast immer iterative Verfahren überlegen. Dazu ist der Overhead bei rekursiven Funktionsaufrufen zu groß.

    Das hat mich grad auch gecatcht. ^^


    Zur "ersten" Lösungsvariante von Musashi... Ich würde mal behaupten, dass das mit RegEx in AutoIt nicht eleganter zu lösen ist.


    AutoIt unterstützt leider keine Case Conversion bei RegExpReplace. Warum auch immer, PCRE kann das eigentlich.

    Wenn das so wäre, könnte man das mit nem recht einfachen Pattern lösen:


    Pattern: \h*(?:(?:([a-z][A-Z]+))|(?:([A-Z])([A-Z]*)))(\h*)

    Replace: \L$1\U$2\L$3$4


    Beispiel bei RegEx101


    Zur Datenbank... Das wird aber relativ aufwendig, wenn auch Markennamen davon erkannt werden sollen. Oder?

    So viel zum Wochenende...


    Punkt 2 und 3 habe ich gerade umgesetzt.

    Allerdings scheint nach ein paar Jahren der Update-Mechanismus nicht mehr so ganz so gut zu funktionieren. Hab's daher mal im ersten Beitrag neu verlinkt.


    Von den CHM-Dateien hab ich nie so viel gehalten. Da finde ich HTMLs wesentlich universeller und besser zu handhaben.

    Ein nettes Feature wäre es noch, automatisch auch eine CallTip-Datei zu generieren. :/

    Ich weiß nicht, warum, aber dieser Thread hier ist irgendwie völlig an mir vorbei gegangen... ?(


    water

    Eins nach dem anderen:


    Punkt 1:

    Das Problem, was du vor einer halben Ewigkeit beschrieben hast... Was soll ich sagen? It's not a bug, it's a feature. :D

    Mein Programm erkennt optionale Parameter und vermerkt dies auch in der Beschreibung. Einmal wird hinter dem Parametername "optional" vermerkt, und die entsprechenden Zeilen bekommen per CSS ein etwas abweichendes Aussehen. Außerdem werden beim Parsen für den "gelben Kasten" die Func-Zeilen verwendet, die ja die eckigen Klammern gar nicht enthalten. Da ist ja dann eigentlich durch den Default-Wert sofort erkennbar, dass die Angabe optional ist. War also tatsächlich eher eine Design-Entscheidung, als ein Problem. Aber der Aufwand, das als optionalen Switch in das Programm einzubinden, sollte sich in Grenzen halten.


    Punkt 2:

    Klar, das macht völlig Sinn, wenn man die Software in einen bestehenden Build-Prozess einbinden möchte. Stimme ich dir zu, setze ich um. Ist ja kein großer Aufwand.


    Punkt 3:

    Ja, das macht eigentlich auch mehr Sinn. Die gewählte Reihenfolge war eher nach Gefühl, aber so entspricht es ja ungefähr der logischen Reihenfolge. Hab da schon ein Bild vor Augen, wie sich das optisch macht.


    Punkt 4:

    Related gibt es doch. In dem Block werden sogar automatisch Sprunglinks zu den jeweiligen Funktionen gesetzt. ;)


    Ich würde mal vom Gefühl her sagen, dass ich am Wochenende wohl mal nen Stündchen dafür aufbringen kann.


    Und du wirst lachen, es ist quasi deine Schuld, dass ich gerade wieder auf diesen Thread gekommen bin. Hab grade auf einem Rechner die AD.au3 runtergeladen und dabei dann registriert, dass da ja eine Doku im HTML-Format bei ist. Und dachte noch so "Ach, schau mal, sowas hast du doch auch mal programmiert". :D

    autoBert

    Ja, das geht grundsätzlich auch mit dem in Windows 10 integriertem PDF-Drucker.


    Man muss dann allerdings erstens ein Programm haben, was das HTML-Dokument an den Druckertreiber weitergibt... Also z.B. IE oder Chrome. Die wiederum müssten dann im Hintergrund entsprechend aufgerufen werden, was mit dem IE noch geht, mit Chrome aber schon eine Gratwanderung wird.


    Und zweitens erzeugt der integrierte PDF-Drucker nur ganz primitive PDF-Dokumente, in denen bspw. Text nicht als Text abgelegt ist, sondern als Bitmap. Das führt dazu, dass der Benutzer keine einzelnen Elemente aus dem PDF-Dokument rauskopieren kann. Wir bereiten mit wkhtmltopdf ziemlich viele Listen und Tabellen auf, die wir an unsere Kunden rausschicken. Da soll der Kunde natürlich schon die Möglichkeit haben, auch Preise und Artikelbezeichnungen aus dem Dokument zu kopieren.


    Ich habe damals auch viel damit rumexperimentiert, bin dann aber doch bei wkhtmltopdf geblieben, weil es deutlich flexibler ist und auch noch portabel.


    Das hier ist zum Beispiel unser Ordersatz: https://3f-berleburg.de/download/Ordersatz.pdf

    Diese Datei wurde aus einer primitiven CSV-Datei automatisch mittels eines AutoIt-Skripts und wkhtmltopdf generiert. Besondere "Higlights", die nur mit wkhtmltopdf möglich sind... Das anklickbare Inhaltsverzeichnis mit Sprüngen zu den entsprechenden Abschnitten, die immerwiederkehrende Kopfzeile auf jeder Seite, die _nicht_ Bestandteil der ursprünglichen HTML-Datei ist usw...


    Kurzum: Für ganz ganz simple Sachen reicht auch der integrierte PDF-Drucker. Aber für alles weitere ist wkhtmltopdf echt ein super Alleskönner.

    Ich habe mir angewöhnt, für sowas wkhtmltopdf zu verwenden. Damit kann man aus einer HTML-Datei eine entsprechende PDF-Datei erzeugen. Sämtliche Berichtsaufbereitung bei uns in der Firma funktioniert damit. Der Vorteil ist, dass man super Templates nutzen kann und ansonsten nur ein wenig HTML/CSS beherrschen muss.

    Hab grad mal rumprobiert und Doku gelesen: Es gibt eine Windows-Systemvariable mit Namen SCITE_USERHOME.


    Wenn du die im selben Kontext vor dem Aufruf der SciTE-Executable überschreibst, solltest du eine andere SciTEUser.properties erzwingen können. Beispielsweise so:


    Code
    ECHO OFF
    ECHO %SCITE_USERHOME%
    SET SCITE_USERHOME=%APPDATA%\..\Local\SciTE_ohne_AutoIt
    ECHO %SCITE_USERHOME%
    "C:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe"

    Scheint ja wirklich irgendeine Firebird-Eigenart zu sein.


    MS SQL und MySQL würden sich nicht so verhalten. Kannst du das ganze vielleicht mit einem GROUP BY "austricksen"? Mir würde da bspw. die Gruppierung nach dem Feld HERSTSERNUM einfallen.

    Gruß Musashi

    P.S. : Es gibt im engl. Forum einen User namens Chesstiger - bist Du das ? Falls ja, editiere ich meinen Beitrag dort, sodass die Meriten an die richtige Adresse gehen :) .

    Musashi Yes, das bin ich. Trete da aber nicht wirklich in Erscheinung. Da ist mir die deutsche Community lieber.

    Aber schön, dass Jon mit Zugriff auf den Sourcecode zum selben Ergebnis kommt wie ich mit externen Tools. 8)


    Ansonsten gebe ich euch recht. Es wäre wirklich cool, wenn wir am Core mitarbeiten könnten. Im Endeffekt ist das zwar Jons gutes Recht - aber ich glaube, wir würden alle davon profitieren.

    Könnt ihr mal alle Nachteile für a3x Dateien nennen?

    Dazu müsste man erstmal wissen, was denn a3x-Dateien überhaupt sind. Zitat aus der Hilfe:

    Zitat

    Compiling Scripts with Aut2Exe
    Note: Scripts can be compiled with .a3x extension. They should be run with AutoIt.exe filename.a3x. The .a3x contains the script itself with all referred #include plus the FileInstall files. This format allows you to distribute smaller files as they don't include the AutoIt3.exe in each compiled script. You still need to have it accessible on the target machine but just AutoIt3.exe.

    Kurz zusammengefasst: Eine a3x-Datei enthält das Originalskript, alle Inludes und alle per FileInstall eingebundenen Dateien. Im Gegensatz zur exe-Datei fehlt hier aber der AutoIt-Interpreter (AutoIt3.exe). Der Interpreter muss also auf dem Zielsystem vorhanden sein.


    An Nachteilen bei deinem Anwendungsfall fällt mir da gerade ein... Nehmen wir an, Du schreibst Deine ganzen Skripte für den Editor unter AutoIt 3.3.14.5. Du erzeugst dann die entsprechende a3x-Datei, von den Includes her passt alles. Jetzt führe ich diese a3x-Datei auf meinem System aus - dummerweise habe ich AutoIt nach der Erstinstallation aber nie aktualisiert, also läuft bei mir alles mit 3.3.8.1. Du benutzt jetzt in deinem Skript aber Sprachfeatures (ich meine keine UDFs!), die aus neueren AutoIt-Versionen stammen. Eine kleine Auswahl dieser Fallstricke: Ternärer Operator, leere Arrays, Direktzugriff auf Indizes von Array-Ausdrücken (sowas: StringSplit(...)[0]), das Keyword Null, ObjGet mit Instanz-Angabe... Und dann gibt es Bruch. Denn meine "alte" AutoIt3.exe kann dein neues a3x-Skript nicht ausführen. Vermutlich würde das ganze einfach mit einem Syntax Error abschmieren.


    Ich schließe mich der Meinung der anderen an dieser Stelle an... Unterstütz einfach nur die aktuellste AutoIt-Version. Es gibt (fast*) keinen Grund, eine alte Version von AutoIt zu verwenden. Im Gegenteil: Solche Sachen wie der haarsträubende Hex-Fehler sind ein guter Grund, immer die aktuellste Variante zu nehmen.


    * PluginOpen war schon cool...