Freitag, 16. Dezember 2011

Beastie Boys "Hot Sauce Commitee Part II" - Rezension

"Hot Sauce Committee Part II" ist zwar nicht mehr brandneu (der Release ist ca. 6 Monate her), nichts desto trotz schreibe ich dazu noch was.

Wenn ich mal Hip Hop höre, bevorzuge ich normalerweise selektierten deutschen Hip Hop (es gibt und gab halt nicht viele, die auf Deutsch wirklich gut und mit Sinn rappen können, aber das ist ein anderes Thema...). Die Beastie Boys sind einer der wenigen englische-sprachigen Rapper, welche ich mir anhöre.

Also es ist nicht so, dass ich wirklich viel Beastie Boys hören würde. Irgendwo habe ich  - glaube ich zumindest - den Klassiker "License to Ill" und sicher "Beastie Boys Anthology: The Sounds of Science", letzteres ist aber auch schon über 10 Jahre alt.


Nun, jedenfalls habe ich mir die Tage den letzten Release "Hot Sauce Committee Part II" gekauft. Und ich muss sagen: coole Sache! Rappen können die drei Jungs definitiv. Entspannter Flow, keine Platitüden, kein Pseudo "ich bin härter" Gehabe.


Musikalisch ist die CD ein interessanter Mix auf klassischen, old-school lastigen Beat gemischt mit ein bisschen elektronischer Untermalung und Effekten. Ein Track ("Lee Majors comes again") ist scheinbar "live" eingespielt, also mit Schlagzeug, Bass und Guitare. Ist aber immer noch Hip Hop, also nicht so rockig wie z.B. der Klassiker "Sabotage".


Was aber an dieser Platte wirklich bemerkenswert ist: man kann sie problemlos von Anfang bis Ende durch hören. Bei den 16 Tracks ist kein Ausfall dabei, die Zusammenstellung ist sehr gelungen und abwechslungsreich. Fazit: ein sehr gelungener Release der Beastie Boys!

Donnerstag, 15. Dezember 2011

Precise 12.04, Rhythmbox und Banshee

Ikhaya von ubuntuusers.de hat es bereits gemeldet und mit dem ersten Alpha-Release ist es dann auch passiert: Rhythmbox ist (wieder) als Musikplayer an Bord und ersetzt damit Banshee, was in den letzten beiden Releases zum Einsatz kam.

Den Musikplayer nutze ich recht häufig, weil ich oft beim Programmieren oder Arbeiten am Computer Musik höre. Meine Ansprüche sind dafür aber ziemlich gering: Hauptsache der Player kann die gängigen Formate abspielen und Internetradio streamen. Das können viele. Ausgefuchste Funktionen zur Verwaltung großer Musiksammlungen brauche ich nicht, da ich nur einen  Bruchteil meiner Musiksammlung auf den Laptops habe. Und das, was drauf ist, ist übersichtlich.

Von daher hatte ich eigentlich auch keine Probleme beim Wechsel von Rhythmbox auf Banshee. Nichts desto trotz freue ich mich doch ein kleines bisschen über den Zurückwechsel, weil mich zwei Sachen an Banshee stören.

Nach dem Starten von Banshee nimmt sich das Programm auf beiden meiner Laptops gerne mal eine ca. 10 sekündige Auszeit. Was es auch immer da macht. Jedenfalls braucht Banshee wohl kaum solange, um maximal 400 Musikstücke für die Bilbliothek zu scannen. Danach läuft Banshee aber ohne Probleme.

Der andere Punkt ist, dass Banshee ziemlich stumpf ist, was das Erkennen von neuen oder geänderten Musikstücken unterhalb des Verzeichnisse "~/Musik" ist. Rhythmbox ist hier wesentlich schneller bei der Erkennung und der Aufnahme in die Bibliothek und zeigt auch explizit, welche Musikstücke noch in der Bibliothek registriert sind, aber auf der Festplatte fehlen.

Abgesehen davon finde ich das Bearbeiten von MP3-Tags in Rhythmbox (unter Lucid) besser als bei Banshee (unter Oneiric), dass ist aber kein entscheidender Punkt.

Im Moment steht wohl noch nicht fest, ob Rhytmbox wirklich am Ende in Precise drin ist, da noch die Integration des Ubuntu One Musicstores fehlt. Da aber Canonical damit Geld verdient mache ich mir in diesem Punkt wenig Sorgen, dass es daran scheitern sollte...

