mardi 4 décembre 2007

(partie 2) Intégration de Maven dans un projet Java J2EE Hibernate/Spring/Eclipse RCP: pas une mince affaire mais une bonne affaire tout de même !

Intégration de Maven dans un projet Java J2EE Hibernate, Spring, Eclipse RCP: pas une mince affaire mais une bonne affaire tout de même ! (partie 2)

Voici la suite de l'article concernant l'utilisation de Maven avec WTP d'Eclipse.

Le but étant de trouver une solution pour utiliser à la fois Maven et ainsi bénéficier de l'avantage de la gestion de la configuration des dépendances tout en restant WTP "compliant" et ainsi être capable de debugger le serveur dans l'environnement Eclipse.

En fait c'est assez simple, vous prenez votre projet "assembly" maven, celui qui vous permet via maven de générer votre archive web, votre war par exemple et vous exécutez la commande suivante dans son répertoire :
mvn -Dwtpversion=1.0 eclipse:eclipse
Bien entendu vous remplacez "1.0" par R7, 1.5 ou 2.0 en fonction de votre version WTP.

Après ça, un répertoire .settings va être créé à la racine du projet avec un fichier ".component" dans notre cas (version 1.0). Dans ce fichier on va retrouver toutes les dépendances du projet que ce soit les librairies ou les projets dont il dépend. Toutes les dépendances apparaissent sous forme de jars situés dans le dépôt maven.

Problème: en mettant les projets dépendants via leur archive jar sous maven, il n'est pas possible de les modifier en debug sous eclipse. Il faut supprimer les références vers les projets dépendants dans le fichier ".component" pour ne laisser que les librairies utilisées. Ensuite il faut faire un clic droit sur le projet et sélectionner "properties" puis dans la fenêtre qui apparaît il faut cliquer sur "modules dependencies". La prochaine fenêtre permet de sélectionner les projets dépendants, il faut alors cocher tous les projets que vous avez supprimé du fichier .component à l'étape précédente et terminer en validant en cliquant sur OK.

Après quoi il faut vérifier que le fichier .component contient bien les nouvelles dépendances vers les projets fraîchement supprimés puis ajoutés, mais cette fois avec des dépendances de type module ! (et non jar)

Après quoi, il faut ajouter un serveur à WTP si ce n'est pas déjà fait puis ajouter le projet ainsi modifié au serveur WTP... puis le lancer, mettre des points d'arrêts et s'y rendre, modifier le code source "en live", sauvegarder la classe modifiée et prendre soin de builder via eclipse (Ctrl + B ou build auto) et là: contempler le debugger d'Eclipse continuer de debugger normalement.

En fait il n'y a rien de magique dans tout ça, c'est simplement un projet assembly Maven auquel on ajoute la fonctionnalité WTP permettant de debugger... Cette solution à un inconvénient MAJEUR !!! La maintenabilité !!! A chaque dépendance maven ajoutée qu'elle soit de type librairie ou projet... il faudra l'ajouter manuellement (via clic droit properties modules dependencies...)

Je compte me pencher sur ce point ASAP... des pistes ? utiliser WTP 2, tester le nouveau plugin eclipse pour maven, utiliser un script de synchronisation, réécrire WTP... etc...

dimanche 2 décembre 2007

Fight For Kisses (www.ffk-wilkinson.com)

Quand les calinoutchs viennent à manquer, tous les moyens sont bons !




Désolé mais en voyant ce trailer j'ai eu envie de le partager avec le plus grand nombre...

mercredi 28 novembre 2007

(partie 1) Intégration de Maven dans un projet Java J2EE Hibernate, Spring, Eclipse RCP: pas une mince affaire mais une bonne affaire tout de même !

Intégration de Maven dans un projet Java J2EE Hibernate, Spring, Eclipse RCP: pas une mince affaire mais une bonne affaire tout de même ! (partie 1)

Il existe des projets qui ne ressemblent pas aux "Hello World" que l'on trouve habituellement sur chaque site de framework digne de ce nom ! En effet, dans certains cas (qui a dit tous les cas ?) les projets sont complexes et leurs ramifications de dépendance font penser à une grande forêt de projet...

Dressons le tableau:
-un serveur web avec Spring, Hibernate, Birt et JMS (entre autre) découpé en couches suivant 2 axes. D'un côté un découpage fonction du type de manipulation des données traitées: DAOs, services métier et services applicatifs et de l'autre un découpage suivant les briques métiers ou les catégories de services (ex: brique "commune" ou "de base", brique achat, brique financière...).
-un client type Eclipse RCP avec des dépendances vers certains projets communs avec le serveur.

Maintenant ajoutons maven pour gérer les dépendances des différents projets serveurs et la c'est le drame ! En effet, les projets communs qui sont à la fois en dépendance maven et en dépendance plugin eclipse posent problème. En effet si un projet A à une dépendance via maven vers un projet B dans le pom.xml ainsi qu'une dépendance vers le plugin B via le MANIFEST.MF alors Eclipse mettra le projet en erreur avec une erreur du type : "Build path contains duplicate entry: 'pluginB' for pluginA"

Aucun problème pour la partie serveur via maven; les scripts maven type clean, package, install etc fonctionneront parfaitement... c'est dans Eclipse que ca se corse. Mais à quoi bon écrire un article s'il n'y a pas de solution ? Aucun et c'est bien pour ça que j'écris ces lignes !

