Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

December 21 2011

15:30

Arduino | Ich bau mir einen Synthesizer

Vor ca. 2 Wochen habe ich auf der Suppe vom K4CG ein Video über einen auf Arduino basierten Synthesizer. Die “Firmware” die darauf läuft nennt sich “Auduino”.

Auf deren Projektseite habe ich mich dann etwas schlau gelesen und wie auch schon bei dem Megabitmeter über tinkersoup.de meine Teile bestellt. Auf der Projektseite ist die Konstruktion des ganzen finde ich zwar nicht sonderlich gut beschrieben, aber man kommt mit ein bisschen Googeln und Reverse Engineering schon weiter.

Habe dabei aber einen Arduino Nano benutzt, weil mir die Anschlüsse bzw “Architektur” besser gefällt und ich nicht erst ein Breakout Board von Seriell auf USB nachkaufen musste. Entgegen aller Erwartungen musste ich die Firmware dafür nichtmal modifizieren, da auch bei diesem Board ein ATMega328 verbaut ist.

Ich habe mir wegen der einfacheren Anbringung am Nano so eine Art Halterung/Breadboard mitbestellt, in dem ich die Adern mit Schrauben einfacher verbauen konnte.

Die Potenziometer (wieder was, das ich gelernt habe) sind in Reihe an den Ground und den 5V Pin geschlossen. Der jeweils mittlere Pin der Drehschalter kommt an die Analog Pins 0 bis 4.

Danach kam der (für mich) kniffligere Teil. Der Audio Jack (bzw. Klinke Buchse) hat von Haus aus 5 Pins. Auf der Projekte Seite von Auduino nur Input und Ground. Nach bisschen schlaulesen in Wikis und Foren scheint es, als würden die verschiedenen Revisionen von Klinke andere Features mit sich bringen. für den Mini Synthesizer hätte vollkommen Klinke Mono ausgereicht. Diverse Zusatzfunktionskanäle sind da eigentlich überflüssig aber im Audio Jack bei TinkerSoup integriert.

Nach etwas Trial and Error Verfahren den weg für Doofe gewählt. Ich hab ehrlichgesagt einfach ein altes Klinke Stecker auf Buchse Kabel aufgeschnitten und mir die Belegung auf der Steckerseite angesehen.

Bei 3poligen Klinken Steckern sind die vorderen beiden Kontakte fürs Signal (Links, Rechts) und hinten für Ground. Habe dann die beiden Signaladern auf der Buchsenseite verdrillt und wie vorgesehen in den Digitalen Pin 3 geklemmt. Ground natürlich an seine Stelle.

Im Endeffekt wars dann schon fertig. Firmware mit dem Arduino IDE auf den Chip geladen und hat auch schon funktioniert. Aber weil ich dann ständig die Potenziometer durcheinander gebracht habe, hab ich noch eine alte Plastikbox aus dem Baumarkt meiner Wahl benutzt, die entsprechenden Löcher gebohrt dort das ganze eingebaut.

Etwas smoother ;) Noch ein paar kleine Kostproben von einem wirklich unbegabten Synthesizer-Bediener. Beim hören etwas aufpassen, ab und zu ist mir da ein Ton entglitten.

Auduino Sample Mp4
Auduino Sample WAV 16 bit 22 Kkhz

October 22 2011

12:05

Taskwarrior | The better-task-shell

Eigentlich wollte ich das Projekt task-shell-ng nennen. Aber so gut ist es dann doch nicht geworden. Stattdessen hat es sich aber den Prefix better verdient ;)

Als ich vor ca. einem Monat Taskwarrior für mich entdeckt habe, war eigentlich alles gut. Ich hab mich über den integrierten interactive Mode wirklich gefreut. Anfangs. Mit der Zeit habe ich aber festgestellt, dass mich dieses “Ding” fast in den Wahnsinn treibt. Mir persönlich fehlen einfach elementare Features wie einfaches Cursor bewegen nach vorne und zurück. Überhaupt eine History zu haben wäre schon ein enormer Vorteil.

Ich hab mir dann kurzer Hand selber eine Taskwarrior Shell Variante gebaut, die im großen und ganzen auf einer Bash basiert.

