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.

Sonntag, 27. November 2011

Software-Center, Fortschritt, Suchen, Löschen

In einem früheren Blogeintrag hatte ich bereits erwähnt, dass zwischen dem Software-Center und mir keine Liebe auf den ersten Blick entflammte, aber die Beziehung dennoch solide ist.

Jetzt, also ca. 6 Wochen später, finde ich das Software-Center immer noch ok. Aber mehr auch nicht. Es gibt ein paar Sachen, die mich doch stören, die drei "größten" Störungen sind:


Fortschritt - Was mich eigentlich am meisten stört, ist die Fortschrittanzeige. Also nicht, dass es eine gibt, sondern dass man eigentlich gar nichts sieht. "Gar nichts" bezogen darauf, was im Hintergrund läuft. Also ob noch der Download erfolgt, ob installiert wird oder was auch immer. Es mag vielleicht nicht essentiell wichtig sein, aber ich weiß halt nun mal gerne, was da gerade läuft. So wie die Aktualisierungsverwaltung oder Synaptic es halt auch darstellen.


Suchen - Was ich weiterhin nicht sooo prall finde ist die Suche. Also ich habe bis jetzt zwar alles gefunden, aber ich finde es störend, dass nicht alle Treffer zum bisher eingetippten Suchbegriff angezeigt werden. Richtig aufgefallen ist mir das letzthin, als ich ein Totem-Plugin gesucht habe. Tipp man bis "totem-p", wird nur das Totem-ARTE-Plugin gezeigt (ist das wirklich so wichtig ;-) ?). Wenn man "totem-plugins" getippt hat, wird das Paket "totem-plugins" gezeigt und ab "totem-plugins-" (also ein - mehr) die Pakete "totem-plugins-dvb-daemon" und "totem-plugins-extras". Eine tiefere Logik ist da in meinen Augen echt nicht zu erkennen...

Löschen - Aus dem Software-Center heraus kann man nur "normal" Pakete entfernen. Die Option "purge" (also das restlose entfernen inklusive Konfigurations-Dateien) gibt es nicht. Das mag vielleicht auch nicht essentiell wichtig sein, stört mich aber. Ab und an installiere ich mal ein Programm aus Neugier oder auch zum Testen eines Wiki-Artikels. In den meisten Fälle brauche ich die Softeware dann aber nicht mehr bzw. doch nicht, also soll sie auch restlos von der Platte. Geht aber via Software-Center nicht.

Ich bin zwar noch nicht so weit, dass ich Synaptic wieder installierte, aber ich benutzte öfter apt-get als früher. Das hilft mir zwar bei der Suche auch nicht, aber kann wenigsten vollständig Löschen und zeigt den Fortschritt vernünftig an.

Mal sehen, was die künftigen Versionen des Software-Center so mit bringen. Aktuell mag es ja für Einsteiger komfortabel(er) sein, aber für fortgeschrittenen Nutzer ist es in meinen Augen "zu dünn".

Samstag, 26. November 2011

Schnelles Mehrfach-Umbenennen auf der Kommandozeile


Heute habe ich angefangen, alle Fotos nach Jahren in Ordner zu sortieren. Dabei stieß ich auf folgendes Problem: Es gab eine Reihe von Fotos mit gleichem Dateinamen, aber anderem Motiv. Dies ist dadurch bedingt, dass Verwandte bzw. Bekannte von mir eine Kamera hatten, welche das gleiche Namensschema wie meine verwendet (konkret: DSCNxxxx.JPG).

Zusammenführen in den gleichen Ordner geht also nicht ohne Umbenennen. Dabei schwebt mir eine "einfache Änderung des Dateinamens vor, z.B. sowas wie DSCN0001.JPG nach DSCN0001_foo.JPG. Nur für das manuelle Umbenennen via Nautilus & Co. sind es zu viele Dateien. Hilfsprogramme, wie sie das Wiki von ubuntuusers.de listet wie z.B. pyRenamer oder rename erscheinen mir ein wenig übertrieben. Zumal ich sicher war, dass es auch ganz einfach mit der Kommandozeile geht.

Leider sind meine Skills auf der Kommandozeile nicht sooo prall, so dass die Suchmaschine meiner Wahl herhalten muss. Damit ist auch schnell die Lösung gefunden

for i in *.JPG; do mv "$i" "`basename $i .JPG`_foo.JPG"; done

Ganz einfach, eigentlich. Dieser Einzeiler stammt übrigens Debian Administration Seite (Link), wo man auch noch weitere Einzeiler und Tipps zum Umbenennen auf der Kommandozeile findet.

Die Verwendung der for-Schleife im Kombination mit basename ist übrigens recht universell einsetzbar und nicht nur auf das obige Beispiel in Kombination mit mv beschränkt.

Montag, 7. November 2011

Blogger - Posts nach Tag per RSS / Atom abonnieren

Blogger, also der Anbieter dieses Blogsystems, ermöglicht es auch, Posts aus einem Blog nach deren Tag zu abonnieren. Um das raus zu finden musste ich auch ein bisschen gogglen - und deswegen teile ich auch das Ergebnis hier :-)

Angenommen, ihr wolltet für meine Blog nur Artikel per RSS oder Atom abonnieren, die mit dem (fiktiven) Tag "FooBar" getaggt sind. Dann sähe die Adresse für den Atom-Feed so aus:

http://noisefloor-net.blogspot.com/feeds/posts/default/-/FooBar

Und die für den RSS 2.0 Feed so:

http://noisefloor-net.blogspot.com/feeds/posts/default/-/FooBar?alt=rss

Das war's schon.

Skatepark Walmerod / Molsberg

Ende Oktober 2011 war das Wetter nochmal gut und halbwegs warm - da kann man auch nochmal das Skateboard auspacken und ein wenig rollen gehen.

Die Wahl fiel diesmal auf den Skatepark, welcher zwischen Walmerod und Molsberg liegt. 10 Minuten mit dem Auto fahren und ich bin da. Das ich das letzte Mal hier war ist auch schon ein ein bisschen her, daher hatte ich die Rampen nicht mehr so ganz genau in Erinnerung.

Es gibt zwei unterschiedliche hohe Quarterpipes, eine Spineramp, eine Funbox und ein flaches Grindrail. Alles gebaut von Concrete Rudolph. Der Bodenbelag ist feiner Teer, rollt sehr gut.

Kommen wir mal zur Beschreibung der Rampen - darum soll es hier ja gehen. Die sind alle aus Beton und zusätzlich noch gestrichen. Allesamt sind diese sehr smooth, d.h. es rollt echt gut. Sehr gut sind auch die Übergänge vom Flat in die Rampe. Alles Edelstahlplatten, welche sehr genau eingepasst sind. Von daher hat nur ein minimales "Geruckel", wenn man auf rauf oder von der Rampe runter fährt. Auch sehr gut.

Was nicht so gut ist, ist die Funbox. Das Grundlayout, zwei Banks mit Corner, zwei Quarter mit Corner, ist zwar voll ok bzw. sogar eigentlich sehr gut - aber die Funbox ist nach meinem Erachten für die Größe des Parks zu hoch (auch wenn es auf den Fotos nicht danach aussieht). Dadurch bedingt ist auch, dass zumindest die Quarters sehr steil sind und man auch ziemlich viel Schwung braucht, um oben auf oder über die Funbox zu kommen.


Die Spineramp ist auch ziemlich hoch geraten - und schmal. Also man bekäme schon genug Schwung, um rauf und rüber zu kommen. Aber mehr als ein paar simple Liptricks sind da nicht drin, weil eben zu schmal.

Das Grindrail ist hingegen ziemlich flach (ist auf den Fotos übrigens gar nicht zu sehen), steht aber leider auf einer abfallenden Fläche. Dadurch ist es recht schwer, die Geschwindigkeit bei der Anfahrt gut zu kontrollieren.

