Daten|teiler
Kopieren als Kulturtechnik

Wissenswertes über Python: String-Formatierung

29. April 2011 von Christian Imhorst

Bekannterweise sind Verkettungen von Strings in Python, mit dem Plus-Operator (+) sehr einfach zu machen. Man kann auch eine Zahl mit einem String verketten, wenn man die Zahl vorher explizit mit str() in einen String umwandelt:

>>> s = 'Ich bin ein String'
>>> i = 123
>>> type(s)
<type 'str'>
>>> type(i)
<type 'int'>
>>> str(i) + ' ' + s + '!'
'123 Ich bin ein String!'

So praktisch sie auch sind, man sollte solche Verkettungen von Zeichenketten mit dem +-Operator vermeiden, da sie zu Lasten der Performance gehen. In Python sind Strings unveränderliche (immutable) Objekte, daher werden außer dem Ergebnis-String temporär weitere Strings angelegt, die hinterher von der Laufzeitumgebung wieder entsorgt werden müssen (garbage collection). In meinem Beispiel wird inklusive Ergebnis-String dreimal ein neuer String konstruiert und die beiden temporär erstellten Vorgänger werden wieder freigegeben. Dabei muss jedes Mal der Inhalt des alten Strings in den neuen kopiert werden, was alles zusammen Performance frisst.

Die Erzeugung des Ergebnis-Strings sollte man daher an einen String-Formatierer übergeben:

>>> '%d %s!' % (i, s)
'123 Ich bin ein String!'

Dabei sind %d und %s Platzhalter für den Inhalt der Variablen i und s. Die Platzhalter sind aber nicht frei wählbar, so steht %d für Dezimalzahlen, %s für Strings, %x für Hexadezimalzahlen, %e, %f und %g für Gleitkommazahlen. Bei der String-Formatierung entfällt nicht nur das Kopieren der String-Inhalte in neue Strings und das anschließende Aufräumen, sondern auch die explizite Typumwandlung der Ganzzahl in i in einen String mit str(), was einfach performanter ist.

Geschrieben in Python | Kommentare deaktiviert für Wissenswertes über Python: String-Formatierung

Das iPhone und die VirtualBox

22. April 2011 von Christian Imhorst

Gerade ist mir mal wieder aufgefallen, was das Problem war, wenn man versucht, einem iPhone mit iTunes über ein bekanntes Betriebssystem in der VirtualBox ein Update zu verpassen. Es funktioniert nämlich nicht so ohne weiteres. Dank eines „ID Change“ im Wiederherstellungsmodus wird die USB-Schnittstelle der VirtualBox während des Updates nicht mehr erkannt und man erhält folgende Fehlermeldung: „Ein unbekannter Fehler ist aufgetreten. Fehler 1604“

Um das Problem zu beheben, habe ich die aktuellste Version von VirtualBox installiert, indem ich unter Ubuntu 10.04 Lucid Lynx folgende Zeile in die Datei /etc/apt/sources.list eingefügt habe:

deb http://download.virtualbox.org/virtualbox/debian lucid contrib non-free

Anschließend habe ich den öffentlichen Schlüssel von Oracle heruntergeladen und VirtualBox installiert:

wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install dkms virtualbox-4.0

Bevor man die virtuelle Maschine wieder startet, muss man nach einem Rechtsklick auf die Maschine unter „Ändern“ und „USB“ noch einen USB-Filter hinzufügen, der im Feld „Hersteller“ die Zeichenfolge „Apple Inc.“ enthält. Dann wird die USB-Schnittstelle trotz „ID Change“ während des Updates wieder gefunden.

Mit diesen Vorbereitungen klappt das Update des iPhones über die VirtualBox ohne Probleme, so als würde man einen richtigen PC benutzen.

Geschrieben in Gnu/Linux, MacOS X und iPhone | Kommentare deaktiviert für Das iPhone und die VirtualBox

Wie man in Python ein App für SHR schreibt

19. April 2011 von Christian Imhorst

Für Python-Fans bieten die beiden Module Python-Elementary und Python-Evas eine schnelle und einfache Möglichkeit, grafische Oberflächen für den Enlightenment-Fenstermanager E17 und damit auch für das OpenMoko Betriebssystem SHR zu schreiben. Wer damit unter E17 experimentieren möchte, für den sind die beiden Module in Debian Sid (Unstable) bzw. in Experimental enthalten und unter Ubuntu ab 10.10 Maverick Meerkat, bzw. ab Linux Mint 10. In SHR sind sie schon dabei.

