Archive | Java RSS feed for this section

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. 😉

Publicités

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

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.