mardi 24 août 2010

La hiérarchie du développeur

Voici la hiérarchie du développeur ;-)

Je n'aurais pas mis Java tout en bas, personnellement j'aurais plutôt mis PHP à la place de Java et Java à la place de PHP ...

hierarchie-developpeur.gif

(via)

Windows 95 fête ses 15 ans !

windows95launch.jpg

Et bien non vous ne rêvez pas, Windows 95 fête bien ses 15 ans !!

La première version de Windows 95 est sortie le 24 août 1995, Elle présentait de nombreuses nouveautés par rapport à son prédécesseur, Windows 3.1, les plus flagrantes étant l'environnement graphique et le Plug and play.

Depuis, Windows 98, ME, NT, XP, 2003, Vista et Window 7 ont été commercialisées par la firme Microsoft.

Ces 15 ans ne nous rajeunissent pas ...

http://www.Windows95.com

lundi 9 août 2010

Vous connaissez les Refcardz ?

refcardz.gif

Mon très cher collègue, Spawnrider, vient de me faire découvrir les RefCarz de dzone.com.

Les RefCards sont des petits PDF à imprimer dans lesquels on retrouve une synthèse sur un produit ou un langage de développement. C'est vraiment très pratique, très synthétique et il en existe plusieurs dizaines de disponibles gratuitement sur le site de Dzone :

Ce site est une vraie mine d'or pour les développeurs qui cherchent à diversifier leurs connaissances.

Les auteurs de ces Refcardz ne sont pas n'importe qui. On retrouve par exemple Craig Walls, l'auteur de Spring in action, Molly E. Holzschlag , l'auteur de The Zen of CSS Design ....

Très bonne lecture !

lundi 2 août 2010

JailbreakMe a permis à ma grand-mère de jailbreaker son iPhone 4G

Jailbreak iphone 4G

Le nouveau Jailbreak proposé par JailbreakMe pour jaibreaker l'iPhone 4G se base une nouvelle fois sur une faille de Safari (Webkit ?) pour installer Cydia en douce.

http://www.jailbreakme.com

Quand on regarde de plus prêt le code Javascript de la page, on y découvre une fabuleuse et incroyable fonction getSunSpiderInterval que même Einstein aurait eu du mal à coder et qui remet en question la sécurité du browsing sur Internet depuis un iphone / ipad / ipod ...