H2O "Don't Forget Your Roots" - Rezension

"Roots - don't forget your roots" singen H2O bekanntlich auf ihrem ersten Release 1996. Jetzt, 15 Jahre später, erscheint ein Album mit diesem Titel. Darauf würdigen H2O ihre "roots", also musikalischen Einflüsse.

Herausgekommen ist ein 40-minütiges Album mit 15 Tracks, erschienen Mitte November 2011. Gecovert wird hauptsächlich Hardcore und Punk diverser älterer Szenengrößen wie Bad Brains, SOIA, Gorilla Biscuits, Descendens, Ramons aber auch z.B. The Clash.

Musikalisch sind alle Cover sehr nah am Original dran. Sowohl was das Spiel als auch den Gesang angeht. Wenn man es nicht wüsste wäre es stellenweise ziemlich schwer überhaupt zu hören, dass es H2O ist.

Das ist auch mein größter Kritikpunkt an diesem Release: er hat keine Eigenständigkeit. 15 sauber eingespielte Tracks machen noch keine gute CD. Das ganz ist zwar nicht schlecht, aber halt ziemlich druck- und kraftlos. Das H2O das auch wesentlich besser kann zeigt z.B. das - wenn auch schon etwas ältere - Cover von Ice Cube's "It was a good day".

Auch wenn H2O sonst zu meinen Favoriten gehört muss ich hier leider sagen: Die CD muss man nicht haben. Hoffen wir mal, dass H2O mit dem nächsten regulären Album wieder zur alten Stärke und zur Power der anderen Releases zurück kehrt.

Mittwoch, 14. Dezember 2011

cmd - Python-Modul für text-basierte Programme

Wer (mit Python) programmiert kommt irgendwann an den Punkt, wo das Programm von Nutzer Daten erwartet. Die kann man noch als Option beim Aufruf des Programms mitgeben, wobei das bei vielen Werten / Optionen etwas mühselig wird. Und wenn das Programm mit dem Nutzer interagieren will, dann muss man schon Tastatureingaben abfragen und verarbeiten. Das geht z.B. mit input bzw. raw_input im DIY-Verfahren.

Aber bekanntlich hat Python ja "Batteries included" und bringt in der Standardinstallation für eine solche Anwendung bereits ein eigenes Modul Names "cmd" mit. Dieses stellt recht komfortabel ein Rahmenwerk bereit, um Befehle auf der Kommandozeile entgegen zu nehmen und an die passende Funktion weiter zu reichen, welche dann das Ergebnis ausgibt. Danach erscheint ein neuer Prompt. Dies geschieht so lange, bis man das Programm beendet, wobei das cmd-Modul auch hier eine Weg bietet, ein "sauberes" Programmende durchzuführen.

Im folgenden Skript wird eine kleine Telefonbuchapplikation mit Hilfe des cmd-Moduls realisiert. Dabei kann einem Namen einfach nur eine Telefonnummer zugeordnet werden. Zur persistenten Speicherung kommt das Dumb-DBM Python-Modul zum Einsatz. Auf die Daten kann so wie auch ein normales Python Dictionary zugegriffen werden, wobei die Daten als "Name: Nummer" Wertpaar abgelegt werden.

Das Programm hat drei Funktionen. Man kann

  • eine Eintrag hinzufügen
  • einen Eintrag anzeigen lassen bzw. alle Einträge anzeigen lassen
  • einen Eintrag löschen
Beim Hinzufügen von Namen mit Nummer erwartet das Programm, dass diese durch das Pipe-Zeichen | getrennt sind.

Doppelte Einträge für den Namen sind nicht erlaubt.

Das entsprechende Skript sieht so aus:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cmd, sys, dumbdbm

