dimanche 30 décembre 2012

Fiche de lecture : Cloud Architecture Patterns par Billy Wilder


Titre
Cloud Architecture Pattern

Auteur
Billy Wilder

Editeur
Oreilly

Date de sortie
Septembre 2012

Description de l'éditeur

If your team is investigating ways to design applications for the cloud, this concise book introduces 11 architecture patterns that can help you take advantage of cloud-platform services. You’ll learn how each of these platform-agnostic patterns work, when they might be useful in the cloud, and what impact they’ll have on your application architecture. You’ll also see an example of each pattern applied to an application built with Windows Azure.
The patterns are organized into four major topics, such as scalability and handling failure, and primer chapters provide background on each topic. With the information in this book, you’ll be able to make informed decisions for designing effective cloud-native applications that maximize the value of cloud services, while also paying attention to user experience and operational efficiency.
Learn about architectural patterns for:
  • Scalability. Discover the advantages of horizontal scaling. Patterns covered include Horizontally Scaling Compute, Queue-Centric Workflow, and Auto-Scaling.
  • Big data. Learn how to handle large amounts of data across a distributed system. Eventual consistency is explained, along with the MapReduce and Database Sharding patterns.
  • Handling failure. Understand how multitenant cloud services and commodity hardware influence your applications. Patterns covered include Busy Signal and Node Failure.
  • Distributed users. Learn how to overcome delays due to network latency when building applications for a geographically distributed user base. Patterns covered include Colocation, Valet Key, CDN, and Multi-Site Deployment.


Avis


Cet ouvrage présente une suite de pattern d'architecture typique du nouveau paradigme cloud.

Les patterns d'architecture présentés sont pour certains très présents dans l'actualité ou dans les usages :

- CDN
- MapReduce
- Database Sharding
- Horizontal Scalability
- Eventual Consistency
- Auto-scaling
- Multisite deployment

Ces patterns répondent aux exigences de notre temps : une expérience utilisateur de qualité quelque soit le lieu ou il se trouve, dans un monde numérique où la masse des données à traiter est en croissance perpétuelle.

Le fil conducteur de cet ouvrage est une application nommée PoP inventée pour fournir les différents cas d'utilisations nécessaires à la compréhension des patterns.

Chaque pattern est présenté dans une chapitre dédié, toujours selon le même plan : le contexte, les impacts, la mécanique du pattern, un exemple, un résumé du chapitre.

L'auteur étant un expert de Windows Azure, nombre d'exemples concrets utilisent des références aux services de Microsoft.

Globalement, l'ouvrage est clair et les exemples bien choisis.

Certains patterns existaient avant le cloud mais le cloud permet souvent une mise en oeuvre élégante à un coût a priori largement inférieur aux méthodes traditionnelles.

L'intérêt du livre est à mon sens de proposer un état de l'art des architectures cloud sans lier la démonstration à une plateforme spécifique.

Il guide l'architecte pour construire des applications nativement adaptées au cloud.

Je vous conseille donc cet ouvrage si vous voulez comprendre comment utiliser le cloud pour répondre aux défis d'aujourd'hui ou de demain.






Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.


dimanche 16 décembre 2012

HTML 5 Offline : Chrome App Cache refresh



HTML 5 offline is a great feature !

No doubt about it ... but when playing with it it in Chrome, you will find out this famous browser is pretty effective in caching things.

Indeed, HTML 5 spec is helping Chrome for that point : when you put a page and following ressources in App Cache storage, it can stay forever unless the manifest is updated.

So i first find out i can list content of App Cache using chrome internals.

Use chrome://appcache-internals/ to get App Cache content.

Now you can remove entries if you like :



This is pretty ineffective.

So, i've decided to create my own extension to deal with that.

Yes, many chrome extension exists for this but they come with a certain amount of complexity.

I want a simple tool to help me with App Cache and Cache : i don't want to deal with cookies, localStorage and the whole family !

So, here it is : Appcache cleaner

Chrome does not refresh "Application cache" folder in developer tools but try to reload the page : you will notice  Chrome download resources from your server.

You can find it on Chrome Web Store using  "appcache cleaner" words. Then choose Extension panel.

Enjoy !

Update : i've built another extension, the Local Storage Cleaner extension.



vendredi 14 décembre 2012

MOOC : le savoir à la portée de tous



Je pense que nous sommes à l'aube d'une révolution : grâce au progrès technologique, notamment au cloud computing, toute personne correctement équipée pourra assister depuis son domicile ou son lieu de travail, à un enseignement de qualité.

