Affichage des articles dont le libellé est enseigner. Afficher tous les articles
Affichage des articles dont le libellé est enseigner. Afficher tous les articles

dimanche 24 février 2019

Oracle JET : des composants et non pas une framework

Le développement frontend repose principalement sur des framework JS. Ces frameworks peuvent imposer l'architecture à suivre mais aussi le style de développement à suivre, et la question qui vient à l'esprit d'un minimaliste est : Existe-t-il une solution plus légère ? Comment développer ("prototyper") en frontend en utilisant JS sans avoir à faire appel à une framework ?

Cette question me vient toujours à l'esprit à chaque fois que j'essaie de faire une démo rapide et je me trouve déboguer un code JS perdant ainsi un temps précieux en classe.

Ces derniers jours, je me suis retourné vers une technologie (si on peut dire) Oracle à laquelle j'ai tourner le dos depuis longtemps. C'est Oracle JET (Oracle JET). Comme étant intéressé exclusivement par Java et à la limite J2EE (maintenant EE4J), je n'ai pas pas trop concentré sur les autres technologies Oracle. Aujourd'hui, je me suis retourné pour voir est ce que je pourrais trouver une réponse à ma question.

Est-ce que Oracle JET est bel et bien la réponse à la question que j'ai posée ? Oui et Non.

Oui, parce que à la base, Oracle JET est un ensemble de composants et non pas une framework (selon l'explication). Vous pouvez suivre toujours vos propres méthodes, architectures et approches de développement et au même temps avoir une large gamme de composants que vous pouvez intégrer facilement à votre application (liste).

Non, pour les raisons suivantes :

  • Oracle JET est basé sur un grand nombre de librairies JS et bien sûre sur Node. Malgré la facilité d'utilisation, le tout doit être à jour et l'outil effectue (presque) à chaque fois des actions de téléchargement; cela devient (avec un peu d'exagération de ma part) inutilisable dans un contexte d'enseignement.
  • Le code généré par l'outil ojet-cli est incroyablement grand puisque il intègre le tout, non pas seulement les composants que vous voulez utilisés, par conséquent, un grand travail de nettoyage est nécessaire avant le déploiement (cela reste toujours acceptable dans le cadre d'un prototype).
Pour l'installation, c'est très simple (Command Line Tool):

npm install -g @oracle/ojet-cli

Mais malheureusement, ce n'est jamais aussi simple que ça.
Premièrement, n'oubliez pas de donner le droit d’administrateur à la commande (sudo).

Deuxièmement, si Node n'est pas à jour, alors vous risquez d'avoir des erreurs de syntaxe sur le code généré. L'erreur qui m'est arrivée :

$ ojet build
/home/tarek/JavaPlayground/firstJet/MyFirstJET/node_modules/winston/lib/winston.js:11
const { warn } = require('./winston/common');
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:374:25)
    ...

Comme vous voyez, cette erreur n'a rien à voir avec Oracle JET mais avec "winston", et à vrai dire, je n'ai jamais entendu parlé de ce "winston" avant ce message d'erreur. Une erreur commune qui nécessite la mise à jour de Node (l'issue). Là c'est pas aussi simple aussi (propositions "théorique", et n).

npm peut rendre npm inutilisable (Oui, apparemment ça arrive)
Ensuite, il faut une installation presque manuelle pour mettre à jour Node et pour récupérer npm qui a tenté de mettre à jour Node.

Une fois tous les problèmes sont résolus, l'application fonctionne à merveille. 

mardi 28 novembre 2017

Apprendre Java : les frameworks et les langages JVM

Apprendre le langage Java ne veut pas dire apprendre sa syntaxe ou ses structures de base. Autrement, tout développeur C et C++ peut se voir comme un développeur Java. Apprendre Java veut dire un peu plus que la syntaxe.

Premièrement, il faut apprendre l'API Java. L'API Java fournie avec la JDK est très puissante. La majorité des applications J2SE reposent seulement sur l'API par défaut. Elle peut être considérée comme un facteur clé du succès du langage Java. Parmi les packages les plus utilisés :
  1. java.lang : le package importé par défaut et qui contient les classes essentielles pour écrire un programme Java (System, String, Class, Exception, Thread, etc..)
  2. javax.swing : (après AWT) pour les interface graphiques.
  3. javax.net : pour la programmation réseau.
  4. java.nio : (après io) pour les flux entrée/sortie.
  5. java.sql : pour interagir avec les Bases de Données relationnelles.
