Der Zoo wächst: Willkommen, Lotta und Max!

Wie sagte die Lieblingstochter doch kürzlich zu ihrem Lehrer: „Nein, ich habe keine Geschwister. Und ich bekomm auch keine. Aber dafür haben wir zuhause einen Zoo.“ Ja, über einen Mangel an Haustieren kann sie sich nicht beschweren. Und eigentlich waren wir uns einig, dass es allmählich mal genug ist. Wobei – mit dem einen oder anderen Tier liebäugel ich ja ständig…

Dann ergab sich die Möglichkeit, unsere inzwischen etwas einsamen Geckos in eine größere Gruppe zu integrieren, sodass wir uns entschieden sie abzugeben. Nun war der Platz, an dem das Terrarium stand, ja quasi sträflich leer. Bei einem Besuch im Aquatop in Würselen war es dann unvermeidlich, sich auch mal in der Terraristik-Abteilung genauer umzuschauen. Meine Aufmerksamkeit wurde sehr schnell auf eine kleine, grüne Schlange gelenkt, eine Grasnatter. Gleich daneben befand sich eine gebänderte schwarzgrüne Schlange, eine Strumpfbandnatter. Beide Arten gefielen mir sehr gut und passten auch von der zu erwartenden Endgröße und ihren Bedürfnissen in meinen Plan. Mit einer Ausnahme: Nach etwa 7 Jahren Geckohaltung wollte ich keine Lebendfutterbeschaffung mehr sicherstellen müssen, denn das ist für halbwegs ländlich lebende Menschen ein Graus. Damit fiel die Wahl zugunsten der Strumpfbandnatter.

Weitere Recherchen ergaben, dass man die Tiere nicht im Zoohandel, sondern besser bei einem privaten Züchter erwerben sollte. Ich beschaffte mir etwas Literatur (sehr zu empfehlen: Martin Hallmen und Jürgen Chlebowy, „Strumpfbandnattern“, Natur+Tier-Verlag) und lernte viel dazu. So wollte ich dann auch kein fix und fertiges Terrarium kaufen, sondern selbst eines zusammenstellen. Geplant wurde ein Holzterrarium, basierend auf OSB-Platten, mit einer Glasfront und einer Seitenbelüftung. Die erforderlichen Platten wurden im Netz bestellt, die Glasfront bereits vorgefertigt (ich wollte bei der Einschätzung meines handwerklichen Geschicks ja realistisch bleiben). Die Maße des fertigen Terrariums betrugen 100 * 50 * 50.

CAM00446

Weiter ging es mit dem Bodengrund. Sowohl Forenbeiträge als auch Fachliteratur widersprechen sich hier wirklich herzallerliebst. Eigentlich kann man nur alles falsch machen. Von Küchenkrepp über Sand, Kleinttierstreu, Buchenspäne, Rindenmulch und vieles mehr könnte ich inzwischen ewig über angebliche Vor- und Nachteile referieren. Gewählt habe ich schließlich Pinienrinde, Körnung 25 mm. Die Basis für die Dekoration bildeten Äste, Kokosnusshöhlen, Steinhöhlen, künstliche und echte Pflanzen (Tillandsien).

CAM00450

Den letzten Pfiff jedoch erhielt die Gestaltung durch das Hinzufügen von großen Stücken Baumrinde, die ich durch eine zufällig mit mir verwandte Floristin reichlich erhielt. Später sollten mir zudem die Schlangen dies danken und beide Rindenstücke zu ihren Lieblingsplätzen erklären.

CAM00451

Nun war ich fast fertig. Dachte ich. Die größte Herausforderung war jedoch nun die Auswahl und Installation der Licht- und Wärmetechnik. Hier galt noch viel schlimmer als beim Bodengrund: Man kann es nur falsch machen. Wenn man versucht, durch das Lesen von Forenbeiträgen das Optimum zu ermitteln, wird einem irgendwann klar, dass man seine Schlangen auf jeden Fall auf die eine oder andere Weise grausam misshandeln oder töten wird. Energiesparlampe? Zu kalt, die Schlange wird krank werden und sterben. Heizmatte? Nur für Glasterrarien. Heizstein? Das Terrarium wird abfackeln, ist außerdem unnatürlich. Heizlampe ohne Schutzkorb? Die Schlange wird sich daran verbrennen und verstümmeln. Heizlampe mit Schutzkorb? Die Schlange wird in den Schutzkorb kriechen und gegrillt. UV-Licht? Brauchen Strumpfbandnattern nicht. UV-Licht? Brauchen Strumpfbandnattern unbedingt.

