coffee_desktop

Quick tip : démarrer un projet sans un sous dépenser

Bien le bonjoir,

Quand on débute un projet d’application, on n’a pas forcément de budget. Heureusement, on peut commencer sans dépenser un kopeck. Par quoi commencer ?

Tout d’abord « gérer » son projet. Vous pouvez évidemment vous contenter de post-it sur un mur mais vous pouvez également utiliser un outil simple et efficace : trello.

Maintenant que vous pouvez lister les tâches et répartir le travail, il faut stocker et partager le code source de votre application. Il existe pas mal de services pour des projets open sources, si vous voulez commencer par un dépôt privé, je vous propose Bitbucket. Vous serez ainsi doté d’un dépôt de source couplé avec tous les outils nécessaires (wiki, bug tracking, etc..)

Marché oblige, vous voulez internationnaliser votre application ? Pour travailler sur les traductions, je vous suggère onesky. Vous pourrez offrir une interface intuitive à vos traducteurs et exporter les traductions dans le format qui vous convient.

On commence à être bien, gestion de projet, gestion des sources mais il faut aussi pouvoir délivrer une application. Pour l’intégration continue, je vous conseille codeship.  Vous pourrez lancer votre compilation/construction, vos tests et déployer votre application ou bon vous semble.

Justement, en parlant de déploiement, vous pouvez utiliser Heroku ou jelastic ou openshift en fonction de vos besoins.

Voilà, en quelques services, vous pouvez commencer à travailler sur votre projet ! Je ne vous donne évidemment qu’une des nombreuses possibilités de ce qu’offre le net .  N’hésitez pas à commenter en ajoutant vos expériences et vos services préférés.

@bientôt

PS: je ne suis pas sponsorisé, ce ne sont que des services dont j’ai eu l’occasion de me servir 😉

 

La lumière zodiacale, mythe ou réalité ?

Bien le bonjoir à tou(te)s, pour reprendre tranquillement les publications sur mon blog, je vous propose une petite présentation d’astronomie (naviguez avec les flèches du clavier en plein écran).

Je suis membre de l’association « Les pléiades » et j’ai participé à la réalisation d’une petite présentation avec un ami, Christophe Boeuf, sur la lumière zodiacale. Ça m’a donné l’occasion de m’amuser avec Prezi, un outil vraiment sympa qui devient très puissant après une petite période de prise en main.

Concernant l’association d’astronomie, elle est vraiment sympa, on y fait de belles rencontres avec des puits de sciences d’une immense pédagogie mais surtout des passionnés de tous bords. Les belles nuits deviennent magiques quand on explore l’immensité de l’univers avec les bons compagnons de route.

@bientôt

JavaScript, un peu d’héritage

Bien le bonjoir, parlons un peu de Javascript. Ce langage dynamique nous donne une grande liberté qui se paye parfois par une multitude de possibilités d’implémentations y compris pour les concepts de base.

Pour faire simple, si vous voulez de l’héritage, vous vous codez ce dont vous avez envie. C’est le côté chiant coût de la liberté. Nous allons faire un petit tour pour comprendre les mécanismes de base et aborder différentes façons d’implémenter l’héritage.

Le chaînage de prototype

 Javascript ne propose pas de la programmation objet classique, mais une programmation orienté prototype qui peut être assez perturbante. Le langage ne se base pas sur des classes mais sur l’instanciation d’objets, les prototypes, qui servent de modèles pour créer de nouveaux objets. 

Les fonctions possèdent une propriété appelée prototype contenant un objet. Lorsque nous utilisons le mot clé « new » sur une fonction, un nouvel objet est créé à partir de l’objet prototype, il contient un lien caché vers ce prototype (nommé parfois __proto__).  Il n’y a pas que les fonctions, tous les objets possèdent un lien caché qui pointe vers un prototype. Le chemin qui permet de remonter successivement les liens vers les prototypes est appelé chaîne de prototype. L’objet dont le prototype est null fini la chaîne de prototype.

Un petit bout de code très basique pour voir ce mécanisme, ouvrez une console et tapez :

var func = function(text) {};
// the function prototype
console.log('func prototype : ' + func.prototype);
// the prototype of the function prototype
console.log('func prototype.__proto__: ' + func.prototype.__proto__);
// the top parent prototype is null, it is the final link in the prototype chain
console.log('func prototype.__proto__.__proto__: ' + func.prototype.__proto__.__proto__);

Ce qui nous donne :

func prototype : [object Object]
func prototype.__proto__: [object Object]
func prototype.__proto__.__proto__: null

Ce chaînage de prototype prend tout son sens lorsqu’on regarde la résolution de propriété sur un objet. Nous commençons par chercher la propriété sur l’objet, puis nous allons voir du coté du prototype et ainsi de suite jusqu’à atteindre la fin de la chaîne.

L’héritage « classique »

Justement, cet héritage profite du chaînage de prototype. Prenons un exemple d’objets :