MOOC


MOOC est un acronyme qui signifie Massive Open Online Course.

Ce concept émergent est déjà incarné par plusieurs acteurs notamment Coursera.

Choisssissez un cours parmi des thèmes aussi variés que les statistiques financières, l'improvisation en Jazz, les patterns d'architecture logicielle, la biologie, .....

Imaginez un amphi virtuel de 50 000 personnes ...

Imaginez un professeur renommé et maître dans son domaine ...

Imaginez que tout cela est gratuit ...

Voilà, vous y êtes , vous assistez à un MOOC.


Diffusion du savoir et domination culturelle


Les perspectives offertes par ce nouveau mode de transmission du savoir sont stupéfiantes.

D'un point de vue, de la transmission du savoir, cette technologie est porteuse d'espoirs énormes pour les pays émergents.

C'est une occasion unique pour les étudiants ou les adultes en formation continue de bénéficier d'un enseignement de qualité.

D'ailleurs, les premières statistiques autour de Coursera montre que le concept séduit : plus d'un million d'inscrits dans 196 pays.

On peut imaginer des informaticiens du Bangladesh rassemblés dans une salle de cours équipée d'une connexion correcte assistant à un programme de quelques semaines donné par Martin Fowler.

Ce concept pourrait réduire l'écart entre les pays riches et les pays émergents dans certains domaines.

Cependant, la transmission d'un savoir n'est jamais neutre et porte une vision du monde.

En l'occurrence, les principaux fournisseurs de MOOC sont américains avec une grande majorité de professeurs anglo-saxons.

Quelle vision du monde vont-ils promouvoir ?

Nous savons déjà que des courants extrémistes aux états unis tentent de remettre en cause les sciences du vivant au profit d'interprétation religieuses.

Quelle sera l'influence de ces courants sur les MOOC de biologie par exemple ?

Bref, que des questions passionnantes et parfois inquiétantes ...


Aussi efficace qu'un vrai cours ?


A vrai dire, je n'en sais encore rien  !

Je suis inscrit pour l'instant à une session qui démarrera en avril 2013. 

Ce cours est donné par un des plus grands musiciens de Jazz en activité sous l'égide d'une université mondialement célèbre qui a formé de grands musiciens, à savoir Gary Burton et l'université Berklee school of music.


Plusieurs points sont connus :
- le cours est virtuel et différé : il s'agit de vidéos pré-enregistrées 
- des exercices sous la forme de quizz voire corrigés par des pairs sont proposés
- les professeurs sont exceptionnels
- les cours sont en Anglais pour la majorité 

Certains diront que rien ne remplace la présence et les conseils d'un professeur. Peut-être ...

Mais un vrai cours nécessite une disponibilité et implique des contraintes qui sont difficilement compatibles avec par exemple un travail à plein temps.

D'autre part, la qualité d'un professeur et la disponibilité intellectuelle de l'élève sont déterminantes pour l'acquisition d'un savoir.

Sans ce concept de MOOC, quel est la probabilité que je trouve les ressources et le temps nécessaire  pour suivre l'enseignement de ce musicien d'exception ?

Elle est à peu près nulle ...

Je suis donc impatient de suivre l'enseignement de ce grand musicien !




Je relaterais dans ce blog mon expérience.








Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.


mardi 11 décembre 2012

JSF JQuery Mobile archetype updated with JQuery Mobile 1.2.0 !



I'm proud to announce the 1.6 release of a maven archetype for JSF JQuery Mobile !
Updates are :
  • JQuery Mobile 1.2.0
  • JS scripts are rendered at the end of body
It's a quick start (tested with Maven 2.1.0, 2.2.X, 3.X) and runs at least with Glassfish 3.1.2, Tomcat 7, Tomcat 6.
mvn archetype:generate -Dfilter=jqmobile
It's not intended to cover all needs but simply give a your project a quick start.
I will update this archetype with best practices time after time.
Don't forget to apply best practice (corporate POM, ...).
Hope you enjoy !

You can find some informations about the artifact on Maven Central.



Contrat Creative Commons

the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.

samedi 8 décembre 2012

Développez un module de completion pour NetBeans


Mise à jour : j'ai créé une nouvelle API NetBeans pour faciliter fortement les développements pour ce type de complétion.

NetBeans est un environnement de développement Open Source écrit en Java et édité par Oracle.

