Ca y est, j’ai peur

Merde, je ne sais pas comment prendre le truc.

Pourtant, je pensais avoir trouvé un angle, comme disent les gratte-papier, hier.

Bon, je vous explique.

Tout le monde vous rebat les oreilles avec la IIème guerre mondiale, pas vrai. Ce qu’on ne vous dit pas, c’est que l’idée de l’Europe, celle qui a donné naissance à la bureaucratie pour nomiciens professionnels, est née après la guerre : le but était de suffisament rapprocher les ennemis d’hier pour que plus jamais des pays européens ne se fassent la guerre.

Dans l’ensemble, et pour l’instant, je trouve que ça a plutôt bien marché.

Hélas, contrairement à ce que Michel Onfray prétendait bêtement hier soir sur Europe 1, l’histoire tend à se répéter. Et après la crise idiote des banques qui prêtent trop et trop mal leur argent, comme après la crise de 29, le salut économique ne peut venir que d’une chose : la guerre.

Oui, cette guerre stupide contre un groupement d’imbéciles au fin fond d’un pays déja violé dix fois par nos « amis américains ». C’est bien de celle-là que je parle.

Cette guerre idiote au nom de laquelle les français offrent leurs droits à une information libre. Vous trouvez que j’en fais trop ?

Sûr ?

Alors je vais vous expliquer un truc.

L’Etat français a décidé qu’il était bien d’aller se battre dans l’armée d’Israël, qui est un état souverain, mais pas d’aller se battre au sein de ce regroupement quasi-mafieux. Evidement, dit comme ça, c’est limpide. Maintenant essayons autre chose…

Si demain, des français veulent aller aider les paysans du Chiapas à lutter contre l’état fédéral mexicain, il se passera quoi ? Ah, je sais, rien, parce qu’ils sont tous catholiques.

Et si demain, des français veulent lutter pour la libération du Tibet occupé ? Est-ce que la France dénoncera les exactions chinoises ? Ou est-ce que ces français se verront eux aussi confisquer leur passeport ?

Vous ne voyez toujours pas où je veux en venir ?

Très bien, alors je vais être très clair.

Si Hollande n’est pas officiellement d’extrême-droite, sa politique extérieure actuelle n’est qu’une version masquée de la thèse du choc des civilisations. Et au nom de cette thèse, la dictature beige devient une réalité bien trop visible. Et hélas, il ne s’agit pas là d’une vue de l’esprit.

Alors quand je voi les déuptés français faire assaut de hargne guerrière lors des discussions sur l’inique projet de loi contre le terrorisme, j’ai peur.

Quand j’entend toutes ces horreurs sur les musulmans, islamistes, et autres qui ne sont que résidus d’amalgames vichyistes, j’ai peur.

Quand je vois la manière ignoble dont sont traitées les différentes populations de migrants qui traversent la France (et qui, comme le rappelait un article anglais, ne veulent plus s’arrêter dans le pays des droits de l’homme), j’ai honte.

Et hélas, je crains que ça ne risque pas de s’arrêter de sitôt.

Freebox, ouvre-toi !

Ma freebox avait donc chaud. Trop chaud, par cet été indien un peu doux (mais trop, il ne fait là que 20° C).

Je l’avais surélevée, croyant bêtement ce qu’internet me disait. Jusqu’à ce qu’un de mes collègues ne me rappelle que, souvent, la chaleur ne vient pas seulement d’ordinateur surchargés, mais aussi d’ordinateurs empoussiérés.

J’ai donc cherché comment ouvrir la boîte histoire d’aspirer un peu les composants …

Et j’ai trouvé cette vidéo :

Et là, je dois dire que ça a été bien facile de l’ouvrir, de passer un coup d’aspirateur dedans, avant de la refermer et de la rebrancher. Espérons juste que ca suffise, parce qu’affronter le support de free encore une fois ne m’emballe pas plus que ça ….

Procrastination ?

Le terme pourrait venir à l’esprit, si vous pensiez par exemple que j’ai la flemme d’écrire quoi que ce soit sur ce blog.

Et, en un sens, ce serait vrai.

Parce qu’il n’y a pas grand chose à se mettre sous la dent, il faut le dire.

D’un autre côté, je ne rends pas compte de grand chose, peut-être parce que, pour l’instant, je construis …

