mardi 19 mai 2009

Coordonnées Google Earth en coordonnées cartésiennes

Bonjour,
je suis actuellement en train de travailler sur un petit logiciel se basant sur les fichiers KML de Google Earth (permet d'exporter des polygones directement dessinés sur la Terre avec Google Earth par exemple), le problème est que les coordonnées sont en longitude/latitude (en degrés décimales).

Pour mon application je dois travailler en coordonnées cartésiennes (x,y). La géographie et la cartographie n'étant pas mon fort et mon métier, j'ai cherché un peu partout LA formule magique.

Pour qui ça intéresse j'en ai, à priori, trouvée une sur la Wikipedia en anglais (la version française est comme d'hab, pas assez détaillée...).

Voici la formule magique pour passer de GE au système cartésien :

chi=sqrt(1-e2 * sin(latitude)^2 )
x = (a/chi)*cos(latitude)*cos(longitude);
y = (a/chi)*cos(latitude)*sin(longitude);


NOTES :
  • sqrt veut dire racine carrée
  • ^2 veut dire au carré
  • x et y sont en mètres
  • latitude et longitude doivent êtres en RADIANS (faire gaffe : Google Earth donne les angles en degrés)
  • "a" et "e2" sont des constantes propres à la Terre et à la projection utilisée pour Google Earth (WGS84)
  • "a" est l'axe semi majeur de la Terre, a=6378137 m
  • "e2" = 2*f - f*f où "f" vaut pour la Terre : f=1/298.257223563
J'ai pas mis le calcul de la composante Z, je vous laisse le soins d'aller voir l'article Wikipedia.
J'ai testé la formule sur quelques points en France avec l'application Circé de l'IGN , ça l'air de très bien fonctionner (très bonne précision)

Magique non ? ...

Lien vers l'article Wikipedia : http://en.wikipedia.org/wiki/Geodetic_system#From_ENU_to_WGS-84:_sample_code

:)

mercredi 13 mai 2009

Utiliser la sécurité de WebSphere pour un projet Web dans RAD

Ce petit tuto va vous expliquer rapidement comment mettre en place un système de login robuste et performant dans un projet Web sous Web Sphere (version 6.1 ici).

On va faire cela sous RAD (Rational Application Developper).

Dans 80% des applications (et dans 99% en entreprise), on a besoin d'authentifier un utilisateur. Par authentification, on entends un système qui permet d'identifier un utilisateur de l'application, en l'occurrence ici, par son login et son mot de passe.

Gérer l'authentification est très sensible car elle peut poser des problèmes de sécurité pourtant c'est un élément élémentaire pour toute application Web. Heureusement pour nous, avec trés peu d'effort, on peut mettre en place un système trés fiable et souple en utilisant l'authentification intégrée à Web Sphere. En 10 min on pourra mettre en place ce système ! alors qu'il faudrait plusieures heures de travail si on le développerai soit même (avec tous les risques que cela comporte).

Supposons que vous avez une projet Web déjà tout prêt (projet JSP, Struts 2 etc... peu importe) dans RAD et que vous voulez y rajouter l'authentification et un système de gestion de rôle. En effet, chaque utilisateur du système n'a pas forcément les mêmes droits. Par exemple, un utilisateur lambda pourra par exemple que consulter les données alors que peut être l'administrateur pourra lui créer, supprimer ou modifier. On dit qu'on attribut des rôles aux utilisateurs. Un utilisateur peut avoir plusieurs rôles en même temps. Avec une gestion assez fine des rôles, on peut arriver à permettre ou interdire certaines fonctionnalités de l'application selon l'utilisateur.

