1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Mars

Beiträge von Mars

  • ISN AutoIt Studio

    • Mars
    • 8. Januar 2019 um 17:40

    Ohne nähere Informationen wie es zu dem Problem kommt wird dir niemand helfen können. Die Fehlermeldung besagt nur, dass "irgendwas" nicht stimmt (und das das Problem nicht nur eine einmalige Fehlfunktion war, sondern durch eine gewisse Situation hervorgerufen wird die unverändert bleibt). Bei mir stürzte der Helper ebenfalls ab wenn Skripte sich gegenseitig includen (siehe vorheriger Post von mir). Falls es das nicht ist musst du versuchen ein Minimalbeispiel bei dem der Fehler auftritt zu erstellen, das komplette ISN-Projekt in eine zip packen und hier posten.

    M

  • Ein- und Ausklappbarer Text in Scite

    • Mars
    • 7. Januar 2019 um 00:34

    Das sieht nach einer Menge Arbeit aus... Eigentlich sollte das nur als optisches Gimmick herhalten und ich dachte es wären "nur 1-2 Zeilen die ich irgendwo ergänzen muss, immerhin muss Scite ja auch irgendwoher wissen dass For+Next einen Block bilden".

    Daher werde ich von meiner Problemstellung zurücktreten... Es tut mir leid, dass du dir so viel Arbeit gemacht hast BugFix und ich jetzt garnichts mit den zusammengetragenen Informationen anfangen werde :/ Zumindest weiß ich jetzt, dass ich außer Farbeinstellungen niemals irgendetwas von Editoren anfassen werde, das ist genau wie RegEx, eine Welt für sich für die ich nicht die Kraft habe sie zu erforschen :D

  • ISN AutoIt Studio

    • Mars
    • 6. Januar 2019 um 14:02

    Moin, habe noch ein kleines Anliegen (sollte leicht zu fixen sein).

    Wenn man 2 Dateien hat die sich gegenseitig includen hat der AutoIt_Studio_Helper eine harte Zeit. Logisch betrachtet ist dieser Fall aber kein Problem, wenn man in der ersten Zeile jeweils ein #include-once hat. In Scite wird beim Ausführen der Datei 'a.au3' ein 'ba' in die Konsole geschrieben und beim Ausführen von 'b.au3' ein 'ab'.

    C: a.au3
    #include-once
    #include 'b.au3'
    
    ConsoleWrite('a' & @CRLF)
    C: b.au3
    #include-once
    #include 'a.au3'
    
    ConsoleWrite('b' & @CRLF)

    lg

    M

    Dateien

    Test.zip 1,33 kB – 709 Downloads
  • Ein- und Ausklappbarer Text in Scite

    • Mars
    • 6. Januar 2019 um 02:44

    Moin,

    Das Problem ist wie folgt: Ich möchte in Scite (und ISN, aber da das den Scite Editor nutzt ist die Lösung vermutlich die selbe) selbst Keywords definieren die einen Abschnitt der ein- und ausklappbar ist erzeugen.

    in den Properties habe ich schon herumgespielt (meine Keywords sind jetzt auch richtig gefärbt, haben Autocomplete usw) aber ich habe nirgends eine Einstellung gefunden bei der etwas als Start- oder Endpunkt zum ausklappen festgelegt wird.

    Die Suche über die Scite Homepage https://www.scintilla.org/SciTEDoc.html liefert mit den fold.explicit.start Ausdrücken in einer Properties datei (ich bin nicht genau sicher welche) schonmal einen Ansatz, aber ich habe es nach einem halben Tag herumprobieren immernoch nicht hinbekommen und wende mich mal ans Forum...

    lg

    M

  • NativeAutoItObjectEx (Objekte in AutoIt)

    • Mars
    • 5. Januar 2019 um 21:43

    Einige Jahre sind vergangen und an einigen Stellen habe ich mich geärgert, dass ich diese UDF hier nicht wieder angefasst habe nachdem sie doch so ein gutes Fundament für "groben Unfug" liefert. Also habe ich meine Freizeit investiert und einen Wrapper (und ein paar Features/Bugfixes) für die UDF gebastelt die es ermöglichen soetwas hier zu schrieben:

    Code
    #include 'AutoItObjectEx.au3'
    
    Class('Rect')
    
        Var('int iX;int iY')
        Var('int iW;int iH')
    
        Method('Rect_SetPos', 'int', 'int', 'int', 'int')
        Func Rect_SetPos($pObj, $iX, $iY, $iW, $iH)
            Local $this = _ObjGetVars($pObj)
            $this.iX = $iX
            $this.iY = $iY
            $this.iW = $iW
            $this.iH = $iH
        EndFunc
        EndMethod()
    
        Method('Rect_GetPos')
        Func Rect_GetPos($pObj)
            Local $this = _ObjGetVars($pObj)
            Return PtrS($this.iX & ',' & $this.iY & ',' & $this.iW & ',' & $this.iH)
        EndFunc
        EndMethod('ptr')
    
    EndClass()
    
    Global $Rect  = _ObjCreateFromClass('Rect')
    
    $Rect.SetPos(10, 0xDEAD, 123, 456)
    ConsoleWrite('! Rechteck: ' & StrP($Rect.GetPos()) & @CRLF)
    $Rect = 0
    Alles anzeigen

    Auch wenn die Au3 Entwickler keine Objekte wollen, wir haben sie trotzdem :D

    lg

    M

  • Compilieren hat sich verändert

    • Mars
    • 3. Januar 2019 um 16:57

    Versuch mal einen rechtsklick auf die Datei und dann wähle "Compile with Options" aus. Ich weiß nicht wie deine Einstellungen sind und ich weiß nicht wie man das wieder in scite reinbekommt, aber als behelfslösung müsste das gehen.

    M

  • BitOperations64

    • Mars
    • 26. Dezember 2018 um 13:15

    Sehr schön :)

    Mir ist noch ein "Schönheitsfehler" aufgefallen, das OnAutoItExitRegister sollte erst nach _MemVirtualAlloc ausgeführt werden, da sonst (zumindest theoretisch) die Möglichkeit besteht, dass _MemVirtualFree aufgerufen wird bevor überhaupt Speicher reserviert wurde. Wird wahrscheinlich niemals auftreten, aber irgendwie verursacht diese Reihenfolge einen Knoten in meinem Hirn :D

    lg

    M

  • Imagesearch crashed nach Hotkey Autoit

    • Mars
    • 25. Dezember 2018 um 15:57

    Der Generalverdacht ist begründet. 95%+ der Leute die hier mit ImageSearch ankommen wollen einen Bot bauen. Diese Funktion ist nichtmal in der Standard AutoIt-Installation enthalten, also muss man sich schon auf einschlägigen Seiten herumgetrieben haben um überhaupt darauf zu kommen.

    Der Punkt ist der: Warum sind alle Menschen so unglaublich dumm?

    Wenn man die Basics in Informatik drauf hat kann man für die meisten Spiele ohne fremde Hilfe einen Bot schreiben. Alles was man dafür tun muss ist ein bisschen was zu lesen, ein paar Standardprogramme (wie Taschenrechner, Snake, Tetris, Pong) schreiben und ein bisschen Ahnung von der Funktionsweise von Datentypen (z.B. was ist ein "int", ein "ptr" usw) haben. Statt zu LERNEN wie man das macht, sodass man die hier verbotenen Skripte ohne probleme selbst schrieben kann kommen alle direkt mit den typischen Bot-UDFs an. Das ist wie jemand der Sprengstoff und Gift herstellen will sich aber weigert den Chemieunterricht zu besuchen, weil man da erstmal mit Gemüsesaft den PH-Wert von Essig bestimmt.

    Also hier mein Tip:

    Verstehe was eine Bitmap ist
    Verstehe wie eine Bitmap im RAM liegt

    Verstehe wie eine Suche in dieser Bitmap nach einer speziellen Farbe aussehen würde

    Überlege dir wie du nach einer beliebigen Anordnung von Pixeln suchen würdest
    Lerne ASM (hier im Forum gibt es genug Info zu ASM)

    Schreibe in ASM eine Bildsuche die in einer Bitmap im RAM dein (teil) Bild findet (ohne dll und ohne alles)

    Mache diese Funktion öffentlich (unter Skripte) sodass auch andere was davon haben

    Mache mit deinem nun gewonnenen Können was du willst

  • [GDI+] Schneeflocken

    • Mars
    • 25. Dezember 2018 um 15:35

    Hohoho,

    Da wir gerade Weihnachten und ggf. bald auch etwas Schnee haben gibt es hier ein Skript mit dem man Schneeflocken generieren kann (die man villeicht in irgendwelchen anderen Skripten verwenden könnte). Von diesen Generatoren gibt es bestimmt schon tausende, jetzt gibt es noch einen mehr :)

    unnamed.png

    Code
    #include <GDIPlus.au3>
    
    ; Snowflake Settings
    Global Const $iSize = 400 ; Größe des Resultats in Pixeln
    Global Const $fPointRadius = 4 ; Radius der Punkte. Kleiner -> Feiner. Normal ist irgendwas zwischen 4 und 8
    Global Const $fSpread = 1 ; Wie chaotisch soll die Flocke aussehen? normal ist 0.5 bis 1
    
    ; GUI Settings
    Global Const $sTitle = 'Snowflake'
    Global Const $iW = $iSize > 512 ? $iSize : 512
    Global Const $iH = $iSize > 512 ? $iSize : 512
    
    _GDIPlus_Startup()
    Global $hGUI = GUICreate($sTitle, $iW, $iH)
    Global $hGFX_GUI = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global $hBMP_GUI = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX_GUI)
    Global $hBUF_GUI = _GDIPlus_ImageGetGraphicsContext($hBMP_GUI)
    Global $hFLA = Snowflake($iSize, $fPointRadius, $fSpread)
    
    OnAutoItExitRegister(Xit)
    GUISetState(@SW_SHOW, $hGUI)
    
    While GUIGetMsg() <> -3
        _GDIPlus_GraphicsClear($hBUF_GUI, 0xFF000000)
        _GDIPlus_GraphicsDrawImageRect($hBUF_GUI, $hFLA, $iW / 2 - $iSize / 2, $iH / 2 - $iSize / 2, $iSize, $iSize)
        _GDIPlus_GraphicsDrawImageRect($hGFX_GUI, $hBMP_GUI, 0, 0, $iW, $iH)
        Refresh()
    WEnd
    
    Func Refresh()
        Local Static $t = TimerInit()
        If TimerDiff($t) < 2000 Then Return
        $t = TimerInit()
        _GDIPlus_BitmapDispose($hFLA)
        $hFLA = Snowflake($iSize, $fPointRadius, $fSpread)
    EndFunc
    
    Func Snowflake($iSize, $iPointRadius = 4, $fSpread = 0.5)
        Local $hBMP = _GDIPlus_BitmapCreateFromScan0($iSize, $iSize)
        Local $hGFX = _GDIPlus_ImageGetGraphicsContext($hBMP)
        Local $hBRU = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    
        _GDIPlus_GraphicsSetSmoothingMode($hGFX, 2)
        _GDIPlus_GraphicsClear($hGFX, 0xFF000000)
    
        Local $aPoint = [$iSize / 2, $iSize / 2], $aTmp[2]
        Local $n = 0
    
        For $ii = 0 To 9999 Step 1 ; Eigentlich braucht man hier keine Abbruchbedingung... falls man SEHR GROßE Flocken will muss man hier hochschrauben.
            $n = 0
            $aPoint[0] = $iSize / 2
            $aPoint[1] = 0
            While $aPoint[0] > 1
                $n += 1
                $aPoint[0] -= $iPointRadius/3
                $aPoint[1] += Random(-1, 1) * $iPointRadius*$fSpread
                $aTmp[0] = $aPoint[0] + $iSize / 2
                $aTmp[1] = $aPoint[1] + $iSize / 2
                If Hex(_GDIPlus_BitmapGetPixel($hBMP, $aTmp[0], $aTmp[1]), 8) <> 'FF000000' Then ExitLoop
            WEnd
            For $i = 0 To 5 Step 1
                _GDIPlus_GraphicsFillEllipse($hGFX, $aTmp[0] - $iPointRadius / 2, $aTmp[1] - $iPointRadius / 2, $iPointRadius, $iPointRadius, $hBRU)
                _GDIPlus_GraphicsFillEllipse($hGFX, $aTmp[0] - $iPointRadius / 2, ($iSize - $aTmp[1]) - $iPointRadius / 2, $iPointRadius, $iPointRadius, $hBRU)
                Rotate($aTmp, $iSize/2, $iSize/2, 60)
            Next
            If $n < 4 Then ExitLoop
        Next
    ;~     ConsoleWrite($ii & @CRLF)
        _GDIPlus_BrushDispose($hBRU)
        _GDIPlus_GraphicsDispose($hGFX)
        Return $hBMP
    
    EndFunc   ;==>Snowflake
    
    Func Rotate(ByRef $aPoint, $mX, $mY, $nDegAngle)
        Local $x, $fAngle = $nDegAngle / 180 * 3.141593
        $x = $mX + Cos($fAngle) * ($aPoint[0] - $mX) - Sin($fAngle) * ($aPoint[1] - $mY)
        $aPoint[1] = $mY + Sin($fAngle) * ($aPoint[0] - $mX) + Cos($fAngle) * ($aPoint[1] - $mY)
        $aPoint[0] = $x
    EndFunc
    
    Func Xit()
        _GDIPlus_BitmapDispose($hFLA)
        _GDIPlus_GraphicsDispose($hBUF_GUI)
        _GDIPlus_BitmapDispose($hBMP_GUI)
        _GDIPlus_GraphicsDispose($hGFX_GUI)
        _GDIPlus_Shutdown()
    EndFunc   ;==>Xit
    Alles anzeigen

    lg

    M

  • ISN AutoIt Studio

    • Mars
    • 23. Dezember 2018 um 17:38

    Meine UDFs (sowie nahezu alle Programme) liegen in der Cloud und ich habe mehrere Computer mit unterschiedlichen Nutzernamen, das heißt der Pfad zu den UDFs ist mal "C:\Users\***\SkyDrive\AutoIt\UDF" und mal "C:\Users\***\OneDrive\AutoIt\UDF" (je nachdem ob man früher "OneDrive" oder "SkyDrive" genutzt hat (das wurde ja irgendwann mal vereinheitlicht)). Damit ein Skript also zuverlässig funktioniert müssen relative Pfade möglich sein, oder der Nutzername ist ein Wildcard und es wird geschaut ob der Ordner Sky- oder OneDrive heißt, oder beides :)

    (Das wäre mein Wunsch, bin aber nicht sicher wie kompliziert das zu lösen ist, AutoIt hat kein @OneDrive Makro hat das je nach Computer immer automatisch den richtigen Pfad findet)

    Ansonsten: TOP Idee, automatisches Autocomplete und automatische Tooltips hören sich sehr verlockend an.

  • FF.Au3 und MOZREPL aktualisieren

    • Mars
    • 21. Dezember 2018 um 21:54

    Leider ist die FF automatisierung den andauernden Updates zum Opfer gefallen. Es nervt einfach, dass man quasi jede Woche seine UDF überarbeiten muss damit sie wieder läuft.

  • Entfernung in Koordinatensytem berechnen

    • Mars
    • 17. Dezember 2018 um 11:16

    Hier mal eine kleine Erklärung was das Skript an der Stelle macht:

    Code
        ; Diagonal Laufen bedeutet man kann x und y Abstand verkleinern
        Local $iDist = 0 ; Startdistanz = 0
        
        ; Solange der Abstand in X Richtung von Punkt A und Punkt B > 0 ist UND
        ; der Abstand on Y Richtung von Punkt A und Punkt B > 0 ist kann man diagonal gehen.
        While Abs($ax - $bx) > 0 And Abs($ay - $by) > 0
            $ax += $ax > $bx ? -1 : 1 ; If ax > bx Then ax -= 1 Else ax += 1
            $ay += $ay > $by ? -1 : 1 ; If ay > by Then ay -= 1 Else ay += 1
            ; Die oberen 2 Zeilen bewegen den Punkt A diagonal in Richtung von Punkt B
            ; solange bis entweder X oder Y Koordinate von A und B übereinstimmen.
            $iDist += 1 ; Schrittlänge Diagonal = 1
        WEnd
        
        ; Jetzt ist Punkt A und B nur noch entweder in X oder in Y Richtung getrennt
        ; es ist also entweder
        ; Abs($ax - $bx) = 0 UND Abs($ay - $by) > 0
        ; oder
        ; Abs($ax - $bx) > 0 UND Abs($ay - $by) = 0
        ; Die Summe der diagonalen Distanz $iDist und dem Weg der in X oder Y Richtung noch
        ; fehlt ergibt automatisch die gesuchte Gesamtdistanz.
    
        Return $iDist + Abs($ax - $bx) + Abs($ay - $by)
    Alles anzeigen

    Immernoch ohne linksreinrechtsraus lässt sich das Abkürzen zu

    Code
        Local $iDist = Min(Abs($ax - $bx), Abs($ay - $by))
        ; Da man in beide Richtungen gehen muss um Diagonal zu laufen
        ; lässt sich das auch ankürzen (Schleife ist unnötig), der kleinere
        ; der beiden Abstände ist die gesuchte Distanz.
        $ax += $ax > $bx ? -$iDist : $iDist ; Den Punkt A in Richtung Punkt B
        $ay += $ay > $by ? -$iDist : $iDist ; diagonal verschieben.
    
        Return $iDist + Abs($ax - $bx) + Abs($ay - $by)
    
    EndFunc
    
    Func Min($a, $b)
        Return $a < $b ? $a : $b
    EndFunc
    Alles anzeigen

    lg

    M

  • Entfernung in Koordinatensytem berechnen

    • Mars
    • 17. Dezember 2018 um 01:07
    Zitat von Acanis

    aber im Prinzip ist es ja 2D

    Aaaaaaaaaaaaaaah jetzt hab ich das erst verstanden... Ich ging davon aus, dass die einzelnen Listen jeweils für eine Ebene im 3D stehen (das ist die übliche Darstellungsweise von 3D Arrays -> viele 2D Listen zusammen = 3D Liste). Wenn das so ist, dann ist mein Vorschlag unpassend und die Lösung komplett trivial. Habe es (erstmal ohne Links rein Rechts raus) kurz zusammengetackert.

    Code
    #include <Array.au3>
    
    
    $a = Create(3, 3, 3)
    _ArrayDisplay($a)
    
    ConsoleWrite('2:2:5 -> 2:3:2 = ' & Dist($a, '2:2:5', '2:3:2') & @CRLF)
    ConsoleWrite('1:1:1 -> 2:2:5 = ' & Dist($a, '1:1:1', '2:2:5') & @CRLF)
    ConsoleWrite('1:1:1 -> 2:3:2 = ' & Dist($a, '1:1:1', '2:3:2') & @CRLF)
    
    Func Dist(ByRef $aTable, $a, $b)
    
        Local $iTableElementsRoot = 0
        For $i = 0 To UBound($aTable) - 2 Step 1
            If $aTable[$i][0] > $aTable[$i + 1][0] Then ExitLoop
        Next
        $iTableElementsRoot = $i + 1
        Local $iTableWidth = UBound($aTable, 2)/$iTableElementsRoot
        Local $iTableHeight = UBound($aTable, 1)/$iTableElementsRoot
    
        ; Aus dem String die Zahlen holen
        Local $aTmp1 = StringSplit($a, ':', 2), $aTmp2 = StringSplit($b, ':', 2)
        Local $x1 = Int($aTmp1[0]), $y1 = Int($aTmp1[1]), $r1 = Int($aTmp1[2])
        Local $x2 = Int($aTmp2[0]), $y2 = Int($aTmp2[1]), $r2 = Int($aTmp2[2])
    
        ; 2D Kartesische Koordinaten mit 0 Index für den Punkt a und b.
        Local $ax = ($x1 - 1) * $iTableElementsRoot + Mod($r1 - 1, $iTableElementsRoot)
        Local $ay = ($y1 - 1) * $iTableElementsRoot + Int(($r1 - 1)/$iTableElementsRoot)
        Local $bx = ($x2 - 1) * $iTableElementsRoot + Mod($r2 - 1, $iTableElementsRoot)
        Local $by = ($y2 - 1) * $iTableElementsRoot + Int(($r2 - 1)/$iTableElementsRoot)
    
        ; Diagonal Laufen bedeutet man kann x und y Abstand verkleinern
        Local $iDist = 0
        While Abs($ax - $bx) > 0 And Abs($ay - $by) > 0
            $ax += $ax > $bx ? -1 : 1
            $ay += $ay > $by ? -1 : 1
            $iDist += 1
        WEnd
    
        Return $iDist + Abs($ax - $bx) + Abs($ay - $by)
    
    EndFunc
    
    Func Create($iTableHeight = 3, $iTableWidth = 3, $iTableElementsRoot = 3)
        Local $aRet[$iTableHeight * $iTableElementsRoot][$iTableWidth * $iTableElementsRoot]
        For $y = 0 To $iTableHeight - 1 Step 1
            For $x = 0 To $iTableWidth - 1 Step 1
                For $i = 1 To $iTableElementsRoot ^ 2 Step 1
                    $aRet[$y * $iTableElementsRoot + Int(($i-1)/$iTableElementsRoot)][$x * $iTableElementsRoot + Mod($i - 1, $iTableElementsRoot)] = $i
                Next
            Next
        Next
        Return $aRet
    EndFunc
    Alles anzeigen

    Edit: Mit Linksreinrechtsraus wird der Rechenaufwand nochmal etwas steigen (müsste sich bei korrekter implementierung ca. verdoppeln). Wenn es tatsächlich "nur" 8100 Koordinaten sind würde ich einfach ein 3D Array machen das für jeden x:y:r Wert einen kartesischen x:y Wert beinhaltet (spart schonmal die halbe Rechenzeit) und dann fällt mir gerade auf kann man den Loop der Dist+1 rechnet auch komplett rauswerfen sodass die Rechenzeit immer lineare komplexität hat. Wenn alles hardcoded ist kann man ggf. noch irgendwelche Vereinfachungen/Kürzungen vornehmen (das ist jetzt noch nicht ersichtlich), den Rest schaffst du villeicht selbst. Falls nicht schaue ich mir das nochmal an :)

    Zu wissen wofür diese Sache ist wäre aber auch wichtig, villeicht gibt es einen viel besseren Weg als das was du hier vorhast.

    lg

    M

  • Entfernung in Koordinatensytem berechnen

    • Mars
    • 16. Dezember 2018 um 17:09

    Erstmal muss eine Anständige Definition deines Raumes her.

    Code
    #Raum#
    Liste0
    ------
    Liste1
    ------
    Liste2
    ------
    ...
    ListeX
    
    #Liste#
    Spalte0|Spalte1|Spalte2|...|SpalteY
    
    #Spalte#
    Zeile0
    ------
    Zeile1
    ------
    Zeile2
    ------
    ...
    ------
    ZeileM
    
    #Spalte# (Alternativdefinition)
     0 | 1 |...|N
    N+1|N+2|...|2N
    ...
    (M-1)N+1|...|Mn
    Alles anzeigen

    1. Ich finde die Reihenfolge verwirrend. z.B. Blau 2:3:2 ist in der Dritten Liste in der 2ten Spalte an Position 2. Wäre da nicht 3:2:2 eine sinnvollere Bezeichnung?

    2. "Es gibt keine Grenzen" kann für diese Problemstellung viele verschiedene Bedeutungen haben. Hier gibt es folgende Parameter:

    - Anzahl Listen X

    - Anzahl Spalten Y

    - Anzahl Zeilen M

    - Anzahl Werte pro Zeile (N-1)

    Sollten die alle komplett frei wählbar sein?

    Sind negative Werte erlaubt? (z.B. Zeile -1)

    Ist mit Abstand(3:3:9, 1:1:1) = 1 gemeint, dass das "links rein rechts raus Prinzip" angewendet werden kann?

    Ist der Diagonalabstand zwischen 2 Elementen die sich nur um 2 (statt 3) Koordinaten unterscheiden auch 1? (Es Also es gibt Diagonalen im Raum (in R³ z.B. von 000 nach 111) und in der Ebene (in R³ z.B. 000 nach 011)

    usw.

    Ich habe jetzt keine Lösung im Angebot, aber falls jemand eine allgemeine Lösung sucht muss er diese Sachen wissen.

    Mein Tip wäre eine Transformation von deinem #Raum# in den üblichen R³ vorzunehmen. Dann lässt sich der Abstand sehr einfach berechnen:

    1. Solange 3D Diagonal laufen bis eine Koordinate erreicht wurde

    2. Solange 2D Diagonal (entlang der verbleibenden 2 Koordinaten) laufen bis die 2te Koordinate gleich ist
    3. Solange 1D Geradeaus laufen bis die letzte Koordinate auch übereinstimmt.

    Im R³ ist das ein Kinderspiel.

  • Zu : Funktion _Number() von BugFix

    • Mars
    • 15. Dezember 2018 um 18:23

    Also ich sehe keinen signifikanten Vorteil von Try Catch gegenüber @error. Wenn ich @error setze und nach meiner Funktion If @error Then ... (fehlerbehebung/return falls es mit dem Fehler unmöglich ist weiterzumachen) einfüge kommt das doch genau auf das gleiche heraus wie wenn ich im Fehlerfall eine exception werfe und diese anschließend Abfrage. Eine Art @error"Stack" wäre manchmal ganz praktisch, sodass das "durchreichen" besser funktioniert.

  • AutoIt: Passwort verschlüsselt in Skript/Programm ablegen

    • Mars
    • 6. Dezember 2018 um 20:52

    Moment, wenn ich das richtig verstanden habe was du machen möchtest brauchst du einen anderen Ansatz. Gehe immer davon aus, dass ein potentieller Angreifer deinen Quelltext komplett einsehen kann. Wenn du willst, dass das Programm nur mit einem Key richtig funktioniert musst du essentielle Funktionen verschlüsseln, sodass ein Angreifer ohne Schlüssel die Funktionalität nicht mehr feststellen kann (in deinem Beispiel kann er zwar das PW villeicht nicht herausbekommen, aber er kann die Abfrage einfach aus dem Code entfernen und das Programm trotzden nutzen).

    Hier ein Beispiel:

    Code
    OnlyWithPassword(123)
    
    Func OnlyWithPassword($iPassword)
        Execute(Decode($iPassword, '0xC2B2C385C398C3A3C281495B3905151A540E024A5456744C75C2B95070C2A055C38415C2A5450651C3BBC3B3C3862DC28A34C3A54F7EC292C3BE0822C38742C389C38128C387C2901D5AC39DC3ADC3A3C299453CC2B55CC38507C28C'))
    EndFunc
    
    Func Decode($iSeed, $sBinary) ; Nur als sehr primitivs Beispiel mit einem Integer einen Text via XOR zu verschlüsseln.
        SRandom($iSeed)
        Local $aRet = StringToASCIIArray(BinaryToString($sBinary, 4))
        For $i = 0 To UBound($aRet) - 1 Step 1
            $aRet[$i] = BitXOR($aRet[$i], Random(0, 255, 1))
        Next
        Return StringFromASCIIArray($aRet)
    EndFunc
    
    Func Encode($iSeed, $sData) ; Nur als sehr primitivs Beispiel mit einem Integer einen Text via XOR zu verschlüsseln.
        SRandom($iSeed)
        Local $aRet = StringToASCIIArray($sData)
        For $i = 0 To UBound($aRet) - 1 Step 1
            $aRet[$i] = BitXOR($aRet[$i], Random(0, 255, 1))
        Next
        ConsoleWrite("Decode($iPassword, '" & StringToBinary(StringFromASCIIArray($aRet), 4) & "')" & @CRLF)
    EndFunc
    Alles anzeigen

    Dabei werden keine Hashwerte verglichen und so wenig wie möglich offengelegt, wenn man den richtigen Schlüssel nicht hat. Es gibt auch keine If $Passwort = Valid Abfragen (die man einfach auskommentieren oder umschreiben kann wenn man den Code zur Hand hat) oder ähnliches. Es funktioniert mit korrektem Key und sonst nicht und im Code selbst lassen sich keinerlei Hinweise auf den Key finden. Hier wird eine RandomXOR Verschlüsselung benutzt, die kann man sehr leicht durch ausprobieren knacken, soll hier auch nur als Beispiel dienen.

    Edit: Execute ist hier leider der einzige (mir bekannte) Weg Programmcode effektiv mit einem Passwort zu schützen. Um Execute richtig zu verwenden musst du ein bisschen üben. Es gehen z.B. nur Einzeiler, keine Schleifen, usw.

    M

  • AutoIt: Passwort verschlüsselt in Skript/Programm ablegen

    • Mars
    • 6. Dezember 2018 um 17:49

    Habe letztens ein Video gesehen zu einer art "code crack challenge" bei der man volle Einsicht in den Quellcode hat und trotzdem relativ hoher Aufwand betrieben muss um an darin befindliche Daten zu kommen. Im Prinzip läuft das wie ein ziemlich verschachtelter Obfuscator.

    Wenn du also sicher bist dass keine Leute vom Fach dein Programm knacken wollen (z.B. irgendwelche Leute die zwar decompilen können und die "Basics" einer Sprache drauf haben, aber sich nie näher damit befasst haben), schau dir mal das Video an: YoutubeIstDeinFreund

    Selbstverständlich ist das nicht "sicher", aber mit einigen Tricks lässt sich so viel Verwirrung stiften, dass der 0815 Mensch aufgibt bevor er etwas von Hand entschlüsselt hat.

    lg

    M

  • [GDI+] Bild aus anderem Bild zusammensetzen

    • Mars
    • 27. Oktober 2018 um 12:28

    Das ASM berechnet Dif = ABS(R1 - R2) + ABS(G1 - G2) + ABS(B1 - B2) und summiert das über alle Pixel. Daher kann die Maximalabweichung 3*255=765/Pixel auch nicht überschreiten. Auf eine Gewichtung wurde bewusst verzichtet, ansonsten würde man eine Art "Grauwert" vergleichen und die "Farbe" würde zu wenig berücksichtigt.

    Ansich wäre eine vorherige Umwandlung in HSV wesentlich besser, da hier die Abstandsfunktion viel näher an dem liegt was man als Mensch wahrnimmt.

    Komprimieren wäre hiermit auch möglich. Angenommen man hätte z.B. 2^16 indizierte Teilbilder mit je 16x16 Pixel zur Verfügung (die nahezu alles abdecken), könnte man vermutlich mit einem einzigen Layer schon eine gute Approximation erreichen. Wenn man den Spaß dann weiterzieht mit mehreren Layern (also erstmal zieht man das was man approximiert hat von dem was man approximieren will ab und in jedem weiteren Schritt approximiert man die differenz des vorherigen schritts) schätze ich, kann man so ziemlich jedes "natürliche" Bild sehr gut kleinkriegen (angenommen 8 Layer mit je 16Bit/256px = 0.5 Bit/Px). Wenn man die 2^16 Teilbilder jetzt noch statistisch sortiert (die die am häufigsten benutzt werden nach vorne) kann man im 2ten Schritt einen Arithmetischen Encoder drüberjagen und sicherlich nochmal 50% rausholen. Aber das ist alles nur Theorie, so viel Zeit werde ich hier nicht mehr reinstecken :( Schätze mal es wird bei dieser Spielerei bleiben^^

    //OT

    Zur Bildkompression habe ich mir schon was anderes ausgedacht: Ein Convolutional Neural Network das via overfitting dazu gebracht wird, dass es nur ein einziges Bild erzeugen kann. Da es nur einen einzigen Zweck hat muss es nicht so viele Ebenen und so viele Filter haben (braucht also wenig Speicherplatz). Schätze mal das Kodieren dauert dann 2 Wochen und das Decodieren 1/10sek (wenn man es in AutoIt schreibt). Mit nem guten Parallelalgorithmus und einer Sprache die Multithreading gut unterstützt (z.B. Go) müsste das in ein paar Min codiert sein (immernoch viel zu lange und untauglich für echte Anwendungen).

  • Internet sperren für Prüfungssituationen

    • Mars
    • 26. Oktober 2018 um 16:14

    Und so ungerne ich es auch sage, den Stecker zu ziehen ist die EINZIGE Lösung die Computer sicher vom Internet zu trennen. Ich war selbst mal Schüler, und konnte sämtliche auferlegten Sperren nach kurzer Zeit problemlos umgehen. (gut, bei uns waren die Sperren auch nicht sonderlich ausgeklügelt).

    Zusätzlich würde ich auf jedem Computer USB deaktivieren (falls die Computer noch alt genug sind, dass Maus&Tastatur&Bildschirm keinen USB-Anschluss brauchen), damit die Schüler kein Tethering benutzen.

    lg

    M

  • [GDI+] Bild aus anderem Bild zusammensetzen

    • Mars
    • 25. Oktober 2018 um 21:55

    Ja irgendwie sind "echte" Bilder weniger Deckungsgleich als ich erwartet habe... Es ist möglich zwei Bilder geschickt so zu wählen, dass eine Umwandlung klappt, aber bei zufällig ausgewählten Bildern geht da nicht viel...

    (Klar dass ich als Beispielbild etwas gewählt habe bei dem es ausgezeichnet klappt :P)

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™