Journal de bord: création d’un RTS en HTML5, jour 2

Journal de bord: création d’un RTS en HTML5, jour 2

Introduction
Ce billet fait suite au billet précédent: http://blog.developpez.com/ducodeetdulibre/p12404/developpement/journal-de-bord-creation-dun-rts-en-html5-jour-1

Dans ce billet je vais vous détailler les fichiers rts.js et canvas.js , leur utilisation, leur construction.

Faire une application HTML5/canvas
Mais avant, je dois vous expliquer le fonctionnement global d’une application HTML5: pour ceux qui ont déjà fait des jeux en flash, il faut se dire vous dire que l’HTML5 est plus austère: oubliez la scène, la timeline et les clips, ici juste un canvas, soit une image fixe.
Ce que l’on fait pour créer une animation, selectionner un élement.. ce sont des maths : aucun objet sur un canvas, juste des pixels de couleurs différentes imprimés ou éffacés sur une image (le canvas).
Pour simplifier un peu la gestion et les performances, on créé autant de canvas que de calques nécéssaires:
Un canvas pour le sol, un canvas pour les batiment, un autre pour les personnage, le brouillard, la selection…

lib3/canvas.js
Cette classe est très importante dans ce projet, elle permet de faciliter les interactions avec les canvas.
Vous pouvez ainsi coder plus facilement:

1
2
var oCanvas = new Canvas('idDeMonCanvas');
oCanvas.drawRectStroke(x,y,largeur,hauteur,epaisseur,couleur);

Au lieu de :

1
2
3
4
5
6
7
var canvas = document.getElementById('idDeMonCanvas');
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.lineWidth=epaisseur;
ctx.strokeStyle=couleur;
ctx.strokeRect(x,y,largeur,epaisseur);
ctx.closePath();

Comme vous pouvez le voir c’est plus concis et plus agréable à écrire.

Voila à quoi ressemble cette classe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//CANVAS
function Canvas(id){
    this.canvas = document.getElementById(id);
    if(!this.canvas){
        alert('cannot find "'+id+'"');
    }
   
    this.ctx = this.canvas.getContext('2d');
    this.width = this.canvas.width;
    this.height = this.canvas.height;
    this.fill_color = "#FFF";
    this.stroke_color = "#000";
}
Canvas.prototype={
   
    isInside: function(pos) {
        return true;
    },
    clear: function(){
        this.ctx.clearRect(0, 0, this.width, this.height);
    },
    clearRect: function(x,y,width,height){
        this.ctx.clearRect(x, y,  width, height);
    },
    circle: function(p,r){
        x = p.x*this.width;
        y = p.y*this.height;
        this.ctx.beginPath();
        this.ctx.strokeStyle = this.stroke_color;
        this.ctx.moveTo(x+r,y);
        this.ctx.arc(x,y,r,0,TWO_PI,false);
        this.ctx.fill();
    },
    line: function(x1,x2){
        this.ctx.beginPath();
        this.ctx.strokeStyle = this.stroke_color;
        this.ctx.moveTo(x1.x*this.width,x1.y*this.height);
        this.ctx.lineTo(x2.x*this.width,x2.y*this.height);
        this.ctx.stroke();
    },
    drawRect : function(x,y,ilargeur,ihauteur,contour,fond){
        this.ctx.beginPath();
        this.ctx.lineWidth=1;
        this.ctx.strokeStyle=contour;
        this.ctx.fillStyle=fond;
        this.ctx.fillRect(x,y,ilargeur,ihauteur);
        this.ctx.strokeRect(x,y,ilargeur,ihauteur);
        this.ctx.closePath();
    },
    fillRect : function(x,y,ilargeur,ihauteur,fond){
        this.ctx.beginPath();
        this.ctx.lineWidth=0;
        this.ctx.fillStyle=fond;
        this.ctx.fillRect(x,y,ilargeur,ihauteur);
        this.ctx.closePath();
    },
    drawRectStroke : function(x,y,ilargeur,ihauteur,contour,width){
        this.ctx.beginPath();
        this.ctx.lineWidth=width;
        this.ctx.strokeStyle=contour;
        this.ctx.strokeRect(x,y,ilargeur,ihauteur);
        this.ctx.closePath();
    },
    fillText:function(x,y,texte,couleur){
        this.ctx.textBaseline = 'top';
        this.ctx.fillStyle=couleur;
        this.ctx.fillText(texte,x,y);
    },
    drawLosange: function (x,y,ilargeur,ihauteur,couleur,fond){
        this.ctx.lineWidth=1;
        if(couleur!='#000000'){
            this.ctx.lineWidth=2;
        }
        this.ctx.beginPath();
        this.ctx.moveTo(x,y+(ihauteur/2) );
        this.ctx.lineTo(x+(ilargeur/2),y);
        this.ctx.lineTo(x+(ilargeur/1),y+(ihauteur/2));
        this.ctx.lineTo(x+(ilargeur/2),y+(ihauteur/1));
        this.ctx.lineTo(x,y+(ihauteur/2));
        this.ctx.strokeStyle = couleur;
        this.ctx.stroke();
        this.ctx.fillStyle=fond;
        this.ctx.fill();
        this.ctx.closePath();
    },
    drawImage: function (img,x,y,width,height){
        this.ctx.drawImage(img,x,y ,width,height  );
    },
    isInThisLosange: function(x,y){

    },
   
};

]

rts.js
Ce fichier contient plusieurs choses: les variables de contexte générales comme les dimensions d’une case, la fréquence de raffraichissement, les coordonnées du QG…
Mais aussi et surtout plusieurs fonctions clés : preload(), load() et run()

