mdietrich.de

12. September 2008
von Mario Dietrich
Keine Kommentare

Integration von cooliris auf fotouristen.de

Auf fotouristen.de gibt es ab heute ein neues Feature zu sehen, dass es erlaubt, schicke Voransichten und Slideshows der Fotos zu betrachten. Die technische Umsetzung basiert auf einer AJAX- bzw. Pluginlösung der Firma Cooliris Inc. Die Browserplugins sind aktuell für Firefox, Internet Explorer und Safari verfügbar und erlauben eine noch schickere Darstellung als über AJAX.

Alles in allem eine sehr schicke Lösung, die mit relativ wenig Aufwand (speziellen RSS-Feed erstellen) zu integrieren war.

2. September 2008
von Mario Dietrich
Keine Kommentare

Der Google-Browser: Google Chrome

Man mag meinen, es gäbe schon Browser genug. Doch Google setzt noch einen drauf mit dem neuen Google-Chrome-Browser. Der Browser basiert auf dem Webkit-Projekt und verspricht den Browser auf das zu konzentrieren, was der Benutzer heute von einem Browser erwarten darf:

  • Optimierung für Videos, Chatten, Games
  • Stabilität, Performance, Sicherheit
  • Javascript-Optimierung
  • klares und eindeutiges User Interface
  • Open-Source

Google will vieles davon erreichen, indem zum Beispiel jeder Tab in einen eigenen Systemprozess ausgelagert wird. Stürzt also z.B. eine Javascript-App in einem Tab ab, wird nicht der ganze Browser in Mitleidenschaft gezogen. Es gibt eine intelligente Adressleiste, wesentliche Beschleunigung des Javascript-Codes (durch V8) geben und verbesserten Schutz vor Malware & Phishing.

Details dazu gibt’s in einem sehr schicken Scott McCloud-Comic.

Ich hoffe erst mal, dass sich durch die Verwendung von Webkit keine allzugroßen Änderungen gegenüber der Darstellung im Safari ergeben, ansonste gäbe es neben IE, Firefox, Opera und Safari in diversen Versionabwandlungen noch einen weiteren Browser im Frontend zu supporten.

Chrome ist zunächst nur als Windows-Beta-Version erschienen, soll in Zukunft aber auch für Mac OS X und Linux erscheinen.

Update:
Wer die Mac-Version nicht abwarten will, findet hier eine Build-Anleitung für OS X.

29. Juli 2008
von Mario Dietrich
Keine Kommentare

iCal auf dem Mac mit Google Calendar syncen. For free!

Google hat relativ unbemerkt seine Kalender-Anwendungen via WebDAV oder besser gesagt CalDAV zugänglich gemacht. Das bedeutet, dass man sich nun z.B. mit seinem iCal auf dem Mac an seinen Google-Calendar hängen kann und somit alle Termine auch stets per Web zugänglich sind.

Wie funktioniert das?

Welche bekannten Probleme gibt’s?

Alles in allem sehr cool, denn bisher brauchte man dafür Tools wie SpanningSnyc oder Busy Sync.

13. Juli 2008
von Mario Dietrich
Keine Kommentare

Mein Weg zum IPhone 3G

…war glücklicher Weise wohl einfacher als bei vielen anderen sehnsüchtig wartenden Menschen rund um den Globus. Und das, obwohl auch bei meinem Kauf eigentlich so gar nichts glatt ging.

Dass die Geräte am Anfang knapp sein würden, war abzusehen, deswegen habe ich mir für den 11. Juli einen T-Punkt in unmittelbarer Nähe ausgesucht, der sehr früh aufmacht, um noch morgens vor der Arbeit einen Kaufversuch starten zu können. Im Web nachgeschaut: Um 8 Uhr macht der Laden auf. Super!

Flux hingefahren wunderte ich mich um kurz vor 8 schon ein wenig, dass niemand sonst neben mir auf das sonst eher dröge Hochziehen der Ladengitter wartet. Nunja um 5 nach 8 fand ich dann einen kleinen Aufdruck am Schaufenster: Öffnungszeiten Fr. 9:00 – 20:00. Argh.