Für eine erste Hallo-Welt-Gui habe ich mich an das Elementary-Beispiel im Wiki von Enlightenment gehalten, das in C geschrieben ist, bzw. an das Beispiel im Wiki von SHR, das allerdings in VALA geschrieben wurde.

#!/usr/bin/python
#
# Example for a GUI written with Python-Elementary.
 
import elementary
import evas
 
class HelloWorldGui(object):
 
	def destroy(self, obj):
		# quit the window (mainloop)
		elementary.exit()
 
	def __init__(self):
		elementary.init()
 
		# new window - do the usual and give it a name, title and delete handler
		self.win = elementary.Window("HelloWorld", elementary.ELM_WIN_BASIC)
		self.win.title_set("Hello")
		# when the user clicks "close" on a window:
		self.win.callback_destroy_add(self.destroy)
 
		# add a standard background
		self.bg = elementary.Background(self.win)
		self.win.resize_object_add(self.bg)
		# do not allow bg to expand
		self.bg.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
		# add object as a resize object for the window
		self.win.resize_object_add(self.bg);
		self.bg.show()
 
		# add a box object - default is vertical. a box holds children 
		# in a row, either horizontally or vertically. nothing more.
		self.mainBox = elementary.Box(self.win)
		# do not allow box to expand
		self.mainBox.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
		# add object as a resize object for the window
		self.win.resize_object_add(self.mainBox)
		self.mainBox.show()
 
		# add a label widget 
		self.lbl = elementary.Label(self.win)
		# set text of the label
		self.lbl.label_set("Hello World!")
		# do not allow label to expand 
		self.lbl.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
		# pack the label at the end of the box 
		self.mainBox.pack_end(self.lbl)
		self.lbl.show()
 
		# add a quit button
		self.btnquit = elementary.Button(self.win)
		# set label for button
		self.btnquit.label_set("Quit")
		# do not allow button to expand 
		self.btnquit.size_hint_align_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
		# pack the button at the end of the box
		self.mainBox.pack_end(self.btnquit)
		# when button is clicked
		self.btnquit.callback_clicked_add(self.destroy)
		self.btnquit.show()
 
		# size of the window
		self.win.resize(150,80)
		# now we are done, show the window
		self.win.show()
 
		# run the mainloop
		elementary.run()
		elementary.shutdown()	
 
# endof class HelloWorldGui
 
gui = HelloWorldGui()

Die Datei habe ich dann auf das OpenMoko kopiert und dort im Terminal ausgeführt. Das Ergebnis sieht zwar nicht sehr schön aus, kann sich aber sehen lassen.

Geschrieben in Gnu/Linux, Python, SHR | Kommentare deaktiviert für Wie man in Python ein App für SHR schreibt

Flash-Streams mit MPlayer hören (mit Update)

5. März 2011 von Christian Imhorst

Um mein Spanisch zu verbessern, möchte ich nebenbei spanische Radiosender hören. Blöderweise benutzen die meisten Flash-Player und verstecken die Live-Streams dazu zwischen Java-Script und HTML. Gibt es also keine Chance, die URL zum Stream zu ermitteln, damit ich diese Radiosender auch mit dem MPlayer hören kann? Doch gibt es, man muss sich die URL nur aus dem Quellcode der Seite und der Ausgabe eines Netzwerk-Sniffers wie tcpdump zusammenpuzzeln. Vermutlich gibt es mehrere Wege, die hier zum Ziel führen, ich habe es folgendermaßen gemacht:

Zuerst bin ich auf die Hompage des Radiosenders gesurft, in diesem Fall Cadena Dial. Um den Sender zu hören, klickt man auf den Link „Escucha en directo“. Auf dieser Seite befindet sich der Flash-Player. Um sie zu analysieren, habe ich sie mit dem Befehl wget heruntergeladen:

$ wget http://www.cadenadial.com/multimedia/radios.html
--2011-03-05 14:02:58--  http://www.cadenadial.com/multimedia/radios.html
Auflösen des Hostnamen www.cadenadial.com... 194.169.201.138
Verbindungsaufbau zu www.cadenadial.com|194.169.201.138|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 6416 (6,3K) [text/html]
In »radios.html« speichern.
 
100%[===================================================================>] 6.416       --.-K/s   in 0,08s   
 
