Beiträge von chesstiger

    You don't have permission to access /https://www.meineseite.de/61974798815668285678766617929415361842483865,merkzettel.html on this server.

    Das klingt so, als würdest du in der GET-Anfrage eine komplette URL mit Server übermitteln. Das ist falsch. Du übermittelst an den Host http://www.meineseite.de die Anfrage nach /61974798815668285678766617929415361842483865,merkzettel.html. Sprich, du darfst nur einen Teil der URL angeben. Wenn ich gerade nicht völlig falsch bin.

    Kurz mal als Blick über den Tellerrand: In diversen Programmiersprachen gibt es ganz andere Konzepte, um Fehler zu erkennen und abzufangen.


    Das, was wir hier haben, ist die althergebrachte Methode, wie sie auch in purem C zum Einsatz kommt. Eine Funktion gibt "Null" (das ist ein englisches Wort) bzw. "0" zurück, was beides im Endeffekt auf den Zahlenwert 0 hinausläuft. Eine typische Fehlerüberprüfung in C sieht dann also so aus: if(myVal == NULL) { ....

    Da hier zurecht Verwechslungsgefahr besteht, existiert in der Standardbibliothek noch die globale Variable errno. Eine Funktion setzt diese bei einem Fehler auf einen situationsabhängigen Zahlenwert (ungleich 0). Damit wären wir dann bei einer Fehlerabfrage a la if(errno) { .... Das kommt einem AutoIt-Programmierer jetzt vermutlich bekannt vor.


    Nachtrag: Es gibt tatsächlich auch Sprachen, die schlicht NULL und 0 als unterschiedliche Werte betrachten. "0" ist bspw. eine Instanz der Klasse Integer, "NULL" ist tatsächlich 0.


    Das Problem hierbei ist, dass Fehlerbehandlung optional wird. Der Programmierer kann Fehler abfangen - muss es aber nicht. Das kann aus Faulheit, aus Unwissenheit oder einfach durch Vergessen geschehen, ist aber eine sehr große Fehlerquelle. Darüber hinaus ist die Fehlerbehandlung syntaktisch auch nicht vom wirklichen Anwendungscode unterscheidbar.


    In modernen Hochsprachen wird daher meist ein eigenes Sprachelement für diese Fehlerbehandlung genutzt, oftmals Exception (dtsch. Ausnahme) genannt. Dabei unterscheidet man bspw. bei Java zwischen einer checked und einer unchecked Exception. Beide haben gemein, dass sie mittels eines try-catch-Blockes abgefangen werden. Eine unchecked Exception kann ich abfangen, eine checked Exception muss ich abfangen. Im try-Bereich steht der Code, der eventuell einen Fehler auslösen könnte. Im catch-Bereich steht der Code, der den Fehler beim Auftreten behandelt. In Java sähe unser Beispiel mit Number() irgendwie so aus:

    Code
    1. try {
    2. myVal = Integer.parseInt(myString);
    3. } catch(NumberFormatException nfe) {
    4. System.out.println("Invalid Number");
    5. }


    Damit ist der normale Ablauf (try) strikt vom Fehlerfall (catch) getrennt. Außerdem können Ausnahmen bei verschachtelten Aufrufen auch nach oben "durchgereicht" werden.


    Sowas wäre der moderne Weg, Fehler abzufangen. Aber leeeider bietet AutoIt uns das nicht.

    Einmal die SSD, eine Samsung 850 EVO M.2:


    Und einmal die Hybridplatte Seagate FireCuda 2TB über SATA (ST2000LX001):


    Mit den verschieden komplexen Bytemustern würde mich jetzt auch interessieren.

    Ich habe jetzt nicht weiter rumprobiert, aber es kann durchaus sein, dass du da an die Grenzen von normalen GUI-Controls kommst. Evtl. müsstest du für so schnelles Zeichnen auf GDIPlus (ö.Ä.) ausweichen.


    Ich hab mal für ein Theaterstück einen Countdown bis zum Beginn programmiert. Das war aber so eine "Es geht in einer halben Stunde los, kriegen wir das noch hin?"-Aktion, daher... Keine Resourcenfreigabe oder so. Bitte so nicht produktiv verwenden!


    Wenn du es gern komfortabler hättest... Ich habe mal Musashis Idee aufgegriffen und die Tracing-Funktion durch modifizieren des Skriptes in mein SynSug (Syntaktischer Zucker für AutoIt) integriert. Daher kannst du jetzt ohne zusätzlichen Aufwand Tracing nutzen, indem du nach der Installation in SciTE kurz Strg+Umschalt+F5 drückst. Einfacher geht's eigentlich kaum. Geht etwas am Sinn des Projektes vorbei, aber da war halt schon ein Integrationsskript für SciTE und ein Parser vorhanden, daher war der Rest ziemlich schnell programmiert. Alles grundsätzliche zu SynSug im Thread, der neue Code mit Tracing im git-Repo.


    Thread: SynSug - Syntaktischer Zucker für AutoIt (Update v1.1.0 Dictionaries)


    Das folgende Testskript erzeugt dann den nachstehenden Output:


    Code
    1. !TRACE> Entered function ROLLDICES().
    2. !TRACE-> Entered function ROLLDICE().
    3. !TRACE-> Leaved function ROLLDICE() after 0.0492307782073214 ms.
    4. !TRACE-> Entered function ROLLDICE().
    5. !TRACE-> Leaved function ROLLDICE() after 0.0185982939894325 ms.
    6. !TRACE-> Entered function ROLLDICE().
    7. !TRACE-> Leaved function ROLLDICE() after 0.0178689491271018 ms.
    8. !TRACE> Leaved function ROLLDICES() after 0.257458736402733 ms.


    Man kann sich jetzt über Tools > Syntactic Sugar (Debug to File) auch anschauen, was mein Parser daraus baut. Der relevante Ausschnitt:

    Ich würde das Pferd mal von hinten aufzäumen. In der Funktion ist dir nicht bekannt, wie der aktuelle Scope benannt ist. Beim Aufruf aber schon. Also würde ich schon den UDF-Aufruf über eine Zwischenfunktion erledigen, innerhalb derer ich diverse Debug-Daten ausgeben kann. Statt eines myFunc(1, $b) schreibe ich dann in meinem Beispiel c(myFunc, 1, $b).


    Die Zwischenfunktion muss leider so umständlich geschrieben werden, da AutoIt keine VarArgs-Definitionen unterstützt. Außerdem können so keine ByRef-Parameter oder Standardwerte für Parameter genutzt werden. Aber immerhin etwas.


    Hi,


    ich finde deine JSON-UDF grundsätzlich super und habe sie auch schon bei mehreren Gelegenheiten (Parsing von Web-Services) verwendet. Ich bin jetzt aber auf einen JSON-String gestoßen, der (laut Augenschein und Internet) standardkonform ist, aber die UDF zum Abschmieren bringt. Ist auch nicht sonderlich komplex, scheint an dem Array zu liegen:



    Es ging beim Auslagern der Postings in einen anderen Thread lediglich darum, den ursprünglichen Sinn des Threads zu erhalten, nämlich eine Sammlung von nützlichen regulären Ausdrücken. Nicht direkt auf den Schlips getreten fühlen. ;)


    Bei dem Punkt mit der Erklärung gebe ich dir grundsätzlich recht. Auch der Tipp zu regex101 war gut. Aber genau für solche Zwecke gibt es mindestens ein gutes, deutschsprachiges Tutorial hier im Forum, welches auch auf die Unterschiede zwischen AutoIt-PCRE und dem Rest eingeht. Link hab ich leider gerade wegen nicht funktionierender Suchfunktion nicht parat. Darüber hinaus gibt es noch etliche andere gute RegEx-Tutorials in Englisch oder Deutsch, die zwar nicht auf AutoIt eingehen, aber dennoch RegEx an sich anschaulich vermitteln. Das ist imho auch der bessere Weg, eine formale Sprache wie RegEx zu lernen. Jeden Ausdruck in der angesprochenen Sammlung nochmal haarklein zu erklären macht deswegen wenig Sinn und erzeugt eher Overhead. Wer RegEx (meinetwegen dank des Tutorials) kann, braucht es nicht. Und zum Lernen und Verstehen der Ausdrücke nützt eine komplette Erklärung ob der Komplexität und den fehlenden Grundlagen vermutlich auch eher wenig.


    P.S.:

    Eigene Beiträge in Foren in der Art zu löschen ist unhöflich. So kann man später nicht mehr nachvollziehen, was warum geschrieben worden ist. Man nimmt der Diskussion den Zusammenhang. In einem echten Gespräch kann man ja auch nicht einfach ganze Sätze im Nachhinein rausstreichen.

    Hi,


    ich bin im Rahmen eines größeren Projektes mit AutoIt auf ein kleines Problem gestoßen. Konkret betrifft das das Thema Subclassing, also Veränderung der internen Nachrichtenverarbeitung eines Fensters (und damit Controls). Dazu gibt es grundsätzlich mehrere Möglichkeiten. Man kann einmal die Subclassing-API verwenden, man kann aber auch simpel über SetWindowLong die WndProc verändern (siehe Code). Ich präferiere eigentlich die zweitere Möglichkeit, weil die Subclassing-API bei mir immer mal wieder Probleme verursacht hat.


    Nun stehe ich jedoch vor dem Problem, dass beim Ersetzen der WndProc scheinbar AutoIts internes Nachrichtenhandling nicht mehr greift. Das heißt, ich kriege weder im OnEvent-Modus noch über GUIGetMsg() irgendwelche Aktionen mit dem Control mit. Auch ein Minimalbeispiel zeigt, dass das Problem nur beim Ersetzen der WndProc auftritt, nicht beim Nutzen der Subclassing-API. In den jeweiligen WndProcs/SubclassingProcs kommt jedoch die entsprechende Klick-Nachricht korrekt an. Übersehe ich etwas, oder geht hier AutoIt-Intern was gewaltig schief?


    Zunächst: Was ist eine ID? Nicht zwangsläufig ein aufsteigendes Nummernfeld. Eine Software, die wir im Haus verwenden, nutzt beispielsweise einen Hash aus UserId, Timestamp und Objektdaten. Da ich gar keine rein numerische ID habe, die sich aufsteigend bildet, kann ich Datensätze beliebig tauschen, ohne Angst vor doppelten IDs haben zu müssen.

    Wann immer ich in AutoIt mit TCP-Verbindungen hantiere, nutze ich Kips TCP-UDF. Diese basiert auf Events, d.h. du registrierst eine Funktion für ein Ereignis (bspw. Datenempfang), die dann von der UDF aufgerufen wird. Das finde ich wesentlich angenehmer zu programmieren. Dort gibt es auch die Möglichkeit, ein Verbindungsabbruch-Ereignis zu registrieren. Ich weiß nicht, wie Kip das intern umgesetzt hat, aber wenn du die Info in AutoIt irgendwie bekommen kannst, dann wird diese UDF das auch weiterreichen. Einfach mal probieren:


    https://www.autoitscript.com/f…325-tcp-udf-event-driven/

    Hm, vielleicht habe ich da einen anderen Grad an Professionalität im Kopf.

    Wir hatten einen einzigen Computerraum mit insgesamt 14 Clients. Sind in meinem letzten Schuljahr alle auf Windows 8.1 umgestellt worden. Das waren einfache Desktoprechner mit Unterklasse-Ausstattung. Darauf lief dann wie bereits gesagt Windows in einer Home-Variante, nicht mal Pro (d.h. keine Domänenfunktionen). Zur Absicherung haben wir praktisch nur uralte PC-Wächter-Karten gehabt, mehr nicht. Der Switch war so ein TP-Link-Ding, ohne smarte Funktionen. Da haben wir auch sehr viel mit AutoIt-Skripten administriert, vorher (=> die AutoIt-Skripte habe ich in der 9. Klasse programmiert) wurde Turnschuh-Administration gemacht, d.h. bei einem Update von LibreOffice hat der zuständige Lehrer einen kompletten Nachmittag geopfert und jedes Update an jedem Rechner von Hand installiert.

    Aber auch wir haben schon Prüfungen an diesen Rechnern geschrieben, damals noch auf Windows XP. Das war aber vor der Zeit, in der ich aktiv bei der Administration mitgewirkt habe. Lief damals über eine Software namens NetSupport School.

    War bei uns nur begrenzt der Fall. Heißt: Die Verwaltung hatte zwar ein separiertes Netz, welches auch mit intelligenten Switches unterteilt war, aber wir (mit Wartung beauftragte Lehrer und Schüler) hatten nur Zugriff auf unser abgekapseltes Subnetz, ohne an die Switches zu dürfen.


    Gut, das passiert ja hoffentlich, bevor Schüler den Raum betreteten. Sonst könnte man ja auch einfach den Au3-Prozess, der gpupdate ausführt, abschießen.

    Das kannst du auch nicht. Das ist der von mir angesprochene Informationsverlust. Du kannst aus Tagen nicht wieder Monate oder Jahre machen.


    Du musst bei der Differenzbildung schrittweise bei der größten Einheit (Jahre) anfangen. Wenn das nicht mehr geht, mit Monaten weitermachen usw...


    So kann man das schön simpel machen:

    Edit:


    Kurz nochmal der Algorithmus in Worte gefasst. Mag effizienter gehen, aber so habe ich es auf einem Blatt Papier auch gelöst.

    1. Beginne bei Einheit Jahren.

    2. Addiere so lange 1 Einheit auf das Startdatum, bis es bei der nächsten Addition größer als das Enddatum wäre. Zähle dabei die Additionen.

    3. Ausgehend von dem neuen Startdatum wiederhole Schritt 2 mit der nächstkleineren Einheit, bis keine nächstkleinere Einheit mehr existiert.

    4. Die gezählten Additionen sind der Abstand der beiden Daten.

    Naja, wer als Schüler die per GPO vorgegebene lokale Firewall aushebeln kann, der hat's auch verdient, zu spicken. :D


    Grundsätzlich ist eine Hardware-Firewall natürlich besser geeignet, obwohl auch diese umgehbar ist. Aber verglichen mit einer reinen Software-Lösung (vorhandenes AD vorausgesetzt) steht hier ja ein anderer Kostenfaktor im Raum. Ich weiß noch, was es für ein Krampf war, in der Schule Anträge für neue Hardware durchzubekommen. Und ich war schon Mitglied in allen wichtigen Gremien wie SchuKo usw... Ich könnte mir schon denken, was für eine Diskussion bei 400 Euro für einen Switch mit Firewall fällig wären.