//Shape constructor
function Shape(){
    this.name = 'shape';
    this.toString = function() {
        return this.name;
    }
};
//TwoDShape constructor
function TwoDShape(){
    this.name = '2D shape';
};
//Triangle constructor
function Triangle(side, height){
    this.name = 'Triangle';
    this.side = side;
    this.height = height;
    this.getArea = function() {
        return this.side * this.height / 2;
    }
};

L’héritage va se faire via ces simples lignes de code :

TwoDShape.prototype = new Shape();
Triangle.prototype = new TwoDShape();

L’héritage passe ici par l’affectation de l’instance de l’objet parent au prototype de l’objet enfant. Ce mécanisme découple chaque objet de l’héritage. Concrètement, si nous modifions  Shape après avoir fait l’héritage, ça n’aura aucun impact sur TwoDShape.

C’est le constructor qui est appelé pour instancier de nouveaux objets à partir du prototype. Dans le cas de notre héritage, nous écrasons le prototype et le constructeur qui va avec. Pour éviter des effets de bord, spécifions le bon constructeur :

TwoDShape.prototype.constructor = TwoDShape;
Triangle.prototype.constructor = Triangle;

Nous pouvons instancier un Triangle

var myTriangle = new Triangle(2, 5);
myTriangle.getArea(); // 5

Il existe un mot clé : instanceof qui teste si un objet possède la propriété prototype d’un constructeur donné dans sa chaîne prototype.

Faisons quelques tests :

myTriangle instanceof Shape; // true
myTriangle instanceof TwoDShape; // true
myTriangle instanceof Triangle; // true
myTriangle instanceof Number; // false

Nous obtenons la même chose en partant du prototype avec la méthode isPrototypeOf :

Shape.prototype.isPrototypeOf(myTriangle); // true
TwoDShape.prototype.isPrototypeOf(myTriangle); // true
Triangle.prototype.isPrototypeOf(myTriangle); // true
Number.prototype.isPrototypeOf(myTriangle); // false

Maintenant, regardons d’où viennent les méthodes, pour cela nous allons utiliser hasOwnProperty :

var triangle = new Triangle(5,4);

triangle.hasOwnProperty('getArea'); //getArea is a Triangle property: true
triangle.hasOwnProperty('toString'); // toString is a Triangle property: false

var twoDShapePrototype = Object.getPrototypeOf(triangle);
twoDShapePrototype.hasOwnProperty('toString'); //toString is a TwoShape property: false

var shapePrototype = Object.getPrototypeOf(twoDShapePrototype);
shapePrototype.hasOwnProperty('toString'); //toString is a Shape property: true

Un prototype pour tous

Nous pouvons nous dire que finalement tout le code à partager se retrouve dans le prototype. Histoire de limiter le temps de résolution des propriétés, référençons directement un seul prototype.

function Shape() {
};
Shape.prototype.name = 'Shape'
Shape.prototype.toString = function () {
    return this.name;
}

function TwoDShape() {
};
TwoDShape.prototype = Shape.prototype;
TwoDShape.name = '2D shape';

function Triangle(side, height) {
    this.side = side;
    this.height = height;
};
Triangle.prototype = TwoDShape.prototype;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
}

var myTriangle = new Triangle(2, 5);
myTriangle.getArea(); // 5
myTriangle.toString(); // Triangle

Cette fois-ci, la résolution de la méthode toString() se passe en deux étapes au lieu de quatre. Triangle ne possède pas la méthode, nous regardons dans le prototype, il référence le prototype de Shape et nous avons directement toString.

Vous vous doutez que ça pose quand même un gros problème 😉 . Toutes les modifications sur le prototype impactent toute la hiérarchie.

var myShape = new Shape();
myShape.toString(); // Triangle

Utilisation d’un constructeur temporaire

Un constructeur temporaire est utilisé pour hériter seulement du prototype du parent. Il utilise le chaînage de prototype.

//Shape constructor
function Shape() {
    this.justAShape = true;
};
Shape.prototype.name = 'Shape';
Shape.prototype.toString = function () {
    return this.name;
};
//TwoDShape constructor
function TwoDShape() {    
};
var F = function () {
};
F.prototype = Shape.prototype;
TwoDShape.prototype = new F();
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.prototype.name = '2D shape';
//Triangle constructor
function Triangle(side, height) {
    this.side = side;
    this.height = height;
}
var F = function () {
};
F.prototype = TwoDShape.prototype;
Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
};

var myTriangle = new Triangle(5, 2);
myTriangle.getArea();// 5
myTriangle.toString();// triangle
myTriangle.hasOwnProperty('toString'); // false
Object.getOwnPropertyNames(myTriangle) //side,height

var myShape = new Shape();
myShape.toString(); // Shape
Object.getOwnPropertyNames(myShape); //justAShape

En utilisant ECMAscript 5