La fonction preload(), appellée au chargement de la page: elle instancie chaque Canvas/calques et la classe Map (pour charger les images)
Elle attend pour le moment une seconde avant de lancer le chargement de l’application, mais ceci devra être changé plus tard pour se basé sur le temps de chargement des images et non une durée arbitraire.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function preload(){
    oLayer_map=new Canvas('layer_map');
    oLayer_apercu=new Canvas('layer_apercu');
    oLayer_building=new Canvas('layer_building');
    oLayer_perso=new Canvas('layer_perso');
    oLayer_select=new Canvas('layer_select');
    oLayer_buildingcreation=new Canvas('layer_newbuild');
    oLayer_buildingcreation.ctx.globalAlpha=0.9;
   
    oLayer_brouillard=new Canvas('layer_brouillard');
    oLayer_brouillard.ctx.globalAlpha=0.9;
   
    oLayer_cadre=new Canvas('layer_cadre');
    oLayer_cadre.ctx.globalAlpha=0.2;
   
    oLayer_apercuCadre=new Canvas('layer_apercuCadre');
    oLayer_apercuBuild=new Canvas('layer_apercuBuild');
    oLayer_apercuBrouillard=new Canvas('layer_apercuBrouillard');
    oLayer_apercuBrouillard.ctx.globalAlpha=0.9;
   
    //on instancie la classe Map et Game pour précharger un peu les images
    map = new Map();
    oGame=new Game;
   
    setTimeout(load,1000);
}

La fonction load(), appellée 1 seconde apres le preload doit construire l’application:
Elle créé le batiment et l’unité de départ, puis appelle la construction de la map, celle de l’apercu et le cadre indiquant la zone affichée.
Elle permet également l’affichage des batiments, des zones utilisées pour le scrolling via la souris et les ressources disponibles (or/bois).
Et enfin appel la fonction run qui sera notre fonction de raffraichissement.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function load(){
    //on cache la div de chargemetn
    getById('loading').style.display='none';
   
    //on construit la map, l'apercu
    //et le cadre d'information de la map affichée
    map.build();
    map.buildApercu();
    map.buildApercuCadre();
   
    //on créé une unité de départ
    var oUnit =new Unit('soldat','WPface.png');
    oUnit.x=4;
    oUnit.y=7;
    oUnit.build();
   
    //on ajoute cette unité à un tableau tUnit
    //(pour pouvoir boucler dessus pour mettre à jour)
    oGame.tUnit.push(oUnit);
   
    //on créé le batiment de départ (QG)
    var oBuild=new Build('building','img3/build1.png');
    oBuild.x=QGx;
    oBuild.y=QGy;
    oBuild.build();
   
    //on ajoute ce batiment au tableau tBuild
    //(pour boucler et réafficher lors d'un scrolling)
    oGame.tBuild.push(oBuild);
   
    //on créé ici une mine d'or sur la map
    var oBuild=new Build('or','img3/mine-or.png');
    oBuild.x=17;
    oBuild.y=17;
    oBuild.build();
   
    //on ajoute cette mine d'or au tableau tBuild
    oGame.tBuild.push(oBuild);
   
    //on affiche les batiments sur la carte
    oGame.rebuild();
    //on affiche les ressouces de départ (or/bois)
    oGame.buildRessource();

    //on affiche les zones réactives
    //pour scroller la map avec la souris
    oGame.drawDirection();
   
    //on commencera la boucle de raffraichissement run()
    //dans N secondes
    setTimeout(run,fps);
   
}

La fonction run(), appelée toutes les N secondes (variable fps)
Cette fonction est appelée regulièrement, elle permet de créer cet effet d’animation: le déplacement d’une unité, la création d’un batiment, le scrolling…
Elle vérifie si on doit scroller et dans ce cas là appel la reconstruction du calque/canvas contenant les batiments
Sinon en permanence boucle sur l’ensemble des unités pour faire évoluer leurs déplacements.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function run(){  
   
    //si la souris est sur une zone active de scroll
    if(sDirection=='up'){
        //scroll haut
        oGame.goUp();
    }else if(sDirection=='down'){
        //scroll bas
        oGame.goDown();
    }else if(sDirection=='left'){
        //scroll gauche
        oGame.goLeft();
    }else if(sDirection=='right'){
        //scroll droite
        oGame.goRight();
    }else{
        //sinon on affiche les zones réactives
        oGame.drawDirection();
    }
   
    //on raffraichit les unités
    oGame.refreshUnit();
   
    //dans N secondes on appelera de nouveau cette fonction
    setTimeout(run,fps);
}

Quelques illustrations pour rappel

rtshtml5

Le github
Le projet GitHub : https://github.com/imikado/rtshtml5

Journal de bord: création d’un RTS en HTML5, jour 1

Introduction
Il y a une semaine, en discutant avec des collègues d’un petit jeux que j’avait fait en html5, m’est venu l’idée un peu dingue de faire un jeu de stratégie temps réel.
L’idée était de faire un bon vieux RTS à l’ancienne, un peu comme Warcraft: notre madeleine de proust.
J’ai mis les sources sur Github en LGPLv3 afin de permettre d’apprendre de ce projet et de permettre à d’autre de se lancer pour s’amuser ou plus dans le developpement de jeux HTML5.

L’idée du journal
Au vu des soucis que j’ai rencontré en le développant, je me suis dit qu’écrire une sorte de journal de bord serait une bonne idée, que cela pourrait en intéresser plus d’un.
Je vais au fil du développement poster l’état d’avancement du projet ainsi que les problèmes rencontrés et les solutions trouvées.

Jour 1: Présentation du projet
Le projet est assez modeste pour qu’il soit réalisable et aille jusqu’au bout.
Une carte, avec la possibilité de scroller à l’aide de la souris, une miniature en bas à droite pour voir où nous sommes.
Vous débutez avec un personnage et un QG qui permet de créer des nouveaux « batisseurs »
Chaque bâtisseur peut créer l’équivalent d’une barrack warcraft pour créer des unités d’attaque.
Il y a un début de gestion de ressources: vous pouvez envoyer une unité « batisseur » à la mine d’or pour recueillir de l’or, ou aller chercher du bois.
Il y a une gestion de zone connu et inconnu qui evolue au fil de l’exploration.
Lorsque vous construisez un bâtiment, il ne peut être construit que dans la partie visible et libre, un gestion de couleur verte/rouge pour l’indiquer.

Quelques images
rtshtml5
Création d’un batiment
rtshtml52
rtshtml53

