Hier, le StartUp @TnJug

25 Avr


Nom: TnJug
Date de naissance: 24 avril 2012
Lieu de naissance: Institut supérieur de gestion de Tunis.

Depuis longtemps, la communauté Java à Tunis attendent un tel événement et moi personnellement dès le début de l’année 2008 (date de création de ParisJUG) j’ai voulu voir un groupe qui réunit les geeks Java de Tunis afin de partager leurs connaissances et leurs retours d’expérience sur l’ecosystem Java et en dehors de ce qu’on utilise quotidiennement.

Enfin le TnJug est là et c’est grâce à l’initiative de ces leaders:

  • JUG Leader : Mohamed Jalel Hazbri, architecte et développeur chez Codix.
  • JUG Co-Leader: Mohamed Ali Haddad, développeur chez Codix.
  • JUG Co-Leader: Mohamed Chaawa, Etudiant et fan with Java / JEE and mobile platform.
  • JUG Co-Leader : Ali Hamdi, développeur et leader de l’équipe du support technique chez ExoPlateform Tunisia.

En plus ses partenaires:

La soirée a commencé par la présentation « le passé, le présent et le futur du Java » réalisée par Mr Khaled Ben Driss le directeur technique de la société Oxia , un Architecte SOA et Expert international coté plateforme Java.

Le speaker a parlé des origines du Java et le cadre de ses premières utilisations (le PDA Star7 présenté en 3 septembre 1992). Il a mis en évidence que l’importance du langage est du à la communauté et le nombre des API et des frameworks qui tournent autour et non pas principalement au langage elle-même. Mr Ben Driss a mis l’accent aussi sur les erreurs de marketing commis par Sun lors du nommage des différentes versions du langage et de ses différentes plateformes. Le speaker a terminé sa présentation par la projection de l’idée qu’un langage comme Java ne dure pas longtemps qu’avec une communauté large qui fournit chaque jour des nouveaux projets et de nouveaux API et que c’est le rôle de cette communauté de pousser Oracle à miser sur Java et même à dévoiler sa feuille de route d’ici 2021 à Londres lors de la conférence QCON.

La deuxième présentation animée par Mr Ali Hamdi développeur et leader de l’équipe de support technique chez ExoPlateform Tunisia porte sur Exo et principalement sur leur plateforme 3.5 la « User eXperience Platform » baptisé pour le Cloud. Le speaker a commencé par présenter la société Exo ensuite il nous a présenté les différentes briques de la plateforme puis les fonctionnalités qui offre ExoPlateform en tant que première « User Experience Platform »: la gestion du contenu, l’intranet Social, la collaboration et la gestion du workflow.

Le speaker a terminé sa présentation avec l’IDE d’Exo: cloud-ide.com qui vous permet de développer sur le Cloud et de déployer aussi sur le Cloud et surtout son intégration facile avec le système de versioning GIT.

Enfin, une bonne nouvelle pour les gens qui utilisent déjà l’ide d’Exo, hier, ils ont mis en production la fonctionnalité du débogage qui permet d’enrichir l’ide et que  je le trouve personnellement promoteur.

Après une petite pause avec des boissons gazeuses et où tout était  » Halel « , Mr Tugdual Grall, Co-Lead de Nantes JUG et Expert Cloud chez Exo, nous a projeté « Tribulation d’un développeur Java dans le Cloud » son retour d’expérience sur la solution PaaS du Google le « google app engine » lors du développement de son site « resultri.com » un site pour l’analyse et la gestion des résultats des Triathlon.

Mr Tugdual Grall a commencé par sa découverte du GAE et la raison pour laquelle il a choisi ce PaaS (la facilité d’administration et la multitude des outils de la surveillance des ressources fournit par GAE). Ensuite, le speaker nous a parlé des choix technologiques que d’après ce que j’ai compris il a voulu toucher des technos d’actualité comme le NoSql et Twitter Bootstrap. Il a mis l’accent sur les surprises du NoSql pour un développeur qui fait du relationnel dans son quotidien et pour le faire il nous a montré pas mal de portions de code et des exceptions et il a raison de l’appeler des surprises.