2011-03-05 14:02:58 (83,4 KB/s) - »radios.html« gespeichert [6416/6416]

Alternativ kann man sich den Quellcode der Seite natürlich auch im Browser anschauen. Der Link zum Stream befindet sich in der Regel zwischen den iframe-Tags im HTML-Code, muss aber nicht. Eventuell muss man ein grep auf callsign selbst absetzen, oder man nimmt player als Suchwort.

grep iframe radios.html
<iframe src="http://player.streamtheworld.com/_players/unionradio/?callsign=CADENADIAL" ...</iframe>

Ich habe die Ausgabe auf den wichtigsten Teil reduziert, nämlich auf den Link für den Flash-Player. Hier muss man sich den Wert hinter callsign= merken, in diesem Fall also „CADENADIAL“.

Während der Radiosender im Flash-Player des Browsers vor sich hin spielt, startet man tcpdump, um herauszufinden, von welcher IP-Adresse der Player seinen Stream eigentlich bezieht.

# tcpdump -i wlan0 -n

Man kann tcpdump nur als Root starten. Hinter der Option -i gibt man das Interface an, auf dem gesnifft werden soll, die Option -n löst keine Hostnamen auf, sondern gibt die IP-Adressen zurück. Die Ausgabe sieht dann etwa wie folgt aus:

listening on wlan0, link-type EN10MB (Ethernet), capture size 96 bytes
14:21:20.622711 IP 77.67.34.21.80 > 192.168.178.22.59240: Flags [.], seq 3400577045:3400578485, ack 2642445401, win 1723, options [nop,nop,TS val 1395385741 ecr 1233879], length 1440
14:21:20.675395 IP 192.168.178.22.59240 > 77.67.34.21.80: Flags [.], ack 1440, win 947, options [nop,nop,TS val 1233930 ecr 1395385741], length 0
14:21:20.719510 IP 77.67.34.21.80 > 192.168.178.22.59240: Flags [.], seq 1440:2880, ack 1, win 1723, options [nop,nop,TS val 1395385837 ecr 1233879], length 1440

Sie zeigt vor allem zwei IP-Adressen, nämlich 192.168.178.22, das ist in diesem Fall die eigene, und 77.67.34.21, die Adresse des Servers mit dem Live-Stream. Genau genommen steht in der Ausgabe von tcpdump ja 77.67.34.21.80. Die letzte Zahl, zeigt die Portnummer an, in diesem Fall Port 80, hinter dem HTTP als Dienst steht. Jetzt haben wir alle notwendigen Infos, um den Link für den MPlayer in der Kommandozeile zusammenzusetzen:

mplayer http://77.67.34.21/CADENADIAL

Oder im AAC-Format:

mplayer http://77.67.34.21/CADENADIALAAC

Zuerst kommt der Befehl, um den Musikplayer zu starten, mplayer, dann der Dienst, über den kommuniziert werden soll, http://, dann die IP-Adresse des Servers 77.67.34.21 und zum Schluss kommt mit CADENADIAL das Verzeichnis zum Stream.

Auf dem Server sind übrigens noch weitere Streams von spanischen Radios beheimatet. Unter anderem auch von Los40. Während Cadena Dial fast ausschließlich spanisch sprachige Musik spielt, ist bei Los40 der Mix mit aktueller Musik aus den Charts etwas internationaler.

mplayer http://77.67.34.21/LOS40

Oder im AAC-Format:

mplayer http://77.67.34.21/LOS40AAC

Update:

Willie gibt in den Kommentaren einen Hinweis auf den chilenischen Sender Futuro, den man lieben wird, wenn man auf Heavy Metal und Hard Rock steht. Es könnte der Lieblingssender von Jara aus dem Film Gigante sein, wobei der Film in Uruguay spielt, nicht in Chile, er passt aber zur Musik im Film. Etwas abgewandelt bekommt man mit der hier beschriebenen Methode dann diesen Befehl zustande:

mplayer http://208.80.54.28/FUTURO

Die Qualität ist allerdings nicht so berauschend. Der Screenshot mit Firebug von Johannes in den Kommentaren zeigt, dass zumindest Cadena Dial auch im AAC-Format gestreamt wird, was die Qualität verbessern sollte. Und potz blitz, bei Futuro funktioniert dieser Stream auch:

mplayer http://208.80.54.28/FUTUROAAC

Die Qualität hört sich richtig gut an. Die anderen MPlayer-Befehle habe ich deshalb entsprechend erweitert. Vielen Dank für diese Hinweise und viel Spaß beim Hören.

