mercredi 25 mai 2011

Git killer features

After 3 weeks of working with Git (the DCVS written by Linus Torwalds), I definitely can say that it is a great technology.

If you are asking yourself what you need to learn right now? What is the next major revolution in the IT world? Maybe, the answer will be Git.


What are the killer features of Git for me:
  • Distributed – I can develop normally even without Internet and access to the central repository. It’s a great feature to make small and concise commits while developing at home, during the weekend.
  • Rich history revision mechanism – the search within the log-history is wonderful. With
    git log –sSecurityManager
    I can find, for example, all commits that introduce or remove the SecurityManager class. Attention, the search is performed on the source code and not on the commit log. It’s a best tool for making the code live analysis.
  • Git bisect – automatically find a failing commit using the binary search and a set of unit tests. If you don’t use the CI server (shame on you :)), you can nevertheless quickly find a bad commit. Git bisect command will run the tests against the project snapshots. Each snapshot is associated with a particular commit. I did not try to use this command yet. But, the concept is great.
  • CMD – git is a command line based tool. You can script the commands, make aliasing etc. CMD speed up your productivity. Of course, for making the merge it’s not so trivial, but the guys from Eclipse will soon release a completely functional version of the plugin eGit.
  • git cherry-pick - reintegate an existing commit to the current branch. How many times you have forgot to switch to the correct branch before making a commit? I have been confronted with this painfull mistake quite often. Now you don't have to report your commit manually to the correct branch. The magic cherry-pick command will make it four you!

I have worked with git on Windows and Mac. Git for Mac is a stable and I have not noticed any problem. It is not the case for Windows...

Git remote tags problems

For running Git on Windows box, you have to install msysgit (I used 1.7.4.msysgit.0). The one problem I encountered with msysgit, it was that I could not push my tag to the remote repo. The command
git push --tags origin master
did not create a tag remotely. The same command executed on Mac did the job correctly
.

Git - pdf book about git

I can recommend to download a free PDF book "Git Community Book" about git from http://book.git-scm.com

As long as I learning Git, as more I understand its powerfull.

mardi 3 mai 2011

Tools : free screenshot capture

The tool of the day is gadwin printScreen (only for Windows users).

A really powerful and free screenshot capture tool that I used on my Windows box.

You can download it here

Log4j : Customize LoggingEvent for SMTPAppender

Hi,

Recently I was confronted to the need of customizing the log4j message generation. When an exception occurs, the application should sent the email to the development team in the following format:


The error message should be enclosed by the corporation information represented by the header and footer. The problem is the application URL (marked by the red ellipse). This URL can be different depending on the environment where the application is running and throwing the exception. In the complex, industrial projects where exist many environments, this can be very helpful to determine which environment has a problem.

First of all, how set the footer and header? It’s quite simple, you have to use org.apache.log4j.EnhancedPatternLayout, in the parameter ConversionPattern, you put the header, footer and the message error with some additional information (date, class name which generated the exception, etc). The standard log4j distribution(log4j.jar file) does not contain the class EnhancedPatternLayout, you have to download the additional extras companion (here)

Pay particular attention to do not use org.apache.log4j.PatternLayout which contains some issues with synchronization (see the first paragraphe of the associated JavaDoc). PatternLayout class is still widely used and all exemples on Internet use it, but for make your code robust you don’t have to use it.




And what about the environment dependent URL ? How can I put the http://myapp.production.com or http://myapp.integration-test.com in the log message? I found 2 solutions:
  1. Use ant or maven to replace a specific symbol in your log4j.xml (log4j.properties) when you are building the app. You can use filter resource maven plugin fot that. But is not the most elegant solution, because you will have a strong dependency with the build tool. For production system, it is not a choice.
  2. Use org.apache.log4j.EnhancedPatternLayout and %properties{key} mechanism
So first of all, you have to customize the SMTPAppender in order to put the specific information into the each message that will be sent. For that you have to subclass SMTPAppender and override the method append. Take a look on my test implementation:

The code is self documented. I put the URL to prod environment behind the key named "app".I hardcoded the value in order to make the explanation simpler. But in your production code you may get the correposnding value from properties file, from environment variable or from the database.

Next, the key “app” in the event property becomes available for Log4J runtime. You may see how I use it in my log4j.xml file (the 2nd screenshot).

The setProperty method is an extension point and the excellent example of a good designed API.


Updated : actually, there is a simpler method to inject the environment name into the log4j logging message - simply, change the ConversionPattern for each log4.propeperties file.

dimanche 17 avril 2011

JavaOne 2011 in Moscow. Review.

La semaine dernière j’étais en Russie, à Moscou, à la conférence JavaOne organisé par Oracle.

J’ai eu deux jours du plaisir technique. Entouré par les gens passionnés par la technique, j’ai pris une bonne dose de motivation.