Die Quarterpipes sind ok. Durch den guten Belag kommt man bei beiden bis oben. Bei der höheren (der orangen) muss man aber schon ziemlich pushen , wenn man für einen Liptrick richtig Schwung braucht.

Insgesamt ist der Skatepark auch nicht sonderlich groß. Was eigentlich auch überhaupt nicht schlimm ist. Nur stehen dadurch die Rampen relativ eng, was in Anbetracht der Höhen dieser das Fahren nicht einfacher macht.

Letztendlich ist (fast) jeder Skatepark besser als keiner. Und man kann in dem in Walmerod / Molsberg auch ganz gut umher cruisen. Aber wer ernsthaft auf den Rampen tricksen will sollte schon halbwegs gut fahren und Erfahrung in ähnlichen Skateparks haben. Sonst ist das alles ein wenig zu hart. Anfänger werden auf den Rampen jedenfalls keinen wirklichen Spaß haben.

Fall der Park mal erneuert werden sollte noch ein Tipp an die Planer: manchmal ist weniger (in diesem Fall Höhe der Rampen) auch mehr...

Zum Abschluss noch zwei Fotos, die alle Rampen aber nicht das Grundrail zeigen. Beim  1. Foto stehe ich auf der blauen Quarter, beim 2. auf der orangen.



Sonntag, 6. November 2011

Sick Of It All "Nonstop" - Rezension & Rückblick

Sick Of It All wurde 1986 gegründet, also feiert man dieses Jahr das 25-jährige Bandjubiläum. Das schaffen nicht so viele Bands, und schon gar nicht aus dem Hardcore und Punkrock Umfeld.

Zusätzlich ist SOIA nach wie vor populär und beliebt. Seit über 20 Jahren ist SOIA die Band, die mit New York Hardcore gleichgesetzt wird. Dabei ist SOIA "everybody's darling", Lichtgestalt der Szene und Messlatte für andere (neue) Hardcorebands - und das durchweg und ausschließlich im positiven Sinne!

Aber nichts desto trotz ist es so, dass ich bisher keine CD von SOIA besessen habe. Ich hatte mal eine, die habe ich aber wieder verkauft. Grund: irgendwie kann ich aus irgendeinem Grund deren Musik nicht einfach so hören. Gleichzeitig ist aber SOIA die Band, die ich am häufigsten live gesehen habe. Mindestens 4x (vielleicht auch 5x? Ist teilweise lange her...). Und zwar 2008 und 2010 auf dem Mach1 Festival und mindestens zweimal Mitte der Neunziger des letzten Jahrhunderts.

Dabei ist mir das Konzert 1995 in der Zeche Karl in bester Erinnerung geblieben. Grund: Rückblickend war das eine Hardcore Supershow. Erste Vorgruppe waren die damals noch unbekannten H2O (wobei der Sänger Toby während der Show pausenlos Biohazard, damals eine ganz große Nummer, durch den Kakao gezogen hat), dann kam CIV (wer sie nicht kennt: ein weiteres Urgestein des NYHC) und dann der Headliner Sick Of It All. Hardcore de luxe, der Saal kocht non-stop. Ein guter Abend!

Aber ich schweife ab... Es geht ja eigentlich um die Ende Oktober 2011 erschienene SOIA CD "Nonstop". Die habe ich mir auch gekauft. Nicht, dass ich diese jetzt nur noch höre. Wahrscheinlich eher nicht. Aber ich denke, dass ist ein "must have" in der Plattensammlung des Hardcore-geneigten Menschen.

"Nonstop" enthält dabei keine neuen Tracks. Viel mehr ist es ein "Best of" Album, wobei alle Tracks neu aufgenommen wurden. Dadurch klingen die Songs alle frisch und sind in Teilen etwas schneller und härter, wie SOIA die Songs eben auch live performt. Insgesamt sind 21 Tracks auf dem Longplayer, aus allen "Epochen" der Band.

Fazit: Wer Hardcore hört, keine Allergie gegen NYHC hat und nicht eh' schon alle CDs von Sick Of It All besitzt, der sollte sich "Nonstop" zulegen.


Samstag, 5. November 2011

Bottle, WTForms und Datei-Uploads

Wer Webanwendung schreibt kommt wahrscheinlich auch irgendwann mal an den Punkt, wo dem Anwender die Möglichkeit gegeben wird, Dateien auf den Server hoch zuladen. Natürlich bietet mein derzeit favorisiertes WSGI-Framework Bottle auch Funktionen an, um dies zu realisieren. Ebenso bietet mein derzeit favorisiertes HTML Form Framework WTForms eine entsprechende Klasse an. Um die "Hochzeit" der beiden geht es in diesem Blogeintrag.

Letztendlich ist das alles kein großes Ding - die jeweiligen Dokumentationen (Link und Link) sind zwar kurz, aber aussagekräftig. Aber ich kann ja trotzdem ein paar Stolpersteine aus dem Weg räumen.

Dazu im folgenden eine kleine Beispielapplikation. Diese besteht aus drei Dateien:
  • myapp.py, welche die eigentliche Applikation ist
  • forms.py, welche die Definition der Formularklasse enthält
  • formtemplate.tpl, welche das Template für die Formulardarstellung enthält
Die Datei "forms.py" sieht dabei so aus:

# -*- coding: utf-8 -*-

import re
from wtforms import Form, FileField, TextField, SubmitField,\     validators

class AttachmentForm(Form):
    attachment = FileField(u'Datei',
        [validators.regexp(r'.+\.(jpg|pdf|png|docx|doc|txt)$',
        flags=2,
        message=u'Es sind nur Dateien mit der Endung jpg, pdf,\
        png, docx, doc und txt erlaubt!')])
    textfield = TextField(u'Bemerkung',
            [validators.Required(
             message=u'Es muss ein Text eingegeben werden!'),
             validators.Length(max=50,
             message=u'Der Text darf nicht länger als 50 Zeichen\
             sein.')])
    send = SubmitField(u'Senden')

    def validate_attachment(form, field):
        if field.data:
            field.data = re.sub(
                r'[^a-zA-Z0-9_.-]', '_', field.data)

Der Regex-Validator kann natürlich nach belieben geändert (oder weg gelassen) werden. Gleiches gilt für das Textfeld namens "textfield", welches hier jedoch verwendet wird, um später den Unterschied Formulardaten und Upload-Daten deutlich zu machen (siehe unten). Der Validator "validate_attachment" ist auch optional - aber hier durchaus sinnvoll. Es validiert nämlich nicht, sondern ersetzt einfach alle (Sonder-) Zeichen im Dateinamen, welche später Probleme machen könnten, durch einen Unterstrich.

Das Template "formtemplate.tpl" sieht so aus:

<html>
<head>
<title>Datei-Upload</title>
</head>
<body>
<h2>Datei-Upload</h2>
%if errors:
<p class="fehler">Die Eingabe enthält <a href="#fehler">Fehler</a></p>
%end
<form action="/upload" method="post" enctype="multipart/form-data">
<ul>
<li>{{!form.attachment.label()}}<br/> {{!form.attachment(size=75)}}</li>
<br/>
<li>{{!form.textfield.label()}}<br/> {{!form.textfield(size=50)}}</li>
</ul>
<p>{{!form.send()}}</p>
</form>
<p>Hinweis: Alle Zeichen im Dateinamen, welche nicht im Bereich a-z, A-Z, 0-9, _, - und . enthalten sind, werden durch einen Unterstrich _ ausgetauscht. Dies betrifft also auch die Zeichen ä, ö, ü und ß sowie das Leerzeichen.</p>
%if errors:
<p style="color: #ff0000;">Fehler:</p>
%for k,v in errors.iteritems():
<p>{{!form[k].label}}: {{!v[0]}}</p>
%end
%end
</body>
</html>