Présentation technique
Le projet se décompose en N fichiers:
rts.html : le fichier principal html incluant les fichiers javascripts, canvas…
rts.js: le fichier javascript principal gérant le chargement du jeu, + la boucle de mise à jour
rts_Game.js : la classe du jeu
rts_Build.js: les classes Build et Wood (pour les batiments, mines et arbres)
rts_Unit.js: la classe Unit (pour les unités)
lib3/canvas.js : la classe pour interagir plus facilement avec le canvas

Ce qu’il reste à faire
Gérer un temps de création d’unité et de bâtiment pour qu’ils ne soient plus immédiat.
Gestion d’attaque: une unité armé, doit, à proximité d’un enemie l’attaquer.
Gerer les points de vie + de défense.
Permettre de creer des batiments pour améliorer l’attaque et la défense.
Permettre la sélection multiple.
Création d’ennemie avec une petite intelligence artificielle pour permettre un mode mono joueur « tower defense ».
Créer un moteur de jeux réseau pour faire une partie multi-joueur.
Améliorer les graphismes ;)

Les infos supplémentaires
Le dépot github: https://github.com/imikado/rtshtml5

2013, l’année de GNU/Linux ?

Si vous suivez un minimum l’actualité tech, vous avez pu remarqué que l’on a jamais autant entendu parlé de linux que cette année
Pour rappel:

  • Le succès grandissant du raspberry Pi (qui tourne sous GNU/Linux)
  • La Nasa qui fait migrer les ordinateurs de la Station spatiale internationale vers Linux*
  • Le code Linux « référence de qualité » selon Coverity*
  • La gendarmerie qui a « envoyé bouler » Microsoft et McAfee*
  • Munich qui économise 11 millions*
  • La gendarmerie qui passe sous GNU/Linux*
  • Android qui conserve sa position dominante
  • Steam qui débarque sur GNU/Linux
  • Steam qui propose des machines sous Steam OS (Linux)
  • IBM va investir 750 millions d’euros dans son linux*
  • Dell qui propose un portable spécial « developpeur » sous ubuntu*
  • Ldlc qui propose ses portables avec ou sans Os (pour y installer l’OS de son choix)*
  • Ubuntu qui débarque sur les tablettes/smartphones avec ubuntu touch

*http://www.numerama.com/magazine/26373-comment-la-gendarmerie-a-envoye-bouler-microsoft-et-mcafee.html
*http://www.zdnet.fr/actualites/la-nasa-fait-migrer-les-ordinateurs-de-la-station-spatiale-internationale-vers-linux-39790175.htm
*http://www.developpez.com/actu/55204/Le-code-Linux-reference-de-qualite-selon-Coverity-la-qualite-du-code-open-source-presque-equivalente-a-celle-du-code-proprietaire/
*http://www.lemondeinformatique.fr/actualites/lire-munich-economise-11-millions-d-euros-en-passant-a-linux-51432.html
*http://www.tomshardware.fr/articles/gendarmerie-linux,1-45857.html
*http://languedoc-roussillon.france3.fr/2013/09/18/ibm-va-investir-750-millions-d-euros-montpellier-pour-son-logiciel-linux-320771.html
*http://www.dell.com/us/business/p/xps-13-linux/pd
*http://www.ldlc.com/informatique/ordinateur-portable/pc-portable/c4265/+fb-C000000888+fv403-2134.html

Une presse favorable
Aujourd’hui, chaque magazine s’empresse de publier la moindre information concernant l’adoption de l’open source en général que ce soit l’abandon de Microsoft Office ou la migration totale sur GNU/Linux
Dans un contexte économique qui favorise les économies, ces journalistes n’hésitent pas à clamer en gras les chiffres des économies réalisées ( économies en prenant en compte les formations et le support).

Un intérêt grandissant par des acteurs du marché
Dell avait déjà, il y a quelques années, tenté l’aventure en proposant des netbooks sous ubuntu.
Depuis quelques mois, la société récidive et propose une déclinaison de son XPS version développeur le « XPS 13 Laptop, Developer Edition » (sous ubuntu).
Comme avec LDLC, on voit bien ici la différence de prix d’une centaine d’euros pour la licence Windows « OEM ».
Coté Valve, (avec ses steam machines) la société y voit l’occasion de proposer sa propre console/pc de salon (sans payer de licence à Microsoft pour la plateforme) et ainsi potentiellement toucher un public plus large en faisant plus de bénéfices.

Une offre de produits riche et de qualité
On peut remercier le marché des smartphones / tablettes, qui, via Android, contribue beaucoup au noyau GNU/Linux.
Avec d’un coté la gamme Galaxy de Samsung et de l’autre une offre très bon marché Nexus (supervisé par Google) pour proposer une gamme complète répondant au besoin de nombreux clients.
Grâce à ce marché conquis par Andoid, GNU/Linux représente aujourd’hui une bonne part du marché grand public, comprenant les desktop, laptop, tablettes et smartphones
Une offre serveur éprouvée : qui ne connait pas le couple LAMP (Linux Apache Mysql Php) déclinable pour d’autres SGBD/langages/serveurs
Mais ce n’est pas tout: le raspberry pi, cet ovni dans le monde informatique avec son architecture ARM tourne sur des OS GNU/Linux.

Une offre GNU/Linux décliné à toutes les sauces
Aujourd’hui, l’utilisateur en a pour tous les gouts: d’un coté une offre grand public avec Ubuntu, Fedora, Opensuse ou Linux Mint pour son ordinateur personnel.
Il peut également opter pour des versions customisables/optimisable jusqu’au bout des octets comme Gentoo ou Archlinux.
Il a de l’Android pour sa tablettes / son smartphone en attendant de nouveaux arrivants comme Ubuntu Touch et Firefox Os.
Une gamme compilée sur ARM pour faire tourner sur son raspberry pi.

Conclusion
Comme vous avez pu le lire, GNU/LInux n’a jamais été aussi présent tant dans la presse que sur le marché.
En tant qu’ubunteros et open-sourcePhile,j’attends avec impatience l’arrivée de Firefox Os et Ubuntu Touch dans nos mobiles, ainsi que les Steam machines dans nos salons.

Le raspberry Pi ya bon mangez en