Pour résoudre cette erreur, il faudra utiliser une fonctionnalité quelque peu cachée du plugin maven pour Eclipse:
-Un clic droit sur l'élément "Maven Dependencies" du projet qui a à la fois une dépendance maven et plugin pour laisser apparaitre le menu contextuel.
-Puis cliquez sur "Properties" ce qui permet d'afficher une fenêtre de configuration.
-Décochez la case à cocher "Resolve dependencies from workspace project".
-Validez cette fenêtre en cliquant sur "OK".


Image:


A noter: Eclipse 3.2, plugin maven pour eclipse en 0.0.11 (le 0.0.9 et le 0.0.12 posent problème actuellement dans notre environnement) et maven 2.

Maintenant on se trouve dans un environnement Eclipse qui compile et surtout qui permet de lancer le client en debug ainsi que le serveur via WTP tout en utilisant la gestion des dépendances maven. Enfin l'utilisation du Web Tool Platform d'Eclipse avec Maven mérite un second article car ce n'est pas une mince affaire de les méler tout en permettant au developpeur de debugger le serveur "à chaud" sans avoir à re-builder la totalité de l'application serveur via des scripts maven... en ayant pris soin d'avoir arrêté le serveur et en le démarrant après tout ça.


jeudi 25 octobre 2007

La gestion des sauts de page dans un tableau BIRT (pageBreakInside)

Juste un petit message pour noter un point "négatif" dans le framework BIRT, ou plutôt dans une certaine version de BIRT à savoir la 2.1.x !!! (version archaïque diront certains)

En effet, ceux qui se sont déjà confrontés aux problèmes de gestion des sauts de page dans BIRT savent qu'il y a de quoi s'arracher les cheveux !

Mettez nous en situation, vous avez 2 tableaux imbriqués, appelons les T1 et T2 et vous souhaitez que le tableau (T2) qui est contenu dans le tableau principal(T1) s'affiche si possible sur une nouvelle page dans le cas ou il ne peut s'afficher dans la page courante. Attention, vous ne voulez pas que T2 soit systématiquement sur une nouvelle page, mais bien uniquement lorsqu'il ne peut s'afficher sur la page courante. Plutôt simple à priori mais c'est sans compter sur le fait qu'on ne peut gérer les sauts de page que suivant le début et/ou la fin d'un tableau et non en spécifiant le comportement des sauts de page au sein du tableau.

Exemple des données à afficher :

----------------------------
- HEADER T1
----------------------------
- T2: INFO 1
- T2: nom 1
- T2: prénom 1
----------------------------
- T2: INFO 2
- T2: nom 2
- T2: prénom 2
----------------------------
- T2: INFO 3
- T2: nom 3
- T2: prénom 3
----------------------------

Ce que je ne veux pas voir s'afficher : (Ce que génère BIRT 2.1.x)

########## PAGE 1 ##########
----------------------------
- HEADER T1
----------------------------
- T2: INFO 1
- T2: nom 1
- T2: prénom 1
----------------------------
- T2: INFO 2
- T2: nom 2


########## PAGE 2 ##########

- T2: prénom 2
----------------------------
- T2: INFO 3
- T2: nom 3
- prénom 3
----------------------------

Et ce que je souhaite afficher : (Ce que génère BIRT 2.2.x bien configuré)

########## PAGE 1 ##########
----------------------------
- HEADER T1
----------------------------
- T2: INFO 1
- T2: nom 1
- T2: prénom 1
----------------------------

########## PAGE 2 ##########
----------------------------
- T2: INFO 2
- T2: nom 2
- T2: prénom 2
----------------------------
- T2: INFO 3
- T2: nom 3
- T2: prénom 3
----------------------------

Une propriété "pageBreakInside" est sensée résoudre tous nos problèmes, pour plus d'info:
https://bugs.eclipse.org/bugs/attachment.cgi?id=36165
et
http://www.eclipse.org/birt/phoenix/ref/rom/elements/Style.html#Property-pageBreakInside)

Elle va de paire avec les propriétés pageBreakBefore et pageBreakAfter qui elles fonctionnent parfaitement. Le pageBreakInside n'est pas disponibles dans le BIRT Designer 2.1.x et si on ajoute la propriété directement dans le xml elle n'est pas interprétée.

Après avoir étudié de nombreuses pistes diverses et variées... aucunes solution n'a été trouvé enfin si une seule la montée de version de BIRT de 2.1.x vers 2.2.x ! Et donc si vous êtes en Eclipse 3.2 vous serez forcez de passer en Eclipse 3.3 ! Et si vous étiez en Java 1.4, vous serez forcez de passer en Java 5 ! Aie dirons certains, tant mieux dirons d'autres et tant pis pour les derniers.

lundi 24 septembre 2007

Java Scripted Datasets avec BIRT: une solution souple et pratique !

BIRT est un projet open-source de la communauté Eclipse.org permettant de réaliser des états (reports) à partir d'un fichier de mise en forme (rptdesign xml), de données diverses (base de données) et d'un moteur de génération des éditions (BIRT engine) le tout dans un monde J2EE.

La plupart du temps, BIRT est présenté comme une solution orientée BI (Business Intelligence)... du décisionnel. Et pourtant, c'est aussi une solution très adaptée pour réaliser des documents pour des applications métiers qui necessitent la réalisation de documents à partir de grappes d'objet métier java et non à partir de bases de données directement.

Je m'explique... dans les exemples BIRT on voit toujours des data sources pour se connecter directement à une base de données or ce n'est pas forcément pratique quand doit réaliser un document qui correspond à un écran pour lequel il existe déjà un service métier permettant de récupérer les données à afficher dans le document.

