jeudi 20 mai 2010

Idiome pour les icones

Objectif:

Cette page propose une nouvelle technique utilisant les fonctionnalités de java 1.5 pour gérer les ressource de type images efficacement.

La gestion des images en java est une problématique classique qui peut s'avérer fastidieuse si on ne dispose pas d'utilitaire qui effectue la recherche classpath. C'est pourquoi je vous propose une méthode novatrice ayant une utilisation optimale de mémoire: comme les strings chaque instances d'ImageIcon sera un singleton de plus la technique que je propose élimine les difficultés de gestion du classpath.
Comment faire:

* Mettre les fichier png dans un package _____.swing.images. Mettre seulement les fichiers utilisés par l'application et les rajoutés au fur et a mesure.
* Faire une classe final nommé IconsRessources
* Ajouter une champs final public static par icone

package ca.usherbrooke.nicolas.swing.images;
 1 package ca.usherbrooke.nicolas.swing.images;
2
3 import javax.swing.ImageIcon;
4
5 public final class IconRessources {
6 public final static ImageIcon OK_ICON=
7 new ImageIcon(IconRessources.class.getResource("OK.png"));
8 public final static ImageIcon NOT_OK_ICON=
9 new ImageIcon(IconRessources.class.getResource("notOK.png"));
10
11 }


* Pour l'utilisation il suffit de faire un import static de l'icon.

import static ca.usherbrooke.nicolas.swing.images.IconRessources.OK_ICON;
import static ca.usherbrooke.nicolas.swing.images.IconRessources.NOT_OK_ICON;

* Et de l'utiliser comme si la constante était défini dans le fichier

Conséquances:

Les icônes sont tous chargé une seul fois par le classloader au moment de la première référence vers la classe IconRessources

Les icônes seront alloué dans la parti permanente de la mémoire java. Elles ne dérangeront donc pas inutilement le GC

L'utilisation d'une icône devient simple.

Les problématiques de classpath son résolue sans avoir recours à une solution au allures ésotérique.

mercredi 16 décembre 2009

Je ne suis plus sur mon steak .... Merci JP

J'ai découvert l'escalade intérieur, grace à JP du lab.

Je vais pouvoir manger plus de steak maintenant que je bouge.

jeudi 1 octobre 2009

Un peu de concurence

Le sujet

Aujourd'hui j'ai décidé de parler de la Classe Semaphore apparu dans la version 1.5 de java.

Le problème

Le problème que nous allons résoudre en utilisant cette classe est le suivant : Nous avons deux processus d'initialisation qui doivent être exécuter avant de démarrer l'exécution de notre application. Malheureusement, l'appel de la méthode init de ces deux système n'est pas bloquante. Les frameworks utilisés nous permettent cependant d'utiliser un Listener afin d'être notifier de la complétion du processus d'initialisation.

Nous allons représenter les Listeners des deux frameworks par deux TimerTask.

Bien sur il serait possible d'implémenter une solution a se problème en utilisant les primitives de synchronisation (les méthodes wait() notifiy() notifiyAll() ) mais l'utilisation de ces primitives demande de réfléchir car leur utilisation est complexes et elle laisse plein d'endroit pour faire des erreurs.

La solution

Voici le code implémentant la solution au problème en utilisant une sémaphore


1 public class SemaDemo {
2
3 Semaphore gate = new Semaphore(-1);
4 public SemaDemo() {
5 Timer t = new Timer();
6 initFramework1(t);
7 initFramework2(t);
8 try {
9 gate.acquire();
10 } catch (InterruptedException ex) {
11 System.out.println("Initiaslisation failed");
12 System.exit(1);
13 }
14 intitApp();
15 }
16
17 public static void main(String arg[]) {
18 new SemaDemo();
19 }
20
21 protected void initFramework1(Timer t) {
22 t.schedule(new TimerTask() {
23
24 @Override
25 public void run() {
26 System.out.println("framework 1 initiaslized");
27 gate.release();
28 }
29 }, 1000);
30 }
31
32 protected void initFramework2(Timer t) {
33 t.schedule(new TimerTask() {
34
35 @Override
36 public void run() {
37 System.out.println("framework 2 initiaslized");
38 gate.release();
39 }
40 }, 3000);
41 }
42
43 private void intitApp() {
44 System.out.println("Appli initialise");
45 }
46 }