ECMAscript 5 fourni une méthode Object.create qui permet d’instancier un objet à partir d’un prototype. Cette méthode donne un réel contrôle sur la création d’objet et du coup, nous pouvons nous passer complètement du code de constructeur temporaire.

//Shape constructor
function Shape() {
    this.justAShape = true;
};
Shape.prototype.name = 'Shape';
Shape.prototype.toString = function () {
    return this.name;
};
//TwoDShape constructor
function TwoDShape() {    
};

TwoDShape.prototype = Object.create(Shape.prototype);
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.prototype.name = '2D shape';
//Triangle constructor
function Triangle(side, height) {    
    this.side = side;
    this.height = height;
}
Triangle.prototype = Object.create(TwoDShape.prototype);
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
};
var myTriangle = new Triangle(5, 2);
myTriangle.getArea();// 5
myTriangle.toString();// triangle

myTriangle.hasOwnProperty('toString'); // false
Object.getOwnPropertyNames(myTriangle) //side,height

var myShape = new Shape();
myShape.toString(); // Shape
myShape.justAShape; // true
Object.getOwnPropertyNames(myShape); //justAShape

Alors pourquoi se servir d’un constructeur temporaire si Object.create fait le boulot ? Tout simplement pour le support des navigateurs. Si vous regardez la documentation MDN, vérifiez bien les versions supportées ! Pour Objet.create, nous avons : chrome 5+, Firefox 4.0+, IE9+, Opera 11.60+, Safari5+.

Si vous préférez hériter également des propriétés des objets en plus du prototype, il suffit d’appeler le constructeur du parent dans le constructeur enfant :

function Shape() {
    this.justAShape = true;
};
Shape.prototype.name = 'Shape';
Shape.prototype.toString = function () {
    return this.name;
};
//TwoDShape constructor
function TwoDShape() {    
    Shape.call(this);
};

TwoDShape.prototype = Object.create(Shape.prototype);
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.prototype.name = '2D shape';
//Triangle constructor
function Triangle(side, height) {
    TwoDShape.call(this);
    this.side = side;
    this.height = height;
}
Triangle.prototype = Object.create(TwoDShape.prototype);
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
};
var myTriangle = new Triangle(5, 2);
myTriangle.getArea();// 5
myTriangle.toString();// triangle

myTriangle.hasOwnProperty('toString'); // false
Object.getOwnPropertyNames(myTriangle) //justAShape,side,height
myTriangle.justAShape; // true

var myShape = new Shape();
myShape.toString(); // Shape
myShape.justAShape; // true
Object.getOwnPropertyNames(myShape); //justAShape

 

Le futur avec ECMAScript 6

Cette version d’ECMAScript est appelée Harmony et reste à l’état de discussion, du coup, tout ce nous pouvons comprendre à l’heure actuelle pourrait évoluer. Vous pouvez jeter un coup d’œil au draft en cours. La dernière version au moment ou j’écris l’article est datée du 27 avril 2014, et il faut avouer que c’est relativement illisible :p

J’ai commencé par essayer de déchiffrer la partie 14.5.17 Runtime Semantics: ClassDefinitionEvaluation , comme j’étais perplexe devant ce document, j’ai cherché des exemples concrets sur le wiki ecmascript.org. L’exemple nous montre que cette version permet une écriture plus proche de ce que nous connaissons dans les autres langages. Pour faire simple, disons qu’il s’agit de sucre syntaxique pour nous faciliter la vie. J’ai voulu tester en cherchant comment utiliser class et je suis tombé sur une table des compatibilités ECMAScript 5/6. Je n’ai pas pu tester directement mais j’ai découvert Tracer Compiler, l’espoir fut de courte durée car ce n’est pas encore supporté.

Bref, contentons nous d’imaginer ce nous pourrions écrire :

class Shape {
    private name = "Shape";
    
    constructor(){
       public justAShape = true;
       private(this).name = "Shape";
    }        

    get name() {
        return private(this).name;
    }

    public toString() {
        return this.name;
    } 
}

class TwoDShape extends Shape {
    constructor(){
       super()
       private(this).name = "2D shape";
    }        
}

class Triangle extends TwoDShape {
    constructor(side, height) {
        super();
        public side = side;
        public height = height;
        private(this).name = "Triangle";
    }
    
    public getArea() {
       return this.side * this.height / 2;
    }
}

 

Conclusion

Javascript nous laisse beaucoup de liberté, un peu trop diront certains, et il existe bien d’autres façons d’implémenter l’héritage. Le futur nous amène une syntaxe plus consensuelle  dans la lignée des autres langages, mais il s’agit surtout de sucre syntaxique. Ce que je retiens, c’est qu’en prenant le temps de réfléchir à l’héritage, nous voyons qu’il est important de :

  • comprendre le fonctionnement des prototypes
  • vérifier que la version de javascript que nous utilisons est compatible avec les navigateurs ciblés
  • prendre le temps de lire les documentations officielles et de tester le comportement directement dans un (ou plusieurs) navigateur(s)