Features:

  • History vorwärts und rückwärts via Pfeiltasten
  • Cursorbewegung vorwärts und rückwerts in der aktuellen Zeile
  • Alle Kommandos nativ benutzbar ( $ add pri:H pro:Living Miete zahlen )
  • ID’s direkt nutzbar ( $ 34 edit oder $ 12 pri:H )
  • separate Logging Funktion in $HOME/.better-task-shell_history
  • OS Befehle weiterhin nutzbar! ( $ vim /home/user/foobar.txt )
  • Automatische Erkennung von doppelten Aliases
  • Automatische Alias Generierung fuer os-binaries ( $ ls  = task ls  ; os-ls = /bin/ls )
  • Auto-Komplettierung aller Taskwarrior Befehle und definierte Aliase

Known Bugs:

  • Neu angelegt tasks  können derzeit noch nicht via ID aufgerufen werden.
    $ add Uberweisung einwerfen
    Created Task 45
    $ 45 pri:H
    bash: 45: Kommando nicht gefunden
    Für beim Start bestehende Einträge funktioniert dies allerdings problemlos.
  • Mode -v ist bis jetzt noch nicht benutzbar aber bereits implementiert.

Das ganze gibts jetzt unter http://github.com/noqqe/better-task-shell

Usage:

git clone git@github.com:noqqe/better-task-shell.git
$ cd better-task-shell
$ ./better-task-shell

October 15 2011

14:02

Git and the Unix philosophy

Mein Feedreader hat heute einen Post von Julius ausgespuckt, den ich so gut fand, dass ich ihn hier rezitieren möchte.

Git follows Linux’s philosophy of refusing to protect you from yourself. Much like Linux, Git will sit back and watch you fuck your shit right up, and then laugh at you as you try to get your world back to a state where up is up and down is down. As far as source control goes, not a lot of people are used to this kind of free love.

Ich rezitierte also Julius Zitat. Blogpost-Inception?

October 04 2011

18:50

DeadDrop | Sharing mit Alice and Bob in Baiersdorf

Als ich durch den Park in Baiersdorf lief und diese alte Mauer einer (vermutlich) verlassenen Werkstatt sah, konnte ich dann doch nicht anders.

Wie es begann:

Vorbereitung:

Abschluss:

Ende:

http://www.deaddrops.com/db/?page=view&id=804

October 01 2011

11:12

Flattr | Man kann seine Meinung auch mal ändern.

Als dieses Micro-Payment System Flattr vor mehr als einem Jahr raus kam habe ich hier im Blog über Sinn und Unsinn des Dienstes sinniert. Ich konnte mich damals nicht wirklich entscheiden, ob mir das System gefällt oder nicht. In der Tat ist es eigentlich eher so, dass mir das Projekt Kulturwertmark vom CCC viel eher zusagt.

Im Moment ist es abe so, dass es keinen anderen verbreiteten Weg gibt Content bzw. Software von Privat-Menschen zu belohnen, weil er/sie mir geholfen hat. Deshalb (und auch weil mich die Oberfläche interessiert hat) habe ich mich dort angemeldet und verteile seit 2 Monaten etwas Geld hier und da. Vorwiegend an Podcasts, Taskwarrior und Blogs von Leuten die ich kenne. Ich habe initial 8 Euro überwiesen mit denen ich jetzt erstmal 4 Monate rumflattern werde. Das das nicht die Welt ist, ist mir klar.

Und da ich jetzt sowieso schon einen Account dort habe, habe ich auch meinen Flattr-Button im Blog (links) eingebunden. Es wird erstmal keinen individuell Button für einzelne Posts geben und es braucht sich auch niemand verpflichtet fühlen da drauf zu drücken.

September 25 2011

11:58

Taskwarrior | Migration von MyTinyTodo

Im Programm der Ubucon habe ich einen Vortrag von Dirk über Taskwarrior gefunden. Aus Gründen hat mich das Tool interessiert. Ich habe zwar bereits eine Todo-Verwaltung (nämlich MyTinytodo) aber trotzdem.

