Archiv der Kategorie: IT

Entwicklung Canyoning Datenbank OpenCanyon.Org eingestellt

Während der Covid Zeit hatten einige Canyoning-Begeisterte begonnen ein neues mehrsprachiges Canyoning Portal zu entwickeln. Hintergrund dazu war, dass CWIKI (https://canyon.carto.net) quasi am Ende war und auch andere Portale am Handy nicht wirklich gut funktioniert hatten. Der Tech Stack sah grob wie folgt aus: Frontend JS/Vue/Vuetify/Nuxt und Backend PHP/Laravel/Redis/MariaDB. Die Seite (https://www.opencanyon.org) war jetzt seit über einem Jahr live aber es gab leider keinen nennenswerten Zulauf seitens Unterstützung für die Entwicklung mehr. Ich habe daher heute die Server mal temporär abgedreht.

Nächste Schritte in der Umsetzung wären u.a. „Komplett-rewrite“ in Nuxt3/Vue3 mit TS gewesen sowie weiterer Ausbau der Features (aktuell ca. 60% „Feature-complete“). Für mich war wichtig ein Setup zu finden, wo wir zu mindestens 4 Leute sind, die daran arbeiten und sich gegenseitig puschen. Sonnst kann man ein Projekt dieser Größenordnung nicht auf lange Sicht gut betreiben. Sollten sich wieder ein paar „Freiwillige“ finden um das Projekt fortzuführen oder neu aufzusetzen bin ich gerne dabei, einfach über das Kontakt Formular bei mir melden. Aktueller Sourcecode (GPL-3.0 lizenziert) des letzten „Produktions-Builds“ ist für Interessierte hier verfügbar. Ein guter Startpunkt wäre sich die 101s von Nuxt3/TS und Laravel/PHP reinzuziehen. Die verwendeten Daten zur Darstellung kamen neben manuellen Eingaben von https://canyon.carto.net (CC BY-NC-SA 2.0 AT) und https://www.descente-canyon.com (CC BY-NC-SA 4.0).

Launchpad als Kinderspielzeug

Wer hätte gedacht, dass 30 Minuten Scripting für den Kleinen (zweieinhalbjährigen) so einen Spaß machen. Verwendet wurden:

  • Ein bestehendes Launchpad Mini (https://novationmusic.com/de/launch/launchpad-mini)
  • Die dazu passende Python Library (https://github.com/FMMT666/launchpad.py)
  • Python für VSCode (https://marketplace.visualstudio.com/items?itemName=ms-python.python)

Die eigentliche Logik für „Drücken bis rot .. aufnehmen .. abspielen“ war dann als Erstversion schnell gestrickt, viele weitere Versionen mit Farben, blinkenden Buttons u.s.w. werden folgend denke ich 🙂

#!/usr/bin/env python
# based on "Quick button test" from https://github.com/FMMT666/launchpad.py/blob/master/examples/buttons_raw.py

import sys
import time
import winsound
from time import sleep
import sounddevice as sd

try:
    import launchpad_py as launchpad
except ImportError:
    try:
        import launchpad
    except ImportError:
        sys.exit("error loading launchpad.py")

def main():

    lp = launchpad.Launchpad()
    if lp.Open():
        print("Launchpad Mini ready ...")

    lp.Reset()  # turn all LEDs off

    print("\nQUIT: Push one single button ten times in a row.\n")

    lastButtonNr = -1
    lastButtonPressed = -1
    buttonNr = -1
    buttonPressed = -1
    tStart = time.time()
    buttonPressed = 0
    recordingStarted = 0
    data = {}
    while True:
        # read buttons
        buts = lp.ButtonStateRaw()

        # if still same button pressed for > 3sek
        if buttonPressed == 1 and (time.time() - tStart) > 2 and recordingStarted == 0:
            print('start recording')
            lp.LedCtrlRaw(buttonNr, 1, 0)
            data[buttonNr] = sd.rec(
                int(5 * 44100), samplerate=44100, channels=2)
            sd.wait()
            recordingStarted = 1

        # debug make loop slower
        sleep(0.1)

        # if button pressed do further processing
        if buts != []:
            buttonNr = buts[0]
            buttonPressed = buts[1]
            print('Debug: ButtonNr: {} is pressed: {}'.format(
                buttonNr, buttonPressed))

            # button pressed short
            if buttonPressed == 1 and (time.time() - tStart) > 0 and (time.time() - tStart) < 2:
                if buttonNr in data:
                    print('play recording')
                    sd.play(data[buttonNr], 44100)
                    sd.wait()
                else:
                    print('no recording found')

            # stop recording if recording started and same button is released
            if buttonNr == lastButtonNr and buttonPressed == 0 and recordingStarted == 1:
                print('stop recording')
                lp.LedCtrlRaw(buttonNr, 0, 1)
                recordingStarted = 0

            # if a new button is pressed restart timer
            if lastButtonNr != buttonNr or lastButtonPressed != buttonPressed:
                print('reset timer')
                tStart = time.time()

            # set needed variables
            lastButtonNr = buttonNr
            lastButtonPressed = buttonPressed

    print("bye ...")
    lp.Close()  # close the Launchpad

if __name__ == '__main__':
    main()

Zusammenführen von Fotos unterschiedlicher Kameras unter Android

Eins vorweg, dies ist kein Reise- sondern eher ein IT-Beitrag. Oftmals bin ich mit einer Gruppe von Personen unterwegs, Wandern, gemeinsame Aktivitäten etc. und natürlich macht jeder Fotos vom anderen welche danach ausgetauscht werden. Die Herausforderung dabei stellt sich aber dann die Fotos passend der Reihenfolge zu sortieren und viel wichtiger nur ein Foto pro Szene zu behalten bzw. den Mist zu löschen.

Nachdem ich mittlerweile meistens nur mehr mein Android Handy zur Verfügung habe gestaltet sich das dort etwas schwierig, dachte ich zu mindestens. Beim Kopieren der Fotos wird der Dateizeitstempel auf das Kopierdatum gesetzt und weiters ist die Uhr in den verschiedenen Kameras oft in den unterschiedlichsten und oft falschen Zeitzonen eingestellt. Nachfolgend die Anleitung wie sich das Thema ganz elegant und ohne großen Aufwand lösen laesst.

Im ersten Schritt sammle ich die Fotos aller Kameras in unterschiedlichen Ordnern und lese aus den EXIF Metadaten des Bildes den Zeitstempel aus. Der schnellste Weg das zu erreichen ist die App File Timestamp zu installieren und den Zeitstempel der Dateien zurück auf den Zeitstempel aus den EXIF Metadaten zu setzen und danach die Bilder in einem Dateinamanger z.B. Total Commander zu betrachten. Nun kommt der schwerste Teil, zu ermitteln um wieviele Stunden die Fotoszeistempel unterschiedlich sind und welche Kamera stimmt. Hier hilft es z.B. wenn ich weis, dass der Zeitstempel meiner Kamera richtig ist und wir alle zur ungefähr selben Zeit das selbe fotographiert haben. Dann weis ich in etwa, die Fotos von X muss ich um +3h manipulieren und die Fotos von Y um -12h und so weiter.

Nun geht es ans eingemachte. Theoretisch gibt es viele Apps die das Manipulieren von EXIF Metadaten anbieten. Keine davon bietet aber an, den Zeistempel eines ganzen Ordners auf plus X Stunden zu verschieben. Ich habe dann geschaut welche Tools es fuer diese Aufgabe sonnst noch gäbe und bin auf jhead gestoßen. Mit diesem Tool könnte ich bequem die EXIF Zeitstempel manipulieren, z.B. mit dem Befehl „jhead -ta+2:30 *“ im Ordner in dem sich die Fotos befinden wird der EXIF Zeitstempel der Fotos um zwei Stunden und 30 Minuten erhöht. Das Tool steht aber für Android als Binary nicht zur Verfügung, also gilt es den Sourcecode herunterzuladen und selbst zu compilieren. Ob das wohl so einfach möglich ist?

Im naechsten Schritt habe ich auf meiner CyanogenMod Android Variante in das Terminal gewechselt und nach dem entpacken des Sourcecodes mittels ZArchiver versucht mit den ueblichen Build Befehlen die Binary zu erstellen. Woops, leider war kein Compiler installiert. Eine Suche nach einem Compiler hat die App CCTools geliefert, installiert, Makefile oeffnen und Build klicken und wolla es wurde eine Binary erstellt. Was mich dabei schon verwundert, alle Voraussetzungen wie Toolchain etc. wurden im Hintergrund automatisch geschaffen und das ganze war richtig richtig einfach. War sicher nicht das letzte Mal, dass ich diesen Weg genommen habe. Damit ich jhead im Terminal wie gewohnt verwenden kann habe ich die Binary mit dem Total Commander nach /system/xbin kopiert und entsprechend die Aufführungsrechte gesetzt. Gegebenenfalls muss dazu der Root Modus in den Einstellungen aktiviert werden. Wenn jemand die jhead Android Binary direkt herunterladen moechte kann dies hier tun.

Ist die Binary dann dort und die Rechte richtig gesetzt kann ich im Terminal bequem in das jeweilige Verzeichniss mit den Bildern wechseln und mittels z.B. jhead -ta+2:30 * den Zeitstempel manipulieren. Im nächsten Schritt kopiere ich alle Bilder gemeinsam in einen Ordner und verwende wieder die App File Timestamp um den Dateizeitstempel aller Bilder nun richtig zu stellen. Wenn ich die Bilder nun nach Dateidatum sortiert betrachte sind sie in der richtigen Reihenfolge.

Zusätzlich bietet es sich nun auch an die Dateien umzubenennen um sie auch nach dem Dateinamen sortieren zu koennen. Dazu bietet sich die App Photos and Files Renamer an. Zuerst muss man in den Parametern die gewuenschten Einstellungen vornehmen, z.B. nicht überschreiben, Number 4stellig und davor und als Trenner einen Unterstricht, danach alle Dateien markieren und umbenennen.

Im weiteren Schritt kann man dann wie gewohnt die Fotos aussortieren und konvertieren.

Viel Spaß beim nachahmen, Feedback wie gewohnt unter Kontakt.

LG,
Max

Verwendete Apps:
File Timestamp
Total Commander
ZArchiver
CCTools
Photos and Files Renamer

SMS Gateway mit Raspberry Pi

Bisher hatte ich bereits mit Hilfe des Gammu Projekts und einem Huawei E220 Modem versucht, einen stabilen SMS Gateway zum Senden und Empfangen von Nachrichten zu schaffen. Das Problem dabei war allerdings, dass nach 2-3 Tagen das System nicht mehr funktioniert hat. Auch ein täglicher Neustart hat das Problem nicht verbessert. Vor kurzen habe ich einen Neuauflage des Projekts erwogen, es folgen nun die Umsetzungdetails.

Hardware:

  • RASPBERRY-PI/8GB-USD mit Gehäuse und Netzteil um 40€ bei Farnell
  • Ein gebrauchtes und entsperrtes Huawei E160 Modem um 13€ bei Ebay
  • Einen USB-Hub, konkret den D-Link DUB-H7 um 21€ bei Amazon

Bei der Auswahl des Modems sollte man aufpassen und z.B. diese Liste konsultieren, ist zwar eigentlich für die Installation von http://www.raspberry-asterisk.org gedacht aber bietet einen guten Anhaltspunkt. Auch bei der Auswahl des USB-Hubs sollte man beachten, dass Raspberry nicht alle USB-Hubs unterstützt, eine Liste dazu siehe z.B. hier. Gesamt sieht das Setup dann etwa so aus.
raspberry_smsgw

Installation:

  • Raspberry Pi kam bei mir schon mit einem vordefinierten Setup, sonnst einfach von hier das Paket auf die SD-Karte kopieren, eventuell wird dafür der Win32DiskImager oder ähnliches benötigt. Ich habe mich beim Betriebsystem für Raspbian, quasi dem Debian für Raspberry Pi entschieden
  • Das System auf den aktuellen Stand bringen und Tools zum Compilieren installieren
    apt-get update && apt-get upgrade -y
    apt-get install -y build-essential
  • SmsServerTools3 in neuester Version runterladen und compilieren/installieren
    wget http://smstools3.kekekasvi.com/packages/smstools3-3.1.15.tar.gz
    tar -zxvf smstools3-3.1.15.tar.gz -C /usr/local/src
    cd /usr/local/src/smstools3
    make
    make install
  • Hat alles geklappt könnte man die SmsServerTools (sms3) starten, wobei es fehlt noch die Konfiguration
    /etc/init.d/sms3 start bzw. /etc/init.d/sms3 stop

Konfiguration:

Die Konfiguration ist grundsätzlich unter /etc/smsd.conf zu finden. Hier meine aktuelle Konfiguration.

# sms3 config from /etc/smsd.conf

devices = huawei

#log an loglevel (use loglevel 8 for debug)
loglevel = 5
logfile = /var/log/smsd.log

#folder for messages
stats = /var/log/sms/stats
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent

delaytime = 4
errorsleeptime = 4
blocktime = 180
autosplit = 3
receive_before_send = yes
national_prefixes = 0

# Modem configuration
[huawei]
smsc = 43XXXXXXXXXXX
device = /dev/ttyUSB0
incoming = yes
#baudrate = 115200
baudrate = 19200
rtscts = no
hangup_incoming_call = yes

#use internal memory for storing messages 
init = ATE0+CPMS="ME"
#turn off periodic status messages
init2 = AT^CURC=0

Die oben angegebenen Ordner und Pfade für Logs etc. müssen natürlich entsprechend eingerichtet werden.

Zwecks Debugging hier einige Tipps:

  • Ist das Modem grundsätzlich vorhanden, siehe z.B. lsusb bzw. ls /dev/*USB*, Raspberry USB Themen siehe hier
  • Können auf dem Modem AT Befehle abgesetzt werdnen, zB mit minicom
  • Loglevel in smsd.conf auf 8 und tail -f /var/log/smsd.log und prüfen welche AT Befehle er nicht mag
  • Ev. zuerst in smsd.conf incoming = no stellen und nur mal versuchen SMS zu senden
  • Ev. Baudrate anpassen
  • Ev. mit dem init = ATE0+CPMS=“ME“ Befehl anpassen wo die SMS ausgelesen/gespeichert werden sollen
  • Mit den Timing Settings spielen
  • Doku und Community fragen
  • Pin von Simkarte is aus und Sim geht grundsätzlich
  • Es ist GSM-Empfang und genügend Power für das Modem vorhanden

Echoscript für Test einrichten:

Um die Funktion und Stabilität des SMS-Gateways zu testen habe ich ein einfaches Script erstellt welches eine SMS-Ping Funktionalität zur Verfügung stellt. Ich sende also ein SMS an die Nummer meines Modems und erwarte innerhalb von etwa 30 Sekunden eine Antwort inklusive der Ursprünglich gesendeten Nachricht. Der Inhalt des Scriptes schaut in etwa so aus.

<?php
date_default_timezone_set('Europe/Vienna');
$income_sms_dir="/var/spool/sms/incoming/";

if (is_dir($income_sms_dir))
{
    if ($dh = opendir($income_sms_dir))
    {
        while (($file = readdir($dh)) !== false)
        {
            if($file!="." && $file!="..")
            {    
                echo "filename: ".$file." date: ".date("d.m.Y H:i:s")."\n";
                $content=file_get_contents($income_sms_dir.$file);
                $split_line=explode("\n",$content);
                $from=preg_replace("/[^0-9]+/","",substr($split_line[0],6));
                $message="Echo:".preg_replace("/[^a-zA-Z0-9]+/", "_", $split_line[12]);
                $exec="/usr/local/bin/sendsms ".$from." \"".$message."\"";
                echo $exec."\n";
                exec($exec);
                unlink($income_sms_dir.$file);
            }
        }
        closedir($dh);
    }
}
?>

Um das ganze aufzurufen habe ich einen Workaround für crontab -e benützt um alle 5 Sekunden das Script zu starten.

* * * * * php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 5; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 10; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 15; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 20; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 25; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 30; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 35; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 40; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 45; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 50; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 55; php -f /root/echo.php >> /root/echolog.txt

Weiterführende Links:

  • Wer nicht nur einen SMS sondern einen VOIP/GSM Gateway betreiben möchte findet hier oder auch hier weitere Installationsquellen / Anleitungen
  • Wer gern eine WebGUI zum SMS Senden hätte könnte PlaySMS verwenden, eine Installationsanleitung ist hier zu finden

Tauschmarkt Software

Liebe Tauschmarkt-Organisatoren und andere Interessenten an der Tauschmarkt Software,

Im Sommer 2013 sind wir zusammengesessen und haben darüber gesprochen wie man einen Tauschmarkt wohl am besten abwickeln könnte. Nach kurzer Diskussion hat sich gezeigt, dass wir den Tauschmarkt besser nicht mit Excel oder Zetteln abwickeln sollten, sondern dafür eine einfache Software geeigneter wäre.

Ich habe kurzerhand geprüft, welche Frameworks gerade aktuell sind und bin auf das Yii Framework gestoßen. Mich hat die Funktionalität aus Datenmodellen Klassen und Views zu generieren beeindruckt. Durch dieses Konzept kann man mit wenigen Handgriffen eine Softwarelösung auf die Beine stellen und hat dabei eine saubere Struktur und ist sehr flexibel. Ein umfangreiche Pool an Erweiterungen runden das Framework ab.

Aus dem Framework und anderen Tools ist innerhalb von wenigen Stunden die Software entstanden. Aktuell werden darin folgende Prozesse unterstützt: Annahme, Verkauf, Abholung und Reklamation. Details zur Software selbst oder zu den einzelnen Prozessen siehe Demo unter http://tauschmarkt.demo.schlucht.at bzw. http://vorerfassung.demo.schlucht.at. Die Hilfe bzw. Prozessbeschreibungen befinden sich unter dem Link „Home“. Sollte jemand in der Demo die Adminfunktionen benützen wollen, Benutzer und Passwort wären „admin“.

Ihr möchtet die Software auch für euren Tauschmarkt verwenden? Bitte gerne, hier die Beschreibungen und Download-Links zu den Versionen:

In Version 0.3 wurden folgende Dinge geändert:
Download Tauschmarkt_Software_v0.3
– Bilderfassung zu Artikel am Handy unter Punkt Mobile
– Kundenstamm um eMail und PLZ erweitert
– Beim Verkauf wird beim klick auf das Bild ein JS-Popup angezeigt
– Verkäufe welche keinen Artikel finden werden auch in der Tabelle darunter rot hervorgehoben
– In Artikelliste zeige nur x wenn Bild vorhanden ist
– Annahmedruck und Abrechnungsdruck vom Pletz her optimiert
– Happyhour kann auf Annahmedruck und Abrechnungsdruck ausgeblendet werden (neuer Parameter happyhour_anzeigen)
– Freigabetext mit Unterschriftenfeld kann auf Abrechnung ausgeblendet werden (neuer Parameter abrechnung_disclaimer_show)
– Neuer Etikettentype „Standard_2018“ mit Andruck der KundenNr
– Unter dem Kunden kann man eine Voransicht der Abrechnung aufrufen
– Es können mehrere Kunden (aktuell 20) auf einmal abgerechnet werden
– Es gibt eine Auszahlungsliste um den Überblick der Auszahlungen zu behalten
– Artikel können als Admin gelöscht werden
– Diverse Erweiterungen in den Statistikansichten
– Diverse Bugfixes

In Version v0.2 wurden u.a. folgende Featuers hinzugefügt, Details siehe Demo’s oben:
Download Tauschmarkt_Software_v0.2
– Artikel haben Warengruppen
– Artikel haben Größe/Länge
– HappyHour Funktionalität
– Eigene Anwendung „Vorerfassung“ für Artikelerfassung im Internet vor dem Tauschmarkt

Version v0.1 wurde bei unserem letzten Tauschmarkt verwendet:
Download Tauschmarkt_Software_v0.1

Wenn ihr Infos über die Software weitergeben möchtet bitte den Permanenten Link http://tauschmarkt.schlucht.at verwenden.

LG,
Max