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.