Ainsi, nous pouvons développer une application de gestion réparties, suivant l'approche Client/Serveur avec Client lourd, basée sur une Base de Données centralisée avec support de l'importation et l'exportation des données en utilisant la J2SE standard sans ajouter d'autres API sauf le driver du SGBDR utilisé (qui ne sera plus nécessaire s'il s'agit du Derby fourni avec la JDK).

Mais est-ce tout ? Non.

Deux autres éléments essentiels dans l'apprentissage de Java sont les framework et les langages JVM.

Premièrement, nous trouvons généralement les frameworks dans le cadre de développement des applications entreprises (n-tiers) sous J2EE. Ces framework ont trouvé de la popularité avec le retard remarquable qu'a fait la bibliothèque standard J2EE dans ce domaine. En effet, sans ce retard, les frameworks Spring et Struts n'auront pas gagné du terrain. Ainsi, à une époque donnée, apprendre la J2EE était synonyme de "apprendre une framework J2EE".

Aujourd'hui cette affirmation reste valide mais pas avec la même puissance. D'un côté, la J2EE devient de plus en plus à jour; elle arrive à cacher ses inconvénients et sa lourdeur qui limitent sa productivité (présentation Adam Bien). Elle arrive aussi à proposer ses propres frameworks disponibles par défaut; nous avons remarqué aussi la qualité améliorée de ces framework (Java Server Faces en ai un exemple). De l'autre côté, les différents frameworks continuent de progresser et gardent leur avance par rapport à la plate-forme J2EE part défaut. Les nouveaux besoins et les nouvelles approches favorisent ces frameworks et compliquent la tâche de la plate-forme par défaut.

Deuxièmement, nous devons reconnaître les langages JVM; des langages de programmation basés sur la machine virtuelle de Java. Ces langages sont, généralement, compatible directement avec Java et peuvent accéder à toutes les bibliothèques disponibles sans aucun effort supplémentaire. Ils compilent leur code vers Bytecode de Java et profite ainsi de sa portabilité.

Ces langages sont proposés pour plusieurs raisons :
  1. Simplifier et moderniser le langage : Java est un langage puissant mais lourd. Quelques langages sont proposés pour le simplifier et le moderniser. Groovy et Kotlin sont des excellents exemples.
  2. Pour répondre à un besoin spécifique : Java est un langage général qui permet de développer différents systèmes et pour différents domaines, néanmoins, avoir un langage spécialisé qui garde la puissance de Java reste une option intéressante. Tel est le cas avec des langages comme Scala (programmation formel), SARL (programmation basée Agents) et Processing (dessins et animations).
  3. Pour faciliter l'apprentissage de la programmation et du langage Java : Java est strict et nécessite un respect rigoureux des notions Objets; la chose qui n'est pas facile pour les débutants en programmation. Ainsi, quelques langage JVM sont conçu pour être facile et simple et pour cacher la lourdeur du Java. Javascool en est un excellent exemple.
 
 

La plus part de ces langages offrent leurs propres APIs. Ces APIs représentent un enrichissement remarquable à exploiter et à être pris en considération par les développeurs Java. Nous prenons, comme, exemple les chaînes de caractères sous Groovy. Ces chaînes de caractères sont implantées en utilisant la classe GString, une extension puissante de la classe String de l'API J2SE par défaut. En l'utilisant, nous pouvons, à titre d'exemple, bénéficier de :

1. La déclaration d'une chaîne de caractère sur plusieurs lignes (comme les commentaires sur plusieurs lignes) en utilisant le délimiteur """.


def maChaine = """Bonjour chèrs internautes,
Cela est un exemple sur les chaîne de caractères sur plusieurs lignes.
Merci Groovy."""

println maChaine


2. Il est possible d'effectuer des substitutions de variables en utilisant le $ associé à leurs noms dans la chaîne de caractères.


def monPrenom = "Tarek"

println "Bonjour ${monPrenom}."


Certain de ces langages ont pu prendre la place du Java. Kotlin, par exemple, est devenu le langage de développement des applications Android, malgré, qu'à la base, il n'était pas conçu pour cet objectif.

Ainsi, apprendre Java veut dire apprendre sa syntaxe, son API par défaut (J2SE et J2EE) et apprendre , selon vos besoins et votre spécialité, la framework ou le langage JVM le plus adéquat. A titre d'exemple, pour enseigner en présentiel et à distance, je me trouve orienté vers les langages Groovy, Javascool et Processing. Les frameworks, dans mon contexte professionnel, ne trouve pas assez de place à part des démonstrations très limitées pour les étudiants en Master (université de Jijel).

Groovy pour l'enseignement intial de la programmation