En rédigeant cet article, j’ai découvert Tracer Compiler et j’ai mieux compris l’intérêt des Polyfill même dans le cas d’implémentations basiques. Ça m’encourage d’autant plus à tester mon code sur différents navigateurs (du coup, article sur Karma à venir 😉 )!

Références

Node.js & express.js for noob, premiers pas

Bien le bonjoir, je vous propose que nous découvrions nodejs ensemble. Pour ce faire, je vais reprendre le principe de Pibou en utilisant nodejs pour exposer une api que je pourrais attaquer avec différentes technologies front et/ou mobile. Mais pour commencer, parlons un peu de Node.js node_home_install

C’est quoi ?

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

Pour résumer, Node.js est un wrapper autour du moteur de javascript V8 qui permet de coder du bas niveau du côté serveur en Javascript.

Événementiel et non bloquant

La programmation est orientée événementielle: chaque action possède une fonction de rappel. Contrairement à d’autres technologies, la boucle de gestion des événements est transparente pour l’utilisateur, c’est le côté non bloquant. Concrètement, si vous lancez l’exécution de plusieurs actions, elles seront traitées en parallèle, sans attendre que la précédente ait appelé sa fonction de rappel.

Écosystème

Nodejs c’est aussi tout un ensemble d’outils. La philosophie peut se résumer à « vous avez un besoin, il y a un module pour ça ». C’est bien beau me direz-vous, mais comment gérer cette foison de modules? C’est là qu’intervient NPM, le node package manager. Il est très utile pour gérer vos modules. Il existe une multitude de modules, nous en reparlerons au fur et à mesure.

Installation

Pour commencer, il faut installer node.js sur votre machine, il y a tout ce qu’il faut sur http://nodejs.org/ Nous pourrions tout coder directement, mais je préfère utiliser un module qui nous facilitera la tâche : express.js. Pour installer express globalement, nous allons nous servir de npm (installé avec node)  :

npm install express -g

Voilà, il ne reste plus qu’a utiliser la génération d’express pour avoir un aperçu de notre structure de projet.

express pibou-node

Regardons ce que ça donne :

sortie console de la commande express pibou-node

sortie console de la commande express pibou-node

Suivons les instructions, d’abord aller à la racine du projet

cd pibou-node

Puis installer les dépendances :

npm install

Puis, lancer l’application :

node app

La console nous informe que le server est lancé : server_started Il n’y a plus qu’a ouvrir un navigateur : express_default Et côté serveur : first_responses   Voilà, on a un serveur qui tourne et qui rend une page. Bon, c’est un peu « magique » pour le moment, allons jeter un œil sur le code généré.

La structure du projet

La configuration

Le fichier package.json représente la configuration du projet. Nous allons juste donner un nom et une version à notre projet, ce qui nous donne :

{
  "name": "pibou-node",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.4.x",
    "jade": "*"
  }
}

Je vous conseille de faire un tour sur http://package.json.nodejitsu.com/, c’est une très bonne documentation dynamique pour la configuration. Pour savoir quelles sont les dépendances et leur version, vérifier les packages sur https://www.npmjs.org/.

L’application

On peut voir dans la configuration que le lancement de l’application se fait par la commande « node app.js », on peut en déduire que la racine du projet est dans le fichier app.js. Décortiquons son contenu :

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

La première partie liste les dépendances vers des modules de la bibliothèque ou vers les méthodes exposées dans l’application. On retrouve les modules importés via le package.json dans le dossier pibou-node/node_modules. Vient ensuite la configuration du serveur et les éléments à utiliser.  On voit qu’on utilise le moteur de templating jade pour les vues qui sont référencées dans le répertoire pibou-node/views. Vous pouvez choisir le moteur qui vous fait plaisir, il se trouve que Express.js propose jade par défaut. Cela vous permet de générer votre réponse au format html (ou autre format à la sauce xml). Express fourni un ensemble d’outil (log, middleware, traitement du json) qui sont bien pratiques. Je vous encourage vivement à faire un tour sur la documentation d’api et le guide d’express.js

Le Routing

Le mécanisme de routing est proche de ce que vous pouvez trouver avec rails. Vous déclarez un path et vous pouvez y lier une méthode. Prenons un cas concret :

var user = require('./routes/user');
//...
app.get('/users', user.list);

Vous dites que vous allez appeler la méthode ‘list’ exportée de pibou-node/routes/user.js. Si on regarde le fichier user.js ;

/*
 * GET users listing.
 */

exports.list = function(req, res){
  res.send("respond with a resource");
};

Le « exports. » est utilisé pour exporter la méthode, la rendre visible par require. La fonction se contente de répondre avec le texte « respond with a resource » sur une requête en get sur l’url http://localhost:3000/users.

Le templating

Nous avons parlé de jade, nous pouvons voir son utilisation dans le fichier routes/index.js.

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' });
};