Nach zwei Tagen herumspielen und einem wirklich hervorragendem How-To hat mir Taskwarrior allerdings so gefallen, dass ich mich entschlossen habe MyTinyTodo aufzugeben und zu Taskwarrior zu wechseln. Da ich meine TodoListe aber auch gerne als eine Art “Log” verwende musste ich die Aufgaben erst aus MyTinyTodo migrieren.

Realisiert habe ich das über ein kleines Bash-Script, welches die Daten aus der MyTinyTodo MySQL Datenbank ausliesst und daraus automatisch Taskwarrior Statements formuliert. Allerdings: Ich habe absichtlich nur abgeschlossene Tasks über die “LOG”-Funktion von Taskwarrior einfuegt.

Aus dem Datenbank Eintrag:

mysql> select d_completed,  mtt_lists.name as liste, title from mtt_todolist, mtt_lists where mtt_lists.id = mtt_todolist.list_id order by d_completed desc limit 1;
+-------------+-------+--------------+
| d_completed | liste | title        |
+-------------+-------+--------------+
|  1307714692 | Home  | Miete zahlen |
+-------------+-------+--------------+
1 row in set (0.00 sec)

formuliert das Skript beispielsweise folgendes Kommando für Taskwarrior:

task log due:20110610 pro:IMPORT-Home Miete zahlen

Das passiert eben für jede Eintrag in der Todo-Datenbank, damit ich dort nachschlagen kann wann was passiert ist.

September 21 2011

19:16

DeadDrop | Erlangen – Schwabachanlage

Ich war dann schliesslich doch noch bei einem funktionierenden DeadDrop in Erlangen. Dem in der Schwabachanlage. Quasi also mein erster “Check-In” an einem funktionierendem DeadDrop.

Ich muss sagen der Inhalt war wenig bis gar nicht interessant. Allerdings muss das Bild, wie ich da mit Fahrrad, Laptop auf dem Lenker und Kabel in eine tote Mauer stehe ziemlich skurril ausgesehen haben.

“Gibts da Strom umsonst oder was ist da los?”

“Junger Mann, das is ja unerhört. Mit dem Laptop am Lenker Fahrrad fahren! Das ist eine Gefährdung für den Verkehr!”

“Ach, was wird das denn? Muss ich die Politzei verständigen?”

… um nur ein paar Zitate aufzuzählen. Zur Beruhigung aller: Ich bin natürlich nicht mit dem Fahrrad gefahren während ich den Laptop am Lenker hatte. Das (und den eigentlichen Grund meiner Anwesenheit) habe ich natürlich auch brav jedem erzählt der mich in den insgesamt nur 20 Minuten angesprochen hat. Insgesamt war das sogar witziger als der Deaddrop selbst. Werde das auf jedenfall wiederholen.

August 25 2011

17:00

DeadDrop | Erlangen Kirchplatz

Komme gerade vom ersten Versuch zurück, mich mal an einen DeadDrop zu stöpseln. Leider erfolglos, weil broken. Der genaue Link zum (kaputten) DeadDrop: http://deaddrops.com/db/?page=view&id=395

Bei aller verwunderung gibt es in der Datenbank keinerlei Funktion einen Toten Toten Drop zu melden. Wie es der Zufall so will gibt es aber genau seit heute(!) einen neuen DeadDrop in Erlangen: http://deaddrops.com/db/?page=view&id=682

August 23 2011

16:39

PostgreSQL | 1000 und 1 Query

Zur Zeit spiele und bastle ich nebenher mit PostgreSQL rum. Überlege ob ich mal eine alternative DB für das Zombie-Revolution-Environment an den Start bringe…

Für meinen Use-Case scheint das allerdings nur begrenzt von Nutzen zu sein. Ich mache vielleicht etwas falsch, aber wenn ich 1000 Queries in MySQL kippe, dauert nur einen Bruchteil so lange wie in postgreSQL. Um das zu veranschaulichen:

$ time for x in $(seq 1 1000) ; do mysql -u root -ppw -e "insert into foobar.foo values ($x, now());" ; done
real 0m7.349s
user 0m0.060s
sys 0m0.380s

$ time for x in $(seq 1 1000) ; do psql --quiet -d foobar -c "insert into foobar values ($x, now());" ; done
real 1m28.363s
user 0m37.450s
sys 0m13.020s