Pour ce faire, il existe les scripted data sources et les scripted data sets. Ils permettent d'utiliser des objets java pour les afficher dans le document. Par défaut, le data set est codé en javascript au sein de l'éditeur BIRT dans Eclipse. Le code javascript est stocké dans le document BIRT (rptdesign ou rptlibrary). Cela peut poser plusieurs problèmes lors de la réalisation du document.

Premièrement, le javascript est simple certe mais l'éditeur BIRT actuel ne permet pas d'apporter beaucoup d'aide au developpeur (autocompletion, verificateur de syntaxe...).

Deuxièmement, il n'est pas possible de mettre des points d'arrêt pour débugger le document lors de la génération avec le moteur BIRT.

Troisièmement, le code du data set est stocket dans le document BIRT de description de l'édition avec tous les désagréments que cela comporte.

Mais heureusement il existe une ultime solution pour pallier à ces trois problèmes les java scripted data sets ! Ils permettent tout simplement de remplacer les javascripted data sets par une classe java.

La classe java doit implémenter ScriptedDataSetEventAdapter avec les méthodes :

public boolean fetch(IDataSetInstance set, IUpdatableDataSetRow row) { ... }
public void beforeOpen(IDataSetInstance dataSet, IReportContext reportContext) { ... }
public boolean describe(IDataSetInstance arg0, IScriptedDataSetMetaData arg1) { ... }

Exemple:

import org.eclipse.birt.report.engine.api.script.eventadapter.ScriptedDataSetEventAdapter;
import org.eclipse.birt.report.engine.api.script.instance.IDataSetInstance;
import org.eclipse.birt.report.engine.api.script.IUpdatableDataSetRow;
import org.eclipse.birt.report.engine.api.script.IScriptedDataSetMetaData;


public class MyScriptedDataSetEventAdapter extends ScriptedDataSetEventAdapter {

private static final String COLUMN_FOO = "Foo";
private static final String COLUMN_BAR = "Bar";

private int index = 0;
private int size;

private MyObject test;

public boolean fetch(IDataSetInstance set, IUpdatableDataSetRow row) {
if( index >= size){
return false;
}
try{
row.setColumnValue(COLUMN_FOO, test.getListToFetch().get(index).getFoo());
row.setColumnValue(COLUMN_BAR, test.getListToFetch().get(index).getBar());
}catch (Exception e){
//myLogger.log(e) you know wtf to do here ;-)
}
index += 1;
return true;
}

public void beforeOpen(IDataSetInstance dataSet, IReportContext reportContext) {
test = (MyObject) reportContext.getGlobalVariable("myObjectName");
size= test.getListToFetch().size();
}

public boolean describe(IDataSetInstance arg0, IScriptedDataSetMetaData arg1) {
arg1.addColumn(COLUMN_FOO, String.class);
arg1.addColumn(COLUMN_BAR, Double.class);
return true;
}

}

Pour débugger rien de plus simple, mettre un point d'arrêt et lancer l'application en debug...
Pour s'assurer de la syntaxe du code... Eclipse est la !
Pour aider a la récupération des données issues de la grappe métier passée en paramètre à BIRT... encore une fois Eclipse est la !

PS: Par contre pour les projets utilisants BIRT coté client RCP... il peut y avoir des problèmes de partage de classpath... apparement les dataset scipted java ne sont pas trouvé... donc pour le moment méthode a utiliser uniquement coté serveur... a moins que...

mardi 21 août 2007

Problème de suppression d'objets dans les collections avec Hibernate !

Hibernate est un framework de gestion de la persistance renommé et très connu qui permet bien des choses et avec lequel on peut s'arracher bien des cheveux !

Hibernate à la "facheuse" tendance à utiliser des types collection qui lui sont specifique pour gérer tout ce qui concerne les list, set... Les attributs de type list et set sont remplacés par des objets de type PersistentList et PersistentSet. Cela permet par exemple à hibernate de charger dynamiquement la collection lors de l'appelle à une méthode comme size() add() ou remove() dans le cas par exemple d'une collection mappée avec le lazy loading. Pour résumer, tant qu'on n'a pas besoin du contenu de la liste, elle est remplacé par un proxy qui est pret à al charger à la première demande.

Quand on utilise Hibernate dans le cadre d'une application ayant une architecture client-serveur, les classes d'hibernate ne sont accéssibles que coté serveur, coté base de données. Or dans une architecture client-serveur on fait transiter des objets métiers java de part et d'autre via le réseau (en HTTP par exemple avec Spring remoting) mais sous une condition : Que tous les objets envoyés soit accessibles dans les dépendances des 2 projets.

Or comme je l'ai expliqué juste avant, Hibernate remplace les listes par des objets qui lui sont propres et qui ne sont accéssibles qu'au projet serveur via la librairie hibernate (hibernate3.jar par exemple dans répertoire lib du serveur). Donc si on envoie au client une grappe métier contenant des listes après extraction de la base via hibernate, cela va poser problème et on va voir fleurir dans la console des erreurs du type "Exception : Ahhhhhh je ne connais pas la classe PersistentSet"

Il se peut qu'on ne soit pas impacté par ce problème car il est coutume d'utiliser des DTOs et des transformateurs pour faire transiter les objets sur le réseau et par conséquent les types spécifiques d'hibernate sont transformés automatiquement (par les transformateurs). Dans le cas ou nous n'avons pas de couche de DTOs, on peut utiliser des mappeurs qui remplacent les PersistentList et PersistentSet en ArrayList et HashpSet par exemple.

