Marvin Preuss xsteadfastx photo

github twitter mastodon flickr

python

Das eigene 24 Hour Psycho

/// d794cd8 /// python hitchcock douglasgordon art

Es ist schon ein paar Jahre her als ich die Douglas Gordon Ausstellung im Kunstmuseum Wolfsburg besuchte. Ich laube es war im Jahr 2007. Ein Kunstwerk hat sich besonders in meine Erinnerungen gehalten. 24 Hour Psycho. Eine entschleunigte Version von Hitchcock’s Meistwerk Psycho. Eins wird auf jeden Fall klar. Jeder Frame scheint ein komponiertes Bild zu sein, nimmt man einfach die Geschwindigkeit aus dem Film. Nun zu meiner Geschichte. Ich war eine Woche krankgeschrieben.

https://retro-fiend.com/post/113324288809

Es ist schon ein paar Jahre her als ich die Douglas Gordon Ausstellung im Kunstmuseum Wolfsburg besuchte. Ich laube es war im Jahr 2007. Ein Kunstwerk hat sich besonders in meine Erinnerungen gehalten. 24 Hour Psycho. Eine entschleunigte Version von Hitchcock’s Meistwerk Psycho. Eins wird auf jeden Fall klar. Jeder Frame scheint ein komponiertes Bild zu sein, nimmt man einfach die Geschwindigkeit aus dem Film.

Nun zu meiner Geschichte. Ich war eine Woche krankgeschrieben. Ich lag auf dem Sofa, geplagt mit Halsschmerzen und allen möglichen anderen Erkältungssymptomen. Nach ein paar Tagen wollte ich ein wenig programmieren um mich abzulenken. Da kam mir 24 Hour Psycho in den Sinn und das es bestimmt möglich sei es in Python in ein paar Code-Zeilen nachzubauen. Ich präsentiere 24hourvideo. Danke opencv und ffmpeg. Man füttert es mit einem Video und schon läuft das Video so lange um 24 Stunden zu füllen. Frame für Frame. Mir wurde dadurch mal wieder bewusst das Mathe und ich sich seit der 5 Klasse nicht näher gekommen sind. Ich musste die Millisekunden ausrechnen die zwischen zwei Frames liegt um das ganze auszudehnen.

Vielleicht kann ja einer was damit anfangen.



Der BBC micro:bit und Python

/// d794cd8 /// python bbc

Die BBC hat sich ein kleines Mammutprojekt auferlegt. Sie wollen jedem 11 Jährigen in England ein Computer-Device zukommen lassen. Der Micro Bit. Es sind viele Partner an Board. Unter anderem auch die Python Software Foundation. Das Board hat neben vielen Schnittstellen auch eine LED-Matrix. Viele Sachen zum entdecken und vor allem Spaß fürs Programmieren zu entwickeln. Und nun kommt der Clou: Es wird MicroPython auf dem Board laufen. Also sind alle Schnittstellen direkt per Python ansprechbar, direkt auf dem Board.

Die BBC hat sich ein kleines Mammutprojekt auferlegt. Sie wollen jedem 11 Jährigen in England ein Computer-Device zukommen lassen. Der Micro Bit. Es sind viele Partner an Board. Unter anderem auch die Python Software Foundation. Das Board hat neben vielen Schnittstellen auch eine LED-Matrix. Viele Sachen zum entdecken und vor allem Spaß fürs Programmieren zu entwickeln. Und nun kommt der Clou: Es wird MicroPython auf dem Board laufen. Also sind alle Schnittstellen direkt per Python ansprechbar, direkt auf dem Board. Ich bin zwar keine 11 aber trotzdem total aus dem Häuschen. Vielleicht gibt es ja eine Aktion so ein Board auch erwerben zu können.

(via)



Ein paar Plugins für Pelican

/// 7ab0ec1 /// pelican blog python

