Checker

  • Bastelirrsinn: Abhaken-GUI-Maker, mit Mini-Lektion

    Tja, manchmal bastelt man doch nur um der Bastelei willen, gell? Ich wollte jedenfalls irgendwann mal zu irgendwelchen Ereignissen festhalten, welches zuerst 10 mal oder so vorkommt. Und zwar etwas hübscher als Tabelle. Auf Papier. Und nun wollte ich das Ganze am Rechner, ebenfalls in hübsch – heißt hier aber nur: Nicht nur Tabellekalkulation ;) Und vielleicht brauche ich das auch noch mal für andere Dinge. Folglich musste ein Abhaken-GUI-Generator her.

    Da das Projekt wohl für niemanden einen ernsthaften Nutzen haben dürfte, erspare ich mir mal, jeden einzelnen Code-Furz zu erklären. Stattdessen: Kurz was zum Projekt, dann eine Mini-Lektion zum Mischen von Positional- und Named-Parametern bei Shell-Skripten, dann der Code fürs Selbststudium.

    Abhaken-GUI-Maker

    Die eigentlichen GUIs mit den Listen sind AutoHotkey-Skripte, der Generator ist ein Shell-Skript. Warum dieser Mix? Es sind für mich persönlich einfach zwei völlig unterschiedliche Tools. AutoHotkey nutze ich für Hotkeys und Textbausteine sowie für Windows-Fenster-Angelgenheiten – und das sind die großen Stärken der Sprache.

    Bash hingegen nutze ich für so ziemlich alles andere, also auch zum Basteln von AutoHotkey-Skripten. Vermutlich hätte sich das alles auch mit AutoHotkey erledigen lassen, aber tendenziell schlechter – und ich hätte mich einarbeiten müssen. Egal, jedenfalls lautet ein Aufruf:

    checkermaker.sh -r 5 -i mein_hintergrundbild -o meine_gui BMW Atari Benz Kia VW Audi Ford Fiat Opel
    

    Und das erzeugt eine GUI mit 5 Reihen (r) Checkboxen, einem Hintergrundbild (i), dem Dateinamen „meine_gui“ (o) und Überschriften wie übergeben. Und eine Linie, um den „Zielbereich“ bei längeren Listen besser zu sehen.

    gui mit häkchen und auto-spalten.
    Von welcher Marke überqueren zuerst 5 Autos die Ampel? Oder sowas …

    Funktionen hat das Teil nicht – man kann nur Häkchen setzen. Falls Ihr das Ganze aber als Anregung für eigene GUI-Generatoren nutzen wollt, ließe sich das leicht erweitern. Das eigentlich Interessante: Der Mix aus benannten Argumenten/Optionen (-r -i -o) und positionalen Parametern.

    Parameter-Mix

    Wie das Skripten mit den benannten und positionalen Parametern funktioniert, habe ich bei Dev-Insider schon mal beschrieben. Hier geht es nur um den Mix.

    Das Problem: Positionale Parameter werden einfach der Reihenfolge nach angesprochen, mit $1, $2 und so weiter. Wenn Parameter aber über Optionen, also Schalter wie „-r“ oder „-o“, übergeben werden, werden sie meist manuell Variablen zugeordnet. So dass zum Beispiel eine angegebene Ausgabedatei nicht über „$1“, sondern über ein sprechendes „$outputfile“ angesprochen werden kann.

    Will man aber nun beide Varianten nutzen, sind die Optionen den positionalen Parametern natürlich im Weg. Und da Optionen nun mal naturgemäß optional sind, weiß man in der Regel nicht, wie viele denn nun gesetzt wurden.

    Zunächst mal der Code:

    while getopts "o:r:i:" option; do
        case $option in
            o)
            outfile="$OPTARG"
            ;;
            r)
            rows="$OPTARG"
            ;;
            i)
            image="$OPTARG"
            ;;
        esac
    done
    ## shift removes named parameters - leaves positional parameters
    shift "$((OPTIND-1))"
    

    Zunächst verarbeitet die while-Schleife die drei Optionen für Output-File, Rows und Image – das ist die Standardvorgehensweise. Der Kniff: Die shift-Anweisung verschiebt die übergebenen Parameter quasi nach links, um „OPTIND-1“ viele Stellen (OPTIND steht für Optionen-Index). Einfacher ausgedrückt: Es verwirft alle von getopts verarbeiteten Optionen aus der Parameterliste.

    Alles, was dann nach den Optionen kommt, wird wie üblich mit $1, $2 etc. angesprochen.

    Der Code

    Und hier noch der komplette Bash-Code, der AutoHoktey-Code erzeugt. Achtung: Das Ding funktioniert zwar so wie oben beschrieben, ist aber kein fertiges Produkt! Es gibt keine Fehlerausgabe, keine Hinweise auf zu lange Spaltennamen und der produzierte Code ist auch nicht elegant, sondern redundant. Aber das ist bei so einer popeligen GUI auch furchtbar egal ;)

    #!/bin/bash
    
    while getopts "o:r:i:" option; do
        case $option in
            o)
            outfile="$OPTARG"
            ;;
            r)
            rows="$OPTARG"
            ;;
            i)
            image="$OPTARG"
            ;;
        esac
    done
    ## shift removes named parameters - leaves positional parameters
    shift "$((OPTIND-1))"
    
    ##### Variables
    width=$(( 90 + $(( $# * 60 )) ))
    height=$(( 90 + $(( $rows * 60 )) ))
    line=$(( $height - 170 ))
    imageheight=$(( $height / 100 * 90 ))
    imagepos=$(( $height - $imageheight ))
    imageposx=$(( $width / 8 ))
    
    ##### Header
    echo -e '
    #NoEnv
    #SingleInstance Force
    SetWorkingDir %A_ScriptDir%
    
    ;## Optional icon
    ;# Menu Tray, Icon, %A_ScriptDir%\\foobar.ico
    
    ' > "$outfile".ahk
    
    ##### Checkboxes
    for x in $( seq 1 1 $# ); do
        for y in $( seq 1 1 $rows); do
            ##### w15 and h15 to avoid border if active - weird behaviour ...
            echo "Gui Add, CheckBox, x$(( 60 * $x )) y$(( 60 * $y )) w15 h15" >> $outfile.ahk
        done
    done
    
    ##### Textedits
    echo "Gui, Font, s12" >> $outfile.ahk
    for f in $@; do
        n=$(( $n + 1 ))
        echo "Gui Add, Text, x$(( 60 * $n )) y8 w55 h23 +0x200, $f" >> $outfile.ahk
    done
    
    ##### BlingBling
    echo "Gui Add, Text, x0 y$line w$width h2 0x10" >> $outfile.ahk
    echo "Gui Add, Picture, x$imageposx y$imagepos w-1 h$imageheight +0x4000000, %A_ScriptDir%\\$image" >> $outfile.ahk
    
    ##### Footer
    echo -e "
    Gui Show, w$width h$height, $outfile
    Return
    GuiEscape:
    GuiClose:
        ExitApp
    " >> $outfile.ahk
    

    Falls Euch irgendwas interessiert, etwa wie der Checkbox-Part funktioniert, fragt einfach. Und der Vollständigkeit halber, hier noch ein Auszug aus dem produzierten AutoHotkey-Code:

    #NoEnv
    #SingleInstance Force
    SetWorkingDir %A_ScriptDir%
    
    ;## Optional icon
    ;# Menu Tray, Icon, %A_ScriptDir%\foobar.ico
    
    
    Gui Add, CheckBox, x60 y60 w15 h15
    Gui Add, CheckBox, x60 y120 w15 h15
    Gui Add, CheckBox, x60 y180 w15 h15
    Gui Add, CheckBox, x60 y240 w15 h15
    Gui Add, CheckBox, x60 y300 w15 h15
    Gui Add, CheckBox, x120 y60 w15 h15
    Gui Add, CheckBox, x120 y120 w15 h15
    ...
    Gui, Font, s12
    Gui Add, Text, x60 y8 w55 h23 +0x200, BMW
    Gui Add, Text, x120 y8 w55 h23 +0x200, Atari
    Gui Add, Text, x180 y8 w55 h23 +0x200, Benz
    ...
    Gui Add, Text, x0 y220 w630 h2 0x10
    Gui Add, Picture, x78 y120 w-1 h270 +0x4000000, %A_ScriptDir%\picasso_skater.png
    
    Gui Show, w630 h390, AutoChecker
    Return
    GuiEscape:
    GuiClose:
        ExitApp
    

    Mehr zum Thema Bash – mehr zum Thema AutoHotkey.

  • Anleitung: Mit dem Macbook die WLAN-Qualität prüfen

    Wenn die WLAN-Qualität schwankt, ist es Zeit für einen leistungsstärkeren Router oder einen Repeater. Doch wo müsst Ihr das Teil platzieren, um einen idealen Empfang in Eurer Wohnung oder Eurem Haus zu gewährleisten? Die Mac-App NetSpot hilft Euch dabei, genau das herauszufinden, indem es per Heatmap anzeigt, wie gut der WLAN-Empfang in verschiedenen Bereichen Eures Domizils ist. Dazu müsst Ihr nur die Gratis-App auf Eurem Gerät installieren, eine grobe Karte zeichnen und in der Wohnung herumwandern. Wir zeigen Euch, wie es geht.Weiterlesen »

Schaltfläche "Zurück zum Anfang"