Python web frameworks

Lately I played around with python web frameworks. After working on a web project with Django last year, I discovered Aspen lately. There are many other frameworks out there. Nevertheless, I’d like to share my findings about Django and Aspen. 🙂

  • Both use python, which is generally known as being fast. It’s compiled and therefore usually less memory hungry than other web oriented languages. There are also better ways to optimize performance, e.g. by writing a custom web server, if your website has high traffic.
  • Both frameworks are nicely object oriented. You get a request object (Django, Aspen) which encapsulate all information from the client. The application can use all its information to generate the output, encapsulated in a response object (Django, Aspen). When errors occur, you can simply raise an error response object in the middle of your code.
  • Aspen and Django are providing templating engines which are very similar to each other.
  • URL’s like http://falstaff.agner.ch/list/10/ score in terms of readability and alterability. Also, they simply look better! Both frameworks encourage the user to use such URL’s without file endings or unreadable long query strings (like ?page=start&session=123). While Django uses a configuration file, Aspen uses the file system itself to create such URL’s.

However, there are also big differences between these frameworks… Read more »

Zenphoto Dokuwiki integration

For a small web project I recently decided to use Zenphoto as photo gallery and Dokuwiki as Main page. I wanted that Dokuwiki and Zenphoto share they’re user database. But both ways, neither Zenphotos user database in Dokuwiki nor Dokuwikis user database in Zenphoto seemed to be simple to implement. So I ended up in a Dokuwiki plug in which synchronize the user database with Zenphotos user database. For that purpose the plug in need the MySQL login information for Zenphotos database. It also allows to enable auto login for Zenphoto when login on Dokuwiki (by simple setting the right cookie). I created a Github repository and added a plug in wiki page to the Dokuwiki website. I thought it might be useful for anybody else…

Using git to install dokuwiki

Since some months now I use Subversion to update my WordPress installation. A simple “svn switch” to the new tag does the trick, and your WordPress installation is up to date! Since my Dokuwiki installation are getting older and older, I decided doing that with Dokuwiki as well. The source code of Dokuwiki is hosted in a Git repository over at Github. I found nowhere a short instruction how to do that with git, so I thought I write one.

First of all, you need git to install git (always strange to install such software on a server, but who cares :-))

sudo aptitude install git-core

When you already have a Dokuwiki installation, you have to convert it to a git repository. Because git clone doesn’t allow using a non-empty directory, we have to work around this limitation. Warning: Using this method you will loose any changes made to Dokuwiki specific files. Configuration and data should be in their own files so you won’t loose such data.

git clone -b stable -n http://github.com/splitbrain/dokuwiki.git
mv dokuwiki/.git/ .
rmdir dokuwiki
git checkout -f

When you are going to install a new installation, use this command

git clone -b stable http://github.com/splitbrain/dokuwiki.git wiki

For security reasons its recommend to disallow the .git directory for HTTP requests by adding these lines to the .git/.htaccess file. You should also remove install.php.

rm install.php
vi .git/.htaccess
order allow,deny
deny from all

To update your installation, just use the command git pull, which will pull the latest commits from the original Github repository.

git pull

Glibc 2.11 breaks gcc’s backward compatibility

Today I compiled a ARM Toolchain on my Ubuntu Lucid Lynx 10.04 PC. As I passed that to my friend he got this message:

arm-elf-gcc: /lib/libc.so.6: version `GLIBC_2.11' not found (required by arm-elf-gcc)

Oh yeah, binary compatibility is sometimes hard in open source world. On the other side, why binary compatibility, we have the source! 😀 But of course, its easier to use binaries then compile the same on every machine…
I found out that the function mkstemps is used from the new glibc version:

$ readelf -a arm-elf-gcc | grep GLIBC_2.11
    11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mkstemps@GLIBC_2.11 (4)
   427: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mkstemps@@GLIBC_2.11
  008:   3 (GLIBC_2.3.4)   0 (*local*)       2 (GLIBC_2.2.5)   4 (GLIBC_2.11)
  0x0030:   Name: GLIBC_2.11  Flags: none  Version: 4

The functions, namly mkstemps and mkstemps64, were added with glibc 2.11. Grepping showed that the function mkstemps is used inside the library “libiberty”. The configure script checks if the function is available on the host, if yes, it will use the hosts function, if not, it will build its own. As soon as the compiler descide to use the hosts mkstemps function, the resulting binary need glibc 2.11, which I would like to avoid.
The solution is pretty simple: Add the object file “mkstemps.o” to the variable REQUIRED_OFILES in Makefile.in. This forces the Makefile to compile its own mkstemps function, which will be prefered when gcc is linked.

$ vi libiberty/Makefile.in
REQUIRED_OFILES = ./mkstemps.o                                          \
        ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o ./sha1.o        \
...

My gcc’s glibc requirement is now 2.4, which is much older then gcc 2.11! As a result my gcc runs even on very old linux systems 🙂

Convert VMware growable, splitted and snapshoted disks

In the last weeks I started to migrate my virtual machines to KVM. Until now, I used on two Servers VMware Server 2.0 on Ubuntu, which caused many problems with Disk I/O’s and performance problems. Either way, I prefer Open Source software whenever possible. KVM and libvirt, which I use to manage KVM, is in a quite mature state nowadays.

To convert the VMware images I used this How-To. This worked quite well for most of my Virtual Machines. But several had snapshots or were split into 2GB files. This cant be handled by qemu-img. I converted the files to single, flat disk file first using vmware-vdiskmanager. In the end, I wanted to have pre-allocated (single file) anyway, because it provides best performance:

$ vmware-vdiskmanager -r Ubuntu.vmdk -t 0 Ubuntu-copy.vmdk

Read more »

ISO-Dateien Booten

Vor kurzem habe ich bei meinem Laptop eine Intel SSD Harddisk eingebaut, und deswegen mein CD-Rom ausgebaut. Dies hab ich ohnehin selten bebraucht, aber es gibt Situationen, in denen es wirklich praktisch ist, zum Beispiel um CD’s zu booten. Ubuntu hat dafür ein Tool, um Ubuntu-CD’s auf USB-Sticks zu schreiben. Dies brauche ich auch öfters und funktioniert ganz ordentlich. Jedoch gibts manchmal auch andere ISO-Dateien die ich booten möchte. Dafür hab ich nun eine Lösung gefunden: Es wird ein Linux mit einem angepassten GRUB-Bootloader auf einen Memorystick geschrieben. Dieser Bootloader kann dan die ISO-Datei direkt vom USB-Stick booten. Wirklich sehr praktisch, allerdings funktioniert die Anleitung nur unter Windows…

VirtualBox 3.1 Performancevergleich

Gestern wurde VirtualBox 3.1 freigegeben. Im ChangeLog steht, dass die Performance erheblich verbessert wurde. Dies wollte ich einmal auf den Prüfstand stellen, und habe ein paar Messungen auf meinem Notebook gemacht (HP EliteBook 8530w, Core 2 Duo T9400, 4 GB Ram mit Ubuntu Karmic 64-Bit). Dazu habe ich die Boot-Zeit zweier virtuellen Maschinen gemessen. Dafür habe ich die Maschine zuerst einmal gestartet, so dass alle Daten im Ram vorhanden sein sollten. Dannach habe ich zwei Durchläufe gestoppt, jeweils vom Startklick bis zum Login-Bildschirm. Die erste Maschine im Test war Windows 7 Ultimate 64-Bit von meiner SSD (Intel SSD 80GB X18-M G2), die zweite Maschine Windows XP Professional 32-Bit von meiner Magnetplatte (Seagate Momentus 320GB 7200upm). Beiden Maschinen sind mit S-ATA und Hardwarevirtualisierung konfiguriert. Die Resultate finden Sie nach dem Sprung. Read more »

QEMU’s qcow2 Format zu VirtualBox vdi Format konvertieren

Heute habe ich versucht das QEMU spezifische qcow2-Format zu einem VirtualBox vdi-Format zu konvertieren. Die einfachste Variante die ich gefunden habe wurde in einem Blog eintrag von “VirtaulGuru” beschrieben. Die beschriebene Variante funktioniert mit dem QEMU-Utility qemu-img. Standardmässig kann qemu-img jedoch nicht mit dem vdi-Format umgehen, dafür wurde jedoch im Sommer dieses Jahres ein Patch auf der QEMU-Developer-Mailingliste veröffentlicht. Leider funktioniert dieser Patch nicht mit der letzten Releaseversion von QEMU (0.9.1). Auch meine 64-Bit installation bereitete einige Fehler. Ich habe deshalb den Patch ein wenig angepasst. Ihr könnt in hier herunterladen. Die Konvertierung ansich ist mit der gepatchten qemu-img Version ganz einfach:

wget http://bellard.org/qemu/qemu-0.9.1.tar.gz
wget http://blog.falstaff.ch/wp-content/uploads/2008/12/qemu-vdi-new.diff
tar xzvf qemu-0.9.1.tar.gz
cd qemu-0.9.1
patch -p0 <qemu-vdi-new.diff
./configure
make qemu-img
strip qemu-img
cp qemu-img /usr/local/bin/qemu-img-vdi
/usr/local/bin/qemu-img-vdi convert "WindowsXP.qcow2" -O VDI "WindowsXP.vdi"

Ubuntu virtualisiert mit KVM und hoher Auflösung

Seit einiger Zeit nutze ich nun KVM als Virtualisierungslösung unter Ubuntu und bin absolut zufrieden. Am Anfang habe ich vorallem Windows als Gast verwendet. Bei Windows schalte ich jeweils RDP frei und verbinde dann mit rdesktop auf die virtuelle Maschine. Bei Linux verwende ich die integrierte VNC Lösung von KVM. Damit man höhere Auflösungen als 1024×768 (1280×1024 bei 16-Bit Farbtiefe) verwenden kann, muss man die Option “-std-vga” (Ab KVM-77 “-vga std”) einschalten. Dies emuliert eine Standard VGA Grafikkarte mit VESA VBE 2.0 Unterstützung. Nun muss der entsprechende Treiber installiert und in xorg.conf eingetragen werden:

$ sudo aptitude install xserver-xorg-video-vesa
$ sudo vi /etc/X11/xorg.conf
Section "Device"
    Identifier    "Bochs VESA VBE 2.0"
    Driver        "vesa"
EndSection

Eventuell müssen die Modes noch angepasst werden. Bei mir funktionieren damit Auflösungen bis 1920×1200!

Seite in einer PDF-Datei drehen

Einfaches Problem, einfache Lösung: Es genügt das PDF in einem Editor zu öffnen und die Rotation bei der entsprechenden Seite zu definieren. Kurz nach dem Beginn des Dokumentes findet man die Zeichenfolge “/Type /Page”. Direkt nach diesem Eintrag kann ein Rotationswinkel angegeben werden. Eine neue Zeile nach der genannten Zeichenfolge mit dem Eintrag “/Rotate 90”, wobei 90 für den Rotationswinkel in Grad steht, genügt, und die Rotation der Seite permanennt im Dokument zu gespeichert. Selbstverständlich kann so das Dokument auch um 180° oder 270° gedreht werden. Etwas komplizierter wirds wenn das Dokument viele Seiten lang ist und man Seite X drehen möchte. Dafür verwende ich jeweils pdftk, und schneide die entsprechende Seite mit der Funktion “cat” aus, drehe diese und füge das PDF mit der selben Funktion wieder zusammen.