counter

Visitor Map

dimanche 26 septembre 2010

Un outil dont vous aurez besoin

Imaginez-vous un hypothétique ensemble d'applications qui a 10 ans de vie.

Imaginez-vous qu'un jour on décide de découper la maintenance de l'ensemble des applications pour que ce soit réalisé en parallèle par 3 équipes qui ne partageront ni leur dépôt de source ni leur openspace.

Imaginez-vous un découpage de travail vertical : Plutôt que par application à maintenir, chaque équipe s'occupera d'une couche particulière de chaque application. Ainsi l'équipe 1 réalise tous les développements de la couche présentation, l'équipe 2 de la partie métier et l'équipe 3 la partie base de données ou autres ...

Lorsqu'on est confrontés un tel défi organisationnel, une nouvelle stratégie de développement doit impérativement être mise en place. En ce moment je sais ce que vous pensez : C'est impossible ! Mais c'est une catastrophe ! Découper 10 ans des applications en trois comme ça, comment y arriver ! Comment pouvons-nous développer correctement !

La solution à cette problématique existe déjà. Il s'agit d'un outil qui dépasse les limites de l'extraordinaire :

L'outil Bouchon

Développé par une équipe d'experts reconnus dans le bouchonnage, mock et testing xml, cet outil permet d'encadrer vos développements le plus difficiles sans avoir besoin par exemple d'une couche métier. Cet outil, un exemple incontournable de la veille technologique, vous permet de non seulement travailler en agilité et réactivité dans les entourages les plus compliqués, mais également d'obtenir le plaisir de développer avec une API riche, jolie, bien documentée... en bref, l'outil de rêves pour tout développeur.

Quelques témoignages :

"J'étais très triste et sceptique avec le découpage de travail imposé par ma MOA. Je ne pouvais pas imaginer comment gérer l'architecture et réaliser les évolutions dans le timing. Grâce à l'outil bouchon j'ai non seulement récupéré le plaisir et la confiance en moi, mais aussi la joie de travailler de manière pragmatique !"
Georges Pomme, Architecte

"Je n'arrivais plus à mocker avec efficacité, mon code étant illisible, et je n'étais plus motivé pour coder. L'outil bouchon a sauvé ma vie. Merci l'outil Bouchon." 
Freddy Bretelle, Développeur Senior


J'ai utilisé cet outil et j'ai regardé le code : Je peux vous garantir l'efficacité, zéro anomalies, évolutive ... J'ai jamais vu un code aussi propre, digne d'au moins un chapitre dans "Effective Java" de Joshua Bloch.

Depuis mon blog, ou JDuchess, lorsqu'on aura la soirée "Bouchon" au Paris JUG, je vous ferai un article complet de cette merveille.

L'outil Bouchon n'est pas du software libre ! L'entreprise qui l'a développé va bientôt le mettre sur le marché pour sans aucun doute devenir encore plus riches.


Stay Tunned Bouchonneurs !!


Note: Cet article est dédié à tout l'équipe EXANPE (tou(te)s compri(e)s) que je laisse aujourd'hui; désormais on continuera à travailler ensemble mais différemment ;).

Vous allez aussi me manquer !! 
Bisous à tou(te)s !!!!!

mercredi 22 septembre 2010

Paris JUG Septembre - NoSQL

Il y a une semaine, j'ai participé à la conférence de Paris JUG sur NoSQL.

Voici les liens à mes articles chez JDuchess avec le retours de la soirée :

Introduction NoSQL - Olivier Mallassi et Michaël Figuière

Introduction NoSQL

Retour d'expérience de Steven Noels :

CMS on top of NoSQL

Merci pour cette soirée !!!

Merci Claude Falguière pour tes relectures, conseils sur le contenu et sur la mise en forme.

jeudi 15 juillet 2010

SpreadTheSource parle de Tapestwitter !

Tapestwitter powered byTapestry 5.1, développé par Laurent Guérin et moi (Katia Aresti), à l'aide de la couche Unitils de Loïc Doin ... et maintenant connu et même recommandé par les créateurs de Wooki !!!


Merci Robin Komiwes et Christophe Cordenier pour cet article!

mardi 13 juillet 2010

Adam Bien - Lightweight Killer Applications

Il y a une semaine, j'ai participé à la conférence de Paris JUG avec Adam Bien et les LigthWeight Killer Applications avec JEE6. Adam Bien a été simplement superbe !

Voici les liens à mes articles chez JDuchess avec le retours de la soirée :