Es blieb nur, nochmal mit gesundem Menschenverstand ganz neu an die Sache heranzugehen. Die Grundbeleuchtung realisierte ich schonmal über eine 15-W-Leuchtstoffröhre in einer Unterbauleuchte. Sie wird durch die obere Holzleiste in der Front verdeckt und leuchtet so ausschließlich nach innen. Das Kabel führte ich durch einen stabilen Kabelkanal an den linken Rand des Terrariums und dort durch eine passgenaue Bohrung hinaus.

Blieb die Heizlampe. Ich musste gestehen, dass die im Zoohandel erhältlichen Schutzkörbe viel zu weitmaschig waren, vor allem für junge Schlangen. Liebe Tierzubehör-Firmen: Da ist ne echte Marktlücke! Also kaufte ich erstmal eine Fassung. Statt einer 08/15-Keramikfassung nahm ich die „JBL TempSet basic“ (soviel Werbung muss mal sein), da sie sich viel leichter anbringen lässt. Nun probierte ich verschiedene Birnen aus, u.a. eine Energiesparlampe mit 13 Watt (in der Tat zu kalt und kein schönes Licht), verschiedene Kugellampen (schon nicht schlecht, aber unfokussiert) und einen 40-Watt-Strahler (je nach Tageszeit zu heiß und zu hell).

Meine Wahl fiel schließlich auf einen 28-Watt-Reflektorstrahler. Er erzeugte in der richtigen Entfernung die angepeilten Wärmeplätze um die 30 Grad und strahlte ein schönes warmes Licht als Kontrast zur Leuchtstoffröhre ab. Doch auch dieser wurde bei direkter Berührung zu heiß und stellte eine Gefahrenquelle dar. Der Zufall spielte mir schließlich die Lösung in die Hände. Beim Ausräumen der Spülmaschine entdeckte ich den absolut perfekten Schutzkorb in genau der richtigen Größe: Ein Spargelsieb!

Kurze telefonische Rückfrage bei der Frau des Hauses: „Kann ich das haben?“ – „Nein!“ – „Oh. Hmm, hab’s schon eingebaut.“ Genauer gesagt hatte ich es mit zwei Holzstücken als Halterung versehen, über die Lampe gestülpt und die Holzstücke am Terrarium festgeschraubt. Und man muss festhalten: Das passt wie A… auf Eimer!

CAM00469 CAM00473

Wie man zudem sehen kann, habe ich das Terrarium weiter abgedichtet. Strumpfbandnattern gelten als extreme Ausbruchskünstler. Die Glasscheiben wurden durch ein Schloss und einen abdichtenden Pappstreifen gesichert. Kabelführungen wurden mit Silikon abgedichtet. Eine große Keramikschale zum Baden, eine kleine als Fressnapf, ein Thermometer und eine weitere kleine Plattform aus Buchenholz vervollständigten das Ganze.

CAM00477

Die Bewohner konnten kommen! In der Zwischenzeit hatte ich bereits Kontakt zu einer wirklich sehr freundlichen Züchterin aus Aachen aufgenommen und mir ein Pärchen Karierte Strumpfbandnattern (Thamnophis marcianus marcianus) reserviert. Mit der aufgeregten Lieblingstochter im Schlepptau ging es eines Abends endlich auf die Reise, um die Zwerge (3 Monate alt) abzuholen. Die Namen wurden bereits im Voraus ausgehandelt: Lotta und Max.

DSCN1514 natter

Inzwischen kuscheln Lotta und Max in ihrem Terrarium miteinander, fühlen sich offensichtlich wohl und fressen gierig. Zu Futtern gibt es zur Zeit vor allem zerkleinerten Stint, bestäubt mit ein paar Vitaminen (insbesondere Vitamin B1). Später werde ich es auch mal mit Regenwürmern, Nacktschnecken etc. versuchen.

CAM00482

Projekt Mepevea – D’r Zoch kütt!