Ich bin eigentlich ziemlich glücklich mit meinem Umstieg von Wordpress auf Pelican. Dieses Static-Site-Ding macht in meinen Augen wirklich Sinn. Vor allem passt es sich gut in diesen GIT-Workflow ein. Alles in Markdown und keine DB im Nacken plus Backups die durch GIT ganz wunderbar sind. Meine Entscheidung für Pelican fiel durch die Programmiersprache Python. Ich dachte es ist schön wenn man fähig ist ein wenig zu verstehen was dort passiert und es eventuell die Möglichkeit gibt auch etwas dem Projekt zurück zu geben.

https://www.reddit.com/r/tvgifs/comments/13uw0l/hey_dad_think_fast_modern_family/

Ich bin eigentlich ziemlich glücklich mit meinem Umstieg von Wordpress auf Pelican. Dieses Static-Site-Ding macht in meinen Augen wirklich Sinn. Vor allem passt es sich gut in diesen GIT-Workflow ein. Alles in Markdown und keine DB im Nacken plus Backups die durch GIT ganz wunderbar sind. Meine Entscheidung für Pelican fiel durch die Programmiersprache Python. Ich dachte es ist schön wenn man fähig ist ein wenig zu verstehen was dort passiert und es eventuell die Möglichkeit gibt auch etwas dem Projekt zurück zu geben. Dies habe ich nun mit ein paar Erweiterungen für das liquid_tags Plugin getan. Ich habe gemerkt das ich oft viele Sachen einbinde und dies frisst Zeit sich erstmal die Embeded-Codes rauszusuchen oder selber zu basteln. Dies soll für einige Dienste nun durch diese Erweiterungen verbessert werden.

flickr

Hier war das Problem anhand der ID an alle Informationen zu kommen um das HTML-Tag zu bauen. Ich habe mich dazu Entschieden einfach die Flickr-API zu nutzen. Dies ist natürlich nicht der optimalste Weg, es funktioniert aber. Um die API zu nutzen braucht man erstmal einen Key von Flickr. Den packt man in die Pelican-Config unter der Variable FLICKR_API_KEY und schon kann man aus

\{\% flickr 18841046161 large 'Ich denke an einen Wald' \%\}

folgendes basteln:

Ich denke an einen Wald

Für alle Optionen schaut man hier vorbei.

soundcloud

Was ich auch gerne tue, ist Soundcloud Widgets einbinden. Und hier mein großer Respekt an die API. Es gibt einen Endpoint der einem gleich den Embeded-Code liefert. Alles was man tun muss ist die Track-Url mitgeben. So wird aus