Naja. Den laptop hatte ich wie immer am Mann, also habe ich mich wieder in den Wagen gesetzt und eine Stunde im Auto mit Programmieren verbracht. Gut dass ich Zeit eingeplant hatte.

Um 9 machte der T-Punkt dann wirklich auf und nach wie vor war außer mir kein anderer Kunde zu sehen. Zum Glück, denn es gab im ganzen Shop tatsächlich nur 2 Geräte. Zum Glück passte die Konfiguration (schwarz, 16GB), sodass die Bestellung schnell formuliert war: Her damit :-)

Nur leider gings dann doch nicht so schnell mit dem Kauf, denn

a) war das Online-Buchungssystem um 9:00 schon grottenlahm und
b) hatte T-Mobile offenbar die Tarife noch gar nicht eingestellt

Also musste mir die freundliche Dame erklären, dass ich leider im Laufe des Tages noch einmal wieder kommen müsste.
Am Abend konnte ich dann aber tatsächlich das Gerät abholen. Und ich war dann doch etwas unsicher, ob ich mit diesem teuren Knebelvertrag das richtige gekauft habe…

Es wird ja immer wieder über die Vor- und Nachteile des IPhones 3G diskutiert. Die Rückseite ist jetzt nur noch aus Kunststoff, ja, es gibt kein MMS und ja, die olle Kamera hat nur 2 Megapixel. Aber hey: Wer bitte braucht das auch? Wenn ich Fotos machen will, nehme ich eine ordentliche Kamera, MMS habe ich mit meinen letzten Handys, die das konnten, auch nie gemacht. Dass die Rückseite Plastik ist stört überhaupt nicht. Wieviel % der Handies haben denn keine Rückseite aus Kunststoff? Zum Glück hat man sich auf die wesentlichen Bestandteile konzentriert: Bedienbarkeit, sinnvolle Funktionalitäten, Erweiterbarkeit. Wie man schon raushört: Mich hat das Gerät absolut beeindruckt. Dass man damit auch telefonieren kann, habe ich fast vergessen :-) Das größte Potential birgt wohl der AppStore mit seinen heute schon gut 500 Applikationen. Die dort erscheinenden Applikationen werden das Gerät wahrscheinlich zu dem Device schlechthin machen.

Schade ist nur, dass die Möglichkeiten des IPhones durch Apple und T-Mobile beschränkt werden. Zur Softwareverteilung führt kein Weg an Apple’s AppStore vorbei und der Netzbetreiber unterbindet derzeit offenbar schon diverse Ports und Protokolle, z.B. für Instant Messaging.

Bleiben wir gespannt, ob User, die auf diese Möglichkeiten nicht verzichten möchten, wieder zu unerlaubten Freischaltungen greifen müssen. Die Mittel dafür schein schön in den Startlöchern zu stehen.

24. Juni 2008
von Mario Dietrich
Keine Kommentare

Geklonte Netzwerkkarten bereinigen

Bevor ich’s wieder vergesse:

Wenn man z.B. einen Klon einer VMWare-Instanz anlegt, werden neue Mac-Adressen (und andere Seriennummern) für die virtuelle Hardware vergeben. Dadurch erstellt ein Linux-System beim ersten Start automatisch neue Netzwerkkarten und ist erst mal vom Netz getrennt. Alte wie neue virtuelle Karten kann man in folgender Datei korrigieren:

/etc/udev/rules.d/z25_persistent-net.rules

Einfach die ersten Einträge löschen und den neuen Einträgen die richtigen Namen (z.B. eth0, eth1) geben, fertig.

19. Juni 2008
von Mario Dietrich
Keine Kommentare

Endlich: Zend Studio for Eclipse 6.0.1

Endlich: Zend Studio for Eclipse 6.0.1
Das wurde aber auch Zeit. Die wichtige Versionsnummer ist hier nicht die 6 vorne, sondern die 1 hinten.

