Création du Paris JUG (Java User Group)

mars 14th, 2008
Le premier Paris JUG a été inauguré en février dernier. Qu’est ce qu’un JUG? Voilà l’intro sur leur site:
“Le Paris JUG est un groupe d’utilisateurs Java ayant pour but de réunir les acteurs du langage (professionnels, communautés open source, institutions, étudiants, enseignants…) afin d’échanger des idées et de discuter des avancées technologiques de la plateforme Java.

Nous nous rencontrons tous les deuxièmes mardis du mois. Les réunions sont gratuites, ouvertes à tous et consistent en une présentation technique, une démonstration d’un produit, ou une table ronde. Après la réunion on retrouve généralement un échange informel autour d’un verre et d’un mini-buffet.”

Software Engineering Proverbs

février 22nd, 2008

Quotes taken from http://www.multicians.org/thvv/proverbs.html

A clever person solves a problem.
A wise person avoids it.

– Einstein

André Bensoussan once explained to me the difference between a programmer and a designer: “If you make a general statement, a programmer says, ‘Yes, but…’ while a designer says, ‘Yes, and…’”

“No matter what the problem is, it’s always a people problem.”
– Jerry Weinberg

Wexelblat’s Scheduling Algorithm:Choose two:

  • Good
  • Fast
  • Cheap

“There’s no time to stop for gas, we’re already late”
– Karin Donker

“We know about as much about software quality problems as they knew about the Black Plague in the 1600s. We’ve seen the victims’ agonies and helped burn the corpses. We don’t know what causes it; we don’t really know if there is only one disease. We just suffer — and keep pouring our sewage into our water supply.”
– Tom Van Vleck

“To go faster, slow down. Everybody who knows about orbital mechanics understands that.”
– Scott Cherf

Everybody Knows:

  • Discipline is the best tool.
  • Design first, then code.
  • Don’t patch bugs out, rewrite them out.
  • Don’t test bugs out, design them out.

Everybody Knows:

  • If you don’t understand it, you can’t program it.
  • If you didn’t measure it, you didn’t do it.

Everybody Knows:

  • If you’ve found 3 bugs in a program, best estimate is that there are 3 more.
  • 60% of product cost comes after initial shipment.

Your problem is another’s solution;
Your solution will be his problem.

The significant problems we face cannot be solved by the same level of thinking that created them.
– Albert Einstein

On the radio the other night, Jimmy Connors said the best advice he ever got was from Bobby Riggs:

  • do it
  • do it right
  • do it right now

It is not enough to do your best: you must know what to do, and THEN do your best.
– W. Edwards Deming

Q: How many QA testers does it take to change a lightbulb?
A: QA testers don’t change anything. They just report that it’s dark.
– Kerry Zallar

Q: How many software engineers does it take to change a lightbulb?
A: Just one. But the house falls down.
– Andrew Siwko

One test is worth a thousand opinions.

“If you didn’t write it down, it didn’t happen.” This saying is popular among scientists (doing experiments), but I believe it applies to software testing, particularly for real-time systems.
– Larry Zana

“We reject kings, presidents, and voting.
We believe in rough consensus and running code.”
–Dave Clark (1992)

“I am a design chauvinist. I believe that good design is magical and not to be lightly tinkered with. The difference between a great design and a lousy one is in the meshing of the thousand details that either fit or don’t, and the spirit of the passionate intellect that has tied them together, or tried. That’s why programming—or buying software—on the basis of “lists of features” is a doomed and misguided effort. The features can be thrown together, as in a garbage can, or carefully laid together and interwoven in elegant unification, as in APL, or the Forth language, or the game of chess.”
– Ted Nelson

“Software is Too Important to be Left to Programmers”
– Meilir Page-Jones.

“If you think good architecture is expensive, try bad architecture.”
– Brian Foote and Joseph Yoder

Abraham Lincoln reportedly said that, given eight hours to chop down a tree, he’d spend six sharpening his axe.
– TidBITS 654, quoted by Derek K. Miller, via Art Evan

“… while we all know that unmastered complexity is at the root of the misery, we do not know what degree of simplicity can be obtained, nor to what extent the intrinsic complexity of the whole design has to show up in the interfaces. We simply do not know yet the limits of disentanglement. We do not know yet whether intrinsic intricacy can be distinguished from accidental intricacy.”
– E. W. Dijkstra, Communications of the ACM, Mar 2001, Vol. 44, No. 3

Site de rendu de projet en ligne

février 21st, 2008

Bonjour!

Le nouveau site de rendu de projet électronique est en ligne:

www.umlteacher.com/submit

Vous pouvez vous y connectez dès maintenant, avec votre login+mdp CAS habituel.

Le site est toujours en test, donc si vous rencontrez le moindre problème pour rendre vos projets, n’hésitez pas à envoyer une copie du rendu à votre tuteur.