Avant de commencer, il faut activer, si ce n'est pas déjà fait, la sécurité dans WebSphere :
  1. Ouvrir la console administrative de WebSphere
  2. Dans Sécurité/Administration, applications et infrastructure sécurisée, il faut que 'Activer la sécurité applicative' soit cochée. Si ce n'est pas le cas, éxecuter l'assistant de configuration des paramètres de sécurité.
  3. Suivre les indications de l'assistant. Notamment, on vous demandera un login et mot de passe pour se connecter à WebSphere (bien retenir ces informations car elles vous seront demandées à la prochaine connexion à la console administrative !)
  4. Sauvegarder vos modifications et redémarrer le serveur WebSphere
  5. RAD ne risque de plus fonctionner avec votre serveur. Double cliquer sur le serveur dans RAD et dans la partie sécurité : cocher "la sécurité est active sur ce serveur" puis renseigner le login et mot de passe saisis au point 3
La sécurité est désormais active sur le serveur ! Vous verrez que maintenant, les adresses sont en https et non plus en http

On va voir maintenant comment créer notre page de login. Elle va être simple : elle contient seulement un formulaire qui va envoyer les informations de connexion à Web Sphere.
Voici son code HTML :

<html>
<body>

<form action="j_security_check" method="post" />

Login : <input type="text" name="j_username" /><br>
Password : <input type="password" name="j_password" /><br>
<input type="submit" value="Connect" />
</form>

<body>
</html>


Lorsque l'utilisateur clique sur 'Connect', le login et mot de passe sont envoyées dans une servlet de WebSphere : j_security_check. Cette servlet vérifie que l'utilisateur existe bien et vérifie son mot de passe. Si l'utilisateur est connu, l'utilisateur sera authentifié sur toutes les pages de l'application Web.
Les utilisateurs sont définis directement dans WebSphere (dans la partie Sécurité ou Utilisateur et Groupe sous la console administrative). C'est assez bien fait, car on peut très bien coupler WebSphere et Active Directory de Windows, ainsi, tous les utilisateurs de Windows seront directement utilisables par notre application !!!

Maintenant il gérer la sécurité dans notre projet avec RAD :
  1. Ouvrir le projet Web dans RAD
  2. Ouvrir Web.xml (descripteur de déploiement)
  3. Aller dans l'onglet "Pages"
  4. Dans la partie "Connexion", mettre "FORM" dans la méthode d'authentification et /login.jsp dans la page de connexion. Cela indique qu'on utilise la page de login créée plus haut comme page de connexion à notre application
Il faut désormais définir les rôles de sécurité. Identifiez les et les créer :
  1. Dans Web.xml, aller dans l'onglet "Sécurité"
  2. Ajouter un roles (en haut de l'écran), par exemple le rôle Admin qui sera destiné aux administrateurs de l'application
  3. Procéder de même pour tous les roles
Une fois les rôles définis, on doit spécifier à quoi ont accès les rôles. ça peut être n'importe qu'elle ressource du site (jsp, image, feuille de style, action struts etc...) :
  1. Toujours dans l'onglet "Sécurité" de Web.xml, créer une contrainte sécurité. Une contrainte spécifie un groupe de ressource que l'on autorise pour des rôles
  2. La contrainte doit avoir au moins un pattern de ressource. Le pattern définit l'ensemble des ressources concernées : par exemple *.jsp pour toutes les jsp du site, *.action pour toutes les actions struts 2, admin*.jsp pour toutes les pages jsp commençant par admin etc...
  3. Il faut ensuite associer les roles à ces ressources. Seuls les utilisateurs ayant les rôles choisis auront accés aux ressources
Pour finir, il reste plus qu'a associer les rôles aux utilisateurs (un utilisateur peut avoir plusieurs roles). Il y a deux méthodes : à partir de la console administrative de WebSphere ou directement à partir de RAD :
  1. Dans RAD, ouvrir l'éditeur de sécurité du projet (dans l'arborescence du prjet)
  2. Les rôles créés dans Web.xml devraient apparaitre.
  3. On peut mapper des utilisateurs ou des groupes à chaque role.
  4. Créer éventuellement les utilisateurs dans WebSphere (à partir de la console administrative)