Enfin, je construis, façon de parler.

J’ai déja dit que je faisais pas mal de Javascript en ce moment. Je devrais plutôt dire que je ne fais que ça. Et, en un sens, je prends un pied conséquent à jouer avec la pile construite pour l’occasion.

Parce qu’il s’avère (essentiellement grâce au duck typing), qu’il est d’une simplicité terrifiante d’y faire rentrer des ronds dans des carrés, et de mélanger plus ou moins proprement des paradigmes objets et fonctionnels.

Tiens, ej vais vous donner un exemple un peu tordu.

Vous avez entendu parler des Deferred en javascript ? Non. Bon, je ne vais pas vous expliquer ça plus avant qu’en vous disant que ça reivnet à pouvoir dire à du code Javascript « quand on te dit go, tu go ». Je ne vais pas non plus rentrer dans la polémique des Promises/A vs Promises/B.

Non.

J’avais ce matin un problème bizarre.

Je voulais utiliser l’API de jQuery Deferred pour avoir une espèce de Deferred réexecutable. Il s’avère, et je le comprend tout à fait, que ça n’est pas possible. Parce que le Deferred, une fois qu’il s’est exécuté, est tout bonnement terminé. Je me suis donc creusé la tête un moment avant d’écrire mon petit module requirejs qui me fournit la classe qui va bien :

Evidement, ça n’a pas l’air de grand chose. Mais là, grâce à ce « truc », j’ai toute l’API de Defferred qui m’intéresse, et je peux créer le « vrai » objet sans problème.

Je dois bien reconnaître que c’est bien plus simple que d’implémenter une interface, ou quoi que ce soit d’aussi compliqué.

Alors, procrastination ? Sans doute, dans la mesure où ce code est fondamentalement asynchrone :-)

Rha la freebox !

Bon, je ne vais pas vous parler du fait que la freebox va enfin passer à Android TV, parce que ça n’est qu’une rumeur (même si c’est une rumeur très intéressante).

Non, je vais vous parler du problème classique des freenautes : les petits détails gênants. En l’occurence, le détail gênant, c’est la gestion de la surchauffe apr la freebox revolution server. Ou plutôt, dans mon cas, sa non gestion.

Voyez-vous, j’ai récement légèrement réaménagé mon salon : j’ai remplacé une jolie étagère Fly sur laquelle était posée la Freebox Server par une bibliothèque Billy que j’ai légèrement améliroé en y forant des trous pour passer tous les câbles de la freebox derrière le meuble, ce qui est moins disgracieux (j’en connais qui parleraient de WOF, mais soyons sérieux, je trouve les câbles électriques ou réseau d’une laideur abyssale). Et il semble que le fait de placer ma Freebox Server dans une bibliothèque nuise gravement à ses performances, ou plutôt à son aération, puisque depuis ce changement, je perds l’utilisation d’internet, de la télé ET du téléphone à peu près tous le sjours.

Insupportable.

J’avais d’abord accusé le transformateur CPL, mais même en le mettant plus à l’air, rien n’y fait, les déconnexions continuent. J’ai donc le choix entre

  • ouvrir la freebox pour l’aérer (facile à faire apparement mais un peu sale sur le long terme),
  • tenter de la poser sur une plaque métallique elle-même ventilée avec un ventilateur USB par exemple
  • la déplacer vers un endroit plus aéré

J’ai bien l’impression que je vais choisir la troisième solution …

Cela dit, il y a là un autre élément gênant.

Quand j’ai quitté le googleverse, j’ai installé un paquet de servcies sur mon NAS (qui marche très bien, lui). Parmi ces services, on peut évidement compter shaarli, krissfeed et deux ou trois autres trucs Indispensables au travailleur du savoir que je suis. Problème : aucun de ces services n’est accessible aujourd’hui, puisque ma freebox s’est arrêtée !

Et ça, ça s’appelle un Single Point Of Failure ou je ne m’y connais pas …

Ce qui me rappelle furieusement le projet Chaos Monkey de Netflix : si on veut savoir comment se comporte un système quand un composant, il n’y a qu’une seule bonne façon de vérifier : en débranchant le composant pour voir ce qui se passe.

Javascript all the things .. or not ?