Enfin, tous vos commentaires, remarques, bugs détectés, … seront les bienvenues.

Library / Bibliothèque

février 13th, 2008

[English below]

J’ai mis en ligne la liste des ouvrages techniques en ma possession, et que je mette à votre disposition pour vos projets, etc. Cela concerne essentiellement des livres sur l’analyse et conception, l’UML, le Java et Hibernate.
Pour la liste complète, voir mon site: www.umlteacher.com/Ece/

jTf

[English]

I have placed online a list of the technical reference books available for loan in my office. You may borrow them to help you in your course work and projects. Most of the books are related to analysis and design, UML, Java and now Hibernate.

The full list is available on my website: www.umlteacher.com/Ece

jTf

Cours Java - site mis à jour

janvier 20th, 2008

Les pages de mon cours de Java ont été mis à jour avec les polycopiés du cours et les sujets des TPs. Tout est disponible en français et anglais.

J’ai également ajouté de nouvelles pages HOWTO et Examples (en anglais uniquement) avec des ressources Java, JEE et UML. D’intérêt particulier pour le cours de Java, vous y trouverez le projet fourmiz de l’année dernière, avec le sujet, les sources et un démo sous forme d’applet signé.

http://www.umlteacher.com/Ece/ 

De Grenelle à Grenelle via Grenelle

janvier 16th, 2008

J’ai testé pour vous: Le parcours en Vélib de le rue de Grenelle à nos nouveaux locaux, au quai de Grenelle.

Pour y aller, fastoche: Prendre rue de Grenelle jusqu’à ce qu’il débouche sur le Champs de Mars. Continuez en ligne droite et passez entre les deux dames de fer (Tour Eiffel à droite, MaM à gauche), jusqu’à ce que vous croisez le metro aèrienne. Tournez à droit et, une fois arrivé sur le quais, à gauche, pour tomber toute de suite sur les nouveaux locaux (ils sont signalés par des grands panneaux flambants neufs).

Sur la route, ne manquez pas les Invalides et le Musée Rodin. Par contre, attention au grand rond-point des Invalides quand même: Les voitures ne font pas de faveurs!

Temps du trajet: Moins de 15 minutes.

Pour le retour, même plus facile, mais un peu plus long puisque la rue de Grenelle est sens-unique.

En partant de Pollux, suivre le metro aérien et, juste avant Montparnasse, prendre la rue de Sevres. Vous arriverez rapidement sur le Bon Marché, d’où vous trouverez facilement la route pour la rue de Grenelle. Le trajet est très bien, pistes cyclables pour presque toute l’itiniéraire.

Temps du trajet: Moins de 15 minutes.

Enfin, bon à savoir: Il y a un parking Vélib droit devant les nouveaux locaux, ainsi que plusieurs dans les environs du metro aérien.

Bonne ROUEte!

Interaction CAS et firewall sous Linux

janvier 1st, 2008

Introduction

J’ai récemment configuré un pare-feu (iptables) sur la machine qui héberge mon site web. Cela a crée une interaction inattendue qui empêchait l’authentification CAS de fonctionner. Après d’assez longues recherches, j’ai enfin trouvé le problème, évident avec le recul: Le firewall interdisait les connections HTTPS sortantes de mon serveur Tomcat vers le serveur d’authentification CAS, donc pas d’authentification possible.

Rappel du fonctionnement de CAS

J’ai installé le client CAS selon le schema typique d’un filtre qui intercepte toute requête sur mon serveur Tomcat. Ce filtre vérifie que, pour toute accès à une ressource protégée, le demandeur a été authentifié par le CAS et, dans le cas négatif, il redirige le demandeur vers le serveur CAS à travers une connexion HTTPS pour effectuer l’authentification, avant de servir la ressource.

L’interaction firewall

Naturellement, si vous installez un pare-feu stricte (comme je venais de faire), il ne va pas permettre cette connexion sortante vers le serveur CAS. Malheureusement, l’erreur provoqué par l’interdiction de la connexion sortante n’est guêre informateur! En fait, il provoque l’exception suivante au sein de la Tomcat JVM :

javax.servlet.ServletException: Unable to validate ProxyTicketValidator
[[edu.yale.its.tp.cas.client.ProxyTicketValidator proxyList=[null]
[edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl=
[https://webauth.ece.fr/cas/serviceValidate]
ticket=[ST-5350510-k5GyzdpwtwyMxCgsMOBVc1ajz2CoPBZ6UKj-20]
service=[http%3A%2F%2Fwww.umlteacher.com%2FEce%2Fen
%2Fprotected%2Fing4si%2Fuml%2Fing4si-uml.html] renew=false]]]
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:381)