Pour tester votre application, ouvrez une page concernée par une contrainte de sécurité. Tout d'abord, l'application va vous demander un login/mdp. Choisir un utilisateur ayant le bon rôle. Vous devez avoir accés à la page. Recommencer avec un utilisateur n'ayant pas le role, l'accés à la page doit être refusé.

Note : vous devez proposer, à tout moment, à l'utilisateur de se déconnecter de l'application. Pour cela, rajouter un lien cliquable sur chacune de vos pages pointant vers l'URL : ibm_security_logout?logoutExitPage=##URL##
Remplacer ##URL## par l'adresse de la page vers laquelle aller àpres la déconnexion (par exemple la page d'acceuil de votre site)

Voili, c'est tout !

lundi 11 mai 2009

Struts 2 + Tiles 2 : passage d'attributs à une sous JSP

Bonjour,
dans mon projet j'utilise Struts 2 et j'ai integré Tiles 2 pour gérer l'affichage de toutes mes pages (pour rappel : Tiles 2 permet de définir des layouts pour toutes les pages de l'application pour assurer une charte graphique par exemple)

La définition du gabarit Tiles 2 est par exemple le suivant (dans tiles.xml) :

<definition name="baseLayout" template="/layouts/base.jsp">
<put-attribute name="title" value="Sans titre">
<put-attribute name="footer" value="/tiles/footer.jsp">
<put-attribute name="header" value="/tiles/header.jsp">
<put-attribute name="body" value="">
</definition>


Lorsqu'on rajoute une action Struts 2 (je ferai peut être un message sur l'intégration de Tiles 2 dans Struts 2), il suffit de rajouter dans tiles.xml :

<definition name="HelloWorld" extends="baseLayout">
<put-attribute name="title" value="Hello World !!!">
<put-attribute name="body" value="/tiles/helloWorld.jsp">
</definition>


Dans mon header.jsp, je voulais afficher le titre passé dans l'attribut title dans tiles.xml. J'ai galéré pour faire cela. Voici la solution toute simple :

Dans mon template base.jsp, il faut faire pour afficher header.jsp :

...
<tiles:importattribute name="title">
<tiles:insertattribute name="header">
<tiles:putattribute name="title" value="${title}">
</tiles:insertAttribute>
...


Avec ça, l'attribut title est bien passé à header.jsp, ainsi cette page peut afficher le titre en attribut :

<h1><tiles:getasstring name="title">


A noter : Dans header.jsp, on est pas obliger d'utiliser le même nom d'attribut que dans base.jsp. C'est ce qu'on met dans putAttribute name="" qui définit le nom de l'attribut. Ici j'ai mis aussi title, donc le nom de l'attribut dans header.jsp est identique à celui dans base.jsp

Voila c'est tout ;)

mercredi 6 mai 2009

E404 : Configurer WebSphere 6.1 pour que Struts 2 marche

Si vous avez une erreur HTTP 404 FileNotFoundException à l'exécution d'une action Struts 2 dans WebSphere 6.1, c'est comme moi, vous avez pas de bol ! ;)

En effet, j'avais parfaitement paramétré mon projet Struts 2 (librairies, web.xml etc...) et pourtant lorsque j'allais sur ma page JSP avec mon navigateur Web, pas moyen : une erreur 404 FileNotFoundException. Ne cherchez pas du coté de Struts, c'est du coté de WebSphere qu'il faut regarder...

En effet, je crois que c'est un bug, ça doit être corrigé dans une mise à jour, en attendant, voici une manière simple et rapide pour que ça fonctionne :

  1. Ouvrir la console administrative de WebSphere 6.1
  2. Aller dans Serveur/Serveur d'applications/server1 (ou autre selon votre configuration)
  3. Dans 'Paramètres du conteneur' (à droite dans la page), déplier 'Paramètres du conteneur Web' puis cliquer sur 'Conteneur Web'
  4. Dans 'propriétés supplémentaires' à droite, cliquer sur 'Propriétés personnalisées' créer la propriété :