C’est la partie render qui va appeler la vue correspondante, ici ça sera pibou-node/views/index.jade et lui passer un objet { title: ‘Express’ }. C’est la configuration dans pibou-node/app.js qui a défini pibou-node/views comme répertoire de référence pour les templates. L’appel à render précise de récupérer le fichier pibou-node/views/index dont l’extension est déterminée par le moteur de templating choisi, « .jade » dans notre cas. Allons regarder ce fichier de template :

extends layout

block content
  h1= title
  p Welcome to #{title}

Le vous laisse lire la documentation pour la syntaxe. Le fichier défini une structure html et utilise une variable pour rendre le titre. Nous avons vu qu’il suffit de passer un objet avec les propriétés attendues pour qu’il soit utilisable dans le template. En ce qui concerne le layout, si on suit la logique précédente, il suffit d’ouvrir le fichier /views/layout.jade :

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content

Il s’agit tout simplement de la structure de base d’une page html qui référence une CSS de base.

Et la suite ?

Je vous laisse découvrir ces technologies, générer votre projet et explorer la configuration du package.json. Notre prochaine étape nous fera manipuler le code et découvrir de nouveaux modules. @Bientôt

Références

Codecademy – L’école des padawans développeurs

Aujourd’hui, je vais vous parler de Codecademy, une plateforme d’apprentissage de développement en ligne.

Premiers pas

Vous pouvez attaquer votre apprentissage de deux façons :

  • Soit un cours parmi une liste  (Javascript, HTML/CSS, PHP, Python ,Ruby, APIs)
  • Soit réaliser des mini projets

Le cours

J’ai testé le cours de javascript :

  • Chaque chapitre représente une grande notion
  • Un chapitre propose une série d’exercices ciblés
  • Chaque passage de notion propose un exercice plus complet
  • Le cours est progressif et parfaitement adapté pour les débutants

Les mini projets

Il s’agit d’une suite d’exercices pour réaliser un mini projet en 30 min max. Le but est de vous familiariser avec la syntaxe et certaines particularités de la technologie.

Vous pouvez également réaliser et partager vos propres expérimentations.

Gamification & profil

Badges & points vous sont décernés au fur et à mesure de votre progression.
Vous pouvez évidemment partager vos victoires sur vos réseaux sociaux préférés 😉

Vous recevez un mail sur certaines actions et certains succès, tout est fait pour vous encourager dans l’utilisation de la plateforme.

Page de profil, ou y trouve les points, les bagdes et la progression

Page de profil, ou y trouve les points, les badges et la progression

 

Quand l’élève devient maître

Vous pouvez participer à l’évolution de la plateforme en proposant vos propres cours. Je n’ai malheureusement pas expérimenté cette partie. Il semble que vous pouvez vous créer une certaine réputation en proposant des cours de qualité.

Conclusion

Cette plateforme permet de partager et d’évoluer aussi bien en tant qu’élève qu’en tant que professeur. Le cours de JS est une bonne introduction et l’interface permet d’essayer rapidement son code. Mon seul bémol concerne la traduction très partielle et de qualité variable suivant la langue choisie. Si vous débutez dans une des technologies proposées ou que vous voulez revoir les bases, n’hésitez pas à vous inscrire et essayer ce service.

Codefest intel XDK à Toulouse organisé par BeMyApp

Quelques mots pour vous parler du codefest sur l’intel xdk organisé par BeMyApp à l’Epitech de Toulouse auquel j’ai participé avec un ami.

Accueil & orga

Le staff de BeMyApp était très sympa, l’accueil était chaleureux et les gens souriants. Pour la salle, bien que pourvue en boisson et grignotages, c’était plus compliqué. Il y avait apparemment plus de monde que prévu et il a fallu dealer pour trouver des places assises (merci à celui qui nous a permis de nous poser). Au final, la salle était bondée mais dans une bonne ambiance.

Présentation

Nous avons eu deux intervenants Xavier Hallade d’intel et Olivier Gonthier Consultant Android chez Orange Vallée.

Pour faire simple, Intel propose un ensemble d’outils pour faire du développement mobile à partir d’un dev web. Parmis ces outils :

  • Un éditeur de code basé sur brackets dont je vous parle dans l’article Brackets, l’éditeur web expérimental à expérimenter !
  • Un designer pour créer ses applications avec du WYSIWYG
  • Un émulateur (Apache Ripple)
  • Un écran de test pour mobile
  • Un écran de debug qui utilise les debugger tools de chrome
  • Un compilateur qui utilise Apache cordova pour lier le « tronc » web aux capacités natives des devices
  • Un accès aux serveurx d’intel qui se chargent de la compilation
  • Une api de manipulation de composents & d’événements

La force du produit est le fait d’avoir un environnement de travail complet qui permette un développement mobile en HTML/JS/CSS quelque soit le device ciblé (android/IOS/blackBerry etc..)