\{\% soundcloud https://soundcloud.com/luftmentsh/hakotel \%\}

dies hier:

Den Code gibt es hier.

giphy

Manche Sachen sagt man besser mit einem GIF. Ja, es macht jedes zweite Blog. Egal… es ist wunderbar. Noch einfacher wenn man mit einem einfachen Tag Giphy-Animationen einbinden kann. Dank der API (wiederum braucht man einen Key) ging das auch ziemlich einfach. Key in die Config (GIPHY_API_KEY) und es kann los gehen.

\{\% giphy y6Nhc2E1ch2ww \%\}

https://rhiannonyork.tumblr.com/post/44551538237/when-i-prove-a-vendor-wrong-on-a-conference-call

Den Code gibt es hier.

html5 audio

Manchmal wollte ich Audio-Beiträge vom Deutschlandfunk verlinken. Diese bieten kein Widget zum einbinden. Man bekommt nur die reinen MP3-Files. Das schönste ist natürlich wenn man das Audio-Tag benutzt welches es seit HTML5 gibt. Also kein komischer Flash-Player. Natürlich gibt es immer noch riesen Probleme zwischen Audioformat und Browser und Betriebssystem. Deswegen kann man mehrere Sources pro Player einbinden. Dies geht auch mit diesem Plugin.

\{\% audio http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.mp4 http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.oga \%\}

{% audio http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.mp4 http://media.w3.org/2010/07/bunny/04-Death_Becomes_Fur.oga %}

Den Code gibt es hier.



Ansible dazu benutzen um einen Fileserver zu migrieren

/// d794cd8 /// ansible python

Ab und zu kommt es dann doch einmal vor das man seinen Fileserver umziehen muss. Diese Migration kann man gut benutzen um zum Beispiel mal ein paar Permissions gerade zu ziehen oder andere Kleinigkeiten anzupassen. Nun hatte ich mich dran gemacht ein Script zu schreiben mit allen Befehlen die ich dazu brauche. Wir kennen alle die Nachteile von schnell gehackten Bash-Scripten. Irgendwo ein Dreher drin und die Daten müssen aus dem Backup geholt werden oder man vergisst User oder Gruppen.

Ab und zu kommt es dann doch einmal vor das man seinen Fileserver umziehen muss. Diese Migration kann man gut benutzen um zum Beispiel mal ein paar Permissions gerade zu ziehen oder andere Kleinigkeiten anzupassen. Nun hatte ich mich dran gemacht ein Script zu schreiben mit allen Befehlen die ich dazu brauche. Wir kennen alle die Nachteile von schnell gehackten Bash-Scripten. Irgendwo ein Dreher drin und die Daten müssen aus dem Backup geholt werden oder man vergisst User oder Gruppen.

Ich werde immer mehr zum Ansible Fan. Vor allem das strukturiere definieren von Tasks hilft mir sehr meine Aufgabe darzustellen. Ein weiterer Vorteil ist das Ansible sich um so Sachen wie “Errorhandling” kümmert und es auch möglich ist Results aus dem einem Task im anderen wieder aufzugreifen.

Hier passiert nichts wildes. Wir bereiten den neuen Fileserver vor mit allen Benutzern, Gruppen und den Files die wir benötigen. Dazu gibt es ein paar Tasks die die Permissions gerade ziehen während wir migrieren. Hier das Playbook was ich dafür geschrieben habe. Ich habe es versucht zu kommentieren.

Update: Ich habe einen kapitalen Fehler begangen. Ich habe zweimal eine Variabel mit dem Namen task registriert. Da die notifizierten Tasks erst am Ende ausgeführt werden, wird task einfach überschrieben. Jetzt haben beide Tasks zwei verschiedene Variabeln.

---
# Ich führe das ganze nicht remote aus sondern lokal.
#
- hosts: localhost
  sudo: yes

  tasks:

    - name: install rsync
      apt: name=rsync
           state=present

    # Hier legen wir zwei Gruppen an.
    #
    - name: add groups
      group: name={{ item }}
             state=present
      with_items:
        - intern
        - extern

    # Wir legen zwei Benutzer an. Die im Dict angegebenen Gruppen werden der
    # Gruppe "sambashare" hinzugefügt. Nichts besonderes. Die Benutzer
    # haben "/bin/false" als Shell und ein Homeverzeichnis in "/home"
    #
    - name: add users
      user: name={{ item.user }}
            state=present
            shell=/bin/false
            home=/home/{{ item.user }}
            groups=sambashare,{{ item.groups }}
            append=yes
      with_items:
        - { user: 'user1', groups: 'intern' }
        - { user: 'user2', groups: 'intern,extern' }

    # Ansible hat ein "synchronize"-Modul was ein Wrapper für Rsync ist.
    # Wirklich schön. So muss man nicht ein Script zusammen hacken sondern
    # kann die kompletten Möglichkeiten von Ansible zu nutzen.
    #
    # Wir speichern die Task-Results in der Variabel "task" damit wir sie in
    # den Handlern benutzen können. Ein Möglichkeit um zum Beispiel nur
    # die Permissions anzuwenden an das Item welches sich verändert hat.
    # Im Normalfall würde er bei nur einem geänderten Item die Handler laufen
    # lassen. Diese würden dann über alle Verzeichnisse rüber laufen und
    # die Permissions ändern. Da es sich um große Verzeichnisse handelt,
    # musste es eine bessere Lösung geben. Die Logik der Handler werden
    # später erklärt.
    #
    - name: sync freigaben
      synchronize: src=root@192.168.1.1:/srv/samba/{{ item.src }}/
                   dest=/srv/samba/{{ item.dest }}
                   perms=no
                   group=no
                   delete=yes
      with_items:
        - { src: 'Erstefreigabe', dest: 'erstefreigabe' }
        - { src: 'Zweitefreigabe', dest: 'zweitefreigabe' }
      register: freigaben
      notify:
        - set freigaben group
        - set freigaben file permissions
        - set freigaben group permissions
        - set freigaben permissions

    - name: sync homes
      synchronize: src=root@192.168.1.1:/home/{{ item }}/
                   dest=/home/{{ item }}
                   group=no
                   delete=yes
      with_items:
        - user1
        - user2
      register: homes
      notify:
        - set home group

  handlers:

    # Hier haben wir so einen Handler. Erstmal iteriert er über alle
    # Task-Results. Und nun kommt "when" ins Spiel: Er führt das Kommando
    # nur aus wenn ein Item als geändert gilt. So gibt es wenig Overhead
    # beim Ausführen der Handler. Sie werden nur ausgeführt wenn es auch
    # wirklich nötig ist.
    #
    - name: set freigaben group
      command: chgrp -R {{ item.item.dest }} /srv/samba/{{ item.item.dest }}
      with_items: freigaben.results
      when: item.changed == True

    - name : set freigaben file permissions
      command: find /srv/samba/{{ item.item.dest }} -type f -exec chmod 0664 {} \;
      with_items: freigaben.results
      when: item.changed == True

    - name : set freigaben group permissions
      command: find /srv/samba/{{ item.item.dest }} -type d -exec chmod 2775 {} \;
      with_items: freigaben.results
      when: item.changed == True

    - name: set freigaben permissions
      file: path=/srv/samba/{{ item.item.dest }}
            state=directory
            mode=2775
            owner=root
            group={{ item.item.dest }}
      with_items: freigaben.results
      when: item.changed == True

    - name: set home group
      command: chgrp -R {{ item.item }} /home/{{ item.item }}
      with_items: homes.results
      when: item.changed == True


Hi, I am Marvin and I am a midiocre programmer

/// d794cd8 /// python pycon

Jacob Kaplan-Moss hat eine Keynote auf der PyCon2015 gehalten. Es lohnt sich wirklich sie sich einmal anzuschauen. Nehmt euch die knappen 30 Minuten. Für jeden der sich noch nicht einmal traut sich selber als Programmierer zu sehen.

Jacob Kaplan-Moss hat eine Keynote auf der PyCon2015 gehalten. Es lohnt sich wirklich sie sich einmal anzuschauen. Nehmt euch die knappen 30 Minuten. Für jeden der sich noch nicht einmal traut sich selber als Programmierer zu sehen.



Blog Merge

/// d794cd8 /// blog python pelican

Es wurde verbracht. Ich habe meine beiden Blogs “gemerged”. Mein kleines Tech-Blog und mein Main-Blog mit den ganzen Fotos, Popkram, usw. Ich habe mir viele Gedanken darum gemacht ob es überhaupt Sinn macht. Ich kamm zu folgenden Punkten: Ich habe eh nicht viele Leser und der viel wichtigere Punkt ist, dass dieses Blog nun wirklich mich und meinte Interessen wiederspiegelt. Nicht mehr und nicht weniger. Ich will mir keine Gedanken darum machen in welches Blog meine Gedanken passen oder auch nicht.

Es wurde verbracht. Ich habe meine beiden Blogs “gemerged”. Mein kleines Tech-Blog und mein Main-Blog mit den ganzen Fotos, Popkram, usw. Ich habe mir viele Gedanken darum gemacht ob es überhaupt Sinn macht. Ich kamm zu folgenden Punkten: Ich habe eh nicht viele Leser und der viel wichtigere Punkt ist, dass dieses Blog nun wirklich mich und meinte Interessen wiederspiegelt. Nicht mehr und nicht weniger. Ich will mir keine Gedanken darum machen in welches Blog meine Gedanken passen oder auch nicht. Dies ist nun mein zentrales Gedanken-Repository. Und es soll sich auch vermischen. Darum geht es hierbei.

Diese Chance habe ich gleich genutzt um mein Wordpress wegzuschmeißen um auf einen Static-Sitegenerator umzusteigen. In diesem Fall pelican. Ein paar Bugs gibt es noch und an denen bin ich dran. Ein Vorteil ist jetzt schon die Datenbanklosigkeit. Einfach Markdown-Files und sed… aber das ist eine Blogpost für sich…



All glory to pipsi

/// d794cd8 /// python

Mein “Code”-Ordner sieht ganz schön zerfurcht aus. Alles voll mit Virtual-Environments. Das funktioniert schon alles ganz gut zum entwickeln. Möchte ich aber Tools wie beets oder youtube-dl installieren und nutze dafür pip, haut er mir einfach alle Abhängigkeiten in den systemweiten Bereich. Schöner wäre es alles seperat in Virtuelenvs im Home-Verzeichnis zu haben. Nun kommt pipsi ins Spiel: What does it do? pipsi is a wrapper around virtualenv and pip which installs scripts provided by python packages into separate virtualenvs to shield them from your system and each other.

Mein “Code”-Ordner sieht ganz schön zerfurcht aus. Alles voll mit Virtual-Environments. Das funktioniert schon alles ganz gut zum entwickeln. Möchte ich aber Tools wie beets oder youtube-dl installieren und nutze dafür pip, haut er mir einfach alle Abhängigkeiten in den systemweiten Bereich. Schöner wäre es alles seperat in Virtuelenvs im Home-Verzeichnis zu haben. Nun kommt pipsi ins Spiel:

What does it do?  pipsi is a wrapper around virtualenv and pip
which installs scripts provided by python packages into separate
virtualenvs to shield them from your system and each other.

In other words: you can use pipsi to install things like
pygmentize without making your system painful.

Das erklärt eigentlich alles ganz schön. Alle Abhängigkeiten schön lokal im Home-Verzeichnis. Ich installier es mit einem

curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python 

und passe PATH soweit an, dass ~/.local/bin bedacht wird. Mit

pipsi install beets 

installiert pipsi alles sauber so das ich es einfach mit

pipsi uninstall beets 

wieder loswerden könnte. Yiha. Dahinter steckt ma wieder mitsuhiko. Bekannt aus Projekten wie “flask”, “jinja2”, “click”, usw… Was ein Teufelskerl.



virtualenv und Ubuntu Trusty Tahr

/// d794cd8 /// ubuntu python

Eigentlich wollte ich ja nur mein ThinkPad upgraden. Die neue Ubuntu Version “Trusty Tahr” ist erschienen. Der Updateprozess lief soweit sauber durch und nach dem Reboot war viel weniger kaputt als sonst. Also schnell wieder ran ans coden. Mein virtualenv ging auf einmal nicht mehr. “Trusty Tahr” ist mit Python 3.4 gekommen, da schien das “Problem” zu sein. virtualenv wollte nicht mehr. Irgendeine komische Fehlermeldung. Ab Python 3 und vor allem mit 3.

Eigentlich wollte ich ja nur mein ThinkPad upgraden. Die neue Ubuntu Version “Trusty Tahr” ist erschienen. Der Updateprozess lief soweit sauber durch und nach dem Reboot war viel weniger kaputt als sonst. Also schnell wieder ran ans coden. Mein virtualenv ging auf einmal nicht mehr. “Trusty Tahr” ist mit Python 3.4 gekommen, da schien das “Problem” zu sein. virtualenv wollte nicht mehr. Irgendeine komische Fehlermeldung. Ab Python 3 und vor allem mit 3.4 sollte man eigentlich das eigene pyvenv benutzen anstatt virtualenv. Dieses failed unter Ubuntu aber sowas von:

$ pyvenv-3.4 foo
Error: Command '['/home/mpreuss/foo/bin/python3.4', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1

What the fizzle? Versucht man es mit --without-pip klappt es… aber immer extra pip per Hand installieren? Habe ich eigentlich keine Lust zu. Ich bin auch nicht alleine. Also eine Lösung musste her. Und die ist einfacher als ich dachte.

Einfach per pip install --upgrade virtualenv virtualenv upgraden. Und schon kann man mit

virtualenv -p /usr/bin/python3 foo

sich ein Python 3 Environment bauen. Ist zwar nur ein Workaround aber ich hatte eh immer virtualenv genommen.



2 of 2