Archiv für September 2008

h1

Musik Daten per LastFM API in Python

September 30, 2008

Kennt jemand LastFM nicht? Das ist ein US-Radiosender, und nebenbei die wohl größte Internet-Musik-Community. Kennt jemand APIs nicht? Das sind Programmierschnittstellen, die bestimmte Dienste für Programmierer zu Verfügung stellen. So, da jetzt alles geklärt ist, will ich kurz erläutern wie man solche APIs in Python benutzt, und mit diesem Beispiel, wie man die Informationen zu einem bestimmten Album eines Künstlers rausfindet.

# Lastfm Api
# This class provides methods to get music information
# as well as general lastfm api access
# we use urllib and xml.dom.minidom to parse the information
import urllib2

import xml.dom.minidom

class lastfmApi():
  def __init__(self):
    self.apiUrl = 'http://ws.audioscrobbler.com/2.0/'
    self.apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    self.apiString = self.apiUrl + '?api_key=' + self.apiKey + '&method='

  def getXml(self, url):
    url = url.replace(' ','%20')
    return xml.dom.minidom.parseString(urllib2.urlopen(url).read())

  def getAlbumId(self, interpreter, album):
    # Build Api Request url e.g.
    # http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=xxxxxxxxxxxxxxxxxxxxxx&artist=Cher&album=Believe
    api_method = 'album.getInfo'
    api_interpreter = '&artist=' + interpreter
    api_album = '&album=' + album
    url = self.apiString + api_method + api_interpreter + api_album
    #Process xml
    doc = self.getXml(url)
    return doc.getElementsByTagName('id')[0].childNodes[0].data


  def getAlbumPlaylist(self, interpreter, album):
    albumId = self.getAlbumId(interpreter, album)
    api_method = 'playlist.fetch'
    api_playlist = '&playlistURL=lastfm://playlist/album/' + albumId
    url = self.apiString + api_method + api_playlist
    # Process xml
    doc = self.getXml(url)
    tracksXml = doc.getElementsByTagName('title')
    # Collect all titles in a list
    songlist = [title.childNodes[0].data for title in tracksXml]
    # Delete first element
    print songlist
    return songlist[1:]

Der Code erklärt sich größtenteils von selbst, es werden die Urls zusammengefügt und der XML Code verarbeitet. Die Funktion getXML kann man eigentlich für alles benutzen.

Nun könnt ihr Daten folgendermaßen abfragen:

>>> import lastfm_api as lastfm
>>> api = lastfm.lastFmApi()
>>> api = lastfm.lastfmApi()
>>> api.getAlbumPlaylist(‘The Cranberries’,'Wake up and smell the coffee’)
[u'The Cranberries - Wake Up and Smell the Coffee', u'Never Grow Old', u'Analyse', u'Time Is Ticking Out', u'Dying Inside', u'This Is The Day', u'The Concept', ....., u'Every Morning', u'Do You Know', u'Carry On', u'Chocolate Brown', u'dreams (live in paris)', u'promises (live in paris)', u'In the Ghetto (Non LP Version)']

Weiterführende Infos gibt es hier: http://www.lastfm.de/api

h1

Schlangen und Schildkröten – Die Turtle Library in Python

September 30, 2008

Erst vor kurzem war ich auf der Suche nach einer kleinen Libary für Python, mit der man Grafiken erstellen kann! Mit Turtle wurde ich dann fündig und war sofort von der simplen Implementierung begeistert! Hier ein kleines Beispiel:

from turtle import*
reset()
def zeichneQuadrat(seitenLaenge): # in Pixel
# zuerst das Quadrat selbst
forward(seitenLaenge)
left(90)
forward(seitenLaenge)
left(90)
forward(seitenLaenge)
left(90)
forward(seitenLaenge)
# noch ein kleiner Kommentar =)
up()
goto(200,0)
write("Das ist ein Quadrat!")

zeichneQuadrat(100)

Durch die einfachen Funktionen erklärt sich das Beispiel fast von selbst: Nach dem Importieren der Lib Turtle kann man gleich loslegen!

  • reset() erstellt euch ein leeres „Zeichenblatt“
  • mit forward(pixelanzahl) bewegt ihr den Stift nach vorn (auch backward() ist möglich)
  • left(grad)/right(grad) dreht den Stift um die angegebene Gradzahl
  • up() sorgt dafür das ihr vorübergehend nicht zeichnet wenn sich der Stift bewegt (kann mit down() behoben werden)
  • goto(x-position,y-position) gibt eine Stelle an, an die sich der Stift bewegen soll, 0,0 entspricht dabei der Mitte des Fensters
  • wirte(text) schreibt den gewünschten Text auf das Zeichenbrett

Natürlich gibt es noch viele weitere Funktionen, mit denen man sehr interessante Aufgaben bewältigen kann, zum Beispiel das Zeichnen von geometrischen Figuren oder Diagrammen (wobei letzteres ein wenig aufwendig wäre man nehme Google Charts API =P)

Wer mehr lernen will, informiere sich hier: http://home.foni.net/~heikos/tkinter/node2.html

h1

Apple Bashing

September 29, 2008

Eigentlich finde ich ja das iPhone ganz nett, aber irgendwo hat das Bild dann doch recht. Man kann nicht gerade behaupten, dass dieses Wundertelefon nicht an manchen Stellen zu wünschen übrig lasse.

h1

Latex Makefile + Vim und Evince

September 29, 2008

Ich hoffe der Titel ist nicht zu erschreckend, eigentlich will ich nur davon erzählen, wie ich mir das Editieren eines Latex Dokuments einfacher gemacht habe.

Der normale Bearbeitungsrythmus:

-editieren in Vim und speichern

-anderes Terminal aufrufen und „pdflatex text.tex“ ausführen

-Dokument mit „evince text.pdf“ öffnen

Abhilfe dieser Qual schafft da ein Makefile, welches wie folgt aussieht:

# Kleines Makefile zum Erzeugen eines
# PDF-Dokumentes aus einer Latex-Datei.

NAME = slide
INPUT = $(NAME).tex
OUTPUT = $(NAME).pdf

$(OUTPUT): $(INPUT)
        pdflatex $(INPUT)
        evince $(OUTPUT)

Jetzt tippe ich nur noch in Vim „:make“ und meine Latex Datei wird übersetzt und mir auch gleich angezeigt. Makefiles werden übrigens einfach unter dem Namen „Makefile“ gespeichert.

h1

persönlicher Uptimerekord oO

September 28, 2008

thomas@jane:~$ uptime
22:20:01 up 11:13,  5 users,  load average: 0.53, 0.54, 0.52

Jetzt gehts aber auch ins Heia-bettchen, 11 Stunden reichen denke ich für den Tag…

h1

Geschenke beim Google Developer Day

September 28, 2008

USBstick Kopf ab

Google shirtGoogle shirt hinten

Schlüsselband und Freikarten fürs Legoland

(Wer interesse an den Freikarten hat, kann sich ja mal hier melden :D )

h1

und der Blogger sprach:

September 28, 2008

(13:57:31) noqqe: habe grade einen richtig guten artikel über die neue form von intelligenz gelesen
(13:57:41) noqqe: heisst : „Google macht doof.“
(13:58:25) Thommy: zeig mal^^
(13:58:30) noqqe: wie solln das gehn
(13:58:36) noqqe: ist in der aktuellen NEON
(13:58:39) Thommy: aso dachte, n artikel im internet^^
(13:58:52) noqqe: ich steh nich so auf digitale medien^^

(noqqe.de)

h1

Kein Sound in Rythmbox und Totem

September 28, 2008

Seit einigen Tagen hatte ich keinen Sound mehr, allerdings nur in Rythmbox und dem Totem Player, bei Opera und gxine hat alles funktioniert.

Nach langem Suchen, kam ich zu folgender Lösung:

System – Einstellungen – Audio – Musik und Filme – PulseAudio-Soundserver

Berichten von anderen Usern nach, könnte allerdings auch ein Wechsel auf ALSA bei dieser Einstellung das Problem beheben, was bei mir allerdings nicht funktioniert hat.

h1

Python Unicode String Encoding

September 28, 2008

Schon hundertmal habe ich mich mit Fehlern rumgeschlagen, die ungefähr so aussahen:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 3: ordinal not in range(128)

Jetzt hab ich das Prinzip endlich verstanden: Wenn man von externen Quellen, zum Beispiel einer Webseite, einen String hat, dann muss man diesen encodieren und als Parameter nicht das gewünschte Format, sondern das Format angeben, welches der String hat (meistens dann utf8).

Beispiel:

print status.user.name.encode(‘utf8′)

Die Strings werden standardmäßig immer in Ascii umgewandelt, dieses Verhalten kann man aber auch ändern, und zwar wie folgt:

import sys
sys.setdefaultencoding(‘utf8′)

h1

awk – noch sone Scriptsprache?

September 27, 2008

Auf Wunsch von Charly schreibe ich also einen kleinen Artikel zu awk =)