Les architectures opposées "Piloté par le domaine" et "piloté par le service".

Architecture JEE 6 Théorie : Les deux approches

La présentation pratique JEE 6 et les EJBs 3.x :

EJB 3.x et Adam Bien in action
Merci Adam pour tout !!!

Merci Etienne Seiter et Claude Falguière pour vos relectures, conseils sur le contenu et sur la mise en forme.

mardi 6 juillet 2010

Création du groupe de travail SCJP

Je viens de publier mon deuxième post sur le blog JDuchess. Celui-ci annonce la création d'un groupe de travail pour obtenir le SCJP (non, ce n'est pas un nouvel "user group")

SCJP ??

Si vous êtes programmeurs (euses) Java vous êtes forcement intéressé(e)s !
Plus d'information ...


Merci Laurent Guérin et Ellène Dijoux pour vos relectures, corrections et conseils sur la mise en forme.

mercredi 30 juin 2010

Article pre Paris JUG - Soirée Adam Bien

Je viens de publier mon premier article dans le blog JDuchess.
J'ai fait un pré compte rendu qui introduit le speaker Adam Bien ainsi que les sujets qui seront présentés en détail lors de la conférence du dernier JUG avant la rentrée.
Adam nous promet d'illustrer sa présentation par des exemples pratiques.

Voici le lien :


Merci Claude Falguière, Laurent Guérin et Julien Maupoux pour vos relectures, corrections et conseils sur la mise en forme.

mardi 15 juin 2010

Tapestry 5.1 et Spring Security

Voici comment marche la configuration de Spring Security avec Tapestry 5.1.

Cas d'utilisation :
- L'autorisation par formulaire (par la validation utilisateur / mot de passe)
- Mode connecté / anonyme
- Accès interdit sur les pages d'administration

Il nous faut avoir quatre pages Tapestry :
  • page d'accueil aux utilisateurs non connectés - Index.tml + Index.java
  • page d'accueil aux utilisateurs connectés - Home.tml + Home.java
  • page de connexion au site - Login.tml + Login.java
  • page pour les administrateurs - Admin.tml + Admin.java

Configuration "web.xml"


Pour habiliter Spring et Spring Security, il faut d'abord configurer le fichier web.xml pour y placer les filtres. Tapestry, contrairement à Struts, est une framework configuré par un filtre; il faut faire attention donc à l'ordre sur le fichier ; le filtre de spring security doit se trouver en premier lieu.

<context-param>
<param-name>tapestry.app-package</param-name>
<param-value>com.tapestwitter</param-value>
</context-param>

<context-param>
<param-name>tapestry.use-external-spring-context</param-name>
<param-value>true</param-value>
</context-param>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>

<filter>
<filter-name>tapesTwitter</filter-name>
<filter-class>
org.apache.tapestry5.spring.TapestrySpringFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>tapesTwitter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


Configuration du fichier "applicationContextSecurity.xml "


La version 3 de Spring permet de décharger la configuration XML en utilisant le "security namespace".

Contenu du fichier de configuration de spring security
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/index*" access="permitAll" />
<intercept-url pattern="/login*" access="permitAll" />
<intercept-url pattern="/login/error*" access="permitAll" />
<intercept-url pattern="/assets/**" access="permitAll"/>
<intercept-url pattern="/home**"
access="isAuthenticated() or isRememberMe()" />
<intercept-url pattern="/**" access="permitAll"/>
<form-login login-page="${loginFormUrl}"
authentication-failure-url="${authenticationFailureUrl}"
default-target-url="${defaultTargetUrl}"
always-use-default-target="false"/>
<anonymous />
<remember-me key="tapestwitter"/>
<logout />
</http>

<authentication-manager alias="authenticationManager">
<authentication-provider ref="tapestwitterAuthenticationProvider"/>
</authentication-manager>

contenu du fichier de beans de spring
<bean id="tapestwitterPasswordEncoder"
class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" />

<bean id="tapestwitterSaltSource"
class="org.springframework.security.authentication.dao.SystemWideSaltSource">
<property name="systemWideSalt" value="tapestwitttertwit" />
</bean>

<bean id="tapestwitterSecurityContext"
class="com.tapestwitter.domain.security.impl.TapestwitterSecurityContextImpl"/>

<bean id="userManager" class="com.tapestwitter.domain.business.impl.UserManagerImpl">
<property name="securityContext" ref="tapestwitterSecurityContext" />
<property name="saltSource" ref="tapestwitterSaltSource"/>
<property name="passwordEncoder" ref="tapestwitterPasswordEncoder"/>
</bean>

