Mac OS X: Zugriff auf Windows 7 Freigaben langsam

Gestern Abend wollte ich von einem iMac mit Mac OS X Lion (10.7.3) aus auf Ordnerfreigaben eines PCs mit Windows 7 Professional zugreifen.

Mac hat die Freigaben auch sofort gefunden und konnte diese mounten. Allerdings fiel sofort auf, dass die Auflistung der Dateien und Unterordner in den Freigaben langsam war. Als ich dann eine Datei kopieren wollte, stellte ich fest, dass es sogar extrem langsam war (ein paar kb/sek).

Als Gegencheck kopierte ich testweise mal eine Datei vom PC zum Mac. Dabei hatte ich volle Gigabit-Geschwindigkeit.

Nach längerer Suche und nachdem ich einige “Tipps” ausprobiert hatte, bin ich letztendlich auf die Lösung gestoßen.

Kurze Anleitung:
Systemsteuerung->Netzwerk- und Freigabecenter->Adaptereinstellungen ändern->Rechtsklick auf LAN-Verbindung->Konfigurieren->Erweitert

Dort “Abladung großer Übertragung V2″ deaktivieren.

Opera: CSS-Transitions für border-color

Opera (aktuell 11.62) hat ein Problem damit, CSS-Transitions auf die Eigenschaft border-color (und vermutlich auch andere) anzuwenden.

Funktioniert nicht

-o-transition: border-color 1s linear;

Demo: http://jsfiddle.net/gaby/bcn5c/1/

Funktioniert

-o-transition:
    border-top-color 1s linear,
    border-right-color 1s linear,
    border-bottom-color 1s linear,
    border-left-color 1s linear;

Demo: http://jsfiddle.net/ds5bM/

Dieses Problem ist in den aktuellen Snapshots von Opera 12 gefixt:

Our CSS Transitions support has also been updated. With CSS Transitions, rendering changes that normally happen instantly can be made to gradually happen over time instead. Among other things we have updated color transitions, enabled transitions on background positions, box shadows and more, and added the ability to transition through one or more abrupt steps.

Quelle: http://my.opera.com/desktopteam/blog/2012/03/26/html5-css-64bit

E-Mail-Validierung für IDN-Domains in HTML5, PHP und Javascript

Tach,

ich habe mich heute mal (wieder) informiert, wie man am besten E-Mail-Adressen auf korrektes Format validiert.

Die Situation

Bisher habe ich in PHP immer den mit Version 5.2.0 eingeführten E-Mail-Filter und in Javascript einen regulären Ausdruck verwendet:

PHP:

function checkEmail($email){
	return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

Javascript:

function checkEmail(email){
	return email.match(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i);
}

Auch HTML5 bietet die Möglichkeit, ein Eingabefeld des Typs E-Mail zu erzeugen:

HTML5:

<!DOCTYPE html>
<html lang="de">
    <head>
        <title>E-Mail-Validierung</title>
    </head>
    <body>
        <form>
            <input type="email">
            <input type="submit">
        </form>
    </body>
</html>

Demo für HTML5 und Javascript.

Das Problem

Das Problem ist nun, dass keine der drei Lösungen IDN-Domains bei E-Mail-Adressen akzeptiert (siehe [1] und [2]). Das heißt Adressen wie foo@bär.de, die durchaus gültig sind, werden als ungültig erkannt.

Die Lösung

Als Lösung muss man also den Domain-Teil in Punycode konvertieren, um danach das Format prüfen zu können.

Für PHP kann man hierzu auf das Modul intl bzw. speziell auf die Funktion idn_to_ascii
zurückgreifen.

PHP:

function checkEmail($email){
	$parts = explode('@', $email);
	return count($parts) == 2 && filter_var($parts[0].'@'.idn_to_ascii($parts[1]), FILTER_VALIDATE_EMAIL) !== false;
}

Für Javascript bin ich auf eine tolle Bibliothek von Mathias Bynens gestoßen. Damit lässt sich das Problem analog zu PHP lösen.

Javascript:

function checkEmail(email){
	var parts = email.split('@');
	if(parts.length != 2){
		return false;
	}
	var converted = parts[0] + '@' + punycode.toASCII(parts[1]);

	return converted.match(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i);
}

Das Fazit

Mit etwas mehr Aufwand ist es in PHP und Javascript also durchaus möglich IDN-E-Mail-Adressen korrekt zu erkennen. Meiner Meinung nach sollten die PHP-Entwickler ihren E-Mail-Filter erweitern, damit er IDN-Domains akzeptiert.

Für HTML5 gibt es dafür keine Lösung, solange die Browser-Entwickler es nicht berücksichtigen. Eingabefelder vom Typ “url” können übrigens mit IDN-Domains umgehen. Warum also nicht auch E-Mail-Felder?

Da davon auszugehen ist, dass sich “Umlautdomains” (wie man so schön sagt) in Zukunft weiter verbreiten werden, wäre es wichtig, dass Browser jetzt schon im vollen Umfang darauf vorbereitet wären.

[1] http://www.php.net/manual/en/filter.filters.validate.php#102398
[2] http://barrow.io/posts/email-validation-of-double-byte-domains/

Google Web Fonts – Mehrere Schriftstile im IE8 und älter laden

Die Google Web Fonts sind toll und funktionieren in der Regel auch sehr gut. Aber heute bin ich auf ein Problem im Internet Explorer 6, 7 und 8 gestoßen.

Definiert man in einer Anfrage mehrere Schriftstile gleichzeitig, dann liefert Google nur den Standard-Stil zurück, wenn man einen IE < = 8 benutzt.

<link href="http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:200,300" rel="stylesheet" />

Die Lösung ist trivial. Einfach separate Anfragen stellen:

<link href="http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:200" rel="stylesheet" />
<link href="http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:300" rel="stylesheet" />

Es gibt bei Google auch nen Bug-Report dazu. Der ist allerdings schon fast zwei Jahre alt und es ist wohl fraglich, ob der jemals behoben wird.

Danke an Richard Fink, dessen Blogpost mir sehr geholfen hat.

Redmine: Premature end of script headers: dispatch.fcgi

Wenn ihr Redmine über mod_fcgid eingebunden habt und es einfach nicht starten will und auch keine Fehler ausspuckt, außer Premature end of script headers: dispatch.fcgi im Apache error log.

Dann solltet ihr mal überprüfen, ob die Datei configuration.yml die richtigen Berechtigungen aufweist… Hat mich jetzt einige Zeit gekostet, das raus zu finden.

Drauf gekommen bin ich, weil ich Redmine mal via Passenger anstatt via fcgi eingebunden habe. Tolle Sache!

Code completion für jQuery in NetBeans 7.1

Tach,

NetBeans rühmt sich ja schon lange damit, dass sie code completion für JavaScript Dateien und Libraries haben. Unter anderem auch für jQuery. In der Doku findet man dazu sogar einen recht ausführlichen Artikel.

Leider hat das bei mir nie funktioniert und ich konnte auch nach ausführlichem googlen nichts finden, was mir half.

Heute bin ich aber endlich auf die Lösung gestoßen:

Man darf die Datei nicht umbenennen!

Ich hatte meine Datei immer in jquery.js umbenannt. Damit klappts aber nicht.
Die Datei muss, z.B. für die aktuellste Version 1.7.1, jquery-1.7.1.js heißen!

Im Moment bin ich mir noch nicht sicher, warum das so ist und ob das Absicht ist oder ob es sich um einen Bug handelt. Allerdings könnte ich mir vorstellen, dass es mit der Doku zusammenhängt, die neben der code completion angezeigt wird. Diese Doku muss aus dem Netz gezogen werden, da sie nicht in der JavaScript Datei enthalten ist.

Klappt übrigens auch perfekt mit der komprimierten Version jquery-1.7.1.min.js.

Begeistert bin ich davon allerdings nicht. Ich würde meine Dateien eigentlich gerne so benennen, wie ich es will.

Xdebug mit XAMPP unter Windows – Standard-Einstellung vom Profiler funktioniert nicht

Kurze Lösung für ein Problem, das mich gerade doch einige Zeit aufgehalten hat.

Die Standard-Einstellung für den Dateinamen, der für die Profiler-Dumps verwendet wird, ist unter XAMPP 1.7.4:

xdebug.profiler_output_name = "xdebug_profile.%R::%u"

Windows erlaubt aber keine Doppelpunkte im Dateinamen. Es gibt keine Fehlermeldung, gar nichts. Es tut sich einfach nichts.

Geändert auf z.B.

xdebug.profiler_output_name = "callgrind.%t-%s"

…und es funktioniert. Das Prefix “callgrind.” benutze ich, damit ich die Datei dann in KCacheGrind öffnen kann.

Weitere Informationen gibt es in der Xdebug-Doku.

Da muss man erstmal draufkommen.

Linux: Aktives Fenster auf anderen Monitor verschieben

Mit diesem kleinen Script lässt sich das aktuelle Fenster leicht per Shortcut von einem auf den anderen Monitor verschieben. Funktioniert auch mit maximierten Fenstern, die nach dem Verschieben weiterhin maximiert bleiben.

Das Script ist für zwei Monitore mit gleicher Auflösung ausgelegt.

#!/bin/bash

# screen width
screen_width=1280

# active window
window=`xdotool getactivewindow`

# get active window size and position
x=`xwininfo -id $window | grep "Absolute upper-left X" | awk '{print $4}'`
w=`xwininfo -id $window | grep "Width" | awk '{print $2}'`

maximized=false
if [[ "$w" -eq "$screen_width" ]]; then
	maximized=true
fi

# window on left monitor
if [ "$x" -lt "$screen_width" ]; then

	if $maximized; then
		wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz
	fi

	wmctrl -r :ACTIVE: -e 0,$screen_width,-1,-1,-1

	if $maximized; then
		wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz
	fi

# window on right monitor
else

	if $maximized; then
		wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz
	fi

	wmctrl -r :ACTIVE: -e 0,0,-1,-1,-1

	if $maximized; then
		wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz
	fi

fi