Geschrieben in Gnu/Linux | Kommentare deaktiviert für Flash-Streams mit MPlayer hören (mit Update)

Freerunner Revolution

2. März 2011 von Christian Imhorst

Nach meiner Woche mit Android auf dem Freerunner bin ich jetzt dank des Tipps von Lukas zu SHR gewechselt. Android Cupcake funktioniert auf dem Openmoko Freerunner reibungslos, soweit ich das in einer Woche beurteilen kann. Nervig ist bloß, dass man es innerhalb von 24 Stunden mindestens einmal aufladen muss, auch wenn man nicht wirklich viel damit gemacht hat. Der Stromverbrauch ist einfach recht hoch. Da scheint SHR etwas länger durchzuhalten, wenn man Dienste wie WLAN, Bluetooth oder GPS wirklich nur dann aktiviert, wenn man sie braucht, den Freerunner immer fleißig in den Suspend schickt und die Helligkeit des Displays standardmäßig etwas herunter dreht. Das Stable Hybrid Release (SHR) ist eine freie GNU/Linux-Distribution, die es nicht nur für das OpenMoko, sondern auch für andere Smartphones wie dem N900 von Nokia, dem HTC Dream, oder dem Palm Pre gibt. Außerdem ist es wirklich eine Distribution für Frans von Gnu/Linux und Freier Software, weil man von Anfang an viel selber machen darf. Die Installation ist zwar ein bisschen komplizierter als bei Android, klappt aber trotzdem sehr gut.

Den restlichen Eintrag lesen »

Geschrieben in Gnu/Linux, SHR | Kommentare deaktiviert für Freerunner Revolution

Freerunner reloaded

20. Februar 2011 von Christian Imhorst

Im Juni 2009 hatte ich bei P|U|L|S|T|E|R ein Openmoko Freerunner gekauft. Damals war ich fest entschlossen, mehr für Maemo bzw. MeeGo und mit Qt zu programmieren, um abgefahrene spezialisierte Anwendung für Smartphones zu entwickeln. Dabei hatte ich besonders Nokia-Smartphones ins Auge gefasst, die dann mit MeeGo als Betriebssystem laufen, und der Freerunner sollte die Plattform zum Entwickeln werden. Diese Pläne sind aus mehreren Gründen gescheitert. Auf der einen Seite habe ich wenig Zeit, C++ und Qt zu vertiefen, weil ich auf der Arbeit Visual Basic-Dialekte benötige und mich in meiner Freizeit einfach viel zu gerne mit Python beschäftige. Auf der anderen Seite hatte mein Freerunner von Anfang an ein Hardware-Problem: Der Earspeaker hat nicht funktioniert. Anfangs dachte ich ja noch, dass ich einfach zu blöd sei, oder die Distributionen, die ich geflasht hatte, zu abwegig für das Gerät wären. Wie ich auch herumgeschraubt habe, ich konnte einfach nicht telefonieren. Mein Gegenüber hat mich zwar verstanden, ich ihn aber nicht. Mit einem Headset konnte ich das Problem leider nicht testen, weil ich keins für den Freerunner hatte.

Den restlichen Eintrag lesen »

Geschrieben in Gnu/Linux | Kommentare deaktiviert für Freerunner reloaded

Mit Berry4all das BlackBerry als Modem nutzen

15. Februar 2011 von Christian Imhorst

Mit der Open Source-Software Berry4all kann man das BlackBerry™ durch Tethering als Modem benutzen. Da das unter der Artistic License entwickelte Programm in Python geschrieben ist, sollte man diese Funktion des Smartphones also auch unter anderen Betriebssystemen als Windows nutzen können, beispielsweise unter Ubuntu Gnu/Linux.

Den restlichen Eintrag lesen »

Geschrieben in BlackBerry, Gnu/Linux | Kommentare deaktiviert für Mit Berry4all das BlackBerry als Modem nutzen

Dateien mit Bluetooth an ein BlackBerry senden

13. Februar 2011 von Christian Imhorst

Dateien über Bluetooth mit Ubuntu an ein BlackBerry™ zu senden ist ein wenig komplizierter, als bei anderen Mobiltelefonen, was aber hauptsächlich am BlackBerry liegt. In meinem Fall, übrigens ein Curve 8900, zeigt sich das Telefon ein wenig eigen.

Den restlichen Eintrag lesen »