function getSunSpiderInterval() {
    if (_sunSpiderInterval) {
        return _sunSpiderInterval
    }
    var d = new Date,
        g = [],
        r = [],
        m = [],
        l = [],
        v = {},
        x = {},
        t, p = {};
    p.Width = 300;
    p.Height = 300;

    function n(L, J) {
        var I = L.V[0],
            K = J.V[0],
            H = L.V[1],
            G = J.V[1],
            F = Math.abs(K - I),
            E = Math.abs(G - H),
            A = I,
            i = H,
            C, D, B;
        if (K >= I) {
            K = I = 1
        } else {
            K = I = -1
        }
        if (G >= H) {
            G = H = 1
        } else {
            G = H = -1
        }
        if (F >= E) {
            G = I = 0;
            C = F;
            D = F / 2;
            B = E;
            F = F
        } else {
            H = K = 0;
            C = E;
            D = E / 2;
            B = F;
            F = E
        }
        F = Math.round(g.LastPx + F);
        for (E = g.LastPx; E < F; E++) {
            D += B;
            if (D >= C) {
                D -= C;
                A += I;
                i += H
            }
            A += K;
            i += G
        }
        g.LastPx = F
    }
    function q(i, B) {
        var A = [];
        A[0] = i[1] * B[2] - i[2] * B[1];
        A[1] = i[2] * B[0] - i[0] * B[2];
        A[2] = i[0] * B[1] - i[1] * B[0];
        return A
    }
    function b(A, E, D) {
        for (var i = [], C = [], B = 0; B < 3; B++) {
            i[B] = A[B] - E[B];
            C[B] = D[B] - E[B]
        }
        i = q(i, C);
        A = Math.sqrt(i[0] * i[0] + i[1] * i[1] + i[2] * i[2]);
        for (B = 0; B < 3; B++) {
            i[B] /= A
        }
        i[3] = 1;
        return i
    }
    function f(i, B, A) {
        this.V = [i, B, A, 1]
    }
    function e(A, D) {
        for (var C = [
            [],
            [],
            [],
            []
        ], i = 0, B = 0; i < 4; i++) {
            for (B = 0; B < 4; B++) {
                C[i][B] = A[i][0] * D[0][B] + A[i][1] * D[1][B] + A[i][2] * D[2][B] + A[i][3] * D[3][B]
            }
        }
        return C
    }
    function j(A, C) {
        for (var B = [], i = 0; i < 4; i++) {
            B[i] = A[i][0] * C[0] + A[i][1] * C[1] + A[i][2] * C[2] + A[i][3] * C[3]
        }
        return B
    }
    function k(A, C) {
        for (var B = [], i = 0; i < 3; i++) {
            B[i] = A[i][0] * C[0] + A[i][1] * C[1] + A[i][2] * C[2]
        }
        return B
    }
    function h(A, D) {
        for (var C = [
            [],
            [],
            [],
            []
        ], i = 0, B = 0; i < 4; i++) {
            for (B = 0; B < 4; B++) {
                C[i][B] = A[i][B] + D[i][B]
            }
        }
        return C
    }
    function o(A, C, B, i) {
        return e([
            [1, 0, 0, C],
            [0, 1, 0, B],
            [0, 0, 1, i],
            [0, 0, 0, 1]
        ], A)
    }
    function a(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [1, 0, 0, 0],
            [0, i, -B, 0],
            [0, B, i, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function z(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [i, 0, B, 0],
            [0, 1, 0, 0],
            [-B, 0, i, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function w(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [i, -B, 0, 0],
            [B, i, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function u() {
        var i = [],
            A = 5;
        for (g.LastPx = 0; A > -1; A--) {
            i[A] = k(m, g.Normal[A])
        }
        if (i[0][2] < 0) {
            if (!g.Line[0]) {
                n(g[0], g[1]);
                g.Line[0] = true
            }
            if (!g.Line[1]) {
                n(g[1], g[2]);
                g.Line[1] = true
            }
            if (!g.Line[2]) {
                n(g[2], g[3]);
                g.Line[2] = true
            }
            if (!g.Line[3]) {
                n(g[3], g[0]);
                g.Line[3] = true
            }
        }
        if (i[1][2] < 0) {
            if (!g.Line[2]) {
                n(g[3], g[2]);
                g.Line[2] = true
            }
            if (!g.Line[9]) {
                n(g[2], g[6]);
                g.Line[9] = true
            }
            if (!g.Line[6]) {
                n(g[6], g[7]);
                g.Line[6] = true
            }
            if (!g.Line[10]) {
                n(g[7], g[3]);
                g.Line[10] = true
            }
        }
        if (i[2][2] < 0) {
            if (!g.Line[4]) {
                n(g[4], g[5]);
                g.Line[4] = true
            }
            if (!g.Line[5]) {
                n(g[5], g[6]);
                g.Line[5] = true
            }
            if (!g.Line[6]) {
                n(g[6], g[7]);
                g.Line[6] = true
            }
            if (!g.Line[7]) {
                n(g[7], g[4]);
                g.Line[7] = true
            }
        }
        if (i[3][2] < 0) {
            if (!g.Line[4]) {
                n(g[4], g[5]);
                g.Line[4] = true
            }
            if (!g.Line[8]) {
                n(g[5], g[1]);
                g.Line[8] = true
            }
            if (!g.Line[0]) {
                n(g[1], g[0]);
                g.Line[0] = true
            }
            if (!g.Line[11]) {
                n(g[0], g[4]);
                g.Line[11] = true
            }
        }
        if (i[4][2] < 0) {
            if (!g.Line[11]) {
                n(g[4], g[0]);
                g.Line[11] = true
            }
            if (!g.Line[3]) {
                n(g[0], g[3]);
                g.Line[3] = true
            }
            if (!g.Line[10]) {
                n(g[3], g[7]);
                g.Line[10] = true
            }
            if (!g.Line[7]) {
                n(g[7], g[4]);
                g.Line[7] = true
            }
        }
        if (i[5][2] < 0) {
            if (!g.Line[8]) {
                n(g[1], g[5]);
                g.Line[8] = true
            }
            if (!g.Line[5]) {
                n(g[5], g[6]);
                g.Line[5] = true
            }
            if (!g.Line[9]) {
                n(g[6], g[2]);
                g.Line[9] = true
            }
            if (!g.Line[1]) {
                n(g[2], g[1]);
                g.Line[1] = true
            }
        }
        g.Line = [false, false, false, false, false, false, false, false, false, false, false, false];
        g.LastPx = 0
    }
    function c() {
        if (!(x.LoopCount > x.LoopMax)) {
            for (var i = String(x.LoopCount); i.length < 3;) {
                i = "0" + i
            }
            r = o(l, -g[8].V[0], -g[8].V[1], -g[8].V[2]);
            r = a(r, 1);
            r = z(r, 3);
            r = w(r, 5);
            r = o(r, g[8].V[0], g[8].V[1], g[8].V[2]);
            m = e(r, m);
            for (i = 8; i > -1; i--) {
                g[i].V = j(r, g[i].V)
            }
            u();
            x.LoopCount++;
            c()
        }
    }
    function y(i) {
        v.V = [150, 150, 20, 1];
        x.LoopCount = 0;
        x.LoopMax = 50;
        x.TimeMax = 0;
        x.TimeAvg = 0;
        x.TimeMin = 0;
        x.TimeTemp = 0;
        x.TimeTotal = 0;
        x.Init = false;
        r = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        m = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        l = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        g[0] = new f(-i, -i, i);
        g[1] = new f(-i, i, i);
        g[2] = new f(i, i, i);
        g[3] = new f(i, -i, i);
        g[4] = new f(-i, -i, -i);
        g[5] = new f(-i, i, -i);
        g[6] = new f(i, i, -i);
        g[7] = new f(i, -i, -i);
        g[8] = new f(0, 0, 0);
        g.Edge = [
            [0, 1, 2],
            [3, 2, 6],
            [7, 6, 5],
            [4, 5, 1],
            [4, 0, 3],
            [1, 5, 6]
        ];
        g.Normal = [];
        for (var A = 0; A < g.Edge.length; A++) {
            g.Normal[A] = b(g[g.Edge[A][0]].V, g[g.Edge[A][1]].V, g[g.Edge[A][2]].V)
        }
        g.Line = [false, false, false, false, false, false, false, false, false, false, false, false];
        g.NumPx = 18 * i;
        for (A = 0; A < g.NumPx; A++) {
            f(0, 0, 0)
        }
        r = o(r, v.V[0], v.V[1], v.V[2]);
        m = e(r, m);
        for (A = 0; A < 9; A++) {
            g[A].V = j(r, g[A].V)
        }
        u();
        x.Init = true;
        c()
    }
    for (var s = 20; s <= 160; s *= 2) {
        y(s)
    }
    p = LoopTime = x = v = l = m = r = g = null;
    return _sunSpiderInterval = new Date - d
};
/

Le code source complet du Jailbreak se situe ici : http://pastebin.com/pmQqsR2Y

Si l'un de vous est assez fou pour découvrir ce que fait exactement la fonction, n'hésitez pas à poster un commentaire ;-) Cette fonction est à mon avis la cause de la nouvelle faille exploitée par JailBreakMe.

Update : en fait la faille se situe au niveau de l'interprétation des PDF (Voir : http://www.jailbreakme.com/_/), cependant cette fonction doit jouer un rôle important dans le Jailbreak ... mais lequel ? ;-)

En attendant la correction du problème de sécurité par Apple, ne trainez pas trop sur des sites de warez / X ....

Happy Jailbreak !

Toute la toile parle du Jailbreak iphone 4G

samedi 31 juillet 2010

GeekInsult.com : Parce-que ta mère est plus grosse que la bible scannée en TIFF !

geek insulte

Suite au carton de l'article sur les insultes geek posté il y a une semaine, j'ai décidé de mettre en ligne un site participatif dédié aux insultes Geek ;-)

http://www.geekinsult.com/

Le concept est très simple, chacun peut proposer ses insultes et voter pour les insultes des autres.

Tous les messages postés sont ensuite relayés sur Twitter et Facebook.

N'hésitez pas à aller faire un tour sur le site et à contribuer ! ;-)


NB : Toutes les insultes postées sur geeek seront migrées vers ce portail.

dimanche 25 juillet 2010

Le TOP 10 des langages de programmation

Tiobe vient de publier des nouvelles statistiques concernant l'évolution de sa communauté de développeurs.

tpci_trends.png

On peut noter trois points intéressants.

1) L'adoption massive de l'Objective C grâce au succès de l'iPhone. Les développeurs se sont mis au développement d'applications iPhone ;-)

history_Objective-C.png

2) Le visual basic est en train de mourir petit à petit ;-)