<bean id="tapestwitterUserDetailService"
class="com.tapestwitter.domain.security.impl.UserDetailsServiceImpl">
<constructor-arg ref="userManager" />
</bean>

<bean id="tapestwitterAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="tapestwitterUserDetailService"/>
<property name="saltSource" ref="tapestwitterSaltSource"/>
<property name="passwordEncoder" ref="tapestwitterPasswordEncoder"/>
</bean>

Security.properties
loginSecurityFilterUrl=/j_spring_security_check
logoutSecurityFilterUrl=/j_spring_security_logout
loginFormUrl=/login
logoutTargetUrl=/index
defaultTargetUrl=/homepage
authenticationFailureUrl=/login/error


Charger les propriétés de Spring Security sur Tapestry
Dans le module tapestry de l'application, dans le code source d'exemple fourni par la classe TapesTwitterModule.java, on peut contribuer aux symbols de l'IoC pour permettre d'injecter les valeurs du fichier security.properties à l'aide de l'annotation @Symbol.

public static void contributeSymbolSource(OrderedConfiguration<SymbolProvider> providers)
{
providers.add("springSecurity",
new ClasspathResourceSymbolProvider("config/security.properties"));
}
Page Login

Contenu Login.java

public class Login
{
@Inject
@Symbol("loginSecurityFilterUrl")
private String loginUrl;

@Inject
private TapestwitterSecurityContext securityContext;

private boolean error;

@OnEvent(value = EventConstants.ACTIVATE)
public Object checkSecurityCtx()
{
if (securityContext.isLoggedIn())
{
return HomePage.class;
}
return null;
}

@OnEvent(value = EventConstants.ACTIVATE)
public void checkError(String extra)
{
if (extra.equals("error"))
{
error = true;
}
}

public String getLoginUrl()
{
return loginUrl;
}

public boolean isError()
{
return error;
}

}

Contenu Login.tml

<form action="${loginUrl}" method="post">
<t:if test="error">
<p>
${message:login.error}
</p>
</t:if>

<fieldset>
<label for="j_username">${message:label-username}</label>
<input class="username" id="j_username" name="j_username" type="text" maxlength="30" value=""/><

<label for="j_password">${message:label-password}</label>
<input class="password" id="j_password" name="j_password" type="password" maxlength="30" value="" />

<input type="checkbox" name="j_spring_security_remember_me" id="remember_me"/>
<label class="inline" for="remember_me">${message:text-rememberme}</label></td>


<input id="login_submit" class="btn" type="submit" value="${message:button-login}" name="commit"/></td>

</fieldset>

</form>

Comment cela fonctionne ?


Lorsque l'utilisateur clique sur le bouton du login, Tapestry appellera l'URL "j_spring_security_check".

Spring prend la main sur l'application.
Spring security appelle le "Spring Security Filter Chain" - la chaine de filtres de connexion.
Grâce aux beans que l'on a développés (l'interface UserDetails, UserManagerImpl, UserDetailsServiceImpl etc.), Spring est capable de connecter l'utilisateur.

Si la connexion se déroule correctement, Spring Security redirigera vers l'url "/login" qui activera la page "Login". Ensuite Tapestry reprend la main!
L'événement "ACTIVATE" est lancé par Tapestry et capturé par la méthode "checkSecurityCtx".
Celle-ci vérifie la bonne connexion avec le bean "securityContext" pour ensuite rediriger vers la page "Home".

Si la connexion échoue, Spring Security redirigera vers l'url "/login/error" qui activera aussi la page de Login du Tapestry ! Mais un peu différemment : elle est activée avec "un paramétre" dans le contexte : "error". Dans l'URL, Tapestry détectera que la partie "login" est la page et "error" est la valeur d'un paramètre du contexte d'activation de la page.
Ainsi, la méthode qui est exécutée est "checkError(String extra)", extra = "error", pour ensuite rediriger vers la page de Login (return null affiche la page courante, la page de login) et afficher le message d'erreur attendu.

Pour plus d'information sur la partie Spring Security

Télécharger le code source depuis : tapestwitter 2.0

mardi 18 mai 2010

Maven 3

Maven 3 est encore dans sa version bêta, mais il promet ! Au Paris JUG, Arnaud Heritier et Nicolas De Loof nous l'ont présenté. Voici mes retours !

Migrons à Maven 3 !

Est-il facile à migrer ?
Il suffit de changer votre version de maven ! Et voilà, c'est fini !

