IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation par agent Java Discussion :

Les communications des agents JADE [Tutoriel]


Sujet :

Programmation par agent Java

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Bonjour tous le monde,
    je veux savoir s'il faut définir un ordre d'exécution entre 2 containers pour qu'un agentA de conteneur 1 peut envoyé des messages à l'agentB du conteneur2 ?
    un exemple pour bien comprendre:
    AgentA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <........>
    public class Agent1 extends Agent {
    protected void setup() {
     
    	System.out.println("Mon nom est: "+getLocalName());
    	addBehaviour(new OneShotBehaviour(this){
    		public void action()
    		{
    			ACLMessage msg=new ACLMessage(ACLMessage.INFORM);
    			msg.addReceiver(new AID("Agent2",AID.ISLOCALNAME));
    			msg.setContent("salut");
    			send(msg);
    		}	
    	});
    <........>
    //doDelete();
    }
    }
    AgentB:
    <........>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Agent2 extends Agent {
    protected void setup() {
    	System.out.println("Mon nom 2 est:"+getLocalName());
    	addBehaviour(new behaviour1());
     
    <........>
    //doDelete();
    }
     
    public class behaviour1 extends OneShotBehaviour{
    	public void action()
    	{
    	    //ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
    	    ACLMessage messageRecu = receive();
    	    if(!(messageRecu.getContent().equalsIgnoreCase("salut"))) block();
    	    System.out.println(messageRecu.getContent());
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java jade.Boot -container Agent1:Agent1
    java jade.Boot -container Agent2:Agent2
    ou bien je dois définir un ordre d'exécution ( FSMBEhaviours ) entre les deux conteneurs ? (Comme l'exemple de Djug dans le tuto des ACLMessage)

  2. #22
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    oui bien sure , pour définir un ordre il faut bien utiliser un FSM behaviour.

    il faut se mettre dans la tète que la programmation des agents est différentes à la programmation classique, les agents sont en générale réactifs, c-a-d il agissent selon leurs environnements extérieurs. on d'autre terme, chaque agent ne va pas exécuter son code de la ligne 0 à la ligne N-1 d'une manière séquentiel, mais il "exécute le bout de cout qui correspond à une réaction dans son environnement extérieure

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Bonjour tous le monde,
    j'ai essayé de faire un programme qui permet de ce déplacer(doMove) d'un conteneur a un autre( dans la même platform ), il m'affiche une erreur :
    GRAVE: Destination Agent1 does not exist or does not support mobility
    voici le code source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import jade.core.AID;
    import jade.core.Agent;
    import jade.core.behaviours.*;
    import jade.core.ContainerID;
     
    public class Agent2 extends Agent{
     
         public void setup(){
     
           addBehaviour(new B());
     
      }
         private class B extends SimpleBehaviour{
     
        	 private boolean _done;
        	 private int step=0;
        	 String name1="Agent1";
     
                public void action(){
     
                 switch(step){
     
                         case 0:
                          System.out.println("Hello");
                          System.out.println("\n\nMoving to Agent1");
                          // ContainerID dest1=new ContainerID("Agent1",null);
                           ContainerID dest1=new ContainerID();
                           dest1.setName(name1);
                          myAgent.doMove(dest1);
                          step++;
                          break;
                      case 1:
                      _done=true;
                      System.out.println("The agent has terminated its itinirary");
     
                              }//end switch
       }//end action
                public boolean done()
                {
                	return _done;
                }
     
     
    } // end setup
    } // end MobileAgent
    Ps: j'ai deux conteneur , agent1 et agent2
    ou est le probléme ?

  4. #24
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    voila comment on fait migrer un agent d'un Container à un autre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // on déclare la variable qui va contenir le nom du Container 
    String containerName = "Container-1";
    ContainerID destination = new ContainerID();
    // on déclare la variable qui represente la destination
    destination.setName(containerName);
    // et on fait la migration
    myAgent.doMove(destination);

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Djug Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // on déclare la variable qui va contenir le nom du Container 
    String containerName = "Container-1";
    ;
    dans mon cas j'ai nommer mon conteneur : Agent1

    et puis même avec sa il m'affiche :
    GRAVE: Destination Container-1 does not exist or does not support mobility

    Merci Djug

  6. #26
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    mais est ce que tu as déja créer le container avec de faire la migration,

    ce code suppose que le container existe


    on peux créer un Container via la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java jade.Boot -container

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    j'aimerai savoir comment je peu être sure que l'agentA a été déplacer avec sucée ? est ce que je peu faire un teste dans le conteneur ou l'agentA a été déplacer?

  8. #28
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    un test sur le nom du container tu permettra de savoir si ton agent est sur le bon Container ou nom

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import jade.core.AID;
    import jade.core.Agent;
    import jade.core.behaviours.*;
    import jade.core.ContainerID;
     
    public class Agent1 extends Agent{
     
         public void setup(){
     
           addBehaviour(new B());
     
                                    }
         private class B extends SimpleBehaviour{
     
        	 private boolean _done;
        	 private int step=0;
     
                public void action(){
     
                 switch(step){
     
                         case 0:
                          System.out.println("Hello");
                          System.out.println("\n\nMoving ...");
     
                       // on déclare la variable qui va contenir le nom du Container 
                          String containerName = "Container-1";
                          ContainerID destination = new ContainerID();
                          // on déclare la variable qui represente la destination
                          destination.setName(containerName);
                          // et on fait la migration
                          myAgent.doMove(destination);
                          step++;
                          break;
                      case 1:
                      _done=true;
                      System.out.println("The agent has terminated its itinirary");
     
                              }//end switch
       }//end action
                public boolean done()
                {
                	return _done;
                }
     
     
    } // end setup
    } // end MobileAgent
    et voici la commande pour que l'agent ce déplace au Conteneur-1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -gui jade.Boot Agent1:Agent1
    java jade.Boot -container Container-1:Agent2
    -j'aimerai bien que tu m'expliques pourquoi sa ne marche pas ? peu tu m'expliquer qu'est ce que je dois faire ?
    -qu'est ce que tu veux dire par :
    Citation Envoyé par Djug Voir le message
    un test sur le nom du container tu permettra de savoir si ton agent est sur le bon Container ou nom
    Merci Djug

  10. #30
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    je viens de testé ton code, il fonctionne bien:

    je crois que tu n'a pas encore compris la notion des Container et comment les agents s'exécutent

    voici comment exécuter ton exemple:

    compiler le code de l'agent, tu va récupérer le résultat de la compilation (les fichiers Agent1.class et Agent1$B.class)

    copier ces fichier vers un dossier dont le chemin apartien à la varible classpath du systeme : par exemple tu va créer un dossier ayant comme nom C:\AgentLand et tu va ajouter ce chemin à la variable classpath du systeme (clique droit sur le poste de travaille >propriétés >avancé> variable d'environnement > double clique sur classpath puis tu rajoutes à la fin du contenu de la variable ;C:\AgentLand (remarque bien le point virgule avant le chemin du dossier)

    lancer la plateforme jade via la commande:

    lancer un nouveau container via la commande (il sera nommé automatiquement container-1 le prochain container sera nommé Container-2 ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java jade.Boot -container
    lancer l'agent agent1 comme suit:

    clique droit sur Main-container > Start new Agent

    taper agent1 dans les champ agent name et agent class

    l'agent se lancera puis se se placera vers le container container-1 puis se terminera (tous va se passer rapidement)

    tu trouvera la trace de son déplacement sur le fenêtre console (fenêtre dos)

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Merci Djug c'est bon il marche.
    j'ai essayer un autre programme qui permet a un agent de ce déplacer et de revenir au conteneur principal et voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import jade.core.AID;
    import jade.core.Agent;
    import jade.core.behaviours.*;
    import jade.core.ContainerID;
     
    public class Agent1 extends Agent{
     
         public void setup(){
           addBehaviour(new B());   
     }
         private class B extends SimpleBehaviour{
     
        	 private boolean _done;
        	 private int step=0;
     
                public void action(){
     
                 switch(step){
     
                         case 0:
                          String containerName = "Container-1";
                          ContainerID destination = new ContainerID();
                          destination.setName(containerName);
                          myAgent.doMove(destination);
                          doWait(5000);
                          System.out.println("je me suis déplacer !!!");
                          step++;
                          break;
     
                         case 1:
                        	 String containerName2 = "Main-Container";
                             ContainerID destination2 = new ContainerID();
                             destination2.setName(containerName2);
                             myAgent.doMove(destination2);
                             doWait(5000);
                             System.out.println("je suis revenu !!!");
                             step++;
                             break;
     
                      case 2:
                      _done=true;
                      System.out.println("The agent has terminated its itinirary");
     
                              }//end switch
       }//end action
                public boolean done()
                {
                	return _done;
                }
     
     
    } // end setup
    } // end MobileAgent
    pourquoi il marche pas ?

  12. #32
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    dans ce genre de situation (la mobilité) il ne faut jamais utiliser le "case of", mais il faut utiliser les FSMBehaviour (je crois que je t'ai déjà parler de ça quelque part ? n'est ce pas )


    un subBehaviour pour l'aller, et un autre pour le retour (et probablement tu aura besoin d'autre état/subBehaviour entre ces deux la)


    en plus, on ne place jamais des instructions juste après la méthode doMove() (il faut créer un nouveau SubBehaviour qui s'exécutera juste le subBehaviour en cours et qui va contenir ces instructions )
    bon courage

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    dans le cas ou j'ai un automate :



    est ce qu'il n'y a pas de risque pour le chemin a prendre dans l'etat A ?
    sinon qu'est ce que je dois faire dans tel cas ?

  14. #34
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    de quelle risque tu parles?

    peux tu l'expliquer un peu plus ?

  15. #35
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    je voulais dire quand je lance l'exécution , sachant que l'état initial c'est A , est ce que par défaut il vas directement a l'état B (par la transition par défaut) ou bien il vas confondre entre la transition vert B et D ?

  16. #36
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    la transaction par défaut est prise dans le cas ou on ne spécifié pas une valeur.

    on tous cas tu peux lancer l'exécution de l'agent pour voir comment il va se comporter

  17. #37
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Djug Voir le message
    la transaction par défaut est prise dans le cas ou on ne spécifié pas une valeur.
    oui je sais tu l'as préciser dans ton Tuto , sauf que la j'ai fait un code et je ne trouve pas l'erreur alors je me suis poser la question !
    Citation Envoyé par Djug Voir le message
    on tous cas tu peux lancer l'exécution de l'agent pour voir comment il va se comporter
    pour l'automate que je t'es montré , j'ai fait un Agent et il commence toujours ( d'aprés mes remarques ) par la transition par défaut

  18. #38
    Expert éminent sénior

    Avatar de Djug
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    2 980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 980
    Points : 17 970
    Points
    17 970
    Par défaut
    juste une petite remarque,

    comme c'est le cas avec ton automate, quand en utilise des automates ayant des boucles (passer par le meme état plusieurs fois, alors il faut les réinitialisé)


    String[] toBeReset : l'ensemble d'état pour lesquels on doit faire un reset() avant de les ré-exécuter parcequ'on peut pas re-éxecuter un Behaviour une autre fois avant de lui faire un reset().

  19. #39
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    malgré sa j'ai pas trouvé pourquoi sa ne marche pas , pourtant avec seulement un déplacement sa marche mais avec 2 déplacements sa ne marche pas.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    import jade.core.Agent;
    import jade.core.behaviours.OneShotBehaviour;
    import jade.core.behaviours.FSMBehaviour;
    import jade.core.AID;
    import jade.core.ContainerID;
    import jade.core. PlatformID;
     
    public class Mimish extends Agent
    {
    	protected void setup(){
    	FSMBehaviour fsm = new FSMBehaviour(this) 
    	{
    		public int onEnd() 
    		{
    			System.out.println("FSM behaviour terminé");
    			myAgent.doDelete();
    			return super.onEnd();
    		}
    	};
    	fsm.registerFirstState (new local(),"A");
    	fsm.registerState(new deplacer1(),"B");
    	fsm.registerState(new deplacer2(),"C");
    	fsm.registerLastState(new retour(),"D");
    	fsm.registerDefaultTransition("A","B",tab);
    	fsm.registerTransition("B","B",1);
    	fsm.registerTransition("B","C",0);
    	fsm.registerTransition("C","C",1);
    	fsm.registerTransition("C","A",0);
    	fsm.registerTransition("A","D",0);
    	//fsm.registerTransition("A","A",1);
     
    	addBehaviour(fsm);
    	}
    	//Inner Class
    	private class local extends OneShotBehaviour
    	{
     
    		public void action() 
    		{	
    			System.out.println("je suis dans le Conteneur principal ...");
    			String containerName = "Container-1";
                ContainerID destination = new ContainerID();
                // on déclare la variable qui represente la destination
                destination.setName(containerName);
                System.out.println("je vais aller au conteneur1 ...");
                // et on fait la migration
                myAgent.doMove(destination);
    		}
    	}
     
    	private class deplacer1 extends OneShotBehaviour
    	{
    		public void action() 
    		{
    			System.out.println("je suis dans le conteneur1 ...");
    			String containerName2 = "Container-2";
                ContainerID destination2 = new ContainerID();
                // on déclare la variable qui represente la destination
                destination2.setName(containerName2);
                System.out.println("je vais aller au conteneur2 ...");
                // et on fait la migration
                myAgent.doMove(destination2);
    		}
    	}
    	private class deplacer2 extends OneShotBehaviour
    	{
    		public void action() 
    		{
    			System.out.println("je suis dans le conteneur2 ...");
    			String containerName3 = "Main-Container";
                ContainerID destination3 = new ContainerID();
                // on déclare la variable qui represente la destination
                destination3.setName(containerName3);
                System.out.println("je vais retourner ...");
                // et on fait la migration
                myAgent.doMove(destination3);
    		}
    	}
     
    	private class retour extends OneShotBehaviour
    	{
    		public void action() 
    		{
                System.out.println("The agent has terminated its itinirary");
    		}
    	}
     
    	//private ContainerID[] dest={};
              private String tab[]={"A"};
     
     
    }
    et voici son automate :

  20. #40
    Nouveau Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mimish Voir le message
    malgré sa j'ai pas trouvé pourquoi sa ne marche pas , pourtant avec seulement un déplacement sa marche mais avec 2 déplacements sa ne marche pas.
    Peut être parce que vous utilisez des OneShotBehaviour.
    J'ai essayé de faire un agent qui se déplace vers 3 containers puis reviens au Main-Countainer, en utilisant un CyclicBehaviour (et switch case..) sans avoir à utiliser FSMBehaviour, et ça marche bien.

Discussions similaires

  1. Communication entre des agents jade
    Par Nouur dans le forum Programmation par agent
    Réponses: 0
    Dernier message: 28/04/2014, 23h39
  2. Communication entre des agents jade
    Par Nouur dans le forum Programmation par agent
    Réponses: 0
    Dernier message: 28/04/2014, 23h36
  3. Pour les fanas des Agents
    Par carla-la-belle dans le forum Windows 7
    Réponses: 2
    Dernier message: 12/11/2009, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo