Donnerstag, 30. Juli 2020

Windows 10 - OpenSSH und Windows Terminal

OpenSSH wird mittlerweile unter Windows 10 mit der Version 1809 standardmäßig mit installiert. So kann man sich genau wie unter Linux zu jedem Gerät mit aktivierten SSH verbinden oder SSH-Keys direkt unter Windows 10 erstellen.


Verbindung zu einem RaspberryPi aufbauen:
  • ssh pi@192.168.1.110

SSH-Keys erzeugen (wenn eine Anmeldung per Kennwort verboten ist):
  • ssh-keygen
Standardmäßigen wird ein 2048-Bit-RSA-Key erstellt. Weitere Infos auch hier: https://docs.microsoft.com/de-de/windows-server/administration/openssh/openssh_keymanagement

Das neue Windows Terminal kann man mittlerweile vielfältig seinen Wünschen anpassen. Zum Beispiel kann man von der PowerShell aus Windows Terminal mit drei Bereichen (Eingabeaufforderung, PowerShell und Linux) öffnen.


wt -p "Command Prompt" `; split-pane -p "Windows PowerShell" `; split-pane -H wsl.exe


Weitere Infos finden sich hier: https://docs.microsoft.com/de-de/windows/terminal/

Sonntag, 26. Juli 2020

Rund um Linux - Einige nützliche Befehle für die Shell II (Download mit wget und seq)

Nach 7 Jahren ein kurzes Update für meinen Beitrag "Rund um Linux - Einige nützliche Befehle für die Shell I" um die Shell als Downloadhelfer (wie auch hier Download von Video Streams mit ffmpeg und hier Regenradar - Bilder sammeln oder manuell abrufen beschrieben) verwenden zu können.


Der Download von Bildern mit einer Schleife ist relativ einfach möglich. Möchte man z.B. folgende Bilder mit einer bestimmten Nummerierung herunterladen:
Kann man dank seq Zahlen in einem definierten Bereich ausgegeben und mit Hilfe des Parameters -w auch führende Nullen hinzugefügen.

seq -w 3 10
03
04
05
06
07
08
09
10


Daraus ergibt sich der folgende Befehl:
for i in `seq -w 01 05`; do wget https://www.shemel.de/download/images/test_2020-${i}.jpg ; done

Will man die Statusmeldungen von wget unterdrücken, kann man noch den Parameter -q hinzufügen:
for i in `seq -w 01 05`; do wget -q https://www.shemel.de/download/images/test_2020-${i}.jpg ; done


Möchte man Bilder einer kompletten Gallery herunterladen, ist dies auch mit Hilfe von wget möglich.


wget -q -r -np https://www.tafel-hef.de/bilder.php

  • Mit Hilfe des Parameters -r werden rekursiv alle Dateien heruntergeladen, die bei der hinterlegten Adresse verlinkt sind.
  • Mit dem Parameter -np werden nur Dateien die unterhalb des Verzeichnisses liegen heruntergeladen (no-parent). Achtung: In dem oben genannten Beispiel funktioniert dies nicht, da die URL nicht mit "/" endet. So wird die komplette Webseite heruntergeladen (inkl. aller Bilder).

Mit Hilfe von youtube-dl, kann man per Kommandozeile Videos von youtube.com und anderen Video Plattformen herunterladen.


youtube-dl "https://www.youtube.com/watch?v=BvjterYmC98"

Viele Beispiele finden sich hier https://wiki.ubuntuusers.de/youtube-dl/ .

Mittwoch, 22. Juli 2020

Raspberry Pi - GPIO-Pins erweitern mit I2C und MCP23017

Es kann durchaus vorkommen, dass die GPIO-Pins an einem Raspberry Pi nicht ausreichend sind. Dies kann gerade dann passieren, wenn man gleichzeitig viele Schalter, LEDs und Relais verwenden will.


Mit Hilfe des an den I2C-Bus (siehe auch Raspberry Pi - OLED Display (SSD1306) I2C ansteuern und Temperatur auslesen) angeschlossenen GPIO-Extender-Chip MCP23017, lassen sich aus 2 Pins 16 zusätzliche machen.

Eine Ausführliche Anleitung dazu findet man hier: Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 1.

Dienstag, 21. Juli 2020

Agile Softwareentwicklung - GitHub Flow notwendig?

Ist der GitHub Flow bei einem agilen Entwicklungsteam überhaupt noch notwendig?

 

GitHub Flow kurz erklärt


Wird eine neue Funktion in einem Softwareprojekt entwickelt, dann erstellt der Entwickler in der Regel einen "neuen Branch". Ist die Entwicklung der neuen Funktion abgeschlossen, wird ein "Pull Request" erstellt und zusammen mit dem Team besprochen. Mit Hilfe von automatischen Tests (siehe auch Unit-Tets - Was ist automatisches Testen?) wird sichergestellt, dass der neue bzw. angepasste Quellcode auch funktioniert. Anschließend kann der zuvor neu erstellte "Branch" in den "Master-Branch" übernommen werden.

Siehe hierzu auch "Following the GitHub flow":

Quelle: https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/github-flow#following-the-github-flow

Continuous Integration (CI) / Continuous Delivery (CD)


Mit Hilfe der CI/CD-Pipelines, welche in einem agilen Softwareprojekt zwingend erforderlich sind, welche den Prozess des fortlaufenden Zusammenfügens von Komponenten hin zu einer Anwendung garantieren, müssen Änderungen am Quellcode bzw. neue Funktionen nicht mehr bis zum nächsten großen Release gesammelt werden. Auch das "große" gemeinsame Testen und das "Live setzen" zu einem festgelegten Termin ist nicht mehr erforderlich. Siehe auch Softwaretest bei agiler Entwicklung durch Testautomatisierung .

Kleine Anpassungen sollten immer so schnell wie möglich getestet und abgenommen werden, damit diese sofort veröffentlicht werden können. Die sogenannten "Release Branches" sind damit hinfällig.

Wenn jede kleine neue Funktion oder Korrektur von Fehlern (Bugs) nach erfolgreicher Testautomatisierung und Abnahme durch den Fachbereich im Live System zur Verfügung steht, dann werden auch keine "Hotfixes" mehr benötigt (Hotfixes = Feature). Fehlerbehebungen müssen somit nicht in einer "veralteten Version" erfolgen (Forward Fixing und nicht Rolling Back).


Was bleibt zum Schluss übrig?


Die Entwickler arbeiten nur noch mit dem "Master-" und dem "Feature-Branch".



Sonntag, 19. Juli 2020

RAM Speicher - Steckplatz frei?

Ob man seinen PC noch um einen weiteren Riegel Arbeitsspeicher aufrüsten kann, erfährt man mit Hilfe des Task-Manager von Windows 10.


Der Start des Task-Manager erfolgt z.B. über die "Taskleiste" oder mit Hilfe der Tastenkombination "Strg+Umschalt+Esc". Anschließend "Mehr Details" und "Arbeitsspeicher" anklicken.


Freitag, 17. Juli 2020

Hex-Editor - Abbilddatei (Speicheranalyse) mit Windows

Unter Windows kann pauschal jeder User den Speicherinhalt von der von ihm gestarteten Programmen auslesen. Dies kann z.B. Hilfreich sein um Schädlinge oder Programme zu analysieren.


Mit Hilfe des Taskmanagers kann man von jedem Prozess eine aktuelle "Abbilddatei" speichern. Siehe dazu folgende Screenshots.




Damit man die erstellte Datei auslesen kann, benötigt man noch einen Hex-Editor (wie z.B. HxD). Der Editor zeigt jetzt den Speicherinhalt als Hex- und dekodierten Text an.




Samstag, 11. Juli 2020

Reguläre Ausdrücke (RegExp) mit Grep - Beispiele

Reguläre Ausdrücke (regular expression oder RegExp) bzw. Zeichenketten, können als Filterkriterien in Textsuchen verwendet werden. Der Text wird dabei mit dem "Muster" des regulären Ausdrucks abgeglichen. Somit kann man etwas suchen und finden, auch dann wenn man nicht mehr die genaue Schreibweise kennt.


Unter Linux kann man Hilfe von grep Dateien nach bestimmten Textzeichen durchsuchen. Unter Windows wäre die Verwendung mit Hilfe von grepWin (Regular expression search and replace for Windows) oder Select-String möglich.