com.ibm.ws.webcontainer.invokefilterscompatibility à la valeur true

Voilà c'est tout, vous n'avez plus qu'a sauvegarder vos modification et redémmarrer le serveur WebSphere, normalement tout devrait rentrer dans l'ordre !!!

Pour plus d'infos, sur le site IBM (en anglais, sorry) :

lundi 4 mai 2009

JAVA JPA : problème de persistence.xml avec RAD

Lorsqu'on essaye d'intégrer JPA (Java Persistence API) dans un projet Web sous RAD (Rational Application Developper) 6 ou 7, j'ai remarqué un petit soucis à la configuration et au démarrage de l'application sur un serveur WebSphere 6.1 (je sais pas sur les versions suivantes ou précédentes). (RAD étant basé sur Eclipse peut être que ce problème se produit aussi sous Eclipse, à vérifier)

J'ai créé un fichier de configuration persistence.xml dans le répértoire META-INF (WebContent/META-INF sous RAD) comme le préconise la documentation de JPA (un petit tour sur le site officiel http://java.sun.com/javaee/overview/faq/persistence.jsp peut ne pas faire de mal !). Dans ce fichier, j'ai juste créé une unité de persistance car il en faut au moins une pour JPA :




Ma base de données contient une table Banque donc j'ai créé la classe Java correspondante à cette table, cette classe se nomme : test.struts2.helloworld.data.Banque (package+nom de la classe) :


package test.struts2.helloworld.data;
import java.sql.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Banque
{
@Id
@GeneratedValue
private Integer refbqe;

private String nombqe;
private String vilbqe;

public String getNombqe()
{
return nombqe;
}

public void setNombqe(String nombqe)
{
this.nombqe = nombqe;
}
public String getVilbqe()
{
return vilbqe;
}
public void setVilbqe(String vilbqe)
{
this.vilbqe = vilbqe;
}

public Banque()
{
}

public Integer getRefbqe()
{
return refbqe;
}

public void setRefbqe(Integer refbqe)
{ this.refbqe = refbqe;
}
}

Au démarrage de mon application, j'avais l'exception suivante :


Caused by: java.lang.NoClassDefFoundError: WEB-INF.classes.test.struts2.helloworld.data.Banque (wrong name: test/struts2/helloworld/data/Banque)
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:228)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:148)
at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:562)
at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:514)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:388)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
..etc


Tout me parait pourtant correct dans ma configuration et dans ma banque... Après m'être arraché les cheveux, je suis tombé sur un post (désolé j'ai perdu l'adresse) qui explique qu'en fait ce problème vient de RAD...

En effet, normalement JPA s'attends que persistence.xml soit, au déploiement de l'application sur le serveur Web, dans le répertoire WebContent/classes/META-INF/. JPA cherchera les classes mappant avec la base à partir du répertoire parent du répertoire de persistence.xml (c'est à dire WebContent/classes).

Mais voila, RAD au déploiement, ne créé pas le répertoire WebContent/classes/META-INF/ avec le fichier de configuration a l'intérieur, il le laisse dans WebContent/META-INF. Du coup, JPA cherche les classes mappant la base dans WebContent/ et non pas WebContent/classes d'où l'exception levée !!

Pour corriger cela, il faut un poil bidouiller :
-il faut créer un répertoire META-INF dans les sources et placer le persistence.xml dans ce répertoire
-supprimer le fichier WebContent/META-INF/persistence.xml
Au déploiement, RAD mettra bien persistence.xml dans WebContent/classes/META-INF !

Pour la 1ere partie, pour ceux qui ne savent pas faire, voici comment procéder :
-dans RAD, ouvrir son projet Web
-ouvrir la vue 'Navigateur' (menu Fenetre/Afficher la vue/Navigateur)
-créer un dossier META-INF (pas un package ni un dossier source mais un dossier tout simple) dans le dossier src/
-placer le fichier persistence.xml dans ce répertoire

Voila c'est tout simple !! Encore faut il le savoir !!

samedi 2 mai 2009

PACS au Luxembourg !

Re-bonsoir,
un sujet qui n'a rien à voir avec l'informatique mais qui peut concerner des centaines (des milliers ?) de frontaliers comme moi : comment marche le PACS français au Luxembourg ?

C'est une question toute bête, pourtant j'ai galèré très très longtemps pour trouver une réponse claire et fiable... Peut être le gouvernement du Grand Duché ne veut pas trop que ça s'ébruite ?...

Déjà premièrement, le PACS français est bien reconnus au Luxembourg, certes depuis peu (je crois depuis 2008). Chouette ! vous vous dites que vous allez toucher plus d'argent (moins d'impôts) ! oui mais à certaines conditions ... :

