Stackoverflow en version publique
L’info cours sur la toile: l’ouverture d’une nouvelle plateforme programming Q&A complètement ouverte et gratuite.
Cette nouvelle plateforme a pour nom stackoverflow et a été initiée par (non des moindres) les auteurs des blogs Coding Horror et Joel on Software, j’ai nommé Jeff Atwood et Joel Spolsky.
Ce genre de plateforme tient son existence principalement à la communauté qui la suit. Dès lors j’espère vraiment que soutient il y aura et que le genre de “souci” que Joel décrit dans son billet disparaîtra bel et bien, autrement dit, dès qu’une question se profile… Je ne tape non plus google.com (avec ses inconvénients lors de questions précises..) mais plutôt stackoverflow.com!
L’idée est très bonne et les initiateurs sont des gars très talentueux, on peut donc se dire qu’on est entre de bonnes mains et que si espoir il devait y avoir, on est en tout cas bien parti pour que ça prenne bonne forme.
A ma première impression, je vois un design épuré, une navigation conviviale et rapide. Je vois également que les auteurs s’impliquent au niveau du contenu de la plateforme et ca c’est plutôt pas mal…
Il ne reste donc plus qu’à voir comment va réagir la communauté et si l’engouement passé, un réel groupement de développeurs va venir enrichir le contenu de ce:
synthesize aspects of Wikis, Blogs, Forums, and Digg/Reddit in a way that is somewhat original
On croise les doigts!
Netbeans et PHP
Non je n’ai toujours pas jeté un oeil au support PHP (ni python d’ailleurs) proposé par Netbeans. Et pourtant j’encourageais à le faire il y a peu….
Bref c’est pas grave, une séance de rattrapage est proposée par les éditeurs de Netbeans TV avec ce screencast:
En moins de 10 minutes, on y aborde l’intégration d’un projet PHP (wordpress) couplée à la gestion de sa base de données (MySQL) mais aussi du debugging et la traditionnelle completion syntaxique.
Ca vaut vraiment le coup de le visionner en plus accompagné par un accent indien toujours aussi sympa!
Les atouts de Flex selon Ward
Une interview très intéressante à lire si vous vous intéressez au développement Flex mais que vous ne savez pas trop quels en sont les avantages.
James Ward répond au CEO d’EffectiveUI en mentionnant par exemple deux cas d’utilisations en entreprise. Il met également en avant les résultats d’une étude en cours d’élaboration par les gaillards d’Adobe : 30% de temps de gagné en choisissant Flex! Certainement à prendre avec des pincettes. MAIS! Oui mais.. Quelques lignes plus haut, Ward explique que le temps perdu à débugger de l’AJAX, on le récupère directement sur Flex puisque le framework gère lui-même les communications client/serveur. Or… Le temps de débuggage quantifié est égal à… 30%!
Vous en avez marre de débugger de l’AJAX? Il serait peut-être temps de jeter un oeil à Flex…
Thinking in Flex!
Toujours dans l’actualité Flex, le blog Code moi un mouton nous apprend une bonne nouvelle:
Scoop: James Ward et Bruce Eckel (l’auteur de Thinking in Java) préparent un livre de 120 pages qui s’adresse à tous les développeurs qui souhaitent apprendre Flex. Ca sent le best-seller…
Pour ceux qui ont parcouru Thinking in Java (j’ai pu faire mes débuts avec cet excellent bouquin) et qui souhaite en apprendre un peu plus sur Flex, je sens que ca va être le point de départ idéal! Je me réjouis!
Et pour finir en beauté avec le monde Flash/Flex (du moins avec ce post), voici le dernier clip de Radiohead réalisé en flash et ce sans caméra(!):
Quelques explications ici et ici.
Netbeans et Python
Netbeans est déjà un excellent IDE pour le langage Java, C/C++ et Ruby. Il est certainement trop peu utilisé (moi y compris) face au quasi standard Eclipse… Mais l’actualité récente le concernant devrait encourager plus d’un à au moins l’essayer. Ses créateurs lui ajoutent en effet régulièrement le support de nouveaux langages.
Déjà avec la sortie de la version 6, Netbeans a apporté un support à JavaScript largement apprécié par la communauté.. La version 6.5 prédit le support de Php et avant-hier, InfoQ a diffusée l’annonce du support prévu de Python! Prenant forme d’un projet opensource, il est possible de retrouver les développeurs de ce projet sur le site: https://nbpython.dev.java.net/ … Vous noterez que leur logo est bien laid
Excellent nouvelle que voilà, je me réjouis de voir ce que cela va donner. C’est en tout cas une raison de plus de tester Netbeans. Python est un langage qui monte avec constance et qui, comme le mentionne l’article d’InfoQ, passe gentiment devant Perl. De plus, ce qui n’est pas négligeable c’est que ce langage est très agréable à utiliser et possède une forte communauté. Pour preuve Google a récemment lancé sa plateforme AppEngine basée sur ce langage.
Si vous ne connaissez pas encore ce langage, jetez-vous dessus! Le meilleur départ: Dive Into Python. Dernière chose, Sun a lancé en parallèle un nouveau Developper Center sur ce qui tourne autour de python, à ne pas manquer!
Building GWT Comet based web app using Grizzly Comet
J’ai parlé il y a quelque temps des difficultés de Java à fournir la possibilité de mettre en place une architecture web riche… JavaOne étant terminé, on retrouve maintenant ici et là les différentes présentations disponibles sur le net et concernant ce sujet d’actualité, l’une d’elles semble être particulièrement intéressante. J’ai nommé: Writing Real-Time Web Applications, Using Google Web Toolkit and Comet.
Il est possible de retrouver les slides de la présentations en cliquant sur ce lien.
La présenation se base sur l’utilisation de l’outil de google GWT et du serveur de Sun GlassFish couplé à Grizzly Comet.
Enjoy!
Teach Yourself Programming in ten years
Je suis retombé récemment sur cet article extrêmement intéressant: Teach yourself programming in ten years.
Passé l’introduction, Peter Norvig expose plusieurs points qui selon lui sont la recette du succès pour devenir un bon programmeur. Peter Norvig est actuellement Directeur de Recherche chez Google US, il est donc légitime de faire confiance en ses dire. Les voici en résumé:
- Avoir du plaisir! Programmer parce qu’on aime ça. Et le faire avec suffisamment d’envie pour pouvoir le faire encore dix après.
- Avoir un échange avec d’autres programmeurs. Lire le code d’autres développeurs . Et aujourd’hui avec la multitude de projets open sources (qui a dit Java?) il n’y a pas d’excuse pour trouver du code écrit par des professionnels.
- Coder, coder, coder et encore coder! En effet, n’oublions pas que c’est en forgeant que l’on devient forgeron.
- Obtenir un titre universitaire permettra de postuler sur des emplois demandant un papier et permettra également d’avoir une compréhension plus profonde du sujet. Cependant l’expérience ne s’acquiert ni en lisant des livres, ni en assistant à des cours. Il est donc possible de devenir un programmeur professionnel en ayant uniquement une formation de base et en développant ses compétences par la pratique. L’expérience de Peter Norvig nous apprend que l’un des meilleures programmeurs qu’il ait eu l’occasion d’embaucher était de niveau pré-universitaire (l’un des créateurs de netscape entre autre).
- Travailler avec d’autres programmeurs
- Travailler sur des projets après d’autres programmeurs.
- Apprendre au moins une demi douzaine de langages. Un supportant l’abstraction de class (Java, Python..), un supportant l’abstraction fonctionnelle (Lisp, Haskel), un supportant l’abstraction syntactique (Lisp), un supportant les spécifications déclaratives (C++ templates), un supportant les coroutines (Scheme) et enfin un supportant le parallélisme (Sisal).
- Prendre part dans l’effort de standardisation d’un langage. Même dans un contexte local, sur un projet personnel par exemple.
J’ai pris la liberté de ne pas mentionner tous les points mentionnés dans l’article. Mais rien qu’avec cette liste, il y aura certainement toujours quelque chose à faire, à améliorer. C’est aussi cela qui est passionnant avec l’informatique. Se dire que l’on n’aura jamais fait le tour du sujet, qu’il sera toujours possible d’en apprendre et de nourrir abondamment sa curiosité… Ca ca me plait!
Package java.lang
La bibliothèque Java est vaste, très vaste. Sans conteste cela lui procure une grande richesse puisque de ce fait il est possible de quasiment tout faire avec. Il devient cependant de plus en plus difficile de s’y retrouver à mesure que le langage évolue. Ces évolutions sont bien régulées par le Java Community Process mais n’empêche que les fonctionnalités sont toujours plus nombreuses!
Je vais tenter par une série de plusieurs articles de parcourir quelques-uns des packages de Java afin de montrer les différentes classes disponibles. Bien sûr ce ne sera qu’un survol mais toujours utile, que l’on découvre le langage ou que l’on ait davantage l’habitude d’utiliser Java (enfin j’espère).
Pour bien commencer, prenons les choses par le début: java.lang. Ce package est automatiquement importé lorsque l’on développe en Java. Toutes les classes présentes dans ce package sont très souvent utilisées dans les programmes et le compilateur nous facilite la vie en faisant lui-même le lien lorsqu’il en rencontre une utilisation.
Wrapper types
On retrouve ainsi la définition des types de Java (Boolean, Byte, Character… et le vénérable Object sans qui rien ne serait possible). On les nomme généralement Wrapper types pour faire ressortir que ce n’est que la correspondance des types natifs (ou primitifs) qui sont utilisés lorsque l’on fait par exemple:
int theResponse = 42;
Lorsque l’on code sur Java à partir de la version 5, une fonctionnalité existante peut faire complètement oublier ce concept: l’autoboxing. En effet, précédemment le code suivant ne compilait pas:
Integer laReponseATteVosQuestion = 42;
Threading
Tous les outils de concurrences ne se trouvent pas dans ce package. Cependant, le socle de base de la programmation multi-threading est intégré dans java.lang. On y trouve la classe de base: java.lang.Thread mais aussi par exemple java.lang.ThreadLocal qui est utilisée afin d’implémenter le pattern Thread Local Session.
On peut très bien n’utiliser que la classe Thread pour les besoins concurrents. Nous verrons cependant lorsque nous aborderons le package java.util.concurrent qu’il existe plusieurs outils supplémentaires qui facilitent la vie du développeur lorsqu’il met le pied dans le monde du multi-threading.
Accès système
Enfin, plusieurs classes de ce package permettent de faire appel au système sur lequel tourne Java.
La classe System contient uniquement des membres statiques permettant par exemple de récupérer le flux de sortie de Java (le flux utilisé pour afficher des données à l’écran, la console), le temps actuel en millisecondes ou en nanosecondes, récupérer une variable d’environnement, enregistrer une propriété système, charger une classe ou une librairie dynamiquement ou encore enregistrer un SecurityManager personnalisé.
La classe Runtime est elle davantage liée au "système" de Java. Il est ainsi possible de l’utiliser afin de récupérer la mémoire disponible dans la machine virtuelle, lancer le Garbage Collector (aussi possible depuis la classe System qui fait en fait une redirection sur la classe Runtime) et enfin avant de mentionner la dernière classe, Runtime permet d’exécuter un nouveau processus système…
La classe Process liée donc à Runtime mais aussi à ProcessBuilder représente un processus natif. Une utilisation de ce genre de classe peut bien évidemment limiter la portabilité de l’application; il faut par conséquent bien réfléchir quant à son utilisation.
Par exemple, pour une application graphique permettant d’exécuter des imports de données sur une base Oracle il existe l’outil bien connu Sql Loader qui permet de charger les donner en ligne de commande. Il sera possible d’appeler directement depuis le code Java l’exécutable d’Oracle de cette manière:
Process p = new ProcessBuilder("sqlldr", "userid=root control=control.ctl").start();
Ensuite les flux de sortie, d’entrée et d’erreur sont disponibles et doivent être récupérés afin de pouvoir communiquer avec le processus lancé.
Autour de tout cela je n’ai pas pris le temps de parler de l’ensemble d’exceptions et d’erreurs se trouvant dans le package mais comme je l’ai dit dans l’introduction, ce n’est et ne sera qu’un aperçu!
L’union fait la force
Il est toujours intéressant de parcourir du code source créé par d’autres personnes, c’est à mes yeux une excellente formation pour devenir un bon développeur. Je peux le vérifier en ce moment puisque je travaille sur la résolutions d’incidents sur une application web ayant pour base principale Struts.
J’ai été vraiment impressionné par le nombre de classes utilisées simplement pour supporter les opérations ajout, récupération,mise à jour et suppression de données (CRUD). A la décharge de l’équipe ayant créé cette application, il faut avouer que le modèle de Struts encourage à créer une classe par action.
Personnellement, je pense que la philosophie objet est respectée si l’on décide de regrouper les opérations CRUD dans une seule et même classe. Le nombre de classes va ainsi diminuer et rendre plus de clarté à l’environnement et l’objectif de chaque classe sera toujours bien défini.
De plus pour ne rien gâcher, Struts propose lui-même cette solution! La classe DispatchAction permet en effet au développeur de regrouper plusieurs actions en une-seule. Cette classe se trouvant dans la hiérarchie de la standard Action n’ est donc pas très différente de celle-ci.
En reprenant ce qu’explique la javadoc de cette nouvelle recrue, voici comment doter davantage de fonctionnalités à une action:
- la déclaration de la classe dans le fichier struts-config est quelque peu différente:
<action
Le type de l’action correspond à la nouvelle classe et l’attribut parameter tient également un rôle particulier dans cette situation. C’est ce paramètre qui va être utilisé afin de définir quelle action sera exécutée.
path="/saveSubscription"
type="org.apache.struts.actions.DispatchAction"
name="subscriptionForm"
scope="request"
input="/subscription.jsp"
parameter="method"/> - définir une méthode par action suivant le modèle suivant:
public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
- la dernière chose à faire est de faire passer le paramètre ‘method’ (la valeur de l’attribut parameter de la 1ère étape) avec comme valeur le nom de l’action. Pour ce faire il n’y a qu’à passer par un lien ou un champ caché dans un formulaire!
Le résultat devient tout de même beaucoup plus agréable! La productivité va également sûrement être favorisée du fait qu’il n’y aura plus à jongler entre plusieurs classes pour changer d’opération sur un certain objet… Et le développeur qui devra passer plus tard sur un code plus compact en sera très reconnaissant
Amazon Web Service
Les applications aujourd’hui connectées à Internet peuvent interroger des services web afin d’obtenir des données externes aux objets de l’application. Il est ainsi possible d’interroger des miliers de bases de données en ligne.
Nous avions par exemple vu l’application Delicious Library. L’appel d’un service web se fait au moment où on lance une recherche à propos d’un média. En entrant un simple mot vous obtenez une liste de livre, cd, dvd ou encore de jeux vidéos correspondant à votre recherche. L’application utilise le service web de la plateforme amazon et par cet article je vais démontrer la facilité avec laquelle il est possible d’interroger se service web en Java. C’est parti!
Java et le web 2.0
Un article intéressante concernant java et les appels asynchrones est consultable sur developerwors.
Il met bien à l’index les lacunes de l’architecture Servlet de Java en ce qui concerne le buzz du moment : le web 2.0. Mais ce qu’il y a d’intéressant c’est que l’article propose des pistes sur lesquelles se diriger lorsque l’on veut créer une gestion asynchrones de requêtes. Il est parlé entre autre de du projet Apache MINA , SEDA, mais également du pattern COMET. Très bon tour d’horizon et d’idées à consulter. Un benchmark est de plus utilisé afin de prouver l’apport des appels asynchrones par rapport à la démarche synchrone traditionnelle à Java. Il propose de nombreuses ressources; à aller consulter!
Pour info l’article parle également de 2 solutions proposées par les conteneurs Tomcat et Jetty qui permettent une communication asynchrone : Apache Tomcat 6 Comet API et Jetty Continuations.