Au début de l’informatique (début des années 70), les premiers à tenter l’aventure était des bricoleurs qui achetaient une machine non exploitable en l’état et devaient construire leur tour en bois, des fois souder des fils de cuivre…
Aujourd’hui ce n’est plus le cas, au pire, pour les plus bricoleurs, on peut acheter les éléments séparés et les assembler dans une tour en utilisant au mieux un tournevis.
Mais l’arrivée du raspberry Pi a su raviver cette flamme.

Un succès étonnant
Qui aurait pu croire qu’une micro carte peu performante utilisant un processeur ARM (et non x86) pouvait séduire autant de personnes.
Le produit est vendu non seulement nu (juste la carte), mais utilise qui plus est un processeur assez atypique pour un ordinateur: l’ARM et sans OS
Si l’on peut aisément comprendre que le produit puisse séduire les plus bricoleurs/curieux d’entre nous, même les créateurs était loin d’imaginer un tel succès.

Un OVNI dans l’univers informatique
On connaissait les laptops pour travailler en mobilité, les ordinateurs pour travailler avec de la puissance, les media center pour améliorer sa TV… mais le raspberry pi fait office d’OVNI
Si au premier abord, on peut trouver le produit fun et réserve aux curieux, beaucoup y ont trouvé leur compte dans de multiples domaines bien différent.
Un véritable écosystème s’est créé autour de ce produit atypique, certains proposent des boitiers, d’autres des accessoires, il suffit de tapper son doux nom dans google pour être submergé de résultats

Un premier atout: son prix
Commercialisé à moins de 30 euros, cette véritable carte mère d’ordinateur est accessible à chacun. Ce tarif permet de tenter l’aventure à moindre frais, mais ce n’est pas tout, il permet d’envisager d’en acheter en lot par exemple pour les écoles.

Un produit qui suscite l’intérêt
Vous avez du lire de nombreux billets sur cette carte, mais vous êtes loin d’imaginer l’engouement grandissant autour:
Au menu:

  • des magazines lui sont consacré magPI, PIAddict
  • des blogs spécialisés: framboise314,
  • un planet consacré
  • Des conférences Devoxx…
  • Des évenements organisés autour
  • des livres

*http://www.themagpi.com http://www.magcloud.com/browse/magazine/526151
*http://www.framboise314.fr
*http://planet.raspfr.org/
*Devoxx France 2013
*Au CERN en octobre 2013 https://cern-raspberrypi.eventbrite.fr/
*http://www.developpez.net/forums/d1385242/general-developpement/programmation-systeme/embarque…

Un raspberry pi pourquoi faire ?
Il y a deux types de clients pour ce produit: les premiers qui commandent en connaissance de cause, ils ont un projet et compte sur cette carte magique pour le réaliser
Et les autres, qui par curiosité, pour des raisons de prix attractif… passe le pas et se retrouve démuni en recevant leur colis.
Pour ces personnes là, on voit toutes les semaines des articles/billets vous proposer des idées d’utilisation, Korben en avait écrit un interessant http://korben.info/idees-raspberry-pi.html

Conclusion
Le raspberry pi est une bonne idée, un produit à fort potentiel qui ravive nos ames d’enfants et nos esprits bricoleurs, de plus de part son coté épuré, il a créé de facto un écosystème pour enrichir/compléter la bête.
J’espère si vous ne connaissiez pas ce produit, vous avoir donné envie de lire sur le sujet :)

Et vous, avez vous déjà commandé le votre, comptez vous le faire à long terme ? Ou n’êtes pas du tout intéressé par ce type de produit ?

Si la presse papier pouvait innover en imitant la VOD

C’est une idée intéressante, testée en suède depuis le mois de juin par la société Meganews.
Depuis quelques années, on peut lire des dirigeants de magazine/journaux papier se plaindre d’internet: se plaignant de voir leur ventes chuter.

Un point sur le contexte
Une chose à prendre en compte, c’est le risque que prennent les journaux/magazines à chaque numéro: ils doivent avoir une ligne éditoriale à la fois originale mais également tempéré pour essayer de vendre un maximum d’exemplaires.
Mais pour vendre, il faut d’abord produire et c’est là où ils préfèrent et incitent leur clients à s’abonner.
Les abonnées ce sont des exemplaires déjà vendus, alors que les kiosques c’est un pourcentage d’exemplaires de perdu.
Ils savent qu’ils vont produire plus que ce qu’ils vendront, mais ils doivent en même temps imprimer en masse pour bénéficier d’économies d’échelle.
Et ils doivent également produire pour être le plus visible possible sur un maxium de kiosques.

La presse spécialisée, la première impactée
Si vous souhaitez vendre un maximum il vous faut cadrer vos articles pour répondre au plus grand nombre.
Pour la presse spécialisée (informatique,graphisme,photo…) c’est encore un autre débat: ils savent qu’ils ont un public plus restreint et malgré tout doivent vendre leurs exemplaires plus cher:
Ils éditent moins d’exemplaires donc ne peuvent bénéficier d’économies d’échelles, et parce qu’ils éditent moins, ils gagnent moins d’argent avec les encarts publicitaires (elle dépend de l’audience)
C’est un cercle vicieux et non seulement ils savent qu’ils doivent vendre plus cher, limitant encore plus leur public (magazine GNU/linux/informatique autour de 6 euros)
Mais en plus ils doivent produire assez pour être visible dans un maximum de point de vente.
Et avec toutes ses contraintes, ils doivent susciter l’intérêt à chaque exemplaire pour ne pas rester avec trop d’exemplaires sur les bras.

Quand le physique s’inspire du numérique
L’idée ici, à la manière de la VOD (Vidéo à la demande), c’est de proposer d’imprimer le magazine/journal sur demande. Comme on télécharge un film/un podcast..
La société Maganews propose des bornes, où l’on sélectionne son produit et en un clic, on imprime notre produit.
Ainsi, tous les magazines spécialisés pourraient proposer leurs produits un peu partout sans prendre de risque. On pourrait même voir fleurir de nouveaux magazines qui profiteraient de ce mode pour se lancer en papier.
Combien de magazine existe et son diffusés en version pdf gratuitement ou non : phpSolutions, le magazine developpez (ici même), Full Circle (sur GNU/Linux)…