Als umweltbewusster oder zumindest geiziger Mitarbeiter des Öffentlichen Dienstes verzichtet man in der Regel bei längerer Anfahrt zum Arbeitsplatz auf den privaten PKW und nimmt freudig am öffentlichen Personennahverkehr (ÖPNV) teil. Sprich: Die Deutsche Bahn (und in Köln auch die KVB) ist unser Freund! Gerüchteweise sind die bereitgestellten Verkehrsmittel nicht immer dann vor Ort, wenn man es laut Fahrplan erwarten könnte. Damit man die daraus resultierende Wartezeit nicht am Bahnsteig, sondern am Frühstückstisch bzw. im bequemen Bürosessel verbringen kann, sind aktuelle Informationen über die Verspätungen unerlässlich.

Nun hat sich in der Vergangenheit der Service der DB dahingehend deutlich verbessert. So sind die Verspätungsinformationen inzwischen minutengenau und in Realzeit sowohl im Web als auch mittels der App „DB Navigator“ abrufbar. Der o.g. Mitarbeiter des Ö.D. ist allerdings nicht nur geizig (jaja, und umweltbewusst), sondern auch klickfaul und noch dazu ein Spielkind. So kam ich auf die Idee, sowohl in meinem trauten Heim als auch im Büro mittels ohnehin vorhandener Technik einen (für mich) optimalen Anzeigebildschirm zu basteln.

Dieser sollte nicht nur die aktuellen Verspätungen meiner Zugverbindungen, sondern auch weitere interessante Informationen anzeigen, genauer gesagt: Aktuelle Nachrichten, Wettervorhersage und (zuhause) zusätzlich das Kamerabild einer per WLAN verbundenen IP-Kamera. Als Hardware kamen ein günstiger und dank Notebook-Anschaffung ohnehin kaum noch gebrauchter PC-Bildschirm sowie zeitgemäß ein Raspberry Pi zum Einsatz. Das System sollte in jedem Fall ohne weitere Peripherie, speziell ohne Maus und Tastatur, auskommen. Softwareseitig setzte ich daher auf Google Chrome im Kiosk-Modus. Mittels der Erweiterung „Easy Auto Refresh“ kann man dafür sorgen, dass Chrome die angezeigte Seite automatisch einmal pro Minute neu lädt. Das Kamerabild läuft ohnehin im Streaming-Mode.

Der graphische Desktop des Raspi musste so eingestellt werden, dass er sich nicht automatisch abschaltet. Die Kontrolle über die Anzeige sollte ausschließlich per Ein/Aus-Knopf des Monitors ablaufen. Dies erreicht man über die eine Einstellung in LightDM.

Da ich mir die Installation und Konfiguration eines Webservers sparen wollte, verwende ich eine einfache lokale HTML-Seite auf dem Raspi. Die beiden gewünschten Elemente „Aktuelle Nachrichten“ und „Wettervorhersage“ sind sehr leicht über passende Widgets realisierbar. Ich habe hierzu die Angebote von wetterdienst.de und rp-online genutzt, es gibt jedoch zahlreiche weitere Anbieter.

mepevea

Richtig interessant wurde es dann bei der Einbindung der Verspätungsanzeige. Wie ich feststellen musste, bietet die Bahn leider keine geeignete API zu diesem Zweck. Mir blieb nichts anderes übrig als die entsprechende Webseite zu parsen. Diese Erkenntnis war die Geburtsstunde von Projekt „Mepevea“ (MEin PErsönlicher VErspätungsAnzeiger).

Wie erwähnt wollte ich auf die Installation und den Betrieb eines Webservers verzichten. Die Anzeige soll ja ohnehin nur für mich persönlich laufen. Daher musste ich die eigentliche Logik nebst Parser in ein Pythonskript packen, welches per Cronjob aufgerufen wird (ja, ich arbeite unter Linux und ignoriere Windows seit Jahren – die Portierung sollte aber kein großes Problem darstellen). Als Basismodul für den Parser dient natürlich „BeautifulSoup“, darüber hinaus werden urllib zum Abruf der Seite und einige weitere Module benötigt. Der Start lautet also:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import bs4, urllib2, time, fileinput, sys, urllib

„fileinput“ verwende ich, um später den <div>-Block im HTML durch die korrekten Daten auszutauschen, z.B.:

for line in fileinput.FileInput("/home/pi/anzeige/bahnlinks.html",inplace=1):
if line.startswith('<div id="bahn">'):
   line = text
   sys.stdout.write(line)

Natürlich macht es Sinn, abhängig vom Wochentag und der Tageszeit die Anzeige zu variieren (Hinfahrt, Rückfahrt, Abend/Wochenende), also z.B.:

timestamp = time.localtime(time.time())
if timestamp[6] > 4:
   textlist.append("<b>Bahnanzeige erst am Montag wieder! Schönes Wochenende!</b>")