Awk ist eine unübersichtliche, aber durchaus mächtige Scriptsprache. Zurzeit habe ich angefangen ein awk-Tutorial zu lesen, welches folgende Anwendungsgebiete für awk nennt:

  • Tallying information from text files and creating reports from the results.
  • Adding additional functions to text editors like „vi“.
  • Translating files from one format to another.
  • Creating small databases.
  • Performing mathematical operations on files of numeric data.

Awk-Scripte haben zwei mögliche Aufrufe, einmal kann man dem Interpreter eine Textdatei übergeben oder aber man schließt awk direkt in eine Pipe ein. Awk arbeitet dann den Text zeilenweise nach dem Muster, dass vom awk-script definiert ist ab und gibt das Resultat über die Standardausgabe aus.

Ein awk-Programm ist immer nach folgendem Muster aufgebaut (auch dem tutorial entnommen):

awk ‘BEGIN {<initializations>}
<search pattern 1> {<program actions>}
<search pattern 2> {<program actions>}

END {<final actions>}’

In die Zeile BEGIN kann man Variablen initialisieren oder ähnliches, man kann sie aber auch komplett weglassen. Dann folgen Zeilen, die jeweils mit einem Suchmuster beginnen. Das Suchmuster ist ein regulärer Ausdruck und wird auf jede Zeile angewendet. Trifft das Suchmuster auf eine Zeile zu, so werden die dahinter stehenden Befehle ausgeführt. Zu guter Letzt folgt eine Zeile END, die Befehle ausführt, nachdem alle Zeilen abgearbeitet worden sind.

Will man von einer Datei mit mehreren durch leerzeichen getrennten Spalten sich nur eine bestimmt ausgeben lassen, so tippt man:

awk ‘{print $1}’ dateiname

um sich die erste Spalte jeder Zeile ausgeben zu lassen.

Will man nur die erste Spalte von Zeilen lesen, die nicht mit einem # beginnen so tippt man:

awk ‘/^[^#]/ {print $1}’ dateiname

Ich finde awk irgendwie interessant, auch wenn ich dafür im Moment keine wirklichen Gründe nennen kann, weil ich die Sprache noch viel zu wenig kenne, aber selbst wenn man sie nicht interessant und gut findet – awk gehört einfach zum Linux-Allgemeinwissen und ist Pflicht für jeden Linux-Geek =)

Wer jetzt Interesse hat oder seiner ‘Pflicht’ als Linux-Geek nachkommen will, sollte sich einfach mal das Tutorial anschauen.