Conclusion
Si ce type de borne arrive en france, elles pourraient réconcilier la presse écrite avec les nouvelles technologies.
Qu’en pensez-vous, seriez vous client de ce type de produit ?
Et vous, êtes vous abonné, ou achetez vous de la presse spécialisée ?

Source:

http://www.influencia.net/fr/rubrique/check-in/marketing-progress,impression-demande-revolution-pour-presse-ecrite,112,3692.html

La ligne de commande aujourd’hui, ou comment évolue les mentalités ;)

Ajourd’hui, à l’heure des interfaces tactiles multipoints, des débats sur le flat design… les utilisateurs de la ligne de commande passe pour des barbus de l’informatique ;)
Elle est aujourd’hui associée aux hackers, linuxiens et autre administrateurs: dans de nombreux films elle symbolise l’interaction avec la matrice, le hack d’une page voir d’une administration aussi sécurisé que la CIA/FBI (cf opération Espadon…)
Oui la ligne de commande est qualifiée d’anti-ergonomique, on parle souvent de Mme Michu pour indiquer que celle-ci est anti-convivial, on lui préfère des interfaces ou l’on clique, scroll, slide…

Et pourtant…
Il ne faut pas oublier qu’aux débuts de l’informatique, Mme Michu (la fameuse) n’avait pas d’interface graphique (ça n’existait pas), elle était habituée dans son travail à taper des lignes de commandes.
Dans de nombreuses sociétés, les utilisateurs passaient par telnet ou un autre protocole pour parler à un serveur UNIX-like (généralement), j’ai d’ailleurs travaillé il y a quelques années sur un ERP qui était accédé en telnet via un logiciel qui interprétait certains caractères pour les remplacer par des barres, coins, boutons… afin de simuler une interface graphique.

Tout ça pour dire que la ligne de commande n’avait à l’époque rien de rebutant pour l’utilisateur moyen, que celui-ci s’adaptait et faisait avec sans se plaindre :)

Madeleine de Proust numérique
Je me souviens d’un temps que les moins de vingts ans ne peuvent pas connaitre, celle où sur son Atari/Comodore ou autre, on faisait son petit « cd monJeux » suivi d’un petit « run » pour lancer celui-ci ;)
Il y avait même certains jeux qui se jouaient en mode texte: The big Bang Theory (très bonne série d’ailleurs) y fait un clin d’oeil dans un épisode où sheldon propose une soirée jeux.
Sans oubliez notre bon vieux minitel, qui n’avait pas non plus d’interface graphique au sens actuel du terme ;)

La ligne de commande, la puissance à l’état brut
Même si la majorité du public est passé aux interfaces graphiques, on utilise encore dans beaucoup de postes informatiques la ligne de commande.
Car même, si depuis de nombreux outils (client lourd / client web) aient été développé, on peut accorder plusieurs avantages à notre bonne vieille ligne de commande.

  • Elle est performante: rien n’égale un grep ;)
  • Elles permettent de se faire scriptées/ automatisées très facilement
  • Toutes les fonctionnalités ne sont pas disponibles dans les solutions graphiques*
  • Permet simplement d’administrer des serveurs / postes distants sans devoir installer/configurer une solution de partage d’écran

*il est très lourd de devoir developper toutes les interfaces / formulaires pour égaler les multiples paramètres

Sans oubliez certains outils en ligne de commande d’une puissance / performance incroyable, au choix: sed/awk/grep/find/df…

Conclusion
Ce billet pour indiquer que les esprits changent, évoluent mais surtout que les utilisateurs sont assez intelligent pour s’adapter à leurs outils.
Si aujourd’hui avec l’effervescence des interfaces tactiles (smarphone/tablettes) certains éditeurs veulent nous imposer cette vision juqu’à nos PCs non tactiles, il ne faut pas oublier que c’est l’utilisateur final aura le dernier mot, et se servira de son porte monnaie pour émettre son avis ;)

Il est également intéressant de voir aujourd’hui à l’heure du tout tactile, la ligne de commande est toujours autant apprécié et puissante :)

ORM or not ORM faut-il les utiliser ?

Avec l’arrivée des frameworks php, nous avons appris à évoluer entre ces nouveaux acronymes: MVC, DAO, DRY et ORM
Mais qu’est-ce qu’un ORM ?
Un ORM (Object Relation Mapping) est un ensemble de librairies qui vous permettent d’interagir avec vos données via des objets.
La plupart des frameworks respectant le design MVC* intègrent leurs propres ORM plus ou moins performants.
note: pour les exemples de syntaxes d’ORM j’utiliserai l’ORM du mkFramework.

*MVC: Model View Controller (séparation de la couche modèle de l’affichage et du controlleur)

Un ORM pourquoi faire ?
Pourquoi utiliser un ORM plutôt que d’écrire simplement des requêtes SQL dans pdo ?
Si vous voulez coder propre, vous allez dans un premier temps écrire toutes vos requêtes dans un fichier php.
Si vous souhaitez organiser un peu mieux, vous allez regrouper les requêtes par table…
Si vous souhaitez éviter de vous répéter, vous aller créer un fichier/une classe pour les éléments récurrents (connexion, requête…) : principe de DRY*
Le fait de faire ceci, vous avez créé un pseudo début d’ORM ;)

*DRY Don’t Repeat Yourself (créer des fonctions/classes pour éviter d’écrire plusieurs fois le même code)

Un des avantages des ORM se situe concernant la manipulation des données.
Prenons un exemple ou dans plusieurs pages vous devez modifier uniquement le titre, l’auteur ou le nombre de vue d’un article.
En pdo simple vous écririez:

‘UPDATE article SET titre=? WHERE id=?’,$titre,$îd
‘UPDATE article SET auteur=? WHERE id=?’,$auteur,$îd
‘UPDATE article SET nbVue=nbVue+1 WHERE id=?’,$îd

Avec l’ORM vous n’avez pas besoin d’écrire à l’avance vos différents types de requêtes