Kann mir jemand sagen woran das liegt? Ich kann mir nur schwer vorstellen das PostgreSQL so hinterher hinkt.

July 24 2011

16:56

Abschlussprüfung | Zentrales Versionskontrollsystem mit git und etckeeper

Nachdem ich letzten Donnerstag erfolgreich meine Ausbildung zum Fachinformatiker abgeschlossen habe, kann ich die dazugehörige Dokumentation / Präsentation hier veröffentlichen.

Dokumentation

Präsentation

Zu danken habe ich dabei hauptsächlich all den wunderbaren OpenSource Tools, die mir zur Erstellung und Umsetzung gedient haben. Um einige zu nennen:

  • LaTeX bzw. TeX-Live (Dokumentation)
  • HTML & Slidy (Präsentation)
  • git (Projektinhalt)
  • etckeeper von Joey Hess (Projektinhalt)
  • gitolite (Projektinhalt)
  • und natürlich allen Debian Developern, die die genannte Software paketiert haben :)

May 22 2011

18:38

Beats | Eine in Ruby geschriebene Drummachine

Neulich habe ich voller Begeisterung das Drummachine Projekt Beats entdeckt. Beats stellt so in etwa die Musicbox für Nerds dar. In einem Verzeichnis mit einem Set an *.wav Dateien (wohl der Standard) legt man eine Art Konfigurationsdatei, welche durch Beats interpretiert wird. In einer gewissen Syntax beschreibt man dieses Lied und dessen Abfolge.

Das Traurige an der Sache ist eigentlich lediglich, dass ich mir bewusst geworden bin, wie wenig Kreativität/Können ich im musikalischen Bereich vorzuweisen habe. Teilweise sind beim Herumexperimentieren zwar Interessante Ergebnisse entstanden, aber nichts wofür ich mich nicht schämen müsste ;)

$ beats song1.txt song.wav
$ open song.wav

Ich hab dann allerdings kurzer Hand begonnen, den Vorgang zu automatisieren. Erst wollte ich es outsourcen, aber dann habe ich es doch automatisiert. Da die ganze “Ich baue mir ein neues Lied”-Sache nur auf einem einzigen File beruht, dachte ich mir dass sich das mit Sicherheit auch automatisch generieren lässt.

Das Skript das dabei herauskam, taufte ich randombeats. Wie alles was ich in letzter Zeit tue habe ich es natürlich auf github veröffentlicht.

https://github.com/noqqe/randombeats

Benutzung:

Ins jeweilige Verzeichnis mit den Roh-Daten kopieren/wechseln und Skript ausführen.

$ git clone http://github.com/noqqe/randombeats
$ cp randombeats/randombeats.bash /path/to/music
$ cd /path/to/music
$ ./randombeats.bash > randomsong.txt
$ beats randomsong.txt
$ open randomsong.wav

Raus kommen allerlei sehr Interessante und manchmal auch schöne Rhythmen. Aber manchmal auch akkute Ohrenschmerzen verursachen. Ein paar davon sammle ich mittlerweile in einem separaten Branch im Git-Repo. Diesen kann ich aber nicht uploaden, weil die größe meines Github Accounts auf 300MB beschränkt ist. Aber vielleicht finde ich anderweitig Möglichkeiten die Ergebnisse zu publizieren.

Mittlerweile habe ich folgenden Befehl in einer Schleife laufen.

./randombeats.bash > rnd.txt && beats rnd.txt && open rnd.wav

An Feedback, Kritik oder Anmerkungen zu Verbesserungen an den Eckdaten des Skripts bin ich wie immer sehr interessiert :)

May 03 2011

10:04

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

April 29 2011

09:55

RT | RequestTracker-Stats

Ich habe es bereits öfters angesprochen und trotzdem noch nicht die Zeit gefunden einen kleinen Blogpost darüber zu verfassen. 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.

08:30

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.

April 23 2011

14:57

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. Die Posts werden immer gleich aussehen und folgende Punkte enthalten:

  • Shell-Code
  • Hintergrund
  • Funktion

April 16 2011

14:48

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!

April 14 2011