Bref, une fois les objets récupérés transformés (sans PersistentXXX) sur le client, on joue avec, ou les modifie et on peut être amené à supprimer des éléments d'une liste. Et c'est la que l'affaire se corse car il se peut, sans qu'on sache réellement pourquoi, que Hibernate ne puisse pas détecter la suppression d'un élément donné lors de la sauvegarde.

Effectivement, puisqu'on a remplacer les gestionnaire de liste à la sauce hibernate quand on renvoie la grappe coté serveur... il ne se rend pas compte qu'il y a eu suppression même avec les options type delete-orphan all-delete-orphan dans le mapping... La seule solution, l'ultime chance restante consiste à mapper la liste d'une manière bien différente.

Ce problème commun est connu sur le site hibernate.org :

------------------------------
I removed an object from a collection mapped with cascade="all" but the object was not deleted!

cascade="all" cascades the delete() operation from parent to child. If this is a one-to-many association, try using cascade="all,delete-orphan".

Another solution is to model your child objects as composite elements (a kind of value type) rather than entities. Value types are always persisted or removed along with their parent entity. So you would use a mapping for the element class instead of a mapping..
------------------------------

Voici le mapping de la liste contenu dans mon objet Truc :

<set name="maListe" table="element" lazy="true" >
<key column="elt_trc_id" not-null="true" />
<composite-element class="org.truc.Element">
<parent name="truc"/>

<property name="identifiant" type="java.lang.Integer">
<column name="elt_id" />
</property>

<property name="commentaire" type="java.lang.String">
<column name="elt_commentaire" length="254" />
</property>

<property name="date" type="timestamp">
<column name="elt_date" />
</property>

</composite-element>
</set>

au lieu de par exemple:

<list name="maListe" lazy="true" cascade="persist, save-update, evict, merge, all-delete-orphan">
<key column="elt_trc_id" not-null="true" />
<index column="elt_numero" />
<one-to-many class="Element" />
</list>

Bon les désavantages sont flagrants, on est obligé de mapper la liste dans le fichier de mapping de l'objet conteneur et dans le cas ou les objets de la liste sont utilisés dans plusieurs objets... on duplique on duplique... pas très pro comme on dit alors mieux vaut éviter.

Mais bon ca fonctionne et les objets sont biens mis à jours et surtout supprimés quand on sauvegarde l'objet conteneur...

dimanche 25 mars 2007

Birt Eclipse, ça promet !

J'étudie la mise en place de Birt sur un projet Client Riche basé sur Eclipse RCP et j'avoue être quelque peu bluffé par certaines fonctionnalités bien sympathiques de ce framework de reporting.

En effet, en plus de fournir le minimum vital qui sont pour moi un designer WYSIWYG et une solution d'intégration du moteur de génération de documents (+ graphiques etc...), BIRT apporte des fonctionnalités étonnantes !

Par exemple, la possibilité d'être intégré très simplement dans une application RCP avec le BIRT Viewer ! Cette solution élégante permet notamment d'ajouter un côté "événementiel" fort convivial et pratique aux rapports de l'application. Il est possible d'afficher un rapport (un "état" pour les puristes) et sa table des matières dans colonne à gauche de l'écran avec un système de liens (ancres) sur chacun des titres un peu à la manière d'adobe viewer pour les fichiers PDF.

De plus, l'utilisation du BIRT Viewer permet d'ajouter au sein de vos rapports des liens vers d'autres rapports. C'est aussi la possibilité de paginer vos rapports et ce même au format HTML. Et pour finir, il est possible d'ajouter de l'interactivité (AJAX-like) aux rapports soit via du code javascript soit du code Java directement... Tout ceci peut en laisser rêveur quand on sait que le tout est bien entendu gratuit !

Les bons points qui me font écrire se billet sont:
-La communauté Eclipse qui héberge le projet (Birt Designer = plugin Eclipse ^^)
-Actuate dans l'ombre de BIRT ($$$)
-Une aide complète avec moult tutoriaux et exemples !
-Les possibilités d'extension de toute part du projet (ODA, Output Emitters, Birt Item...) pour ceux qui sont pressés et qui ont absolument besoin de certaines fonctionnalités manquantes à ce jour !
-Le libre choix du processus de génération et d'affichage des rapports (génération coté serveur ou client, render coté serveur ou client, fichier rptdocument transportable entre le client et le serveur si besoin pour externaliser l'affichage...)
-Des sous-rapports facilement gérables , testables et intégrables

Bon il y a certes quelques inconvénients quand même:
-La stabilité du designer qui peu parfois laisser perplexe le concepteur de rapport que j'ai pu être. (plantages réguliers sur différentes versions)
-Le codage style javascript pour prendre en entrée des objets javas (beans POJOs)
-Le manque d'input/output par rapport à d'autres framework de reporting à l'heure actuelle...
-La jeunesse du projet par rapport à d'autres...
-La lenteur de génération ?!

Les listes des atouts/défauts ne sont pas exhaustives... juste le reflet de mon retour d'expérience.

Wazaabi & Eclipse RCP


Eclipse RCP, un environnement de développement "utopique" :