Son but est d'être le meilleur EDI/IDE pour le développement Java/JEE notamment pour les applications webs (un aperçu du support pour JSF par exemple).

NetBeans est construit à partir du framework NetBeans Platform qui fourni l'ensemble des services pour bâtir des applications RCP.

NetBeans Platform vs Eclipse RCP ?


J'ai  réalisé une étude autour de ces deux frameworks il y a quelques années.

L'utilisation d'outils pour analyser le code des deux frameworks avait démontré que ces frameworks sont comparables à mon sens d'un point de vue de la qualité.

Cependant, la philosophie qui sous tend les IDE bâtis sur ces frameworks est bien différente.

NetBeans IDE est développé par un éditeur unique dont le but est de fournir un outil productif pour Java/JEE : l'IDE colle au plus près des normes Java et des standards associés (CSS 3, HTML 5, ...).

Malheureusement, au fil du temps, Eclipse IDE est devenu une usine à gaz avec pléthore de plugin dont la maturité est parfois douteuse notamment sur des points pourtant cruciaux.

A mon sens , l'écosystème Eclipse a connu une croissance importante au cours des dernières années mais au détriment de la qualité.

De plus, il semble que la priorité de la fondation Eclipse ne soit pas Java/JEE, la persistence de bugs vraiment pénibles sur WTP même dans les versions récentes par exemple en témoigne.

D'autres éléments me gênaient également : le support médiocre de certains standards comme JSF, CSS 3 ou Maven m'auront décidé à tester NetBeans IDE.

Après presque 10 ans d'utilisation intensive d'Eclipse, je suis passé à NetBeans et je ne le regrette absolument pas.

C'est donc tout naturellement que je me suis intéressé au développement de module NetBeans.

Un petit tour de NetBeans Platform


Comme nous l'avons dit plus haut NetBeans Platform est un framework RCP.

Il fournit une API pour construire des modules, des services techniques, des composants d'IHM basé sur Swing, ...

Le framework est plutôt bien documenté notamment pour débuter très rapidement dans le développement de module.

Les modules sont construits par Maven ou le système natif de NetBeans basé sur Ant en fonction de votre préférence.

Le site pivot de la documentation est ici.

Spécifications du module


Le module de complétion permettra de fournir la liste des langages ISO 639-1 lorsque le développeur saisira la valeur d'un attribut lang dans une page XHTML.

L'attribut lang est un point important pour l'accessibilité des sites webs, voici un article qui détaille son mode d'emploi.

La documentation NetBeans propose une liste d'API pour bâtir des éditeurs de  code : c'est en effet le but de notre module.

Chaque API est documentée sous la forme d'un didacticiel et de références à la Javadoc de la plateforme.

Dans notre cas, il s'agit de l'API Editor Code Completion.

Vous noterez que le didacticiel présente un exemple de complétion proche de notre objectif.

Nous baserons pour plus de simplicité notre module sur le système de build natif de NetBeans.

La version de NetBeans retenue est la 7.2.1.

Création du module


Lancez NetBeans 7.2.1.

Créez un nouveau projet (File > New project) puis dans l'assistant choisissez "Module" dans la catégorie "NetBeans Modules".

Ensuite tapez IS06391 pour le nom du module puis suivant.

Dans le code base name ou package principal du module, tapez :

 jee.architect.cookbook.netbeans.iso6391

Terminer l'assistant en laissant les options par défaut.

NetBeans créé pour vous les éléments nécessaire au démarrage du projet.

Une première complétion


Le but du module est de fournir une complétion pour l'attribut lang d'un fichier XHTML : nous allons écrire la classe qui fournira ce service.

Pour NetBeans il s'agit d'implémenter l'interface CompletionProvider. Il faut également indiquer à NetBeans pour quel type de fichier cette complétion doit s'appliquer.

Créez la classe ISO6391CompletionProvider comme suit dans le package principal :


@MimeRegistration(mimeType = "text/xhtml", service = CompletionProvider.class)
public class ISO6391CompletionProvider implements CompletionProvider {

    @Override
    public CompletionTask createTask(int queryType, JTextComponent jTextComponent) {
       
        return new AsyncCompletionTask(new AsyncCompletionQuery() {
            @Override
            protected void query(CompletionResultSet completionResultSet,
                        Document document, int caretOffset) {
                completionResultSet.finish();
            }
        });
    }

    @Override
    public int getAutoQueryTypes(JTextComponent jTextComponent, String string) {
        return 0;
    }
}