Est-il compatible avec les versions précédentes ?
Oui, la compatibilité est assurée à un 99,99%
Les exceptions qu'on peut trouver sont par rapport aux descripteurs de projet qui sont encore beaucoup plus stricts que dans ses versions précédentes, ainsi que le Maven Site ou la commande eclipse:eclipse qui sont en phase de correction.

Les développements de cette version ont été focalisés pour assurer la compatibilité descendante, affirmation avalisée par les efforts en développement des tests unitaires.

Cette nouvelle version est en effet une refonte complète. Elle se caractérise par les retours d'expérience et l'apprentissage que ses concepteurs et développeurs ont obtenu à partir des versions 1 et 2.
La version 1 de Maven était inmaintenable ; la version 2 était plus maintenable et incluait le support de plugins. L'architecture était améliorée, mais encore pas très extensible et elle manquait de souplesse rendant très compliqué (parfois quasiment impossible) d'entrer dans le code.

Nouveautés :

> Java 5
Et tous les avantages qui vont avec, les generics par exemple. Le code source est plus propre, et la documentation a été nettement améliorée, essentiellement pour bien distinguer les API publics des internes. Grâce à tout cela, le développement des nouveax plugins et fonctionnalités est rendu plus accessible.

> Plugins interactifs
Les plugins restent toujours indépendants, mais ils sont capables de s'adapter au contexte d'exécution, ce qui est traduit par la disparition du plugin Aggregator et la naissance de "Build Plan". On pourra, par exemple, lister les tests à exécuter à l'avance. Cela évitera de les passer plusieurs fois, contrairement à aujourd'hui où les plugins ne savent pas quels sont les tests qui ont été déjà joués.

En conséquence, le plugin Aggregator ne devra plus jamais être utilisé.


> Rencontre OSGi
L'outil Tycho est une sorte de portage de Maven 2 pour les applications basées sur OSGi. Eclipse est basé sur un modèle OSGi. Maven 3 inclut Tycho, ce qui permet leur meilleure intégration. Le plugin M2Eclipse s'appuie sur Tycho.

> L'intégration avec eclipse
Maven 2 permettait seulement de réaliser des builds complets. Maven 3 permettra de laisser à eclipse l'ensemble des étapes qu'il sait faire, la compilation par exemple, et de réaliser en maven ce qui reste. Le plugin d'eclipse retirera les tâches du "build plan" évitant ainsi tout conflit.

> Pom Polyglotte
Maven 3 permettra d'écrire le fichier pom.xml en Groovy ou Python par exemple, en plus de XML.

Prochainement :
  • L'équipe maven vise à remplacer le conteneur Plexus par Google Guice ou Spring. Rien n'a encore été décidé.
  • Éliminer la maintenance du nom de version sur le POM
  • Mixins : Permettront de faire un héritage multiple mais pas forcement hiérarchique
  • Évolution de la syntaxe : permettra, par exemple, de définir des exclusions globales et pas seulement au niveau de chaque dépendance
  • Parallélisation des builds : permettra aux grosses applications multimodule de paralléliser les builds de ses modules indépendants en gagnant du temps de manière significative.
  • Maven Shell
Pourquoi continuer avec Maven, notanment Maven 3 ?
Ce n'est pas pour les nouvelles fonctionnalités que cette version apporte - on constate que n'il y en a pas trop encore - mais plutôt pour les raisons suivantes :
  • Maven 3 est plus performant
  • Les logs, en cas d'erreur, sont plus lisibles
  • Le reporting est amélioré
  • La communauté est mature et expérimentée. Nous comptons sur un grand nombre de développeurs et utilisateurs senior. De plus, la version 3 a attiré l'attention des nouveaux développeurs, ce qui a fait revivre le projet.
Une bonne référence en français :
Apache Maven de Pearson, écrit par les deux speakers !

http://www.pearson.fr/livre/?GCOI=27440100730370


Lancez-vous, migrez !

mercredi 12 mai 2010

Mon premier Paris JUG

Hier soir je suis allée pour la première fois à la réunion mensuelle de Paris JUG. Je suis allée avec le groupe JDuchess. Ceci a été une expérience géniale. Jusqu'à hier, je connaissais les duchesses par la toile, et enfin j'ai pu les rencontrer et leur donner un visage (au moins à la dizaine de participantes)

Voici mes retours de la soirée

DVCS par Sebastien Douche
Git
par David Gageot