$oArticle=model_Article::getInstance()->findById($id);
$oArticle->titre=$titre;
$oArticle->save();
//ou
$oArticle->auteur=$auteur;
$oArticle->save();
//ou
$oArticle->nbVue=($oArticle->nbVue+1);
$oArticle->save();

note: vous pouvez, si vous le souhaitez écrire des requêtes update
Exemple:

class model_article extends abstract_model{
(…)
public function updateNbVue($id){
$this->execute(‘UPDATE article SET nbVue=nbVue+1 WHERE id=?’,$id);
}
}

Les avantages sont multiples:

  • Organiser vos requêtes
  • Gagner du temps à l’écriture
  • Bénéficier des avantages du design MVC*

Tous les ORMs n’offrent pas les mêmes performances
Pour argumenter un post dans un topic sur ce même site, j’avais à l’époque procédé au benchmark suivant:
100 000 enregistrements en base de donnée mysql, et l’affichage de ces lignes dans un tableau html.
5 types différents:
– php simple en utilisant pdo
– une application en Zend Framework (version 1.11.12)
– une application en Yii (version yii-1.1.14)
– une application en MkFramework (méthode findMany() )
– une application en MkFramework en utilisant la récupération rapide (méthode findManySimple() )

Résultat des courses:

benchmark

– 0.50s : pdo simple
– 0.58s : MkFramework en utilisant la récupération rapide
– 0.68s : Yii (version yii-1.1.14)
– 1.97s : MkFramework (normal)
– 11.20s : Zend Framework (version 1.11.12):

note : j’ai fait un benchmark sur 100 000 entrées pour avoir un volume assez important pour mettre en évidence les différences de performances, si j’avais fait un findById(4)
Sur un seul enregistrement on aurait
benchmark2

– 0.007s : pdo simple
– 0.015s : MkFramework en utilisant la récupération rapide
– 0.043s : MkFramework (normal)
– 0.049s : Zend Framework

note 2 : pour obtenir de bonnes performances avez yii j’ai écrit les requêtes sans passer par les classes « ORM »

$sql=’SELECT * FROM Article';
$connection=Yii::app()->db; // vous devez avoir une connection « db »
$command=$connection->createCommand($sql);
$articles=$rows=$command->queryAll();

Les ORMs offrent de la flexibilité
J’ai lu à plusieurs reprise que les ORM étaint lourd, qu’ils retournaient toujours toutes les colonnes même ceux non utilisées, que pour faire une jointure on se retrouvait à récupérer une ligne entière sur les deux tables liés…
Premièrement, vous pouvez choisir de récupérer uniquement certains champs de votre table. Beaucoup d’ORM proposent d’écrire sa requête SQL
Par exemple:

class model_article extends abstract_model{
(…)
public function findListAuteurName(){
return $this->findMany(‘SELECT auteur.name FROM auteur’);
}
}

Idem pour les fameuses jointures, vous avez le choix de récupérer par exemple un objet article puis de lui demander de nous retourner son auteur pour afficher son nom ainsi

$oArticle=model_article::getInstance()->findById(4);
print $oArticle->findAuteur()->nom;

Mais vous pouvez également écrire une méthode qui vous retournera les articles avec leur auteurs ;)

class model_article extends abstract_model{
(…)
public function findArticleWithAuteur(){
return $this->findOne(‘SELECT article.titre, auteur.name FROM article INNER JOIN auteur ON article.auteur_id=auteur.id WHERE article.id=?’,(int)$id);
}
}

Une flexibilité aussi concernant les performances: selon les parties de vos sites vous avez besoin de récupérer plus ou moins d’élements et ceci plus ou moins rapidement.
La encore vous avez le choix: si vous devez récupérer un auteur, ses articles et ceci sans trop regarder les performances vous pouvez utiliser la méthode de récupération d’objets riches findMany/findOne
Si au contraire vous souhaitez afficher un bon nombre d’article d’auteurs, ou autre, vous pouvez utiliser la méthode rapide retournant des objets « simple » findManySimple/findOneSimple

Vous avez le choix :)

Conclusion
Comme vous avez pu le lire ici, tous les ORM ne sont pas des usines à gaz, ils sont très pratiques et vous permettent dans l’esprit du MVC de bien organiser votre couche modèle.
Les ORM sont une bonnes choses que vous codiez une petite application ou une application importante: l’essentiel c’est de penser à long terme (la maintenabilité).
Il sera plus simple pour vous ou un collègue d’intervenir sur votre application avec ORM que sans ORM ;)
Certains ORM sont plus ou moins flexible et performant comme les frameworks, mais ne les mettez pas tous dans le même panier, essayez en plusieurs avant de vous faire un avis.

note: je n’ai pas inclus Symfony 2 (pour tester doctrine) dans le benchmark car malgré mes efforts d’optimisation de cache, mode production… je n’arrivais pas à passer sous la barre des 23 secondes :(
Si vous pouvez m’envoyer un exemple d’application affichant ces 100 000 enregistrements en moins de 2 secondes je suis preneur ;)

note2: retrouvez dans mon post d’origine les éléments du benchmarks (sauf celui de yii fait ici pour l’occasion)
http://www.developpez.net/forums/d1252983-2/club-professionnels-en-informatique/actualites/etes-vous-pour-contre-orm-blogueur-invite-a-tenir-baton-par-milieu/#post6847792

La réalité augmentée comme nouveau périphérique d’interaction ?

Depuis le début de l’informatique, on utilise le clavier d’abord pour saisir des lignes de commandes, puis avec l’arrivée des premiers logiciels de traitement de texte à saisir du texte.
Et ceci, malgré l’arrivée des interfaces graphiques toujours plus ergonomique, cela n’a pas évoluer: on utilise toujours un clavier physique pour saisir nos champs de saisies, rédiger nos courrier, faire des « raccourcis clavier » sous photoshop/gimp/maya/blender… et autres logiciels de DAO
Idem pour les logiciels de montages (et bien sur les jeux)
La souris, elle, n’est arrivée qu’au début des années 80 (même si elle fût crée dans les années 60), elle a permis d’améliorer grandement notre utilisation de l’ordinateur, en permettant de cliquer/cochez, déplacer des éléménts des curseurs… plus facilement.