Depuis deux semaines, je me suis remis avec intensité (et sous la contrainte)  au développement Javascript dans un univers proche du navigateur classique, mais pas tout à fait semblable.

Et je dois dire que, si certaines choses ont changé, d’autres sont toujours aussi décevantes.

Typiquement, je suis déçu d’avoir passé DEUX JOURS ENTIERS pour détecter que je passais un argument undefined à une fonction. Surtout que c’est arrivé alors que j’utilise Eclipse avec son mode Javascript, qui est censé m’afficher quelques erreurs (mais qui n’est apparement pas dérangé par l’utilisation de variables non définies … à moins que ça ne soit configurable).

L’autre déception, mais je m’y attendais, c’est nodeJS et son écosystème authentiquement merdique. Je m’explique.

Vous pensez que nodeJS est un framework permettant de développer des applications web côté serveur, pas vrai ? Moi, en tout cas, je le croyais. Jusqu’à ce que je découvre que, via NPM, Grunt, Bower, et tout un tas de projets concurrents aux noms de hipsters mal dégrossis, les développeurs Javascripts sont censés être capables d’en faire l’équivalent de maven. Sauf que, d’une part, personne ne s’est dit « tiens, si on faisait tourner maven dans Tomcat ? », et que d’autre part le tri évolutif n’a pas encore lieu : il y a pour chaque besoin au moins deux outils concurrents, à peu près aussi peu fiables l’un que l’autre, et toujours très mal documentés. En bonus, quand vous commencez un projet, que node commence par installer tout un tas de trucs sur votre machine, et que le fichier package.js ne semble pas vraiment utilisable pour ajouter des dépendances (on me dit toujours de faire npm install bidule), ben ça fait bizarre.

Surtout quand, d’un autre côté, grâce aux Webjars découverts dans Wisdom, gérer des dépendances Javascript dans un projet Maven est d’une simplicité proprement biblique.

Et il y a d’autres bonnes nouvelles …

La première va vous paraître typique du développeur Java fou, mais est en fait plus qu’appréciable dès que le projet grossit un peut (et comme j’ai déja 700 fichiers, on peut dire que c’est déja un gros projet, je pense).

C’est requirejs.

Cette petite librairie, à la documentation rigolote, permet à peu de frais de faire de l’injection de dépendance en Javascript d’une façon qui, sans atteindre la complexité de CDI et de ses scopes/produces/… est quand même vraiment très pratique. Et par très pratique, je veux dire absolument indispensable si on ne veut pas pourir son namespace global avec des tonnes de variables à la noix.

La seconde est un peu une conséquence de la première.

En fait, à l’origine, je voulais suivre le mouton et développer une application AngularJS tout ce qu’il y a de plus traditionnel. Bon, je savais aussi que j’allais avoir vraiment besoin de requirejs. Je ne me voyais donc pas charger une partie de l’application avec requirejs, et en utiliser une autre sans. J’ai donc cherché pendant une journée ou deux comment faire marcher angularJS avec requirejs. Mais aucune des solutions que j’ai vu ne m’a réellement satisfait. Oui, il y a douze réponses sur StackOverflow pointant sur autant de projets nodeJS dans GitHub. Mais

  1. Vous pouvez relire ce que j’ai écrit plus haut sur nodeJS
  2. Même en copiant le code dans mon projet, ça n’a jamais fonctionné de façon convaincante.

Du coup, j’ai du chercher un peu plus.

Et je suis tombé via todoMVC, sur Ractive. Ractive, c’est l’outil de génération d’interface Javascript sympa : il s’insère facilement dans un projet requirejs, il fournit des templates en HTML également chargeables avec requirejs, il veut bien travailler avec jQuery quand il faut, et surtout il est simple à comprendre : pas besoin d’une tripotée de contrôlleurs,factories, et autres idées pénibles issues des plus mauvaises interprétations du MVC (oui oui, je le reproche bien à AngularJS). Non. Il se contente de fournir des contrôleurs, des vues, et des modèles. C’est facile à utiliser, rapide à comprendre, et ça fournit de belles interfaces graphiques.