Il faut maintenant régler le problème des dépendances manquantes que NetBeans vous signale par des erreurs de compilation.

Pour ce faire cliquez droit sur le noeud "Libraries" du projet et lancer la commande "Add Module Dependency".

Tapez "Editor Code" dans le filtre puis choisissez le module "Editor Code Completion".

Recommencez l'opération avec "mime", choisissez le module "MIME Lookup API".

L'annotation MimeRegistration permet d'enregistrer notre classe comme fournisseur de completion pour le type mime précisé.

Avec cette annotation, NetBeans activera notre module et cette classe pour chaque action de complétion sur un fichier XHTML.

Vous pouvez d'ors et déjà tester cela en lancer le module en mode debug. Pour cela cliquez droit sur le module et exécutez "Debug".

Positionnez un point d'arrêt dans la méthode query puis ouvrez un projet quelconque dans l'éditeur lancé en mode debug.

Ouvrez/Créez un fichier XHTML puis lancer une action de complétion : touche Control+Space sous Windows/Linux. Le débogueur devrait s'arrêter sur votre point d'arrêt.

Il faut maintenant fournir des données valables !

Liste des langages 


Nous allons dans un premier temps fournir la liste des langages ISO639-1 chaque fois que l'utilisateur tentera une complétion dans un fichier XHTML. Nous restreindrons plus tard cette complétion à l'attribut lang courant.

Pour peupler la liste des items de complétion il suffit de peupler l'objet CompletionResultSet fourni en paramètre par la plateforme.

NetBeans fourni le concept CompletionItem qui modélise 1 item présenté dans la liste associée à l'action de complétion de l'utilisateur.

Voici l'item de complétion pour notre cas :


public class ISO6391CompletionItem implements CompletionItem {

      private static ImageIcon ICON =
            new ImageIcon(ImageUtilities.loadImage("jee/architect/cookbook/netbeans/iso6391/bubble.png"));
  
    private String text;

    public ISO6391CompletionItem(String language) {
        this.text = language;
    }

    @Override
    public void defaultAction(JTextComponent jtc) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void processKeyEvent(KeyEvent ke) {
    }

    @Override
    public int getPreferredWidth(Graphics graphics, Font font) {
        return CompletionUtilities.getPreferredWidth(getText(), null, graphics, font);
    }

    @Override
    public void render(Graphics graphics, Font defaultFont, Color defaultColor,
            Color backgroundColor, int width, int height, boolean selected) {
        CompletionUtilities.renderHtml(ICON, getText(), null, graphics, defaultFont,
                (selected ? Color.white : getColor()), width, height, selected);
    }

    @Override
    public CompletionTask createDocumentationTask() {
        return null;
    }

    protected Color getColor() {
        return Color.decode("0x0000B2");
    }

    @Override
    public CompletionTask createToolTipTask() {
        return null;
    }

    @Override
    public boolean instantSubstitution(JTextComponent jtc) {
        return false;
    }

    @Override
    public int getSortPriority() {
        return 0;
    }

    @Override
    public CharSequence getSortText() {
        return getText();
    }

    @Override
    public CharSequence getInsertPrefix() {
        return getText();
    }

    private String getText() {
        return this.text;
    }

}


 La plupart des méthodes de la classe ISO6391CompletionItem sont fournies par l'interface CompletionItem. Vous devrez ajouter l'API Utilities API comme librairie supplémentaire.

Ensuite, il suffit d'ajouter des items à l'objet completionResultSet :


   @Override
    public CompletionTask createTask(int queryType, JTextComponent jTextComponent) {
        
        return new AsyncCompletionTask(new AsyncCompletionQuery() {
            @Override
            protected void query(CompletionResultSet completionResultSet, 
                        Document document, int caretOffset) {
                for(String code:ISO6391CompletionProvider.codes){
                    completionResultSet.addItem(new ISO6391CompletionItem(code));
                }
                completionResultSet.finish();
            }
        });
    }



La complétion est désormais effective mais s'affiche n'importe où :





Maîtriser l'affichage de la complétion


