Ich wollte nur [...] und dann ist das Universum explodiert.

Projects
Books
Archive
About









    Permalink
  1. Shell-Zauberei | Pidgin Chat-Nachrichten zählen

    Code
    cd $HOME/.purple/logs/icq/987654321
    cat */** | grep "^<font" | sed -e 's#.*\ <b>\(.*\):</b>.*#\1#g' | grep -v "^<"|sort | uniq -c | sort -rn

    Hintergrund
    Heute ist der 3. Mai und morgen ist meine Abschlussprüfung zum Fachinformatiker. Natürlich sollte man da andere Sachen machen, als Shell Zeilen zu schreiben, aber mein Kopf fühlt sich von den letzten beiden Wochen, die ich während meines Lernurlaubs damit verbracht habe jegliches während meiner Ausbildung vermitteltes theoretisches Wissen in mich aufzusaugen, sowas von überfüllt an, dass ich während einer Lernpause kurz den Instant-Messenger meiner Wahl angeschmissen habe. Kurz darauf wollte ich wissen, wie viele Nachrichten ich wohl seit Neuinstallation schon erhalten und gesendet habe.

    Funktion
    Die Zeile bewirkt im Grunde nicht anderes als alle Files auszugeben, nach Zeilen zu suchen die auf das Schema passen die dem einer “Nachricht gesendet” Zeile ähneln und sortiert, zählt und sortiert diese wieder. Vorrausgesetzt die Logfiles sind durch Pidgin im HTML Format abgespeichert.

    About: “Ein Byte der Shellzauberei” – Kategorie: http://noqqe.de/archives/category/shell-zauberei


  2. Permalink
  3. RT | RequestTracker-Stats

    Oft angesprochen und trotzdem bisher nicht die Zeit gefunden drüber zu bloggen: RequestTracker-Stats. Vor kurzem habe ich mir das Balkendiagramm-Shellskript statistical gebastelt. Nachdem es so gut funktionierte hatte, hatte ich mir überlegt, was ich damit jetzt anfangen könnte. Ich brauchte einen großem Umfang an Datenmengen, den ich visualisieren konnte (abgesehen von zufällig erzeugten Daten). Am Besten noch etwas, dass Sinn macht :)

    At Work war “Ticket-Squashing” immer wieder ein gutes Stichwort in unserem Ticketsystem. Wir benutzen den RequestTracker von BestPractical und ich hatte mir überlegt ein kleines Skript zu basteln, welches die Anzahl der erledigten Tickets pro User aus der MySQL Datenbank ausliesst und dann im Key:Value Format an statistical übergibt. Das hat auch ganz gut funktioniert.

    Resolved ticket statistic for this month (April)
    ---------------------------------------------------
    Tracy		|##################### (22)
    Amelie		|##################### (22)
    Kiri		|############ (13)
    Tersina		|########## (11)
    Birgitta	|######### (10)
    Justine		|######### (10)
    Frank		|######## (9)
    Betteann	|####### (8)
    Cyndy		|# (2)
    Kaleena		|# (2)
    Kiah		|# (2)
    Roxy		| (1)
    Estella		| (1)
    Marj		| (1)

    Allerdings haben sich dann im Laufe des Tages immer mehr (ich nenne es mal statistische-) Anwendungsmöglichkeiten ergeben. Zum Beispiel die Anzahl der erstellten Tickets pro Benutzer:

    Most active creators for this month (April)
    ---------------------------------------------------
    Christel@company.com	|############ (13)
    Sydelle@company.com	|########### (12)
    Birgitta@company.com	|######### (10)
    Ainsley@company.com	|######## (9)
    Halette@company.com	|##### (6)
    Martguerita@comp	|##### (6)
    Tracy@company.com	|#### (5)
    care@company.com	|#### (5)
    fooo@company.com	|### (4)
    Christyna@company.com	|## (3)
    Ethel@company.com	|## (3)
    [...]

    Oder die Anzahl der Tickets pro Kategorie:

    Queues for this month (April)
    ---------------------------------------------------
    General		|##################### (22)
    Web		|##################### (22)
    Management	|#################### (21)
    WebContent	|################### (20)
    IT-Interal	|################ (17)
    Categ		|############### (16)
    Access		|############### (16)
    E-Mail-Service	|############## (15)
    SWAN		|########### (12)
    Domain-Service	|########## (11)
    Junk		|########## (11)
    DSL		|## (3)
    Other		|# (2)
    Hotspot-Service	|# (2)
    Buchhaltung	| (1)

    Um nur ein paar Beispiele zu nennen. Leider waren es zu diesem Zeitpunkt noch etliche separate Skripte, was mir eigentlich nicht gefiel. Darum habe ich es in ein modular aufgebautes Statistik Umgebungstool umgewandelt. Module sind (de-)aktivierbar und lassen sich leicht in das Rahmenprogramm einfügen. Letztendlich gibt es jetzt einen ganzen Satz von Modulen der unter Github zur Verfügung steht.

    git clone git://github.com/noqqe/RequestTracker-Stats.git

    Sollte außer uns noch jemand RequestTracker Stats verwenden und Interesse daran haben, ist er herzlich eingeladen die Stats Umgebung zu benutzen ggf. auch Module hinzuzufügen oder zu verbessern :) Eine (ich hoffe doch) ausreichende Anleitung zur Benutzung befindet sich im README des Github Repos.


  4. Permalink
  5. Shell-Zauberei | Namensliste in MySQL Datenbank einspeisen

    Code
    for x in $(mysql --batch -u root --password=passw0rd -e "USE rtdb; SELECT DISTINCT id FROM Users;" | grep -v ^id); do mysql -u root --password=passw0rd -e "USE rtdb; UPDATE Users SET Name=\"$(sed -n $(($RANDOM % $(cat Names | wc -l) +1 ))p Names)\" WHERE id=\"$x\" ;" ; done

    Hintergrund
    Wie auch schon beim letzten mal dreht es sich wieder um die Anonymisierung der RequestTracker Datenbank für die ich zur Zeit an einem Statistik Tool arbeite. Diesmal will ich aber nicht die EmailAdressen ändern, sondern die Namen der Benutzer. Da ich diese nicht so einfach generieren lassen kann, habe ich mir aus dem Interweb eine Liste mit Namen besorgt und mit diesen Namen die eingetragenen überschrieben. Jetzt kann ich endlich den Post über das Statistik Tool schreiben und mit Beispielen versehen :)

    Funktion
    Das Ganze läuft wie folgt ab: Für jede ID die ich mittels Datenbank-Verbindung in die For-Schleife einbette, setze ich einen UPDATE Befehl ab, der die Tabelle “Users” und das Feld “Name” aktualisiert. Der Aktualisierungsvorgang passiert aber generisch. Das heisst ich setze den Namen des Users auf einen zufällig ausgewählten neuen Namen aus der Datei “Names”. Das habe ich mit sed -n p FILE gelöst, was sicher auch schöner geht, aber für meine Zwecke hat es ausgereicht.

    About: “Ein Byte der Shellzauberei” – Kategorie: http://noqqe.de/archives/category/shell-zauberei


  6. Permalink
  7. Shell-Zauberei | Emailadressen in MySQL Datenbank anonymisieren

    Code
    for x in $(mysql -u root --password=passw0rd --batch -e "use rtdb; select id from Users" | grep -v ^id); do mysql -u root --password=passw0rd -e "use rtdb; UPDATE Users SET EmailAddress=\"$x@mail.com\" WHERE id=\"$x\"; "; done
    Hintergrund
    Ich arbeite seit kurzem an einem kleinen Statistik Tool für den RequestTracker von Bestpractical. Einem Ticket-System. Um Beispiele für dieses Tool generieren zu können, brauchte ich eine manipulierte Datenbank. Datenschutz. EmailAdressen mit anderem Inhalt überschreiben.

    Funktion
    Im Endeffekt ist es nur eine For-Schleife, die alle User ID’s aus der RequestTracker Datenbank (Table: Users) ausliesst und für jeden gefundenen Eintrag die EmailAdresse auf “ID@mail.com” setzt. So bleiben die Daten auswertbar, sind aber “anonym”.

    About: “Ein Byte der Shellzauberei” – Kategorie: http://noqqe.de/archives/category/shell-zauberei


  8. Permalink
  9. Shell-Zauberei | Eine Einleitung

    Ich möchte mit diesem Post eine kleine Reihe von Blogposts beginnen. Diese Eintragsreihe möchte ich in unbestimmter Länge und Frequenz in meinen Blog etablieren. Der Gedanke zu dieser Aktion, die ich “Ein Byte der Shell-Zauberei” nennen werde, geistert mir schon seit ca. zwei Monaten im Kopf herum.

    Mein Job als Administrator von Debian/Linux Systemen verlangt von mir oftmals Automatisierung und Shell-Scripting in mal größerem und auch kleinerem Umfang. Oft lassen sich derartige Aufgaben sehr leicht in einem Einzeiler/Oneliner auf dem Terminal lösen. Ich mag es, wenn Lösungen schnell und einfach durchzuführen sind, besonders mit Bash. Der Anspruch dieser Aufgaben variiert genauso wie deren Umfang. Die “Zauberei” im Titel der Aktion darf also wahlweise auch etwas ironisch verstanden werden.

    Als mir die Idee kam, dachte ich mir ehrlich gesagt, dass ich für eine solche Reihe wahrscheinlich nicht genügend Kanonenfutter hätte. Sprich, genügend einzeilige Bash Zauberei, die ich im Kontext dieser Reihe posten könnte. Ich beschloss den Gedanken noch nicht sofort zu verwerfen und stattdessen ein paar dieser Einzeiler zu speichern und zu sehen wie viele es werden.

    In den letzten Zwei Monaten waren das jetzt ca. 12 Stück die ich als “Blogwürdig” empfand. Ich denke, das reicht mir für die Kategorie.

    Aufbau

    Die Posts werden immer gleich aussehen und folgende Punkte enthalten:

    • Code
    • Hintergrund
    • Funktion
    • About “Shell-Zauberei”

    Informationen

    Kategorie URL: http://noqqe.de/archives/category/shell-zauberei


  10. Permalink
  11. Commandline Tools | PDFs zusammenführen

    Aufgrund meiner aktuell vorherrschenden Bewerbungsphase wollte ich ein paar PDF Dateien (hauptsächlich Zertifikate und Zeugnisse) in eine PDF Datei zusammenführen. Auf der Suche nach einem derartigen Programm liefen mir natürlich allerlei (dem anschein nach) hübsche Windows Tools für diese Aufgabe über den Weg. Wie schon oft, fand ich dann aber im Unixboard meine Antwort.

    Das Commandline Tool pdftk. Wunderbar für Debian und Ubuntu paketiert.

    $ sudo aptitude install pdftk

    Ich muss trotzdem zugeben, dass die Syntax mir etwas ungewöhnlich erschien, aber nicht unbezwingbar ist :) Nach ein paar Blicken in die Manpage, kam ich auch da an wo ich wollte.

    $ pdftk novell-cert.pdf ripe.pdf lpic-1.pdf cisco-ccna1.pdf cat output Zertifikate.pdf
      \___/ \________________________________________________/  \_/ \____________________/
        |                            |                           |             |
        |                            |                           |             \- Ausgabe an
        |                            |                           |                Zertifikate.pdf
        |                            |                           |
        |                            |                           \- Ausgabe der PDFs
        |                            |
        |                            \- Angabe aller zu kombinierenden PDFs
        |
        \- Programmaufruf

  12. Permalink
  13. statistical | It’s about internal functions.

    Als ich statistical auf GitHub hochgepushed habe, fing ich an mir Gedanken über die Leistungsfähigkeit des Scripts zu machen. Ich meine es verhielt sich in Anbetracht der Daten (in meinen Augen) wunderbar. Die Key Länge wird bis zu 4 Tab-Längen mit skaliert, genauso wie die Values, in Form der Bars. Aber wie verhält sich es mit größeren Datenmengen?

    Diesbezüglich wollte ich eine kleine For-Schleife benutzen um mehrere zufällige Werte zu generieren und in statistical zu pipen.

    time for x in $(seq 1 6000); do echo "$x:$RANDOM" ; done | statistical > /dev/null

    Das Ergebnis war mit 6000 Datensätzen und guten 7 Minuten relativ ernüchternd. Vor kurzem hat mich dann auch noch Vain via GitHub auf die Geschwindigkeit von statistical hingewiesen. In seinem Fork, hat er alle extern spawnenden Befehle gegen Bash interne Funktionen ausgetauscht. Siehe da:

    real 0m7.788s
    user 0m7.610s
    sys 0m0.250s

    Wahnsinn oder? Durch den Austausch von awk und grep durch interne Bash Funktionen wird das ganze ernsthaft 23x mal schneller. Vielen Dank an Vain an dieser Stelle!


  14. Permalink
  15. statistical | Statistiken visualisieren im Terminal

    Mir erschien es einen kurzen Moment lang für sinnvoll ein kleines Shell Tool zu haben, welches mir aus einer Liste von Key:Value Paaren eine Balkenstatistik baut und visualisiert. Wie in etwa $ statistical john:12 alice:5 linus:7 bob:1. Mir gefiel die Idee einfach alles mögliche in meinem Terminal ansehen zu können.

    Relativ schnell stieß ich aber an eine Grenze. Diese hieß “Windowsize”. Ich konnte nicht ohne bedenken eine Schleife die die Value Werte zählt bauen, die dementsprechend viele Zeichen anhängt. Denn bei Zahlen >10000 wird das ziemlich unlesbar :)

     while [ $COUNTER -lt $VALUE ]; do
            ((COUNTER++))
            echo -n "$OUTPUTCHAR"
            if [ $COUNTER -ge $VALUE ]; then
                echo
            fi
        done

    Ich brauchte ein Schema, welches alle Werte einließt und eine skalierbare Basis für alle Werte schafft. Ich entschied mich für eine simple Lösung.

    while [ ${FACTORCOUNT} -lt $(( ${#MAXVALUE} - 2 )) ]; do
    FACTOR="${FACTOR}0"
        ((FACTORCOUNT++))
    done
    

    Letztenendes kam dann folgendes Verhalten bei meinem Key:Value Statistik Script raus. Ich mags.

    # Beispiel
    $ statistical john:433 alice:49 linus:12 bob:231
    john    |###########################################
    alice   |####
    linus   |#
    bob     |#######################

    Damit lassen sich sogar teilweise sinnvolle Sachen produzieren. Zum Beispiel die Anzahl der Commits innerhalb eines Git-Repositories. Ich habe hier als Beispiel mal bash-it aufgeführt:

    for a in $(git shortlog -sn --all | cut -f2 | cut -f1 -d' '); do echo -n "$a:" ; git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f3 | sort -iu | wc -l; done  | statistical
    Mark          |##################
    Robert        |#########################################################################
    Florian       |##############
    Jesus         |######
    John          |##############
    Rich          |########
    Piotr         |###
    Travis        |####
    Fedyashev     |##
    zerobearing2  |####
    Andy          |###
    Daniel        |####
    Jeff          |##
    Karl          |##
    Robert        |#########################################################################
    Sirupsen      |##
    

    Sollte jemand Interesse daran hegen, das Skript auch mal auszuprobieren es befindet sich wie immer auf Github: http://github.com/noqqe/statistical


  16. Permalink
  17. ZRE | SQL Statistik Modul

    Ich möchte kurz ein Wort über das SQL Modul verlieren, welches die Statistiken des permanent laufenden Zombie Environments aufzeichnet. Wie mit Sicherheit schon überall auf dem Planeten Erde bekannt ist, passieren in ZRE Events. Diese Hand voll Events lösen (wie der Name vielleicht schon suggeriert) Geschehnisse in innerhalb des Environments aus, welche es gilt statistisch auszuwerten und darzustellen.

    Han Solo & Chewbacca

    Wie aber erfasse ich solche Informationen am Besten. Ich hatte ehrlich gesagt keine große Lust, in jedes der Events einzeln eine SQL-Verbindung aufzubauen und den gewünschten Query abzusetzen. Ganz zu schweigen von der Problemfallbehandlung (MySQL nicht installiert, Modul in Config nicht aktiviert, MySQL nicht erreichbar usw.) die ich in jedem Event hätte extra behandeln müssen.

    events/
    ├── attack.humans.event
    ├── attack.zombies.event
    ├── born.humans.event
    ├── born.zombies.event
    ├── building.humans.event
    ├── collecting.zombies.event
    ├── die.humans.event
    ├── die.zombies.event
    ├── infos.event
    ├── stats.humans.event
    ├── stats.zombies.event
    ├── support.humans.event
    ├── support.zombies.event
    └── weather.event

    Stattdessen entschied ich mich ein kleines Modul in Bash zu schreiben, welches eine Hand voll übergebener Daten annimmt und dann in die konfigurierte Datenbank schreibt. Hier am Beispiel des weather.event

    case $nature_msg in
    1) echo "A volcano explodes." ; zresql weather vulcano ;;
    2) echo "An earthquake hits the city." ; zresql weather earthquake ;;
    3) echo "A hurricane hits the city." ; zresql weather hurricane ;;
    esac

    Als erstes übergeben wird immer der gewünschte Modus, in den zresql den Datensatz einordnen soll, danach alle weiteren Informationen die der Struktur nach erforderlich sind.

    # Hurricane
    $ zresql weather hurricane
    # Humans gewinnen einen Kampf und vernichten 643 Zombies
    $ zresql kill human 643

    Das zresql Modul nimmt die Informationen dann entgegen und leitet es unter den gegebenen Umständen via sqlsend an die Datenbank weiter.

    [...]
    weather) sqlsend "INSERT INTO zre_weather VALUES (NULL, \"$2\", CURRENT_TIMESTAMP);" ;;
    kill) sqlsend "INSERT INTO zre_kills VALUES (NULL , \"$2\", \"$3\", CURRENT_TIMESTAMP);" ;;
    [...]

    sqlsend ist im Grunde nur eine weitere kleine Funktion die direkt über Kommandozeile den SQL Query abschickt.

    sqlsend() {
    mysql -e "use $sqldb; $1" --user=$sqluser --password=$sqlpw --host=$sqlhost
    }

    Mit dieser Lösung bin ich eigentlich relativ zufrieden. Über Verbesserungsvorschläge und Kritik freue ich mich natürlich wie immer. Das ganze Modul ist zusehen auf Github: https://github.com/noqqe/zombie-revolution-environment/blob/master/lib/sqlstats.library.bash


  18. Permalink
  19. Offtopic | 3 Jahre Blog

    Vor 3 Jahren hab ich hier den ersten Blog post verfasst.

    So lange ist das schon her.


« Newer -- Older »