Des périphériques de saisies qui n’évoluent plus
Mais ça fait tout de même 30 ans que ceux-ci nous accompagne, et à part ajouter quelque touches sur le clavier, des lumières sur l’un et des boutons/molettes supplémentaires sur le second, ils n’ont plus vraiment évolué depuis.

Dans le reste de la famille, tous ont évolué
Des écrans devenus ultra plat (face aux cathodiques d’antant), des unités centrales plus petites, des disques durs sans mécanique, du réseau sans fil…
Tous les autres composants/périphériques évoluent sauf nos bons vieux claviers/souris (mis à part le passage de la boule au laser…)
On a également vu nos écran devenir eux-même des périphériques de saisie avec l’arrivée et la démocratisation du tactile, certains edieur d’OS ont même fait évoluer leur interface dans ce sens.

Ne sous exploitons pas la puissance de la réalité augmentée
Il existe une technologie qui malheureusement comme le souflée a suscité au départ beaucoup d’idées pour finalement être aujourd’hui très sous exploitée: la réalité augmentée.
Celle-ci est utilisée aujourd’hui pour le monde ludique avec Kinect(microsoft), le marketing d’ Atol (qui permet d’essayer des lunettes en ligne), dans certains applications sur smarphone (on voit à l’écran la rue avec des indications supplémentaires comme le métro, les restaurants…) , ou dans de futurs produits comme les Google Glass
Mais aujourd’hui, avec le prix des webcam en chute libre et leur qualité grandissante, on pourrait utiliser cette réalité augmentée chez nous, dans notre quotidien :)

Et si on inventait un nouveau mode d’interaction
Il y a deux différentes façons d’utiliser cette technologie:
1. en ayant des éléments réels identifiés qui servirait d’interface:
2. en comptant sur la reconnaissance de nos mains pour interagir avec l’application

Première solution en utilisant des élements physiques reconnu dans nos applications.
Imaginez par exemple qu’en fonction de l’application que vous utilisez, vous pouviez sortir une plance A4 ou plus grand comprenant les boutons nécessaires pour décharger l’application de ceux-ci
Ainsi, au lieur d’user de raccourcis clavier, vous auriez des boutons avec des visuels/icones plus reconnaissable :)
C’est une manière de gagner de la place à l’écran et d’avoir votre bureau organisé comme vous l’entendez.
Pour rendre ceci plus modulable, on pourrait imaginez des boutons/icones aimantés, et ainsi posez des surfaces en metal ou simplement métalique sur votre bureau avec les boutons/icones/raccourcis disposés où vous le souhaitez.
Vous changez d’application ? pas de soucis, rangez cette plaque et prenez celle de l’autre application ;)

Deuximème solution: utilisez vos propre mains comme périphérique virtuelle: allez cliquez sur un icone, prenez et tourner un objet en 3d.
Quelques exemples:
En 3D:
Prenez un objet dans les mains et redimensionnez le avec vos deux mains, déposez le où vous le souhaitez, tourner le pour travaillez sur une partie précise, et user de votre souris quand vous souhaitez être plus précis.

En montage vidéo:
Prenez dans une main votre piste vidéo, pendant que dans la seconde vous activez un effet dessus.
Prenez votre piste a deux mains et redimensionnez la, voir posez la sur votre bureau pour la mettre de coté.

Je vous invite a regader ces vidéos pour voir ce qu’il est possible de faire:
http://cg.cs.uni-bonn.de/fileadmin/Downloads/Hand-Tracking/assembly-simulation.wmv
Ou celle-ci http://cg.cs.uni-bonn.de/aigaion2root/attachments/hybrid-cursor-video.avi

Conclusion
Vous avez pu voir ici des idées d’utilisation de la réalité augmentée comme un nouveau périphérique pour votre ordinateur.
Note: certaines vidéos date de 2009 (soit 4 ans) ce qui est énorme en informatique, depuis les webcam et nos processeurs ce sont encore amélioré, et l’on peut imaginer une meilleure précision ainsi qu’une meilleure analyse de nos mouvements plus fluide.
Note 2: souvent les démonstrations montre des mains levés pour manipuler des éléments de l’interface, nous avons bien conscience que ceci pourrait s’avérer gênant et fatiguant à l’usage. Il vaudrait mieux filmer nos mains à plat sur le bureau.