Il nous faut donc retravailler la classe ISO6391CompletionProvider :



    @Override
    public CompletionTask createTask(int queryType, JTextComponent jTextComponent) {

        int position = jTextComponent.getCaretPosition();
        String text = jTextComponent.getText();
        StyledDocument styledDocument = (StyledDocument) jTextComponent.getDocument();
        int lineNumber = NbDocument.findLineNumber(styledDocument, position);
        Element lineElement = styledDocument.getDefaultRootElement().getElement(lineNumber);
        int startOffset = lineElement.getStartOffset();
        int endOffset = lineElement.getEndOffset();
        String lineOfText = text.substring(startOffset, endOffset);
        int column = NbDocument.findLineColumn(styledDocument, position);

        if (LangMatcher.containsRef(lineOfText)) {

            final LangAttribute langAttribute = LangMatcher.getValue(lineOfText, column);
            if (langAttribute == null) {
                return null;
            } else {
                langAttribute.setLineOffset(startOffset);
                return new AsyncCompletionTask(new AsyncCompletionQuery() {
                    @Override
                    protected void query(CompletionResultSet completionResultSet,
                            Document document, int caretOffset) {

                        for (String code : ISO6391CompletionProvider.codes) {
                            if (code.startsWith(langAttribute.getValue())) {
                                completionResultSet.addItem(new ISO6391CompletionItem(langAttribute, code));
                            }
                        }
                        completionResultSet.finish();
                    }
                });
            }

        } else {
            return null;
        }
    }


Le code surligné permet de déterminer la zone, précisément où l'utilisateur interagit.

Nous avons besoin d'obtenir :
- la position du curseur : JTextComponent nous la donne
- la ligne de texte concernée : NbDocument est une classe utilitaire très pratique pour ce genre de problèmes

Ensuite, il s'agit de faire quelques calculs d'offset et d'utiliser un scanner et une regex pour trouver les occurrences de texte qui nous intéressent.

Ce sont les classes LangMatcher et LangAttribute qui vont remplir cette tâche essentielle.

L'idée est de savoir si le curseur de l'utilisateur est dans la zone de saisie d'un attribut lang.

Enfin, il faut maintenant insérer le texte lorsque l'utilisateur choisit un item dans la boîte de complétion.

C'est la responsabilité de la classe  ISO6391CompletionItem :



    @Override
    public void defaultAction(JTextComponent jtc) {
        try {
            StyledDocument doc = (StyledDocument) jtc.getDocument();
            int start = this.langAttribute.getLineOffset() + langAttribute.getStart();
            doc.remove(start, langAttribute.getValue().length());
            doc.insertString(start, getText().substring(0,2), null);
            // Ferme la boite de completion
            Completion.get().hideAll();
        } catch (BadLocationException ex) {
            Exceptions.printStackTrace(ex);
        }
    }



Notez que cette approche est réutilisable pour implémenter d'autres complétions pour d'autres attributs.
Il faudra bien sûr adapter un peu le code notamment la regex et le scanner.

Ajout : cet article a été commenté par Geertjan Wielenga qui s'est fendu d'une proposition générique dans la foulée.

Conclusion

Nous avons vu qu'il était assez facile de créer un plugin de complétion basique pour NetBeans.

Cet IDE propose bien d'autres points d'extensions intéressants tout aussi utile : hyperliens, recherche rapide, palette, ....


Vous trouverez le code complet sur mon espace github.

Mise à jour importante : j'ai créé une sur-couche à l'API de complétion de NetBeans pour augmenter fortement la productivité.



Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.


samedi 1 septembre 2012

Retour sur l'actualité : août 2012


OmniFaces 1.1 : un add-on JSF intéressant

http://www.journaldugeek.com/2012/08/06/exosquelette-imprime-3d-aider-petite-fille-mouvoir/

Les patterns des grands du web :
- Buy vs Build  (progiciel ou développement maison ?)
- Cloud First

JMeter dans le nuage avec BlazeMeter.

JQuery 1.8 est sorti !

La première voiture Open Source

Evolution des architectures décisionnelles avec le BigData

Choisir un framework Javascript MVC

La typographie, fondation du web (avec exemples magnifiques de typo)

Modes de déploiement de Camel

Sortie du dernier Martin Fowler : NoSQL Distilled

8 manières d'améliorer son comportement face aux incidents en production

J2SE 6 supporté jusqu'en Février 2013

Productivité du développeur : l'équipement est un élément fondamental

Samsung a perdu une bataille

Un seul comité exécutif pour les éditions Java

Quand Oracle va-il prendre au sérieux la sécurité de la plateforme Java ? Encore une faille critique mais corrigée rapidement

Le W3C sort une nouveau projet de spec pour des images "responsives"
  

vendredi 1 juin 2012

Retour sur l'actualité : mai 2012


Ma sélection très personnelle des nouvelles du mois de mai 2012 :