16:55

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.

      # Function for doing the factor increase
    factorincrease () {
        if [ $1 -gt ${FACTOR:-0} ]; then
            FACTOR=$1
        fi
    }

  # Scaling for values. You can use values up to
    # 1.000.000 without your terminal gets broken
    if [ $VALUE -gt 1000000 ]; then
        factorincrease 100000
    elif [ $VALUE -gt 100000 ]; then
        factorincrease 10000
    elif [ $VALUE -gt 10000 ]; then
        factorincrease 1000
    elif [ $VALUE -gt 1000 ]; then
        factorincrease 100
    elif [ $VALUE -gt 100 ]; then
        factorincrease 10
    else
        factorincrease 1
    fi

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

March 21 2011

16:07

Persönlicher Eindruck | Chemnitzer Linux Tage 2011

Nachdem mich die Vorträge letztes Jahr so beeindruckt haben, hab ich mich auch dieses Jahr wieder entschieden die Linux Tage in Chemnitz zu besuchen. Durch einen Ausfall im Debian Team, hatte mir mein Kollege angeboten anstelle des ausgefallenen Mitglieds bei Debian mitzufahren. Was sich im Endeffekt als sehr nice herausstellte.

 

Freitag

Freitag war relativ entspannt. Ankunft und Aufbau des Debian Standes, mexikanisches Essen und danach Treffen mit Ben und Bier auf der Opening Party in der Mensa. Die Turnmatten in der Turnhalle waren auch kuschlig :)