Les explications

Le semaphore est un outil de synchronisation de haut niveau étonament polyvalent. On l'intancie avec un certain nombre de permis. Ces permis sont consommé par un appel à la méthode acquire() et ils sont retournés par l'appel de la méthode release().

Le cas typique d'utilisation de la semaphore est de garder l'accès à une ressource partagé, mais en jouant avec le nombre de permit initial il est possible de l'exploiter a d'autre fin.

Regardons l'exécution de ce programme:
  1. Les 2 méthodes initFramework sont appelées ce qui a pour effet de démarrer deux taches d'arrière plan
  2. L'appel de la méthode acquire() bloque car le nombre de permis est -1
  3. Le premier initFramework termine par un appel à la méthode release() le nombre de permis est maitenant 0
  4. Le deuxième initFramework termine par un appel à la méthode release() le nombre de permis est maintenant 1
  5. La méthode acquire() débloque et le nombre de permis retourne à 0

Conclusion

La classe Semaphore est une façon beaucoup plus convivial que l'utilisation des primitives notify() et wait(). De plus avec un peu d'imagination il est possible de l'utiliser dans beaucoup de problèmes de synchronisation

samedi 19 septembre 2009

Fish and chips

Les Allemands font d'excellents fish and chips. Ceux de Nordsee sont les meilleurs.

Attention traverse de voleur


Du vandalisme bien fait, un superbe exemple d'art urbain.

Je suis un vrai Nerd :)

Je reviens de visiter un musé situe dans un centre de recherche en mathématique discrète.

C'était très intéressant, ça commençait, au quatrième étage, par les premiers systèmes de numération (ex: des os gravés pour tenir le compte de la chasse, le système sumérien, le système babylonien, Le système romain) et l'histoire du zéro.

Au troisième étage c'était le début des machines a calculer, on commençait par les différents types d'abaques et on terminait par la machine a additionner de Pascale. Sur l'étage deux on retrouvait les premières machine 'a multiplier.

L'étage un était consacrée différant type de machine a calculer méchanique, suivit de la construction du transistor, du circuit intégrée, du routage de ces circuits, un explication des architectures d'ordinateur, un mainframe IBM S/390 démonté, la base de la programmation, de la complexité algorithmique et une petite carte illustrant la généalogique des langages de programmation. Il y avait un microscope électronique pour regarder un circuit intégré et c'était vraiment cool !

Bref un excellant musée pour un programmeur curieux de l'histoire des machines centrales a sa profession.

En passant le nom de la place est: Arithmeum

En plus c'était jolie !

vendredi 18 septembre 2009

MobileHCI2009 finit !!!

La conf est finie.
Je suis content d'avoir été dans une conférence sur un sujet auquel je ne suis pas trop compétant; j'ai peut y apprendre un paquet de choses sur l'évaluation de l'efficacité et de l'"enjoyability" des interfaces. Il existe des questionnaires standardisés permettant une analyse quantitative des aspects qualitatifs.

Cependant je dois avouer qu'il n'y a pas de présentation qui mon fait dire: WOW je ne serais jamais capable de faire ça.... Ça me rassure car ça confirme ce que je vis par rapport au développement d'application mobile : c'est difficile. Mais en même temps j'aurais aime voir quelque chose qui me jette par terre ....

Aussi si jamais je retourne a une conférence,je n'y retournerai pas seul... Comme me le disait un collègue (Pierre B.) du DOMUS, je suis un genre de Steve Wozniak (je ne suis certainement pas aussi révolutionnairement brillant, néanmoins je possède une excellente intuition pour les designs technologiques simples et efficaces, j'aime bien faire des chose dans l'ombre et je n'aime pas trop dealer avec le pr....) et je gagnerais beaucoup a être accompagne par un genre de Steve Jobs... Autrement dit la prochaine fois j'ai besoin de quelqu'un comme Pierre B. pour approcher les gens a ma place.

Demain je visite quelque musée et dimanche a 6am je retourne enfin dans mon chers trou si apprécie : Sherbrooke