Le speaker a mis l’accent sur l’importance de la bonne gestion des ressources et des APIs fournit par GAE surtout lorsqu’on y est avec un abonnement gratuit. Et enfin, il a mis l’accent sur l’importance du Memcached et CloudSql dans la réalisation du « resultri.com ».

La soirée était géniale surtout pour un stratUp. Le TnJug ne concerne pas seulement les développeurs Java, mais aussi les enseignants, les étudiants ainsi que toute personne qui veut savoir comment l’ecosystem Java bouge et pour rattraper le retard suite au boulot quotidien.

En attendant la prochaine session, je souhaite à toute l’équipe TnJug une bonne continuation et un grand remerciement pour tous les partenaires. 😉

Sécuriser une application JEE avec JDBCRealm

2 Nov

Si vous etes en train de développer une application JEE et que vous cherchez à mettre un mécanisme de gestion de la sécurité, pensez à JAAS.

Java Authentication and Authorization Service est un standard de java permettant de gérer des identifications et les droits associés par groupe au niveau du client et du serveur d’application. Il permet une séparation entre le système d’authentification /autorisation et votre code applicatif.

Dans ce poste, je vous introduis d’une manière aisée la configuration et la prise en main de l’API Jaas avec JDBCRealm sur le serveur d’application de référence Glassfish v3.

Tout d’abord, commençons par définir les groupes :

Glassfish reconnaît le rôle d’un utilisateur et son mot de passe en se basant sur deux tables avec un identificateur unique qui représente l’id de l’utilisateur (le username). Soit :

create table user (username varchar(20) not null primary key, password varchar(20) not null);
create table group (username varchar(20) not null primary key, role  varchar(20) not null);

Une autre alternative se présente dans le cas où vous avez lié ces deux tables par une clé étrangère (chose qui est plus correcte) est de créer un view afin de faciliter à Glassfish de trouver le rôle d’un utilisateur en se basant sur son username.

create table user (username varchar(20) not null primary key, password varchar(20) not null,
roleId integer not null);
create table group (id integer not null primary key, role  varchar(20) not null);
alter table user  add FOREIGN KEY (roleId ) refrences group (id);
Create view user_role as select u.username, u.password, g.role from user u, group g where g.id=u.roleId ;

Ensuite, vous devez créer une JDBC Connection Pool depuis l’interface d’administration de Glassfish :
Allez vers Resources > JDBC > JDBC Connection Pool et cliquer sur « new ».
Supposons que vous utilisez une base de type Mysql, vous pouvez faire ceci :
 

 
Ensuite « Next » :
Vous n’avez qu’à remplir les champs : User, Password, DatabaseName et Url puis cliquer sur « Finish ».
Vous devez maintenant déclarer une nouvelle ressource JNDI pour ce pool de connection.
Allez vers Resources > JDBC > JDBC Resources et cliquer sur « new ».
Dans la case JNDI name vous devez entrer un nom JNDI valide pour votre Pool de connection.
 

 
Maintenant que vous avez terminé avec la déclaration de votre ressource JNDI, allons vers des choses sérieuses.
Commençons par créer un Realm associée à notre Pool de connection.
Allez vers Configurations > server-config > Security > Realms et cliquer sur « new » :
Nommé votre nouvelle Realm par « data-jdbcrealm » et choisissez
« com.sun.entreprise.security.auth.realm.jdbc.JDBCRealm » comme Class Name.
Si vous avez choisit la première technique (les deux tables avec un username unique) vous devez remplir ce formulaire comme suit :
 

 
Dans le cas ou avez déjà les deux tables et que vous avez créé un view alors le formulaire devient :
 

 

Finis avec la configuration du serveur Glassfish, passons au fichier web.xml.
Pour activer le module Login pour votre application vous devez ajouter ce bout d’xml dans votre descripteur web.xml :
Si vous voulez fournir votre propre page de login, la configuration serait comme suit :
 

<login-config>
        <auth-method>FORM</auth-method>
        <realm-name> data-jdbcrealm </realm-name>
        <form-login-config>
            <form-login-page>/faces/login.xhtml</form-login-page>
            <form-error-page>/faces/loginError.xhtml</form-error-page>
        </form-login-config>
   </login-config>

 
