IE11 kommt getarnt daher

Browser melden sich traditionell und historisch bedingt mit ziemlich kryptischen Namen. Mein aktueller Chrome z.B.:

1
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22

Der Brauch, so viel wie möglich Buzzwords in den String navigator.userAgent zu packen entspringt dem Browsersniffing. Sollte ein Webentwickler nach Gecko (Rendering-Engine von Firefox) suchen und dann einen gewissen Inhalt ausliefern, wären andere Browser benachteiligt. Und deshalb finden sich eben in jedem Browsername alle Bezeichnungen wieder.

Im neuen IE11 aus der geleakten Windows Blue-Version springt jetzt auch Microsoft auf den Zug auf:

Veröffentlicht unter Javascript, Quicktips, webdev | 1 Kommentar

Browserscope

Browserscope is a community-driven project for profiling web browsers. The goals are to foster innovation by tracking browser functionality and to be a resource for web developers.

So zumindest der Hersteller. Im Grunde geht’s darum: Ich packe mir ein kleines Script von Browserscope auf die Webseite und kann diesem dann verschiedene Parameter übergeben, die typischerweise etwa A/B-Tests sind oder Browser-Feature-Prüfungen der Benutzer meiner Webseite. Die Informationen werden dann an Browserscope übertragen und schön übersichtlich dargestellt. Super, wenn ich etwa testen will, wann ich ein Feature für alle Besucher meiner Webseite freischalten kann.

Veröffentlicht unter Javascript, webdev | Hinterlasse einen Kommentar

Best-of-the-Web 12

Neue Linkwelle, gab ja so einige spannende Sachen seit der letzten…

Veröffentlicht unter Best of the Web, Javascript, Performance, php, webdev | Hinterlasse einen Kommentar

Quicktip: Mehrere Attribute auf einmal anlegen

Erspähte ich neulich im Quellcode von Symfony 2 – mir war vorher nicht bewusst, dass das möglich ist.

1
2
3
4
5
6
7
8
9
10
11
class Foo
{
    protected $var1 = "1234",
              $var2 = "4567",
              $var3;
             
    public $var4,
           $var5 = false;
           
    private $var6;
}

Gefällt mir besser als die mehrfache, wiederkehrende Verwendung des gleichen Schlüsselworts. Nur unpraktisch bezogen auf Docblocks.

Veröffentlicht unter php, Quicktips, webdev | 1 Kommentar

Cross Domain AJAX Guide

As it is widely known, AJAX Requests are only possible if port, protocol and domain of sender and receiver are equal. This means, that the following requests generally won’t work:

  • Requesting https://foo.bar/target.php from http://foo.bar/source.php
  • Requesting http://sub.foo.bar from http://foo.bar
  • Requesting http://foo.bar:5000 from http://foo.bar
Failed remote AJAX

Failed remote AJAX

Having this cleared out, we will cover ways around this restriction.

CORS

CORS stands for Cross-origin resource sharing and has to be supported on the server side. If we take jQuery, the requesting side will look like this:

Veröffentlicht unter Javascript, webdev | 7 Kommentare

Facebook “ordered friends” – Eure Freunde/Stalker nach “Wichtigkeit” ausgeben

Update: Timon hat mich in den Kommentaren darauf aufmerksam gemacht, dass die Auflistung umbenannt wurde und nun InitialChatFriendsList heißt. Auch die Sortierung hat sich bei mir geändert.

Im Javascript-Quelltext der Facebook-Profilseite befindet sich der Abschnitt “OrderedFriendsListInitialData”. Hierdrin sind die Profil-IDs aller eurer Freunde nach zugemessener “Wichtigkeit” absteigend geordnet.

Wie Facebook dies genau bemisst, bleibt natürlich im Verborgenen. Höchstwahrscheinlich wird anhand dessen auch justiert, wieviel ihr von welchem Freund im Stream seht. Da wir mit den Profil-IDs alleine natürlich wenig anfangen können, musste ein kleines Script her, welches die Auflösung übernimmt:

1
2
3
4
5
6
7
8
$friends = array("1234567891011", "23456789101112", ...);

foreach ($friends as $i => $friend)
{
    $c = file_get_contents("http://graph.facebook.com/$friend");
    $c = json_decode($c, true);
    echo $c['name'] . "\n";
}

