madcats[welt]

Dumm gelaufen

Da bastelt man sich einen neuen Admin-Bereich, um die Einträge nicht über phpMyAdmin schreiben zu müssen und dann fällt einen kaum noch was ein.

Wie Herr Kaliban immer sagt: »Mein Blog-Fu ist schwach in diesen Tagen.«

Liegt vermutlich an der Hitze. Vielleicht sollte ich auf eine Kühlung mit flüssigem Helium umsteigen oder nach Spitzbergen umziehen. Dort liegt die Durchschnittstemperatur im Juli bei + 5,7° C.

How about some action?

Frank Klepacki schreibt den Soundtrack zu C&C Red Alert 3. Die verdammt beste Nachricht des Tages. Ohne seine Musik wäre es einfach kein richtiges Command & Conquer.

Danke EA, dass Ihr ihn anbord geholt habt!

Spaß mit jQuery

Das letzte meiner jQuery-Beispiele beschäftigt sich ja damit, externen Links ein Icon und target=“_blank“ zu verpassen. Mit allem drum und dran umfasst die Funktion zehn Zeilen Code. Dank ein paar Tricks und der wunderbaren CSS-Selektor-Syntax, geht das ganze aber auch in einer einzigen Zeile:

$('#content .post a:not([href^="' + $('base').attr('href') + '"])[href^="http://"]').css('background', 'url(' + templateURL + 'img/shape_move_forwards.png) no-repeat right 1px').css('padding-right', '20px').attr('title', 'Externer Link').attr('target', '_blank');

Es werden also alle a-Element der Klasse „post“ innerhalb der ID „content“ angewählt, die nicht mit der Basis-URL, aber dafür mit „http://“ beginnen. So wird sichergestellt, dass alle externen Links erwischt werden, aber z.B. relative interne Links (die TinyMCE gerne macht) oder ID-Aufrufe nicht betroffen sind.

Allen betroffenen Elementen wird nun das Icon als Hintergrundbild zugewiesen, ein entsprechendes Padding gesetzt, sowie das title- und target-Attribut.

Mit einer so effizienten und gleichzeitig einfachten Syntax zu arbeiten, macht einfach Spaß. Und so lange diese CSS-Selektoren noch nicht vollständig implementiert sind, hilft jQuery browser-unabhängig aus.

Mozparty-Time Part 4

Mozilla Firefox 3.0

Mozilla.org nahm sich viel Zeit für Firefox 3, aber das Warten hat sich gelohnt. Dem Gecko-Build nach, scheint unter Windows der Release Candidate 2 die finale Version zu sein. Momentan ist er noch nicht offiziell erhältlich, aber wie üblich befindet sich eine neue Version schon Stunden vorher auf dem Mozilla-FTP-Server.

Mehr über die Neuerungen in Firefox 3, findet Ihr hier.

Und im Gegensatz zum Release von Firefox 2, haben viele Entwickler die Beta- und RC-Phase genutzt und ihre Extensions angepasst.

Tödliche Dateisysteme

Der Feature-Vergleich von Dateisystemen beschränkt sich ja normalerweise auf Dinge wie Journaling, Verschlüsselung, Hard Links, Soft Links usw. In der englischen Wikipedia hat man dagegen noch eine weitere, weniger verbreitete Funktion aufgelistet:

Murders your wife*

* Hans Reiser, der Entwickler von ReiserFS, wurde Ende April für schuldig befunden seine Frau ermordet zu haben.

jQuery-Beispiele

Es gibt zwar viele Javascript-Frameworks, aber sowohl privat als auch im Büro bevorzuge ich jQuery. Mit knapp 31 KB (gepackt) ist es schön klein, nicht überladen und inzwischen auch recht flott. Der größte Vorteil ist aber, dass der Zugriff auf die DOM-Objekte über die CSS-Syntax erfolgt – und auch mit den Selektoren, die z.B. der Internet Explorer nicht unterstützt.

Anhand von ein paar Code-Zeilen, die ich hier im Blog verwende, wird klar wie simpel, aber auch mächtig jQuery ist.

