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

Projects
Books
Archive
About









    Permalink
  1. 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.


  2. Permalink
  3. 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.


  4. Permalink
  5. Arduino | Ich baute ein Megabitmeter

    Vor einiger Zeit hab ich über den Podcast von Tim Pritlove (NSFW) von dem Projekt MegabitMeter erfahren. Es hat mich ehrlichgesagt fasziniert. Der eigentliche (im Namen implimzierte) Zweck zwar weniger, aber gernerell einfach Werte über ein USB Device darstellen zu können. Genaue Anwendungsfälle gibts weiter unten.

    Zunächstmal hab ich mich ausgiebig mit dem HowTo beschäftigt welches ich (bis auf ein paar Stellen) sehr gut finde. Die letzten Paar Unstimmigkeiten habe ich dann mit dem wirklich netten und zuvorkommenden Betreibern des Projekts via Mail abstimmen dürfen :) Das lag aber auch an meinen fehlenden elektrotechnischen Kenntnissen.

    Ich muss dazu sagen, dass ich in der glücklichen Situation war und jemanden kannte, der in einer Firma tätig ist, die solche Messgeräte anfertigt wodurch ich keinen Kit kaufen musste. Das ist auch der Grund warum das Messgerät etwas anders aussieht.

    Ich denke auch das der Sinn des Projekts eher das “do-it-yourself” ist und der wirtschaftliche Erfolg nur eine positiver Nebeneffekt der Betreiber ist… (Zumindest hoffe ich, dass ich das nicht falsch interpretiert habe). Außerdem schwierig war, dass der Kit 2 (incl. dem Arduino) nicht verfügbar war, da laut Twitter gerade keine Arduinio Nano in rauen Mengen billig einzukaufen sind. Den Arduino Prozessor habe ich deswegen von TinkerSoup.de geordert.

    Wenn alles fertig gebastelt ist, kann man dem Gerät einfach via echo Werte übergeben.

    $ echo "200" > /dev/ttyUSB0

    Ein paar Anwendungsbeispeile:

    Zufällige Zahlen auf das Gerät projezieren
    while true; do RND=$(($RANDOM % 99 * 10)); printf "$RND\n" > /dev/ttyUSB0 ;echo $RND; sleep 2 ; done

    Zombie Kill Meter (In Verbindung zu zombies.n0q.org)
    while true ; do mysql -u user -ppw -e \"SELECT kills from zombies.zre_kills ORDER BY id DESC LIMIT 1;\" | grep -v ^kills ; sleep 3; done" > /dev/ttyUSB0

    Port 80 Verbindungen des Webservers
    ssh user@host "while true; do echo \$(( $(netstat -tapn | grep -c -e ':80\s*') * 100 )) ; sleep 2; done" > /dev/ttyUSB0

    An weiteren Snippets bastle ich im Moment noch. Werden eventuell nachgereicht wenn Sie spruchreif sind. Am Ende noch ein riesen Danke für die Software und die Projektidee sowie das wunderbare HowTo an das Team von megabitmeter.de


  6. Permalink
  7. 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


  8. Permalink
  9. 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.


  10. Permalink
  11. ROT13 Verschlüsselung in Bash

    Seit ich meinen neuen Arbeitsweg antrete und täglich ca eine Stunde im Zug verbringe, höre ich umso mehr Podcasts. Besonders gut finde ich http://ulm.ccc.de/dev/radio/. Es ging unter anderem um Algorithmen und Kryptologie im Allgemeinen. Unter anderem eben auch die ROT13 Verschlüsselung.

    Grafik aus Wikipedia unter Public Domain

    Ich habe mir überlegt wie schwierig es wohl sein kann, diesen in Bash zu implementieren. Nach kurzem googlen findet man immer wieder eine kleine wirklich ausgefuchste, trickreiche Zeile:

    $ tr A-Za-z N-ZA-Mn-za-m

    Irgendwie war mir das aber zu langweilig, mir die Arbeit von einem vorgefertigten Binary erledigen zu lassen. Ich wollte es in echtem Bash selbst schreiben. Was ich dann auch getan habe.

    Usage:

    $ ./rot13 "hello world"
    uryyb jbeyq

    $ echo "hello world" | ./rot13
    uryyb jbeyq

    # Verschlüsseln und entschlüsseln hintereinander.
    $ echo "hello world" | ./rot13 | ./rot13
    hello world

    # Zeichentabelle anzeigen
    $ ./rot13 -t

    Sollten Zeichen vorkommen, die sicht nicht im Table befinden, werden diese automatisch erkannt und bleiben unverschlüsselt.

    $ ./rot13 "Ich wollte nur [...] und dann ist das Universum explodiert."
    Ipu jbyygr ahe [...] haq qnaa vfg qnf Uavirefhz rkcybqvreg.

    Genau genommen ist es sogar mehr als nur ROT13. Mit wachsendem Zeichen-Table wächst auch automatisch die Verschiebung der Stellen mit. Es ist also möglich einen eigens definierten Table mit Zeichen anzulegen und diesen zu nutzen. Einzige Bedingung: Es muss eine gerade Anzahl von Zeichen sein.

    Und zum Schluss: Danke an /dev/radio für die erhebliche Verkürzung meiner Zugfahrten :)


  12. Permalink
  13. 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 :)

  14. Permalink
  15. Minecraft + Git + Bash = <3

    Seit mittlerweile erstaunlich langer Zeit spiele ich Minecraft. Minecraft hält seine Daten in ~/.minecraft vor. Also Levels, Statistiken, Items. Das Minecraft Home Directory unter Versionskontolle zu stellen hat unter Umständen mehrere Vorteile, die ich hier kurz erläutern möchte :)

    Initiales Setup

    Als erstes muss das Verzeichnis initial eingerichtet werden. Initialisierung, hinzufügen aller Dateien und ersten Commit erstellen.

    $ cd $HOME/.minecraft
    $ git init
    $ git add .
    $ git commit -a -m "Initialer Commit"

    Spielstände manuell Laden und Verwalten (Commits)

    Einer der gravierendsten Vorteile. Wer wie ich oft an Klippen hinunter stürzt oder an einem (oder auch mehreren :P ) Creeper(n) scheitert wird das bestätigen können. Einmal gefallen/gestorben gibt es kein zurück mehr. Bis jetzt.

    Die hypothetische “Herausforderung” scheint sich gerade aufzutun. Ob jetzt Creeper, Berg oder sonst was ist erstmal egal. Könnte auf jeden Fall kritisch für meinen Minecraft Character enden.

    $ git commit -a -m "Ob man den Sprung ueberlebt?"

    Nach einem kurzen Tab in die Konsole, sollte das Spiel erstmal gesichert sein und ich kann den Sprung wagen.

    Anscheinend überlebt man nicht, aber genau das war auch der kritische Punkt. Genau jetzt bin ich in der Lage meinen alten Spielstand wiederherzustellen. Mit nachfolgendem Kommando verwerfe ich alle seit dem letzten Commit entstandenen Änderungen an meinem Spielstand. Vorher dringend aufs Minecraft Titelmenü zurückkehren!

    $ git stash
    # Update
    # oder alternativ:
    $ git checkout -f

    Dieses Szenario lässt sich nicht nur auf gerade geschehene Ereignisse abbilden sondern auch zwischen Commits die längere Zeit her sind. Wenn nach einer halben Stunde/einem Monat klar wird, das der Minecraft Char gerade nur Müll verzapft hat, kann auch zwischen mehrere Commits hin und her gesprungen werden. Mit welchen git Kommandos das bewerkstelligt wird, bleibt jedem selbst überlassen.

    git-revert macht den letzten Commit rückgängig, erstellt dabei einen neuen in dem die Änderungen enthalten sind. Das ist in soweit gefährlich, dass zwischenliegende Commits unberührt bleiben und eventuell in einen großen Haufen Datenmüll zerfallen(!). Eher Anwendung für den “Warp” an einen früheren Zeitpunkt X findet daher git-reset.

    $ git reset 66a2594
    # oder
    $ git reset HEAD^

    Das Working Directory wird damit auf einen Stand gebracht, wie es zum Zeitpunkt des angegebenen Commits aussah. Dieser kann somit auch weiter in der Vergangenheit liegen.

    Automatische Speicherung (Bash-Einzeiler)

    Allerdings muss ich zugeben, dass diese Praxis relativ schnell aufwendig wird. Immer zwischen Fenstern hin und her zappen ist ja auf Dauer auch eher zermürbend. Daher habe ich mir diese “Arbeit” von einer kleinen Bash Zeile abnehmen lassen.

    $ SEKUNDEN=10 ; while true ; do git add . ; git commit -a -m "AutoSave $(date)" ; sleep $SEKUNDEN ; done

    Ich denke es ist Geschmacksache wie oft bzw. in welcher Frequenz die Commits abgesetzt werden können. Bis jetzt bin ich mit ca 300 Sekunden (5 Minuten) am besten Gefahren. Die Commits rieseln vor sich hin und beeinträchtigen so in keinster Weise den Spielfluss.

    [master bf9dd85] AutoSave Mo 4. Jul 19:56:17 CEST 2011
    4 files changed, 15 insertions(+), 12 deletions(-)
    rewrite saves/0pen_Running/level.dat (100%)
    rewrite saves/0pen_Running/level.dat_old (100%)
    [master 5ddedc8] AutoSave Mo 4. Jul 19:56:27 CEST 2011
    4 files changed, 17 insertions(+), 19 deletions(-)
    rewrite saves/0pen_Running/level.dat (100%)
    rewrite saves/0pen_Running/level.dat_old (100%)
    [master 2d33023] AutoSave Mo 4. Jul 19:56:37 CEST 2011
    4 files changed, 10 insertions(+), 11 deletions(-)
    rewrite saves/0pen_Running/level.dat (100%)
    rewrite saves/0pen_Running/level.dat_old (100%)

    Parallele Welten (Branches)

    Um einfach mal ein Anwendungsbeispiel zu nennen: Wer in seinem virtuellen Minecraft-Keller mal raue Mengen an TNT gebunkert hat, möchte es nach Möglichkeit auch mal benutzen, right? Aber danach das ganze Dorf wieder aufbauen? Nee… Branching!

    Das ist der Punkt an dem die Geschichte der lokalen Minecraft Map sich in zwei Teile spaltet. In einer wird das eigene Bauwerk Sodom und Gomorra mäßig untergehen und in der anderen weiterhin existierenden Welt tollen sich Pigs und Sheeps in Minecarts herum. Die Abzweigung lässt sich wie folgt bewerkstelligen.

    $ git branch blowup
    $ git checkout blowup

    Jetzt kann man in aller Seelen Ruhe TNT verteilen und auch mal Destroyer statt Builder spielen. Tipp: Commit vor der Sprengung setzen :P Explosion immer und immer wieder von vorne genießen ;) Bemerkenswert sind außerdem die unterschiedlichen Abläufe von ein und der selben Explosion, aber dazu vielleicht wann anders ein Blogpost. Irgendwann wird aber auch das dann zur Routine und man wechselt via

    $ git checkout master

    wieder zu den Schäfchen. Der Branch “blowup” bleibt aber bestehen und lässt sich auch nach weiteren Spielständen immer wieder herbeirufen. Ich habe mittlerweile eine Art Branchset meiner “Lieblingssituationen” im Game, die ich immer wieder durchspielen kann, wie es mir gerade gefällt. Und nein es sind nicht immer nur Explosionen :)

    Networking, Baby! (Remotes)

    Mein Minecraft Setup mit allen Einstellungen und Spielständen zentral an einem Ort zu haben war ehrlich gesagt meine erste Motivation git einzusetzen. Ich spiele Minecraft auf 3 verschiedenen Maschinen (Ubuntu, Debian und sogar Mac OSX) und wollte keine 3 unterschiedlichen Maps pflegen müssen. Deshalb fing ich an auf meinem Server zwischen zu lagern. Ein eigens laufender git-Server ist hier aber Vorraussetzung! Freies Hosting bei beispielsweise Github fällt wegen der großen Datenmengen (ca. 300MB bei mir derzeit) und der fehlenden Privatsphäre flach. Remote-Server hinterlegen und aktuellen Stand pushen:

    $ git remote add origin git@gitserver.com:minecraft
    $ git push origin master

    Remote-Server auf anderen hosts klonen:

    # Ubuntu/Debian
    $ git clone git@gitserver.com:minecraft $HOME/.minecraft
    # Mac OSX
    $ git clone git@gitserver.com:minecraft $HOME/Library/Application\ Support/minecraft

    At least

    Ich möchte nicht sagen, dass dies hier der ultimative Weg zum heiligen Gral in Minecraft ist. Manchmal weckt eben diese erzeugte “Sicherheit” durch den Reset eine gewisse “Wayne…” Einstellung in einem, die dem Spielspaß ein Kleinwenig den kitzel raubt. Gerade am Anfang hat es mir aber extrem geholfen, nicht bei jedem Wipe alle Items zu verlieren oder sich nach einem Ausflug in den Wald wieder “zurück warpen” zu können.

    Auf weitere Ideen im Umgang mit Minecraft und Git freue ich mich natürlich wie immer :)


  16. Permalink
  17. BitCoin | Debian Daemon Script für poclbm-mod

    Man muss Dinge über Hirnschäden von Menschen lesen die Nachts guten Gewissens neben einem 4 Grafikarten im SLI-Verbund schlafen und zugleich die Bedenken von sinnierenden Typen die an den Limitierungen von 21 Billionen maximal möglichen BitCoins zweifeln. Umweltverschmutzung ist natürlich auch ein Thema. Klar. Gerechtfertigter Weise.

    Wenn Ihr mich fragt, schiesst die BitCoin Mining Gesellschaft am Ziel vorbei. Separate Rechner betreiben schiesst am Ziel vorbei. Hunderte von Euros für neue Grafikkarten ausgeben um 5 MegaHashes/s mehr rechnen zu können schiesst am Ziel vorbei. Euro’s für BitCoins bezahlen schiesst sowieso am Ziel vorbei. Man kann BitCoins meines Erachtens auch benutzen ohne Kopfstände zu machen. Immer wenn der Rechner sowieso gerade läuft, mit der Hardware die man zur Verfügung hat.

    Aus diesem Grund habe ich ein kleines Skript gebastelt. Einen Start-Stop-Daemon für /etc/init.d/. Es startet automatisch wenn mein Rechner hochfährt und hört auf wenn ich Ihn herunterfahre. Ganz einfach

    $ wget -O /etc/init.d/bitcoin https://gist.github.com/raw/1007794/bitcoin.sh
    $ chmod +x /etc/init.d/bitcoin
    $ update-rc.d bitcoin defaults

    https://gist.github.com/1007794

    Ich möchte aber dazu sagen, dass ich dies Funktionstüchtigkeit des Skripts nicht auf anderen Rechnern/Betriebssystemen getestet habe. Vor Benutzung also bitte lesen, verstehen ggf. anpassen. Außerdem wird ein Account bei einem Mining Pool benötigt und der Mining Client an sich (poclbm-mod). Während ich diesen Post geschrieben habe, hat mein BitCoin Mining Client entspannt auf meiner Geforce 8600 GS mit nahezu niedlichen 950 KiloHashes/s vor sich hin gemined.


  18. Permalink
  19. 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 :)

    Update: Kurze WAV-Files generiert und als Beispiel hochgeladen.

    randombeats example 1
    randombeats example 2


« Newer -- Older »