class Telefonbuch(cmd.Cmd):
   
    prompt = '(Eingabe): '
   
    def __init__(self,db_name):
        cmd.Cmd.__init__(self)    
        self.db_name = db_name
        self.db = None
   
    def preloop(self):
        self.db = dumbdbm.open(self.db_name)
        print u'Nutze die Datenbank {0}'.format(db_name)
        print u'Die Datenbank hat aktuell {0} Einträge.'.format(len(self.db))
        print
       
    def postloop(self):
        self.db.close()
        print u'Datenbank geschlossen...'
   
    def do_zeige(self, line):
        if len(self.db) == 0:
            print u'Die Datenbank ist leer...'
        if line:
            if not self.db.has_key(line):
                print u'Die Datenbank hat keinen Eintrag {0}'.format(line)
            else:
                print u'{0}: {1}'.format(line,self.db[line])
        else:
            for k,v in self.db.iteritems():
                print u'{0}: {1}'.format(k.decode('utf-8'),v)

    def help_zeige(self):
        print '\n'.join([u'zeige NAME',
            u'Zeigt die Telefonnummer für NAME an.',
            u'Wird kein NAME angegeben, werden alle Einträge angezeigt'])
   
    def do_dazu(self, line):
        eintrag = line.split('|')
        if len(eintrag) != 2:
            msg = '\n'.join(
                [u'Fehler bei der Eingabe!',
                 u'Name und Nummer bitte durch Pipe-Zeichen trennen!'])
            print msg
            return
        if self.db.has_key(eintrag[0].strip()):
            print u'Es gibt schon einen Eintrag mit dem Namen {0}'.format(
                eintrag[0])
            return
        self.db[eintrag[0].strip()] = eintrag[1].strip()
   
    def do_weg(self, line):
        if not self.db.has_key(line):
            print u'Die Datenbank hat keinen Eintrag {0}'.format(
                line.decode('utf-8'))
        else:
            nummer = self.db.pop(line)
            print u'Namen {0} mit Nummer {1} wurde gelöscht'.format(
                line.decode('utf-8'),nummer)
   
    def do_ende(self, line):
        print 'Programm beenden...'
        return True
   
    def do_EOF(self, line):
        print 'Programm beenden...'
        return True

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print u'Angabe der Datenbankdatei fehlt!'
        sys.exit()
    else:
        db_name = sys.argv[1]
        telefonbuch = Telefonbuch(db_name)
        telefonbuch.cmdloop()

Die Applikation besteht aus einer Klasse namens Telefonbuch, welche von cmd.Cmd erbt. Da hier der Name der Datenbank sowie eine Instanz der Datenbank als Attribut der Klasse genutzt wird, muss auch cmd.Cmd in __init__ aufgerufen werden. Hat die eigene Klasse keine __init__-Funktion, dann ist dieser Schirtt nicht notwendig. Wie zu sehen ist, erwartet die Klassen Telefonbuch ein Parameter beim Aufruf, nämlich den Namen der Datenbank, welche für das Telefonbuch verwendet werden soll.

Der Aufruf des Programms erfolgt immer über das Schema NAME_DER_KLASSE.cmdloop(). Dadurch wird solange ein Eingabeprompt ausgegeben und die eingegebenen Befehle verarbeitet, bis das Programm beendet wird.

Werfen wir nun einen Blick in die Klasse. Als erstes wird mit prompt = '(Eingabe)' ein eigenes Prompt definiert. Standardmäßig würde sonst (Cmd) angezeigt. Es folgen zwei Methoden namens preloop und postloop. Diese sind in cmd bereits vorhanden, dienen aber dazu, überschrieben zu werden. Wie die Namen schon vermuten lassen, werden die Funktionen ausgeführt, bevor der Hauptloop der Anwendung gestartet wird bzw. bevor das Programm beendet wird. Hier werden die Funktionen dazu genutzt, um die Datenbank zu öffnen (bzw., falls die Datenbank noch nicht existiert, anzulegen) und wieder regulär zu schließen. Es gibt übrigens auch die Funktionen precmd und postcmd - welche hier nicht verwendet werden - die jedesmal vor und nach der Ausführung eines Befehls aufgerufen werden. Die Verwendung von preloop, precmd, postcmd und postloop ist dabei optional, d.h. sie müssen nicht im Programm enthalten sein.

Das Schema von cmd zum Definieren von Befehlen innerhalb der Applikation ist recht simple, wie zu erkennen ist. Jeder Befehl wird über do_BEFEHL festgelegt. In dieser Applikation gibt es also die Befehle zeige, dazu, weg und ende, welche entsprechend in den Funktionen do_zeige, do_dazu, do_weg und do_ende definiert sind. Weiterhin gibt es do_EOF, welche durch einen Druck der Tastenkombination STRG+D die Applikation regulär beendet. do_EOF sollte in jeder Applikation enthalten sein. Die Funktionen können beliebigen Programmcode enthalten, mit print wird in die Standardausgabe geschrieben. Ist eine Funktion durchlaufen, erscheint ein neuer Prompt.