Grundsätzlich befinden sich alle Funktionen in der jQuery-Methode ready(), die auf das gesamte DOM angewandt wird. Dabei werden die Elemente schon manipuilert, sobald der DOM-Baum fertig geladen ist und nicht erst, wie beim Event onload(), wenn alles geladen wurde.

$(document).ready(function() {
Code …
});

jQuery bietet ein eigenes Event-Handling an, das es über die CSS-Syntax ermöglicht Events an DOM-Elemente zu hängen. Als Beispiel fungiert hier das Abschicken eines Textfeldes beim Druck auf Enter.

$('form input[type="text"]').keyup(function(event) {
if(event.keyCode == 13) {
$(this).parents('form').submit();
}
});

Damit wird an jedes Textfeld das Event keyup() gebunden und beim Druck auf Enter das übergeordnete Formular abgeschickt.

Als zweites Beispiel dient die automatische Erkennung, ob ein Link innerhalb eines Blog-Eintrags auf eine externe Seite verweist und falls ja, automatisch das Attribut target auf „_blank“ gesetzt wird, sowie dem a-Elemet ein Bild für eine entsprechende Kennzeichnung als externer Link anhängt wird.

$('#content .post a').each(function() {
if($(this).attr('href').indexOf($('base').attr('href')) == -1
&& $(this).attr('href') != '#' && $(this).children('img').length == 0
&& $(this).attr('href').indexOf('javascript:') == -1) {

$(this).attr('title', 'Externer Link').attr('target', '_blank');
$(this).after(' External link');
}
});

„$(this)“ steht für aktuelle Element des each-Durchlaufs. Es handelt sich dabei aber um ein jQuery-Objekt, das z.B. nicht alle DOM-Methoden erlaubt. In einer each-Schleife ist aber auch der Zugriff auf das DOM-Element über „this“ möglich.

Die If-Bedingung prüft, ob die verlinkte URL zur eigenen Seite gehört, ob sie einen Anker-Aufruf enthält oder Javascript-Code ausführt. Trifft nichts von dem zu, werden die Attribute „title“ und „target“ gesetzt. Solche Verkettungen sind möglich, weil jede manipulierende jQuery-Methode eine Referenz auf das bearbeitete Objekt zurückgibt. Danach wird dem a-Element ein weiteres a anhängt, das die Bild-Kennzeichnung für einen externen Link enthält.

Zu guter letzt noch ein Einzeiler, der ein Problem mit dem Syntax Highlighter löst. Aus Kompatibilitätsgründen zu älteren Einträgen bin ich leider gezwungen, jeden Text durch die PHP-Funktion nl2br() zu schicken, um Zeilenumbrüche in br-Elemente ersetzen zu lassen. Bei Code-Ausschnitten in pre-Elementen ergibt sich dabei ein Problem, weil entweder das br-Element als Text am jeder Zeile anzeigt wird oder sogar umgebrochen wird und somit zig überflüssige Leerzeilen vorhanden sind.

$('pre[name="code"] br').remove();

Damit werden alle br-Elemente entfernt und die Code-Ansicht ist sauber. Sicherlich hätte man das ganze auch gleich serverseitig lösen können, aber wozu sich mit regulären Ausdrücken rumquälen, wenn eine Zeile Javascript ausreicht?

Ich hoffe, dass meine Beispiele halbwegs verständlich sind und der ein oder andere, sich entschließt jQuery eine Chance zu geben – es lohnt sich!

Design und Lizenz

Ein paar kleine Änderungen:

  1. Die Schriftgrößen wurden reduziert:
    • Kopfbereich von 80 auf 50 Pixel, um weniger erschlagend zu wirken.
    • Überschriften von 2 auf 1.7 em.
    • Fließtext von 14 auf 13 Pixel.
  2. Die Tags wurden aus der Sidebar in den Footer verlagert. Dort ist in der Breite wesentlich mehr Platz und die Sidebar ist nicht mehr so überfrachtet.
  3. Alle Inhalte von madcatswelt.org stehen ab sofort unter der Creative Commons 3.0 Lizenz.