La conférence se déroulait au centre de Moscou, au bâtiment épique de l’académie de science de la fédération russe (Российская Академия Наук - РАН) connu aussi sous le nom « Les Cerveaux » :)

Quelques points/événements clés que j’ai retenus à l’issue de la conférence sont présentés ci-dessous suivis de photos de ma collection.

Les nouveautés dans Java 7 présenté par une personne charismatique - Danny COWARD: join/fork mécanisme pour les traitements parallèles (map-reduce) ; le sucre syntaxique avec l’opérateur « Diamond » (<>) qui va faciliter la lecture du code qui utilise les génériques; le support de String dans l’opérateur switch ; les clauses catch avec la possibilité de préciser multiples exceptions.

Les standard Java EE 6 : avec l’API Servlet 3.0 (les appels asynchrones, configuration avec les annotations, le fichier web.xml est optionnel, l’utilisation du fichier web-fragment.xml pour les composants auto-configurable dans le contaneur, etc.), le support native de getsion de dépendence (DI) avec l’arrivé de la notation @Inject.


La présentation de Vladimir IVANOV (Oracle, Saint-Petersburg) sur la diagnostique et tuning du GC. J’ai noté un outil visualvm pour le profiling de performance des applications Java. Après la présentation, j’ai parlé avec cet ingénieur d’Oracle sur l’utilisation de Soft, Weak et Phantom références dans Java.

Une petite salle de repos pour les geeks :)

Et bien sûr, La Place Rouge avec le Kreml’.

Pour conclure, Oracle est motivé pour supporter le monde Java. L’organisation de la conférence est excellente, rien à reprocher. Merci Oracle pour ce JavaOne 2011.



dimanche 20 mars 2011

Integration tests with JUnit and Spring


Récemment dans le framework Spring j'ai trouvé une classe très utile pour faire des tests d'integration avec la base de données - AbstractTransactionalJUnit4SpringContextTests.
Cette classe contient plusieurs méthodes utilitaires pour tester le code qui interagit avec la BD. Voici la liste des méthodes que j'ai utilisé pour créer les tests d'intégration très élégante - faciles à implémenter et lire:
Je vais décrire la stratégie la plus facile à écrire une classe de test d'intégration est la suivante:
  1. Ecrire une classe de tests qui hérite de AbstractTransactionalJUnit4SpringContextTests
  2. Définir une méthode setUp avec l'annotation @BeforeTest. Cette méthode va utiliser executeSqlScript pour préparer la base de données en y injectant les données qui sont nécessaires pour l'exécution de votre méthode de test. Attention, à ne pas utiliser les ";" à la fin des lignes avec SQL. Les lignes qui se terminent par le ";" seront ignorés par Spring.
  3. La méthode de test qui va faire des "asserts" sur le nombre des lignes insérées dans les différentes tables impactés par les opérations DAOs. Pour faire ces asserts la méthode countRowsInTable est la plus appropriées.
  4. Pour que la base de données reste dans son état initial, il faut supprimer maintenant toutes les données qui ont y été ajoutées par deux étapes précédentes. Pour cela, il suffit de créer une méthode tearDown annotée par @AfterTest, dans cette méthode vous pouvez appeler la méthode généreusement offerte par Spring - deleteFromTables.
Regardez les fonctionnalités complètes de cette classe sur le site officiel de Spring ici.

samedi 29 janvier 2011

Démarrage d'un nouveau projet. Retour d'expérience

Récemment j’ai participé au démarrage d’un projet en Java. Nous avions la chance de prendre les décisions sur la création de l’usine de logiciel pour assurer la qualité du produit pour le client.

Je ne vais pas décrire toutes les étapes et tous les concepts que nous avons mis en place. Mais, je vais me limiter de présenter les outils que je n’ai jamais utilisés avant.

Wiki

Tout d’abord c’est – Redmine – un wiki d’entreprise. C’est un outil dont j’ai entendu parler depuis longtemps et j’ai l’utilisé un tout petit peu sur un projet sur lequel j’étais tout seul. Dès le démarrage du projet nous avons commencé à utiliser Redmine et nous avons réussi à motiver les développeurs de l’utiliser au quotidien. D’après ce que j’ai vu, les gens qui ont fait leur première page sur le Wiki y reviennent et l’utilisent plus régulièrement que ceux qui n’ont jamais écrit là-dedans. Je pense que cela s’explique par le fait d’être un auteur. Un auteur cherche en permanence d’améliorer son œuvre : ajouter une description d’un truc technique complexe, jouer avec la mis en page (surligner les informations importantes). Nous avons commencé par le plus simple. La page principale de notre wiki centralise et met à porter de main les informations sur l’infrastructure du projet :

  1. Le chemin vers le repository SVN
  2. URL, login et mdp pour les serveurs Hudson et Sonar.
  3. IP, login et mdp pour les bases MySql de test
  4. Le raccourci vers le répertoire du projet sur un serveur de fichier
  5. URL , login et mdp vers le serveur Nexus
  6. IP d’une passerelle SMTP utilisée
  7. Les HowTo’s sur la configuration d’Eclipse, Maven, Tomcat, etc.