Si vous voulez utiliser la façon basic (le popup) la configuration est alors :
 

<login-config>
        <auth-method>BASIC</auth-method>
        <realm-name> data-jdbcrealm </realm-name>
 </login-config>

 
Dans le cas où vous avez choisi la solution FORM, vous devez écrire une page de login login.xhtml comme suit :
 

<form method="POST" action="j_security_check">
                Username: <input type="text" name="j_username" />
                <br />
                Password: <input type="password" name="j_password" />
                <input type="submit" value="Login" />
                <input type="reset" value="Reset" />
</form>

 
Terminé avec l’authentification, passons à l’autorisation.
Vous pouvez sécuriser vos ressources en se basant sur la structure de votre URL comme suit :
Ajouter ce bout d’xml dans votre descripteur web.xml :
 

<security-constraint>
        <web-resource-collection>
            <web-resource-name>Admin</web-resource-name>
            <url-pattern>/faces/admin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>User</web-resource-name>
            <url-pattern>/faces/user/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
            <role-name>USER</role-name>
        </auth-constraint>
    </security-constraint>

 
Et n’oubliez pas de mapper ces Rôles à ceux de la table groupe dans votre fichier glassfish-web.xml :
 

<security-role-mapping>
        <role-name>ADMIN</role-name>
        <group-name>admin</group-name>
</security-role-mapping>
<security-role-mapping>
        <role-name>USER</role-name>
        <group-name>user</group-name>
</security-role-mapping>

 
Ce tuto vous montre comment activer l’authentification et l’autorisation en utilisant JDBCRealm avec Glassfish. Pour plus de sécurité vous devez utiliser les annotations javax.annotation.security dans vos managed beans et vos Ejbs.

Yet another JVM Language

20 Juil

Encore un autre langage qui tourne sur la Jvm : Kotlin.  Lancé par JetBrains, les mecs de l’ide sympa IntelliJidea. Après Groovy, Scala et Ceylon, vient kotlin que je le trouve principalement intéressant dans sa globalité :

– Tout d’abord, il faut l’avouer, il est très proche de Scala dans sa syntaxe mais, il est encore plus facile à apprendre, à prendre en main et il est pour les funs de l’OO.

– Il est plus concise que Java tout comme Scala,car il supporte : l’inférence de type (typage statique), les closures et les fonctions d’extension.

– Compatible java (bien sur sinon je n’écrivais pas ce billet) dans le deux sens et pas comme Scala.

– et le best-of: Le support natif dans IntelliJ IDEA

Pus de détails:

– Le cast automatique (absent chez Java)

if (x is String) { print(x.length) // x is automatically
                                   //cast to String
}

– Le pattern matching (présent chez Scala)

when (x) {
is Int => print(x)
is List<Int> => print(x.sum())
!is Number => print("Not even a number")
else => print("can't do anything")
}

–  La NullPointerException: Kotlin vous permet de mieux éviter cette exception à travers une technique simple de prévention.

var b : String? = "abc"
b = null // ok

ensuite un safe-call

b?.length()  //No more Exception car cette ligne
             //est safe et ne retourne rien.

– L’absence de fameux “new”

class Example(param : Int) {}
val e = Example(10)

– Les singletons: de la meme manière de Scala