Avantages:

  • On s’abstrait du SDK et de l’environnement du device cible
  • On reste dans le même environnement de travail pour créer son appli, la tester, la packager et la déployer (je n’ai pas testé la publication sur les stores)
  • Pour ceux qui sont perdus avec le design, l’éditeur graphique permet de créer des écrans rapidement
  • Utilisation d’un socle commun web (html/css/js) pour faire des applis vers différents os mobiles

Inconvénients :

  • On est dépendant d’une connexion internet
  • On doit faire confiance à Intel pour le code envoyé (On nous a assuré de la confidentialité du code. Au pire on peut toujours obfusquer avant d’envoyer)
  • L’éditeur est pour l’instant bogué (interface qui plante, composants qui disparaissent)
  • La peinture est fraîche, ça reste de la Beta 😉
  • Les performances contestables

Conclusion

Un bon accueil et une présentation sympathique, mais l’intel xdk ne m’a pas convaincu. La peinture est trop fraîche, les performances contestables (du moins pour les applications de démo) et les problèmes trop nombreux à l’utilisation. Ça reste cependant une bonne idée, il faut être attentif aux prochaines évolutions.

N’hésitez pas à le tester et à partager vos avis. Pour les plus motivés, il y a un challenge : http://codefestchallenge.bemyapp.com/

 

 

Brackets, l’éditeur web expérimental à expérimenter !

Profile

logo de l'éditeur Brackets

Découverte

C’est lors d’une discussion qu’on me conseilla Brackets (merci Sylvain). C’est un éditeur Cross plateforme, simple, gratuit avec une communauté active, fait par et pour des développeurs web.

Made with ♥ and JavaScript

Je le télécharge, l’installe, et…. ça ne fait pas tout ce qu’on m’a promis! Point d’inquiétude cependant car mon conseilleur me dit : « ça marche avec un système d’extensions, je vais te filer les miennes ». OK, en fait les extensions se trouvent et se téléchargent directement depuis l’éditeur.

capture de l'écran de gestion des extensions 

Utilisation

Extensions

Je vous donne une petite liste d’extensions que j’utilise :

  • Annotate : génération d’annotations de jsdoc
  • Beautify : format JS, HTML& CSS
  • Brackets Key Remapper : permet de modifier le mapping des raccourcis
  • Brackets Snippets : une extension pour créer et utiliser des snippets
  • brackets-code-folding : extension pour avoir du code folding
  • Display Shortcuts : montre les raccourcis en bas de l’écran
  • Interactive Linter : remonte les erreurs à partir de JSHint/JSLint/CoffeeLint en temps réel
  • HTMLHint : support htmlLint
  • Jade : support de jade.js
  • Reload in Browser : pour recharger le browser avec un raccourci clavier
  • Simple JS Code Hints : support un peu moins contraignant que le JSLint d’origine
  • Themes for Brackets : fourni une liste de thèmes pour personnaliser l’éditeur
  • Theseus for Brackets : debugging JS dans Chrome pour Node.js
  • Todo : gestion des todo du projet
  • Various improvements : tout est dans le nom

Les mises à jours sont régulières et sont en évidence dans le gestionnaire d’extensions.
J’ai eu un problème avec l’extension des thèmes, il suffit de recharger Brackets (F5 ou Deboguer>Recharger Brackets)
Le linter JS interactif est parfois capricieux, la plupart du temps, il suffit de sauvegarder et de formater le code (ctrl+alt+l).
Il existe bien d’autres extensions, je ne vous ai pas listé toutes celles que je teste, mais je vous laisse le plaisir de la découverte.

Sur un projet

Capture d'écran de barckets sur un fichier app.js (node.js)

J’ai découvert Brackets en créant mon premier projet Node.js.
Avec les extensions et une console, c’est plutôt confortable.
On peut ouvrir un dossier représentant le projet et l’arborescence est accessible dans un volet.
Les code linters interactifs permettent de limiter les problèmes syntaxiques.
Le formatage et la coloration syntaxique sont plus que correct.
J’ai regretté l’impossibilité de splitter la fenêtre, finalement je lance plusieurs instances de Brackets.

Capture d'écran d'édition de css avec Brackets
J’ai été un peu déçu par par Theseus qui ne propose pas une exploration des objets en profondeur, mais je vous en reparlerai dans un article ultérieur.

Il y a quand même pas mal d’instabilité mais comme les technos sont récentes et les mises à jours très régulières, c’est tout à fait normal et supportable.

Conclusion

Les moins

  • L’instabilité des extensions. C’est l’apanage de la jeunesse.
  • Le foisonnement d’extensions peut perdre un peu le néophyte (que je suis).
  • L’état BETA. Il manque des choses basiques comme le split d’écran.
  • La politique d’Adobe. On a vu comment ont fini certains projets, on peut légitimement se demander ce qu’ils vont faire de cet éditeur