Samstag

  • Frühstück @ Catering-Tage – Sehr leckere Sachen.
  • 1. Vortrag: Storage – Aber richtig von Martin Gerhard Loschwitz. Fand ich persönlich interessant, gerade der iSCSI-DRBD-Ansatz um FibreChannel zu ersetzen gefiel mir sehr gut.
  • 2. Vortrag: Provokante Thesen zur IT-Administration von Peer Heinlein Ja, Herr Heinlein. Der Autor des Buchs, welches mich durch die LPIC-1 Prüfung geführt hat sinnierte auf eher komödiantische Art über die typischen Eigenschaften der IT-Dienstleistungsbranche. Hat allerdings Spaß gemacht zuzuhören.
  • Danach Pause. Erstmal durch die Stände gestöbert, die mittlerweile so gut wie vollzählig anwesend waren. Währenddessen ausgeknobelt, ob der nächste Vortrag Icinga oder Configs mit Git verwalten wird.
  • 3. Vortrag: Konfigurationsdateien mit Git verwalten von Julius Plenz. Mit bash-it benutze ich ja bereits eine Lösung die für mich zur Verwaltung Teile meines /home gut funktioniert. Aber es schadet ja nie, sich andere Taktiken anzusehen und daraus zu lernen. Genau das habe ich auch erreicht. Julius hatte ein sinnvolles zwei Branches Modell, mit denen er lokale und globale Änderungen seiner Konfigurationsdateien verwaltet. Disziplin und etwas Aufwand sind dafür allerdings nötig. (http://chemnitzer.linux-tage.de/2011/vortraege/folien/782-config-management.pdf)
  • Hungerbedingt verpasste ich den Vortrag über von C.  Klostermann über Professionelle IT Dokumentation – Anforderungen aus rechtlicher Sicht Mittagsbuffet schaffte aber Abhilfe.
  • 4. Vortrag: Von H. Uhlig Dem Hack keine Chance: LAMP sicher betreiben: erwieß sich grade als Administrator von Shared Hosting Systemen als hilfreich und informativ.
  • 5. Vortrag: A. Scherbaum: Datenbanken von MySQL zu PostgreSQL portieren: Hierzu muss ich sagen, dass ich mir den Ansatz etwas Administrativer vorgestellt habe. Die Feinheiten der Möglichkeiten fernab vom SQL Standart von MySQL und PostgreSQL wurden aber schön ausgeführt und beschrieben. Persönlich aber muss ich gestehen, nicht sagen zu können ob PostgreSQL (abgesehen von dieser Oracle Sache) besser ist als MySQL. Es scheint eben anders zu sein.
  • 6. Vortrag: P. Heinlein: SPF, DKIM und Greylisting – Was bringen Absender-Authentifizierung und der neue Spam-Schutz? : Nochmal Herr Heinlein, diesmal über SPF und DKIM als Spam-Schutz sinnierend. Aufklärend auf jedenfall, da ich die beiden Funktionen garnicht kannte und gegen Ende noch 2-12 Worte über Greylisting. Alles in Allem Runde Sache
  • 7. Vortrag: T. Winde: Mit dem Midnight Commander Freiheit leben: Hauptsächlich hat mich Jan’s Vorliebe für MC in diesen Vortrag getrieben. Es war schön zu sehen, nicht nur Vorträgen von Business-Guys auf den Linux Tagen zu sehen. Ein fast schon “goldiger” Vortrag eines älteren Taxi-Unternehmers, der mir trotz geringem Lernerfolg irgendwie gefiel.
  • Social Event: Wunderbares Buffet mit reichlich zu trinken und zu Essen. Hat im Endeffekt genau dem gedient, für was es gut war. Bier, Essen & Social’n.

 

Sonntag

  • 8. Vortrag: Sonntag begann nach einer  weiteren Turnhallen-Nacht mit einem Vortrag von S. Kemter: Höher, Schneller, Weiter – openSUSE 11.4 : Der auch als Buergermeister von Karl-Tux-Stadt.de bekannte Redner, gab sich größte Mühe im Einsteigerforum das neue openSUSE, sowie die LTS, stable und unstable Linien vorzustellen.
  • 9. Vortrag: Von Andreas Tille Ein Jahr OpenStreetMap: Im Einsteigerforum ging es dann für mich auch gleich weiter mit einem (für mich komplett unbekannten) Thema. OpenStreetMap und seine Anwendung. Andreas, der selbst erst ca. 1 Jahr mit OpenStreetMap arbeitet, klärte die Zuhörer über all das auf, was er gerne von Anfang an über das Projekt gewusst hätte. War sehr schön gemacht und hat mir super gefallen. Dem ansonsten überfüllten Raum scheinbar auch.
  • 10. Vortrag: H. Voß Erstellung großer und größter Dokumente mit dem Satzsystem TeX: Ich muss sagen das meine Definition von “große Dokumente” ca. 1000 Seiten vor dem begonnen hatte die der Redner als große Dokumente definierte. Wenn so ein LaTeX Dokument mal länger läuft, als ein Kaffee hält, ist es eben viel :)
  • Mittags ließ ich mich dann von Julius (vom Git-Vortrag) nochmal einen Schritt in Zsh einführen, da sich am Social-Event rausgestellt hat, das er der Autor von Zsh beim OpenPress Verlag ist. Gab ehrlichgesagt vieles, bei dem ich nicht schlecht geschaut hab. … Wenn ich noch Zeit fände mir das alles einzuprägen… :)
  • 11. Vortrag: J. Kubieziel: Tor Bridges — Eine Brücke für freie Information: Danach ließ ich mich dann über die Risiken und Nebenwirkungen von Tor-Bridges aufklären. War sehr aufschlussreich. Langfristiges Interesse == unvermeidbar ;)
  • Stand abbauen – Ab nach Hause ;)

Im großen und ganzen war es wirklich sehr schön und interessant, viele Leute und Projekte näher kennenzulernen. Die Zahl der Projekte die mich interessieren ist wiedermal gewachsen, die Zahl für die ich die Energie/Zeit habe mich auseinanderzusetzen bleibt aber leider wie immer gleich.

Und gerade als ich mich daran gewöhnt habe, dass am Rednerpult intelligente Leute stehen die Ahnung haben von dem was Sie tun, muss ich wieder in die Schule. Bäm Montag.

March 14 2011

19:37

ZRE | Live Game Mitschnitt via jQuery und PHP

Eine der Aufgaben, von denen ich wirklich wenig bis keine Ahnung habe, war die Umsetzung der Live Gamebox für ZRE. Die Anforderung hat mich ehrlich gesagt mal in die Nähe des Web2.0 Wahns getrieben, von dem ich mich sonst fernzuhalten versuche. Zumindest von Entwicklerseiten her.

ZRE als Daemon (ja, der Teil kommt auch noch) hat die Eigenschaft im zufällig wiederkehrendem Rhythmus Output in ein Textfile zu produzieren. Dieses Textfile (game.txt) hat einen Platz im DocumentRoot des Webauftritts zombies.n0q.org (Ist das eigentilch das erste Mal, dass ich die URL erwähne? Ich glaube ja.). Diese möchte ich parsen und über asynchrone Aktualisierung in den Browser des Heimanwenders bringen.