Le choix d'un langage du départ pour l'enseignement de l'algorithmique est crucial pour l'apprenant. La première impression qu'il forme sur le module et la programmation de manière générale peut influencer ses performances durant l'apprentissage. Cette influence peut dépasser le module algorithmique pour affecter les autres modules qui dépend fortement de la programmation.

Le choix pris à l'université de Jijel, par exemple, est le langage Pascal. Ce choix est encore présent dans plusieurs autres universités. Ce choix est justifié par la similitude entre l'algorithmique et le langage Pascal et la nature pédagogique de ce dernier. En suivant une formation en français, l'étudiant peut vite obtenir un programme en Pascal par effectuer une traduction vers l'anglais.

Algorithme Exemple;
Var
    a, b, c : Entiers;
Debut
    Lire(a);
    Lire(b);
    c <- a + b;
    Ecrire(c);
Fin.

Program Exemple;
Var
    a, b, c : Integer;
Begin
    ReadLn(a, b);
    c := a + b;
    WriteLn(c);
End.



Néanmoins, la syntaxe de Pascal n'est pas retenue par d'autres langages. En effet, délimiter les blocs par "Begin" et "End" ne trouve pas d'autre utilité que dans le langage Delphi (que je considère comme Object Pascal, c'est à dire, Pascal). Apprendre un autre langage, tel que C, C++ et Java, nécessitera la reprise de la syntaxe et des mots clés à nouveau.

Nous avons tenté, durant une année universitaire, de commencer avec le langage C. Un choix qui peut être justifié par deux points essentiels :
  1. Le langage C est parmi les langages les plus utilisés et les mieux classés au monde. A mon avis, il le restera tant que les noyaux des systèmes, les pilotes et la programmation niveau bas reposent sur le langage C.
  2. La syntaxe du langage C est reprise par plusieurs autres langages. Si vous pouvez écrire la boucle "for" en C, alors vous pouvez l'écrire en C++, Java, C#, PHP, Perl, Ruby, Groovy et bien d'autres.
Le résultat était satisfaisant : les étudiants ont pu assimiler le langage vu qu'il n'ont pas connu un autre langage plus simple. C'est à peu près comme Linus Torvalds qui a commencer à développer en binaire pensant qu'il est le langage assembleur.

Néanmoins, l'effort fournis était bien supérieur. La tâche était fatigante à la fois pour les enseignant et les étudiants. Le passage n'était pas intuitif entre l'algorithmique et l'étudiant devait faire un effort supplémentaire et un temps additionnel, ainsi, les séances du TP devenaient de moins en moins productives, particulièrement lorsque nous abordions les pointeurs. Les messages d'erreur sont moins claires et plus difficiles à comprendre par les débutants. Sous Pascal, ce problème n'était pas posé vu qu'il s'arrête et affiche la première erreur rencontrée et ses messages sont plus compréhensibles. Pascal cache, aussi, l'étape de création des liens et le rassemblement des parties du code.

Ainsi, chaque option possède ses avantages et ses inconvénients. Heureusement, de nouveaux langages sont proposés chaque jour et la liste des options est devenue très riche.

A mon avis, le langage Java doit être le centre de la formation. Il partage quelques caractéristiques de simplicité avec Pascal et il reprend la syntaxe du langage C. Avec une API bien conçue et une convention du nommage très claire, il est possible à tout débutant de se lancer en Java et vite comprendre ses bases et qu'est ce qu'il faut faire. Il commence à trouver sa place dans l'enseignement de l'algorithmique dans plusieurs universités (Stanford, par exemple). A l'université de Jijel et à la région Est de l'Algérie, le programme de formation normalisé prévoit le module "Programmation Orientée Objet" qui repose entièrement sur le langage Java comme langage d'application. Les messages d'erreur sont très claires et les éditeurs disponibles facilitent leur repérage et leur correction (des éditeurs comme Eclipse et NetBeans vont jusqu'à la proposition de solution au développeur, ils signalent les erreurs pendant la saisie du programme et avant même d'entamer la compilation).



Malheureusement, ce choix n'est pas sans inconvénients. Le premier inconvénient, qui l'inconvénient majeur de Java, est l'obligation de respecter strictement les notions de la programmation Orientée Objet. C'est à dire que tout le code (toutes les fonctions) doivent faire partie d'une classe. Dans un contexte d'apprentissage, ce point peut être problématique pour l'étudiant parce qu'il écrit un code qu'il ne comprenne pas. En effet, il est très difficile d'expliquer la signification de "class" et de "static" si l'apprenant essaie d'apprendre le sens de "variable" et "bloc".