Auch hier gibt es nicht außergewöhnliches. Es gibt ein rudimentäres HTML-Gerüst, das Formular an sich inklusive Hinweistext und die Anzeige von Fehlern im Formular, sofern dieses Fehler hat.

Die Hauptdatei "myapp.py" sieht so aus:

#!/usr/bin/env python

import os
from bottle import route, template, request, run, debug
import forms

PATH = '/home/noisefloor/attachment'

@route('/upload')
@route('/upload', method='POST')
def upload():
    req = request.forms
    data = request.files.get('attachment')
    form = forms.AttachmentForm(req)
    try:
        form.attachment.data = data.filename
    except:
        form.attachment.data = None
    if not req or not form.validate():
        return template('formtemplate.tpl',
            form=form,errors=form.errors)
    else:
        raw = data.file.read()
        with open(os.path.join(PATH, data.filename),'wb') as f:
            f.write(raw)
        return u'Datei {0} gespeichert, Bemerkung: {1}'.format(
            data.filename, form.textfield.data)

if __name__ == '__main__':
    debug(True)
    run(reloader=True)

Ein paar Anmerkungen sind hier zu machen:

Bottle hält die Daten des Dateiuploads unter request.files vor, während die Formulardaten über request.forms abrufbar sind. Dabei ist zu beachten, dass auch der Dateiname der herauf geladenen Datei nicht in request.forms liegt, sondern in ebenfalls in request.files. Es ist in der Tat nur der eigentliche Name der Datei dort hinterlegt, ohne den (lokalen) Dateipfad, von der die Datei hoch geladen wurde.

Von daher ist auch die Zeile

form.attachment.data = data.filename

wichtig, da so der Dateiname in die Formulardaten geschrieben wird. Ohne diesen Schritt würde das Formular nie validieren, da "attachment" ein Pflichtfeld ist.

Werden die Formular- und Uploaddaten übermittelt und Validiert das Formular, dann wird die Datei lokal gespeichert. Wichtig ist hier, dass der Benutzer, unter dem die Anwendung läuft, auch Schreibrechte in dem entsprechenden Verzeichnis hat.

In einer realen Anwendung würde man die Zeile

raw = data.file.read()

vielleicht nicht alleine so verwenden, da der Upload von sehr großen Dateien zu Problemen wie z.B. einem komplett vollem RAM führen kann. Von daher wird in der Bottle-Dokumentation ebenfalls vor dieser Zeile gewarnt.

In der Beispielanwendung wird das Feld "textfield" nicht weiter verwendet. In einer realen Applikation würde man diese z.B. zusammen mit dem Dateinamen in einer Datenbank speichern.

Zusammenfassend kann gesagt werden, dass die Kombination von Bottle und WTForms auch für Dateiuploads nicht weiter schwierig, sofern man einige wenige Punkte beachtet.

Donnerstag, 3. November 2011

ZZ Top "A Tribute from Friends" - Rezension

Als ich letzthin so durch die CD-Regale eines WalMarts in den USA schlenderte viel mir diese CD auf: ZZ Top "A Tribute from Friends". Kleiner Preis von weniger als 10$ und noch hinreichend "Luft" auf der Kreditkarte - der Kauf ist besiegelt.

ZZ Top habe ich schon ganz ganz früher gehört. Die gehörten so ziemlich zu meinen ersten Platten, neben den frühen Alben von Queen. Gut, heute höre ich beides kaum noch. Aber so gepflegter Blues-Rock a la ZZ Top ist immer noch was feines.

Die CD ist wohl dieses Jahr 2011 erschienen und auch von den drei Jungs von ZZ Top produziert. Könnte natürlich auch eine von den "wir machen nochmal 'ne schnelle Mark auf unsere alten Tage" Nummer sein. Aber - Entwarnung - ist es nicht. Die CD ist gut!

Insgesamt sind 11 Tracks auf der CD, alles Cover-Versionen von ZZ Top Klassikern. Unter den Covernden sind durchaus namhafte Musiker vertreten wie z.B. Steven Tyler, Nickelback, Filter, Wyclef Jean oder auch Duff McKagan.

Musikalisch sind die meisten Tracks recht nah an den Originalen. Teilweise mit etwas modernerem Sound, teilweise mit leichten, individuellen Interpretationen. Aber alles gut zu hören, nichts ist entstellt oder verunstaltet. "Richtig" anders sind nur zwei der 11 Stücke: einmal das von Wyclef Jean, welches, wie auch nicht anders zu erwarten, Hip Hop lastig ist und die Coverversion von "Gimme all your lovin'", performt von Filter.

Letzteres, als der Track von Filter, ist mein absoluter Favorit. Hier gelingt das Kunststück, den Sound und Stil von Filter mit dem Song von ZZ Top so zu "mischen", dass beides voll erkennbar ist. Die Strophe ist eher ruhig und Elektro-lastig, die Refrain knallt dann so richtig. Sehr gut gemacht!

Die CD ist wohl auch in Deutschland erhältlich, jedenfalls hat Amazon sie im Programm. Wer ZZ Top mag oder generell ein Freund des gepflegten Blue Rock ist, dem kann der Kauf durchaus empfohlen werden.

Mittwoch, 26. Oktober 2011

Stecker rein - kein Sound im Ohr

Heute durfte ich meinen ersten echten Bug von Ubuntu im Zusammenspiel mit meiner Hardware (Lenovo R61) erleben: Wenn man Kopfhörer einsteckt hört man darauf nichts - egal, welche Lautstärke eingestellt ist. Entfernt man diese, kommt der Ton wieder normal aus den Lautsprechern.

Aber wie sagt man so schön: "Irgendwann ist immer das erste Mal" (und direkt 2,- Euro ins Phrasenschwein)

Ein Blick auf Launchpad verrät, dass ich nicht der einzige mit dem Problem bin (siehe Bug 868915, 830641 und 829843) sowie das der Bug nicht Lenovo-spezifisch ist. Im Bugreport 830641 wird empfohlen, ein neues Paket aus "ubuntu-audio-dev" zu installieren. Bringt aber (bei mir) genau gar nichts. Also habe ich das Paket direkt wieder deinstalliert.

Als gutes Mitglied der Community und genervt vom Bug beschließe ich darauf hin, auch einen Bugreport zu erstellen. Das geht - was mir bis dahin auch so nicht bewusst war - mit dem Terminalbefehl "ubuntu-bug audio" für Audioprobleme. Darauf hin startet apport, sammelt interaktiv Infos und startet Launchpad im Browser. Der Bugtracker in Launchpad hat mich dann freundlich darauf hingewiesen, dass es das Problem schon gäbe (Bug 876020) und ob mein Problem nicht das gleiche ist. Ist es auch.

Glücklicherweise wird dort auch die Lösung präsentiert, die auch ganz einfach umzusetzen ist: in der Datei /etc/modprobe.d/alsa-base.conf ist nur die folgende Zeile hinzuzufügen:

options snd-hda-intel model=generic

Danach neu booten und es funktioniert. Tight.

Außerdem ist der Sound jetzt, sowohl für Lautsprecher als auch Kopfhörer, in deutlich feineren Abstufungen einstellbar. Vorher (also ohne die Zeile in der Datei) war das ein wenig "holprig" und tendenziell zu leise, selbst bei einer Einstellung von 100% Lautstärke.

Samstag, 22. Oktober 2011

Upgrade auf Oneiric mit Umweg

Heute habe ich meinen privaten Laptop (Lenovo R61) auf Oneiric gehoben. Nachdem eine Neuinstallation auf dem anderen Laptop problemlos war lief es diesmal nicht ganz rund.

In diesem Fall sollte eine bestehende Natty-Installation via Dist-Upgrade auf Oneiric aktualisiert werde. Der Weg der Wahl war die Kommandozeile (wenn jetzt jemand fragt: "Warum Kommandozeile und nicht Aktualisierungsverwaltung?" lautet die Antwort "Weil ich a) gleichzeitig was für's Wiki von ubuntuusers.de testen wollte und b) theoretisch am Ende des gleiche raus kommt".)