Ce qui est trompeur la-dedans, c’est que c’est la même exception lancée par la Tomcat JVM quand le certificat du serveur CAS n’est pas reconnu par le client!

La solution

Enfin, la solution n’a rien d’étoinnant: Il suffit d’ouvrir le port TCP sortante 443 (celui utilisé par le protocole HTTPS) pour permettre au client CAS d’ouvrir des connexions vers le serveur CAS. Avec iptables, cela se résume à la commande suivante, à ajouter dans votre fichier de configuration de pare-feu:

# CAS CLIENT iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

Voilà.

Les proxies sous Java

décembre 4th, 2007

Lors du TP3 du cours INF510 (JEE), les élèves travaillant sur les machines de l’école ont rencontré des problèmes de connexion au Web Service “Dictionary” (ConnectionTimeout). Grace aux recherches dévoués de deux d’entre vous (Messieurs Roche et Allard), nous avons pu identifier le problème - qui est lié à la configuration des proxies sous Java - et proposer une discussion et une solution.

Cette discussion présente comment configurer le proxy utilisé par une JVM entière. Cela permet de resoudre notre problème de connexion à un Web Service sur l’Internet, puisque Axis, tournant dans une JVM, est soumis à la configuration de cette dernière.

Néanmoins, depuis Java 5.0 il existe de nouvelles méthodes plus fines de gérer des proxies sous Java. Celles-ci ne sont pas présentées ici parce que je ne suis pas sûr que Axis en profite … Pour plus de précisions sur ces nouvelles méthodes, consulter l’article de Sun très complèt ici.

Rappels sur les proxies

Un proxy server est un ordinateur intermédiaire placé entre l’ordinateur de l’utilisateur et l’Internet. Imposé par l’administrateur (qui en même temps pourrait désactiver tout connexion directe à l’Internet), il remplit deux rôles :

  1. Pare-feu, il filtre le contenu pour sécuriser le réseau locale et bloquer du contenu indésirable;
  2. Cache, il stocke temporairement en locale le contenu lu, pour améliorer la performance des futurs accès au même contenu.

Cela a donc nécessairement un impact sur tout programme Java qui voudrait ouvrir une connexion vers l’Internet, tel qu’une webapp qui tente de contacter un Web Service sur l’Internet: Une mauvaise configuration du proxy fera échouer les connexions sortantes.

Configurer le proxy d’une JVM

Jusqu’à Java1.4, la configuration du proxy se faisait au niveau d’une JVM, utilisant des propriétés du système définies soit dans le code, soit sur la ligne de commande au lancement de la JVM. Cette méthode fonctionne toujours dans les dernières version de Java. Les propriétés du système qui définissent la configuration du proxy sont:

  • http.proxyHost: l’adresse du proxy server
  • http.proxyPort: le port du proxy server (par défaut 80)
  • http.nonProxyHosts: Une liste d’hôtes auxquels il faut se connecter directement, sans passer par le proxy. C’est une liste d’expressions régulières séparées par “|”.
  • http.proxyUser: Compte facultatif d’authentification par le proxy.
  • http.proxyPassword: Mot de passe facultatif pour authentification par le proxy.

Depuis Java 5.0+ il est également possible de tenter de récupérer la configuration du proxy définit par le système d’exploitation. Cela demande d’affecter la valeur “true” à la propriété du système nommé “java.net.useSystemProxies”. Si la configuration du S/E du proxy n’est pas disponible, la configuration définit pour la JVM est utilisée.

Exemple complèt pour l’ECE, sous Java 5.0+

Sur le réseau fixe à l’ECE, l’addresse et le port du proxy sont les: http-proxy.ece.fr:3128. Donc pour configurer le proxy correctement dans votre code, ajouter les lignes suivantes avant tout accès à Internet, y compris les Web Services:

System.setProperty(”java.net.useSystemProxies”, “true”);
System.setProperty(”http.proxyHost”, “http-proxy.ece.fr”);
System.setProperty(”http.proxyPort”, “3128″);
// code de connexion au réseau

… ou bien démarrer le JVM avec les options comme suit:

$ java -Dhttp.proxyHost=http-proxy.ece.fr \
-Dhttp.proxyPort=3128 \
-Djava.net.useSystemProxies=true \

Considérations Tomcat

Le serveur Tomcat tourne dans sa propre JVM, il est donc essentiel de configurer sa JVM (et ne pas celle d’eclipse) si vous voulez qu’il puisse ouvrir des connexions sortantes, par exemple vers un Web Service.

Si vous configurez les propriétés du système directement depuis votre code, cela ne pose pas de problème, puisque le code sera exécuté par la JVM de Tomcat. Par contre, si vous configurer les propriétés du système sur la ligne de commande, il faudrait ajouter les arguments au script de démarrage de Tomcat.

Détecter la configuration du proxy

