Mehr CSS – mit Less?

Nach dem ich mit Bootstrap von Twitter in Berührung kam, stieß ich auch auf Less. Bootstrap selbst bietet bereits einfache und flexible HTML, CSS und Javascript Kompontenten und setzt bei CSS auf Less, das CSS um Variablen, Operationen, Funktionen, Mixins und einiges mehr, erweitert.

Im Prinzip wird die erweiterte Syntax von einem Compiler in reguläres CSS überführt. Die Vorteile liegen scheinbar auf der Hand:

  • Variablen können ausgelagert werden, somit können z. B. unterschiedliche Farbgebungen oder Layout-Breiten realisiert werden.
  • Während der Programmierung können codesparende Techniken genutzt werden z. B. ermöglichen die sogenannten Mixins eine Wiederverwendung von bereits genutzten Anweisungen.
  • Mehrere Less-Definitionen können durch die import-Anweisung in eine CSS-Datei kompiliert werden.
  • Das CSS kann optional durch den Compiler minimiert werden,
  • Es können Berechnungen durchgeführt werden, …

Im Gegenzug sehe ich jedoch auch ein paar Probleme. Zum einem muß ein zusätzliches CSS-Framework (?) in den Entwicklungsprozess eingebettet werden. Zum anderen gefällt mir eine entscheidende Funktionalität nicht besonders. Dazu gleich mehr. Jetzt erstmal alle Nachteile die ich sehe:

  • Überschreiben von 3rdparty-Less-Definitionen (was für ein Wort…) ist umständlich bzw. erzeugt unnötigen Code.
  • Erschwertes Debuggen, da die Zeilennummern des generierten CSS nicht mit denen der Less-Definition übereinstimmen.
  • Aufwand für die Einarbeitung.
  • Die Kompilier sind teilweise fehleranfällig (z. B. werden keine Schleifen bei den import-Anweisungen erkannt).

Nun zu dem erwähnten Beispiel. Wir haben z. B. fremden Code z. B. Twitter Bootstrap in unser Projekt eingebunden. Wir hüten uns natürlich davor diesen Code zu verändern, damit er leicht zu aktualisieren bleibt (z. B. könnte auch über svn:externals Code eingebunden werden). Nun möchten wir das Layout entsprechend den eigenen Designvorstellungen anpassen. Ich nehme exemplarisch folgende Konstellation an:

Less Beispiel

Die Datei new/default.less stellt die neu zu schreibende Less-Definition dar, die Datei 3rdparty/lib.css ist eine Definition einer Fremdbibliothek.

Der Inhalt der Dateien nehme ich wie folgt an:

Less Dateien in der Gegenüberstellung

Im Compiler (WinLess) wird nur die Datei new/default.less angegeben und kompiliert:

Less Kompilierer

Nun die spannende Frage: Was wird wohl rauskommen? Unter der Annahme, dass der Kompilierer zuerst die 3rdparty-Datei abarbeitet und anschließend alle weiteren Dateien (override.less und enthaltene Anweisungen) könnte man meinen, er würde im schlechtesten Fall einfach alle Anweisungen nacheinander aufreihen. Im besten Fall würde eine einzige body-Anweisung erzeugt werden, die lautet

body {
  background-color:#ff0000; // übersetzter Wert "red"
  border:none;
  font-family:verdana;
  width:500px;
}

Das Ergebnis sieht – wie vermutet – folgendermaßen aus:

/* Einbinden fremde Definition */
body {
  background-color: #ff0000;
  font-family: verdana;
  border: 1px solid black;
}
/* Überschreiben */
body {
  background-color: #ff0000;
  border: none;
}
/* neue Anweisungen */
body {
  width: 500px;
}

Von schlankem CSS will ich hier nicht sprechen. Außerdem ist nicht mehr ersichtlich, dass der Hintergrund in der ursprünglichen Anweisung den Wert “#5B83AD” hatte.

Fazit

Auf den ersten Blick erscheint eine zusätzliche Abstraktionsschicht interessant, insbesondere die Verwendung der Variablen und der sogenannten Mixins. In der Praxis erhöht sich der Entwicklungsaufwand jedoch nicht unerheblich (Stichwort: Debugging und Integration) und das erzeugte CSS ist in den meisten Fällen nicht kleiner als eigener Code. Der eigentlich Kernnutzen für mich läge im einfachen und optimierten Überschreiben von bestehenden Less-Definitionen. Leider sind dafür die Kompilier noch nicht optimiert.

SVN Externals

Meistens gibt es in einer Anwendung Bestandteile, die man immer wieder benötigt z. B. eine externe Bibliothek oder ähnliches. Dies sollte man nicht jedesmal von neuem in den SVN Zweig einspielen, sondern über die Properties svn:externals als externe Resource einbinden. Unter Eclipse ist das ganz einfach:

  • Den übergeordneten Ordner selektieren
  • Rechtsklick -> Team -> “Set property…” auswählen
  • Dort svn:externals auswählen
  • Als Wert die externe Resource hinterlegen z. B. [Zielordner] [SVN-URL]