Ces informations sont nécessaires tout au long du projet et sont utilisées par tous les membres de l’équipe. Désormais, je n’entends plus dans l’openspace les questions du genre : « C’est quoi le IP et le mot de passe du serveur MySQL ?» ou « Comment t’as fait pointer ton Maven en local vers le serveur Nexus ?». Toutes les réponses sont dans le Wiki. J’ai l’impression que les développeurs deviennent plus autonomes et par conséquent plus productif, ils savent où il faut chercher l’info.

L'intégration du Mylyn dans Redmine permet créer un boucle complet de la gestion technique du projet: Eclipse -SVN - BugTracker - Suivie du projet. Cette fonctionnalité n'est pas encore adaptée par notre projet, car cela nécessite la forte discipline et la rigueur des développeurs.

Un petit plugin textile de Redmine pour colorer le code source dans les pages wiki :


Vous remplacez le nom de la classe (xml, java, C#, python, etc) et les mots clés presents dans le texte seront coloré comme dans un IDE. Très pratique et très joli.

Tomcat 6.0 manager sous Ubuntu ne marche pas

Dans l'objectif d'automatiser le déploiement du war sur le serveur Tomcat 6.0, nous avons utilisé le plugin tomcat du maven. Voilà comment j'ai réussi:

  1. Installer l'application manager : sudo aptitude install tomcat6-admin
  2. Modifier le fichier $VOTRE_TOMCAT_INSTALL/conf/tomcat-users.xml comme suit, faites attention qu'il faut bien le rôle "manager"
  3. Redémarrer le serveur: sudo /etc/init.d/tomcat6 restart
  4. Mon erreur c'étais que je n'ai pas précisé le rôle admin. Et j'avais tout le temps l'erreur HTTP 403.

mardi 28 décembre 2010

Petit Bilan Annuel


Apres une longue période de silence, j’ai pris le temps d’écrire une petite article décrivant mon bilan annuel. Un bon exercice pour un peu formaliser les événements clés durant cette année.

L’année 2010 a été très dynamique. Les missions à Paris, Lannion, Kiev étaient très enrichissantes du point de vue professionnel et personnel.

A Paris j’ai pu participer au développement d’un gros projet informatique dans une équipe très motivée. J’ai pu voir le processus d’industrialisation à l’intérieur de l’usine de logiciel. C’est une expérience sublime.

Encore une fois, j’ai compris que le réussit du projet ne dépend pas du tout de la méthodologie mais surtout des individus qui y participent.

Une belle époque à Lannion… Les projets de télécoms pour FT. J’ai fait ma connaissance avec beaucoup de gens très sympathiques. La plage magnifique de Tréstraou à Perros-Guirec me manque beaucoup.

Kiev. Tout d’abord c’est un vrai plaisir de travailler dans ton pays natal. J’ai pu voir mes parents et mes amis 2-3 fois par mois. Pour ceux qui ont travaillé à l’étranger ça compte beaucoup. Les projets en mode off-shore. C’était compliqué.


2010 en images



Perros-Guirec, Tréstraou Paris, Parc André CitroenKiev, Pechersk, vue sur Mere-La Patrie


2010 c’était aussi une année sous le Mac. Je suis devenu un passionné des produits Apple. J’ai vendu mon âme au diable de Steve Jobs.

2010 c’est aussi une année des départs massifs de Teamlog. J’ai vu partir beaucoup de mes collègues chercher la chance ailleurs. Triste.

Parlons de technique. Cette année j’ai travaillé beaucoup avec les produits de Microsoft, surtout avec la plateforme .NET/C#. Les outils que je vous recommande fortement sont : Resharper - refactoring, dotTrace – mesurer les performances, Visual SVN for Visual Studio.

Et le futur… Continuer dans la technique. Apprendre python et italien.

Codez avec passion dans l’année 2011 !

samedi 1 mai 2010

Horaire de bus. Paris/IdF. Android

Bus Stop - une application qui peut vous bien faciliter la vie avec les bus en région Ile de France.
Cette application vous permet de connaitre en temps réel dans combien de temps passera votre bus préféré.



L’application est développée en Java pour le plateforme Android. L’auteur est un gars passionné par la technique et qui avait pas mal de souci avec des horaires de bus.

Pour l’installation je vous invite à consulter le site de l’application : http://spaceinvade.rs/