Apache TomEE est certifié 

Guerre des brevets :
- Oracle vs Google : Android ne viole pas les brevets Oracle, le juge est un développeur, une API n'est pas copyrightable (ouf de soulagement dans le monde de l'open source)
- Google vs Microsoft : Google veut des dollars (plein)
- Microsoft vs Motorola : les terminaux Android Motorola interdits en Allemagne


Cyber-guerre : Flame le petit dernier

Les Google Glass en test

Martin Fowler et la haine des ORMs (notamment Hibernate)

Un tuto bien fourni sur Camel

Les patterns des grands du web par OCTO:
- le sharding
- la fluidité de l'expérience utilisateur
- le feature flipping


La consommation de CPU par la JVM s'envole ? Voilà pourquoi

Un projet intéressant pour ceux qui veulent abandonner P6Spy

Une boîte à outils pour le web

Comment choisir un ESB ...

Astuce JMS : communication bi-directionnelle

Sortie de JMeter 2.7 : amélioration significative des performances

Android : détournement de l'accéléromètre à des fins d'espionnage








Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.

mardi 29 mai 2012

L'index TIOBE en question ?



L'index TIOBE se propose de mesurer la popularité des langages de programmation auprès des développeurs.

Depuis plusieurs années, Java et C se partage la tête du classement.

Des langages ont fait leur apparition dans le classement comme Objective C, tandis que d'autres sont sortis du classement comme Delphi.

Récemment, Java a perdu sa place de leader pour laisser la place à C comme à plusieurs reprises dans l'histoire de l'index.

On constate également d'autres mouvements de baisse ou de hausse comme la baisse de PHP ou la hausse d'Objective C.

Des voix s'élèvent pour contester ou modérer la pertinence de ce classement.

On pourra citer notamment un des leaders de la communauté PHP et PDG de la société Zend Technologies qui s'est élevé contre le résultat du dernier classement qui montre encore une baisse de PHP.

TIOBE répond en disant que les plaintes viennent de ceux dont les technologies baissent dans le classement, et explique que son index est "scientifique".

Un peu court et surtout un peu facile !

Accordons à TIOBE le bénéfice du doute.

La méthodologie TIOBE


Elle est décrite sur le site de TIOBE.

Nous pouvons constater que TIOBE se base les résultats de recherche des moteurs suivants :
- Google
- Yahoo
- Baidu
- Bing
- Blogger
- ...

Il pondère ensuite très fortement les résultats obtenus en fonction des moteurs  : Google compte pour 30% tandis que Yahoo compte pour 3% et Baidu pour 6%.

Soulignons qu'aucune explication (scientifique ou non) n'est donnée sur ces pondérations.

Ensuite, la requête de recherche qui est jouée sur les moteurs de recherche pré-cités consiste à utiliser les mots clefs suivants : <langage> programming

Pour Java cela donne java programming.

Grâce à une formule mathématique, TIOBE produit alors une note à partir du nombre de hits, des pondérations, d'un facteur dit de confiance, ...

TIOBE mesure ainsi une offre disponible pour chaque langage de programmation qui serait alors le pendant direct d'une demande donc d'une popularité.

Après un échange avec TIOBE, j'ai pu en savoir plus sur la philosophie de cet index et les postulats qui le soutiennent.

TIOBE considère les langages comme étant des objets d'étude aux propriétés "physiques" identiques.

Deux postulats sont mis en oeuvre.

P1 : une requête simple et unique est suffisante pour évaluer tous les langages de programmation
P2 : la fraction de sites de fait exclus par cette requête simple est identique pour tous les langages de programmation

Pour TIOBE, les langages de programmation sont un peu comme des icebergs.

La requête mesure la partie visible c'est à dire l'offre web.

La partie cachée, c'est à dire non couverte par la requête de recherche que l'on pourrait nommer écosystème associé, est une fraction de la partie visible : cette fraction est supposée la même pour tous les langages de programmation.

TIOBE ne donne aucune démonstration de l'exactitude des postulats retenus.

Les personnes derrière TIOBE sont très certainement des honnêtes gens mais aucun postulat sur lequel cet index est basé n'ait démontré scientifiquement.

TIOBE n'est donc en aucun cas une méthode scientifique bien qu'elle utilise des outils mathématiques.

Cependant, on peut faire de la mauvaise science avec des mathématiques impeccables.

Un problème avec Java ?


Considérons les langages de programmation Java et PL/SQL.