Zuerst musste ich also den PHP Parser Teil schreiben, der mir die letzten 20 Zeilen, oder falls weniger eben diese aus meiner game.txt ausließt.

$input = file($zreoutput);
$resultArray = "";
$index = 20;
if (count($input) < 20)
{
   $index = count($input);
}
for($i=count($input)-$index; $i
{
   $resultArray .= $input[$i]."<br/>";
}
return $resultArray;

Als nächstes war es dann noch nötig diesen zurecht gebogenen Output dann noch selbst aktualisierend in meine Index Datei zu portieren. Dazu ist dann eine JavaScript nötig um die Funktion zu definieren.

setInterval(
    function() {
      $('#gamebox').load('../statics/gamequery.php');
      }, 2000
);

Jetzt mussten sowohl jQuery als auch das JavaScript Snippet in die Index Datei eingebunden werden. Über Kritik und Anregung freue ich mich natürlich wie immer.

<!-- game informations -->
<script src="js/jquery-min.js" type="text/javascript"></script>
<script src="js/gamebox.js" type="text/javascript"></script>
<!-- game results -->
<div id="gamebox"></div>

An der Stelle hatte ich gleich mal tatkräftige Hilfe eines Arbeitskollegen ;) Danke an dieser Stelle.

March 06 2011

14:06

ZRE | Zombie Revolution Environment. Im Web!

Demnächst könnte es unter Umständen zu einer Vielzahl von Posts kommen, die sich um das damals erwähnte Zombie Revolution Environment drehen. Um jetzt nicht unnötig weit auszuholen versuche ich es mal so kurz wie mögilch zu beschreiben.

Vor ca. 2 Wochen bekamen wir @ School einen Flyer für den JOY-Dortmund Wettbewerb für Informatik Projekte von IT Auszubildenden. Was unter anderem zu dem hier erwähnten Projekt führte. Holger und ich kamen auf die Idee im Grunde ZRE für das Web umzusetzen. Aber nicht nur um die Welt auf unterhaltende Art und Weise anzeigen zu lassen, sondern viel mehr eine Analyse des Spielverlaufs mit Hilfe von Statistiken zu erstellen.

Da das “Spiel” ausschließlich aus zufällig generierten Umständen besteht, wäre die Auswertung der Entwicklungen der simulierten Welt evtl. interessant. Grade wenn man so auf Statistiken steht. :/

Anforderungen

  • ZRE (in Bash geschrieben) als lauffähigen Daemon umsetzen der Output an eine Stelle generiert. (Bash – Shell)
  • Eine geeignete Website erstellen bzw. designen (HTML, CSS, PHP)
  • Eine Schnittstelle die die generierten “Welten” im Web anzeigt. Am besten als selbst aktualisierende live Anwendung. (JavaScript, AJAX)
  • Ein SQL-Modul für ZRE entwickeln, welches statistische Werte an eine Datenbank übermittelt. (MySQL)
  • PHP-Funktionen definieren, die Ergebnisse aus Datenbank abholen. (PHP)
  • Statistiken visualisieren (R statistical Programming Language)

Im wesentlichen sieht die Aufgabenteilung vor, das sich Holger um Website, Design und PHP kümmert und ich mich um die Bash-Module, ZRE an sich, SQL Datenbank und statistische Auswertung bemühe. Selbstverständlich würden wir auch jegliche andere Hilfe oder freiwillige Mitarbeiter dafür begrüßen, falls Interesse besteht. Das wir an dem Wettbewerb teilnehmen wird zusehens unwahrscheinlicher, da das Projekt an sich schon eher einen Unterhaltungswert, statt dem wirklichen Nutzen eines IT-Projekt hat.

Wer sich ZRE an sich mal ansehen will, kann einfach mal das Git-Repo auschecken und starten (auch unter Mac OS X lauffähig).

 

$ git clone git://github.com/noqqe/zombie-revolution-environment.git
$ cd zombie-revolution-environment
$ ./zre.bash
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.