Bon, en même temps, je sais que l’écosystème Javascript est comme ça depuis ma lecture de Javascript, the world most misunderstood language il y a bien longtemps. Cela dit, j’aime bien l’idée de passer à un langage fonctionnel, sauf lorsque je dois faire (comme c’est le cas aujourd’hui), du code récursif et asynchrone – heureusement qu’il y a les Deferred de jQuery, sinon ce serait authentiquement impossible. En parlant de ça, je ne comprend pas trop le débat sur les Promises/A et les Promises/B. Ca donne l’impression que la communauté Javascript n’a pas de JCP …. oui, je sais, il n’y en a pas, et c’est bien dommage.

J’ai craqué !

Quand je dis ça, je suis un peu mélodramatique … quoique.

Enfin bref.

J’avais déja craqué, pour l’essentiel, en prenant un forfait téléphonique, certes limité (le fameux forfait free 2H/2€). Mais j’étais resté coincé avec un de ces fameux feature phones à clapets et sans applciations, ni gadgets de quelque ordre que ce soit. Un téléphone … pour téléphoner.

Mais là, j’ai craqué d’une autre façon en m’offrant un téléphone Android, avec un grand, beau, (et salissant) écran de 5″ qui me rappelle mon Palm d’une autre époque, à un détail près : le Wiko Raimbow que je viens de m’acheter est bien moins cher, et français (enfin, vendu en France par des français, je ne doute pas qu’il soit fabriqué en Chine).

Le moment est donc venu d’apprendre à utiliser un autre OS que Windows ou Mac. Certaines choses sont diablement pratiques, d’autres moins. Mais dans l’ensemble, c’est assez plaisant, je trouve.

Et l’écran, même si il n’est aps reconnu comme exceptionnel, me paraît personnellement être déja une grande victoire.

Par contre, j’ai encore quelques soucis philosophiques de gestion de ma mp3thèque en synchronisation : j’utilisais auparavant iPod manager pour synchroniser mon iPod avec Foobar2000, mais là, je n’y arrive absolument pas. Et ça me paraît bien dommage … Parce que je vais devoir remplacer ça par une copie d’une sélection de mes MP3s préférés dans la carte SD, assortie de l’utilisation d’un podcatcher pour Android. Je ne suis pas très satsifait de ce découpage, mais il faut bien le tester, j’imagine.

 

Le voyage dans le temps, c’est possible sur internet

Notez bien que, dans le sens le plus général, c’est déja possible à travers des outils comme Internet Wayback Machine, mais c’est quand même assez peu pratique.

En revanche, là où ça devient pratique, c’est quand l’historique peut s’afficher directement dans le navigateur. Et ça, c’est ce que propose le protocole Memento. J’imagine qu’il doit y avoir un rapport avec le film, mais lequel … mystère (En passant, la construction en ping-pong marche avant/marche arrière de ce film est la même que celle du superbe roman de Iain M Banks nommé « L’usage des armes »).

Enfin bref, memento, c’est une bonne idée.

Mais dans ce cas, pourquoi, POURQUOI, malgré la RFC, choisissent-ils de ne l’implémenter qu’avec Chrome en standard ? Hein ? Pourquoi. Heureusement pour moi, Firefox est open-source, et il existe une extension alternative curieusement nommée mementofox qui va me permettre de tester ce truc que j’imagine dément.

Cela dit, ce dont j’ai vraiment besoin (essentiellement pour le link rewriting dans le lifestream), c’est d’une librairie Java me fournissant l’équivalent de memento, pour pouvoir être sûr de montrer les liens tels qu’ils étaient à l’époque où je les ai sauvegardés. Ca doit pouvoir se trouver, non ? A priori, non, toutefois comme il existe un navigateur memento pour Android, j’imagine qu’il doit être possible d’en extraire le code métier pour faire des requêtes memento à la main …

Ca y est ! J’ai enfin terminé la migration de posterous !

Evidement, ça ne va pas intéresser grand monde … quoique.

Donc, vous vous souvenez de cet article « L’import de posterous, c’est quand même pas ça » ? J’y expliquai rapidement que les caractères non ASCII des articles que j’en importais étaient salement transformés. Au total, j’avais environ 600 articles contenant des accents, et donc contenant des saletés de « ?? ». J’ai donc dû, quasi-manuellement, remplacer tous ces caractères par les vrais bon caractères accentués (merci d’ailleurs aux macros de Notepad++ qui m’ont bien facilité les choses). J’aurais bien aimé, dans l’idéal, pouvoir monter un partage WebDAV pour trouver plus rapidement tous ces articles à mettre à jour. Malheureusement, comme ce blog est hébergé gratuitement par WordPress.com (ce dont je les remercie), je ne peux pas installer de plugins, et je n’ai donc pas accès à mes articles facilement.