Hier wird schon klar: Individuelle Anpassung ist unerlässlich und ich kann die Beispiele nur anreißen. Keine Sorge: Am Ende werde ich als „großes Beispiel“ mein komplettes Skript bereitstellen.

Zentrales Element des Skriptes ist die Parserfunktion. Sie erhält als Parameter die URL der Bahn (dazu später) und jagt sie durch BeautifulSoup:

def parser(url):
   page = urllib2.urlopen(url).read()
   soup = bs4.BeautifulSoup(page)

Man möge mir an dieser Stelle glauben, dass wir die spannenden Inhalte erhalten, wenn wir nach den Keywords, genauer gesagt den <td>-Klassen „overview timelink“ und „overview tprt“ suchen:


zeilen = soup.find_all('td', {"class" : "overview timelink"})
verspaetungen = soup.find_all('td', {"class" : "overview tprt"})

Schon hier erkannt man, wo das größte Problem unserer schönen Bastelei liegt: Sollte die Bahn die Klassennamen aus irgendwelchen Gründen ändern, funktioniert natürlich nichts mehr. Das gleiche gilt für die URLs und die HTML-Struktur. Genau aus diesem Grund gibt es ja i.d.R. kapselnde APIs, aber die stehen hier wie gesagt nicht zur Verfügung.

Standardmäßig erhält man von der Bahn die nächsten drei Züge ab dem definierten Zeitpunkt. Ich habe die finale Version noch so erweitert, dass man dies variieren kann, aber das würde hier zu weit führen. Ebenso müsste ich nun eigentlich auf die Details von BeautifulSoup eingehen, um den folgenden Codeblock zu erläutern. Aber auch dies möchte ich mir sparen und auf die gute Online-Dokumentation des Moduls verweisen. Unsere Verbindungen sowie die aktuellen Verspätungen erhalten wir so:


parsedtext = ''
zaehler = 0
for zeile in zeilen:
   for zelle in zeile.children:
      parsedtext += zelle.contents[0]
   parsedtext += '<span style="color: red;">'
   for verspaetung in verspaetungen[zaehler].children:
      if str(verspaetungen[zaehler]).count("okmsg") > 1 or str(verspaetungen[zaehler]).count("red") > 1:
         parsedtext += verspaetung.contents[0]
         break
   parsedtext += '</span>'
   zaehler += 1

Ich bin mir zu 99% sicher, dass dies nicht die eleganteste Version ist, um die Informationen zu erhalten und aufzubereiten. Aber sie funktioniert. Wer das Ganze kürzer, schöner und verständlicher hinbekommt, ohne dass die Funktionalität leidet, möge sich bei mir melden.

Kommen wir nun zu den benötigten URLs. In einer ersten Version hatte ich pro Zug eine URL auf Basis des Bahntools „query2.exe“ verwendet, die auch deutlich einfacher zu parsen war (Anmerkung: Bitte von der Endung „.exe“ nicht täuschen lassen: Es handelt sich um einen Webservice, nicht um ein lokales Programm.). Leider musste ich feststellen, dass die Bahn bei jeder (geplanten) Mini-Fahrplanänderung die URL komplett verändert. Auf Dauer war das also leider keine Lösung. Stattdessen verwende ich nun die „Vorstufe“ namens „query.exe“. Diese hat klar definierte und – hoffentlich – dauerhaft beständige Parameter. Als Parameter benötigen wir den Code des Startbahnhofs, den Code des Zielbahnhofs und die Startzeit.

Während die Startzeit natürlich jedem selbst überlassen bleibt und einfach in der Form hh:mm verwendet wird, muss man sich die Codes (sog. IBNR) der Bahnhöfe einmalig heraussuchen. Dies geht zum Glück sehr einfach mittels einer Onlinesuche.

Lautet die IBNR des Startbahnhofs bspw. 8000208, die des Zielbahnhofs 8000133 und die gewünschte Startzeit ist 17:00 Uhr, lautet die gesuchte URL:

http://reiseauskunft.bahn.de/bin/query.exe/dox?S=8000208&Z=8000133&time=17:00&start=1

Damit lässt sich nun für jede beliebige Verbindung und Kombination von Tageszeiten ein passender Anzeiger (eben ein „Mepevea“) bauen.

Für weitere Ideen, Verbesserungsvorschläge etc. bin ich jederzeit dankbar. Und wenn jemand die Bahn überreden könnte, doch mal eine entsprechende API bereitzustellen, das wäre ein Traum. 😉