history__Visual__Basic.png

3) L'usage de Java s'écroule d'année en année, le rachat de SUN par Oracle ne va pas aider les choses ...

history_Java.png

Toutes les statistiques détaillées sont présentées sur le site de Tiobe

(Via Ziserman).

lundi 19 juillet 2010

RIM répond aux commentaires d'Apple

blackberry-rim.jpg

Suite aux commentaires d'Apple concernant la réception de certains Blackberry, les co-directeurs généraux de RIM répondent publiquement ;-)

« La tentative d’Apple d’entraîner RIM dans la débâcle où il s’est mis lui-même est inacceptable. Les allégations d’Apple à propos des produits de RIM relèvent d’une tentative délibérée pour fausser la façon dont le public perçoit la question de la conception de l’antenne et détourner son attention de la situation difficile dans laquelle se trouve Apple. RIM est un leader mondial en matière de conception d’antennes ; depuis plus de vingt ans, il élabore avec succès des produits de transmission de données sans fil qui font référence dans son industrie pour leur utilisation efficace du signal radio. Depuis ses débuts, RIM évite les designs tels que celui retenu par Apple pour son iPhone 4 et leur préfère des designs innovants qui réduisent le risque de coupures d’appels, surtout dans les zones mal couvertes. Le fait est que les clients de RIM n'ont pas besoin de placer leur smartphone BlackBerry dans un étui pour conserver une bonne connectivité. Apple a clairement fait certains choix de design et devrait en assumer la responsabilité au lieu d'essayer d’impliquer RIM et d'autres dans une situation qui ne concerne qu’Apple. »

- Mike Lazaridis et Jim Balsillie

samedi 17 juillet 2010

Comment utiliser le SMTP de Free depuis votre mobile ?

logo-free.jpg

En voici une bonne nouvelle pour les personnes possédant un abonnement mobile incluant les emails.

Free vient de lancer son service SMTP authentifié pour permettre d'envoyer des emails depuis des réseaux autres que celui de Free.

Vous allez maintenant pouvoir envoyer des emails avec votre compte email Free directement depuis votre mobile. Pour activer ce service encore en beta, il suffit de se rendre sur l'interface d'administration Free et d'activer le service "Gestion du SMTP authentifié".

Une fois le service activé, il suffit de configurer le client email de votre téléphone avec les paramètres suivants :

  • Serveur : smtp.free.fr
  • Port : 587

- page 1 de 137