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. Andy

Beiträge von Andy

  • hash aus .md5 datei rausholen

    • Andy
    • 15. Oktober 2014 um 21:37

    such doch per Regex einfach einen 16-stelligen hexcode

    [autoit]

    (?:[^a-fA-F0-9])([a-fA-F0-9]{32})(?:[^a-fA-F0-9])

    [/autoit]


    suche in der kompletten Datei, also per fileread($datei)

    //EDIT

    Code
    (?:[^a-fA-F0-9]|\b)([a-fA-F0-9]{32})(?:[^a-fA-F0-9]|\b)

    findet den Hash auch an Wortgrenzen

  • Like oder nicht Like - das ist die Frage!

    • Andy
    • 15. Oktober 2014 um 18:06
    Zitat von autoiter

    wenn du dir deinen Beitrag nochmal langsam durchliest, merkst du sicher, dass er ziemlich schräg ist und eigentlich gar keinen Sinn macht. Aber ich denke, deinen Punkt habe ich schon verstanden: Nur Änderungen umsetzen, wenn sie einen wirklichen Nutzen haben.

    Naja, ich bin mal gespannt was passiert wenn du im Arbeitsleben angekommen bist und jemand von dir Änderungen verlangt, die KEINEN wirklichen Nutzen haben, und deren Auswirkungen du garnicht abschätzen kannst, dafür aber die Verantwortung übernehmen sollst! Mit dem Hinweis, dass du dies bitteschön neben deiner eigentlichen Arbeit auch noch machst.

    Dass du das dann auch "schräg" findest, darauf würde ich jetzt sogar wetten.

  • Like oder nicht Like - das ist die Frage!

    • Andy
    • 15. Oktober 2014 um 13:26

    Ich habe beruflich sehr viel mit Optimierungen und Verbesseungen in der Ablauforganisation und Produktion zu tun. Da gibt´s eine einfache Regel, die auch von jedem verstanden werden kann:" Wenn´s nix bringt, lass es!"
    Hier aufs Forum übertragen heisst das nichts anderes, als dass jeder für sich entscheiden muss, ob es eine OBJEKTIV MESSBARE Verbesserung gibt, wenn ein wie auch immer Punktesystem eingeführt wird!
    Jetzt sagen die meisten Befürworter:" Ja aber es ist auch keine Verschlechterung!"
    Und genau DARUM gehts, wenn das Punktesystem uns Forianern keine Vorteile bringt, dann sollte man es nicht einführen, nur weil einige davon keine Nachteile haben :rolleyes:

  • Like oder nicht Like - das ist die Frage!

    • Andy
    • 15. Oktober 2014 um 07:06

    Mir stellt sich immer noch die Frage nach der Sinnhaftigkeit eines wie auch immer genannten Punktevergabesystems, wenn ich diese Punkte nicht in eine Suche miteinbeziehen kann.
    Schlimmer noch empfinde ich die "beste Antwort", katastrophaler Weise noch bestimmt vom FRAGENDEN, das ist idR. im gesamten Thread derjenige, der am allerwenigsten Ahnung vom Thema hat!
    Es wird offensichtlich davon ausgegangen, dass der Fragende die "objektiv" beste Antwort bewertet, was mal definitiv nicht so ist! Mit der "besten Antwort" wird suggeriert, dass diese Antwort die beste/einfachste Lösung für das Problem beschreibt, Wenn es gleichwertige oder "bessere" Antworten im Thread gibt (aus der Sicht des Antwortenden), wie hoch ist die Wahrscheinlichkeit, dass dieser bei den nächsten Fragen eine Antwort geben wird, wenn SEINE Lösungen IMMER übergangen werden (mimimimimi...) ?

    Mit dem jetzigen System "Gleicher unter Gleichen" kann ich gut leben, wenn aber meine Antworten permanent "nicht gewürdigt" werden, dann hör ich eben auf zu antworten 8) ( mimimimimi...^^ )

  • Kommunikation Skripte untereinander

    • Andy
    • 14. Oktober 2014 um 21:11

    Dynamisches reservieren wurde von Make Grafik wie hier beschrieben ( <- da steht ein link!) schon probiert. Leider erfolglos!
    Den RAM in der DLL zu reservieren und von dort aus zu verwenden/benutzen ist ja nicht das Problem, sondern diesen Speicherbereich ANDEREN Programmen zur Verfügung zu stellen.
    Das geht auch, über den auch oben von mir schon demonstrierten Einsatz von

    [autoit]

    _WinAPI_ReadProcessMemory()

    [/autoit]


    Aber wenn man das macht, braucht man das ganze DLL-Gedöns nicht^^

  • Like oder nicht Like - das ist die Frage!

    • Andy
    • 14. Oktober 2014 um 21:00

    Ich habe mich noch nie von "Likes" oder ähnlichem dazu hinreißen lassen, einen Thread nicht komplett zu lesen wenn mich das Thema interessiert und gute Antworten bzw. eine produktive und interessante Diskussion stattfindet.

    Genausowenig konnten mich bis jetzt "Likes" dazu animieren, nicht innerhalb von 5 Sekunden einen Thread wegzuklicken, wenn ich sehe, dass für mich keine passenden Antworten vorhanden sind.

    Wenn "Likes" ein Teil des Google-Index würden, wäre diese Suchmaschine in 4 Wochen nicht mehr existent!
    Die Aussagekraft von "Likes" geht imho gegen null. Das ist äquivalent zu Hotelbewertungen und "Sternchen" bei bsw. ebay-Verkäufern ( und Amazon, wenn man will).
    Wenn ich eine Tendenz suche, bleibt mir sowieso nichts anderes übrig, als Bewertungen/Beiträge zu lesen und anhand des Schreibstils zu erraten, ob da jemand ehrlich seine Meinung sagt und/oder zudem noch Ahnung hat!

    Der Umkehrschluß wäre für mich, genau dieses System aufzugeben und "Likes" hinterherzurennen. Viele "Likes" entsprechen viel Zustimmung! D.h., im Prinzip blende ich die weniger gelikten Beiträge aus und renne der Masse hinterher.
    "Um ein tadelloses Mitglied einer Schafherde sein zu können, muß man vor allem ein Schaf sein." Albert Einstein

  • Kommunikation Skripte untereinander

    • Andy
    • 14. Oktober 2014 um 18:14

    jetzt wollen wir Anwendungen sehen :thumbup:

  • Kommunikation Skripte untereinander

    • Andy
    • 14. Oktober 2014 um 13:22
    Zitat

    Nur noch eine Frage diesbezüglich: Steht das "K" für 1000 oder 1024?

    Na, wenn ich 1000 Bytes reserviere, dann steht das k wohl für 1000 8o

    Zitat

    Welche größe (bit) bzw. welcher Type ist die von dir angelegte Integer Variable?

    Wenn man sowohl 64bit als auch 32Bit-Scripte schreibt, welche mit DLLCALL() oder Structs usw. arbeitet, sollte man die in der Hilfe zu DllCall() beschriebenen Datentypen nutzen, welche ihre Größe automatisch an die Bitness anpassen

    Zitat von AutoIt Hilfe


    INT_PTR, LONG_PTR, LRESULT, LPARAM
    an integer big enough to hold a pointer when running on x86 or x64 versions
    of AutoIt.

    UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM
    an unsigned integer big enough to hold a pointer when running on x86 or x64
    versions of AutoIt.


    Ansonsten ist ein INT 32 Bit breit. Im AutoItscript ist das egal, wichtig wirds bei der Übertragung der Daten an eine 64-Bit-Dll bzw. ein 64-Bit-Assemblerprog im Speicher. (AssembleIt und Assembleit2 arbeiten btw. nur mit der 32-Bit-Version, man kann zwar 64Bit-Programme erstellen, muss aber wie im n-Body-Thread gezeigt, per Zwischenschritt mit 32-Bit-Assembleit im 32Bit-Modus von AutoIt den 64Bit-Code assemblieren, und danach in den 64-Bit-Modus von AutoIt umschalten um den 64-Bitcode auch nutzen zu können)

  • Kommunikation Skripte untereinander

    • Andy
    • 13. Oktober 2014 um 21:21

    64-Bit dll

    Spoiler anzeigen
    Code
    format PE64 GUI 4.0 DLL
    entry DllMain
     
    include 'win64a.inc'
     
    ;--------------------------------------------------------------------
    section '.text' code readable executable
     
    proc GetPointer64
    
    
    mov rax,_mem
    
    
    ret
    endp
     
    proc DllMain hinstDLL, fdwReason, lpvReserved
    mov eax, TRUE
    ret
    endp
     
    ;--------------------------------------------------------------------
    section '.idata' import data readable writeable
     
    library\
    kernel, 'KERNEL32.DLL',\
    user, 'USER32.DLL'
    
    
     
    ;--------------------------------------------------------------------
    section '.data' data readable writeable shareable
    
    
    _mem db 10000 dup 0   ;10kbyte Speicher reservieren
    
    
    
    
    ;--------------------------------------------------------------------
    section '.edata' export data readable
     
    export 'sharedmem64.dll',\
    GetPointer64, 'GetPointer64'
    
    
    ;--------------------------------------------------------------------
    data fixups
    end data
    Alles anzeigen

    und Script dazu^^

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Usex64=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    ;#AutoIt3Wrapper_UseUpx=n
    ;#AutoIt3Wrapper_usex64=n

    [/autoit] [autoit][/autoit] [autoit]

    $x = Random(1, @DesktopWidth - 500) ;zufällige Position der GUI
    $y = Random(1, @DesktopHeight - 150)

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("Shared Mem Test, bitte Programm mehrfach starten!", 500, 150, $x, $y);GUI erstellen
    $label = GUICtrlCreateLabel("", 20, 20, 100, 30) ;Label
    $button = GUICtrlCreateButton("Reset/Sync", 20, 100);Button
    GUISetState() ;GUI aktivieren

    [/autoit] [autoit][/autoit] [autoit]

    $dll = DllOpen("sharedmem64.dll") ;dll laden
    $ptr = DllCall($dll, "UINT_PTR", "GetPointer64") ;den Pointer zum shared memory zurückgeben

    [/autoit] [autoit][/autoit] [autoit]

    $struct = DllStructCreate("char[500];int", $ptr[0]);Struct an dieser Speicherposition erstellen, string und reset-flag
    DllStructSetData($struct, 1, "AutoIt") ;Daten schreiben
    $i = 0 ;zähler, welcher in allen GUI´s GLEICHZEITIG resettet wird

    [/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    While 1 ;endlosschleife
    $msg = GUIGetMsg() ;event?
    If $msg = -3 Then ExitLoop ;wenn GUI geschlossen, dann ende
    If $msg = $button Then ;wenn button, dann resetten
    DllStructSetData($struct, 2, 1) ;reset-flag setzen
    EndIf
    If TimerDiff($t) > 100 Then ;alle 100 Millisekunden die Structinhalte anzeigen
    $t = TimerInit() ;Timer starten
    If DllStructGetData($struct, 2) = 1 Then ;wenn in irgendeiner GUI der Resetbutton gedrückt wurde
    $i = 0 ;zähler nullen
    GUICtrlSetData($label, DllStructGetData($struct, 1) & " " & DllStructGetData($struct, 2) & " " & $i);Structinhalte anzeigen
    Sleep(1000) ; reset-flag zeigen
    DllStructSetData($struct, 2, 0) ;reset-flag zurücksetzen
    EndIf
    $i = $i + 1 ;zahler erhöhen
    GUICtrlSetData($label, DllStructGetData($struct, 1) & " " & DllStructGetData($struct, 2) & " " & $i);Structinhalte anzeigen
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Schnuffel
    schau mal nach, was dd bedeutet ;)
    um bytes zu reservieren, _mem db 10000 dup 0 ;10 Kb Speicher
    um words zu reservieren, _mem dw 10000 dup 0 ;20 Kb Speicher
    um dwords zu reservieren, _mem dd 10000 dup 0 ;40 Kb Speicher
    um quadwords zu reservieren, _mem dq 10000 dup 0 ;80 Kb Speicher

    http://flatassembler.net/docs.php?article=manual#1.2.2

  • Kommunikation Skripte untereinander

    • Andy
    • 13. Oktober 2014 um 20:56

    @Homer j.S.,

    zu 2, das war ein kurzfristiger "Fehler" von mir, da bei mir der Virenscanner gesponnen hat, wenn ich innerhalb der DLL mehr als 6k Speicher reserviert habe.
    Ursprünglich stand dort _mem dd 10000 dup 0 ;10 Kb Speicher
    Jetzt alles klar? 8)

    zu 1, habe mit FASM noch keine 64Bit-DLL assembliert, werde mich mal dransetzen.

  • Binary zu ASCII Array

    • Andy
    • 13. Oktober 2014 um 20:27

    ein einfaches

    [autoit]

    int()

    [/autoit]

    tuts auch

  • Kommunikation Skripte untereinander

    • Andy
    • 13. Oktober 2014 um 20:19

    @MG, hast du virtualalloc mit MEM_COMMIT | MEM_RESERVE mal getestet? WENN ich so Speicher reserviere, hau ich als protect-Parameter auch gleich PAGE_EXECUTE_READWRITE rein 8o

    Schnuffel bin schon auf Anwendungen gespannt!

  • Elektronik, RasPI, Transistor, Widerstand

    • Andy
    • 13. Oktober 2014 um 19:56

    GENAU SO ähnlich hatte ich mir das gedacht.

    Zitat von Oscar

    Die Schaltung sieht schonmal sehr falsch aus!

    das ist sehr diplomatisch ausgedrückt^^

    Mal abgesehen von der Matrixschaltung der Fernbedienung führst du, je nachdem welcher Ausgang des PI geschaltet ist, völlig willkürliche Spannungsabfälle über den Transistoren herbei.
    Wie schon in meinem ersten Posting mit der Rechnerei angesprochen, solltest du dir sowohl einen Widerstand an der Basis (begrenzt den Basisstrom auf 2 mA ) einbauen, als auch einen am Kollektor, über den du DEFINIERT die Spannung zum Schalten der Fernbedienung abgreifst (wie auch immer dort geschaltet wird).

    Uber die Widerstände und die Spannungen weisst du auch, wo welche Ströme fließen.

    Zitat von Oscar

    Bevor Du weiter "experimentierst" und die Transistoren damit schrottest,

    EIN Gutes hat es, so wissen wir jedenfalls, dass die Ausgänge des PI einiges aushalten :rofl:

  • BitXOR rückwerts

    • Andy
    • 13. Oktober 2014 um 19:05

    Freaky,
    das kommt davon, wenn man nicht verstanden hat, um was es geht!
    Wenn du ein einziges Mal XOR-Ver/Entschlüsselung mit Papier und Bleistift für zwei oder drei Buchstaben gemacht hättest, wärest du selbst drauf gekommen!

    Ziel=XOR(Quelle,Schlüssel) ;verschlüsselt Quelle mit Schlüssel

    Quelle=XOR(Ziel, Schlüssel) ;entschlüsseln mit Schlüssel

    Schlüssel=XOR(Quelle,Ziel) ;wenn man den Schlüssel vergessen hat, aber Quelle und Ziel kennt :D

    Zitat von Schnitzel

    Deine Logik ist einfach falsch.

    oder so...

    Zitat von Schnitzel

    Du kannst mit verschlüsselten Werten nicht genauso rechnen wie mit unverschlüsselten.

    Doch, kann man, man sollte aber wissen was man da tut und entsprechend weiterrechnen, bzw. "richtig" zurückrechnen.
    Wirklich sicher ist XOR nur mit zufälligem Einmal-Schlüssel in der Größe der zu verschlüsselnden Nachricht. Da muss man sich etwas einfallen lassen, wenn man kürzere Schlüssel verwenden will.
    Ich selbst rotiere gerne Bits, das geht schnell, und man kann zur Not auch kürzere Schlüssel verwenden. Wenn man je 128 Bit des Schlüssels am Stück rotiert, und diese Rotation abhängig von Teilen des Schlüssels macht, kann man den Schlüssel auf 1/16 kürzen (im Prinzip ist das nix anderes als kurze Schlüssel mit sich selbst zu "salzen").

  • EAN-Strichcode nach dem erstellen als Bild spechern

    • Andy
    • 13. Oktober 2014 um 00:51

    Also nochmal für Blöde wie mich...

    Du willst die Codes

    Zitat von Alina

    Nur später auf
    Klebeetiketten ausdrucken und dann nutzen.

    WOZU willst du die Codes dann als Bild speichern? Druck doch die Codes direkt auf das Klebeetikett, so mache ich das doch auch, Hunderte jeden Tag. Es gibt keinerlei Grund, dazu ein "Bild" zu erstellen?!

    Wenn du "Alina" auf ein Klebeetikett drucken willst, erstellst du dann ein "Bild" mit Inhalt "Alina" und speicherst es?

  • Kommunikation Skripte untereinander

    • Andy
    • 12. Oktober 2014 um 23:49

    Schnuffel, Einfach den Code in FASMW.exe (der Editor) laden und Ctrl-F9 (Compile) drücken, dann ist die DLL erstellt.
    Dynamisch den Speicherbereich zu erstellen geht auch, dazu ruft man einfach ein MemAlloc() auf ^^
    Aber das könnte man auch direkt aus dem AutoItcode machen, somit wäre das ganze witzlos.
    Ich würde einfach einige DLL´s unterschiedlicher Größe erstellen und mit eigenen Namen versehen.
    MemShare_1kb.dll
    MemShare_100kb.dll
    MemShare_1Mb.dll
    MemShare_100Mb.dll
    usw.
    Da die reservierte Speichergröße heutzutage kein Thema sein sollte, nimmt man die DLL, welche für das Vorhaben reichlich Platz bietet.
    Selbst wenn man in der Anwendung nur 10% des Speicherplatzes in der DLL benötigt....who cares :D


    @MG, sollte so schwer nicht sein, der eigentliche DLL-Code bleibt ja konstant, nur die Größe der Variablen im Datasegment ändert sich. Und Nullen reinpacken sollte so schwer ja nicht sein.

  • Array - Probleme mit der Suche

    • Andy
    • 12. Oktober 2014 um 13:50

    Hi,
    also wenn ich das jetzt richtig verstehe, benötigst du für XBMC nur eine Ordnerstruktur mit den entsprechenden Dateinamen?

    Du hast eine Datei mit Inhalt
    Monk/1/4/Mr Monk gegen die Qualle
    Monk/1/5/Mr Monk auf dem Rummelplatz
    Monk/2/1/Mr Monk geht wieder zur Schule
    Monk/2/2/Mr Monk faehrt nach Mexiko
    Also Verzeichnis/Season/Episode/Name

    und benötigst
    -Verzeichnisname:Monk

    • -Unterverzeichnis: Season 1

      • -Datei: Monk-S01-E04-Mr Monk gegen die Qualle.mp4
        -Datei: Monk-S01-E05-Mr Monk auf dem Rummelplatz.mp4
    • -Unterverzeichnis: Season 2

      • -Datei: Monk-S02-E01-Mr Monk geht wieder zur Schule.mp4
        -Datei: Monk-S02-E02-Mr Monk faehrt nach Mexiko.mp4

    Wenn du Zugriff auf deine mp4 Dateien hast, verstehe ich das jetzt so, dass du nichts weiter machen musst als die Ordner zu erstellen und die Dateinamen zu ändern?

  • Array - Probleme mit der Suche

    • Andy
    • 12. Oktober 2014 um 12:05

    Hi,
    dieses Beispiel zeigt wieder anschaulich, dass es nicht für alle programmiertechnischen Probleme die passende UDF gibt. :D

    Masterciw,
    du warst schon auf dem richtigen Dampfer, deine Suchen haben auch die richtigen Ergebnisse gefunden!
    Allerdings ist die Verknüpfung eher suboptimal.
    Du müßtest, um per _arrayfindall() richtig anwenden zu können, die gefundenen Ergebnisse im durchsuchten Array immer in ein neues Array kopieren und dieses dann wiederum durchsuchen.
    Dann würdest du letztendlich nur die Zeilen mit dem passenden Ergebnissen (Staffel & Folge) bekommen.
    Partial-Arraykopierereien sind aber mit den Standard-AutoItfunktionen nicht abgedeckt.

    Daher würde ich auch, wie bereits von blubbstar gezeigt, direkt das Array durchlaufen und die Ergebnisse filtern.

    Weiterhin stellt sich mir die Frage, ob du überhaupt Arrays brauchst um zum Ergebnis zu kommen. Wie müssen die Dateien aussehen, welche du für XBMC benötigst?

  • CheatEngine PointerSearch

    • Andy
    • 12. Oktober 2014 um 10:40

    Naja, wieder mal ein Beispiel dafür, dass "neue" User sich, anstatt sich mit der Materie an sich zu beschäftigen und dazu passende Fragen zu stellen sich ( omfg ) Youtube-Videos ansehen um sich von dort nicht funktionierenden Code zu copypasten. Wieso fragen die bei nichtfunktionieren nicht einfach den Video-Ersteller? Bei dem funktioniert es doch offensichtlich!
    Das hat natürlich einen Grund.
    Botten?!
    Der Bippes ist kurz und der programmiertechnische Skill entsprechend.

    Anstatt mal die Eier in der Hose zu haben und hier die "richtigen" Fragen zu stellen und dafür die einzig passende Antwort zu erhalten (Hinweis aufs benachbarte Botterforum) wird wieder mal der User alpines gefüttert, welcher dankbar anspringt.
    Übrigens sind User-relevante Informationen incl. den bisherigen Forenbeiträgen nur zwei Mausklicks entfernt...

    Zitat von MG

    Ja, das problem hatte ich auch sonst mit der funktion aus der udf immer.

    Zitat

    hmm komisch, obwohl soviele die UDF nutzen..

    :rofl: "aha, "soviele" nutzen also diese Funktion...Wie kommst du auf dieses schmale Brett?

    Zitat von MG

    Daher hab ich mir selber ne funktion geschrieben,

    So gehört sich das! Dieser User hat imho sämtliche Berechtigung, auch in diesem Forum zum Thema die passenden Fragen zu SEINEM selbst erstellten Code zu stellen! Was er letztendlich damit macht ist sein Bier. Es bleibt einem auch überlassen, per PN zu helfen. ;)

    SSlayer93,
    es gibt ein Forum, welches genau auf deine Belange zugeschnitten ist. Dort wirst du sicherlich Hilfe bekommen. Das programmiertechnische Niveau der meisten Fragesteller dort ist in etwa deinem angepasst, auch die (wenigen) sehr guten Programmierer dort sind mit deiner Problemstellung wesentlich intensiver vertraut!
    Wundert mich, dass dir noch niemand diese Info gegeben hat 8)

  • EAN-Strichcode nach dem erstellen als Bild spechern

    • Andy
    • 12. Oktober 2014 um 09:50

    Hi Alina,
    obwohl ich täglich Barcode/Scancode-Anwendungen programmiere und reichlich Dokumente mit Barcodes erstellt werden, habe ich keinen einzigen "Barcode" als Bild gespeichert. Kein Mensch braucht einen einzelnen Barcode als Bild auf einem Datenträger! Barcodes werden erstellt um gescannt zu werden, als Datei sind sie völlig nutzlos. Zudem ist jpg infolge Kompressionsartefakte das schlechteste Dateiformat, die extrahierten Bilder werden von Scannern oft nicht, oder noch viel schlimmer, fehlerhaft gelesen!

    Gebraucht wird der Barcode doch in einer Anwendung. Also ein Ausdruck, welcher dann später gescannt werden kann.
    In der Anwendung, die diesen Barcode erstellt, solltest du ansetzen.
    Beschreibe doch mal das Szenario, was du mit dem Barcode anstellen möchtest.

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™