Posts by noisefloor

    Hallo


    dbv:


    Quote


    Aber kein guter und vor allem kein notwendiger. init war nie kaputt und muss erst recht nicht durch diesen Murks ersetzt werden.

    Also wenn ich mich nicht stark irre, wollte Debian doch so wie so von SysVInit weg... Da gab es doch AFAIK eine interne Abstimmung zwischen Upstart und systemd, systemd hat gewonnen. Was dann quasi auch der Tod von Upstart war.


    Gruß, noisefloor

    Hallo,


    dbv: dann bete mal jeden Abend fleißig, dass deine Distro nicht auf Netplan umstellt ;-)


    Ich habe mich ja für div. Wikiartikel bei ubuntuusers.de mit systemd beschäftigt und ich muss sagen, dass in seiner Gesamtheit schon ziemlich durchdacht ist. Und natürlich komplex, weil es viel kann. Aber z.B. finde ich für mich z.B. Service Units viel einfacher zu verstehen und schreiben als Start-/Stop Skripte für SysVInit oder Upstart.


    Was mich bei Raspbian (im Vergleich zu Ubuntu) stört ist, dass das Logging komisch konfiguriert ist. Also Ubuntu (und AFAIK auch andere Distros) loggen viel mehr in Journal als Raspbian. Was ja der Schonung der SD-Karte geschuldet sein mag.


    Aber ganz realistisch: systemd ist der Standard. Mit Ubuntu 15.10 hat ja die letzte "große" / "relevante" Distro auf systemd umgestellt. Man kann sich zwar in ein kleines, gallisches, aktuell systemd-freies Dorf zurück ziehen, aber das bringt auf dauert auch nichts.


    Gruß, noisefloor

    Hallo,


    da beides dauerhaft laufende Serverprozesse sind solltest du es besser über ein systemd Service Unit starten.

    Vorteile:

    • wird beim Booten automatisch gestartet
    • wenn der Prozess crasht kann systemd diesen automatisch neu starten
    • Logging via journald


    Gruß, noisefloor

    Hallo,


    also bei Outlook und Thunderbird ist es ziemlich sicher so, dass eingebettete Bilder _nicht_ angezeigt werden, wohl aus Sicherheitsgründen. Man muss das Anzeigen von Bildern explizit erlauben.


    D.h. das Problem ist IMHO für dich so gar nicht zu lösen, weil es Client-seitig zu lösen ist.


    Gruß, noisefloor

    Hallo,


    Quote


    andererseits war das deutlich eleganter umzusetzen als lokale Variablen über die Funktionen in zwei Ebenen auszutauschen.

    100% falsch, es ist genau andersrum. Der explizite Austausch ist der elegante und richtige Weg. Sich drauf verlassen, dass die Funktionen "irgendwie" durch eine hoffentlich richtig typisierte globale Variable das machen, was sie sollen, ist falsch.

    `global` macht den Zustand des Programms schwer bis nicht durchschaubar und kann sehr schwer bis nicht auffindbaren Fehlern oder unerwartetem Verhalten führen. Die Verwendung von `global` ist in 99% der Fälle falsch - und dein Programm gehört definitiv nicht zum verbleibendem 1%.

    Vergiß' am besten, dass es `global` gibt. Das wird dir definitiv helfen, besser und ideomatischer in Python zu programmieren.


    Gruß, noisefloor

    Hallo,


    Quote


    Könnt ihr mir bitte sagen wie ich es flüssig bekomme.

    Indem du dir einen richtigen / Leistungsfähigeren Rechner kaufst. Klingt hart, aber der Raspi ist nun mal eine Bastelrechner oder Miniheimserver und keine Ersatz für einen richtigen Desktop-Rechner.

    Jedes Mittelklasse Smartphone hat mehr Leistung als ein Raspi.


    Wenn du Minecraft auf dem Raspi spielen willst, dann nimm' die für den Raspi angepasste Variante. Die ist dann halt anders / einfacher als das Desktop Minicraft.


    Gruß, noisefloor

    Hallo,


    bist du sicher, dass die 5 Sekunden nicht einfach die "noramle" Latentz sind? Du hast Dateisystem I/O (Bild speichern und neu lesen) und Netzwerk I/O (Bild versenden). Plus dein Smartphone oder wo auch immer der Telegram Client drauf läuft muss die Daten empfangen.

    Da finde ich 5 Sekunden jetzt nicht übermäßig viel, zumal der Rapsi keine I/O Rakete ist.


    Das unschöne `sleep(5)` kannst du eliminieren, in dem du nur auf eine Flankenwechsel am GPIO-Pin reagierst, nicht auf "high" oder "low".


    Gruß, noisefloor

    Hallo,


    Manul: kurz funktioniert nicht. Dazu ist das ein bisschen komplex bzw zu "anders" im Vergleich zu lineraren Programmierung, was die Denkweise angeht. Was grundsätzlich hilft ist, wenn man verstanden hat, wie Coroutinen funktionieren und wann man eine Idee hat, was ein "Future" ist.


    Drei Links:


    Gruß, noisefloor

    Hallo,


    Ansatz über kooperatives Multitasking via asyncio. Funktioniert so ab Python 3.5:

    Vorteil: man brauht keine Zeitstempel von Funktion zu Funktion reichen.


    Auch hier ist wie in meinem 1. Beispiel die Abfrage des Status (ok oder Störung) nicht implementiert - kann man aber leicht nochholen.


    Gruß, noisefloor

    Hallo,


    Linus: wxpython :-) Dessen Popularität ist im Vergleich zu Qt, GTK+, Tkinter und Kivy IMHO doch eher "eingeschränkt". Auch, wenn's wahrscheinlich ein gutes Framework ist.


    Gug: in meinem Beitrag #5 steht alles, was du brauchst, um deine GUI-Programmierung zu starten. Wenn du nicht weiter kommst gilt wie immer: zeig' deinen bisherigen Code und dir wird geholfen.


    Gruß, noisefloor

    Hallo,


    ok.


    So was wie

    Code
    x = 0
    while x <= 1:

    ist unschön. Nimm' für eine Endlosschleife einfach while True:


    Was hast du denn in Sachen GUI gesucht? Gängig für Python ist Tkinter, dass hat Python auch an Bord. Dazu gibt es ca. 1 Mio Seiten im Web, wo das erklärt wird. Inkl. den Seiten in der offiziellen Python-Doku.


    Vorgehen: ein GUI-Programm mit zwei Labeln erstellen, die Label enthalten die Temperaturwerte. Die Label kannst du periodisch über die after-Methode vom Tkinter aktualisieren.


    Um effektiv eine GUI mit Python erstellen zu können, sollte man die Objektorientierung von Python verstanden haben. Heißt: wissen, wie man Klassen schreibt, Instanzen von Klassen erzeugt und Methoden von Klassen nutzt. Einfach GUIs gehen mit Tkinter zwar auch über Funktionen, aber das ist meisten suboptimal (=Murks). Also besser direkt alles in eine Klasse packen.


    Gruß, noisefloor

    Hallo,


    Python wird immer vom Python-Interpreter ausgeführt, von daher macht der Satz "Ich habe bereits einen Code dafür, bekomme aber die Anzeige nur im Interpreter hin." nicht wirklich Sinn.


    Zeig' doch mal den Code, den du hast.


    Und welches GUI-Framework willst du benutzen? Es gibt 4¹/² gängige Frameworks für Python. Wäre eine HTML-basierte GUI eine mögliche Alternative?


    Gruß, noisefloor

    Hallo,


    wie wäre es denn hiermi, für Python 3:


    Die GPIO-Abfrage von Pin 24 habe ich weg gelassen, kann man aber leicht nachrüsten.


    Gruß, noisefloor

    Hallo,


    Coroutinen trifft man in der "freien Wildbahn" auch selten an bzw. man braucht das auch selten. Die ursprüngliche Idee ist auch, das man mit Python nebenläufige Programmierung mit nur einem Thread (in dem das Programm an sich läuft) realisieren kann.

    Wer sich dafür interessiert: Dave Beazley gilt als der Guru für Python Coroutines und es gibt diverse Vorträge von ihm (auch auf Youtube) zu dem Thema.


    Coroutinen sind mit asyncio, also ab Python 3.4, populärer geworden, weil asyncio massive auf Coroutinen setzt.


    Gruß, noisefloor

    Hallo,


    Quote

    das mit dem Hin- und Herschieben der Variable war mir schon klar. Ich wollte das halt gerne vermeiden, weil ich nach einer eleganteren Methode Ausschau halten möchte


    Na ja, das ist halt so, wenn man mit Funktionen programmiert. Das ist schon die richtige "Eleganz".

    Im Prinzip ist das bei Klassen auch nicht anders, nur das die Methoden der Klasse dann die Attribute der Klasse ändert.


    Die Methode mit der Coroutine ist hier zwar "eleganter" - aber Corountinen kann man lange nicht überall (sinnvoll) einsetzen.


    Gruß, noisefloor

    Hallo,


    also das die Funktion einen Wert `startzeit` zurück liefert ist IMHO von der Nomeklatur verwirrend. Korrekter wäre `zeit_der_letzten_ausfuehrung`.


    Ich würde das in eine Coroutine kapseln, die kann die Zeit der letzten Ausführung ja intern "behalten":



    Gruß, noisefloor

    Hallo,


    also eine Funktion kannst du nicht in eine Integer umwandeln - eine Funktion ist eine Funktion, ein Integer ist ein Datentyp. Du kannst eine String oder einen Float in einen Integer umwandeln, aber keine Funktion.

    Grundsätzlich kann Python als Ergebnis einer Funktion eine Funktion zurück liefern - wenn du aber einen Integer brauchst, dann ist du beim Programmieren wohl was falsch gemacht... :-)


    Der Code


    Python
    def berechnung():
        Adults = 50
        totalad = Adults * int(Aprice.get())
        totalprice = totalad
        Result.set(int(totalprice))
        Aprice = StringVar()
        result = StringVar()

    kann so nicht funktionieren - `Result` ist in dem Kontext nicht definiert. Die Zeile `totalprice = totalad` ist überflüssig. Was bezweckst du mit `result = StringVar()`?


    Und bitte in Zukunft deinen Code in einen Codeblock setzen - sonst ist dieser nicht bis sehr schlecht lesbar.


    Gruß, noisefloor

    Hallo,


    Linus: die MDN Seite hatte ich auch in der Tat zuerst gelesen und mein erster Code mit `fetch` baute darauf auf. Hat auch funktioniert, nur das Error-Handling hat nicht so funktioniert, wie ich mir das vorgestelle habe. Was aber vermutlich an meinen (fehlenden) JS-Skills liegt.

    Der Code im obigen Beispiel basiert auf einer Entwicklerseite von Google. Dieses Promise-Chaining (so heißt das glaube ich...) ist jedenfalls für mich einleuchtender / besser nachvollziehbar.


    @marczurhorst: nicht verwirren lassen - egal, ob du den "alten" XMLHttpRequest nimmst oder das neuere fetch: das Grundprinzip, was da passiert, ist das gleich und auch serverseitg macht das keinen Unterschied, wie du siehst.


    Gruß, noisefloor