Alle Befehle erhalten die zusätzlich eingegebenen Parameter über die Variable line. Wird z.B. hier der Befehl dazu Jochen | 12345 eingegeben, wird die Funktion dazu aufgerufen und Jochen | 12345 wird in line hinterlegt. Beim Programmieren sollte man immer im Hinterkopf behalten, dass das cmd-Modul nur das Rahmenwerk bereit stellt und keinerlei Eingabefehler etc. abfängt. Darum muss sich der Programmierer selber kümmern.

Weiterhin besitzt das cmd-Modul einen Befehl, um Hilfstext zu den Funktionen anzuzeigen. Diese müssen natürlich explizit angelegt werden, so wie hier beispielhaft für die Funktion zeige. Hilfstexte werden immer nach dem Schema help_BEFEHL angelegt. Die Hilfe lässt sich durch die Eingabe von help ohne weitere Parameter am Prompt aufrufen.

Wie zu sehen ist, ist die Verwendung des cmd-Moduls recht einfach. Mit minimalen Aufwand kann man eine interaktive Terminalanwendung schreiben. Diese ist portable, d.h. sie sollte gleichermaßen und Linux, Windows und MacOS laufen.

weiterführende Links:


Sonntag, 11. Dezember 2011

Me First and the Gimme Gimmes "Sing in Japanese" - Rezension

Nachdem die Gimme Gimmes dieses Jahr schon in Australien waren, sind sie erst gar nicht nach Hause geflogen, sondern von "Down Under" Richting Norden - und in Japan gelandet.


Der 2. Release der Band für dieses Jahr trägt den Titel "Sing in Japanese". Und: wie immer ist der Name Programm. Es werden in der Tat sechs Stücke von japanischen Künstlern gecovert, die größtenteils auf japanisch (!) vom Gimme Gimmes Sänger Spike Slawson gesungen werden.

Ob das jetzt gutes oder schlechtes japanisch ist, vermag ich nicht zu sagen (mein japanisch ist ziemlich defizitär...). Auch ob die Stücke jetzt DIE Kracher in Japan sind und welche Stil sie im Original haben kann ich nicht sagen. Die Coverversionen sind jedenfalls keine Ausrutscher. Es wird lustig gepunkrockt, ganz so wie man es gewohnt ist.

Wobei: das mit dem japanisch ist schon hart. Also echtes easy listening ist das nicht. Und mitsingen werde ich die Stücke wahrscheinlich auch nach 100x hören nicht können. Egal - wer Me First and the Gimme Gimmes mag, der kommt auch an "Sing in Japanese" nicht vorbei.

Nachtrag:

Hier noch zwei Youtube.-Links zu "Originalen", welche von den Gimme Gimmes gecovert werden:
  • Hero:  http://www.youtube.com/watch?v=IB25r_o0m5g
  • CCC: http://www.youtube.com/watch?v=c2l9fDLtFeQ

Sonntag, 4. Dezember 2011

Bad Religion "Live 1983" LP

Im Moment bin ich wieder verstärkt dabei, meine umfangreiche Vinyl-Sammlung aufzunehmen und auf den Computer zu bannen.

Dabei ist mir auch vor ein paar Tagen die Platte "All Our Yesterdays - Live 1983" von Bad Religion in die Hände gefallen.

Wer sich jetzt ratlos am Kopf kratz, weil die Platte z.B. in der Discographie nicht auftaucht: Das ist kein offizieller Release, sondern ein klassischer Bootleg (gibt's heute gar nicht mehr, oder?). Den habe ich vor ca. 20 Jahren auf einem Flohmarkt gekauft.

Nun ja, jedenfalls ist die Qualität der Aufnahme durchaus ok. Kein Matsch, alle Instrumente und der Gesang sind gut zu hören.

1983 war zwar nicht mehr ganz die Anfänge von Bad Relgion, aber immer noch die frühe Zeit. Wenn ich es nicht wüsste, dass es BR ist, dann würde ich es wahrscheinlich nicht erkennen. Der Gesang ist schon ziemlich anders als auf Suffer, No Control etc. Und man hört, dass Greg Griffin damals noch ziemlich jung war.

Die Trackliste der Platte lautet:

  1. We're only gonna die
  2. Part 3
  3. Faith in God
  4. It's only over when
  5. Latch key kids
  6. The dichotomy
  7. Fuck armageddon
  8. Voice of God
  9. Slave
  10. Johnny B. Goode
  11. Rock'n'Rollh
  12. Louie Louie

Wie unschwer zu erkennen ist, sind die letzten drei Songs Coverversionen. "Johnny B. Goode" ist dabei ziemlich cool, rockt schön ab. Ob von den anderen Songs alle auf regulären Releases weiß ich gerade nicht... ich meine nicht, mag mich aber irren.

Na ja, jedenfalls habe ich das Ding. Vielleicht ist die Platte ja mal irgendwann 1 Mio. Euro wert. ;-) Und der Blogleser weiß jetzt, dass es diese Platte gibt. Das ist ja auch was wert.