object DataProviderManager {
fun registerDataProvider(provider : DataProvider) { // ... }
}

– L’inférence des types

var number = 10
var str = “Hello!!!”

– Une autre sorte de généricité : le contrôle sur les typse se fait au runtime, cela permet de mieux vérifier les types d’un objet (pas comme Java).

A mon avis, j’ai appris cette nouvelle (la sortie de kotlin) ce matin à travers Twitter. J’ai commencé directement de creuser un peu dans les docs et je trouve que ce langage est prometteur. Je pense que je vais arrêter l’apprentissage de Scala pour le moment surtout que je galère avec le temps de compilation lorsque je code pour play!-scala.

Je vous conseille de jeter un oeil, c’est trop simple et trop facile à apprendre.

Réf: Kotlin (code source et features)

Java Optimisation Tips

14 Juil

Lors d’une baisse de charge que nous avons vécu dans notre équipe il y a quelques jours et pour ne pas rester les mains croisées ou surfer à travers les réseaux sociaux, les blogs IT et l’actualité technologique, nous avons décidé de faire un peu de refactoring (chose que je vois nécessaire à chaque phase de développement et non pas seulement lors d’une baisse de charge).

Pour s’y faire et dans le but de mieux savoir sur les techniques niveau codage qui peuvent nous aider à améliorer les performances de notre produit, j’ai commencé à voir coté du net et je me suis tomber sur un bon article écrite par Philippe Prados un mec costo de chez IBM.

Alors sans trop parler le but de ce billet est de prendre notes de ces tips que j’ai aimé et que j’ai pu utiliser peut être que ça sera utile une autre fois :

1-Déclaré des méthodes utilitaires

Une méthode qui ne manipule pas d’attribut ni de variables statiques est un utilitaire. Vous pouvez la déclarer static. Cela améliore la vitesse d’exécution. Par exemple, la méthode copyValueOf(char) de la classe String est déclarée static car elle ne manipule pas d’instance.

2-Réutilisez les instances

Créer des objets est plus coûteux que les réutiliser. Déclarez des instances statiques et réinitialisez les

3-Elimination des sous expressions commune.

Cela consiste à déplacer les sous expressions pour ne les calculer qu’une seule fois.

 double prixTTC1 = prix1*(1+tva);
 double prixTTC2 = prix2*(1+tva);
 

devient