Coder en Java c'est certes manipuler le langage en lui même mais c'est aussi utiliser une myriade d'API issue des kits de développement ou de frameworks adressant telle ou telle problématique.

Etant moi même support sur un méta-framework JEE maison depuis 9 ans, je constate tous les jours que la majorité des questions posées par les développeurs concernent Hibernate, JSF, notre framework,etc ... mais quasiment jamais sur le langage Java.

La part des questions dédiée au langage Java est extrêmement faible : la majorité des questions que le développeur pose au web concernent des APIs, les exceptions remontées, ... et non le langage de programmation.

Dans notre pratique, le questionnement autour des APIs est infiniment plus grand que celui autour du langage, à moins d'être un débutant complet.

Si on compare maintenant Java avec le langage PL/SQL, qu'en est-il ?

PL/SQL est un langage de programmation : aucun doute là dessus, mais ce n'est pas une plateforme, pas plus que des centaines de frameworks écrits en PL/SQL n'existent.

Coder en PL/SQL c'est surtout manipuler le langage PL/SQL.

Le langage PL/SQL en lui même est suffisant pour résoudre la majorité des problèmes rencontrés contrairement au langage Java.

Dans ce cas les questions posées au web concerneront essentiellement le langage et encore seront-elles posées par des débutants ou développeurs occasionnels.

Ce raisonnement pourrait être fait pour d'autres langages aux écosystèmes très développés ou pas.

TIOBE ne tient aucun compte de cette réalité car il mets sur le même pied des langages dont l'usage est très différent.

Certains langages ont été conçu pour certains usages comme PHP pour dynamiser les pages HTML, d'autres comme Java, C, C++ sont ultra généralistes et permettent d'écrire tout type d'application : moteur de base de données, serveur d'application, jeux, site web, ...

Il me semble que le postulat P2 de TIOBE est faux : les langages sont différents notamment de par leurs champs d'application.

Pour un nouvel index


Il me paraît utile de proposer un autre index plus proche de l'objectif de TIOBE.

En effet, TIOBE est repris par des médias professionnels du secteur IT souvent sans les précautions d'usages.

Pourquoi ne pas considérer l'activité des forges de développements Open Source pour estimer la popularité des langages de programmation ?

Après tout, les développeurs Open Source sont souvent des développeurs professionnels et  les solutions Open Source ont envahi peu ou prou les entreprises, certaines rivalisants avec leurs équivalents propriétaires.

Enfin, peut-on imaginer une seconde que le nombre de projets Open Source n'ait rien à voir avec la popularité du langage utilisé ?

Personnellement, je pense que plus le nombre de projets Open Source est élevé pour un langage plus il est populaire.

Pour estimer la partie cachée de la popularité du langage, il faut poser le postulat suivant  : pour une population de développeur donnée, il y a toujours une fraction de développeurs Open Source, la même quelque ce que soit le langage de programmation.

Ce postulat n'est pas démontré scientifiquement, il repose sur une assertion qui paraît raisonnable : plus un langage est populaire plus il génère de projets Open Source.

Considérons par exemple la forge SourceForge qui permet facilement d'avoir le décompte des projets Open Source par langage.

Sourceforge donne le classement suivant avec le tag Recently updated :
- Java : 10 857 projets
- C++ :  9 566 projets
- C :   6 665 projets
- PHP :  5 031 projets
- etc ...

On peut constater que ce classement n'a rien à voir avec celui de TIOBE.

J'ai choisi Sourceforge car c'est une forge historique et probablement la plus importante.

Github et Google Code devraient par exemple être considérées, elles donneraient là aussi un classement bien différent.

En combinant les métriques produites à partir des forges les plus importantes pour le développement Open Source, l'index donnerait un classement probablement sensiblement différent de celui de TIOBE.

Conclusion


Il me semble que TIOBE devrait se remettre en question notamment à cause du décalage important entre ses résultats et d'autres évaluations pertinentes.

Cet index est à prendre avec des pincettes : c'est un indicateur partiel intéressant mais il ne peut prétendre être scientifique ou le seul valable pour mesurer la popularité d'un langage de programmation.









Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.





vendredi 4 mai 2012

JSF JQuery Mobile archetype updated with JQuery Mobile 1.1.0 !



I'm proud to announce the 1.5 release of a maven archetype for JSF JQuery Mobile dev !
Updates are :
  • JQuery Mobile 1.1.0
  • JS scripts are rendered at the end of body