Zend hat vor einiger Zeit seine PHP-IDE Zend-Studio auf Eclipse portiert, um sich zukünftig weniger um die Entwicklung einer eigenen IDE kümmern zu müssen. Schließlich bringt Eclipse eigentlich alles mit was man so braucht.
Version 6 war allerdings ultralahm und ist an einem 10-Stunden-Tag gerne über 20x abgestürzt oder hat den Anwender zig Minuten am Speichern gehindert. Mit dem jetzt veröffentlichten Wartungs-Release scheinen die Probleme auf den ersten Blick tatsächlich behoben zu sein. Super!

12. März 2008
von Mario Dietrich
Keine Kommentare

Wie man den Footer tatsächlich ans Seitenende bekommt

Heute habe ich mal wieder eine HTML-Seite erstellt und hatte wieder mal den frommen Wunsch, den Footer am Seitenende haben zu wollen. Egal wie groß das Browserfenster gerade ist. Schließlich bin ich mit folgendem Code gut zurecht gekommen:

<html> <body>
  <div id="nonfooter">
  <div id="content"> Hier sollte die komplette HTML-Seite rein </div>
 </div>
 <div id="footer"> Hier kommt der Footer rein </div>
</body> </html>

Hier nun das benötigte CSS:

html { height: 100%; }
body { height: 100%; }
#nonfooter { position: relative; min-height: 100%; }
* html #nonfooter { height: 100%; }
#content { padding-bottom: 9em; }
#footer { position: relative; margin-top: -7.5em; }

Das war’s.

16. Mai 2007
von Mario Dietrich
Keine Kommentare

Master-Slave Replikation mit MySQL

Heute gibts mal einen kleinen Schnellkurs zum Thema MySQL-Replikation.

Die Master-Slave-Replikation wird gerne verwendet, wenn es hauptsächlich um Daten- und Ausfallsicherheit der Datenbank geht. Der Hauptvorteil dieser Replikationsart ist, dass die Sicherung der Daten auf mindestens eine zweite Datenbank quasi “on-the-fly” passiert. Außerdem wird ein sicherer Export der kompletten Daten ohne Ausfall auf Kundenseite möglich.

Schreibzugriffe erfolgen dabei ausschließlich auf dem Master-Server, Lesezugriffe können auf Master- wie Slave-Server erfolgen. Die Verteilung der Schreibzugriffe geschieht wie folgt:

  • Jeder Schreibzugriff wird auf dem Master mit einer eindeutigen Positions-ID in ein binäres Logfile (bin.log) geschrieben
  • Jeder Slave fragt den Master regelmäßig nach neuen Einträgen in diesem Logfile
  • Liegen Änderungen vor, werden diese auf jedem Slave in eine Datei (relay.log) geschrieben
  • Die nun neue, letzte dem Slave bekannte Position des bin.logs wird in master.info auf dem Slave gespeichert.
  • Die letztn Änderungen im relay.log werden nun auf dem Slave ausgeführt, wobei die Daten nochmals aus Sicherheitsgründen mit dem Master verglichen werden
  • Treten bei der Replikation Probleme auf, werden diese in error.log festgehalten und die Replikation bleibt stehen.

Wie setze ich nun so eine Replikation auf?

Zunächst einmal legen wir einen Replikationsuser an, mit dem sich die Datenbanken untereinander verbinden können. Das machen wir sowohl auf dem Master:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO 'replication'@'slave-host' IDENTIFIED BY 'passwort'

wie dem Slave:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO 'replication'@'master-host' IDENTIFIED BY 'passwort'

Damit können wir notfalls auch vom Slave auf den Master replizieren, falls der Master einmal ausgefallen ist und der Slave übernommen hat.
Jetzt konfigurieren wir den Master (/etc/mysql/my.cnf):

server-id = 1 # ID des Servers, muss eindeutig sein
log-bin = /var/log/mysql/bin.log # Binäres Logfile
expire_logs_days = 10 # nach wieviel Tagen die logs gelöscht werden sollen
max_binlog_size = 100M # Maximale Größe einer einzelnen Logdatei
binlog_do_db = Datenbank-Name # Begrenzung des Binlogs auf eine DB