Dann am besten per CLI ausführen.

Veröffentlicht unter Javascript, php, webdev | 5 Kommentare

Javascript Array-Handling: inArray, löschen, kopieren

Suchen im Array

Sowas wie eine in_array Funktion gibts bekanntermaßen nicht in Javascript. Man kann sich das natürlich nachbauen, indem man durch das ganze Array iteriert und jeden Wert vergleicht – aber eher uncool!

Wers noch nicht wusste: indexOf klappt nicht nur mit Strings, sondern auch mit Arrays:

1
2
["foo", "bar", 1, 2, 3].indexOf("bar"); //1
["foo", "bar", 1, 2, 3].indexOf("foobar"); //-1

Geht leider nicht mit dem IE <= Version 6, wer den wirklich noch unterstützen muss, kann zumindest den Array-Prototyp erweitern und sowas verwenden:

1
2
3
4
5
6
7
8
9
Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

Handling ist dann:

1
2
["foo", "bar", 1, 2, 3].contains("foobar"); //false
["foo", "bar", 1, 2, 3].contains("bar"); //true

Vorsicht dabei allerdings, weil beim Iterieren über das array mittels for/in – Loop der prototype mitkommt, wenn man dies nicht mittels hasOwnProperty abfängt.

Selektives Löschen von Elementen des Arrays

Was nimmt man so klassischerweise? null setzen?

Veröffentlicht unter Javascript, webdev | Hinterlasse einen Kommentar

PHP WTF #10

Vorsicht! Microtime liefert negative Ergebnisse!

1
2
3
4
5
6
7
8
9
10
11
12
<?php
  $start = microtime();
  $i = 1000;
 
  while ($i--)
  {
    //do stuff
  }
 
  $end = microtime();

  echo 'Took ' . $end - $start . ' seconds';
Microtime

Microtime

Okay, durchatmen. Wo liegt der Fehler? Kenner bemerken vielleicht, dass das Wörtchen Took abhanden gekommen ist. Es geht einfach beim konkatenieren was schief:

1
2
<?php
echo "Calculating " . 6 + 5 . " is fun!";
Konkatenation

Konkatenation

Nach Operator-Wertigkeit müssen wir natürlich klammern:

1
2
<?php
echo "Calculating " . (6 + 5) . " is fun!";

Selbiges Problem tritt auch im Beispiel oben auf. Der Output von microtime() ist Millisekunden (Scriptlaufzeit) Sekunden (time()), also etwa 0.77571900 1350824124. Da bei unserer Rechnung einfach ein String -> Float – Cast vorgenommen wird und zudem noch die Operatoren-Wertigkeit missachtet wurde, kam es zu diesem merkwürdigen Ergebnis.

Veröffentlicht unter php, PHP-WTF, webdev | Hinterlasse einen Kommentar

Hacker spielen mit WebGoat

OWASP (The open web application security project) sollte ja jedem bekannt sein – OWASP hat sich besonders durch die OWASP Top 10 hervorgetan, in der die 10 größten Security-Risiken zusammengestellt sind. Ebenfalls von OWASP gibt es das WebGoat Project – eine Webseite, die step by step an die Websecurity heranführt. Von XSS über Session Fixation bis zu DOS kann man mit WebGoat alles geführt in Form einer Anleitung nachvollziehen.

Also: WebGoat hier herunterladen und entpacken, die Datei webgoat_8080.bat startet den integrierten Tomcat-Server auf Port 8080. Ist das getan, gilt es die URL http://localhost:8080/WebGoat/attack aufzurufen und sich mit webgoat – webgoat anzumelden.

Veröffentlicht unter Security, webdev | Hinterlasse einen Kommentar

Tilt3d – Webseiten in 3D betrachten

Kleiner Hinweis auf ein cooles Firefox-Plugin, was mir sehr gut gefällt: Tilt3d. Einmal installiert, startet man es wie folgt:

Tilt3d öffnen

Tilt3d öffnen

In Action sieht es dann so aus:

Tilt3d in Action

Tilt3d in Action

Mit Zoom und “Freiflugmodus”. Visualisiert schön die Divs und ihre Verschachtelung. Überkomplexe Layouts fallen so schnell auf. Sicherlich trotzdem eher eine Spielerei.

Veröffentlicht unter Quicktips, webdev | 2 Kommentare