Nun gut, alles vorbereitet und dann auf der Kommandozeile sudo do-release-upgrade aufgerufen - und los geht's. Aufgrund einer schmalbrüstigen DSL-Anbindung (dafür liegt das Dorf wo ich wohne aber landschaftlich sehr schön ;-) ) dauert der Download von rund 870 MB für das Upgrade ca. 2,5 Stunden. Nachdem dieser fertig ist wird alles entpackt mit der eigentlichen Installation der Pakete begonnen. Da das bekanntlich alles automatisch läuft sitzt ich auch nicht die ganze Zeit vor dem Rechner.

Irgendwann will ich aber mal den Status prüfen - der der Bildschirm bleibt dunkel. Der Computer macht zwar irgendwas, zu erkennen an der sporadisch blinkenden HD-Lampe und dem ebenfalls blinkenden WLAN-Symbol, aber regieren tut er nicht. Auch der Wechsel auf einen anderen Terminal ist nicht möglich. Nach ein wenig hin und her drücke ich schließlich den Power-Knopf. Da die bestehende Installation an sich nichts wichtiges enthält und alle Daten auf einer separaten Home-Partition sind, welche zusätzlich gebackupt ist, habe ich da auch kein größeres Problem mit.

Der Neustart funktioniert sogar, also wurde wohl bisher weder das GRUB2 Bootmenü neu geschrieben noch der neue Kernel installiert. Der Bootvorgang ist aber extrem langsam, was wahrscheinlich dem Mix aus alten und neuen Libs / Programmen geschuldet ist und bis zum Login-Bildschirm kommt ich auch nicht. Also muss der nächste Neustart her.

Diesmal wähle ich den "Recovery Modus", der auch ohne Probleme fix bis zum Shell-Prompt bootet. Die das Upgrade "nur noch" zu Ende geführt werden muss gebe ich dpkg --configure -a und es rennt weiter. Diesmal auch ohne Probleme und bis zum Schluss. Der folgende Neustart läuft durch und bringt mich zum neuen Login-Manager. Login ist kein Problem, Unity startet, alles da, alles drin. Glück gehabt? Vielleicht.

Woran es jetzt letztendlich lag, dass der erste Upgrade-Vorgang hängen geblieben ist - keine Ahnung. Ich vermute, dass entweder ein Neustart des X-Servers nicht funktioniert hat oder das Ausblenden des Bildschirms nach 5 min zwecks Energieeinsparung Probleme macht. Sicherheitshalber werde ich das wohl beim nächsten Mal zumindest für das Dist-Upgrade deaktivieren, so dass der Bildschirm immer da ist.

Noch eine kleine Anmerkung zum Upgrade: Zumindest bei mir wurden der alten Login-Manger gdm nicht automatisch entfernt. Ein apt-get purge gdm hat das nachträglich erledigt und keinerlei Probleme verursacht.

Sonntag, 16. Oktober 2011

Ubuntu Oneiric 11.10 - der erste Kontakt

Heute morgen habe ich mir die aktuelle Ubuntu Version "Oneiric Ocelot" auf eine freie Partition auf meinem Arbeitslaptop installiert. Produktiv ist da Lucid drauf, Oneiric "nur aus Spaß". Das Update auf meinem privaten Laptop kommt vielleicht später.

Jetzt habe ich Oneiric ca. 1h genutzt, im folgenden der "First contact report".

Installation

Der erste Überraschung hatte ich bei der Installation: Ubuntu erkennt die Webcam des Lenovo T410 out of the box und bietet dann an, zusätzlich zu den einzugebenden Nutzerinformationen für den Login ein Foto zu schießen. Nettes Gimmick. Ok, nicht wirklich wichtig, aber trotzdem nett. Ansonsten hat sich beim Installer nicht viel geändert.

Die Installation ist dann so durchgelaufen und der Neustart wird eingefordert. Dummerweise hatte ich vergessen anzugeben, dass Oneiric den vorhanden Bootloader nicht überschreiben soll (oder es wurde nicht gefragt?) - egal, jetzt ist halt GRUB 2 drauf. Beim Booten kam dann nach dem GRUB2 Menü eine Fehlermeldung, dass ein "Sparse File" nicht stimmt (oder so ähnlich). Keine Ahnung, was das heißt. Da das System aber trotzdem ohne Probleme korrekt bootet, kann ich mich da auch später drum kümmern...

Softwarecenter

Da ich bei der Installation auch vergessen hatte, dass System auf Deutsch umzustellen, ist jetzt erst Mal alles komplett auf Englisch. No problem, aber auf Dauer ist Deutsch schon schöner. Daher nutzte ich nach dem Login direkt die Gelegenheit und öffne das Softwarecenter, welches neben der Kommandozeile mit apt-get die einzige Möglichkeit ist, Software nach der Standardinstallation zu installieren. Synaptic ist mit Oneiric nicht mehr auf der Platte, aptitude so wie so nicht mehr. Da ich das Softwarecenter vorher nicht genutzt habe also noch ein neues Erlebnis. Wenn das mal nicht in einer Reizüberflutung endet...

Erstes Fazit Softwarecenter: Ist ok. Relativ intuitiv zu bedienen. Wobei der Fokus wohl eher auf der Installation von Programmen liegt, weniger auf der von Libs. Letzteres geht zwar natürlich auch, aber es ist nach meinem Empfinden darauf ausgelegt, Programme für den Einsatzfall XYZ zu finden. Na ja, ist ja auch kein Wunder, wenn Canonical darüber auch Software verkaufen will. Jedenfalls sieht es im Moment aber so aus, dass ich Synaptic nicht nachinstallieren werden.

Unity & Optik

Kommen wir mal zum eigentlichen Punkt: Unity. Die große Spannung bei Oneiric war / ist ja: Was macht Canonical aus Unity? Probleme hatte ich auch mit Unity unter Natty keine (letztendlich ist die Desktop-Oberfläche auch nur Mittel zum Zweck ;-) ), aber ich muss sagen: Mit Oneiric sind einige Dinge besser bzw. runder. Augenfällige, riesige Änderungen gibt es in meinen Augen keine, vielmehr werden  viele Dinge, welche mit Unity unter Ubuntu 11.04 begonnen wurden, konsequent weiter geführt. Somit ist vieles "runder", "schöner" etc. Wobei ich jetzt hier noch nicht mal eine spezielle Sache herausheben kann (und will), sondern vielmehr finde, dass der Gesamteindruck stimmiger ist. Zumindest für mich.

Was schon praktisch ist, ist dass man zwischen den offenen Anwendungen per Tastenkombination ALT+TAB wechseln kann. Wobei: Wenn ich mich nicht völlige irre konnten das die frühen Windowsversion auch, bei der aktuellen weiß ich es nicht.

Sonstiges

Ansonsten habe ich bis jetzt nichts augenfällig Neues bemerkt. Oder doch: Nautilus sieht etwas anders aus. Habe ich aber noch nicht aktiv genutzt, daher kann ich hier nichts dazu sagen. Natürlich sind die vorinstallierten Programme aktualisiert, Details sind z.B. im Wiki von ubuntusers.de zu finden.

Fazit

Nun gut, für ein echtes Fazit ist es viel zu früh, aber ein Zwischenstand geht: Oneiric ist solide nutzbar, no drawbacks found yet. Jedenfalls werde ich meinen privaten Laptop auch bei nächster Gelegenheit auf Oneiric upgraden. Spricht nichts gegen.

Donnerstag, 13. Oktober 2011

Face to Face "Laugh now, laugh later" - Rezension

"Laugh now, laugh later" ist der erste Release von Face to Face seit 9 Jahren, erschienen im Mai 2011. Gut, die Band gab es davor auch ein paar Jahre nicht mehr.

