Posts by DeaD_EyE

    Für das Bildzeitungsniveau sorgst du. Wer kam mit Ressourcenverwendung und Toilettenpapier? Du.


    Dass wir massive Probleme haben, bekommen alle Arbeitnehmer mit. Ich kann verstehen, dass man sich nicht damit nicht unbedingt beschäftigen möchte. Ok, akzeptiere ich.

    Es gibt aber keine Ausreden mehr, eine Timer Unit nicht zu benutzen. ;)


    Geschmack und dagegen kann man nicht argumentieren.

    Wenn jemand systemd nicht mag, dann ist das einfach so und meistens sind die Gründe nicht rational.

    Lennart wird auch ziemlich hart angegriffen.


    Mit "sudo nano foo" landet der aufrufende User im Homeverzeichnis des aufrufenden Users.

    Du verwechselst es wahrhscheinlich mit dem Interaktiven Login:

    Um damit die vorhandenen Ressourcen zusätzlich noch künstlich zu reduzieren wie im letzten Jahr mit Klopapier?

    Kann man noch kacken, wenn man nichts zum Fressen hat?

    Kann man Toilettenpapier essen?

    Ist es sinnvoll ausschließlich Toilettenpapier einzukaufen?


    Ich habe es mit meinen eigenen Augen gesehen, dass es Menschen gab, die haufenweise Toilettenpapier gekauft haben.


    Aber Hauptsache man kann sich den Arsch abwischen, Rotwein trinken, Geschützen Geschlechtsverkehr haben und wie ein Schlot kiffen und sich der darüber lustig machen. Da merkt man wirklich, dass der Weltbevölkerung (nicht nur den Deutschen) das Denken und die Selbstständigkeit vollständig aberzogen worden ist.

    Ich habe mal heute für Diesel 1,97 €/L bezahlt.


    Euch wird der RPI4 nichts bringen, da man den RPI4 leider nicht essen kann.

    Anzünden, um mit ihm zu heizen, geht leider auch nur kurz.


    Kauft euch mal lieber Gas, Erdöl, Benzin, Zigaretten, Alkohol, Drogen und ganz viel zu haltbare Nahrungsmittel.

    Müsst ihr nicht alles selbst konsumieren, wird man aber bald hervorragend mit handeln können.

    Wenn ihr euch ein Lager anlegt, dann erzählt es nicht einmal euren Eltern!

    Sido Befehl hilft in meinem Fall nicht, da steht dann trotzdem das ich dazu keine Rechte habe.

    sudo nicht Sido


    Zwischen Groß-/Kleinschreibung wird auch unterschieden.

    Das ist nicht wie bei Windows, dass TEST.txt und test.txt ein und dieselbe Datei ist.


    Gib den Befehl noch mal richtig ein, dann geht es auch.

    Falls es dann immer noch nicht geht, probier mal:


    Code
    /sbin/sudo -i 

    Das ist nur eine Vermutung meinerseits. Vielleicht ist die PATH Umgebungsvariable nicht korrekt gesetzt.

    Linux durchsucht alle Pfade nach ausführbaren Dateien, wenn man einen Befehl eingibt.

    [Es ist auch garnicht einfach Files des Users root im Homeverzeichnis des Users pi anzulegen]


    Das passiert Anfängern andauernd. Da ist nichts Schwieriges dran.

    Mit dem User pi einloggen, mit su nach root umloggen und dann Dateien erstellen.


    Das Eigentliche schwierige ist, es sich das wieder abzugewöhnen.

    Backend terminated or disconnected. Use 'Stop/Restart' to restart.

    Diese Meldung stammt von PiCamera. mmal steht wohl für Multimedia Abstraction Layer.


    Referenz: https://forums.pimoroni.com/t/…e-component-enospc/3789/5


    Mögliche Fehlerbehebung ist ein Firmware-Update und/oder das Vergrößern des GPU-Speichers.


    Dann wird noch darauf hingewiesen, dass raspi-config einiges durcheinander bringen kann und man mit folgendem Befehlen kann man die Firmware aus dem Raspberry Pi OS Repository installieren.


    Code
    sudo apt-get update
    sudo apt-get install --reinstall libraspberrypi0 libraspberrypi-{bin,dev,doc} raspberrypi-bootloader
    sudo reboot


    Bei den anderen hat es das Problem aber nicht gelöst.

    DeaD_EyE Das JSON-Beispiel ist mit ``match``/``case`` nicht wirklich besser als die herkömmliche Variante:

    Das ist dein Geschmack. Ich mag Grün viel lieber...



    Dass das „soft keywords“ sind, ist blöd für's Syntax-Highlighting, weil das plötzlich deutlich intelligenter sein muss.


    Und es öffnet die Tür jetzt für alles mögliche neue Schlüsselwörter einzuführen, was vorher eine praktische Grenze war, die die Sprache einfach hält.

    Die Logik ist bereits bei PyCharm mit drin und das sogar vor dem Release von Python 3.10.0.

    Dank des neuen PEG Parsers werden wir sicherlich noch weitere solcher schönen Veränderungen bekommen.


    Die Typannotationen werden einem auch ungewollt immer wieder aufgedrängt. Zum Beispiel bei `dataclasses`.

    Ich bin froh, dass es sie gibt. Wenn man moderne Frameworks wie FastAPI nutzt, führt ohnehin kein Weg dran vorbei.

    Auf #21 antworte ich später. Diese Antwort bezieht sich auf einen älteren Beitrag auf Seite 1.


    Hallo DeaD_EyE,


    mit str meinst Du vermutlich string.

    Einen string packt man eigentlich in Anführungzeichen aber wo muss ich diese setzen?


    Das war leider nicht der Fehler.

    Python
    from pathlib import Path
    from subprocess import run
    
    some_path = Path("test/test123")
    
    run(["echo", some_path])

    Gibt den Pfad als str aus und nicht den String der Repräsentation (repr).

    str ist eine Funktion, um Objekte in ein String umzuwandeln.

    Quote

    test/test123


    Ich bin nicht von ausgegangen, dass Pfad-Objekte automatisch in str umgewandelt werden. Diese Umwandlung geschieht implizit.

    Da ich Python schon etwas länger nutze, ist es für mich schwierig mir zu merken, welche Version was unterstützt. Jedenfalls wird auf dem RPi aktuell Python 3.7 verwendet. D.h. die Umwandlung in str braucht man nicht.


    Changed in version 3.6: executable parameter accepts a path-like object on POSIX.


    Changed in version 3.8: executable parameter accepts a bytes and path-like object on Windows.


    Es kann aber auch mal vorkommen, dass es Funktionen gibt, die nicht mit Path-Objekten funktionieren.

    Mittlerweile sind aber so ziemlich alle Funktionen/Methoden der Standardbibliothek in der Lage Path Objekte zu verarbeiten, sofern die Funktion/Methode einen Pfad erwartet. Jedenfalls sieht man ähnlichen Code, wenn man in die Standardbibliothek schaut.


    Den ProcessPoolExecutor habe ich vorgeschlagen, da die Worker/Prozesse einmal gestartet werden und aktiv bleiben. Im Gegensatz zu threading.Thread wird jedes Mal ein neuer Thread erstellt.

    Der Fehler tritt in der Funktion change_video_format auf. Das Pfad-Objekt new_video_file muss in ein str umgewandelt werden, da ansonsten für die Argumentenliste die Repräsentation des Pfandobjektes verwendet wird.


    Dem Programm MP4Box würde dann mit dem Pfad PosixPath('/home/ich-bins/motioneye/Camera1/20211016_183912.mp4') aufgerufen werden, was offensichtlich falsch ist. Wenn man str auf ein Path-Objekt anwendet, bekommt man den Pfad als str zurück. Das muss man ziemlich oft machen, wenn man die Pfade an andere Funktionen übergibt, die z.B. damit noch nicht umgehen können oder nicht dafür vorgesehen sind.

    Ich habe die Funktion task im Beitrag korrigiert.

    Das Problem wird gewesen sein, dass die originale Datei gelöscht worden ist, bevor sie überhaupt übertragen/umgewandelt werden konnte.


    Wenn unter Linux Dateien geöffnete Dateien "gelöscht" werden, kann der Prozess, der die Datei gerade offen hat, weiter auf die Datei zugreifen. Die Datei kann aber nach dem Löschen nicht erneut geöffnet werden, da der Eintrag nicht mehr sichtbar ist. Das wird oft als Sicherheitsfeature verwendet, wenn andere neugierige Prozesse nicht auf eine Datei zugreifen sollen. Im Fall des Scriptes war es wahrscheinlich so, dass er gerade eben noch den Transfer starten konnte, wodurch die Quelldatei zumindest erstellt worden ist. Nebenläufig dazu hat er schon direkt die nächste Funktion im der Hauptschleife ausgeführt, die die Quelldatei löschen sollte. Zu diesem Zeitpunkt find das Transkodieren noch gar nicht an.


    Nebenläufiger Code kann ziemlich komplex werden und schwer zu debuggen.


    Bitte auch beachten, dass pool.submit() nicht blockiert, solange noch genügend worker frei sind. D.h. der Task wird übermittelt und er macht direkt mit dem nächsten Statement weiter.

    Habe ich mal korrigiert. Auch der Fakt, dass Exceptions nicht ausgelöst, sondern übertragen werden, ist wichtig.

    Wenn man irgendwo im Code einen Fehler hat und das nicht prüft, geht der Fehler einfach unter und man bekommt keine Rückmeldung, was falsch lief.


    Eine zusätzliche Möglichkeit ist es noch einen done_callback hinzuzufügen:


    Man kann die Funktion, die die anderen zusammenfasst, mal ohne den pool aufrufen und dann ist das alles wieder seriell.

    Also ich würde den ProcessPoolExecutor einsetzen.

    Den angepassten Code musst du testen.




    Die Funktion transfer hat es nach dem Code-Formatting (black) etwas "zerrissen".

    Man kann Context-Manager auch verschachteln.

    Seit Python 3.9 kann man runde Klammern nutzen und bei Python 3.10 wird es offiziell unterstützt (wegen dem neuen Parser).


    Vor Python 3.9 (Verschachteln)

    Code
    def transfer(video_file):
        new_video_file = video_file.with_suffix(VIDEO_FORMAT[0])
        with FTP("192.168.178.1", "Ich-Bins", "Password") as ftp:
            with open(new_video_file, "rb") as file:
                ftp.storbinary(f"STOR {new_video_file.name}", file)


    Python 3.9+

    Code
    def transfer(video_file):
        new_video_file = video_file.with_suffix(VIDEO_FORMAT[0])
        with (
            FTP("192.168.178.1", "Ich-Bins", "Password") as ftp,
            open(new_video_file, "rb") as file,
        ):
            ftp.storbinary(f"STOR {new_video_file.name}", file)

    Der Nachteil beim neuen Code ist, dass der Code-Formatter black damit nicht umgehen kann, da dieser noch den alten LL(1) Parser nutzt. Erst wenn der neue PEG-Parser in black implementiert ist, kann black auch solche Strukturen parsen.


    Bis mal Python 3.10 bei Raspberry Pi OS verfügbar ist, werden noch zwei Releases vergehen müssen.

    Ich meine 3.9 wird bei Debian 11 verwendet. Einer der vielen Gründe, wieso ich Debian für Entwicklung nicht mag.


    Edit:

    Exceptions, die in der Funktion task ausgelöst werden, sind nicht im Programm sichtbar und gehen einfach unter.

    pool.submit(funktion) gibt ein Future zurück und ob eine Exception aufgetreten ist, kann man mit fut.exception() prüfen. Es wird einem dann die Exception als Objekt zurückgegeben. Vorteilhaft ist, dass man die Funktion task auch ohne den ProcessPoolExecutor testen kann.

    Die Teilnehmer im Mikrocontroller-Forum sollen bei C oder Assembler bleiben.

    Das sind wahrscheinlich die gleichen Leute, die auch über den "Walrus-Operator" (Assignment Expression) gemeckert haben.


    Beim structural pattern matching geht es primär um eine Sache: Lesbarkeit


    Bei Python kommt es nicht auf die Geschwindigkeit zur Laufzeit an, sondern auf die Entwicklerzeit, die bei weiten kürzer ist, als bei Low-Level-Sprachen.

    Wenn der resultierende Code schlecht lesbar ist, sollte man das structural pattern matching nicht anwenden.


    Ein passender Anwendungsfall fürs structural pattern matching ist z.B. die Verarbeitung von JSON.



    Anstatt viele if..elif..else und isinstance() Aufrufe, hat man einen sauberen lesbaren Syntax.

    structural pattern matching ist weitaus mächtiger als z.B. die Switch/Case Anweisung in anderen Sprachen

    und man kann auch eigene Klassen fürs pattern matching vorbereiten.

    Mich würde interessieren was die schnellste Möglichkeit ist die 6000 Byte zu übertragen.

    Via UDP.


    Grund: Verbindungslos, wenig Overhead

    Nachteil: Du musst alles selbst implementieren und es ist nicht garantiert, dass die Pakete auch empfangen werden.


    MQTT kann das aber auch.

    Wenn du sowas wie MQTT ohne broker haben möchtest, dann halt zmq.

    ZMQ hat auch minimalen Overhead und Server/Client sind in der Bibliothek implementiert.

    das ein USB3 Ethernet Gbit RJ45 Adapter nach nur 5 Jahren den Geist aufgibt?

    Dafür gibt es extra die Materialforschung. Mit dem Wissen kann man Produkte herstellen, die nach X Betriebsstunden garantiert kaputtgehen. Wenn dann die leicht zugänglichen Rohstoffe verbraucht sind, geht man an die Deponien. Alles nur, weil ein paar Arschlöcher Geldgeil sind. Man könnte Produkte herstellen, die Jahrzehnte halten. Gut, dann sind sie irgendwann nicht mehr auf dem technischen Stand, aber sie funktionieren.


    Der Typ, der seinen Campingplatz mit einem Atari ST seit 30 Jahren verwaltet, ist 100-mal umweltfreundlicher, als irgendein Student z.B.


    Die größten Umweltschweine auf diesem Planeten sind die Konsumenten selbst, die diesen Scheiß auch noch mitmachen.

    Ich sehe es selbst oft genug. Irgendwelche Studenten, die sich als "Umweltaktivisten" bezeichnen, sitzen mit ihrem Apple-Ding bei Starbucks und trinken Latte Macchiato (falls das noch in ist) und beschimpfen Leute, die z.B. ein altes Auto fahren.