Wie versprochen: Den vollständigen Text des Skriptes sowie eine Beispiel-HTML-Seite findet man unter http://dl.distinguish.de/mepevea.zip

MySQL-Upgrade wie es sein sollte

Nicht, dass ich im Allgemeinen zu extremer Prokrastination neige, aber im Falle des netten kleinen ToDos „Update der MySQL-Server auf 5.5“ bin ich eindeutig schuldig. Das schob ich nämlich bereits seit Ende 2012 leise vor mir her, da ich den Aufwand für außerordentlich hoch hielt. Zur Ausgangssituation: Aus historischen Gründen hatten wir eine recht heterogene Landschaft im Bereich MySQL-DB-Server, bestehend aus:

* 1 Master-Slave-Cluster, Version 5.1, basierend auf original MySQL-RPMs

* 2 Master-Slave-Clustern, Version 5.1, basierend auf IUS-RPMs

* 1 Master-Slave-Cluster, Version 5.5, basierend auf original MySQL-RPMs

* 1 Master-Master-Cluster, Version 5.1, basierend auf original MySQL-RPMs

Wohlgemerkt: Alle auf RHEL5! Die nun alle auf eine homogene Basis zu stellen (nämlich Version 5.5, basierend auf IUS-RPMs) und dabei sowohl die Daten als auch die Replikation leben zu lassen, schien nur durch komplette Dump-Restores mit zwischenzeitlicher Neuinstallation der Pakete zu funktionieren. Da wir hier über eine Datenmenge von insgesamt etwa einem Terabyte sprechen, rechnete ich mit einer ziemlich großen Downtime.