Les plus

  • L’esprit. On voit la même inspiration que pour Sublime Text
  • L’ouverture. On peut suivre les évolutions, partager nos remarques, participer au développement
  • La communauté vraiment active, des mises à jours régulières et des extensions bien pensées
  • La mise à jour en live du navigateur sur les modifications dans l’éditeur
  • Les aides d’éditions (choix des couleurs, modification des CSS etc..)
  • Les interactions éditeur/Chrome (affichage en live des appels de méthode d’un serveur node avec Theseus)

En bref

Brackets est un éditeur vraiment prometteur. Si cet esprit reste et que la gestion produit est bonne, on aura certainement un des meilleurs éditeurs du marché. La seule ombre au tableau est le doute quand à la politique d’Adobe. Je vous encourage vivement à le tester si vous bossez sur du JS, HTML et CSS.

Il est ou ton environnement de travail ? Dans ton cloud!

Dans de précédents articles (IDE rails la suiteAptana, finalement pas) , nous avons abordé différents IDE pour faire du développement rails sous Windows. Le choix d’outils en fonction de l’environnement est incontournable pour tout développeur. L’installation de l’IDE et la configuration de votre environnement n’est plus une fatalité, il existe une alternative: le cloud !

Je vous propose de découvrir deux outils  Koding et Cloud9 IDE online. Ce sont tous deux des environnements de développement intégrés utilisables directement dans votre navigateur favori.

Koding

C’est une plateforme de développement orientée réseau social. Quand vous vous connectez, vous tombez sur l’activité de tous les usagers. Sachant qu’à l’heure ou j’écris cet article, il y a 44 144 utilisateurs (d’après leur page membres), ça pollue passablement votre flux. Mais n’ayez crainte, vous pouvez configurer tout ça.

Coté développement, il y a de quoi s’amuser un peu. Il s’agit d’une VM avec un CentOS et des éléments de base: un terminal pour manipuler la vm, un éditeur de texte avec une coloration syntaxique et quelques applications.

J’ai testé un créateur de projet rails qui semble fonctionner sans problème. J’avoue avoir été un peu perdu une fois le projet créé, j’ai cherché comment l’utiliser car le viewer ne le permet pas.  Après plusieurs tentatives infructueuses et un peu de googling, je suis tombé sur la marche à suivre : http://kwiki.koding.com/wiki/RoR. Bon c’est un peu basique mais ça fonctionne ;). J’ai également récupéré mes projets depuis mon compte github sans aucun soucis.

Conclusion

Le message est clair, c’est une beta avec pas mal de « coming soon », de choses assez basiques  et de plantages réguliers (ralentissements, impossibilité d’utiliser la console). Cependant, on peut s’en sortir avec quelques recherches sur google et la lecture des documents proposés par les utilisateurs. L’orientation application  à la façon market encourage la communauté dans l’amélioration des services de la plateforme. On peut toutefois se demander sous quelle forme ce service sera monétisé et dans quelle mesure on pourra utiliser son compte « gratuit ».

Cloud9

Plus ancien, il est aussi plus abouti et bien documenté. La version gratuite permet une utilisation « basique » avec des espaces de travail publiques et alloue un espace de 123M. La version payante (12$/mois) permet, entre autre, 6 espaces privés, votre propre VM et un nombre illimité de collaborateurs. Pour mon test, je me suis connecté sur mon compte github et j’ai récupérer quelques projets. Pour le projet rails, j’ai suivi cette documentation. L’utilisation m’a parue plus simple que Koding et l’environnement moins « fouillis ». On comprend rapidement comment lancer son application.

Conclusion

Cloud9 propose un environnement efficace et clair. Il est plus mature, possède également une formule payante plus complète. Je n’ai pas eu de soucis particulier, ces quelques heures d’utilisation m’ont convaincue. Je pense continuer dans mon exploration, voir développer un ou deux petits projets avec, histoire d’en voir un peu plus. La version gratuite me suffit car je n’ai que peu de projets et ils sont tous open-source. Un passage à la version payante se justifierait avec un projet non open source ou des besoins plus importants (plus d’informations).

Le mot de la fin

A mon sens, Koding est clairement plus orienté plateforme communautaire alors que Cloud9 propose un environnement développement pur et dur. Les deux permettent de développer une application en gardant un œil sur le résultat et une console ouverte pour l’exécution des commandes et autres scripts.

Dans les deux cas, l’avantage de ne pas avoir à installer son environnement de travail est incontestable  Vous pouvez développer de n’importe où, il vous suffit d’un navigateur. L’inconvénient est bien-sur le besoin d’une connexion internet et l’ouverture vers l’extérieur qui peut soulever des problèmes de sécurité.

N’hésitez pas à partager vos expériences sur ces outils ou d’autres environnements. Il me reste deux invitations pour Koding si ça tente quelqu’un 😉

@bientôt

Tester, tout un art

Bien le bonjour. Aujourd’hui, nous allons aborder la partie tests d’une application. Je pensais attaquer directement sur des exemples de tests appliqués à Pibou mais nous allons d’abords discuter  de façon plus générale.

Pourquoi tester ?