D’où cette terriblement longue phase de correction, qui a duré quand même 6 mois !

Du coup, évidement, je suis très content d’en avoir fini avec cet enfer, parce que je peux maintenant passer à des choses plus intéressantes, comme par exemple des améliorations du lifestream.

La première chose à faire, c’est finir d’implémenter le support de WordPress, ce qui me permettra de proposer ce support à l’auteur de JBake …

La deuxième, ce sera sans doute de détecter automatiquement les liens morts. Parce que dans WordPress, comme dans Shaarli, les liens périssent. Et pour l’instant, je ne le détecte pas et c’est bien dommage. Mais je sais que ça viendra !

La liste des plugins que j’utilise avec foobar2000

Parce que je viens de jeter un oeil au site de foobar2000 et que mon retard de version est … très important. Et comme foobar2000 ne gère pas lui-même ses plugions installés (ou alors je suis mal renseigné), je devrais les réinstaller après la mise à jour.

Alors effectivement, j’avais déja fait une liste dans un article subtilement nommé « foobar2000, de plus en plus dingue« . Mais je ne suis pas sûr qu’elle soit à jour. Donc allons-y …

Et avec ça, je pourrais faire ma mise à jour rapidement, j’espère.

Allez on reprend proprement …

Bon, suite à la sortie de wisdom 0.6.1, j’ai décidé de reprendre les choses proprement.

Parce que j’ai réfléchi, et j’ai constaté plusieurs erreurs bêtes :

  • J’avais pensé créer un repository Git, mais il ne m’a finalement servi à rien. C’est idiot.
  • D’accord il n’y a pas de tests avec karma, mais je peux utiliser fluentlenium, non ?

Donc cette fois-ci, je vais essayer de faire les choses proprement, avec un repository git bien taggé, avec des tests d’interface, avec les archétypes qui vont bioen, et je vais essayer aussi de parler un peu d’angular.

Donc, reprenons du début …

Pour commencer, je crée le projet facilement puisque Eclipse me permet d’utiliser les archétypes, et que wisdom en propose maintenant un chouette. Donc je mets les bons paramètres, je clique dans le wizard d’Eclipse sur Finish … et c’est parti, j’ai mon application angular-google-shop que vous retrouverez rapidement dans Github (ce point bien précis est dans le tag 01_-_Après_l'appel_de_l'archétype_maven).

Et là, c’est évidement le moment du premier appel à mvn wisdom:run …

Histoire de ne pas reproduire le pataquès précédent, je vais tout de suite me créer un autre contrôleur (un collègue me soufflait d’ailleurs que ce serait bien cool d’avoir des outils de scaffolding comme dans Grails … pas bête).

Donc on y va pour le tutorial angular …. Sans passer par la case Bootstrapping, puisque j’ai déja fait mon projet.

Je la remplace gaillardement par la création d’un autre contrôleur, que j’appelle GoogleShopController, et dont le contenu est à peu près ça

@Controller
public class GoogleShopController extends DefaultController {
}

Maintenant, je vais le remplir … Ce que j’ai déja fait dans Un peu de wisdom, ça fera du bien

Créons donc un template statique  1 – Static Template

Donc, dans mon contrôleur, je crée une View et une méthode pour l’afficher :

    /**
     * Ici "list" est le nom du fichier du template, sans l'extension thl.html
     */
    @View("list")
    Template list;

    /**
     * Et donc quand on va aller sur http://localhost:9000/list, ça va afficher le template {@link #list}
     */
    @Route(method = HttpMethod.GET, uri = "/list")
    public Result todoList() {
        return ok(render(list));
    }

Et le fichier .thl.html qui va bien … Parce que je l’avais pas fait au début, heureusement j’ai eu droit à une belle exception lors de l’affichage, qui m’a poussé à aller voir le monitoring, qui m’a indiqué cette chouette erreur :

Wisdom Monitor __ Controllers_2014-07-08_15-07-00C’est clair, non ?