 double sousexpr = 1+tva;
 double prixTTC1 = prix1*sousexpr;
 double prixTTC2 = prix2*sousexpr;
 

Les compilateurs savent parfois identifier ce type de calcul, mais ne peuvent pas simplifier les expressions ayant potentiellement un effet de bord. Par exemple, ils ne peuvent pas factoriser les appels de méthode.


double prixTTC1 = prix1*getTVA();

double prixTTC2 = prix2*getTVA();

Dans ce cas, il faut optimiser les expressions à la main.


double sousexpr = getTVA();

double prixTTC1 = prix1*sousexpr;

double prixTTC2 = prix2*sousexpr;

4-Déplacement de code

Cela consiste à détecter les codes dont le résultat ne varie pas et à le déplacer en dehors des boucles.


for (int i=0 ; i < x.length ; ++i)

xi = Math.PI Math.cos(y);

devient


double sousexpr = Math.PI Math.cos(y);

for (int i=0 ; i < x.length ; ++i)

xi = sousexpr;

5-Inversez l’ordre d’exécution d’une boucle

Si l’ordre de traitement d’une boucle n’a pas d’importance, il est préférable de l’inverser pour pouvoir comparer la condition de sortie par rapport à la constante zéro.

for (int i=0;i<array.length;i++)

devient

 
for (int i=array.length-1;--i>=0;) { ... }

La machine virtuelle de Java, comme tous les microprocesseurs, possède des instructions spécifiques pour comparer un entier avec la constante zéro. Le code est ainsi plus court et plus rapide.

6-Utiliser correctement la concaténation des String

La description de la méthode toString() explique comment utiliser correctement l’addition de deux chaînes de caractères. Cela permet de réduire le nombre de copies de tampon. Chaque fois que vous utilisez l’opérateur += avec une chaîne, vous dupliquer le tampon.

En choisissant correctement la taille du StringBuffer, vous améliorez également les performances. En effet, lorsqu’un caractère ne peut plus être ajouté, l’instance doit créer un nouveau tableau plus grand, et recopier tous les éléments. Cela peut s’effectuer plusieurs fois lors d’un traitement. En initialisant la taille du tampon, on évite ces recopies.

7-Ordonnez les variables

Contrairement aux langages compilés, l’accès aux variables dépend de leurs localisations. Une variable locale est plus rapide qu’une variable statique qui est plus rapide qu’une variable d’instance.

Les quatre premières variables locales utilisent un code optimisé. Il faut organiser les variables pour déclarer en premier les plus utilisées. Les bons compilateurs sont capables de détecter cela.

De même, il ne faut pas hésiter à dupliquer une variable d’instance dans une variable locale si elle est beaucoup utilisée dans un algorithme. Le résultat pourra retourner dans la variable d’instance lorsque tout sera terminé.

Ensuite un set des astuces globales et qui résident des bonnes pratiques de OO :

10-Choisissez le bon type

Java propose différents types primitifs plus ou moins précis. Ils se différencient par la place prise en mémoire et les valeurs minimums et maximales autorisées. Vous pouvez utiliser les types char ou byte dans des instances étant présentes en de nombreux exemplaires dans la mémoire. Le code nécessaire à la manipulation de ces types est plus important (le fichier .class est plus grand), mais cela est compensé par les économies réalisées sur chaque instance. De même, utilisez float à la place de double si la précision nécessaire le permet.

11-Libérez les ressources

La méthode finalize() peut s’occuper de libérer les ressources nécessaires à un objet. Cette méthode est appelée par le ramasse-miettes lorsque l’instance n’est plus nécessaire. Cela peut intervenir bien après la perte de l’objet. Il est préférable de gérer explicitement les ressources par un appel à close(), par exemple lorsqu’un flux n’est plus nécessaire.

12-Utiliser l’optimisation du compilateur

Pour optimiser le temps de chargement d’une application java, il faut réduire la taille du code généré. Utilisez javac -O . Si votre programme utilise souvent des méthodes en ligne, la taille du code généré peut être réduit en évitant les différents appels. Il faut comparer le résultat avec et sans l’option.

13-Utilisez l’héritage

Utilisez l’héritage pour factoriser un maximum de code. Cela évite les redondances et réduit le risque d’erreurs. Par exemple, séparez le code non portable dans des sous-classes.

14-Supprimer les méthodes inutiles

De nombreuses méthodes ne sont présentes que pour le déverminage. Par exemple, la plupart des classes possèdent une méthode main() afin de pouvoir effectuer les tests unitaires. Ces méthodes ne sont pas nécessaires à l’application. Vous pouvez séparer les méthodes de tests dans une autre classe, suffixé par exemple de UnitTest. Ainsi, il est facile de supprimer tous les fichiers UnitTest.class de l’archive avant de la publier sur le réseau.

Finalement, Ne pas optimiser si on ne sait pas si c’est nécessaire. Si vous voulez optimiser, commencez par modifier l’algorithme.

Avant d’effectuer une optimisation de bas niveau, mesurez le code pour voir où cela est nécessaire. Analysez le par la suite pour voir les impacts des modifications.

Reference: l’article de Philippe Prados

Quelques mots sur le Cloud

12 Juil

En 2002 et juste avant la fête de fin d’année le géant du commerce en ligne Amazon a grandi son infrastructure matérielle pour cette occasion. Mais après une courte durée les gens d’Amazon ont découvert qu’un bon nombre des ressources deviennent inutiles après la fête.

Il apparaît alors l’idée d’allouer ces ressources pour le grand public à travers un concept unique :  » la virtualisation ».

La virtualisation leur permet de monter un grand nombre des systèmes d’exploitation sur un nombre des machines inférieures. D’où les premiers pas vers le Cloud computing ou l’informatique dans les nuages.

L’idée est simple et se résume en deux mots :

« Nous avons un espace libre, venez mettre votre application ici et c’est à vous de gérer tout »

La phrase est honnêtement incomplète, car il existe un bon nombre des offres du Cloud computing qui varie selon votre besoin :

