Sunday, March 18, 2012

Text: Swivel Animations

I just wrapped another great year at SXSW. As expected: after 5 days of back-to-back sessions I'm exhausted, my brain is full, my feet are sore, and all the wonderful innovative ideas I have bubbling up inside won't really see the light of day at work because, well, pesky reality keeps getting in the way.

They always encourage you to tweet during SXSW sessions. Sometimes moderators actually refer to the tweets during each session to redirect the conversation or answer questions. During one session instead of presentating slides or a close up of the speaker: the projectors simply showed live tweets. But they were all at right angles to each other, and the camera swiveled around to focus on each one. I wish I knew exactly what program did that (can anyone tell me?), but I decided I wanted to achieve the same effect.

The Plan

What I want to focus on right now is the core of the animation: manipulating AffineTransforms to zoom in, out, and swivel around a large static canvas. To achieve this I started with a minimal interface:
public interface TransformAnimation {
/**
*
* @param progress a float within [0, 1].
* @return the AffineTransform for the argument.
*/
public AffineTransform getTransform(float progress,int viewWidth,int viewHeight);
}

The piece that followed was also pretty straight-forward: the SwivelPathAnimation is the animation I was looking for. The class itself is very small, but it took a few days to develop because I was trying to develop the UI at the same time. (What good is the animation without a way to test it?)

You construct the animation with a series of Highlight objects. These highlights have a center, a width and height, and an angle of rotation. So if you think of this animation as moving a camera around a page: this controls the placement, zoom and rotation of the camera. Each highlight also keeps track of its duration. When you construct a SwivelPathAnimation you also define the default swivel/transition duration: so each highlight can have its own unique duration, but it's assumed all your transitions should be the same duration.

The path the camera takes is automatic. It is guaranteed to cross the center of each highlight, and it my sincerest hope that it will do so gracefully (without wild curves or excessive detours). This draws on several other articles relating to working with bezier shapes, including this one, possibly this one, and most definitely this one.

Deep inside the animation are controls that ration out the timing as needed. The animation doesn't stop moving when it's displaying a highlight: it just slows down to a very slow speed. Then when it's time for a transition the speed picks back up again.

Here is the applet demo of the finished product:

You can download the applet (source included) here. If the applet doesn't load (or isn't responsive enough), you can also download a sample movie file here. On some browsers/platforms the flicker/animation might be so bad you're better off running the jar as an executable instead of an applet.

The UI

This might (?) be the most complicated UI I've put together for a proof-of-concept applet on my blog so far, so I want to explain it some.

First the easy part: the animation is on the right. Once everything is loaded, just press the play button or drag the slider to see your animation in action.

The left side is the interesting part. The left panel is the overview of the entire canvas. And you can interact with it in a few different ways.

It is populated with the RSS feed from one of my favorite sites: fmylife.com. (As a result: some of the content is for mature audiences. I assume most of my readers are not especially young, though...). So when you see a spinny widget when it starts up: that is what you're waiting on. If you try to view this applet/app without internet connectivity a pre-saved copy of a feed from earlier this week is used instead.