Bien, j’en suis donc arrivé à la fin de l’étape 1 du tutoriel, et le résultat est dans le tag 01_-_Etape_01_du_tutoriel_Angular_JS_avec_template_statique.

Et voilà les templates  2 – Angular Templates

Rien de bien sorcier là-dedans, mis à part évidement l’ajout des webjars :

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>angularjs</artifactId>
            <version>${angular.version}</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>${bootstrap.version}</version>
        </dependency>

C’est vraiment cool, je l’ai déja dit.

Bien, au passage, j’avais oublié d’ajouter la CSS de Bootstrap.

Et, encore une fois au passage, Wisdom intègre maintenant un chouette gadget pour ne pas trop s’emmerder avec les chemins des assets :

        <link th:href="${#routes.asset('css/bootstrap.css')}" rel="stylesheet"/>

Vous voyez la « fonction » thymeleaf #routes.asset('..') ? Eh bien elle convertit le chemin côté serveur en un chemin utilisable côté client, en s’occupant de toutes ces histoires de transformation de chemin. Bien joué ! D’ailleurs, elle plante joliment sur le chemin que j’ai entré pour angular, preuve que je n’arrive décidément pas à mettre la main dessus …

Ah, ça y est, j’ai trouvé :

        <script th:src="${#routes.asset('angular.js')}"></script>

Dingue, non ?

Tiens, au passage, une petite observation sur Angular …

Dans cette étape, on utilise pour la première fois ng-repeat="...". Un truc me trouble avec ce bidule : j’ai pas l’impression que ce soit du javascript qui y est écrit …je me trompe ? Eh bien non, ng-repeat utilise une « expression« . Alors ça c’est bizarre …

Et c’est là qu’arrivent les tests jasmine/karma … pour lesquels je dois écrire un Watcher … A moins bien sûr que je ne décide de faire un test Fluentlenium qui accède à la page HTML de tests Jasmine pour les exécuter … Mouais, je vais plutôt faire ça, tiens …
Bon, j’ai pas été au bout, en revanche, l’approche est tellement bonne que je vais en discuter avec la liste wisdom. En fait c’est assez simple : il faut faire un bout d’application qui déclare un contrôleur JasmineRunner. Ce contrôleur définit une route qui cahrge la page de tests de Jasmine et qui utilise cette page pour produire les résultats des tests. Vous pouvez regardez dans le tag qui va bien 02_-_Etape_02_du_tutoriel_avec_templates_Angular_et_tests_Jasmine.

Filtrons 3 – Filtering Repeaters

Ca va aller vite …

Mis à part que protractor se traduit évidement par un vrai test Fluentlenium :-)

Et là, c’est le drame : je n’arrive pas à trouver la bonne syntaxe pour que ce test marche. En bonus, la syntaxe de Protractor n’a que peu de rapport avec celle de Fluentlenium. Pour tout dire, Protractor me donne l’impression d’un outil très spécifique à Angular, que je trouve de fait d’un intérêt assez faible.

Grmbl ..

Bon, après quelques heures de recherche, il s’est avéré que le test ne marchait pas parce que le driver Selenium par défaut ne supporte pas trop bien la syntaxe Angular.

Et donc, maintenant que j’ai un test Fluentlenium, je peux dire que l’étape 3 est accomplie ! Ce qui donne donc le tag 03_-_Après_l'ajout_du_filtrage.

Trions 4 – Two-way Data Binding

Là aussi, c’est assez rapide puisque je sais déja ce qu’il y a à faire, en fait plus rien de compliqué puisque toute l’infrastructure existe !

En revanche, définitivement, je préfère la syntaxe Fluentlenium. En effet, comme on n’y utilise que le HTML, on « bloque » l’interface dans une forme donnée, sans trop se préoccuper de ce qui est ait au niveau Angular, alors que Protractor fait tout le contraire.

Et du coup, encore un joli tag : 04_-_Après_l'ajout_du_tri.

Bon, comme les étapes suivantes sont du même accabit, je vais accélérer un peu, hein …

5 – XHRs & Dependency Injection

Rien de bien compliqué, juste une copie de fichiers « au bon endroit ».

Il y a toutefois un truc malin dans le mock du service HTTP : le fait de flusher à la main la requête permet d’avoir un contrôle très fin sur ce qui se passe. C’est bien vu !