Geschrieben in BlackBerry, Gnu/Linux | Kommentare deaktiviert für Dateien mit Bluetooth an ein BlackBerry senden

Windows Scripting mit Notepad++

4. Februar 2011 von Christian Imhorst

Damit das Skripten auch unter Windows Spaß macht benötigt man einen komfortablen Editor. Für das Entwickeln mit dem Windows Script Host (WSH) lässt einen Microsoft in diesem Punkt allerdings ganz schön im Regen stehen: Denn es gibt keinen WSH-Scripteditor aus Redmond. Mit PrimalScript und SystemScripter gibt es zwar gute von Drittanbietern für bspw. Visual Basic Script (kurz: VBScript oder VBS), eine der Sprachen für den Windows Script Host, sie sind allerdings nicht Open Source. Jetzt sollte man aber aus Verzweiflung nicht damit anfangen, mit dem Windows-Standardeditor Notepad Skripte zu schreiben. Schließlich hat Notepad nur den einen einzigen Vorteil, dass er bei jeder Windows-Installation dabei ist. Den Funktionsumfang kann man dagegen bestenfalls als sehr bescheiden bezeichnen, da er sich auf „Suchen und Ersetzen“ und automatischen Zeilenumbruch beschränkt. Diese Lücke füllt Notepad++, der kann viele Dateien gleichzeitig geöffnet halten, Sitzungen speichern, in Text mit regulären Ausdrücken suchen und ersetzen, was sich nicht nur auf gerade geöffnete Dateien beschränkt, Syntax-Highlighting für viele verschiedene Sprachen und vieles mehr. Außerdem steht er unter der freien GNU General Public License (GPL) und ist somit Freie Software. Sollte noch etwas fehlen, ist der Editor durch Plugins oder durch das Bearbeiten der Konfigurationsdateien die im XML-Format vorliegen erweiterbar.

Den restlichen Eintrag lesen »

Geschrieben in Programmieren, Windows | Kommentare deaktiviert für Windows Scripting mit Notepad++

Pygame für Python 3 unter Ubuntu installieren

4. Januar 2011 von Christian Imhorst

Da Pygame zwar für Python 2.6.5 aber nicht für Python 3 bei Ubuntu 10.04 Lucid oder 10.10 Maverick in den Paketquellen vorhanden ist, muss man Pygame für die aktuellste Python-Version selber installieren. Damit das funktioniert, benötigt man aber noch das ein oder andere Softwarepaket.

sudo apt-get install python3-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev libsmpeg-dev python-numpy subversion libportmidi-dev build-essential

Sollte es bei der Installation Probleme geben, insbesondere bei python3-dev, fehlen vermutlich zwei Repositories in der Konfigurationsdatei /etc/apt/sources.list. Die kann man entweder mit dem Lieblingseditor für Lucid hinzufügen

deb http://security.ubuntu.com/ubuntu/ lucid-security restricted main multiverse universe
deb http://de.archive.ubuntu.com/ubuntu/ lucid-updates restricted main multiverse universe

(falls man Maverick benutzt, muss man lucid halt durch maverick ersetzen), oder man setzt einfach zwei Haken in der Paketverwaltung Synaptic unter Einstellungen -> Paketquellen im Reiter Aktualisierungen:

Danach muss man noch seine Paketquellen aktualisieren und eventuell updaten, was im Terminal so geht:

sudo apt-get update && sudo apt-get dist-upgrade

Jetzt sollte die Installation reibungslos funktionieren, und man kann mit Pygame für Python 3 weiter machen, indem man die aktuelle Version vom Server mit Hilfe von Subversion herunterlädt:

svn co svn://seul.org/svn/pygame/trunk pygame

Anschließend wechselt man ins neu erstellte Verzeichnis pygame, um zu kompilieren, und um die Installation zu starten:

cd pygame
python3 setup.py build
sudo python3 setup.py install

Wenn man wissen will, ob alles geklappt hat, startet man Python 3 am besten im Terminal und importiert spaßeshalber einmal Pygame:

$ python3
Python 3.1.2 (r312:79147, Apr 15 2010, 12:35:07) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
>>> pygame.ver
'1.9.2pre'

Und schon ist man im Besitz der aktuellsten Pygame-Version für Python 3 unter Ubuntu.

Geschrieben in Gnu/Linux, Python | Kommentare deaktiviert für Pygame für Python 3 unter Ubuntu installieren

« Previous Entries Next Entries »