L’utilité des tests est un grand sujet de débat. Pour ma part ils servent pour plusieurs choses :

Le design

La réalisation de tests aide à structurer son code. Ceci pour plusieurs raisons :

  • Les tests nécessitent une réflexion sur la façon de découpler son code.
  • Les tests mettent en pratique votre pensée et les concepts que vous voulez implémenter. C’est du « code d’intention », votre design va évoluer au fur et à mesure que vous allez le mettre en pratique dans le contexte d’utilisation.
  • Dans une logique de TDD (voir chapitre suivant), ils vont peu à peu changer votre façon d’aborder le développement.

La validation des fonctionnalités

Les tests sont à la fois l’expression des besoins fonctionnels et celle du comportement de votre code.
Il va permettre de valider ce qu’attend l’utilisateur mais également fixer le comportement, c’est une forme de spécification via des cas d’utilisations.

Le filet de sécurité

Les tests sont également là pour s’assurer de la non régression. Cette sécurité améliore les conditions de développement pour la maintenance, l’évolution et le refactoring du code. Combien de fois avez vous évité une refonte car vous n’étiez pas sûr de ne pas ‘casser’ quelque chose ? 😉

La documentation

Contrairement à une documentation « classique »  (type javadoc, wiki, doc, etc..), votre code se doit d’être à jour pour fonctionner.
L’écriture des tests nous indique comment le code doit se comporter mais également l’approche des personnes qui l’ont écrit. Les cas d’utilisation et les limites.

L’apprentissage

Si vous découvrez une nouvelle API ou un nouveau framework, l’utilisation de tests pour comprendre et découvrir est une excellente approche. Non seulement les tests mettront en évidence le comportement mais ils permettront également de fixer ce que vous attendez. Si le framework ou l’API évoluent, ces tests vous montrerons les changements qui impactent votre utilisation.

Un petit mot sur le TDD

Le Test Driven Development est une approche qui prône pour l’écriture des tests avant le code de production mais pas que. On peut le résumer par un cycle de développement tel que:

  1. Ecrire un test pour valider une fonctionnalité ciblé du code
  2. Faire échouer le test
  3. Ecrire le code de production qui répond à ce test
  4. Faire réussir le test
  5. Refactorer son code chaque fois que nécessaire à partir d’une suite de tests valide
Il s’agit de cycles courts qui doivent cibler des parties spécifiques du code. C’est un développement itératif et incrémental où chaque étape est une  évolution stable du code en fonction des besoins.

Les types de tests

  • Il y a les tests unitaires qui sont des tests en isolation. Il servent à tester spécifiquement des parties du code ‘de façon unitaire’.
  • Les tests d’intégration testent le comportement plus global de l’application. Il vérifient  les liens entre les différentes parties du code.
  • On parle parfois de test d’intégration pour les tests d’interface graphique. Il s’agit dans la plupart des cas de framework qui permettent de simuler des actions utilisateurs (click, changement de pages, remplissage de formulaires)
  • Il y a les tests fonctionnels qui sont la vérification du besoin métier. Ces tests sont plus souvent écrit dans un langage proche du métier et peuvent correspondre à des scénarios d’utilisation.
  • Les tests de performances poussent le code dans ses retranchements (mémoire, rapidité, scalabilité, charge).

Les limites

La rédaction de tests est un fabuleux outils de design, un filet de sécurité et une documentation. Mais pour que ça marche, il faut prendre soin du code de test autant que du code de production. Il doit rester le plus clair possible, à jour et doit évoluer en même temps que le code de production.

Il faut parfois se méfier de l’envie de tester systématiquement chaque méthode, il vaut mieux tester des fonctionnalités. Il faut également garder une cohérence dans le code, le test est là pour mettre en avant les problèmes potentiels, il ne doit pas en créer. Les tests doivent être facilement utilisables et relativement rapides pour tous les développeurs au risque d’être délaissés et donc inutiles.

Références

P1020130

Déballage du Nexus4, le google phone par LG

Bien le bonjour,

Après quelques frayeurs au moment de la commande puis de la livraison, je vous propose quelques photos du déballage du Nexus 4.

 

Les premières impressions

Le Nexus 4 a une bonne prise en main et je trouve que les finitions sont nickels. Pas de mauvaise surprise pour la configuration, tout se fait sans soucis. J’avais des craintes pour l’espace mémoire disponible (16Go) à cause des médias mais avec google drive et google Music, j’ai déjà la majorité de ma consommation multimédia « dans le cloud ».

Je sors d’un htc hero alors coté performance je suis gâté ! L’utilisation est très fluide, les images impeccables et ma partie de « cut the rope » n’avait rien à envier a mon IPad. Pour le fun, j’ai installé mes appli avec la détection vocale, la encore du pur bonheur…

Bref, je suis très content de cet achat, enfin de retour dans l’air du temps.  N’hésitez pas à me poser des questions. En attendant, je retourne jouer avec 😉

@Bientôt