Python HTML Form Frameworks - FreiesMagazin Artikel

Heute ist mein Artikel zu den Python HTML Form Frameworks in der Ausgabe 12/2011 von FreiesMagazin erschienen. Das an sich ist noch nicht wirklich bemerkenswert, da ich ja öfters für FreiesMagazin schreibe.

Trotzdem möchte ich hier noch ein paar Worte zu diesem Artikel schreiben. Zum einem ist es der längste Artikel, den ich bis jetzt geschrieben habe. Der Umfang beträgt 16 Seiten. Gut, da sind fünf längere Listings drin, d.h. von der tatsächliche Textlänge liegt der Artikel wahrscheinlich ähnlich wie der CouchDB (FM 6/2010) und der NoSQL (FM 8/2010) Artikel. Und ich habe noch nie so lange für einen Artikel gebraucht. Ich führe zwar nicht Buch, aber der Zeitaufwand lag wohl so bei ca. 25-30 Stunden.

Die reine Schreibzeit war natürlich weitaus kürzer. Genau genommen vielleicht maximale 1/4 der Zeit. Der Rest ist für das Lesen der Dokus zu den fünf Frameworks und das rumspielen und programmieren drauf. Wobei man dann auch sehr deutlich den Unterschied zwischen guten und "na-ja" Dokus merkt. Doch dazu später mehr.

Die Idee zu dem Artikel kam mir übrigens, als ich vor ein paar Monaten eine temporäre Unzufriedenheit mit meinem "Stamm-Framework" WTForms verspürte. Zu der Zeit warf ich einen intensiveren Blick auf FungiForm. Bin dann aber doch bei WTForms geblieben, weil die Unzufriedenheit durch einen Programmfehler meinerseits bedingt war, und nicht durch eine Unzulänglichkeit des Frameworks.

Ursprünglich sollte der Artikel auch "nur" vier Frameworks umfassen, nämlich Deform, WTForms, FungiForm und Flatland. FormAlchemy habe ich erst im Laufe der Recherchen zum Artikel "gefunden". Da es aber recht cool und auch "stable" ist, habe ich es dann auch noch aufgenommen.

Was schon ein wenig anstrengend war, war der Abschnitt zu Flatland. Nicht, weil Flatland so schlecht ist (dann hättte ich erst gar nicht darüber geschrieben...), sondern weil die Doku unvollständig ist. Und nach meinem Empfinden komisch strukturiert und mit zu wenig Beispielen. Das war echt an der ein oder anderen Stelle "trial & error" bis ich raus hatte, wie was funktioniert.

Sehr gut ist übrigens die Doku zu FungiForm. Auch wenn diese nur im Quelltext des Python-Moduls vorliegt. Hier bestätigt sich der (gute) Ruf von Armin, dass er sehr gute und verständliche Dokus schreiben kann. FungiForm würde ich auch nutzen, wenn es einen Maintainer hätte... Vielleicht findet sich ja durch den Artikel einer. Und bevor jemand fragt: nein, ich werde das nicht machen. Nichts, weil ich nicht prinzipiell Interesse hätte - aber zum einem halte ich meine Python-Skils  für diese Aufgabe für nicht hinreichend gut, zum anderen habe ich nicht wirklich genug Zeit dafür.

Und noch ein wenig persönliche Meinung zu Schluss: Wie bereits erwähnt nutze ich selber WTForms und bin durchweg zufrieden. Sehr gut gefällt mir ebenfalls FungiForm, sehr schick ist aber auch FormAlchemy. Hier hätte ich falls notwendig auch kein Problem zu wechseln. Deform ist sicherlich auch gut, aber die Trennung in Colander für die Definition der Struktur und Deform für die "Arbeit" finde ich... komisch. Gleiches gilt im Prinzip auch für Flatland, plus das die Doku echt noch erweitert werden muss.