Un des besoins récurrents chez les clients de type grand compte est de refondre leurs applicatifs métier réalisés avec des technos archaïques. Les raisons qui poussent les clients à refaire ce type d'application sont l'arrivée de nouveaux besoins, la nécessité d'interfacer les applicatifs, permettre une meilleure maintenabilité, augmenter l'ergonomie et j'en passe. Pour ce faire, une des solutions permettant de répondre tous les besoins est d'utiliser le framework d'Eclipse RCP ! Ce n'est pas la seule solution mais elle mérite d'être mise en avant son potentiel est intéressant.

Eclipse RCP permet très facilement de générer des applications clientes qui sont capables de communiquer avec un serveur distant. Avec des interfaces graphiques basées sur des composants propres au système d'exploitation exécutant, Eclipse RCP possède un véritable tookit de widgets standardisé, comme son nom l'indique (SWT = Standart Widget Toolkit). Accompagné de JFace, une surcouche à SWT, Eclipse RCP se dote d'un cadre de développement simple pour les composants dits "complexes" (les listes par exemple) mais c'est aussi une foultitude de fonctionnalités complémentaires: boites de dialogues, assistants, raccourcis clavier, undo/redo, filtres/tris... SWT s'occupe donc de fournir une bibliothèque de composants performants alors que JFace permet de simplifier la création des interfaces et offre un cadre de développement ainsi que des facilitant puissants !

Eclipse RCP c'est aussi et surtout le workbench d'Eclipse: ses vues, ses éditeurs, sa gestion des perspectives et ses fenêtres de préférence... Un atout considérable pour créer une application complexe ! Un environnement de travail ou les aspects principaux de l'application sont régis par des règles répondant à des besoins basiques. Ce framework, c'est aussi la gestion des plugins dont hérite une application de type Eclipse RCP, ce qui permet d'étendre des plugins existants ou de laisser la possibilité à d'autres d'utiliser son application, son plugin pardon...

Bien sur en choisissant Eclipse RCP, on prend ce qu'il y a de meilleur, c'est a dire l'environnement de développement d'Eclipse, l'IDE Java le plus aboutit à mon sens dont les performances et la maniabilité n'est plus a démontrer ! C'est notamment un facilitant de création pour les plugins Eclipse (RCP ou non) ou encore un assistant pour dessiner ses interfaces graphiques avec Visual Editor ! Utiliser Eclipse RCP c'est aussi "s'assurer" une compatibilité avec la batteries de projets Eclipse tel que BIRT, GEF etc...

Parlons de Wazaabi, un facilitant pour Eclipse RCP :

Je n'ai pas parlé des inconvénients d'Eclipse RCP... oui, comme tout ce qui existe, il y existe des inconvénients propres à Eclipse RCP ! Et la conception des interfaces graphiques en fait partie... En effet, un des avantages des applications web sur les clients riches type Eclipse RCP, est de pouvoir concevoir les écrans via un langages balisé comme l'HTML. Wazaabi est la pour combler ce manque ! Il permet de créer des interfaces graphiques en utilisant le langages XUL très proche du XML. Les fichiers XUL comme les fichiers HTML sont interprétés par un moteur de rendus pour générer visuellement les écrans ! Ceci permet de séparer la conception des écrans et les services métiers de l'application comme pour les clients légers en somme.

Pour résumer Wazaabi est une surcouche à Eclipse RCP qui est une alternative à l'utilisation de Visual Editor pour concevoir ses écrans. Ce framework permet notamment de mettre facilement en place l'internalisation des écrans depuis peu, et bientôt les feuilles de style. De plus, d'ici quelques temps un éditeur graphique permettra bientôt de concevoir les interfaces graphiques XUL... ce qui est tout de même un manque pour un facilitant dans ce même domaine mais passons... Un projet plein d'avenir qui a déjà été utilisé chez Leroy Merlin ainsi que chez Kiabi sur divers projets sur lesquels j'ai eu la chance de pouvoir m'impliquer.

Etre ingénieur en SSII

Une vision du consulting en SSII, parmi tant d'autres...

Depuis maintenant 1 an, j'occupe le poste d'ingénieur d'études et développement pour le compte d'une SSII à taille humaine (+/- 20 pers.) sur la métropole lilloise. Je pense avoir assez d'expérience pour tenter de la partager même si je suis bien conscient de manquer d'ancienneté dans ce métier pour faire une véritable analyse.

Le monde des SSII est souvent décrit comme rempli de dents longues où règne un climat malsain et où le profit est le maître mot ! Et bien laissez moi vous avouer la vérité: c'est VRAI ! Mais il faut développer ce propos et le nuancer pour se faire une idée réelle de ce qu'est le travail en SSII classique. Si vous commencez à lire ces lignes, merci d'aller jusqu'au bout de ma pensée.

Un monde sans scrupule ? Mais pas sans reproches !

Oui dans le monde des SSII, les consultants en sont réduits à être des pions placés par des commerciaux/managers de manière stratégique pour allier satisfaction client, bénéfice pour l'entreprise et épanouissement du collaborateur (notez bien l'ordre choisi). Ce n'est donc pas faux tout ce que l'on dit... mais réfléchissons 2min: Dans un monde ou le capitalisme atteint des sommets et ou la star'Ac et les médias font la loi, il faut arrêter de s'étonner quand, dans le tableau que je vous ai dressé plus haut, on rencontre des déçus et des anecdotes de fin malheureuse entre un consultant et une SSII quelconque... Bref, si vous vous engagez dans une SSII pour vous tourner les pouces, rebroussez chemins, on vous forcera à apprendre, on vous poussera au delà de vos capacités, on demandera d'être le meilleur, d'encaisser les "coups", d'être un caméléon, un espion et même parfois un menteur... Stoppons la langue de bois, en travaillant dans une société de service, on ne peux que vous demander d'être rentable !