Le deuxième inconvénient est ce mélange entre type primitifs et classes. Les types de base "int", "long", "float", "double" et "boolean" (liste non-exhaustive) ne sont pas considérés comme des classes mais String est une classes. Cela peut créer une confusion qui dure, des fois, plusieurs semaines.

Pour remédier à ces inconvénients, Groovy peut être la solution. Groovy est un langage de la JVM (la machine virtuelle Java), c'est à dire, il compile son code vers un code Java qui repose sur la machine virtuelle pour son exécution. Il peut faire appel à des API Java comme il possède ses propres classes (compatibles avec Java) qui "corrige" les manque du langage Java et le rend plus "moderne" (si nous pouvons le dire).

Parmi les éléments du java, nous citons les deux suivantes :
1. Il n'est plus nécessaire de mettre tout le code dans une classe. Il est possible d'opter pour un code "script". Il est possible, aussi, d'utiliser la fonction "main()" tout cours (comme le font le C et le C++).


println "Hello World!"


2. Tous les types sont des Objets. Les types primitifs sont automatiquement enveloppé dans leurs "Wrapper"s. Ainsi, la déclaration d'un int implique la déclaration d'un Integer. Cela est fait en toute transparence.

Sous Groopy, les premiers exemples seront beaucoup plu faciles et nécessiteront mois d'explication. Il nous éviteront aussi cette "écrivez le code tel qu'il est, nous allons l'expliquer plus tard" sur la partie "class" et "public static void main()".


def a = 10;
println a.class



Groovy n'est pas le seul. Plusieurs autres langages JVM peuvent être utilisés comme un point de départ pour apprendre l'algorithmique avant de passer vers Java. D'ailleurs, des langages JVM sont conçus spécifiquement pour l'enseignement; Javascool en ai un exemple. Les comités pédagogiques doivent laisser les choix ouverts et profiter des différents langages disponibles.

samedi 25 novembre 2017

Chute libre dans le vide sous Processing

Simuler une phénomène naturel en utilisantl'animation est un moyen excellent pour l'enseigner et pour l'expliquer. Cette approche permet, aussi, de modifier les différents paramètres et voir les différents scénarios possibles avec un coût (pratiquement) nul.
Dans cet exemple, nous allons simuler une chute libre dans le vide. Pour rendre la simualtion un peu plus réel, nous allons ajouter un effet de rebond par définir un facteur de préservation de l'énergie au moement de l'impact au sol.
L'objet en question est une boule. Elle sera définie comme un objet séparé pour donner la possibilité de comparer plsuieurs chutes avec des paramètres différents.
Le problème peut être modélisé suivant deux approches :
  • L'utilisation des équations en fontion du temps "t", la position et la vitesse de l'objet seront calculées en fontion de l'instant "t" de l'animation.
  • En utilisant des suites pour la vitesse te la position. Les paramètres de l'instant "t" seront obtenus en fontion des paramètres de l'instant "t - 1".
Dans cet exemple, nousa allons suivre cette deuxième approche. Le passage d'un instant à l'instant suivant est implémenté sous la forme d'une fonction que nous appelerons chaque intervalle du temps (un autre paramètre que nous pouvons modifier à notre guise).

 


Le code principal est très simple. Il initialise l'environnement et déclare une boule. Chaque fois, il dessine la boule avec sa position, sa vitesse et son énergie.


Boule b;

void setup(){
  size(600, 400);
  b = new Boule(100, 0, 50, 10, 0.9f);
}

void draw(){
  background(255);
  b.draw();
  if(frameCount % 6 == 0)
    b.instantSuivant();
  fill(0);
  text("" + b.getVitesse(), 10, 30);
  text("" + b.getEnergie(), 10, 50);
  text("" + b.getY(), 10, 70);
};

Le code  de l'objet Boule permet de garder les différentes information de la boule, de simuler la chute et de déssiner la boule :


class Boule {
  
  public final static float G = 1f;
  
  float preservation;
  int x, y, diametre, vitesse, masse, energie;
  
  public Boule(int x, int y, int diametre, int masse, float preservation){
    this.x = x;
    this.y = y;
    this.diametre = diametre;
    this.masse = masse;
    this.preservation = preservation;
  }
  
  public void instantSuivant(){
    y += vitesse;
    energie = masse * vitesse * vitesse / 2;
    if(y >= height - diametre / 2){
      vitesse = (int)(-1 * preservation * Math.sqrt(2 * energie / masse));
    }else{
      vitesse += G;
    }
  }
  
  public void draw(){
    fill(255);
    stroke(0);
    ellipse(x, y, diametre, diametre);
  }
  