At the bottom of the left panel are a set of controls. I recommend turning down the number of blurbs to about 5 if you want to dabble with the highlights: it makes the UI much more manageable. Now in the overview you can:

  • Click once to create a new highlight.
  • Click and drag an existing highlight to a new location.
  • Click and drag the corner of a highlight to resize it.
  • Shift+click and drag the corner of a highlight to rotate it.
  • Also in the controls below: you can use the "Clear" button at any time to start over.

    The Canvas

    Converting an RSS feed into the layout in the overview took a lot of experimenting. I ended up with a tidy class (only about 100 lines of actual code): the TextClusterPaintable.

    There are a few essential building blocks I had to piece together first, though: the TextBoxPaintable breaks a java.lang.String up into a graphic representation, and the CompositePaintable is the abstract parent of the TextClusterPaintable that lets you compose different Paintables together as part of a bigger canvas. But the TextClusterPaintable is the entity that actually decides where each block of text goes, and at what angle. There's probably room for improvement in this class (it uses a kind of brute-force approach to resolve visual collisions), but it gets the job done for now.

    Extra Effects

    After I had that much working: I went back and looked for ways to improve the animation. The first oddity I noticed was that as you pan around the edges of the canvas: you see a lot of blank space. That is: you can clearly see where there is content and where there is not. This animation is supposed to evoke the feeling of lightly grazing over an unending stream of ideas, so seeing large blank areas off to the side is not the right model.

    So to fix this I decided to tile the canvas. In the CompositePaintable I added an enum titled Tiling:

    The text cluster uses the Tiling.OFFSET model to help reduce the obvious visual effect of a repeating pattern. There is still some white space (depending on how many blurbs we grabbed and how we arranged them), but the overall effect is much better.

    This accentuated a growing performance problem: the text boxes are stored as giant complex java.awt.Shapes. (Because treating them as java.lang.Strings would eventually result in a non-continuous animation: the whole point of rendering Strings vs Shapes is that they are abstract and the toolkit can (and will) optimize how they are rendered. We have to use Shapes to guarantee a continuous animation as we rotate and zoom.) These are not trivial to render, and when you invoke 7 calls to paint(..) instead of 1: a minor annoyance becomes a major obstacle. To address this the CompositePaintable now checks the rotated bounds of each child Paintable against the current clipping.

    Also at this point the animation was black-text-on-white-background. There's a time and place to embrace the "less is more" philosophy, but this was a little extreme. I decided to add a splash of color to the background. Also I decided the background should be at a different depth than the text itself. (That is: imagine the text is 6 inches below the camera, then the background is 4 inches below that.) This contrast of motion -- which hopefully will be so subtle most users won't notice it -- will add to the overall effect of depth and motion.

    I gravitated towards my own collection of tiled images, and eventually settled on one of the more modest (and non-animated) options. The colors were a little too bold (they competed with the text), so I softened them a little. Also at first I applied it as-is -- in a vertical orientation -- but the contrast between vertical and horizontal as the animation swiveled around was too weird. Using 45 degrees looked much better. And lastly I realized: there's no reason the background can't also move. When this particular pattern slides up or down the effect is similar to the Barberpole illusion, so that was a nice touch too.

    The original animation I saw at SXSW had its own special look: only the focused blurb was fully opaque -- all others were translucent. Also the background color would change every time the camera panned around. These are also nice effects, but in this iteration of the project I wanted to work with a static foreground layer. (I'd love to branch out into lots of text effects some day, and then that can be combined with this project for an even nicer effect).

    Conclusion

    There is a slight visual aliasing issue when the text (which is stored as a giant Shape) very slowly moves at an angled direction, but I don't know if that's something we can ever fix.

    Overall this worked out as I'd hoped, and I'd like to keep dabbling with similar effects in the future. Also I'd like to point out that everything in this project (except a few generics and enums) is compatible with Java 1.4 which was written just over a decade ago (in February of 2002). My point is: why didn't we do this kind of thing 10 years ago? The technology is there: we just need to take advantage of it. (Can you tell I just came from SXSW?)

    And lastly: I had to make up a lot of names to complete this project, including "SwivelPathAnimation" and "JFancyBox" and "TextClusterPaintable". If there exist more standardized names for these ideas please let me know and I'll happily refactor my code accordingly.

    Tuesday, March 6, 2012

    Cours en programmation :Notion de base en langage java


    1-  D�finition d�une classe et d�un objet en Java

    La notion de classe est un enrichissement de la notion usuelle de structure en C (struct) en C. Une classe permet de d�finir un type d�objet, �ventuellement compliqu�, associant des donn�es et des proc�dures qui acc�dent � ces donn�es. Les donn�es se pr�sentent sous forme de champ d�sign�s par identificateurs et dot�s d�un type. A une donn�e, on associe un mot cl� qui d�signe l�accessibilit� de cette donn�e.
    Les proc�dures, �galement appel�es m�thodes,
    d�finissent les op�rations possibles sur ces composants. A une m�thode, on associe un mot cl� d�signant l�accessibilit� de cette m�thode. 


    Exemple

    class Point {

    private int _x;
    private int _y;

    public Point()
    {
                              _x = 0 ; _y = 0 ;
    }

    public Point(int x, int y)
    {
                  _x = x ; _y = y ;
    }

    public void avancer(int dx, int dy)
    {
                  _x = _x + dx ; _y = _y + dy ;
    }         

       }


    La classe Point poss�de deux attribut : _x, _y et trois m�thodes Point(), Point(int, int), avancer(int, int).

    Le mot cl� private indique que l�attribut est priv� il ne sera accessible que par les m�thodes appartenant � la classe. Un attribut public est accessible par une m�thode appartenant � une autre classe .

    Remarque

    Le corps (contenu) des m�thodes d�une classe sera d�fini dans la classe elle-m�me.

    Initialisation des objets : constructeur

    Une classe peut d�finir une ou plusieurs proc�dures d�initialisation appel�es constructeurs. Un constructeur est une m�thode avec aucune valeur de retour et qui porte le m�me nom que la classe. S�il existe plusieurs m�thodes dans une classe, elles se distinguent par le type ou le nombre de param�tres :

    Point( ) et Point(int, int) 

    Le constructeur permet de cr�er une instance de la classe. Une instance de classe est dite objet.

    Pour cr�er un Point on va :

    1.      D�clarer un handlesur un Point.

    Point p ; (p est un handle sur un point).

    Remarque

    Un handle est un num�ro. Par exemple, quand une application alloue de la m�moire, le compilateur ne rend pas un pointeur mais un num�ro. Ce num�ro est associ� � une zone m�moire.

    2.      La d�claration seule ne cr�e pas d�objet. Elle associe l�identificateur � une r�f�rence appel�e null qui ne fait r�f�rence � rien.

                       p==Null

    Pour cr�er une instance de la classe point (on dit objet de la classe Point), il faut ex�cuter new en citant un constructeur de la classe Point, avec ses param�tres. La primitive new rend en r�sultat la r�f�rence sur l�objet cr�e, qu�il suffit alors d�affecter � la variable d�clar�e :

    new Point(2,0)

    Point p = new Point(2,0) ;

    destruction des objets: destructeur

    Avec Java, plus besoin d'�crire une fonction destructeur. En effet, il existe un programme appel� 'garbage collector' (ramasseur d'ordures) qui est ex�cut� automatiquement d�s que la m�moire disponible devient inf�rieure � un certain seuil. 

    2 - Compilation et ex�cution d�un programme en java

    Pour compiler un programme en Java, il faut utiliser l�instruction javac suivi du nom du fichier.

    Exemple

    Pour compiler la classe Point, on �crit javac Point.java

    A la fin de la compilation si aucune erreur n�a �t� d�tect�e, le code de base est transform� en byte code et un fichier Point.class est g�n�r�. C�est ce fichier qui sera ex�cut�.

    Pour ex�cuter un programme en Java, on utilise l�instruction java suivi du nom de la classe.

    Exemple

    Pour ex�cuter la classe Point, on �crit java Point

    Remarque

    Quand on �crit un programme en Java il faut �viter de donner au fichier .java un nom diff�rent de la classe. Par exemple, si pour on sauvegarder la classe Point nous choisissons le nom Toto.java � la fin de la compilation le fichier Toto.class sera cr�er. Il y aura ensuite des erreurs au niveau de l�ex�cution (en effet, la classe Toto n�existe pas).

    3-  Notion de primitives

    Souvent on dit que le langage Java est un langage tout objet (tout est instance d'une classe). En fait, ce n'est pas tout a fait vrai. Supposons qu'on aune boucle permettant d'incr�menter u entier 1000 fois, il ne serait pas judicieux de cr�er 1000 un objet pour l'utiliser comme incr�ment (il existe en Java la classe Integer qui pourrait �tre utilis�e mais qui ralentirai �norm�ment le programme avec une cr�ation de 1000 objets Integer). Les concepteurs de Java ont donc dot� ce langage d'une s�rie d'�l�ments particuliers appel�s primitives qui ne sont pas g�r�s de la m�me mani�re en m�moire (voir chapitre 1 du polycopie pour les diff�rentes primitives existantes).

    Diff�rence entre les objets et les primitives

     Les primitives peuvent �tre "envelopp�es" dans un objet provenant d'une classe pr�vue � cet effet et appel�e Wrapper (mot anglais signifiant enveloppeur). Les enveloppeurs sont donc des objets pouvant contenir une primitive et auxquels sont associ�s des m�thodes permettant de les manipuler.

    4 - Affichage sur sortie standard (�cran)


    Pour afficher un commentaire sur �cran, on utilise la m�thode println.

    Pour affiche � toto � sur �cran on �crit System.out.println("toto") (La m�thode println appartient � la classe System.out)

    Exemple

    public class Primitive

    {
    public static void main(String[] arg)
    {
    System.out.println("Primitives:");
    int intA = 12;
    System.out.println(intA);
    int intB = intA;
    System.out.println(intB);
    intA = 48;
    System.out.println(intA);
    System.out.println(intB);

    System.out.println("Objets");
    Entier entierA = new Entier(12);
    System.out.println(entierA);
    Entier entierB = entierA;
    System.out.println(entierB);
    EntierA.valeur = 48;
    System.out.println(entierA);
    System.out.println(entierB);
    }
    }
    class Entier
    {
      int valeur;
       Entier(int v) {valeur=v;}
    }

    Affichage

    Primitives 12 12 48 12
    Objets 12 12 48 48

    5     -   Notions de variables, classe et m�thodes final 

    5.1 -  Variable final

    Une variable d�clar�e finalne peut plus voir sa valeur modifi�e (final int x=1 ;).

    5.2  M�thodes final

    Les m�thodes final ne peuvent pas �tre red�finies dans les classes d�riv�es.

    5.3  Classes final

    Une classe final ne peut �tre �tendue pour cr�er des sous-classes.

    6 -Notions d�attributs et m�thodes static

    6.1  Attribut static

    Un attribut statique (d�clar� avec le mot cl� static : static int x=3) est un attribut partag� par tout les objets de la classe (tout les objet ont la m�me valeur pour cet attribut).

    6.2   M�thode static

    Une m�thode statique (d�clar�e avec le mot cl� static : public static void f( ) ) est une m�thode qui n�a acc�s qu�aux membres static de la classe.

    7-Le mot cl� this

    this d�signe une r�f�rence sur l�objet courant.


    Exemple

    Point(int _x, int _y)
    {         
                this._x = _x ;
                this._y = _y ;
    }

    Pour distinguer le param�tre du constructeur � l�attribut, on utilise le mot cl� this

    8-  Mon premier programme en Java

    Pour pouvoir ex�cuter un programme en Java, il faut d�finir une fonction particuli�re  appel�e : main. Cette m�thode doit �tre contenue dans une classe (le tout objet), elle poss�de un en-t�te obligatoire fix� :

    public static void main(String[] arg)

    static : signifie qu�elle ne pourra faire appel qu�aux champs statiques de la classe
    String[] arg : tableau d�arguments du programme


    Exemple

    class Exemple
    {
                public static void main(String[] arg)
                {
                            System.out.println("Bonjour" ) ;
                }
    }

    9 -Notion de Paquetage

    Un paquetage ou package est un regroupement de classes. On regroupe dans un m�me paquetage des classes ayant une th�matique et des fonctionnalit�s communes. Un paquetage contient des classes et des sous-paquetages.

    Les classes de l�API appartiennent � plusieurs packages (Exemple : java.util, java.awt�). Pour utiliser une classe qui appartient � un package de l�API, on utilise l�instruction import suivi du nom du package.

    Exemple 

    -          Pour utiliser la classe Vector du package java.util on �crit : import java.util.Vector ; au tout d�but du programme.
    -          Pour utiliser toutes les classes du package java.util on �crit : import java.util.* ;

    9.1  Cr�ation de paquetage

    Si vous souhaitez qu�une classe que vous avez cr�e appartienne � un package particulier, vous devez le sp�cifier explicitement au moyen de l�instruction package. Il faudra aussi cr�er un r�pertoire au nom du package et sauvegarder les classes appartenant  au package dans ce r�pertoire.

    Exemple

    package MonPackage

    public class Employe
    {
                �
    }

    La classe Employedoit �tre sauvegarder dans un r�pertoire appel� MonPackage.

    9.2  Package et accessibilit�

    9.2.1        Port�e d�une classe

    La port�e d�une classe est d�finie comme la zone dans laquelle elle est visible. Seules les classes publiques sont accessibles depuis l�ext�rieur du package.

    Modificateur de port�e
    Port�e
    aucun
    Le paquetage
    public
    Partout

    9.2.2 Port�e des membres d�une classe

    *protected : Les membres d�une classe peuvent �tre d�clar�s protected. Dans ce cas, l�acc�s en est r�serv� aux m�thodes des classes d�riv�es, des classes appartenant au m�me package ainsi qu�aux classes appartenant au m�me package que les classes d�riv�es.
    *private :  Acc�s au niveau de la classe
    *public : acc�s partout

    Remarque

    Un attribut sans modificateur (modificateur par d�faut) n�est pas accessible depuis l�ext�rieur du paquet de la classe.

    10 Les tableaux

    10.1 D�claration

    Exemple:

    int[] x o� int x[];

    x est un handle (r�f�rence) correspondant � un tableau qui contient des entiers.

    10.2 Initialisation

    int[] x;
    x = new int[dimension];

    x est un  r�f�rence sur un tableau de taille �gale � dimension

    Remarques


    * Les tableaux de litt�raux peuvent contenir des variables.

    Exemple: int a =1, b= 2;
                    int [ ] y = {a,b};

    �         Si on ne fait pas d'initialisation, une initialisation automatique est alors faite (pour les tableaux de primitives � 0, pour les tableaux de handles � null)

    10.3 Taille des tableaux

    La taille d'un tableau est fixe. N�anmoins, il n'est pas n�cessaire qu'elle soit connue au moment de la compilation.

    Exemple

    Import java.util.*;
    class Test2
    {
    public static void main(String[] arg)

    {

    int x = Math.abs((new Random())%10;
    int[] y;
    y = new int[x] ;
    System.out.println(x);
    }
    }

    Dans ce cas, on peut conna�tre la taille d'un tableau avec le champs length (System.out.println(y.length)).

    10.4 Les tableaux multi-dimensionnels

    Syntaxe

    int[][] x;
    x = new int[2][4];

    Initialisation


    int[][] x = {{1,2,3,4}, {5,6,7,8}};

    11    Les cha�nes de caract�res

    En Java, les cha�nes de caract�res sont des objets. Ce sont des instances de la classe String. Java utilise une approche particuli�re, en effet, les contenus des cha�nes de caract�res ne peut plus �tre modifi� une fois initialis� ( Les cha�nes de caract�res se comportent comme des primitives).

    Exemple 

    public class chaines

    {
    public static void main(String[] arg)

    {
    String chaineA = new String ("chaine1");
    System.out.println(chaineA);

    String chaineB = chaineA;
    System.out.println(chaineB);

    ChaineA = "chaine2";
    System.out.println(chaineA);
    System.out.println(chaineB);}}

    R�sultat

    cha�ne1 cha�ne1 chaine2 chaine1

    Bien que les cha�nes sont des objets, ils se comportent ici comme des primitives. Cela est d� au fait que les cha�nes ne peuvent �tre modifi�es.

    Remarque 

    Java dispose d'une autre classe, appel�e StringBuffer, qui permet de g�rer des cha�nes dynamiques.

    11.1          La classe "StringBuffer"

    La classe StringBuffer permet de modifier des cha�nes de caract�res notamment gr�ce � la m�thode append( ).

    Exemple

    StringBuffer chaine;
    chaine = new StringBuffer ("Bon");
    chaine.append("jour");
    System.out.println(chaine);

    Affichage

    Bonjour


    11.2 Quelques m�thodes relatives � la classe "String"

    Concat�nation

    Les cha�nes de caract�res peuvent �tre concat�n�es

    Exemple 

    String chaine1 =  "Bonjour";

    String chaine2 = "tout le monde";
    chaine 1 = chaine1 + chaine2; // cr�ation d'une cha�ne constante "bonjour tout le monde et affectation � la variable chaine1

    La m�thode length( ) 

    length( ) retourne le nombre de caract�res de la chaine.

    La m�thode equals( )

    equals( ) permet de tester l'�galit� de deux cha�nes de carat�res

    Remarque

    L'emploi de l'op�rateur = = pour tester l'�galit� de 2 cha�nes n'est pas correct ( = = teste l'�galit� des r�f�rences des variables et non celles de leurs contenus).

    La m�thode substring( )

    La m�thode substring ( ) extrait une sous-cha�ne d'une cha�ne donn�e. La sous-cha�ne commence � l'indice donn� en premier argument et se termine � l'indice donn� en second argument.

    Exemple  

    String chaine;
    String chaine1;
    chaine1.substring(2,6);

    Monday, March 5, 2012

    Cours en programmation : les g�neralit� en JAVA



     1   - Qu�est-ce que Java ?

    Le langage Java a �t� introduit par la soci�t� SUN en 1995. Il poss�de de nombreuses caract�ristiques 
    -   C�est un langage orient� objet
    -  C�est un langage compil� : avant d��tre ex�cut�, il doit �tre traduit dans le langage de la machine sur laquelle il doit fonctionner
    -          Il emprunte sa syntaxe en grande partie du langage C




    -  Les programme Java peuvent �tre ex�cut�s sous forme d�applications ind�pendantes ou distribu�es � travers le r�seau et ex�cut�es par un navigateur Internet sous forme d�applets.

    2        Pourquoi utiliser Java ? 

    2.1  Le monde sans Java

    Avec les langages �volu�s courant (C++, C, etc.) nous avons pris l�habitude de coder sur une machine identique � celle qui ex�cutera nos applications ; la raison est fort simple : � de rares exceptions pr�s les compilateurs ne sont pas multi-plateformes et le code g�n�r� est sp�cifique � la machine qui doit accueillir. Nous devons alors utiliser ncompilateurs diff�rents sur nmachines. Aujourd�hui, la g�n�ralisation des interfaces graphiques et l�usage de langage plus �volu�s compliquent encore d�avantage le probl�me. Ainsi pour d�velopper une application destin�es � plusieurs syst�mes d�exploitation avec ses diff�rentes couches de librairies et d�interfaces ; les API de ces interfaces �tant toutes diff�rentes. Ainsi nos applications sont fortement d�pendantes des ressources (y compris graphique) du syst�me h�te, d�pendantes des API des interfaces utilis�es, et le code produit ne peut s�ex�cuter que sur le syst�me pour lequel il a �t� initialement produit.

    2.2  Le monde avec Java 

    Tout d�abord, Java simplifie le processus de d�veloppement : quelle que soit la machine sur laquelle on code, le compilateur fournit le m�me code. Ensuite, quel que soit le syst�me utilis� cet unique code est directement op�rationnel:  En effet, la compilation d�un source Java produit du pseudo-code (byte code) Java qui sera ex�cut� par tout interpr�teur Java sans aucune modification ou recompilation. Cet � interpr�teur � est couramment d�nomm� � machine virtuelle Java �.

    3        Utilisation du JDK (Kit de d�veloppement Java)

    Permet le d�veloppement de programmes en Java. Il est constitu� de plusieurs outils tel que :

    -          javac.exe : compilateur
    -          java.exe : interpr�teur
    -          jdb.exe : debugger�
    et d�une importante librairies de classe (API).

    T�l�chargement :


    Configuration :

    Chemin d�acc�s aux ex�cutables

    En supposant que vous avez choisi la version windows 98. Vous devez modifier la variable PATHdu fichier autoexec.bat :

    -          Ouvrez � l�aide d�un �diteur de texte, le fichier autoexec.batse trouvant dans la racine du disque dur
    -          Localisez la ligne commen�ant par set path et ajoutez � la fin de celle-ci : set path = c:\jdk1.2\bin

    La variable d�environnement �path� indique � Windows le chemin d�acc�s qu�il doit utiliser pour trouver les programmes ex�cutables.  Windows cherche les programmes ex�cutables tout d�abord dans le dossier � partir duquel la commande est tap�e, puis dans les dossiers dont les chemins d�acc�s sont indiqu�s par la variable � path �.
      
    Chemin d�acc�s aux classes Java

    Le chemin d�acc�s aux classes Java peut �tre configur� exactement de la m�me fa�on � l�aide de la variable classpath.

    4        Syntaxe du langage Java

    4.1  Type de variables

    En Java on dispose des m�mes types qu�en langage C (int, float, char�). On dispose d�en plus du type boolean (1 bit). Ce type a deux valeurs possibles false et true (initialisation � false).

    4.2  Op�rateurs

    Op�rateurs arithm�tiques

    +          -           *          /           %         ++       --

    Op�rateurs d�affectation

    =          +=       -=        *=        /=

    Op�rateurs de comparaison

    <          >          <=       >=

    Op�rateurs logiques

    !           &&      ||         


    4.3  Structures de contr�le et d�branchements

    Boucles r�p�titives

    while               do�while                  for

    Instructions pour faire des choix       

    if�else           switch�case

    5 Principe de la programmation en Java : l�orient� objet

    Un programme structur� (Pascal, C�) est compos� de fonctions ind�pendantes constitu�es d�instructions simples et structur�s.  Ainsi, les donn�es et les fonctions qui op�rent sur elles sont s�par�es. Les donn�es apparaissent g�n�ralement en t�te du programme et sont donc visibles de toutes les fonctions qui suivent. Cette organisation pose le grave probl�me des effets de bord. En entrant dans une fonction, on est jamais assur� de trouver les donn�es dans l��tat attendu, car n�importe quelle autre fonction, m�me si ce n�est pas son r�le, peut les modifier. De plus, � cause de cette s�paration entre donn�es et fonctions, de profonds bouleversements du programme sont n�cessaires quand les structures de donn�es sont modifi�es. La solution � ces probl�mes est la programmation objet. Elle est bas�e sur trois principes fondamentaux : l�encapsulation, l�h�ritage, et le polymorphisme.

    5.1 L�encapsulation

    L�encapsulation des donn�es est le premier et le plus important des concepts de la programmation objet. Il stipule que les donn�es et les fonctions qui op�rent sur elles sont encapsul�es dans des objets. Les seules fonctions a �tre autoris�es � modifier les donn�es d�un objet sont les fonctions appartenant � cet objet. Depuis l�ext�rieur d�un objet, on ne peut le modifier que par des fonctions faisant office d�interface. Ainsi, il n�est plus � craindre que des fonctions modifient ind�ment des donn�es.

    5.2 L�h�ritage  

    Les objets, comme les donn�es, poss�dent un type que l�on appelle classe. Les classes peuvent �tre organis�es en hi�rarchies, chaque classe h�ritant de sa classe m�re ou super-classe. L�h�ritage est ainsi source d��conomie de code, une classe peut �tre d�finie comme la descendante d�une classe (ou sous-classe).


    5.3 Le polymorphisme 

    Le troisi�me principe de base de la programmation objet est le polymorphisme. Il passe plus inaper�u que les pr�c�dentS. Des fonctions diff�rentes dans les classes diff�rentes peuvent prendre le m�me nom. Ainsi, dans une hi�rarchie de classes d��l�ments graphiques la fonction dessiner( ) aura le m�me nom pour un polygone ou un cercle, cependant les techniques utilis�es pour dessiner ces �l�ments sont diff�rentes. Le polymorphisme est beaucoup plus puissant qu�il n�y para�t � premi�re vue. Il fait �conomiser des identificateurs de fonctions et rend les notations plus lisibles.

    Saturday, February 25, 2012

    Liens pratiques de la semaine

    Vous trouverez dans ce billet une s�lection de liens pratiques autour des technologies Eclipse qui m'ont particuli�rement int�ress�es ces derni�res semaines.   

    Eclipse
    • Pour rappel, en juin 2012 sortira la version Eclipse Juno. Le nom de la version qui suivra Juno sera Kepler. Elle sortira aux alentours de juin 2013.
    • Eclipse 3.7.2 est sortie. Les nouveaut�s de cette nouvelle version sont r�sum�es sur cette page.
    • Un billet qui donne des nouvelles sur le projet Nebula qui, pour rappel, fournit un ensemble de composants graphiques. Parmi les nouveaut�s, nous remarquerons les composants Picture Control et Pagination Control fournis par Angelo Zerr et Pascal Leclerq. 
    • La prochaine version d'Eclipse Juno est disponible en milestone M5 qui sera align�e avec la version Eclipse 4.2 (page des nouveaut�s et page de t�l�chargement). A noter �galement que l'outil de recommandations de code (Eclipse Code Recommenders) sera int�gr� dans les distributions pour le d�veloppement d'Eclipse RCP et RAP.

    Saturday, February 4, 2012

    Limiter le nombre de lignes � l'aide d'une s�lection : SQL sous oracle




    Lors de l'extraction de donn�es de la base, il est parfois n�cessaire de restreindre le nombre de lignes renvoy�es ou de pr�ciser l'ordre d'affichage de ces lignes. Cet article pr�sente les instructions SQL � utiliser � cet effet.



    Limiter le nombre de lignes � l'aide d'une s�lection :




    Dans l'exemple au-dessus, nous souhaitons afficher tous les employ�s du service 90. Seules les
    lignes dont la colonne DEPARTMENT_ID contient la valeur 90 sont renvoy�es. Cette m�thode de
    restriction est la base de la clause WHERE dans SQL.


    Limiter le nombre de lignes s�lectionn�es:




    Vous pouvez limiter le nombre de lignes renvoy�es par l'interrogation � l'aide de la clause WHERE. Cette
    clause comporte une condition � satisfaire et se place imm�diatement apr�s la clause FROM. Si la
    condition est vraie, la ligne r�pondant � la condition est renvoy�e.
    Explication de la syntaxe :
    WHERE                         limite l'interrogation aux lignes qui remplissent la condition concern�e
                                          condition se compose de noms de colonne, d'expressions, de constantes et d'un
                                           op�rateur de comparaison
    La clause WHERE          peut comparer des valeurs dans des colonnes, des litt�raux, des expressions
                                           arithm�tiques ou des fonctions. Elle se compose de trois �l�ments :
    � Nom de colonne,
    � Condition de comparaison,
    � Nom de colonne, constante ou liste de valeurs.



    Utiliser la clause WHERE: 


    Dans l'exemple, l'instruction SELECT extrait le nom, l'ID de poste et le num�ro de service de tous les
    employ�s dans l'ID de poste est SA_REP.
    L'intitul� de poste SA_REP a �t� indiqu� en majuscules pour garantir sa correspondance avec la colonne
    d'ID de poste de la table EMPLOYEES. En effet, la recherche tient compte des majuscules/minuscules
    dans les cha�nes de caract�res.





















    Cha�nes de caract�res et dates : 


    Dans la clause WHERE, les cha�nes de caract�res et les dates doivent �tre plac�es entre apostrophes
    (' '), ce qui n'est pas le cas des constantes num�riques.
    Toutes les recherches de caract�res tiennent compte des majuscules/minuscules. Dans l'exemple cidessous,
    aucune ligne n'est renvoy�e car tous les noms stock�s dans la table EMPLOYEES comportent
    indiff�remment des majuscules et des minuscules.
    SELECT last_name, job_id, department_id
    FROM employees
    WHERE last_name = 'WHALEN';
    Dans les bases de donn�es Oracle, les dates sont stock�es dans un format num�rique interne repr�sentant
    le si�cle, l'ann�e, le mois, le jour, les heures, les minutes et les secondes. Le format de date par d�faut est
    DD-MON-RR.



    Conditions de comparaison :




    Ces op�rateurs de comparaison s'utilisent dans des conditions qui comparent une expression avec une autre
    valeur ou expression. Dans la clause WHERE, ils s'utilisent de la fa�on suivante :
    Syntaxe
    ... WHERE expr operator value
    Exemple :
    ... WHERE hire_date='01-JAN-95'
    ... WHERE salary>=6000
    ... WHERE last_name='Smith'
    Vous ne pouvez pas utiliser d'alias dans la clause WHERE.
    Remarque : Les symboles != et ^= peuvent �galement repr�senter la condition "diff�rent de".



    Utiliser des conditions de comparaison:


    Dans l'exemple, l'instruction SELECT extrait de la table EMPLOYEES le nom et le salaire des employ�s
    dont le salaire est inf�rieur ou �gal � 3000. La valeur explicite 3000 est fournie dans la clause WHERE.
    Elle est compar�e au salaire dans la colonne SALARY de la table EMPLOYEES.


    Autres conditions de comparaison :



    Condition BETWEEN :




    La condition BETWEEN permet d'afficher des lignes en fonction d'une plage de valeurs. La plage que
    vous indiquez comprend une limite inf�rieure et une limite sup�rieure.
    Dans l'exemple de la diapositive, l'instruction SELECT renvoie les lignes de la table EMPLOYEES
    correspondant aux employ�s dont le salaire est compris entre 2 500 $ et 3 500 $.
    Les valeurs indiqu�es avec la condition BETWEEN sont inclusives. Vous devez pr�ciser d'abord la limite
    inf�rieure.



    Condition IN :




    Pour v�rifier si des valeurs sont incluses dans un ensemble donn�, utilisez la condition IN, �galement
    nomm�e condition d'appartenance.
    L'exemple de la diapositive consiste � afficher le num�ro, le nom, le salaire et le num�ro de manager de
    tous les employ�s dont le num�ro de manager est 100, 101 ou 201.
    La condition IN peut s'utiliser avec n'importe quel type de donn�es. Dans l'exemple suivant, une ligne de
    la table EMPLOYEES est renvoy�e pour chaque employ� dont le nom figure dans la liste de la clause
    WHERE :

    SELECT employee_id, manager_id, department_id
    FROM employees
    WHERE last_name IN ('Hartstein', 'Vargas');


    Si vous utilisez des caract�res ou des dates dans la liste, placez-les entre apostrophes (' ').




    Condition LIKE :





    Il est possible que vous ne connaissiez pas toujours les valeurs exactes � rechercher. Vous pouvez
    s�lectionner des lignes correspondant � une suite de caract�res � l'aide de la condition LIKE. L'op�ration
    ainsi ex�cut�e est appel�e recherche g�n�rique. Deux symboles sont disponibles pour construire la cha�ne
    de recherche :


    %   --------->  Repr�sente n'importe quelle s�quence de z�ro ou plusieurs caract�res.
    _    --------->  Repr�sente n'importe quel caract�re.


    Dans l'exemple , l'instruction SELECT extrait de la table EMPLOYEES les pr�noms des employ�s commen�ant par un S majuscule. Les pr�noms commen�ant par un s minuscule ne sont pas renvoy�s.
    Vous pouvez utiliser la condition LIKE en tant que raccourci pour certaines comparaisons de type
    BETWEEN. L'exemple suivant permet d'afficher le nom et la date d'embauche de tous les employ�s
    recrut�s entre janvier et d�cembre 1995 :
    SELECT last_name, hire_date
    FROM employees
    WHERE hire_date LIKE '%95';



    Conditions NULL :


    Les conditions NULL comprennent les conditions IS NULL et IS NOT NULL.
    La condition IS NULL recherche des valeurs NULL, c'est-�-dire des valeurs indisponibles, non
    attribu�es, inconnues ou inapplicables. Il est donc impossible de rechercher une valeur NULL � l'aide de
    l'op�rateur "=" puisqu'elle ne peut r�pondre � aucune condition d'�galit� ou d'in�galit�. L'exemple de la
    diapositive permet d'extraire le nom et le manager de tous les employ�s qui n'ont pas de manager.
    Par exemple, pour afficher le nom, l'ID de poste et la commission de tous les employ�s NON habilit�s �
    toucher une commission, utilisez l'instruction SQL suivante :
    SELECT last_name, job_id, commission_pct
    FROM employees
    WHERE commission_pct IS NULL;





    Conditions logiques :


    Une condition logique combine le r�sultat de deux conditions afin de produire un r�sultat unique ou
    inverse le r�sultat d'une condition. Une ligne est renvoy�e uniquement si le r�sultat global de la condition
    est vrai. Dans SQL, trois op�rateurs logiques sont disponibles :
    � AND
    � OR
    � NOT
    Tous les exemples pr�sent�s jusqu'ici ne proposaient qu'une seule condition dans la clause WHERE. En
    utilisant les op�rateurs AND et OR, vous pouvez inclure plusieurs conditions dans une m�me clause
    WHERE.



    Op�rateur AND :




    Dans l'exemple, les deux conditions doivent �tre vraies pour qu'un enregistrement soit s�lectionn�. Ainsi,
    seuls les employ�s dont l'intitul� de poste contient la cha�ne MAN et qui gagnent au moins 10 000 $
    seront s�lectionn�s.
    Toutes les recherches de caract�res font la distinction entre les majuscules et les minuscules. Aucune ligne
    n'est renvoy�e si la cha�ne MAN n'est pas enti�rement en majuscules. Les cha�nes de caract�res doivent
    �tre plac�es entre apostrophes.



    Op�rateur OR :




    Dans l'exemple, l'une des conditions doit �tre vraie pour qu'un enregistrement soit s�lectionn�. Ainsi, tout
    employ� dont l'ID de poste contient la cha�ne MAN ou qui gagne au moins 10 000 $ est s�lectionn�.



    Op�rateur NOT :




    Dans l'exemple , le nom et l'ID de poste de tous les employ�s dont l'ID de poste est diff�rent de IT_PROG, ST_CLERK ou SA_REP s'affichent.




    Wednesday, February 1, 2012

    Ecrire des instructions SQL SELECT �l�mentaires : SQL sous Oracle

    Pour extraire des donn�es de la base, vous devez utiliser l'instruction SQL (Structured Query Language) SELECT. Il est parfois n�cessaire de restreindre le nombre de colonnes � afficher. Cet article d�crit toutes les instructions SQL n�cessaires � l'ex�cution de ces actions.



    Diff�rentes fonctions des instructions SQL SELECT:



    Une instruction SELECT permet d'extraire des informations d'une base de donn�es. L'utilisation d'une
    instruction SELECT offre les possibilit�s suivantes :
    � Projection : Cette fonction de SQL permet de choisir les colonnes d'une table qu'une interrogation
    doit renvoyer. Vous pouvez choisir autant de colonnes que vous le souhaitez.
    � S�lection : Cette fonction de SQL permet de choisir les lignes d'une table qu'une interrogation doit
    renvoyer. Divers crit�res de restriction sont disponibles � cet effet.
    � Jointure : Cette fonction de SQL permet de joindre des donn�es stock�es dans diff�rentes tables.
    Les jointures seront d�crites en d�tail dans un chapitre ult�rieur.

    Instruction SELECT �l�mentaire


    Dans sa forme la plus simple, une instruction SELECT comprend :
    � une clause SELECT pr�cisant les colonnes � afficher,
    � une clause FROM sp�cifiant la table qui contient les colonnes r�pertori�es dans la clause SELECT.
    Explication de la syntaxe :

    SELECT                    d�signe une liste r�pertoriant une ou plusieurs colonnes
    *                                 permet de s�lectionner toutes les colonnes
    DISTINCT                permet de supprimer les doublons
    column|expression    permet de s�lectionner la colonne d�sign�e ou l'expression
    alias                           permet d'attribuer des en-t�tes diff�rents aux colonnes s�lectionn�es
    FROM  table            permet de d�signer la table contenant les colonnes

    Remarque : Tout au long de ce cours, nous utiliserons les termes mot-cl�, clause et instruction comme suit :
    � Un mot-cl� renvoie � un �l�ment SQL individuel.
    Par exemple, SELECT et FROM sont des mots-cl�s.
    � Une clause est une partie d'une instruction SQL.
    Par exemple, SELECT employee_id, last_name, ... est une clause.
    � Une instruction est une combinaison d'au moins deux clauses.
    Par exemple, SELECT * FROM employees est une instruction SQL.


    S�lectionner toutes les colonnes de toutes les lignes :


    Vous pouvez afficher toutes les colonnes de donn�es d'une table en pla�ant un ast�risque (*) � la suite du
    mot-cl� SELECT. Dans l'exemple de la diapositive, la table des services (DEPARTMENTS) comporte
    quatre colonnes : DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID et LOCATION_ID. Elle contient sept lignes, une pour chaque service.
    Vous pouvez �galement afficher l'ensemble des colonnes de la table en les �num�rant toutes � la suite du
    mot-cl� SELECT. Par exemple, l'instruction SQL suivante, de m�me que l'exemple de la diapositive,
    affiche toutes les colonnes et toutes les lignes de la table DEPARTMENTS :

    SELECT department_id, department_name, manager_id, location_id
    FROM departments;


    S�lectionner des colonnes sp�cifiques de toutes les lignes :

    Vous pouvez utiliser l'instruction SELECT pour afficher des colonnes sp�cifiques de la table. Pour cela,
    indiquez les noms de colonne s�par�s par des virgules. L'exemple ci-dessus permet d'afficher tous les
    num�ros de service et d'emplacement de la table DEPARTMENTS.
    Dans la clause SELECT, indiquez les colonnes dans l'ordre dans lequel vous souhaitez qu'elles
    apparaissent. Par exemple, pour afficher, de gauche � droite, l'emplacement avant le num�ro de service,
    utilisez l'instruction suivante :
    SELECT location_id, department_id
    FROM departments;




    Expressions arithm�tiques:

    Si n�cessaire, vous pouvez modifier l'affichage des donn�es, effectuer des calculs ou �tudier diff�rents
    sc�narios de simulation � l'aide d'expressions arithm�tiques. Une expression arithm�tique peut contenir
    des noms de colonne, des constantes num�riques et des op�rateurs arithm�tiques.
    Op�rateurs arithm�tiques:

    Les op�rateurs arithm�tiques disponibles dans SQL sont pr�sent�s dans la diapositive. Vous pouvez les
    utiliser dans n'importe quelle clause d'une instruction SQL, except� FROM.


    Utiliser des op�rateurs arithm�tiques:


    L'exemple de l'image d�crit l'utilisation de l'op�rateur d'addition pour calculer une augmentation de
    salaire de 300 $ applicable � tous les employ�s, avec affichage d'une nouvelle colonne SALARY+300.
    La colonne SALARY+300 qui r�sulte de ce calcul n'est pas une nouvelle colonne de la table
    EMPLOYEES ; elle n'est que l'affichage d'un r�sultat. Par d�faut, le nom d'une nouvelle colonne est issu
    du calcul dont elle provient : dans ce cas pr�cis, salary+300.
    Remarque : Le serveur Oracle9i ignore les espaces situ�s avant et apr�s l'op�rateur arithm�tique.

    Alias de colonne:

    Lors de l'affichage des r�sultats d'une interrogation, iSQL*Plus prend g�n�ralement le nom de la colonne
    s�lectionn�e comme en-t�te de colonne. Cet en-t�te n'est pas toujours explicite et s'av�re donc parfois
    difficile � comprendre. L'alias de colonne permet de modifier l'en-t�te.
    Placez l'alias � la suite du nom de colonne dans la liste SELECT en utilisant le caract�re espace en tant
    que s�parateur. Par d�faut, les alias sont en majuscules. Placez l'alias entre guillemets (" ") s'il contient des
    espaces ou des caract�res sp�ciaux (tels que # ou $), ou si les majuscules/minuscules doivent �tre
    respect�es.

    Le premier exemple affiche le nom et le pourcentage de commission de tous les employ�s. Le mot-cl�
    facultatif AS a �t� plac� avant l'alias de colonne. L'utilisation ou l'omission de ce mot-cl� ne modifie pas
    le r�sultat de l'interrogation. Dans l'instruction SQL, les alias de colonne "name" et "comm" sont sp�cifi�s
    en minuscules, alors que les en-t�tes de colonne apparaissent en majuscules dans le r�sultat de
    l'interrogation. En effet, comme mentionn� sur une diapositive pr�c�dente, les en-t�tes de colonne
    s'affichent par d�faut en majuscules.
    Le second exemple affiche le nom et le salaire annuel de tous les employ�s. L'alias Annual Salary a
    �t� plac� entre guillemets car il contient un espace. L'en-t�te de colonne affich� est identique � l'alias de
    colonne.

    Op�rateur de concat�nation:

    L'op�rateur de concat�nation (||) permet de lier des colonnes � d'autres colonnes, � des expressions
    arithm�tiques ou � des constantes afin de cr�er une expression alphanum�rique. Les colonnes situ�es de
    part et d'autre de l'op�rateur se combinent pour former une colonne de r�sultats unique.

    Dans cet exemple, LAST_NAME et JOB_ID sont concat�n�es et re�oivent l'alias Employees. Le nom
    des employ�s et leur ID de poste sont combin�s pour ne former qu'une colonne � l'affichage.
    Le mot-cl� AS plac� devant l'alias simplifie la lecture de la clause SELECT.

    Doublons :

    Par d�faut, iSQL*Plus affiche le r�sultat d'une interrogation sans �liminer les doublons. L'exemple
    ci-dessus affiche la totalit� des num�ros de service de la table EMPLOYEES. Les num�ros de service
    apparaissent plusieurs fois.
    Pour �liminer les doublons dans le r�sultat d'une interrogation, ajoutez le mot-cl� DISTINCT dans la
    clause SELECT, directement � la suite du mot-cl� SELECT. Dans l'exemple ci-dessus, la table
    EMPLOYEES comporte 20 lignes, mais on n'y distingue que sept num�ros de service.
    Vous pouvez sp�cifier plusieurs colonnes � la suite du mot-cl� DISTINCT. Ce mot-cl� agit sur toutes les
    colonnes s�lectionn�es et le r�sultat correspond aux combinaisons distinctes de ces colonnes.

    SELECT DISTINCT department_id, job_id
    FROM employees;