Conférences très bien animées, avec beaucoup d'humour et très intéressantes. DCVS, Distributed Control Version System, est la version distribuée des systèmes comme CVS et SVN.
Sebastien et David, avec leurs nombreuses années d'expérience, ont constaté que :

- Chaque développeur a "sa façon de faire" : petits commits fréquents, gros commit à la fin, commiter toujours à la fin de la journée etc.
- Face à un développement assez important :
  • Le développeur passe beaucoup de temps à "merger" les changements pour pourvoir après commiter
  • Beaucoup de micro-merges sont effectués pendant la journée car la quantité de fichiers à merger est proportionnelle au temps passé sans commiter.
  • Le développeur se dépêche de commiter principalement pour laisser la fastidieuse tâche de merger à son voisin.
  • Commits fréquents, non testés, non finis, non validés
Toutes ces problématiques, encore plus aggravées dans un projet qui commence "from scratch", sont la cause directe de :
  • Trop de temps perdu
  • Un projet moins stable
  • L'impossibilité de montrer le produit au client au fil de l'eau
  • Un impact négatif sur la gestion du projet
Si on utilise des branches pour paralléliser les développements, les conséquences seront encore pires : personne n'aime les fusionner ; il est connu que cette tâche est un véritable cauchemar et que leur gestion amène beaucoup de problèmes.

La solution :
Oublier
l'utilisation des gestionnaires de versions comme CVS ou SVN et utiliser DVCS, notamment Git.

Principes : le workflow et l'orientation au contenu.

Workflow: Un développeur est confronté à plusieurs workflows.
  • workflow organisationnel : Il s'agit de la organisation qu'il faut mettre en place pour le développement d'un produit.
  • workflow personnel : Il s'agit de la façon de travailler de chaque développeur
  • workflow inter-personnel : Il s'agit de la façon dont chaque développeur travaille avec l'équipe autour de lui
Orientation au contenu :
Contrairement au CVS ou SVN (outils VCS) qui sont orientés au ChangeSet, les noms des fichiers sont dissociés aux contenus.

Chaque acteur compte avec son repository en local et peut s'organiser comme il veut. On fait tous les commits qu'on souhaite.
Une fois la fonctionnalité est finie, on "push" l'ensemble fonctionnel sur le repository central.

Ainsi :

- Nous nous focalisons sur notre code
- Nous avons tout l'historique en local
- La résolution de conflits est plus intelligent
- Nous pouvons travailler en mode déconnecté
- Il nous permet d'automatiser l'intégration continue en local et de pusher automatiquement au dépôt central si le build est stable.
- Il est capable de détecter les renommages des fichiers rendant faciles et rapides les refactoring du code.
- Non seulement toutes les utilités de SVN sont disponibles mais plus encore ; par exemple, "git bisect" nous aide à savoir quel commit a cassé notre build en l'absence d'erreur de la part du serveur d'intégration continue.
- Vitesse, souplesse et cherry picking entre autres caractéristiques.


Plus de .svn et .cvs partout ! Plus de regrets lors de la copie d'un répertoire !

Et pour commencer en douceur et convaincre le client ?
Binding ! On peut garder notre serveur SVN et travailler avec Git :o)

La meilleure façon de commencer est la pratique : GitHub !

J'ai déjà utilisé GitHub pour "Tapestwitter" http://github.com/lguerin/tapestwitter et je suis encore plus convaincue qu'hier matin !

Plus d'information sur le site : GIT - Fast Version Control System

ParisJUG : Paris JUG

Pourquoi ce blog ?

Salut !

Je suis développeur java/j2EE et je voudrais partager et écrire sur des sujets dont je travaille.

Étant l'espagnol et le basque mes langues maternelles, quelqu'un pouvait se demander (ou pas) : pourquoi en français!?!? :D En fait, la réponse est très égoïste : j'ai besoin de rédiger en français pour améliorer cette facette! Effectivement, je commence à me débrouiller à l'oral; par contre le français écrit je ne le pratique pas aussi souvent! Comme on dit en espagnol "matamos dos pajaros de un tiro!" : J'améliore mon français et je partage certains expériences avec les personnes intéressés !

Les textes, je vais les corriger petit à petit ; je vous encourage à me faire des remarques !

Je ne corrige pas ce post, je reviendra sur lui d'ici à quelques semaines, ou mois, pour constater mes progresses! (ou pas :( mais soyons optimistes!! :o) )

Ya esta !

como me han dicho que el primer mensaje tiene que ser un asco, ahi va ! :D
yupi! ya tengo un blog! yujuuu