Eine einfache Suche ist mit dem folgenden Befehl möglich:
  • grep 'hemel' \ ~/*
Der Parameter -E von grep definiert einen Regulären Ausdruck und die runden Klammern als Sonderzeichen. Mit dem Parameter -i ignoriert grep zusätzlich Groß- und Kleinschreibung.
Der | Strich (Pipe) steht für ein logisches "oder", somit wird nach dem "h" nach "hemel" und "hamel" gesucht.
  • grep -E -i 'h(e|a)mel' \ ~/*
Möchte man nach mehreren Zeichen inkl. Umlauten suchen, muss man die Zeichengruppe [] inkl. dem Quantifer + verwenden. Jetzt wird nach einem oder mehreren Zeichen gesucht, die innerhalb der [] vorkommen.
  • grep -E -i 'h[\0-9A-F]+mel' \ ~/*

Weitere Beispiele

  • [he]+ "h", "e", "hh", "hheeh" usw.
  • [0-6]{2,5} zwei bis fünf Ziffern von 0-6 in Folge, z. B. "16" oder "23456", jedoch nicht "7", "0.1" oder "1bca2“
  • h.{0,2}mel beliebiges Zeichen, min 0mal, max 2mal vorkommen, z.B. hemel, haemel, hmel

Wichtige Zeichen

  • . einzelnes Zeichen
  • (..) Gruppe von Elementen
  • ..|.. Oder Verknüpfung
  • ^ findet den Anfang einer Zeile
  • $ findet das Ende einer Zeile

Wichtige Zeichengruppen

  • [eam] ein Zeichen "e", "a" oder "m"
  • [0-9A-F] ein großer beliebiger Buchstabe oder eine beliebige Ziffer
  • [A-Za-z0-9] ein beliebiger Buchstabe oder eine beliebige Ziffer

Vordefinierte Zeichenklassen

  • \d Ziffer [0-9]
  • \D keine Ziffer [^\d] bzw. [^0-9]
  • \w Buchstabe [a-zA-Z_0-9]
  • \W weder Buchstabe noch Zahl noch Unterstrich [^\w]
  • \s whitespace Leerzeichen und Steuerzeichen \f, \n, \r, \t und \v
  • \S kein whitespace

Quantifier

  • ? optional, kommt null- oder einmal vor {0,1}
  • * beliebig oft oder auch keinmalt {0,}
  • +  mindestens einmal oder auch mehrfach {1,}
  • {n} muss exakt n-mal vorkommen {n,n}
  • {n,m} muss mindestens n-mal und darf maximal m-mal vorkommen

Unter debuggex.com kann man die erstellte regular expression testen und verstehen.


Freitag, 26. Juni 2020

Palm m515 Handheld - Unter Windows 10 betreiben

Der Palm M515 gehörte im Jahr 2002 zu der PDA High-End-Serie. Er hat 16 MB Speicher, 4 MB Flash-ROM, 16-Bit-Farbdisplay mit 160 x 160 Pixeln Auflösung und eine Infrarot- sowie SD-Card-Schnittstelle. Als Software zum Datenabgleich kommt Palm Desktop 4.0.1 zum Einsatz und ist nur mit einer USB-Docking-Station möglich.


Was wird benötigt?

  • Gebrauchter Palm M515 bei ebay (kleinanzeigen) zwischen 10-20 EUR. Hinweis: Bitte darauf achten, dass auch eine funktionierende Docking Station (Hotsync) mit dabei ist.
  • Ggf. ein neuer Akku (850mAh, 3.7V).
  • SD-Karte (max. 1GB) bei ebay (kleinanzeigen) ab 1 EUR verfügbar.
  • Logitech TypeAway Keyboard bei ebay (kleinanzeigen) ab 1 EUR verfügbar.

Warum einen Palm im jahr 2020 verwenden?

  • Kleine Mitschriften und Notizen sind unterwegs komplett ohne Internetverbdinung möglich und wandern somit auch nicht in irgendeine Cloud (Datenschutz).
  • Einsatz als ultra kleine Schreibmaschine möglich in Verbindung mit dem Logitech TypeAway Keyboard und Anwendung CardTXT (https://freeware.palmclub.nl/c1/108-cardtxt.html). Die Dateien werden auf der SD-Karte (max. 1GB) im txt-Format abgespeichert und können am PC direkt weiter verarbeitet werden (SD-Karte aus dem Palm entnehmen und in den PC stecken).
  • Mit einem neuem Akku, hat der Palm eine sehr lange Akkulaufzeit im Standby (ca. 3-4 Wochen). 
 

Installation unter Windows 10


Software installieren

  • Quick Install im Palm Desktop aufrufen
  • Die zu installierenden Dateien (.prc) hinzufügen und anschließend den "Hotsync" durchführen

Installation Logitech TypeAway-Tastatur

Zuerst benötigt man einen Treiber, welcher per "Hotsync" direkt auf dem Palm installiert werden muss. Siehe dazu auch https://download01.logitech.com/web/ftp/pub/pdf/keyboards/typeaway.pdf .

 
Achtung: Der mitgelieferte Treiber funktioniert nur auf Palm OS 4. Es gibt aber auch einen Beta-Treiber für OS5, welcher auch mit dem Tungsten T funktioniert. Siehe ftp://ftp.logitech.com/pub/techsupport/keyboards/pda/ .



Freitag, 5. Juni 2020

Firefox - command line option, start from a batch file

Will man nach dem Starten von Windows direkt mit seinen Lieblingswebseiten surfen, bietet sich beim Firefox Browser die folgenden Möglichkeiten per "command line" oder "batch file" an.


Aufruf per command line (cmd):

"C:\Program Files\Mozilla Firefox\firefox.exe" -new-window "http://www.ebay.de/" -new-window "https://www.mydealz.de/" -new-window "https://mail.google.com/mail/u/0/#inbox"


Aufruf per batch file (.bat):

@echo off
start "" "C:\Program Files\Mozilla Firefox\firefox.exe" -new-window "http://www.ebay.de/" -new-window "https://www.mydealz.de/" -new-window "https://mail.google.com/mail/u/0/#inbox"

Donnerstag, 4. Juni 2020

Cloud - Pizza as a Service

Was hat eigentlich "Pizza" mit Cloud Services zu tun?

 
Das Pizza Modell von Albert Barron (veröffentlicht in 2014 auf Linkedin) beschreibt anhand von "Wie möchte ich eine Pizza essen?" die unterschiedlichen Cloudvarianten.
  • Pizza selbst machen
  • Tiefkühlpizza in den Ofen schieben
  • beim Lieferdienst bestellen,
  • ins Restaurant gehen

Die Entscheidung für ein Servicemodell ist dabei abhängig von,
  • wie viel man selbst erledigen kann und will,
  • wie viel Zeit man hat,
  • wie viel man vom Kochen versteht
  • oder welche Zutaten ­man gerade zur Verfügung hat.


Quelle: Albert Barron (https://www.linkedin.com/pulse/20140730172610-9679881-pizza-as-a-service)

Sonntag, 31. Mai 2020

Clickjacking - Schutz mit Hilfe von Content Security Policy (CSP) oder X-Frame-Options

Bei Clickjacking versucht eine böswillige dritte Website die eigentliche Website des Nutzers in einem unsichtbaren Rahmen zu laden bzw. zu überlagern (z.B. per iframe). Der Benutzer wird dann dazu verleitet, Aktionen auf der ursprünglichen (böswilligen) Website auszulösen ohne dass er sich dessen bewusst ist.


Hintergrund: Clickjacking ist ein konzeptionelles Problem von JavaScript und Webanwendungssicherheit. (Quelle: https://de.wikipedia.org/wiki/Clickjacking)
 

Welche Gegenmaßnahmen gibt es?


Um so einen Angriff zu verhindern, sollte man eine explizite Whitelist von Seiten definieren, die die aktuelle Seite über die Direktive für Frame-Vorfahren in die Content Security Policy (CSP) einbetten können.

Damit auch ältere Browser unterstützt werden, kann der (veraltete) Header X-Frame-Optionen zusätzlich auf DENY oder SAMEORIGIN gesetzt werden. Die Option DENY verhindert, dass Browser die Website in einem iframe anzeigt.

Header set X-Frame-Options "DENY"

Wird der Header auf SAMEORIGIN gesetzt, kann die Website in iframes auf anderen Seiten derselben Domain eingebettet werden, verhindert jedoch das Einbetten in Websites von dritten.

Header always set X-Frame-Options "SAMEORIGIN"

Wichtig: X-Frame-Options funktioniert nur durch den HTTP-Header, und NICHT per meta-tag! Daher muss die Einstellung direkt im Apache vorgenommen oder per .htaccess gesetzt werden.

Dienstag, 26. Mai 2020

Leaflet.js - draggable marker und Ausgabe der Koordinaten (lat, lng)

In dem Beitrag "Webseite mit interaktiver Karte ohne Google Maps? Leaflet.js" hatte ich beschrieben, wie man Leaflet.js auf seiner Webseite als gute Alternative zu Google Maps einbindet. 


In diesem Beispiel geht es darum einen "ziehbaren" Marker zu erstellen und die Koordinaten in zwei Feldern (lat, lng) anzuzeigen.


Es wird die Dragend-Methode für den Marker verwendet um lat und lng abzufangen:

<script type="text/javascript">
    function showMap() {
      
        var map = L.map('map_leaflet').setView([50.9033081, 9.5924615], 14);
        var my_divicon = L.divIcon({
            className: 'arrow_box'
        });
        var marker = L.marker([50.9033081, 9.5924615], {
            draggable:true
        });
        function addToTextBox(lt,ln){
            document.getElementById('lat').innerHTML = lt;
            document.getElementById('lng').innerHTML = ln;
          
        }
        marker.on('dragend', function(event){
            //alert('drag ended');
            var marker = event.target;
            var location = marker.getLatLng();
            var lat = location.lat;
            var lon = location.lng;
            addToTextBox(lat,lon);
            //alert(lat);
            //retrieved the position
          });
       
        // load a tile layer
        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
            {
                attribution: 'Map data © OpenStreetMap and contributors CC-BY-SA',
                maxZoom: 18,
                minZoom: 9
            }).addTo(map);
          
        // initialize the map
        //var map = L.map('map_leaflet', { layers: osm, tap: false } );
        L.control.scale({imperial:false}).addTo(map); // metrisch

        marker.addTo(map);
    }
</script>



Samstag, 23. Mai 2020

JavaScript - Fetch API File Upload: Apache 403 Forbidden error SecFilterEngine

Für eine Erweiterung meiner Webcamseiten, benötigte ich ein Formular mit Bild-Upload-Funktion. Das Hochladen von Dateien ist eine der häufigsten Funktionen für eine Webanwendung. Ich verwende in meinem Beispiel KEINE der vielen JavaScript-Bibliotheken, sondern die Fetch-API (eine native JavaScript Funktion).


Als erstes benötigt man auf der Webseite ein HTML Formular mit einem Eingabeelement:

...
    <form action="xyz.php" name="melderForm" method="post" enctype="multipart/form-data">
...
        <input id="formMelderImage-file" class="form-control" type="file">
...
    </form>


Mit dem folgenden JavaScript Code wird ein Event-Listener hinzugefügt, wenn der Benutzer eine Datei auswählt. Mit der Methode fileUpload () wird ein Dateiobjekt als Eingabe empfangen und es mit fetch () auf den Server hochgeladen (inklusive einer Überprüfung des Dateityps (nur Bilder) und der Dateigröße (< 10MB).

<script>
    // Datei vom Formular
    const fileInput = document.getElementById('formMelderImage-file');

    // event listener
    fileInput.addEventListener('change', () => {
        fileUpload(fileInput.files[0]);
    });
   
    const fileUpload = (file) => {
        // Check des Dateityps
        if(!['image/jpeg', 'image/gif', 'image/png', 'image/svg+xml'].includes(file.type)) {
            console.log('Es sind nur Bilder erlaubt!');
            return;
        } else if(file.size > 10 * 1024 * 1024) { // Check der Groesse (< 10MB)
            console.log('Die Datei muss kleiner 10MB sein!');
            return;
        } else {
            // Datei zum FormData object hinzufügen
            const fd = new FormData();
            fd.append('formMelderImage-file', file);

            // `POST` request senden
            fetch('/upload/image', {
                method: 'POST',
                body: fd
            })
            // Abfangen von Fehlern
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(err => console.error(err));
        }
    }
</script>

SyntaxError: "JSON.parse: unexpected character at line 1 column 1 of the JSON data" - 403 Forbidden


404- oder 403-Fehlern nach dem Senden eines Formulars können an der mod_security-Einstellung in Apache auf dem Server liegen. Das Apaches-Modul mod_security hat standardmäßig ein Upload-Limit von 60 KB, sodass bei jedem größeren Upload ein 403-Fehlercode ausgegeben wird.

Man kann versuchen diese zu deaktivieren, und folgendes zu der .htaccess-Datei hinzuzufügen, man wird aber vermutlich keinen Erfolg mehr haben (support for .htaccess files was discontinued in 2.x as it raised too many security issues https://stackoverflow.com/questions/19093542/how-to-disable-mod-security-and-mod-security2-in-htaccess/19196856#19196856)

<IfModule mod_security.c>
  SecFilterEngine Off
</IfModule>

Oder wenn man direkten Zugriff auf die Apache Einstellungen hat, geht dies auch direkt unter nano  /etc/httpd/conf.d/mod_security.conf .

<IfModule mod_security.c>

    # Turn the filtering engine On or Off
    SecFilterEngine Off

Freitag, 24. April 2020

Raspberry Pi - Adafruit Mini PiTFT 135x240 Color TFT Add-on [Programmierung]

In dem Betrag Raspberry Pi - Adafruit Mini PiTFT 135x240 Color TFT Add-on wurde das Display bereits näher beschrieben. In diesem Beitrag möchte ich das Display als Erweiterungsoption für die Raspberry Pi - zero : Wetterstation incl. OLED-Display vorstellen. Zur Anzeige von WLAN-, Sensor- und Speicherplatzinformationen. Zusätzlich kann direkt ein Upload des Webcam Bildes und ein Reboot per Tastendruck erfolgen.


Hinweis: Als Basis wurden die Beispiele von Adafruit für das Display verwendet.

Im ersten Schritt wurden die Befehle/Funktionen definiert, welche den jeweiligen Status anzeigen sollen oder per Buttondruck aufgerufen werden sollen.


cmdWlanSsid = "iwconfig wlan0 | grep ESSID | awk -F: '{print $2}'"
cmdHostName = "hostname -I | cut -d' ' -f1"
cmdCam = "vcgencmd get_camera | cut -d' ' -f2" #supported=1 detected=1 => OK
cmdDisk = 'df -h | awk \'$NF=="/"{printf "Disk: %d/%d GB  %s", $3,$2,$5}\''
cmdWebcam = '/home/pi/webcam/webcam.sh'
cmdReboot = 'sudo reboot'

def is_connected():
    try:
        # connect to the host -- tells us if the host is actually
        # reachable
        socket.create_connection(("www.google.com", 80))
        return "online"
    except OSError:
        pass
    return "offline"


# Temperatursensor ermitteln
SensorPfad = "/sys/bus/w1/devices/" # Pfad
SensorNames = open("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves" ,"r")
Sensor = SensorNames.readline()
if Sensor:
    SensorNames.close() 


Anschließend werden diese Informationen an das Display in einer "while" Schleife gesendet.


while True:
     
        # Draw a black filled box to clear the image.
        draw.rectangle((0, 0, width, height), outline=0, fill=(0, 0, 0))
     
        #Show WLAN
        WLAN = subprocess.check_output(cmdWlanSsid, shell=True).decode("utf-8")
...
        # Write lines of text.
        y = top
        draw.text((x, y), WLAN, font=font, fill="#FFFFFF")
...
        # Display image.
        display.image(image, rotation)
        time.sleep(0.1)


 

Mit Hilfe von buttonA = digitalio.DigitalInOut(board.D23) kann das Drücken der Taste abgefangen werden. 


So erfolgt beim Drücken des "Button A" ein "Upload des Webcam Bildes" mit dem bekannten Script (https://sebastianhemel.blogspot.com/2019/11/raspberry-pi-camera-modul-v21.html) und beim Drücken des "Button B" die Anzeige eines "Copyright". Werden beiden Tasten gleichzeitig gedrückt, erfolgt ein Reboot des Pi.

...
        if buttonB.value and not buttonA.value:  # just button A pressed
...
            y = top
            text = "Webcam Upload..."
            draw.text((x, y), text, font=font, fill="#FFFFFF")
            y += font.getsize(text)[1]
            # Display image.
            display.image(image, rotation)
            subprocess.check_output(cmdWebcam, shell=True).decode("utf-8")
            draw.text((x, y), "...finished!", font=font, fill="#FFFFFF")
...



Anbei das komplette Python Script (rgb_display_stats-picture.py), welches man am Besten direkt beim Booten starten sollte.

sudo nano /etc/rc.local

Und die folgende Zeile hinzufügen:

sudo python3 /home/pi/rgb_display_stats-picture.py &

vor dem "exit 0" in der Datei.

Freitag, 17. April 2020

Big Data - Was ist das?

Big Data (dt. "Massdaten / große Datenmengen") ist die Bezeichnung für extrem große und komplexe Datenmengen. Diese Menge an Daten können die Grenzen und Möglichkeiten der normalen SQL-Datenbanken übersteigen.


Die Datenmengen werden sich in den kommenden Jahren immer weiter vervielfachen. Wichtig: Mit "Big Data" sind alle Daten gemeint, nicht nur personenbezogene Daten, sondern auch Sensordaten z.B. Messwerte.

In der Definition spricht man in der Regel von fünf Vs des Big Data:

Volume (Umfang, Datenvolumen)
Bedeutet das sehr große Datenvolumen, mehrmals täglich produziert werden.

Variety (Bandbreite der Datentypen und -quellen)
Definiert die Verschiedenartigkeit der Daten aus unterschiedlichen Quellen.

Velocity (Geschwindigkeit, mit der die Datenmengen generiert und transferiert werden)
Bezeichnet die Geschwindigkeit von Daten. Das Verarbeiten passiert oftmals in der Regel von wenigen Sekunden.

Veracity (Echtheit von Daten)
Bedeutet die Glaubwürdigkeit, Zuverlässigkeit und Genauigkeit von Daten.

Value (unternehmerischer Mehrwert)
Konzentriert sich auf den unternehmerischen Mehrwert, der aus den generierten Daten geschaffen werden kann (Business Value).

Montag, 13. April 2020

HTTPS - Weiterleitung per .htaccess

Mit Hilfe einer .htaccess Datei lassen sich verschiedene Einstellungen eines Apache Webservers vornehmen. Darunter fallen zum Beispiel Weiterleitungen oder auch ein Passwort geschützter Bereich. In dem Beitrag beschreibe ich kurz das Vorgehen zur Einrichtung einer Weiterleitung auf HTTPS.


Hat man für seine Webseite nur ein Webhosting-Paket bestellt, lässt sich keine direkte Konfiguration am Apache Webserver selber vornehmen. Um z.B. eine Weiterleitung per HTTP zu HTTPS mit Hilfe der Apache Virtual Host Konfiguration vorzunehmen.

Mit HTTPS werden alle Daten zwischen dem Browser und dem Webserver verschlüsselt und somit sicher übertragen. Bevor eine HTTP zu HTTPS-Umleitung für die Domain erfolgen kann, muss ein SSL-Zertifikat installiert und aktiviert werden. Dies geht mittlerweile bei den meisten Webhostern relativ einfach z.B. mit kostenfreien Let’s Encrypt Zertifikaten.

Domain auf verschlüsselte Verbindung (HTTPS) weiterleiten

Die Weiterleitung erfolgt mit Hilfe einer .htaccess Datei. Das notwendige Apache Modul mod_rewrite ist bei den Hosting Angeboten in der Regel immer aktiv.

Verwende ich einen eigenen Server, muss ich das Modul mit dem folgenden Befehl aktivieren und anschließend den Webserver neustarten.
sudo a2enmod rewrite
Hinweis: Sollte man auf Inhalte der Webseite z.B. per HTML-Wrapper-App noch mit HTTP zugreifen, sollten die Verlinknungen innerhalb der App auf HTTPS umgestellt werden. Ansonsten öffnet sich direkt ein Browser Dialog wegen der Weiterleitung auf HTTPS.

Jetzt muss nur noch die .htaccess Datei im Domain-Stammverzeichnis erstellt werden und die nachfolgenden Zeilen eingefügt werden, um HTTP zu HTTPS umzuleiten.


# Weiterleitung (Redirect) https
RewriteEngine On

RewriteCond %{SERVER_PORT} !^443$

# 301: Die Weiterleitung ist dauerhaft
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]


Samstag, 11. April 2020

Digitalisierung - The Six D's of Disruption

Die 6 D's der Disruption von Dr. Peter Diamandis (Singularity University co-founder) ist ein sehr gutes Modell, um zu verstehen, wie Technologien bzw. Digitalisierung uns beeinflussen. 


Das 1. "D" steht für Digitalisierung, oder "Digitization"

Ein analoges Produkt wird digitalisiert. Als bekannste Beispiel wird meist die erste digitale Kamera von Kodak verwendet. Sie hatte 0,01 Megapixel und konnte nur Bilder in Schwarz und Weiß auf einer Kassette aufnehmen und wog ca. 4 kg.

=> Ab diesem Moment fängt das Produkt an, sich auf einer exponentiellen Kurve zu bewegen.

Das 2. "D" nennt sich "Deception" dt. Irreführung

Dies ist der (Irr)Glaube, dass Technologie immer besser sein sollte, als sie ist. Die digitalen Kameras mit 0,02 - 0,04 und 0,08 Megapixel waren immer noch nicht gut genug.

Das 3. "D" nennt sich "Disruption" dt. Bruch/Spaltung

Diese Phase tritt ein, wenn das Produkt nach mehreren Iterationen gut genug ist. Beim Beispiel der Digitalkameras war dies ab ca. 2 Megapixel der Fall. Das war für viele der Moment, ab dem man keine analogen Filme mehr gekauft hat.

=> Dies ist zugleich auch der wichtigste Moment, der zwangsläufig immer nach der Irreführung, der Deception, zur Disruption führt.


Anschließend kommt es zur die Dematerialisierung (4. Dematerialization) von Technologien, sie verschwinden! Man nenn dies auch den iPhone-Moment. 



Man kauft keine Kamera mehr, sondern nutzt das Smartphone. Dies führt zu einer Demonetarisierung (5. Demonetization), also zu einer Geldentwertung.

Man benötigt keinen Film mehr und lässt diesen auch nicht mehr entwickeln. Es kommt zu einer Demokratisierung (6. Democratization) und die Technologie ist immer mehr Menschen zugänglich. Die Technologie ist nun überall erhältlich und zugleich sehr günstig. Dies führt zu einem Verschwinden von alten Technologien bzw. kompletter Berufszweige.


Fazit: Mit Hilfe des Modells, kann man erkennen wo sich die Industrie bzw. eine Technologie heute befindet und wo sie sich hinbewegen wird.

Montag, 6. April 2020

Windows 10 - PowerShell Module für Pop-up- / Toast-Notifications

Die Benachrichtigungen von Windows 10 mit Hilfe von BurntToast sinnvoll für eigene Zwecke nutzen. Zum Beispiel um Nachrichten vom Raspberry Pi an einen Windows 10 Rechner zu senden.


Mit dem o.g. PowerShell-Modul ist es möglich Windows 10 Benachrichtigungen anzuzeigen.

Paket mit PowerShellGet installieren.
Hinweis: PowerShell muss als Administrator ausgeführt werden.
  • Install-Module -Name BurntToast

Jetzt muss bei der Ausführungsrichtlinie das voreingestellte "Restricted" auf "RemoteSigned" geändert werden.
Hinweis: Die möglichen Werte für ExecutionPolicy findet man hier http://technet.microsoft.com/de-de/library/dd347628.aspx .
  • Set-ExecutionPolicy RemoteSigned

Mit dem folgenden Befehl kann man eine Benachrichtigung mit Logo generieren.
  • New-BurntToastNotification -AppLogo D:\hemel_sebastian.jpg -Text "Hello World!", 'Logo Test'

Mit einem PowerShell Script von heise.de ist es möglich UDP-Pakete zu empfangen. So kann man von einem beliebigen Rechner z.B. einem Raspberry Pi Statusmeldungen / Logs usw. an einen Windows PC senden (siehe auch c't 8/2020 S. 158).

Donnerstag, 2. April 2020

DSL - Um­zug und Sonderkündigungsrecht

Kann nach einem Umzug der bisherige DSL-Provider keinen Internetzugang an der neuen Adresse bereitstellen hat man nach dem Telekommunikationsgesetz (TKG) für solche Fälle ein Sonderkündigungsrecht nach drei Monaten (TKG § 46, 8). Aber Achtung, das TKG sagt nicht, ab wann diese Kündigung erfolgen muss.


TKG § 46, 8
„Wird die Leistung am neuen Wohnsitz nicht angeboten, ist der Verbraucher zur Kündigung des Vertrages unter Einhaltung einer Kündigungsfrist von drei Monaten zum Ende eines Kalendermonats berechtigt“.

So kann es immer wieder vorkommen, dass die 3-Monatsfrist erst ab dem Umzugstermin vom DSL-Provider akzeptiert wird. Siehe hierzu auch OLG München, Urteil v. 18.01.2018 – 29 U 757/17 .

Über Rechte beim Anbieterwechsel informiert auch die Bundesnetzagentur https://www.bundesnetzagentur.de/DE/Sachgebiete/Telekommunikation/Verbraucher/Anbieterwechsel/Anbieterwechsel_node.html .

Sonntag, 29. März 2020

Nintendo GameBoy Advance - IPS Screen LCD Backlight mod + pre-cut Shell case

Der Game Boy Advance bietet volle Abwärtskompatibilität zu Game-Boy- und Game-Boy-Color-Spielen und bietet daher einen günstigen Einstieg in das "Retro-Gaming". In diesem Beitrag beschreibe ich, wie man durch einen Mod die fehlende Hintergrundbeleuchtung und Entspiegelung nachrüsten kann.


Als erstes benötigt man einen Game Boy Advance (ab ca. 40 EUR), ich hatte noch einen in den tiefen meiner Schublade, der aufgrund der fehlenden Hintergrundbeleuchtung so gut wie nie verwendet wurde.

Hintergrund: Erst Anfang 2003 reagierte Nintendo mit der Entwicklung des stark verbesserten Game Boy Advance SP mit der Beleuchtung des LCD von vorne (AGS-001). In 2005 erschien dann ein überarbeitetes SP-Modell (AGS-101), welches das bisherige Frontlight durch eine Hintergrundbeleuchtung ersetzte. Siehe auch "Let's Compare the Game Boy Advance SP AGS 001 to the AGS 101".

Um mit dem Umbau starten zu können ist zum Beispiel das folgende Set von AliExpress für ca. 40 EUR sehr zu empfehlen.

Das Set "V2 IPS Screen LCD Kits for GBA Backlight LCD Screen 10 Levels Brightness LCD V2 Screen For GBA Console And pre-cut Shell case" beinhaltet das folgende Zubehör:
  • 1 Gehäuse (vorbereitet für den Einsatz des neuen Display) verschiedene Farben möglich
  • 1 Satz Knöpfe und 1 Satz Gummipolster
  • 1 x Aufkleberetikett,
  • 1 Satz Schrauben und 1 Satz Schraubendreher
  • 1 Satz IPS LCD-Kit
  • 1 x Hard Bag
Hinweis: Man kann auch sein altes Gehäuse verwenden, allerdings muss dies von innen angepasst werden, damit das neue Display passt. Ich empfehle daher direkt ein neues Gehäuse auszuwählen, was bereits vorbereitet ist.


Game Boy Advance aufschrauben

Insgesamt sind 6 Triwings und 1 Kreuz zu lösen, anschließend muss man noch 2 Kreuz vom Motherboard lösen. Bei mir hat sich das folgende Set bewehrt:

 


Neues Gehäuse vorbereiten und Display verkleben

Im neuen Gehäuse die Klebefolie für das Display inkl. der Positions-Sticks befestigen und anschließend das Display einsetzen (vorher muss die Displayschutzfolie entfernet werden).


 

 




Flachbandkabel mit Motherboard und Display verbinden

Das Display wird mit einem Kabel geliefert und unterstützt sowohl 32-polige als auch 40-polige Motherboards.



Optional: Das neue Display verfügt über eine Helligkeitsanpassungsfunktion, die 10 Helligkeitsstufen unterstützt. Hierfür müssen 3 Leitungen verlötet werden, ich empfehle dies auf jeden Fall zu tun!

SEL => TP2

L => L (Motherboard)
R => R (Motherboard)
 

Die Regulierung erfolgt durch drücken von SELECT und drücken der L-Tasten (Helligkeit erhöhen) oder drücken der R-Taste (Helligkeit verringern).

Jetzt muss nur noch das Display an das Flachbandkabel angeschlossen werden und das neue Gehäuse kann wieder zusammengebaut werden. Fertig :-)



Samstag, 28. März 2020

Windows - Eingabeaufforderung während der Installation öffnen

Während der Installation von Windows, kann das Starten der Eingabeaufforderung (CMD) manchmal sehr hilfreich sein. 


Will man die Eingabeaufforderung während der Installation öffnen, geht dies mit der Tastenkombination Umschalt (SHIFT) + F10.

Hier können dann verschiedene Programme direkt geöffnet werden. Zum Beispiel:
  • control netconnections – Netzwerkverbindungen
  • ncpa.cpl – Netzwerk- und Freigabecenter => Adaptereinstellungen
Dies kann sehr hilfreich sein, wenn man die Netzwerkverbindung während der Installation trennen möchte. So kann hierdurch aktuell der Windows 10 Microsoft Konto Zwang umgangen werden.

Mittwoch, 25. März 2020

Android - Fennec Browser ohne Online-Tracker

Der Fennec Browser kann im F-Droid Store heruntergeladen werden und basiert auf der jeweils neuesten Firefox-Version. Der Browser verwendet dadurch die Gecko-Layout-Engine zum Rendern von Webseiten und alle aktuellen Webstandards sind implementiert.

 
Firefox blockt per default sehr viele Online-Tracker, verwendet aber selbst einen Tracker von Google (Google Analytics | Firebase) der im Browser integriert ist.

Beim Fennec Browser im F-Droid Store wurden Google- und andere bedenklichen Dinge (proprietäre Teile) entfernt.

Gegenüber der Funktionalität muss man keine Einschränkungen fürchten und in Verbindung mit dem Addon "No-Script", lässt sich jede Tracking Möglichkeit unterbinden.


Freitag, 20. März 2020

Nintendo Gameboy classic - Internen Lautsprecher austauschen

In dem folgenden Beitrag hatte ich beschrieben, wie man den Nintendo Gameboy Classic zerlegt, reinigt und eine Hintergrundbeleuchtung nachrüstet. Siehe auch https://sebastianhemel.blogspot.com/2020/02/nintendo-gameboy-classic-backlight.html . Ich konnte danach feststellen, dass die Plastik Membran des Lautsprechers bei mir eingerissen war, ich beschreibe hier kurz den Austausch.


Einen neuen internen Lautsprecher für den Nintendo Gameboy Classic gibt es ab ca. 5 - 8 EUR bei Amazon. Oft findet man auch bei Ebay 2 Stück für einen ähnlichen Preis.

  • Als erstens muss der Gameboy auseinander gebaut werden (siehe auch den o.g. Blogeintrag), es genügt hier aber nur die Rückseite zu lösen.
  • Im nächsten Schritt werden die beiden Kontakte mit dem Lötkolben erhitzt und können somit vom Lautsprecher entfernt werden.
  • Anschließend den neuen Lautsprecher einsetzen und die Kontakte mit etwas Lötzinn wieder befestigen.

  • Jetzt die gelösten Schrauben wieder befestigen und den neuen Klang genießen ;-)

Freitag, 13. März 2020

FRITZ!Box - Telefonate mitschneiden

Möchte man Telefonate aufzeichnen, geht dies anstatt mit speziellen Apps auch z.B. mit einer AVM FRITZ!Box mit Anrufbeantworter.


Mit einer FRITZ!Box und der Anrufbeantworter Funktion, ist es mit Hilfe einer Dreierkonferenz möglich Telefonate mitzuschneiden. Hierfür muss man dann nur die konfigurierte Rufnummer zu einer Konferenz hinzufügen.

Verfügt man noch über eine zusätzliche Rufnummer, lässt sich diese Funktion fest konfigurieren.

Folgende Einstellungen sind vorzunehmen:
  • Der Anrufbeantworter muss auf die ausgewählte Nummer reagieren "sofort annehmen".
  • Aufnahmelänger auf "Keine Zeitbegrenzung" setzen.
    • Die Aufnahmen landen dann im MP3 Format auf dem internen Speicher der FRITZ!Box.

Wichtig: Man muss natürlich seinen Gesprächspartner erst um Einverständnis bitten, ansonsten ist dies ein Verstoß gegen die DSGVO Art. 4 Nr.1, da personenbezogene Daten verarbeitet werden. Siehe auch Telekommunikationsgesetz (TKG) § 88 Fernmeldegeheimnis.

Sonntag, 1. März 2020

Swagger - Interface Definition Language (IDL) für REST-APIs

Mit Hilfe des Swagger-Editor unter http://editor.swagger.io oder einem Plug-in für die Entwicklungsumgebung (z. B. für IntelliJ) kann man sehr schnell einen ersten API-Ansatz mit Hilfe der vorhanden Schnittstellenbeschreibung erstellen.


Es kann auch eine bestehende API-Dokumentation per URL importiert werden und der online Editor von Swagger zeigt rechts direkt eine Vorschau der API-Definition in einem "menschenfreundlichen" Format.


Mittwoch, 19. Februar 2020

Raspberry Pi - Adafruit Mini PiTFT 135x240 Color TFT Add-on


Das Mini-PiTFT Display von Adafruit bietet ein 240x135 Pixel großes IPS-Farbdisplay und wird per SPI-Port angesteuert. Es hat zwei taktile Tasten auf GPIO-Pins und auf der Unterseite gibt es einen Qwiic/STEMMA QT-Anschluss für I2C-Sensoren.


Für das Display gibt es einen Kernel-Treiber und eine Python-Bibliothek, so kann man sich eine Konsolenausgabe einrichten oder man kann sich nach belieben Bilder, Text mit der Python-Imaging-Bibliothek anzeigen lassen.



Installation und Python-Setup

Die Installation an sich ist relativ einfach, man steckt das Display auf die Pins des Raspberry Pi und installiert die folgenden Module, damit es angesprochen werden kann.

Python Installation of RGB Display Library
  • sudo apt-get install python3-pip
  • sudo pip3 install adafruit-circuitpython-rgb-display
  • sudo pip3 install --upgrade --force-reinstall spidev
DejaVu TTF Font
  • sudo apt-get install ttf-dejavu
Pillow Library
  • sudo apt-get install python3-pil
NumPy Library
  • sudo apt-get install python3-numpy
Anschließemd kann das folgende Demo Script "rgb_display_minipitfttest.py" ausgeführt werden.
  • sudo python3 rgb_display_minipitfttest.py
Wichtig: SPI-Port muss aktiviert sein!

Mit Hilfe von  raspi-config non-interactively bekommt man den SPI-Status:
  • sudo raspi-config nonint get_spi 
  • returns 0 (enabled) or 1 (disabled)

Aktivieren von SPI mit:
  • sudo raspi-config nonint do_spi 0

import digitalio
import board

from adafruit_rgb_display.rgb import color565
import adafruit_rgb_display.st7789 as st7789

# Configuration for CS and DC pins for Raspberry Pi
cs_pin = digitalio.DigitalInOut(board.CE0)
dc_pin = digitalio.DigitalInOut(board.D25)
reset_pin = None
BAUDRATE = 64000000   # The pi can be very fast!
# Create the ST7789 display:
display = st7789.ST7789(board.SPI(), cs=cs_pin, dc=dc_pin, rst=reset_pin, baudrate=BAUDRATE,
                        width=135, height=240, x_offset=53, y_offset=40)

backlight = digitalio.DigitalInOut(board.D22)
backlight.switch_to_output()
backlight.value = True
buttonA = digitalio.DigitalInOut(board.D23)
buttonB = digitalio.DigitalInOut(board.D24)
buttonA.switch_to_input()
buttonB.switch_to_input()

# Main loop:
while True:
    if buttonA.value and buttonB.value:
        backlight.value = False              # turn off backlight
    else:
        backlight.value = True               # turn on backlight
    if buttonB.value and not buttonA.value:  # just button A pressed
        display.fill(color565(255, 0, 0))    # red
    if buttonA.value and not buttonB.value:  # just button B pressed
        display.fill(color565(0, 0, 255))    # blue
    if not buttonA.value and not buttonB.value:      # none pressed
        display.fill(color565(0, 255, 0))    # green


Quelle:

 

Pin Belegung des Displays

  • 5.0V - Connected to the display backlight
  • 3.3V - Connected to the display power and also the STEMMA QT / Qwiic connector
  • GND - Ground for everything
  • SDA & SCL - I2C data for the STEMMA QT / Qwiic connector. Not used by buttons or display
  • GPIO22 - Used to turn the backlight on and off. If you never want to turn the backlight off, cut the small jumper on the bottom of the PiTFT to free up GPIO22
  • GPIO23 & GPIO24 - Connected to the two front buttons. These pins have 10K pullups to 3.3V so when the button is pressed, you will read a LOW voltage on these pins
  • SCK, MOSI, CE0 & GPIO25 - These are the display control pins. Note that MISO is not connected even though it is a SPI pin because you cannot read back from the display.

Not used: GPIO4, GPIO17, GPIO18, GPIO27

If you are using the 240x135 1.14" (small rectangular) Mini PiTFT, you can attach other hardware to the Pi on those pins if you use a stacking header - it will go through the 2x12 connector on the Mini PiTFT.