Für alle, die Face to Face nicht kennen: Es ist eine Punkrock-Band aus Kalifornien. Spielen, typisch für West-Coast Punk, eher entspannt und sind dazu noch ein wenig poppig. Also kein wildes "Geschrabbel", sondern eher das Easy-Listening des Punkrocks.

Das vorletzte Album, "How to ruin everything" von 2002 gefällt mir bis heute sehr gut. Schön zu hören, positive Grundstimmung und trotzdem punkig. "Laugh now, laugh later" kann schon ziemlich gut daran anschließen, ist aber nach meinem Geschmack nicht ganz so gut. Vielleicht 90% Zielerreichnung oder so - was ja auch schon was ist.

Die ersten beiden Stücken gehen zwar ab, danach wird es aber stellenweise etwas ruhiger. Aber es ist immer punkrockig, Balladen oder so findet man nicht. Nun gut, die Zeit bleibt nicht stehen und musikalisch muss es ja auch weitergehen. Die Gesamtspielzeit beträgt 35 Minuten, was für diese Genre durchaus normal ist.

Anspieltipps von meiner Seiten sind die Tracks 1,2 und 9. Die ersten beiden gehen wie gesagt relativ straight nach vorne, letzterer ist sehr feiner Pop-Punk.

"Laugh now, laugh later" ist auf jeden Fall ein gutes, poppiges Punkrockalbum. Wer Face to Face von früher her mag braucht auch dieses Album. Wer sonst auf diese Musikrichtung steht sollte mal reinhören.

Feueralarm

Ich habe schon in oft in Hotels in diversen Ländern dieser Erde geschlafen. Letzte Nacht gab es aber ein Novum: Feueralarm! Zu nachtschlafender Zeit, nämlich um ziemlich genau 3 Uhr morgens.

Wer so was nicht kennt: Die Notbeleuchtung geht im Zimmer an und es kommt ein penetranter, recht lauter Piepston in regelmäßigen Intervallen. Also schnell ein paar Sachen geschnappt (Geld, Handy, Pass) und ein paar Dinge angezogen (Schuhe, Hose, Shirt) und ab nach draußen. Wie sich das gehört mit Ruhe und nicht in Panik.

Das ganze ging so wie so sehr ruhig ab - alle sind gegangen, kein Geschrei, kein Gerenne. Sehr gut.

Beim Rausgehen war aber schon was klar, dass es nicht brennt, sondern "nur" im Sprinklersystem irgendwo Überdruck ist, wohl bedingt durch den Stromausfall, welchen es am Abend vorher gab.

Na ja, nach 2 min kam die Polizei, nach ca. 5-6 min der Löschzug des AHFD (Arlington Heights Fire Department). Zwei Leute mit Atemschutz und einer ziemlich großem, martialischen Axt rein ins Hotel. Nach einer weiteren Minute stand fest, dass es wirklich nicht brennt.

Die Feuerwehr hat trotzdem das Hotel einmal gecheckt und irgendwas am Sprinklersystem gemacht. Nach ca. 25 min konnten wir dann auch wieder ins Zimmer.

Auch wenn's ein Fehlalarm war - danach habe ich nicht mehr sooo tief geschlafen. Aber immerhin war es Fehlalarm - besser als ein echtes Feuer.

Im folgenden nach ein paar "Impressionen". Leider ist die Bildqualität nicht so gut, weil mit Handy und nachts fotografiert...

Feuerwehrwagen des AHFD

2. Feuerwehrwagen des AHFD

Sonntag, 9. Oktober 2011

Warum ich Shotwell mag...

Wie vielleicht bekannt ist nutzte ich privat zu 99% Ubuntu, und dort am liebsten das Ubuntu ootb. Also auch die Standardprogramme.

In Bezug auf die Software zur Fotoverwaltung gab es unter Ubuntu des öfteren Änderungen. Am Anfang war gThumb an Bord, dann kam F-Spot und dann Shotwell, welches letztendlich mit Ubuntu 10.10 zum Standard wurde.

gThumb fand ich ok (und habe ich bis Maverick auch genutzt), F-Spot ging bei mir gar nicht. Zum einen fand ich die Bedienung schlecht, zum anderen - und viel schlimmer - ist F-Spot bei mir immer mal wieder abgestürzt. Das geht ja gar nicht!

Shotwell hingegen mag ich. Es bietet eine GUI, die genau das hergibt, was ich brauche und zu dem noch übersichtlich ist. Die Sortierung nach Aufnahmedatum und Tags ist echt praktisch.

Weiterhin finde ich die Funktion zur Autokorrektur super, weil sie für ca. 90% der zu korrigierenden Fotos ein gutes Ergebnis liefert. Und wenn's nicht passt: die manuellen Korrekturmöglichkeiten sind auch gut und auch für "Amateure" im Bereich der Bildkorrektur brauchbar (und ungefährlich - alles kann zurück gesetzt werden).

Sehr schön gelöst finde ich auch die Exportfunktion, mit der man ganz einfach Bilder beim Exportieren konvertieren und verkleinern kann. Und zu guter Letzt wird recht aktiv an Shotwell entwickelt.

Fazit: Weiter so! Ich mag Shotwell.

Samstag, 8. Oktober 2011

Evile "Fifth Serpant's Teeth" - Rezension

Nach dem mir die erste CD von Evile sehr gut gefallen hat, habe ich mir auch den neuesten Release, erschienen Ende September 2011, namens "Five Serpent's Teeth" zu gelegt.

Und - gefällt mir nicht! Während "Enter the Grave" noch sehr schöner Trash Metal im Stile von Slayer und der frühen Metallica war, ist "Five Serpent's Teeth" viel Heavy Metal und sehr wenig Trash. Besonders der Gesang hat sich geändert, die Intonierung ist ziemlich nah am ganz klassischen Metal. Mal ehrlich: wenn ich so was hören wollte, dann nehme ich ein CD von Iron Maiden oder Manowar...

Musikalisch ist auch nicht mehr viel von Slayer übrig, dafür klingt es ein bisschen mehr nach Metallica, so aus der "...and justice for all" Zeit.

Nur um Missverständnissen vorzubeugen: Der Release ist nicht schlecht im Sinne von grottenschlecht. Nur trifft er a) überhaupt nicht meinen Geschmack und b) hat er meine Erwartungshaltung in Bezug auf "Enter the Grave" nicht erfüllt.

Also lieber vorher mal intensiv in "Five Serpent's Teeth" reinhören, bevor der Kauf getätigt wird.

Dienstag, 20. September 2011

Easytag - ein Tagger für Audiodateien

EasyTAG ist wahrscheinlich einer der populäreren Editoren für Tags von Audio-Dateien. Dabei kann Easytag nicht nur mit MP3-Dateien umgehen, sondern auch mit diversen anderen Formaten, u.a. OGG Vorbis, Flac, MP4/AAC und ein paar weitere.

Eine ganz gute Einführung in EasyTAg gibt's im Wiki von ubuntuusers.de im Artikel zu EasyTag.

Screenshot des Hauptfensters

Viele der aktuelle Audioplayer können zwar auch Audiodateien Taggen, aber zumeist nicht so komfortable wie EasyTAG. Hier kann man nämlich mit wenigen Klicks ganz einfach die Daten für mehrere Dateien auf einmal setzen. Sehr praktisch, wenn man z.B. für viele Dateien gleichzeitig das Feld "Genre" ändern will.

Des weiteren hat EasyTAG den "Maskeneditor" an Bord. Dies ist ein sehr mächtiges Werkzeug, mit dessen Hilfe man in einem Rutsch aus Tags Dateinamen kreieren kann und auch umgekehrt, also mit Hilfe des Dateinamens Tags befüllen. Wie gesagt, der Maskeneditor ist recht mächtig - und wenn man nicht aufpasst kann man sich auch sehr schnell die Tags oder Dateinamen durcheinander bringen. Habe ich selber schon erfolgreich praktiziert...