It's a quick start (tested with Maven 2.1.0, 2.2.X, 3.X) and runs at least with Glassfish 3.1.2, Tomcat 7, Tomcat 6.
mvn archetype:generate -Dfilter=jqmobile
It's not intended to cover all needs but simply give a your project a quick start.
I will update this archetype with best practices time after time.
Don't forget to apply best practice (corporate POM, ...).
Hope you enjoy !




Contrat Creative Commons

the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.

vendredi 27 avril 2012

Java encoding (UTF) tips and tricks




Starts Java with default encoding for streams :

java ... -Dfile.encoding=UTF-8 ...


Read a file encoded in :

File inputFile = new File("...");
BufferedReader myFileReader = new BufferedReader(new InputStreamReader(new FileInputStream (inputFile), Charset.forName("UTF-8")));


Write a file with encoding :

File outputFile = new File("...");
BufferedWriter myFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),Charset.forName("UTF-8")));



Convert bytes to String using encoding :

byte[] stringBytes = ...;
String convertedString = new String(stringBytes,Charset.forName("UTF-8"));          



Convert String to bytes using encoding :

String myString = ...;          
byte[] stringBytes = myString.getBytes(Charset.forName("UTF-8"));



To be continued ...





Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.

samedi 21 avril 2012

LESS : scripting CSS


CSS  makes the buzz since we discover day after day the powerful CSS 3 features : 3D, Shadows, Transformations, Media Queries, ...


But if you look at HTML you can see many powerful technologies to make HTML page dynamic : PHP, JSP, JSF, ASP, ...


Whitout them, building webapp 2.0 would be just that hard !


We are living a time where customers want more customisation, where your webapps are touched by many differents devices. We definitly need dynamic CSS !


LESS  does the job by extending CSS.


With LESS you can add theme support, refactor your duplicated CSS code , customize look and feel on the fly, ...


Using LESS is using CSS with new syntaxic sugar.


But at the end of the day, a browser only knows CSS : you have to perform a LESS to CSS translation. 


You can use two modes for this:
  • dynamic :  LESS style sheet are translated on the fly by the browser 
  • static : via a LESS compiler, CSS are then deployed like usual CSS


Now, a quick overview of LESS.


Variables



Variables allow you to  manage gracefully common style values like colors :


@some-color: #FF34AA;

#myid { color: @some-color; }
.myclass { color: @some-color; }


LESS CSS translation :

#myid { color: #FF34AA; }
.myclass { color: #FF34AA; }


Mixins



With mixins you can embed any CSS inside another declaration.

.margined {
  margin-top: 1em;
  margin-bottom:1em;
}
#banner a {
  color: black;
  .margined;
}
ul {  
  .margined;
}

Target  embeds all styles defined in mixin :

#banner a {
  color: black;
  margin-top: 1em;
  margin-bottom:1em;
}

ul {  
  margin-top: 1em;
  margin-bottom:1em;
}

You can add args to mixins !


.margined (@height:1em){
  margin-top: @height;
  margin-bottom:@height;
}


#banner a {
  color: black;
  .margined(1.5em);
}

ul {  
  .margined;
}


Translates as :

#banner a {
  color: black;
  margin-top: 1.5em;
  margin-bottom:1.5em;
}

ul {  
  margin-top: 1em;
  margin-bottom: 1em;
}

See the default arg value feature on @height !

You can add many args to a mixin like a method.

 

Arithmetics



You can add, divide, multiply, substract variable :

@simple: 5%;
@double: @simple * 2;
@halfdouble: @simple + @double;

color: #666 / 3;
background-color: @somecolor + #250;
height: 100% / 2 + @double;

LESS keeps consistency with units, then 10px * 2 compute as 20px.



Playing with colors



These are very handy functions to build a theme for instance.

Some snippets:


lighten(@somecolor, 30%);     // 30% more ligther than @somecolor 
darken(@somecolor, 30%);      // 30% more darker than @somecolor

saturate(@somecolor, 3%);    // 3% more saturated than @somecolor
desaturate(@somecolor, 3%);  // 3% more saturated than @somecolor

Time to play



If you want to see LESS in action, have a look on Boostrap Twitter which is based on it.


LESS concepts will be a great bunch of features to add to official CSS.

But, Java ecosystem does not offer a good support for LESS compilation.


We'll see later how to integrate LESS on the server side with Rhino Javascript engine.






Contrat Creative Commons
the jee architect cookbook by Olivier SCHMITT est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 Unported.