Personnellement je préferais mixer les deux modes d’utilisation: filmer le bureau qui contiendrai des élements physiques d’intéraction (boutons/raccourcis..) ainsi que la prise en compte de nos deux mains car le fait de pouvoir utiliser les deux en même temps, et de manière complémentaire serait un vrai plus.
Qui n’a jamais pensez ouvrir de sa main gauche un repertoire pour y coller de la main droite des fichiers ;)
C’est toujours un peu frustrant en 2013 de n’avoir que sa souris pour interagir à l’écran, rien que le fait d’en avoir deux (avec deux curseurs à l’écran) pourrait nous faire gagner du temps au quotidien :)
Après on peut imaginer pour optimiser la reconnaissance de nos mains, soit une ou plusieurs bagues à mettre, soit un simple gant, ou comme sur certaines démonstrations des doigtier de couleurs.
Retenez également que toutes ces idées ne demanderait que très peu d’investissement pour gagner en confort contrairement au tactile qui nécessite changer son écran entier :(

sources:
Realitée augmentée chez atol: http://www.opticiens-atol.com/collections-atol/realite-augmentee/index.php
L’application Metro Paris: http://www.metroparisiphone.com/
Une idée d’interaction avec nos interfaces http://cg.cs.uni-bonn.de/en/projects/markerless-vision-based-hand-tracking-for-interaction/

L’écran tactile peut-il se passer de clavier physique sur smartphone/tablette ?

Au début on utilisait uniquement des claviers physiques sur nos téléphones, puis, avec l’arrivée des smartphones, on a vu notament grâce à nokia voir une molette lateralle cliquable, puis blackberry avec sa petite boulle cliquable permet de faire évoluer une souris.
Depuis on a des interfaces tactiles qui nous simplifient la vie dans toutes nos applications sauf pour un point: la saisie de texte :(

L’écran tactile remplace le clavier/souris physique ?
Oui et non, si l’écran tactile, permet de remplacer la souris: on clique avec le doigt, on fait défiller/scroll… pour le clavier c’est un autre débat.
Le clavier a pour principal avantage d’être très productif/confortable, il permet de taper du texte de manière naturelle et rapide, ce qui n’est pas le cas du clavier tactile qui nous oblige a regarder les touches (car ne les sentant pas sous les doigts)

Des idées innovations qui pourrait faire évoluer les choses
tikinotes
Premièrement certains prennent le pari de modifier notre manière de saisir les lettres, comme tikinotes qui divise le clavier en groupe de lettres.
source: http://www.tikilabs.com/
Mais le principal défaut du tactile, c’est de ne pas « sentir » les touches sous les doigts: même si certains smartphone comme le Samsung S4 propose un retour « haptique » qui indique que l’on a bien cliqué sur une touche, on ne « sent » pas les touches autour et on a donc du mal a bien positionner ses doigts sur le clavier virtuel.

Et si il suffisait de faire « pousser » des touches sous les doigts ?
tactus
Non vous ne rêvez pas, la société Tactus travaille sur une technologie permettant de faire « sortir » des boutons de la surface en modifiant un fluide particulier.
L’idée est très bonne en effet et permet de palier au plus gros soucis du tactile ;)

Une vidéo vaut mieux qu’un pavé de texte, visionnez juste cette vidéo issu du CES de cette année pour vous faire une idée: La vidéo youtube de présentation

source: http://www.tactustechnology.com/

Conclusion
Dans ce billet je n’ai pas parlé des claviers additionnels, stylet.. (bluetooth ou autre), ce n’est pas l’objet, ici on parle bien de l’écran de tactile en lui-même.
Comme vous avez pu le voir, nous ne sommes pas au bout de nos surprises, et ces prochaines années nous réservent des innovations qui vous semble magique actuellement mais seront aussi banal pour nos enfants /petis enfants que le fait d’envoyer des photos vidéos par des ondes ;)

Et si l’on s’inspirait des réseaux sociaux dans la vraie vie

Aujourd’hui avec les avancées technologiques dont nous bénéficions, nous pouvons facilement retrouver des camarades d’ecoles/de promos.
Nous pouvons converser/échanger sur des sujets qui nous intéressent avec des personnes autant passionnés que nous.
Oui, tout ceci est possible dans le monde numérique, à coté de cela, dans la vraie vie: on ne se parle plus dans les transports, on s’isole avec son casque/écouteurs…

Le panier mauve de Yahoo Rencontres
Une idée simple: le contraire de l’alliance, un signe distinctif indiquant que l’on était disponible.
Yahoo rencontres et Lafayette Gourmet avait initié en 2004 un évènement récurrent (tous les jeudi entre 18h30 et 21h): en choisissant à l’entrée de l’hypermarché un panier mauve (spécialement décoré pour l’occasion) vous indiquiez aux autres clients que vous étiez célibataire et « ouvert à la rencontre » ;)

Des communautés numériques
Dans nos réseaux sociaux habituels, on peut à l’aide d’icone ou autre éléments graphiques: connaitre la zone géographique de quelqu’un, ses intérêts… vous pouvez facilement trouver des personnes pour discuter de sujet qui vous passionne (groupes facebook, google+, et même les forums comme celui de developpez)
Avec google+, on peut rejoindre de véritables communautés de passionnés pour partager des news/articles…
Sur developpez, on peut se tenir informé, lire des articles/tutoriaux sur nos points d’intérêts et surtout participer à une communauté de développeurs qui seront ravi de nous aider/débattre/répondre à nos questions ;)

Et si nous nous inspirons de ces réseaux sociaux
Aujourd’hui, quand vous souhaitez discuter d’une news/article que vous avez apprécié, vous pouvez simplement ouvrir votre navigateur et aller le partager/ en débattre sur le groupe Google+ qui convient.
Personnellement j’utilise et apprécie beaucoup des groupes comme nipTech, Front End Developpement, PodSource ou Php France, j’y partage les news/articles que je souhaite partager et apprécie de pouvoir en débattre et les commenter avec les autres membres.
Mais dans la vraie vie, je reste persuadé de voyager au quotidien avec des personnes tout aussi passionnés dans les transports en commun. Et je trouverais ça sympathique de pouvoir afficher certains centres d’intérêts (si et quand on le souhaite) afin de pouvoir plus facilement engager la conversation :)
Il faudrait dans ce cas un signe à la fois visible, facilement otable:
Autant certains matins/soirs vous souhaiteriez discuter d’une information/ d’un sujet intéressant, autant quelque fois vous êtes fatigué et simplement pas d’humeur et aimeriez fermer les yeux, écouter votre musique ou lire.
Il faudrait à ce moment là, comme pour le panier mauve de Yahoo Rencontres, décider d’afficher que vous êtes clairement ouvert à discussion sur tel ou tel sujet ;)

Quel mode d’affichage
C’est ici le coeur du problème: il faudrait un élément à la fois visible et facilement cachable, otable, on oublie donc le t-shirt qui si il est très visible est difficilement masquable, surtout en été ;)
On pourrait penser à un bracelet par exemple, avec pourquoi pas des petits « badge » que l’on pourrait « clipser » voir tourner vers l’intérieur si on ne souhaite pas être déranger :)

Conclusion
J’espère avoir réussi a passer le message, et je pense que certains d’entre vous pense comme moi, on remarque tous ce paradoxe technologique: à la fois ultra connecté, sociable numériquement et complètement isolé réellement :(

Et vous qu’en pensez-vous ?
Profitez en également pour partager vos communautés préférés ;)

*Communautés Google+:
– Front End Developpement: https://plus.google.com/communities/111367038232031168926
– NipTech https://plus.google.com/communities/104157063722839703523
– PodSource https://plus.google.com/communities/111443826532215124280
– PhpFrance https://plus.google.com/communities/110438507313707850364