Letztendlich ist es aber alles recht einfach, wenn man ein paar Punkte beachtet. Der Maskeneditor arbeitet mit Platzhaltern, welche den Dateinamen darstellen, der Generiert wird bzw. aus dem die Tags generiert werden.

Maskeneditor von EasyTAG
Wie im Screenshot zu sehen, wird hier ein neuer Dateiname basierend auf den Tags generiert. Sollten die erklärende Hilfe nicht angezeigt werden, so muss man auf das Fragezeichen klicken. Die Auswahl für das Füllen von Tags basierend auf dem Dateinamen funktioniert genau so, nur dass man dann im Auswahlfeld "Scanner" den Punkt "Fülle Tag" auswählen muss.

Wie gesagt kann man das auch für mehrere Dateien auf einmal machen. Dazu muss man lediglich im Hauptfenster von EasyTAG alle gewünschten Dateien markieren und dann den Maskeneditor öffnen.

Besonders beim Füllen von Tags sollte man tunlichst das Schema der Platzhalter 2x prüfen, bevor man die Tags schreibt. Dabei ist es auch wichtig, die Leerzeichen zu beachten!

Hat man jedenfalls das Schema festgelegt, so klickt man einmal auf die Schaltfläche, auf der im Screenshot der Mauszeiger steht. Dann werden die neuen Dateinamen generiert bzw. die Tags gefüllt -  aber noch nicht geschrieben (noch ist also nichts zu spät...). Zum endgültigen Schreiben muss man noch im Hauptfenster auf den "Speichern" Button klicken.

Fazit: EasyTAG ist ein leistungsfähiger Tagger für Audiodateien, welcher auch auch mehrere Dateien auf einmal bearbeiten kann. Lässt man bei dem Umgang mit dem Maskeneditor ein wenig Ruhe und Vorsicht walten, so ist auch das komfortable Neubenennen von Dateien oder das Füllen von Tags kein Problem.

Ach ja, ein paar Nachteile seien auch noch erwähnt: die Weiterentwicklung des Programms ist seit einiger Zeit ziemlich langsam. Und die Optik ist ein wenig altbacken...


Samstag, 17. September 2011

Red Hot Chilli Peppers "I'm with you" - Rezension

"I'm with you" ist die neuste CD von den Red Hot Chilli Peppers, erschienen Ende August 2011.

Zwischenruf: Wenn sich jetzt einer fragt, wieso ich was dazu schreibe... Ja, ich höre auch andere Musik als Hardcore und Punk. Zwar eher selten, aber ich bin auch den etwas ruhigeren Sachen nicht abgeneigt.

Zurück zum Thema: Die RHCP haben auf diesem Release einen neuen Gitarristen, Josh Klinghoffer. Und ob ihr's glaubt oder nicht - man hört es. Also nicht das Zweifel aufkommen: Die CD klingt immer noch nach den Red Hot Chilli Peppers, ohne Zweifel.

Um nochmal auf's Gitarrenspiel zurück zu kommen: Es klingt halt in Teilen "anders". Wobei "anders" nicht schlechter (oder besser) heißt, sondern halt wirklich anders. Ist halt schwierig zu beschreiben. Trotzdem hat der Release alles, was die Red Hot Chilli Peppers der letzten Jahr ausmacht: ein bisschen funky, ein bisschen groovy, ein bisschen popig, eingängig und trotzdem individuell. Spieltechnisch wie gewohnt auf hohem Niveau, also wieder sehr schöne Bassläufe, ein tolles Drumming usw.

Einen speziellen Anspieltip von der CD habe ich nicht. Liegt aber eher daran, dass ich so ruhigere Musik bevorzugt im Hintergrund hören, z.B. beim Programmieren.

Fazit ist jedenfalls: Wem die letzten CDs der RHCP gefallen haben, dem wird auch diese CD gefallen. Bzw. der sollte sich diese auf jeden Fall zulegen.

Montag, 12. September 2011

Battery "Only the diehard remain" - CD

Ok, die CD ist 1994 erschienen - ein bisschen spät für eine Rezension. Trotzdem habe ich sie erst seit ein paar Tagen neu. Liegt aber primär daran, dass mir bis vor kurzem nicht bekannt war, dass es eine  dritten Longplayer von Battery gibt. Den - wie ich jetzt weiß - 2. Release "Until the end" und den 3. und letzten Release "Whatever it takes" habe ich schon ziemlich lange.

Neu ist "Only the diehard remain" auf regulärem Wege kaum noch zu bekommen. Ich habe eine gebrauchte CD über eine Händler bei Amazon gekauft. Fast zum Neupreis, allerdings ist der Zustand auch neuwertig, von daher ok.

Zur CD: Der Titel "Only the diehard remain" ist selbst für Hardcore-Verhältnisse ein wenig martialisch. Sei's drum. Musikalisch hört man zwar, dass es Battery ist, wobei im direkten Vergleich zu den beiden oben genannten Folgealben dieser Release in Teil langsamer und düsterer ist. Teilweise erinnert es mich ein wenig an die Releases von Damnation A.D. Gut, da hat Ken Olden ja auch seine Gitarrenfinger im Spiel. Enthalten sind auf dem Release 11 Tracks mit einer Spieldauer von etwas weniger als 30 Minuten. Also quasi Hardcore-Standard.

Die CD ist sicherlich nicht schlecht, allerdings werde ich sie bestimmt nicht so oft wie die anderen beiden hören - die ich relativ oft und immer noch gerne höre. Nichts desto trotz ist meine Sammlung jetzt vollständiger. :-)

Sonntag, 4. September 2011

Cassandra und Python Teil 2 - der Objectmapper

Im ersten Teil des Artikels zur Nutzung von Cassandra mit Python wurde das pycassa-Modul beschrieben.

pycassa bringt zusätzlich auch noch einen Objectmapper mit, mit dessen Hilfe man Pythonklassen auf Column Families mappen kann. Als Beispiel Keyspace dient, wie im ersten Teil auch, "pydemo" und als Column Family wieder "pykontakt". Alle Beispiel werden in der Python-Shell ausgeführt.

Als erstes muss man natürlich pycassa wieder importieren:

>>> import pycassa

Danach legen wir die Klasse an, auf die später gemappt werden soll:

>>> class CFMap(object):
...        name = pycassa.String(default='nobody')
...        alter = pycassa.IntString(default=0)

Wie man sieht, muss man Datentypen aus pycassa / Cassandra zuordnen. Der Default wird immer dann eingesetzt, wenn man selber keine weiteren Vorgaben macht.

Jetzt wird einer Verbindung zum laufenden Cassandra-Server hergestellt sowie der Keyspace "pydemo" und Column Family "pykontakt" genutzt:

>>> pool = pycassa.connect('pydemo')
>>> cf = pycassa.ColumnFamily(pool,'pykontakt',
         autopack_values=False, autopack_names=False)

Wichtig sind die beiden Festlegungen von "autopack_values" und "autopack_names" auf "False" (der Default ist "True"), da im Falle von Mappings die automatische Konvertierung des Datentyps durch den Mapper erfolgt.

Jetzt kann man das eigentliche Mapping vornehmen:

>>> CFMap.objects = pycassa.ColumnFamilyMap(CFMap,cf)

Das Mapping kann man jetzt für neue Objekte nutzen:

>>> c = CFMap()
>>> c.key = 'User100'
>>> c.name = 'Susi'
>>> c.alter = 25

Das Objekt kann nun gespeichert werden:

>>> CFMap.objects.insert(c)
1315076828600806

und natürlich auch abgefragt:

>>> CFMap.objects.get(c.key).name
'Susi'
>>> CFMap.objects.get(c.key).alter
25