Des collaborateurs délaissés... C'est faux !!!

Non, les consultants ne sont pas les laissés pour compte de la négociation SSII/Client. En effet, qui peut se plaindre d'avoir un supérieur nous demandant de nous surpasser, d'apprendre un peu plus chaque jour, d'avoir de multiples casquettes (technique, commerciale) et j'en passe... C'est en effet bien plus valorisant, même si c'est beaucoup plus fatiguant, d'avoir un poste de ce type que d'être un pion inutile dans un bureau reculé au fond d'un sombre couloir... Votre entreprise à besoin de vous et vous propose d'évoluer rapidement dans le sens qui vous va le mieux... Il suffit de faire savoir quels sont vos perspectives d'évolutions pour avoir un poste en corrélation avec votre demande... ce n'est pas immédiat mais si vous êtes à la hauteur, un manager préférera un collaborateur épanoui qui avance qu'un frustré qui trépigne... sur place.

Le revers de la médaille !

Parfois, souvent, rarement... tout est relatif. Toujours est il qu'il arrive que des consultants soient malheureux et se sentent rabaissés dans le petit monde du consulting. C'est sure que l'on entend régulièrement les consultants se plaindre de souffrir de leur condition de pseudo'intérimaire, condition qu'on leur rappelle trop souvent en clientèle où nous sommes souvent en décalage par rapport aux titulaires que l'on côtoie (avantages, statut, accès...) Mais est-ce que les titulaires peuvent se réjouir de participer 6 projets innovant et valorisants au sein de 3 grandes marques internationales sur une période de seulement 8 mois... j'en doute.

Comme dans tout il y a du pour et du contre dans le travail en SSII... le principal étant de piocher ce qui vous intéresse et d'encaisser sans rechigner sur ce qui vous rebute !

Formation : Ingénieur en Génie Informatique : IG2I, EC Lille

Formation : Ingénieur en Génie Informatique (IG2I, EC Lille)

2001-2006

Elève ingénieur à l’Institut de Génie Informatique et Industriel (IG2I) de Lens, Département de l’Ecole Centrale de Lille.
Informations : http://www.ig2i.fr et http://www.ec-lille.fr

2000-2001

Obtention du baccalauréat Scientifique option Sciences et Vie de la Terre (SVT) spécialité Mathématiques au Lycée Louis Armand à Eaubonne (95 – Val d’Oise).

Téléchargez mon CV au format PDF ou WORD.

Ingénieur d’études à Empeiria (SSII) (59 – Hellemmes): Depuis Juillet 2006

Ingénieur d’études – Empeiria - SSII (59 – Hellemmes): Conception et développement d’application. (J2EE, Eclipse RCP, Hibernate, Ibatis, Spring, BIRT)

Leroy Merlin/ADEO – DSI : (Distribution) [Forfait]
Mission de conception et développement d’application type client riche en J2EE avec Eclipse RCP/JBoss/Hibernate/Spring. Développement des couches de services et d’accès aux données, création des IHMs et réalisation des batchs.
-Livraison au domicile du client : application de gestion des livraisons clients.

KIABI - DSI: (Distribution) [Forfait/Régie]
Mission de conception et développement d’applications type client riche en J2EE avec le framework Wazaabi basé sur Eclipse RCP/Tomcat/Ibatis/Spring/BIRT. Mission de conseil, interventions en clientèle et participation à la conception. Prise en charge des IHMs et développement de services métier. Maquettage des écrans, estimation et suivi des charges.
-Point de mesures : Application de gestion des informations de conception des vêtements.
-Plan de collection visuel : application de gestion des présentations des collections de vêtement.

Leroy Merlin/ADEO – DSI : (Distribution) [Forfait]
Mission d’étude et développement du module de reporting à intégrer à une application Eclipse RCP/JBoss/Hibernate/Spring. Etude du framework de reporting BIRT et comparatif avec JasperReport. Conception des états avec BIRT.
-SIBUD : application de suivi budgétaire de la DSI.

KIABI - DSI: (Distribution) [Régie/Forfait]
Mission de conception et développement d’application type client riche en J2EE avec le framework Wazaabi basé sur Eclipse RCP et Tomcat/Ibatis/Spring/BIRT. Prise en charge des IHMs et développement de services métier. Maquettage des écrans, estimation et suivi des charges. Réalisation des états avec BIRT.
-Fiche de recherche : application de gestion des coloris, des accessoires et des fiches produits.

Leroy Merlin/ADEO – DSI : (Distribution) [Régie]
Mission d’urbanisation du SI : Refactoring d’une application pilote, mise en place de l’intégration continue. Optimisation des processus de réalisation des applicatifs avec Maven, SVN, UML, Spring, Hibernate, BIRT, Eclipse RCP.
-Commande client : application de gestion des ventes.

Stage ingénieur d’études à Empeiria (SSII) (59 – Hellemmes): Janvier-Juin 2006

Stage ingénieur d’études à Empeiria (SSII) (59 – Hellemmes):
Conception et Développement d’application Client Riche et Web dans les NTIC – (JAVA J2EE, Wazaabi, RCP, eXo Platform, SSO CAS, Postgres, JSR 168 et 170, CVS, SVN…)