Bon, par contre, ne pas indiquer dans le tutorial que les tests end-to-end peuvent ne plus marcher, c’est pas très sympa … Mais j’ai quand même le tag 05_-_XHR

6 – Templating Links & Images

Bon là il y a un peu de modification de chemins, mais rien de grave … Quelques modifications dans les tests, aussi, mais vraiment rien de grave. Et le tag est 06_-_Liens_et_images.

7 – Routing & Multiple Views

Alors là, je l’ai déja dit, mais globalement, quand ils disent dans le tutorial

The routing functionality added by this step is provided by angular in the ngRoute module, which is distributed separately from the core Angular framework.

Ca veut juste dire d’ajouter le bon script :

<script th:src="${#routes.asset('angular-route.js')}"></script>

Bon il y a aussi un peu de code à modifier, mais rien d’insurmontable … dans le tag 07_-_avec_deux_routes.

8 – More Templating

Dans le tag 08_-_avec_un_beau_template_pour_les_détails. Je dois juste à l’honnêteté de dire que j’ai réutilisé le test d el’étape 7, parce qu’il y avait franchement une répétition.

9 – Filters

Ca donne un joli tag de plus 09_-_avec_des_filtres_de_rendu … Et l’envie certaine d’intégrer les tests Jasmine dans le build.

10 – Event Handlers

Trop facile ! Y compris le test Fluentlenium qui va bien. D’où le tag 10_-_avec_des_événements.

11 – REST and Custom Services

Là, comme pour les routes, il faut ajouter un module dans bower, c’est-à-dire que c’est déja fait avec webjars … Bon, le mauvais point de mon runner Jasmine actuel, je dois le dire, c’est qu’il n’arrive pas à récupérer les scripts utilisés dans list.thl.html, et c’est dommage. Mais j’imagine qu’un peu de lecture de thymeleaf m’y aiderait …

Ah, petite blague : Angular a écrit son tutorial avec Jasmine 1.3, et ne l’a pas mis à jour. Mais jasmine 2.0 change le style d’écriture des custom matchers, d’où un beforeEach un peu différent de la version fournie avec angular (que je n’ai par ailleurs aps réussi à faire marcher de façon satisfaisante).

J’en ai aussi profité pour m’assurer que je compilais bien en 1.7 …

Et j’ai donc créé le tag 11_-_avec_un_service_REST.

12 – Applying Animations

Bon, il y a le traditionnel ajout d’un module angular …

 <script th:src="${#routes.asset('angular-animate.js')}"></script>

Et l’ajout de …jQuery ? WTF ?!#
Ah, au fait, notez bien qu’à cause d’un « bug » Wisdom, si vous ajoutez un webjar, il faut relancer wisdom:run à la main pour l’instant … Bref …

Revenons-en à nos animations. C’est pas compliqué compliqué, je trouve juste bizarre d’avoir une animation jQuery alors que le tutorial dit bien

jQuery isn’t required to do JavaScript animations with AngularJS, but we’re going to use it because writing your own JavaScript animation library is beyond the scope of this tutorial

Est-ce que c’est pas une façon déguisée de dire que les animations avec jQuery sont quand même plus simples qu’avec angular ?

Cela dit, j’ai mon tag 12_-_avec_des_animations. Et j’ai fini le tutorial !

Conclusion

J’espère vous avoir convaincu, malgré le côté un peu expérimental de cette histoire, de l’intérêt d’utiliser wisdom. Pourquoi ?

  • Parce que le packaging javascript utilisant les webjars est bien plus simple
  • Parce que les tests Fluentlenium sont eux aussi bien plus simples à écrire que les tests protractor
  • Parce que je n’ai pas parlé des optimisations des images, de l’utilisation de LESS, de Typescript, ou d’autres fonctionnalités encore plus chouettes
  • Et enfin parce que lorsqu’on package une application wisdom, on package un tout : client et serveur, bénéficiant à la fois de la facilité de Javascript, et de l’écosystèpme serveur Java.

La suite ?

Je pourrais, dans une version ultérieure, faire un peu de code serveur : générer le phones.json à aprtir d’une servlet quelconque, gérer la sécurité, faire du push via websockets, … Mais pour ça, on verra plus tard.