Die Defaultwerte werden immer dann eingesetzt, wenn man einer Spalte keinen Wert zuweist:

>>> c2 = CFMap()
>>> c2.key = 'User101'
>>> c2.name = 'Rainer'
>>> CFMap.objects.insert(c2)
1315077378894450
>>> CFMap.objects.get(c2.key).name
'Rainer'
>>> CFMap.objects.get(c2.key).alter
0

Über den Befehl multiget können mehrere Schlüssel auf einmal abgefragt werden, wobei das Ergebnis wie Dictionary abgefragt werden kann:

>>> erg = CFMap.objects.multiget([c2.key,c.key])
>>> erg
OrderedDict([('User101', <__main__.CFMap object at 0x7fe4bfa4ed90>), ('User100', <__main__.CFMap object at 0x7fe4bfa4edd0>)])
>>> erg['User100']
<__main__.CFMap object at 0x7fe4bfa4edd0>
>>> erg['User100'].name
'Susi'
>>> erg['User101'].alter
0

Über den Mapper könne auch Objekte gelöscht werden:

>>> CFMap.objects.remove(c2)
1315078335744352

Eine vollständige Übersicht über den Pycassa-Mapper findet man in der API-Referenz.

Hinweis: Alle Beispiele sind unter Python 2.6 mit Ubuntu 10.04, pycassa 1.1.1 und Cassandra 0.8.2 getestet.

Cassandra und Python

Ergänzend zum Cassandra-Artikel in FreiesMagazin 9/2011 werden hier noch zusätzliche Infos zur Nutzung von Cassandra mit Python gegeben.

Für alle, die den Artikel noch nicht gelesen haben sollten: Cassandra ist die Datenbank hinter Facebook (ist also für "großes" geschaffen), Open Source (in der Obhut der Apache Foundation unter Apache Lizenz) und hat ein interessantes, weil strukturiertes aber trotzdem flexibles Datenmodell.

Und natürlich gibt es auch ein Python-Modul namens "pycassa", mit dem man auf Cassandra Datenbanken zugreifen kann.

Installation

Die Installation ist mittels easy_install schnell erledigt:

sudo easy_install thrift
sudo easy_install pycassa

pycassa braucht das thrift-Modul, löst es als Abhängigkeit aber nicht selber auf, so dass man es selber händisch installieren muss.

Jetzt kann man via Python auf Cassandra zugreifen. Dazu muss man das Modul wie üblich importieren:

>>> import pycassa

Keyspace und Column Family anlegen

Um mit pycassa ein Verbindung zum Server herstellen, ein Keyspace anzulegen usw. benötigt man den "system_manager":

#Verbindung zum Server herstellen
>>> sys = pycassa.system_manager.SystemManager('localhost:9160')
#Keyspace "pydemo" anlegen, Replikation "SimpleStrategy" (=1)
>>> sys.create_keyspace('pydemo',1)
#Column Family "pykontakt" anlegen
>>> sys.create_column_family('pydemo','pykontakt')

Die gezeigten Befehle sind die "Minimalversion". Für eine vollständige Übersicht sollte man einen Blick in die zugehörige API-Dokumentation werfen.

Mit der Datenbank arbeiten

Jetzt kann man mit der Column Family arbeiten.

#Verbindung zur Datenbank und Keyspace "pydemo" herstellen
>>> pool = pycassa.connect('pydemo')
#Column Family "pykonakt" auswählen
>>> cf = pycassa.ColumnFamily(pool,'pykontakt')
#einige Spalten mit Wert eingeben
>>> cf.insert('User_1',{'name':'Susi'})
>>> cf.insert('User_1',{'alter':'25'})
#es ist auch möglich, mehrere Spalten auf einmal zu schreiben
>>> cf.insert('User_2',{'name':'Otto','alter':30})
>>> cf.insert('User_3',{'name':'Rainer','alter':'25'})

Es wurden also drei Schlüssel, "User_1", User_2", "User_3", angelegt und jeweils ein Wert in die Spaten "name" und "alter" geschrieben.

Die Werte können natürlich auch abgefragt werden:

#User_1 abfragen
>>> cf.get('User_1')
OrderedDict([('alter', '25'), ('name', 'Susi')])
#umgekehrte Reihenfolge
>>> cf.get('User_1',column_reversed=True)
OrderedDict([('name', 'Susi'), ('alter', '25')])
#nur eine Spalte abfragen
>>> cf.get('User_1',columns=['name'])
OrderedDict([('name', 'Susi')])
#Zeitstempel mit Abfragen
>>> cf.get('User_1',include_timestamp=True)
OrderedDict([('alter', ('25', 1312827347304141)), ('name', ('Susi', 1312827336484155))])

Wie man sieht ist das Ergebnis einer Abfrage vom Datentype OrderedDict, es kann darauf also wie auf ein Dictionary zugegriffen werden.

Im direktem Vergleich zum Cassandra-CLI übernimmt pycasssa dankenswerterweise die Konvertierung des Datentyps, d.h. beim Schreiben in die Datenbank wird alles automatisch nach "ByteType" konvertiert und beim Lesen wieder zurück nach UTF-8 usw.

Spalten indizieren

Cassandra unterstützt auch Abfragen über einen Index. Dazu muss die entsprechende Spalte aber zuerst explizit indiziert werden, was wieder über den weiter oben erwähnten SystemManager erfolgen kann:

>>> sys.create_index('pydemo','pykontakt',
'alter',pycassa.system_manager.BYTES_TYPE,index_name='alter_idx')

Hiermit wird im Keyspace "pydemo" aus der Column Family "pykontakt" die Spalte "alter" indiziert. pycassa.system_manager.BYTES_TYPE legt den Typ der Spalte fest, in diesem Fall BYTES_TYPE, den Defaulttyp. Die Angabe des Indexnames ist optional.

Mit einer so indizierten Spalte kann eine entsprechende Abfrage gestartet werden. Im folgenden wird nach Einträgen gesucht, bei denen das Alter gleich 25 ist.

#Suchausdruck festlegen
>>> alter_expr = pycassa.index.create_index_expression('alter','25')
>>> clause = pycassa.index.create_index_clause([alter_expr])
#Abfrage durchführen
>>> for key,user in cf.get_indexed_slices(clause):
...     print 'Schlüssel: %s' %key
...     print 'Name: %s, Alter: %s' %(user['name'],user['alter'])
...
Schlüssel: User_3
Name: Rainer, Alter: 25
Schlüssel: User_1
Name: Susi, Alter: 25

Natürlich ist es auch möglichen, Spalten oder ganze Schlüssel zu löschen:

#Spalte "alter" für "User_3" löschen
>>> cf.remove('User_3',['alter'])
1312829216114192
>>> cf.get('User_3')
OrderedDict([('name', 'Rainer')])
#Schüssel "User_3" komplett löschen
>>> cf.remove('User_3')
1312829235495355
>>> cf.get('User_3')
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python2.6/dist-packages/pycassa-1.1.1-py2.6.egg/pycassa/columnfamily.py", line 409, in get
raise NotFoundException()
pycassa.cassandra.c08.ttypes.NotFoundException: NotFoundException()

weiterführende Hinweise

Wie oben bereits erwähnt bietet pycassa wesentlich mehr Möglichkeiten als hier gezeigt. Für Interessierte sei ein Blick in die Dokumentation oder das ebenfalls online verfügbare, etwas ausführlichere, englischsprachige Tutorial (an dem sich dieses Tutorial hier auch orientiert) empfohlen.

Im zweiten Teil dieses Blogeintrags wird der ebenfalls in pycasse enthaltene Mapper gezeigt.

Hinweis: Alle Beispiele sind unter Python 2.6 mit Ubuntu 10.04, pycassa 1.1.1 und Cassandra 0.8.2 getestet.

Freitag, 26. August 2011

Unity & GNOME2 & ich