Bricolage - Outillage - Service Marketing : (Grand Compte) [Forfait]
Mission de conception et de développement d’application type Client Riche en Java J2EE avec une interface graphique en SWING. En utilisant les frameworks et plateformes comme la chaîne ABS (www.sharengo.org) ou le CMS open source MarcoPolo. Participation aux phases de test, intégration et recette des applicatifs dans les différents environnements (test, recette, pré-prod…)

Cosmétique – Instituts de beauté - Siège Social : (Grand Compte) [Forfait]
Mission d’études et veille technologique sur le projet de refonte du portail extranet/intranet. Etudes du projet eXo Platform v2.0 = Portail + Portlets + JCR + ECM + ESB + BI + ETL + Groupware (www.exoplatform.org). Intégration de la solution avec les serveurs d’applications (JBoss Jonas Tomcat) sur bases de données MySQL, Mise en place du Serveur Proxy Single Sign On (SSO) avec le projet CAS sur bases de données MySQL ou sur LDAP, CASification d’application JAVA (JSP, Sources Java, Taglib) et PHP5.

Bricolage - Outillage – DSI : (Grand Compte) [Forfait]
Mission de conception et développement d’application type Client Riche en Java J2EE avec le framework Wazaabi basé sur RCP (www.wazaabi.org). Création des services d’impression avec Jasper Report et iReport. Conception et développement des écrans d’administration. Application de type gestion des stocks.

Cosmétique – Instituts de beauté - Siège Social : (Grand Compte) [Forfait]
Mission de conception et développement d’application de type Client Léger en JAVA J2EE. Refonte applicative, ajout de fonctionnalité, administration de l’application, configuration automatique…

Stage assistant ingénieur à Adistar (59 – Roubaix): Septembre 2004 - Juillet 2005

Stage assistant ingénieur à Adistar (59 – Roubaix):
Gestion de projets, conception, relation clientèle et commerciale, benchmarking, hotline, formation, administration système et développement d’application Web – (VB .NET, Asp, Php, MySQL, SQL Server, Visual SourceSafe, ChartDirector)

Tracking-Solution :
Conception et Développement d’une application de calcul de ROI pour les médias Internet en PHP4 avec base de données MySQL. Participation aux phases de développement et de conception selon la méthodologie « Extreme Programming ». Application mise en stand-by avant son arrivée à terme pour des raisons d’efficacité.

Ad-Referer :
Conception et Développement d’une application préexistante d’utilisation interne pour le calcul du ROI des clients du groupe Adistar en ASP 3.0 avec des bases de données SQL Server. Etudes des problèmes de lenteur de l’application, Optimisation et « réparation » des traitements, Ajout de fonctionnalités diverses, Modification complète de l’architecture interne de l’application.

Etude de marché : La mesure d’audience sur Internet.
Etude et Benchmarking sur le thème des applications WEB de calcul du ROI des médias. Sujet de l’étude : Adistar peut-il encore se positionner sur ce type de produit ? Réalisation d’un dossier d’études, Compte rendu hebdomadaire avec les responsables décisionnels, techniques et commerciaux. Réalisation d’un bilan qui décida de la poursuite de l’étude en imposant le périmètre du projet.

ROI Solution :
Gestion de projet, Analyse, Conception, Développement, Intégration, Relation clientèle, Hotline et Formation utilisateurs/commerciaux sur l’application www.roisolution.com qui sera l’accomplissement pour le groupe ADSITAR de plusieurs mois d’études. Cette application réalisée en VB .NET avec des bases de données SQL Server utilise une architecture complexe multi-serveurs (multi-OS) qui lui confère la possibilité de gérer des sites Web à très hautes fréquentations (> 1 million de pages vues/mois). L’utilisation de Visual SourceSafe a permit un travail collaboratif. Réalisation de la partie d’administration, gestion des services d’affichage des divers graphiques avec ChartDirector. Formation des commerciaux pour la vente du produit. Formation des utilisateurs internes. Prise en charge de la hotline directe. Réalisation des plaquettes commerciales avec les responsables commerciaux et de la communication.

Stage Technicien à Motorola (Basingstoke – Angleterre): Janvier-Mars 2004

Stage Technicien à Motorola (Basingstoke – Angleterre):
Gestion de Projet, réalisation de progiciels et création de sites Internet – (Java, Php, MySQL, Debian)

SMS Server :
Conception et développement d’une application clients/serveur d’envois massifs de SMS administrable à distance par SMS/Mail ou par le réseau. Réalisée en JAVA avec une base de données MySQL sur un environnement Linux Debian. Reprise et analyse de l’existant. Prise de connaissance des spécifications du langage de communication avec les portables (Commandes AT). Réalisation de l’administration par mail et ajout de fonctionnalités d’administration à distance. Intégration et test des applicatifs en production.

Gestion des demandes d’accès :
Réalisation d’une application de gestion des demandes d’accès aux applicatifs gérés par le service en PHP avec base de données MySQL. Afin de centraliser les moyens de communication permettant de réaliser une demande d’accès à l’un des applicatifs du service (Serveur de SMS, CMS des OS des téléphones…). Réponse par email et notification automatique des états d’affectation des tâches à réaliser.

Stage Technicien à P.S.A Logistique (95 – Cergy-Pontoise) : Avril-Juin 2003

Stage Technicien à P.S.A Logistique (95 – Cergy-Pontoise) :
Conception et Développement de logiciels, approche managériale, formation et gestion de conflit et de changement – (Visual Basic, VBA, Access)