  public int getVitesse(){
    return vitesse;
  }
  
  public int getEnergie(){
    return energie;
  }
  
  public int getY(){
    return y;
  }
  
  public int getX(){
    return x;
  }
    
  
}

La fonction qui nous intéresse le plus est la fonction "instantSuivant()". Elle montre le changement appliqué sur la vitesse :


  public void instantSuivant(){
    y += vitesse;
    energie = masse * vitesse * vitesse / 2;
    if(y >= height - diametre / 2){
      vitesse = (int)(-1 * preservation * Math.sqrt(2 * energie / masse));
    }else{
      vitesse += G;
    }
  }

  • Si l'objet est en chute, la vitesse est influencée par la gravité seulement.
  • Si la boule touche le sol, la gravité n'est plus appliquée mais c'est le rebond qui repousse la boule vers le haut.
 
L'état final de l'animation est la boule immobile au fon d de l'écran (le sol).
Nous pouvons facilement ajouter une autre boule pour comparer les deux chutes :


Boule b1, b2;

void setup(){
  size(600, 400);
  b1 = new Boule(100, 0, 50, 10, 0.9f);
  b2 = new Boule(200, 0, 80, 10, 0.5f);
}

void draw(){
  background(255);
  b1.draw();
  b2.draw();
  if(frameCount % 6 == 0){
    b1.instantSuivant();
    b2.instantSuivant();
  }
  fill(0);
  text("b1", 10, 10);
  text("" + b1.getVitesse(), 10, 30);
  text("" + b1.getEnergie(), 10, 50);
  text("" + b1.getY(), 10, 70);
  text("b2", 10, 90);
  text("" + b2.getVitesse(), 10, 110);
  text("" + b2.getEnergie(), 10, 130);
  text("" + b2.getY(), 10, 150);
};


dimanche 23 décembre 2012

Enseigner et écrire pour maîtriser, et pourquoi pas le modèle chinois?

“Si vous n'arrivez pas à expliquer un concept à un enfant de 6 ans, c'est que vous ne maîtrisez pas ce concept.” - Albert Einstein.

Il nous arrive dans notre cursus d’ingénieur d’apprendre des tas de choses, de les comprendre et de les utiliser, sans pour autant les maîtriser. La maîtrise n’est confirmée si on les enseigne.

“Vous ne devez pas écrire un livre sur une thématique donnée si vous n’arrivez pas à en parler pendant une heure, sans préalable préparation, devant un publique.” - Tariq Suwaidane.

Encore plus difficile qu’enseigner, écrire un livre sur une thématique nécessite plus de connaissance et une meilleure maîtrise. Alors devons nous attendre d’atteindre ce niveau pour essayer d’enseigner ou bien d’écrire?

Heureusement, d’autres modèles peuvent être suivis pour atteindre la perfection, et en particulier le modèle chinois : et si on essaye de le faire, même si on ne le maîtrise pas? Et si on essaye d’apprendre et de maîtriser pendant qu’on le fait? Si on observe l’évolution de la production chinoise des produits de haute technologie et des voitures, nous allons apercevoir clairement l’application de ce modèle.

Le modèle n’est pas nouveau, il découle des théories pédagogiques constructives qui encouragent l’apprentissage par l’application et non pas par un passage passif de connaissances de l’enseignant vers l’apprenant. Dans ce contexte, l’apprenant est surveillé et supporté par son enseignant pour obtenir les résultats attendus; il effectue des activités d’apprentissage où l'échec n’est qu’une étape vers le succès. Néanmoins, son application dans la vie quotidienne et dans la vie professionnelle a donné des résultats très satisfaisants malgré que l’environnement professionnel oppose le milieu éducatif, il est très hostile, il n’offre aucun support ou encadrement et il ne donne des chances minimes pour retenter.

Quand je dis “enseigner” pour maîtriser, je ne parle pas d’enseigner dans une institution officielle; la préparation d’une formation gratuite donne la possibilité de vivre une expérience similaire et faire plusieurs tentatives pour perfectionner ses connaissances dans le domaine en question et dans le domaine pédagogique. Du même, “écrire” ne veut pas dire se plonger dans une aventure risquée de publication d’un livre, mais, rédiger et écrire des tutoriels et e-books gratuits sur Internet.

Je pense que nous avons, plus que jamais, la possibilité d’apprendre et de maîtriser par appliquer, enseigner et écrire grâce aux technologies d’internet qui nous permettent d’avoir un feedback de nos amis et des communautés spécialisées sur nos productions, et du coup, on peut voir la société remplace l’enseignant d’une manière positive.