  • SaaS : software as a service, si vous voulez juste utiliser un service (application) qui tourne sur le Cloud.
  • PaaS : plateforme as a Service, si vous voulez juste une plateforme de déploiement et c’est toi de tourner vos propres applications.
  • Iaas : Infrastructure as a Service, nous avons l’infrastructure et c’est à toi de monter votre plateforme puis votre application.

Plusieurs sociétés ont aimé l’idée de Cloud (je n’achète rien et je paie seulement ce que j’utilise).

Mais, le concept de données dans les nuages fait peur encore surtout pour les entreprises qui ont des données sensibles. Là il apparaît un nouveau style de Cloud dite le Cloud privée càd « je monte mon Cloud chez moi et comme ça mes données sont toujours à côté ». Le cas ou vous etes insatisfait de votre Cloud privée et que vous voulez bénéficier des avantages du Cloud public, vous etes alors sur le point de vous lancer dans le Cloud privé/publique dite Cloud hybride.

De plus en plus, le nombre des acteurs du Cloud computing augmente, les SaaS se multiplient, les PaaS aussi et le nombre des développeurs des applications pour le Cloud se bombarde.

Jour après jour, le Cloud oriente notre habitude quotidienne et notre métier  (là je parle des développeurs) et son écho augmente dans le monde informatique tout comme la machine à vapeur au 18e siècle.

 

It’s #JAVA7 Time !!!

7 Juil

La nouvelle version de Java 7 vient d’arriver. Les nouvelles fonctionnalités proposées constituent des opportunités fortes intéressantes pour ce langage et qu’il sera utile de les étudier. Java 7 définit un certain nombre de nouvelles librairies certains sont reprises de projets open source où elles ont pu être testées et éprouvées. Nous allons voir alors quelques nouveautés de cette version :

JSR 294: Un package amélioré pour connecteur de flux Channel. Ce type de connecteur a défini depuis java 1.4 une interface commune pour toutes les connections vers des périphériques (fichiers, socket). En java 7, le Channel sur les sockets permettra désormais le multicast.

D’autre part, il y aura une nouvelle bibliothèque pour le système de fichiers qui permettra de gérer les liens symboliques, les attributs et de parcourir les répertoires. De plus plusieurs autres systèmes de fichiers pourront être pris en charge à l’aide des plugins.

JSR-275 : l’API qui implémente le JSR-275 permet d’utiliser le typage fort et les génériques pour fiabiliser la manipulation de mesures et d’unités lors du programmation à besoin scientifique.

JSR-310 : tirée de l’API Joda-Time créé par Stephen Colebourne permettre de corriger les principaux problèmes présents dans le JDK lié au traitement des dates tout en restant compatible avec les classes existantes. Les nouvelles classes sont basées sur le standard ISO_8601 et fournissent des méthodes de formatage et de parsing adaptées.

Concurence: Une nouvelle API de gestion de la concurrence doit être inclue dans java 7. Elle sera regroupée dans le package java.util.concurrency. Du fait de l’arrivée massive des processeurs multi-coeurs sur le marché, les technologies facilitant l’écriture de programme parallélisable nous semblent gagner en importance.

Xquery: La JSR 225 consiste à fournir une API permettant de soumettre des requêtes XQuery à toute source de données pouvant être vues comme du XML. Certaines bases de données relationnelles offrent ainsi une API XQuery. XQuery 1.0 est un langage de requêtage de données XML défini par le W3C.

Autres Nouveautés :

-Remplacement du Mark-Sweep garbage collector avec le garbage collector G1, ce qui devrait améliorer les performances.

– Prise en charge étendue pour les annotations JSR-308.

voir la liste complète des features:  jdk7 features.

Vers WordPress

21 Juin

J’écris cet article (mon premier article) sur wordpress.com après avoir essayé de déployer un blog développé avec play! framework sur cloud foundry le PaaS open source de Vmware mais sans succès. En effet, je n’ai pas fait attention aux fonctionnalités offertes pas CF et surtout aux services absents. Dans mon cas, j’aurai besoin de l’envoi d’un mail dans le cas ou un nouveau commentaire est ajouté ou à travers un formulaire de contact, ce qui n’est pas possible pour le moment avec CF qu’à travers un service tiers (Ex: SendGrid). Ce pour ça que j’ai décidé d’aller voir à coté du moteur des blogs gratuit et j’ai choisi WordPress (je ne sais pas pourquoi !!).

Je profite pour partager les sources du blog sur github:  sboubaker/sblog

ainsi qu’un lien sur les limites du CF: Taking VMWare Cloud Foundry on a test drive