Das Thema ist ja immer noch einer Dauerbrenner, auch wenn GNOME 3 und dessen GUI zur Zeit etwas immer im Rampenlicht seht.

Ich selber nutzte zwei Laptops in etwa zu gleichen Teilen, was die Zeit davor angeht. Der eine läuft unter Ubuntu 10.4 LTS mit GNOME2, der anderen unter Ubuntu 11.4 mit Unity. Beides Standardinstallationen ohne Anpassungen. Lucid nehme ich primär zum Programmieren (weil der Server, auf dem die Software später landet, auch unter 10.4 läuft), Natty für private Sachen wie Fotos etc. Und natürlich beide Laptops für Internet, Chat u.ä.

Zum eigentlichen Punkt: Ich selber habe überhaupt keinen Probleme, zwischen Unity und GNOME2  hin- und her zu wechseln. Ich kann auch nicht behaupten, dass das eine oder das andere "besser" oder "effektiver" wäre. Bei Unity kann ich vielleicht etwas schneller zwischen geöffneten Programmen wechseln, weil ich die entsprechenden Tastenkombinationen inzwischen kenne. Das ist aber (für mich) ein marginaler Vorteil.

Klar, Design und Usebility sind Geschmackssache. Aber so gruselig ist Unity definitiv nicht, dass man "Gnome for life" sagen muss... Klar, es ist anders und neu, aber wer nicht offen für neues und anderes ist, bekommt so wie so irgendwann ein Problem.

Jedenfalls sehe ich der Sache gelassen entgegen und freue mich schon auf Oneric mit Unity. Es sollen ja ein paar Sachen geändert und verbessert worden sein. Mal sehen, ob der Flamewar "Unity vs. GNOME" mit dem Release von Ubuntu 11.10 wieder neu aufflammt. Vielleicht auch eher nicht, weil das GNOME-Projekt mit GNOME 3 ja auch einen "progressiven Steilpaß nach ganz vorne" geschlagen hat ;-)

Und wenn's wirklich nicht passt: Das aktuelle Xfce / Xubuntu gefällt mir auch gut... Die sind ja wenigsten Konservativ beim Desktop-Design. ;-)

Donnerstag, 25. August 2011

Earth Crisis "Neutralize The Threat" - Rezension

 Letzten Monat, Juli 2011, ist das neue Album "Neutralize The Thread" von Earth Crisis erschienen, der insgesamt neunte Longplayer (und gleichzeitig siebtes Studioalbum) der Band.

Zu Earth Crisis an sich muss man nicht viel sagen - eine der bekanntesten und einflussreichsten Hardcorebands der Neunziger. Soundmäßig war Earth Crisis immer etwas metalllastig - und ist es auch auf dem neuen Album immer noch.

Im Gegensatz zum letzten Album "To The Death" ist das neue Album weniger brachial. Am besten lässt sich "Neutralize The Thread" wohl als "die alten Earth Crisis mit zeitgemäßem Sound" bezeichnen. Und das klingt sehr gut!

Auf allen zehn Songs geben die Jungs richtig Gas und zeigen, dass sie immer noch zur 1. Riege im Hardcore / Metallcore gehören. Tightes Zusammenspiel mit harten Riffs, gepaart mit prägnantem Drumming und Karl Buechners Gesang - so kennt man Earth Crisis und deshalb mögen wir Earth Crisis.

Nach etwas mehr als 30 min ist die CD dann zu Ende. Nun gut, Hardcore Bands waren noch nie für Alben mit epischer Länge bekannt. Dabei ist die CD aber so abwechslungsreich und gut, dass man sie auch ohne weiteres direkt nochmal hören kann.

Meine Anspieltipps sind dabei der recht kurze Opener "Raise" und der Titeltrack "Neutralize The Thread".

Fazit: Wer Earth Crisis mag braucht die CD auf jeden Fall, wer metalllastigen Hardcore mag, der braucht die CD auch, da sie definitiv zu den "must have" Releases aus diesem Genre gehört.

Montag, 15. August 2011

Bottle: Dateinamen für dynamisch generierte PDFs übertragen

Ich habe diverse Python-basierte Webapplikation für das Firmenintranet programmiert, die PDFs (mittels ReportLab) generieren. Die PDFs schreiben ich dabei in ein StringIO-Objekt anstatt die Datei temporär auf Platte zu legen. Funktioniert auch alles soweit gut.

Das einzige "Problem" war, dass der Name des PDF nicht übertragen wurde, d.h. wenn man die Datei im Browser öffnet und dann speichern will schlagen Evince, Adobe Reader & Co. als Dateiname immer "pdf.pdf" (oder so ähnlich) vor. Nun gut, nicht wirklich tragisch, aber ein bisschen doof ist das trotzdem.

Die Lösung für das Problem ist dabei aber denkbar einfach - man muss nur von Hand den passende Eintrag im Response-Header setzen. Im Falle von Bottle, meinem aktuell favorisierten Webframework, sieht das so aus:


from bottle import response, ...
...
#Buffer-Objekt anlegen
buf = cStringIO.StringIO()
#hier kommt der Pythoncode zur PDF Generierung
...
#Senden vorbereiten
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment;filename={0}'.format(pdf_filename)
#und Senden
return  buf

Wie gesagt, sehr einfach. "pdf_filename" enthält dabei den eigentlichen Dateinamen. Funktioniert natürlich auch genau so mit allen anderen Dateitypen.

Freitag, 5. August 2011

Skatepark Dornumersiel

Letzthin waren wir (Familie) im Urlaub in Norddeutschland. Da ich wusste, dass in Dornumersiel ein Skatepark ist, habe ich direkt mal mein Skateboard und meine Skateschuhe eingepackt.

Und - es hat sich gelohnt! Der Skatepark ist zwar nicht groß, aber echt klasse! Klasse in so fern, als das die Rampen einfach zu fahren sind, so dass auch Einsteiger, Gelegenheitsskater und alte Leute (die letzten beiden Punkte treffen auch mich zu ;-) ) Spaß haben können.

Der Park besteht aus einer zentralen Funbox, die auf einer Seite aus einer relativ flachen Pyramide und auf der anderen Seite aus einer Rampe und einer Bank besteht. Weiterhin gibt es einer Quarterpipe mit zwei Corners, eine kombinierte Quarterpipe mit Bank (ideal als Anlauf für die Funbox!), einer Grindbox mit "Auffahrt" und einem etwas zu hohen Rail.

Grindbox, kombinierte Quarter + Bank

Ollie über die Funbox, Quarterpipe im Hintergrund

Wie gesagt, es hat Spaß gemacht, auch wenn meine Skateschuhe dabei das zeitliche gesegnet haben...

Also, wer mal in der Nähe ist und sein Board dabei hat, der sollte im Skatepark Dornumersiel mal eine Runde fahren gehen. BMX-tauglich ist der Park übrigens auch.

Dienstag, 26. Juli 2011

Meine alten Skateschuhe - R.I.P.

Ich bin immer noch in tiefer Trauer... meine Skateschuhe sind nach 15 Jahren (oder vielleicht mehr?) kaputt gegangen. Trotzdem sie von der Markenfirma DC Shoes waren...

Nun gut - 15 Jahre halten die wenigsten Schuhe. Und Skateschuhe erst recht nicht. Wer sich jetzt wundert - die letzten 12-13 Jahre bin ich ziemlich wenig gefahren. Und mein Griptape ist ziemlich abgenutzt. ;-)

Anbei noch ein letztes Foto. Vielen von euch werden den Schuh wahrscheinlich gar nicht kennen. Wenn mich meine Erinnerung nicht täuscht waren das die mit als erstes erhältlichen DC Schuhe in Deutschland. Das Modell müsste das damalige Guy Mariana Signature Model sein. Kann mich aber auch täuschen...



Jedenfalls: R.I.P.