Tout d'abord, les conditions pour toucher moins d'impôts avec le PACS français au Luxembourg sont :
-il faut que le couple réalise au moins 90% de ses revenus (revenus français + luxembourgeois) au Luxembourg
-il faut que le PACS existe du DEBUT à la FIN de l'année d'imposition (on est en 2009, donc du 1er Janvier 2008 au 31 décembre 2008)

Attention :
contrairement à un couple marié où la dimunition d'impots intervient tous les mois sur le prélevement à la source, le PACS lui doit être déclaré sur la déclaration des revenus luxembourgeoise tous les ans et votre trop d'impots payé durant l'année vous sera remboursé apres la déclaration !
La déclaration des revenus au Luxembourg est, contrairement à la France, facultative mais obligatoire si on veut faire reconnaitre son PACS ! Cette déclaration se fait tous les ans en mars. Par exemple, en mars 2010 pour le PACS de l'année 2009 !
La déclaration est téléchargeable sur le site des impots luxembourgeois => chercher le formulaire 100F (pour 2008). Surtout ne pas oublier de remplir la section partenaires.

Voila, j'espere en avoir aidé quelques uns !!

Bon courage

A+

A venir...

Bonsoir,
pour vous donner l'eau à la bouche, voici ce que vous allez bientôt trouver sur ce blog :
-Création de A à Z d'un projet Web JAVA STRUTS v2 avec Spring + JPA (Hibernate) sous RAD 6 (Rational Application Developper d'IBM) et WebSphere 6.1
-Création d'un projet Web PHP utilisant le framework Zend Framework 1.6+

c'est tout mais c'est deja pas mal !!!

A trés bientot !

Bienvenue

Bonjour,
bienvenue sur mon blog consacré à l'informatique à destination des professionnels du métier.

Je me présente, je suis TucoBouch, je suis ingénieur informatique au Luxembourg depuis 2 ans maintenant et je vis dans l'Est de la France.

Dans mon métier, il m'arrive souvent de passer des heures et des heures à chercher des solutions à des petits problèmes techniques (installation de base de données, configuration de tel ou tel logiciel, etc...). On perd vite du temps sur Google pour trouver LA bonne info, l'info qui va vous dépêtrer ! En général la solution est très simple mais encore fallait il la connaitre ! Au fil du temps, fort de toute mon expérience à résoudre mes problèmes, je me suis dit que ça serait trop bete de garder tout ça pour moi, si ça m'a servis, ça doit servir à d'autres !!! C'est donc là le but de mon blog.

Je tiens à vous avertir : mon blog sera uniquement un recueil de mes solutions, je n'ai aucune prétention (et de patience) à vous fournir un blog dynamique, mis à jour souvent ou avec de vrais articles d'informatiques... Ce blog est seulement là pour un "devoir de mémoire" sur mon experience qui j'espere sera utile au moins à quelqu'un !