Manaflux :
Conception d’une application de gestion des flux de courriers au sein des services logistique pour les commandes « spéciales » et « urgentes ». Réalisée en Visual Basic 6 elle permet au service de suivre un courrier de sa réception jusqu’à la réponse au client en passant par l’affectation des différentes tâches. Récolte des besoins auprès des responsables et des utilisateurs. Réalisation du cahier des charges et prise en charge de la gestion de projet. Développement de l’application en réseau et déploiement sur le parc utilisateur. Formation des différents services.

Mise en place de SAP PSA Logistique :
Etude du logiciel SAP PSA en phase de développement au moment du stage. Etude de faisabilité des tâches effectuées via l’ancien logiciel de PSA à travers le nouveau logiciel SAP. Réalisation des Story Board et formation utilisateur. Travail en collaboration avec les développeurs SAP pour l’ajout de fonctionnalités primordiales « oubliées » lors de la conception du module logistique de SAP PSA.

Gestion de changement et de conflit :
Participation à de nombreuses réunions de gestion de changement et de conflit dans le contexte de réorganisation des services pour des raisons de productivité et de mauvais retours des clients (concessionnaires PSA). Développement de la capacité d’écoute d’autrui dans le cadre de la mise en place de la réorganisation complète des services logistiques.

Stage "découverte" de l’entreprise au journal Le Parisien (93 – St-Ouen) : Juin 2002

Stage de découverte de l’entreprise au journal Le Parisien (93 – St-Ouen) à la Direction des Services Informatique :
Conception et Développement d’applications – (Visual Basic, VBA, Access)

Calcul de statistiques :
Conception et développement d’une application d’automatisation de calcul des statistiques de mesure d’audience des sites Internet lequipe.fr et leparisien.com. Réalisation automatique de graphiques de synthèse et des tableaux d’évolution des statistiques sou Excel.

Maintenance informatique :
Participation active aux activités du service de la DSI du groupe Le Parisien. Installation de poste client, dépannages divers, maintenance applicative. Etude des activités des ingénieurs en poste et participation à diverses réunions décisionnelles entre les responsables de la DSI.

Compétences professionnelles - Enseignement

Compétences professionnelles - Enseignement

Gestion de projets informatique et industriel :

  • 2005 Germinotes : Etude de la mise en place d’une solution de report de note en ligne pour le collège lycée de Raismes (59). Rédaction de cahier des charges, cahier de conception préliminaire et détaillée, réalisation du dossier qualité, suivi des risques et application globale des cours de gestion de projet et de gestion d’équipe enseignées sur les cinq années. Chef de projet et responsable conception.
  • 2005 JPetStore : Refonte d’une application existante d’e-marketing permettant la vente en ligne d’animaux. Etude et modification de l’architecture de l’application pour remplacer le framework de persistance Ibatis par Hibernate. Utilisation de spring MVC. Refonte des couches métiers de l’application.
  • 2004 GD2I : Conception et développement d’une application de gestion des demandes d’intervention pour une entreprise fictive. Réalisation du plan d’assurance qualité ainsi que des dossiers de conception. Développement de l’application en Visual Basic avec une base de données Access.
  • 2003 ETO : Conception d’un site de gestion des outils développés chez ETO. Réalisation des dossiers de conception, recueil des besoins du client, développement de l’application en ASP avec une base de données Access. Intégration de la solution chez le client.

Langages Informatique :
  • Java J2EE (Jsp, Servlet, EJB…)
  • VB .NET
  • Php 4 et 5, Asp, WS, Javascript, Html, Rmi
  • C, C++, Ada, Visual Basic
  • UML, Perl, Xml, script shell
  • SQL, PL/Sql
  • Frameworks JAVA : Struts, Hibernate, JSF, Spring, Ibatis, Wazaabi, Eclipse RCP, Jasper Report, BIRT, JMS
  • Base de données : MySQL, Oracle, SQL Server, Postgres, Access, HSQLDB
  • Outils de développement : CVS, SVN, Eclipse, NetBeans, Sun Studio, Maven, Ant, Squirrel, Visual Studio, SourceSafe, Maven
  • Serveurs Web/Applicatif : Apache, Tomcat, JBoss, Jonas
  • Génie Industriel : Electricité, Electronique, Automatique, Automatisme, CAO-DAO, Grafcet
  • Bureautique : Excel, Word, PowerPoint, Project, Access, Photoshop
  • Systèmes d’exploitation : Windows (XP, 2000, NT) et Linux (RH, Debian…)

Communication :
  • Management d’entreprise et commerce (vente)
  • Encadrement d’équipe (simulations, projets)
  • Gestion de conflit et de changement
  • Marketing, étude de marché, psychologie du travail
  • Gestion, économie
  • Qualité et droit d’entreprise
  • Stratégie entrepreneuriale et de gestion d’entreprise

Langues :
  • Anglais : bonne maîtrise (Score TOEIC (2004) : 880)
  • Allemand : niveau moyen

Centres d’intérêts

Centres d’intérêts

Sport
  • Badminton/Squash
  • Tennis – 6 ans
Loisirs
  • Cinéma
  • Voyages

samedi 27 janvier 2007

Ouverture du blog

Après de nombreuses réflexions avortées sur la rédaction d'un blog perso mettant en avant les technos manipulés dans mon activité professionnelle, je me lance enfin ! Et oui, je me rend compte que ça va très vite et que c'est aussi l'occasion de se rappeler de tout ce que je fais de "bio" puisque je compte tout noter ici ! (résolution 2007?)