Pour déboguer vos éventuelles difficultés de connexion, le petit programme ci-dessous permet d’afficher la configuration du proxy de la JVM dans laquelle il tourne. Notez que ce programme utilise les nouvelles classes Proxy et ProxySelector, introduit dans Java5.0, et ne fonctionnera donc pas sous Java 1.4-.

// imports ..
public class DetectProxy
{
public static void main(String[] args) throws Exception
{
System.setProperty("http.proxyHost", "http-proxy.ece.fr");
System.setProperty("http.proxyPort", "3128");
System.setProperty("java.net.useSystemProxies","true");
List proxyList = ProxySelector.getDefault().select(
new URI("http://www.yahoo.com/"));
for (Proxy proxy : proxyList)
{
System.out.println("Proxy type : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if (addr == null)
System.out.println("DIRECT CONXN");
else
System.out.println("Proxy hostname : " +
addr.getHostName() + ":" +
addr.getPort());
}
}
}

Eclipse Europa pour Développement JEE (et son bug)

novembre 13th, 2007

Une distribution eclipse comprend l’éditeur eclipse de base, accompagné d’un ensemble de extensions ou plugins fournissant des fonctionnalités spécialisées.

La distibution d’eclipse dit Java IDE for Java EE Developers est une distribution consacrée au développement d’applications Java (JSE) et Java Enterprise Edition (JEE). Il comprend une riche ensemble de plugins, notamment un compilateur incrémental, un éditeur graphique de HTML/JSP/JSF, des outils de gestion de bases de données, et intégration des serveurs d’applications les plus populaires, dont Apache Tomcat.

La dernière distribution à ce jour est nommé Europa, et corresponde à la sortie annuelle en automne 2007 des 21 distributions eclipse différentes en simultanée (un jalon annuel majeur pour le projet eclipse). Les distributions Europa du Java IDE for EE Developers pour Windows, Linux et MacOS sont téléchargeables ici.

Bug - OutOfMemoryError

La version d’eclipse (3.3.1) inclut dans la distribution Europa contient malheureusement un bug particulièrement pénible, rendant l’utilisation d’eclipse pour des projets JEE pratiquement impossible à cause de plantages fréquentes.

Cela concerne la configuration du mémoire alloué au JVM pour le stockage de ses données permanents - les Strings, les noms de classes, etc. Le plus souvent cela ne pose pas de problème, mais le paquetage JEE étant très grand, l’espace mémoire alloué par défaut (64M dans le Sun JVM) est vite épuisé, et quand cela arrive, eclipse plante.

Pour vérifier si vous êtes victime de ce bug, cherchez le texte “java.lang.OutOfMemoryError: PermGen space” dans le log d’eclipse. Le log se trouve dans le sous-répertoire .metadata de votre Workspace.

Le bug est facile à contourner. Il suffit de configurer des valeurs initiale et maximale suffisantes pour le mémoire permanent (PermSize) au lancement d’eclipse. Les valeurs ci-dessous devrait suffire dans la plupart des cas:

eclipse -vmargs -XX:PermSize=64M -XX:MaxPermSize=128M

On peut sinon spécifier ces paramètres dans le fichier de configuration d’eclipse,  $ECLIPSE_HOME/eclipse.ini:

-vmargs
-XX:PermSize=64M
-XX:MaxPermSize=128M

Ce bug est documenté ici.

Apart ce bug, qui n’existe que depuis la version 3.3.1, eclipse est très stable. Donc une fois corrigé, vous devriez pouvoir développer vos applications web en toute tranquilité et avec grande efficacité.

Project Management Quotes

novembre 12th, 2007

Quotes from and reproduced by Frederick P Brooks in The Mythical Man-Month - a seminal text on software project management, as valid today as it was when it was first published 32 years ago (in 1975!)

Below is a simple list of quotes, open to remarks and discussion.

“How does a project get to be a year late? … One day at a time.”

Frederick P Brooks

“Good cooking takes time. If you are made to wait, it is to serve you better, and to please you.”

Menu of restaurant Antoine, New Orleans

“Add little to little and there will be a big pile.”

Ovid

“He’ll sit here and he’ll say ‘Do this! Do that!’ And nothing will happen.”

Harry S Truman on presedential power

“Practice is the best of all instructors.”

Publilius

“Experience is a dear teacher, but fools will learn at no other.”

Poor Richard’s Almanac

“There is nothing in this world constant but inconstancy.”

Swift

“It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something.”

Franklin D Roosevelt

“A good workman is known by his tools.”

Proverb

“What we do not understand we do not possess.”

Goethe

“Whoever thinks a faultless piece to see,
Thinks what ne’er was, nor is nor e’er shall be.”

Alexandre Pope

“I know of now way of judging the future but by the past”

Patrick Henry

“You can never plan the future by the past.”

Edmund Burke