Umleitung mit Apache-Rewrite-Modul

Umleitung von einer Domain mit www auf eine Domain ohne www:

RewriteCond %{HTTP_HOST} ^www\.test\.tobias-seckinger\.de [NC]
RewriteRule ^(.*) http://test.tobias-seckinger.de/$1 [R=301,L,QSA]
  • [NC] = No case. Damit spielt die Groß- oder Kleinschreibung keine Rolle
  • [R=XXX] = Redirect mit HTTP-Status-Code XXX. Im Beispiel wird mittels 301 umgeleitet
  • [L] = Last. Letzte Regel, die beachtet werden muß.
  • [QSA] = Query String Append. Hängt neue Parameter an die ursprünglichen Parameter an. Wird für obige Regel nicht zwingend benötigt.
    Beispiel:

    RewriteRule ^source\.php$ /target.php?bar=foo [QSA,L]
    # Eingabe: http://tobias-seckinger.de/source.php?foo=bar
    # Umleitung zu: http://tobias-seckinger.de/target.php?foo=bar&bar=foo

Mehrsprachige Inhalte kennzeichen

Google unterstützt die Kennzeichnung von inhaltlich ähnlichen bzw. gleichen Inhalten, die aber in verschiedenen Sprachen vorliegen mit einem zusätzlichen Attribute.

<link rel="alternate" hreflang="de" href="http://www.example.de/page-de.html" />
<link rel="alternate" hreflang="en" href="http://www.example.de/page-en.html" />

Das Attribute hreflang kennzeichnet die verwendete Sprache. Für Inhalte, die nicht als HTML-Seite zur Verfügung stehen, dann dies über einen HTTP-Header gekennzeichnet werden:

Link: ; rel="alternate"; hreflang="es"

Die möglichen Werte müssen sich an der ISO 6391-1 und optional für Regionen an ISO 3166-1 Alpha 2 orientieren.

Heute mal Apple… was denn sonst.

iPhone 4s LaufzeitEs ist also mal wieder so weit. Es gibt ein iPhone 4S. Angetrieben wird das Handy wie bereits vermutet durch den A5 Chip. Anscheinend soll die Akkulaufzeit im 3G-Betrieb ca. 8 Stunden durchhalten. Bei 2G wird von 14 Std. gesprochen und Musik kann man wohl ca. 40 Stunden genießen. Das iPhone 4S wird GSM und CDMA unterstützen. Die Kamera ebenfalls wie vermutet mit 8 Megapixel. Der CMOS-Sensor soll 73 Prozent mehr Lichtdaten einfangen können und somit besser Bilder machen können. Diesbezüglich hat  Apple nur mit der Konkurrenz gleichziehen können.

Zudem gibt es für das gesamte iPhone Sprachsteuerung (Siri – Your Virtual Personal Assistant: Wurde von Apple aufgekauft). Ob das mit “Stadtgeräusch-Kulisse” funktioniert und vor allem in jeder Sprache gleich gut? Für mich ist das kein Kaufargument…und die Apple Aktie ist während der Vorstellung in Cupertino auch gleich gefallen. Da sind wohl noch andere meiner Meinung.

Das iPhone 4S wird es in drei Varianten geben: 199 Dollar für 16 GByte, 299 Dollar für 32 GByte und 399 Dollar für 64 GByte, natürlich mit Vertrag. Aber es wird wohl schon ab Freitag zu bestellen und ab dem 14. Oktober im Handel sein.

Ant unter Windows 7 installieren

  1. Auf der Ant-Homepage die aktuelle Ant-Version herunterladen (zip-File).
  2. Den Download nach c:\ant entpacken.
  3. Die PATH-Umgebungsvariable um den Eintrag c:\ant\bin ergänzen (mit Semikolon anhängen).
  4. Neue Umgebungsvariable anlegen: ANT_HOME auf C:\ant setzen.
  5. Neue Umgebungsvariable anlegen: ANT_OPTS auf -Xmx256M setzen.

Nun können wir die Installation mit dem Befehl ant -version in der Windows Konsole testen. Sollte folgende Fehlermeldung auftauchen: “Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre7\lib\tools.jar Buildfile: build.xml does not exist! Build failed“, dann bitte im Java-Verzeichnis kurz prüfen, ob diese jar fehlt und ggf. das Java JDK nachinstallieren. Anschließend eine weitere Umgebungsvariable JAVA_HOME anlegen und dort den Wert korrekten Pfad hinterlegen (z. B. C:\Program Files\Java\jdk1.6.0_25) hinterlegen.

Nun sollte korrekterweise in der Konsole folgende Ausgabe erscheinen: “ant -version
Apache Ant(TM) version 1.8.2 compiled on December 20 2010