Die Lizenz in Kurzform:

  1. Wenn Ihr Inhalte von mir verwendet, muss mein Name genannt werden. Ein einfacher Link mit Namen reicht vollkommen aus.
  2. Falls Ihr etwas an meinem Inhalten ändert, muss die Weitergabe unter derselben oder einer vergleichbaren Lizenz erfolgen.

Warum eine Lizenz?

Ich plane in Zukunft mehr über PHP bzw. Webentwicklung mit entsprechenden Code-Beispielen zu schreiben, daher halte ich eine Lizenz für sinnvoll. Die Creative Commons 3.0 Lizenz erscheint mir hierfür am besten geeignet, da sie nur zwei einfache Bedingungen hat und dafür sorgt, dass der Code auch weiterhin frei verfügbar ist.

OpenDNS

Nachdem es in letzter Zeit immer wieder zu Problemen mit den DNS-Servern von Kabel Deutschland (KDG) kam, entschloss ich mich gestern OpenDNS eine Chance zu geben. Bisher hat sich der Wechsel gelohnt. Die Antwortzeiten von OpenDNS sind wesentlich kürzer und erhöhen damit die Surfgeschwindigkeit tatsächlich. Dazu ist das Netzwerk nahezu ausfallsicher über zwei Kontinente aufgebaut.

Leider haben die KDG-DNS-Server immer wieder Probleme, dass die Auflösung mancher Domains grundlos fehlschlägt und wie oben schon erwähnt, sind sie nicht gerade die schnellsten.

OpenDNS ist kostenlos und finanziert sich über Werbung. Wenn eine Domain nicht gefunden werden kann, wird man auf eine Seite von OpenDNS weitergeleitet, die wie Google kontextbezogene Werbung einsetzt und Alternativorschläge zur nicht gefundenen Domain macht – dieses Verhalten lässt sich aber abschalten.

Dazu gibt es verschiedene Services wie Statistiken, White List, Black List, automisches Blocken bestimmter Seitengruppen (Phishing-Seiten, Porno-Seiten, illegale Seiten …), Tippfehlerkorrektur, Abkürzungen (gs für gamestar.de z.B.) etc.

Diese Dienste werden über einen Account bereitgestellt, in dem man einfach seine aktuelle IP angibt. Für Provider mit dynamischer IP-Vergabe, gibt es Programme, die regelmäßig die momentane IP an das OpenDNS-Konto senden.

Hier liegt auch der Knackpunkt am System. Theoretisch ist OpenDNS damit in der Lage, Profile des Surfverhaltens zu erstellen und damit Geld zu verdienen. Wobei versichert wird, dass das nicht passiert und die Statistikfunktionen wie auch alle anderen Möglichkeiten freiwillig sind.

Da der Account aber genauso freiwillig ist, sehe ich kein großes Problem darin. Letztendlich muss es jeder selbst entscheiden. Ich sehe jedenfalls mehr Vor- als Nachteile und bereue den Wechsel nicht.

Wasserstand Mai

DVDs: Star Trek Enterprise Season 4

Buch: Drew Karpyshyn – Darth Bane: Path of Destruction

iTunes: Billy Talent – Red Flag

Spiele: The Witcher, Warhammer 40.000: Dawn of War – Soulstorm

Mal wieder ein Test …

James Bond: 70%
Tony Montana (Scarface): 69%
Hannibal Lecter: 69%
Neo (Matrix): 66%
Batman/Bruce Wayne: 63%
Shrek: 61%
Maximus (Gladiator): 61%
Jim Levenstein (American Pie): 59%
Indiana Jones: 58%
Yoda (Star Wars): 57%
Eric Draven (The Crow): 57%
Forrest Gump: 51%

Which film hero are you?

Eigentlich alles okay, aber Jim aus American Pie? Das geht gar nicht. Ich ziehe dann doch Frauen vor, Apfelkuchen sind zum Essen da …