Ein wenig Recherche nach der optimalen Vorgehensweise brachte jedoch zutage, dass die Jungs und Mädels der IUS Community (http://iuscommunity.org), deren Repositories wir ja auch oft und gerne benutzen, tatsächlich auch an solche wirren Zustände gedacht haben. Genauer gesagt gibt es das hübsche Plugin „replace“ für die Paketverwaltung yum. Es lässt sich – natürlich nach Integration des IUS-Repos – per „yum install yum-plugin-replace“ installieren und eröffnet die Möglichkeit, yum mit der Option „replace-with“ aufzurufen.

So führt das folgende Kommando bspw. dazu, dass ein bisheriger 5.1-Server auf IUS-Basis nahtlos durch einen 5.5-Server ersetzt wird:

yum replace mysql51-libs --replace-with mysql55-libs

Der Wechsel ist aber – und das ist das eigentliche Erstaunliche – auch aus den MySQL-RPMs heraus möglich:

yum replace MySQL-server-community --replace-with mysql55-server

yum bzw. das Plugin löst selbst alle nötigen Abhängigkeiten auf. Ggf. beschwert es sich, dass die Herkunft einiger beteiligter Pakete nicht ermittelt werden konnte, dies kann man aber problemlos ignorieren.

Letztendlich war es mir so möglich, das gefürchtete Upgrade für alle Server in einer Stunde durchzuführen, ohne dass ich bislang ein Problem feststellen konnte. Einige Hinweise gilt es aber noch zu beachten:

  • Laut MySQL sollte immer der Slave zuerst aktualisiert werden.
  • Nach dem Upgrade von Slave und Master muss auf dem Master das Kommando „mysql_upgrade“ ausgeführt werden, um fehlende MySQL-Tabellen zu ergänzen. Zudem werden bei der Gelegenheit alle Tabellen geprüft und ggf. repariert.
  • Beim Wechsel von MySQL 5.5 aus MySQL-RPMs auf MySQL 5.5 aus IUS-RPMs musste ich zuvor manuell das Paket „MySQL-shared-compat“ entfernen. Das konnte das Plugin aus irgendwelchen Gründen nicht lösen.
  • Bei Statement-basierter Replikation wirft MySQL 5.5 im Gegensatz zu 5.1 Warnungen, wenn Anweisungen bspw. nicht-deterministische Ergebnisse liefern. Diese Warnungen waren nicht zu unterdrücken (jedenfalls habe ich den Schalter nicht gefunden), obwohl wir uns der Tatsache bewusst waren und die entsprechende Datenbank ohnehin von der Replikation ausgenommen hatten. Ein somit ohnehin fälliger Wechsel zum „Mixed“-Format war also unvermeidlich (Schalter „binlog-format = MIXED“)
  • In MySQL 5.5 fallen einige Konfigurationsoptionen weg bzw. sollten durch ihre Nachfolger ersetzt werden. Die Ersetzung kann bereits vor dem Upgrade in der my.cnf durchgeführt werden. Aufgefallen sind bei mir:
    • skip-locking
    • log-err (ersetzt durch log-error)
    • key_buffer (ersetzt durch key_buffer_size)
    • thread_cache (ersetzt durch thread_cache_size)

Mediawiki und LDAP – „Wollen Sie sich wirklich sperren?“

Ein lange gehegter Wunsch war die Anbindung der zentralen Mediawiki-Installation an die LDAP-Authentifizierung. Dank der Mediawiki-Erweiterung „LDAPAuthentication“ war dies prinzipiell auch überhaupt kein Problem. Dann aber kamen seltsame Fehlermeldungen, dass Benutzer plötzlich gesperrt seien, die definitiv noch Zugang zum Wiki haben sollten. Hier muss man nun wissen, dass nicht alle Wiki-User im LDAP verzeichnet sind, sodass zusätzlich auch lokale Accounts parallel existieren müssen. Also gibt es auch unabhängig vom LDAP die Möglichkeit, Benutzer direkt in Mediawiki zu sperren.

Ein Test meinerseits ergab die schöne Fehlermeldung „Sie sind dabei sich selbst zu sperren. Wollen Sie das wirklich?“ Okay, irgendwie geraten also die User bei der Sperrung durcheinander. Aber warum? Die Lösung fand ich in den Tiefen des PHP-Codes von Mediawiki, indem ich alle beteiligten Funktionen nacheinander durchtestete. In der Datei „functions/User.php“ heißt es in der Funktion „newFromName“:

$name = $wgAuth->getCanonicalName( $t->getText() );

Der LDAP-Server wird also nach dem kanonischen Namen des Users gefragt. In der Regel einfach nur unnötig, führt es genau hier sogar zu einem sehr unerfreulichen Ergebnis: Existiert der User nämlich nicht (mehr) im LDAP, werden ungültige Werte zurückgegeben. Dies führt dann dazu, dass plötzlich ein ganz anderer User – in diesem Fall z.B. ich selbst – als „Target“ dient.

Eine Änderung der o.g. Zeile brachte dementsprechend das gewünschte Verhalten:

$name = $t->getText();

Liveblog zum 2. Halbfinale des ESC 2013

Vorab: Der Blick auf die Wettervorhersage für Samstag geht mir jeden Tag mehr auf den Zeiger! Das kann doch nicht wahr sein…

Ein jammernder roter Ballon und ein armer dünner Kerl, der in einer Umlaufbahn darum kreist. Danke Mazedonien, sehr unterhaltsam.

Oh toll, ne lesbische finnische Hupfdohlenbarbie. So, und gleich dann bitte wieder jemand der singen kann, ja? Insgesamt ist das 2. Halbfinale bislang unterirdisch!

Wollte eigentlich über den isländischen Legolas lachen, aber verdammt, der kann singen! Au ja, Griechenland mit einem Sufflied! “Alcohol is for free” – im Green Room hatten die wohl auch reichlich, hm!?

Zu Hilfe! Ist hier ein Stilberater anwesend? Er wird dringend beim israelischen Auftritt benötigt! Armenien – Der Stiefbruder von Pocahontas incl. Pornobalken! Lied geht so.

Ungarn schickt den jungen Reinhard Mey, der irgendwas über Bettwäsche singt. Albanien gefiel. Aber außer dem Sänger sollten die mal alle ne Mimikschulung machen und sich das grenzdebile Grinsen rausklöppeln.

Na also, Georgien! DAS ist ein Grand-Prix-Lied im positiven Sinne! Nun die Schweiz. Der Opi is ja cool. Sieht allerdings etwas überfordert aus. Solides Lied, nette Sängerin, von mir aus kann die Schweiz weiter. Kann mal einer dem Rumänen die Klöten zurückgeben??? Ach Du scheiße! 

Weiter kommen sollten: Island und Georgien wegen Qualität. Finnland, Schweiz und Ungarn wegen Originalität. Albanien wegen der Abwechslung.Und natürlich Rumänien, damit ich nochmal Tränen lachen kann!

Insgesamt ein zufriedenstellendes Ergebnis. Dänemark, Russland und Island sind am Samstag meine Favoriten.