Ein Neustart der Datenbank kann direkt erfolgen, damit die Konfiguration greift.
Jetzt ist der Slave dran (/etc/mysql/my.cnf):

server-id = 2
master-host = 192.168.0.1 # IP der Master-DB
master-port = 3306
master-user = replication
master-password = passwort
replicate-do-db = Datenbank-Name
# Nur diese DB in relay.log übernehmen
binlog_do_db = Datenbank-Name
# Nur diese DB in bin.log übernehmen
expire_logs_days = 10
max_binlog_size = 100M
log-bin = /var/log/mysql/bin.log
log-bin-index = /var/log/mysql/log-bin.index
log-error = /var/log/mysql/error.log
relay-log = /var/log/mysql/relay.log
relay-log-info-file = /var/log/mysql/relay-log.info
relay-log-index = /var/log/mysql/relay-log.index

Die Slave-DB nun einmal neu starten.

Der Slave spielt hier wie gesagt 2 Rollen: Er ist Slave (relay.log), schreibt aber auch gleichzeitig bin.logs, um im Notfall die Datenbasis für eine Masterrolle zu haben.

Ich gehe nun davon aus, dass der Master schon irgendwelche sinnvollen Daten hat und der Slave sich in einem undefinierten Zustand befindet. Vielleicht hat er schon ein paar Daten, vielleicht nicht. Nur Folgendes muss gegeben sein: Die zu replizierenden Datenbanken sind auch auf dem Slave grundsätzlich vorhanden. Dann können wir folgendes Skript auf dem Master ausführen. Ich gehe davon aus, dass es in /root/bin liegt und von dort ausgeführt wird und der MySQL-User “root” die Berechtigung besitzt, sich vom Master auf den Slave-Server connecten zu dürfen:

#! echo "Dumpe Datenbank XY ..."
mysqldump --user=root --password=Passwort \
 --extended-insert --master-data \
 fotouristen > /root/bin/replication.sql
echo "" echo "Koiere Dump auf slave-host..."
scp /root/bin/replication.sql slave-host:
echo
echo "Stoppe MySQL-Slave auf slave-host..."
ssh slave-host mysqladmin -uroot -pPasswort stop-slave
echo
echo "Importiere Dump auf slave-host..."
ssh slave-host "mysql -uroot -pPasswort \
 Datenbank-Name < /root/replication.sql"
echo
echo "Starte MySQL-Slave auf slave-host..."
ssh slave-host mysqladmin -uroot -pPasswort start-slave
echo
echo "Lösche temporäre Dateien..."
rm /root/bin/replication.sql
ssh slave-host /root/replication.sql
echo
echo "done!"

Das wars!

Der Slave sollte nun in Sync mit dem Master sein. Ein Blick in /var/log/mysql/error.log sollte Aufschluss darüber geben.

Es gibt viele Wege Master und Slave zu synchronisieren. Der Einfachheit sei an dieser Stelle noch gesagt, dass obiges Script auch dazu verwendet werden kann, einen “out-of-sync”-Slave damit ohne weiteres Zutun wieder an den Start zu bringen. Für die Dauer des Dumps ist der Master währenddessen jedoch nicht erreichbar.

14. Mai 2007
von Mario Dietrich
Keine Kommentare

ROWNUM in MySQL, fast wie bei Oracle

Was ich bei MySQL immer schmerzlich vermisse, ist die Variable ROWNUM. In manchen Situation kann MySQL zwar mit einer per LIMIT begrenzten Abfrage helfen, für die Bestimmung der Position einer bestimmten Zeile aus abgefragter Ergebnismenge, hilft aber halt nur ROWNUM weiter. Hier ein kleiner Trick, wie man die ROWNUM-Variable auch in einer MySQL-Ergebnismenge bereitstellen kann:

SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, meineTabelle t;