Vous êtes sur la page 1sur 13

Developpez Magazine

Developpez
Magazine
Edition de Septembre 2005.
Numro 3. Magazine en ligne gratuit. Diffusion de copies conformes loriginal autorise. Directeur de la publication : Bobby Joe Lambert Ralisation : Hugo Etivant Rdaction : la rdaction de Developpez Contact : magazine@redaction-developpez.com

Perl
Dbutez avec facilit et rapidit
page 4 Java....................page 2 C/C++.................page 7 Access.................page 8 .NET....................page 8 SGBD.................page 11 UML...................page 11 Web...................page 11 Pascal................page 12 Delphi................page 12 Liens.................page 13

Developpez.com
Cours .NET

ClickOnce : Le dploiement facile d'applications .NET


ClickOnce est la nouvelle technologie de dploiement d'applications. Cet article vous montrera les diffrentes possibilits que cette technologie vous apporte, tant au niveau du dploiement que de la mise jour de vos applications.
par LEBRUN Thomas et MORAND Louis-Guillaume page 9

Nouvelle FAQ !

Editorial
La rentre 2005 annonce sont lot de nouveauts : une nouvelle rubrique, de nouvelles F.A.Qs... Et comme toujours son contingeant de cours de haute vole, les confrences et autres critiques de livres. Bonne rentre tous !
Developpez Magazine est une publication du site Developpez.com

F.A.Q PostgreSQL
Dcouvrez la nouvelle FAQ PostgreSQL avec dj prs de 50 Q/R. Elle a t ralise partir des contributions des membres du forum PostgreSQL de Developpez.
-> http://dgriessinger.developpez.com/postgresql/faqpg/

Nouvelle rubrique !

InterBase/Firebird
-> http://interbase.developpez.com/

page 1

Developpez.com

Developpez Magazine

Java
Les derniers tutoriels
Drag & Drop avec Style et l'API Lire le cours de Romain Guy (lien 2) Swing Comment pouvons nous nous dbarasser Mixer Java3D et Swing Introduction Log4J
Ce cours est une introduction au systme de journalisation pour java de Jakarta : Tutoriel d'introduction sur l'utilisation de log4j. L'accent est mis sur la faon de le des curseurs de drag & drop simplistes offerts par Java ? La solution rside dans l'API Java3D avec la librairie graphique configurer. Lire le cours de Sbastien Le Ray (lien 5) la dmo Drag n' Ghost que je vais vous Swing. Lire le cours de Romain Guy (lien 3) montrer. Construction d'une application Lire le cours de Romain Guy (lien 1)

A Dmonstration sur l'utilisation de Faces) avec l'EDI NetBeans. RMI composants Swing pour attendre lors de Lire le cours de Olivier SCHMITT (lien Lire le cours de Serge Tah (lien 6) 4) l'excution de tches longues.

Introduction JSF avec MVC distribue avec Spring Attendre avec style et l'API NetBeans Remoting Article dintroduction JSF (Java Server Partie 1 : HttpInvoker, Hessian, Burlap, Swing

Vu dans la F.A.Q Java


conversion explicite. Ainsi, le code suivant est tout fait correct L'auto-boxing gre la transformation des types primitifs : (boolean, byte, char, short, int, long, float, double) vers la classe Integer integer = 0; int j = integer; 'wrapper' correspondante (Boolean, Byte, Character, Short, Map map = new HashMap(); Integer, Long, Float, Double) et inversement pour l'auto- map.put ( 2.1, "Valeur" ); unboxing... Tout est transparent, il n'y a donc plus aucune adiGuba

Qu'est-ce que l'auto-boxing / auto-unboxing ?

Vu dans le blog
Valider les saisies grce aux annotations.
Lors de la rdaction de mon tutoriel sur les annotations, j'ai bien entendu consult plusieurs articles sur le sujet. Parmis ceux-ci, le plus intressant est sans aucun doute celui de Anders Holmgren, publi en mars 2005 sur le site de Sun, et traitant de la possibilit d'ajouter des contraintes de validation sur les proprits d'un bean en utilisant seulement des annotations : Using Annotations to add Validity Constraints to JavaBeans Properties (en anglais bien sr, lien 7). Je vous conseille fortement d'y jeter un coup d'oeil... Tout cela pour dire que je me suis mis en tte de dvelopper une librairie basique pour la validation de formulaire web dans une application J2EE, la manire du plugin Validator de Struts, mais qui utiliserait les Annotations de Java 5.0. Pour le moment, je vois trois principaux modules dans cette librairie: Un module qui se chargera de valider les diffrentes proprits en fonction de leurs contraintes. Un module utilisant APT afin d'effectuer des vrifications lors de la compilation des beans. Un module permettant de gnrer des formulaires HTML dans une page JSP (via des taglibs). adiGuba

F.A.Q Gnral Java


Dj 302 rponses vos questions dont 22 nouvelles. Cette faq a t ralise partir des questions frquemment poses sur les forums de Developpez Lire la F.A.Q : http://java.developpez.com/faq/java/

Confrences
Le symposium JAOO 2005 se droulera sur six jours (du 25 au 30 septembre) Aarhus (Danemark). Elle est la confrence europenne la plus importante autour de l'ingnierie logicielle, des mthodes de dveloppement et "Best practices". Ses centres d'intrts sont les technologies Java, l'orient objet et .Net. Inscriptions : https://secure.eos.dk/registration/ Javapolis 2005 du 12 au 16 dcembre 2005, vous pourrez couter, et mme cotoyer, les personnes qui font vivre Java. Elle se tient dans le complexe cinmatographique Metropolis d'Anvers, en Belgique. Inscriptions : http://www.javapolis.com/jp05reg/

Retrouvez la rubrique Java sur : http://java.developpez.com


page 2

Developpez.com

Developpez Magazine

Java
Critique de livre
Au coeur de Java 2, Volume 2, Fonctions avances JDK 5.0 Cay S Hortsmann & Gary Cornell Editions Campus Press Rfrence inclure l'API XPath. Enfin, un nouveau chapitre a t ajout il Plus de 250 000 program- traite des annotations et des meurs ont utilis Au cur de mtadonnes, des fonctionJava 2 Volume 1- Notions nalits ajoutes au JDK 5.0. fondamentales pour consolider leur savoir sur la Critique technologie Java. Ce second volume va plus loin encore Ce second tome complte et constitue un guide merveille le premier (voir complet pour rsoudre les critique du 1er tome sur problmes quotidiens des developpez.com) dveloppeurs. La cinquime dition du volume 2 entre en Le 1er chapitre a t rcrit, pour dtail dans des sujets tels que entirement la programmation de aborder la nouvelle API l'interface utilisateur et les concernant la Concurrence fonctions professionnelles introduite dans la version 5 de de la plate-forme java 2, Java. Cette nouvelle API met dition standard (JSETM). votre disposition tout un Totalement mis jour, cet ensemble de classes et ouvrage traite les multi- interfaces vous permettant de threads, qui permettent construire plus facilement des d'excuter des tches en applications mutithreads perparallle, l'API JDBC 2.0, formantes que ce qui tait CORBA, le glisser-dposer possible jusqu' prsent. et le modle de scurit Java 2. Ce dernier a t revu pour Le second chapitre, couvrant le JDK 5.0, de faon les Collections, a t tendu prendre en compte les pour aborde la notion de Queue, algorithmes de cryptage la classe PriorityQueue, .... Ce AES et RSA. Les techniques chapitre explique galement les de Swing avances sont tables de hachage, et pourquoi abordes, dont les com- il est important de choisir un posants GUI complexes bon code de hachage. Il aborde d'arbres et de tables, les galement la notion de Weak indicateurs de progression et Reference, bien que cela soit l'implmentation Java d'une trait de faon plus superficielle interface "plusieurs que dans le livre HardCore documents". Un chapitre Java, de chez Oreilly. dcrit les techniques de conception des cadres de J'ai une remarque ngative collections et l'exploitation faire l'encontre des traducdes donnes structurelles teurs. Pourquoi ont il traduit les fondamentales autorises par noms des classes et/ou la bibliothque standard interfaces en franais dans les Java. Cette dition explique figures montrant les anciennes aussi comment internat- classes, comme Vector, Map et ionaliser des applications Properties. Mais cela ne Java, gnrer du XML et concerne qu'une figure sur une utiliser les transformations page dans tout le livre. XSL. Le chapitre consacr au XML a t mis jour pour

Rsum diteur

Je n'ai pas eu l'impression qu'il y a beaucoup de modification concernant les chapitre 3 10 par rapport l'ancienne version. Mme si le chapitre sur la scurit couvre maintenant AES et RSA, et que le chapitre XML couvre XPATH. Mais cela est assez concis et rien de tel qu'un ouvrage de rfrence sur XML et XPATH. Et que les exemples ont t revus. Par exemple, dans le chapitre 9, il expliquent comment appeler une mthode printf depuis Java. Le chapitre 11 concernant les annotations est quant lui tout fait nouveau et vous explique en dtails. Il aborde galement BCEL, qui vous permet de manipuler directement du ByteCode. Pour ceux qui possdent une ancienne dition de ce deuxime tome , l'achat de celui ci vous sera utile si vous voulez connaitre les nouveauts introduites au niveau du Multithreading, des collections, des certificats RSA et AES, et connaitre les annotations. Pour ceux qui ne possedent pas d'ancienne dition de ce deuxime tome, je ne peux que vous conseiller ce livre de rfrence. En tout cas, si vous avez achet rcemment la dernire dition du Tome 1, n'hsiter pas acheter son compagnon. Vincent Brabant

Livraison gratuite sur Amazon

ISBN: 2-7440-1962-3

858 pages juin 2005

Retrouvez la complte (lien 7)

critique

page 3

Developpez.com

Developpez Magazine

Perl
I. Conditions en Perl

Apprendre Perl rapidement, 2me partie


Dans la premire partie, nous avions vu ensemble les 3 variables fondamentales de Perl. A prsent, nous irons plus loin dans la comprhension de ce langage pour nous faciliter la vie dans nos dveloppements. Ainsi, nous apprendrons partager notre code pour ne plus le rendre "monolithique", dcouvrir des nouvelles boucles et faire prendre des dcisions nos programmes. GLDavid
Mais, Perl va encore plus loin ! En effet, ce langage propose mme un mot cl contraire "if". Il s'agit du mot cl unless ( moins que en Il peut tre bien utile, dans un programme, de prendre des dcisions en franais). Considrons le code suivant qui reprend le prcdent : fonction des variables et des valeurs que vous leur donnerez. Et comme dirait l'adage : "avec des si, on mettrait Paris en bouteille !". Alors, condition3.pl #!/usr/bin/perl appliquons ce proverbe dans le code suivant : print "Rentres un chiffre pour connatre son inverse :\n"; condition1.pl $nombre = <stdin>; #!/usr/bin/perl chomp $nombre; print "Rentres une ville :\n"; unless($nombre == 0){ $ville = <stdin>; $resultat = 1/$nombre; chomp $ville; print "L'inverse de ".$nombre." est if ($ville eq "Paris") { ".$resultat."\n"; print $ville." rentre dans une bouteille } else { !\n"; print "La division par 0 est impossible !"; } } Voyons ce code. La premire ligne vous est bien connue, il s'agit de la ligne shebang o nous dclarons le chemin de l'interprteur Perl. Puis, nous affichons avec print une chane de caractres. La ligne suivante demande l'utilisateur de rentrer une valeur, ici, le nom d'une ville qui sera intgr dans la variable scalaire $ville. La fonction chomp supprime le retour chariot contenu dans la variable $ville. Maintenant, viens notre propos. le programme se pose la question suivante : "Qu'est-ce que je fais en fonction de la valeur de $ville ?" A cela, nous lui apportons la solution : "si" la valeur de $ville est gale Paris, alors, tu affiches la chane concatne entre la valeur de $ville et une phrase. Notez que nous mettons la solution la condition entre une paire d'accolades ouvrantes-fermantes que l'on appelle un bloc. Mais, j'entend votre question : et si l'utilisateur ne rentre pas Paris ? Et bien, nous allons voir un autre mot-cl bien utile si un "if" est insuffisant. Il s'agit du mot else soit le "sinon" anglais. Prenons l'exemple suivant : condition2.pl #!/usr/bin/perl print "Rentres un chiffre pour connatre son inverse :\n"; $nombre = <stdin>; chomp $nombre; if($nombre == 0){ print "La division par 0 est impossible !"; } else { $resultat = 1/$nombre; print "L'inverse de ".$nombre." est ".$resultat."\n"; } Aprs avoir crit notre ligne shebang, nous demandons l'utilisateur de rentrer un nombre et nous enlevons le retour chariot. Comme nous divisons 1 par ce nombre pour obtenir l'inverse du nombre, il est vident qu'une division par 0 est impossible. Aussi, l'aide de la paire if-else, nous allons analyser le nombre rentr. Dans notre "if", nous regardons si le nombre est gal 0. Si c'est le cas, nous affichons une remontrance envers l'utilisateur (si, si, parfois, l'informaticien se montre svre envers ses utilisateurs) et le programme se termine. Dans le cas contraire, le bloc else est alors invoqu : nous stockons le rsultat dans la variable scalaire $resultat de la division de 1 par notre nombre $nombre. Enfin, nous affichons le rsultat de cette opration dans une chane concatne. Notre condition se lit donc de la manire suivante : " moins que $nombre soit gal 0, on procde la division. Sinon, on affiche l'erreur. Vous aurez compris la subtilit : if se contente de vrifier si la condition est vraie alors qu'unless vrifie si la condition est fausse. Bien naturellement, vous devez chaque appel d'une condition placer un bloc (paire d'accolades ouvrantes-fermantes) la suite de votre condition. Enfin, une dernire remarque pour les tests de comparaison. Vous aurez vu que j'ai utilis 2 oprateurs diffrents pour tester une variable scalaire qui contient une chane de caractre et une autre qui contient un nombre. Retenez ainsi que si vous voulez comparer une galit entre chanes de caractres, vous devez avoir recours l'oprateur eq (pour quivalent). Son oppos est ne (pour non-quivalent), toujours pour les chanes de caractres. Concernant les nombres, nous retrouvons des oprateurs connus : == (pour l'galit, attention de ne pas utiliser un = seul !), <, > (pour les diffrences strictes), <=, >= (pour les diffrences strictes ou gales) parmi les plus usits.

II. Rpter une opration, les boucles


Dans le cours prcdent, nous avons commenc voir quelques boucles mais sans rentrer dans les dtails. Maintenant, rentrons dans les dtails! Mais, quoi sert une boucle ? Une boucle va vous aider rpter un bloc d'instructions jusqu' ce qu'elle satisfasse une condition. Toutefois, il existe aussi des cas o des boucles seront infinies ! C'est le cas des IHM (Interfaces Homme-Machine). Mais reprenons notre propos. Comme toujours, nous allons nous aider des traductions anglais => franais pour comprendre une boucle. Dbutons avec la boucle while. La boucle while se ralise tant que la condition n'est pas atteinte. Un petit exemple : boucle1.pl #!/usr/bin/perl print "Table de multiplication de 2\n"; $i = 0; while($i<=10){ print "$i*2 = ".($i*2)."\n"; $i++; } Vous aurez compris que nous allons afficher la table de multiplication de 2. Nous initialisons une variable scalaire $i 0. Cette variable va tre utilise dans notre boucle. Notre boucle while nous dit ceci : "tant que $i est infrieur ou gal 10, j'effectue ce que l'on me demande". la

page 4

Developpez.com

Developpez Magazine
Perl contient quelques variables rserves qui sont bien utiles notamment pour manipuler les paramtres d'appels d'un script, rapporter une erreur ou connatre son environnement. Loin de nous est l'objectif de dresser une liste exhaustive de ces diffrentes variables, nous nous contenterons de vous citer les plus utiles. Commenons par quelques variables scalaires spciales. Savez-vous qu'il existe une variable scalaire par dfaut ? Celle ci est not $_. Elle Enfin, il existe l'oprateur de dcrmentation (--) qui se base sur les contient tout ce qui est en cours d'une boucle ou elle est la variable par mmes rgles que l'incrmentation. Notre boucle se termine lorsque sa dfaut de nombreuses fonctions. valeur atteint 10. special1.pl En fait, comme tout langage, Perl vous autorise crire une boucle selon #!/usr/bin/perl votre prfrence. Par exemple, la boucle for permet de rassembler en 1 @liste = (0,1,2,3,4,5,6,7,8,9,10); ligne l'initialisation d'une variable, sa condition et son incrmentation. print "Table de multiplication de 2\n"; La boucle for signifiant "pour", reprenons notre exemple de tout foreach (@liste){ l'heure : print "$_*2 = ".($_*2)."\n"; } boucle2.pl #!/usr/bin/perl Vous connaissez ce code, il s'agit de l'affichage de la table de print "Table de multiplication de 2\n"; multiplication de 2 l'aide d'une boucle foreach. Mais vous me direz for ($i=0; $i<=10; $i++){ qu'il manque une variable. Pas du tout ! Dans notre ligne o nous print "$i*2 = ".($i*2)."\n"; dcrivons notre boucle foreach, la variable spciale $_ peut tre crite } explicitement sinon elle est appel implicitement par le code. Notre code aurait p s'crire de la manire suivante avec le mme rsultat : Un code plus court, n'est-ce pas ? L'utilisation d'un for n'est gure diffrente de la boucle while. La boucle for nous dit : "Pour $i gal 0 special2.pl et tant que $i est infrieur ou gal 10, j'incrmenterais de 1 $i et je #!/usr/bin/perl ferais ce que l'on me dit de faire". @liste = (0,1,2,3,4,5,6,7,8,9,10); print "Table de multiplication de 2\n"; Dans notre partie consacre aux conditions, nous avons vu qu'il existait foreach $_ (@liste){ un oppos if nomm unless. Comme dans la nature, il existe un oppos print "$_*2 = ".($_*2)."\n"; pour chaque lment, la boucle while a aussi son oppos : until. Les } boucles while et for se ralisent tant que la condition est vrai, la boucle until se ralise tant que sa condition est fausse. En anglais, until se Il est aussi parfois bien utile de rapporter une erreur. La variable $! sert traduit par "jusqu' ce que". Voyons comment utiliser until avec notre ainsi enregistrer l'tat de votre erreur : exemple de table de multiplication : special3.pl boucle3.pl #!/usr/bin/perl #!/usr/bin/perl print "Rentres un nom de fichier :\n"; print "Table de multiplication de 2\n"; $fichier = <stdin>; $i = 0; chomp $fichier; until($i>10){ if (-f $fichier){ print "$i*2 = ".($i*2)."\n"; print "$fichier existe.\n"; $i++; } else { } print "$!\n"; } Le code n'est pas si diffrent de notre exemple avec while. Mais la pense est diffrente. Comme dans notre exemple de boucle1.pl, nous A l'aide de ce code, nous demandons au script de vrifier si le fichier initialisons une scalaire $i 0. mais notre boucle nous indique cette fois: dont le nom est rentr par l'utilisateur existe. Si c'est le cas (avec l'option "Jusqu' ce que $i soit suprieur strictement 10, je fais ce que l'on me -f d'un if, nous testons l'existence d'un fichier dont le nom est contenu dit". Le corps de la boucle ne change pas. Seule la condition a t dans une variable scalaire), le script affiche que le fichier existe. Dans modifie. le cas contraire, nous affichons le contenu de notre erreur. Si vous rentrez un nom de fichier qui n'existe pas, $! contiendra alors la valeur: Mais certaines boucles sont bien utiles pour des types de variables plus volues comme les listes ou tables de hachages. Ainsi, la boucle No such file or directory foreach est trs pratique pour parcourir les lments d'une liste. Cependant elle peut aussi manipuler aisment une table de hachage : Il existe aussi des listes spciales Perl. Aussi, vous savez que de nombreux programmes ont besoin de paramtres pour pouvoir boucle4.pl s'excuter. Un exemple sur les machines Unix est que certaines #!/usr/bin/perl commandes vous affichent de l'aide lorsqu'elles n'ont pas d'arguments @liste = (0,1,2,3,4,5,6,7,8,9,10); ou que ceux-ci sont inexacts. Aussi, comment pouvons-nous tester print "Table de multiplication de 2\n"; l'existence de paramtres pour un programme Perl. Tous les paramtres foreach $i (@liste){ invoqus par un script Perl sont ainsi contenu dans un tableau spcial, le print "$i*2 = ".($i*2)."\n"; tableau @ARGV. Sa manipulation est identique tous les tableaux que } vous crerez en Perl : Nous avons ainsi initialis une liste avec une srie de chiffres. Puis la special4.pl boucle indique "Pour chaque lment not $i de la liste @liste (crite #!/usr/bin/perl entre parenthse), je fais ce que l'on me dit". Le corps de la boucle foreach (@ARGV){ multiplie ainsi l'lment en cours par 2 et affiche le rsultat. print $_; } boucle while est suivie alors d'une paire d'accolades ouvrantesfermantes contenant les instructions de la boucle (ce qu'elle doit faire). Ainsi, dans le bloc ou corps de boucle, nous demandons afficher la valeur de $i actuelle et de la multiplier par 2. Enfin, nous incrmentons $i. L'incrmentation consiste ajouter 1 une valeur donne. Il existe 2 types d'incrmentations : La pr-incrmentation : ++$i; o la valeur sera d'abord incrmente. La post-incrmentation : $i++; o la valeur sera aprs incrmente.

III. Variables spciales de Perl

page 5

Developpez.com

Developpez Magazine
Dans ce simple code, nous voulons afficher la liste des paramtres passs notre programme. Comment passe t'on un argument ? Quand Nous avons vu que nous pouvons transmettre des arguments une fonction via la paire de parenthses invoques lors de l'appel. Ainsi, vous appelez votre script, il suffit d'crire sa suite les arguments : prenons l'exemple suivant : perl special4.pl toto tata tutu fonction2.pl Ainsi, notre programme special4.pl vous affichera toto, tata puis tutu. #!/usr/bin/perl Ceci est particulirement utile quand vous passez votre programme un sub inverse{ if ($_[0] == 0){ nom de fichier : print "Division par 0 impossible !\n"; } else { special5.pl $resultat = 1/$_[0]; #!/usr/bin/perl print "L'inverse de $_[0] est $resultat.\n"; foreach $file (@ARGV){ } if (-f $file){ } print "OK, $file existe.\n"; print "De quel nombre voulez-vous avoir l'inverse } else { ?\n"; print "$file : $!\n"; $nombre = <stdin>; } chomp $nombre; } inverse($nombre); Enfin, il existe des listes associatives ou tables de hachages spciales. Nous citerons ainsi %ENV qui contient ainsi tous les renseignements Dans ce code, nous demandons l'utilisateur de rentrer un nombre. Celui-ci est stock dans la variable scalaire $nombre. Puis, cette scalaire sur votre systme : $nombre sera transmise la fonction inverse dans la paire de parenthses. venons-en notre fonction inverse. Notre nombre est special6.pl contenu dans une variable nomm $_[0] qui est test dans un if pour #!/usr/bin/perl print "Liste des informations de votre systme vrifier si, bien entendu, ce nombre n'est pas gal 0. Et oui, nous avons :\n"; une nouvelle variable spciale ! Cette variable est en ralit le tableau while (($cle, $valeur) = each (%ENV)){ @_ qui contient tous les paramtres transmis une fonction. Le tableau print "$cle a comme valeur $valeur.\n"; spcial @_ peut aussi bien contenir des variables scalaires, des nombres, } des chanes de caractres et mme des tableaux et des tables de hachages. Vous pouvez tout transmettre une fonction. Dans le cas o Naturellement, cette table de hachage se manipule comme toute bonne notre valeur est gale 0, la fonction rpond par un message d'erreur. table de hachage : Dans le cas contraire, elle procde au calcul de l'inverse et renvoie le rsultat. special7.pl #!/usr/bin/perl Une fonction peut trs bien renvoyer un rsultat qui soit une variable print "Votre processeur est un scalaire, une liste ou une table de hachage. Reprenons notre calcul $ENV{'PROCESSOR_IDENTIFIER'} :\n"; d'inverse :

IV. Ecrire des fonctions


Il est souvent bien utile de compartimenter notre code en des blocs qui auront des tches bien spcifiques remplir. Ces blocs sont appels des fonctions. Ces fonctions peuvent prendre ainsi des arguments, traiter ensuite ces ventuels arguments et peuvent aussi rendre un rsultat. Moralit, les informaticiens rpondent l'adage "Diviser pour mieux rgner". L'criture d'une fonction n'est gure complique. Vous devez ainsi dclarer votre fonction prcde du mot cl sub (pour sub-function, en anglais sous-fonction), suivi ensuite d'une paire ouvrante-fermante d'accolades. Celles-ci dfiniront le corps de la fonction soit les instructions que votre fonction devra traiter. Prenons un exemple simple: fonction1.pl #!/usr/bin/perl sub fonction{ print "La fonction est appele.\n"; } #Corps principal de notre script print "Dbut de notre script.\n"; fonction(); print "C'est tout pour aujourd'hui.\n"; Ainsi, notre script dbutera toujours par son corps principal. En l'occurence, notre code affichera d'abord la chane de caractres "Dbut de notre script.\n". Puis, nous appelons notre fonction par son nom suivi d'une paire de parenthses. Ces parenthses contiendront les arguments passs notre fonction. Ici, nous avons rien transmettre donc, nous laissons notre paire de parenthses vide. La fonction ainsi appel va donc faire ce pourquoi elle a t cre : afficher la chane de caractres "La fonction est appele.\n". Enfin, le corps principal de notre fonction reprend la main et affiche la dernire chane "C'est tout pour aujourd'hui.\n".

fonction3.pl #!/usr/bin/perl sub inverse{ if ($_[0] == 0){ print "Division par 0 impossible !\n"; } else { $resultat = 1/$_[0]; return $resultat; } } print "De quel nombre voulez-vous avoir l'inverse ?\n"; $nombre = <stdin>; chomp $nombre; $reponse = inverse($nombre); print "L'inverse de $nombre est $reponse.\n"; Dans le corps principal de notre script, vous remarquerez que nous demandons ce que le rsultat de la fonction soit contenu dans la variable scalaire $reponse. Notre fonction va donc tester la valeur de son argument (est-elle gale 0 ou non) et dans le cas o celui-ci n'est pas gal 0, la fonction procde au calcul de l'inverse. Ce calcul est contenu dans la variable $resultat. Puis, la fonction va retourner la valeur de $resultat au corps principal de notre script par l'intermdiaire du mot cl return suivi de la variable retourner (return se traduit par retourne en anglais). Notre script reprend la main avec la valeur $reponse gale au calcul de l'inverse du nombre demand l'utilisateur et nous affichons le rsultat. Cette manire d'crire son code rend plus simple la lecture et permet aussi au programmeur de rutiliser des fonctions suffisamment gnriques dans d'autres codes. D'o un intrt dans la simplification de rsolution d'un problme et une portabilit des solutions apportes.

Retrouvez la rubrique Perl sur : http://perl.developpez.com

page 6

Developpez.com

Developpez Magazine

C/C++
Les derniers tutoriels
Crez votre propre moteur 3D en Les structures de donnes en C, Les incompatibilits entre le C et C++. 6me partie : la gestion du quatrime partie : les files le C++ Dernire structure de donne base sur Le C et le C++ sont deux langages texte
L'affichage de texte l'cran est une fonctionnalit qui peut se rvler trs utile pour la suite du dveloppement : affichage d'informations diverses et de debugging, console, interface graphique, ... Nous verrons donc dans cette partie une gestion efficace du texte via les polices graphiques. Lire le cours de Laurent Gomila (lien 21) les listes (enfin !), il s'agit des files. Pour nous faciliter la vie, et ne pas rinventer la roue, nous allons utiliser la bibliothque de listes doublement chanes pour crer celle des files. Lire le cours de Nicolas Joseph (lien 22) proches au niveau de leur syntaxe et de leur grammaire (si l'on met de ct les proprits objet du C++), cependant il existe un certain nombre d'incompatibilits qui fait qu'un programme crit en C peut ne pas compiler avec un compilateur C++. Lire le cours de Nicolas Joseph (lien 23)

Critique de livre
C en action Solutions et exemples pour les program-meurs en C
Yves Mettier Editions O'Reilly

Rsum diteur
C en action rassemble une slection de solutions efficaces aux problmes les plus souvent rencontrs par les programmeurs en C. la fois source d'ides, moyen d'apprendre C par l'exemple ou de programmer plus vite et plus facilement, cet ouvrage est construit sur le modle : un problme, une solution, une discussion.

Critique Livraison gratuite sur Amazon


L'auteur du livre annonce la couleur ds les premires pages : ce livre est crit pour des lecteurs ayant des connaissances en C : aucune initiation n'est propose, aucun rsum des fonctions de la bibliothque standard n'est inclu en annexe. Le lecteur est cens connatre et

ISBN: 2841772896

surtout matriser le langage C. C en action vous propose de passer en revue diffrents points techniques qui reviennent rgulirement lors de dveloppement en C : gestion de la mmoire, manipulations des chanes de caractres, les structures de donnes... Mais aussi des rubriques plus inattendues telles que la compression ou l'utilisation de la libxml2. Chaque sous chapitre est dcompos en trois parties : Problme/Solution/Discussion de telle sorte que le livre se lit aussi bien de la premire la dernire page que comme un recueil de sources prtes l'emploi. On apprciera aussi la prsence d'une section "Voir aussi" la fin des chapitres qui renvoit un site internet ou des pages man.

L'auteur ne s'arrte pas au CANSI, la plupart des chapitres contient un exemple en CANSI, un bas sur la glib et un dernier avec les fonctions de la norme POSIX (il y a des chapitres, celui des signaux par exemple, valable uniquement pour des systmes d'exploitation conformes POSIX) On retiendra de ce livre la qualit des sources proposes, qui dmontre une matrise certaine du C par l'auteur, ainsi que leurs abondances, qui rythme de faon agrable chaque chapitre. Nicolas Joseph

540 pages juin 2005

Retrouvez la complte (lien 24)

critique

Les F.A.Q
F.A.Q C : 121 Q/R F.A.Q C++ : 238 Q/R F.A.Q Visual C++ : 300 Q/R F.A.Q C++ builder : 400 Q/R
(lien 25)

Les sources
67 codes sources libres pour C++ Builder tlcharger
(lien 26)

Les compilateurs
Les meilleurs compilateurs gratuits pour Windows, DOS et Unix tlcharger. (lien 27)

Retrouvez la rubrique C/C++ sur : http://c.developpez.com


page 7

Developpez.com

Developpez Magazine

Access
Les derniers tutoriels
Communication entre Access et entre les deux produits et tudier quels Une petite fonction de cryptage cas de figures elles s'appliquent le mieux.. en VBA Excel
Microsoft Excel est le tableur le plus utilis du march, il ne requiert pas de comptences de programmation et est d'une souplesse incomparable en matire de graphiques et de prsentations. C'est pourquoi, les applications Access les plus intelligemment conues ont parfois recours des changes avec Excel. Dans ce tutorial, nous allons aborder les diffrentes mthodes de communications Lire le cours de Cafeine (lien 28) La recherche de la scurit, toujours plus de scurit. Vous connaissez certainement Csar et son cryptage tout simple. Mais Vigenre, vous en avez dj entendu parler ? Je vous propose ci-aprs de dcouvrir un cryptage trs simple raliser. Lire le cours de Maxence HUBICHE (lien 30)

Repousser les limites des formulaires Access en mode continu


Challenge de programmation : raliser un formulaire continu affichant des images externes. Lire le cours de Cafeine (lien 29)

Retrouvez la rubrique Access sur : http://access.developpez.com

.NET
Les derniers tutoriels
VB.Net 2005 : le nouveau XMLRAD est une alternative ASP.NET ClickOnce est la nouvelle technologie de pour crer des applications web avec dploiement d'applications. Cet article namespace nomm My
Visual Basic, dans sa version 2005, introduit un nouveau namespace nomm My. Ce namespace a pour caractristique d'tre un point d'accs rapide tout un tas de classes du Framework. Lire le cours de Ronald VASSEUR (lien 8) .NET. La technologie est base sur XML/ XSL pour gnrer les pages HTML. Lire le cours de Jean-Philippe Bempel (lien 10) vous montrera les diffrentes possibilits que cette technologie vous apporte, tant au niveau du dploiement que de la mise jour de vos applications.. Lire le cours de LEBRUN Thomas & A la dcouverte de Visual Studio MORAND Louis-Guillaume (lien 12)

2005

Cet article prsente les nouvelles fonctionnalits de Visual Studio 2005 A la dcouverte d'Avalon Le dveloppement avec Avalon et XAML, Lire larticle de MORAND LouisGuillaume (lien 11) comment cela marche ? Lire le cours de Jean-Alain Baeyens (lien Le dploiement facile 9)

SQL Server 2005 : procdures stockes en .Net

d'applications Crer une application web .NET ClickOnce avec XMLRAD

.NET

Au cours de cet article, nous allons voir les apports d'une innovation majeure de SQL Server 2005, savoir l'intgration de la CLR 2.0. Nous verrons comment crer avec et dployer du code .Net directement l'intrieur du serveur de base de donnes. Lire le cours de Ronald Vasseur (lien 13)

Les outils
Convertisseur de code C# <-> VB.NET disponible gratuitement en ligne. (lien 14)

Actualit
Rsultats de l'enqute de satisfaction de MSDN France (lien 16) Framework 2.0 et VS2005 final dispo en novembre (lien 17) 101 exemples de code .Net 2.0 sur le site de Microsoft (lien 18) Testez Visual Studio 2005 gratuitement ! (lien 19) Principes des webservices selon Microsoft (lien 20)

Retrouvez la rubrique .NET sur :


http://dotnet.developpez.com

page 8

Developpez.com

Developpez Magazine

.NET
Introduction

ClickOnce: Le dploiement facile d'applications .NET


ClickOnce est la nouvelle technologie de dploiement d'applications. Cet article vous montrera les diffrentes possibilits que cette technologie vous apporte, tant au niveau du dploiement que de la mise jour de vos applications. LEBRUN Thomas & MORAND Louis-Guillaume
avantages de l'UAB (plus quelques autres), sans les inconvnients. Voici une liste des caractristiques (non exhaustive) de ClickOnce: les mises jour sont transactionnelles (c'est--dire qu'elles sont faites entirement ou pas du tout) bonne intgration avec Visual Studio il est possiblie de proposer le tlchargement de pr-requis, ncessaires au bon fonctionnement de l'application il est possible d'avoir un raccourci dans le menu "Dmarrer"

Le dploiement est aujourd'hui au milieu de toutes les stratgies dans un entreprise. Que cela soit le dploiement d'une mise jour, le dploiement d'un logiciel (antivirus, ou autre) ou n'importe, le dploiement est une problmatique et l'objectif principal de l'administrateur rseau est de le rendre le plus simple possible. La plupart d'entre-vous doit connatre Windows Update qui permet partir d'une page web de "deviner" les mises jour qu'il est ncessaire d'installer, et peut-tre connaissez-vous SUS (Software Update Service) qui permet de dployer automatiquement des mises jour sur les postes du rseau. Aujourd'hui, Microsoft nous propose une nouvelle merveille, qui combine les avantages des deux technologies cites juste avant. Avec ClickOnce, vous pourrez redistribuer vos applications .Net chez les clients qui en auront le besoin.

Maintenant que nous avons vu la thorie, passons un peu la pratique: rien de tel pour apprendre ;)

2. Dploiement d'une application


2.1. Premier dploiement
Au cours de cette dmonstration, et pour que l'explication soit la plus claire possible, nous prendrons un cas pratique rel, plus prcisment, nous dploierons une application et ses diffrentes mises jour. Crer une application Winform basique. Compilez la, pour que nous puissions la dployer. Pour cela, veuillez ouvrir le pannerau des proprits de votre projet (menu Projet > nom_du_projet proprits). Cochez la case et signez le manifeste ClickOnce.

1. Presentation de ClickOnce
Disponible depuis la version 2.0 du framework .NET, ClickOnce est la nouvelle technologie de dploiement (et de mise jour) d'applications. Elle se base sur le protocole HTTP pour effectuer les installations ou les mises jour. Le dploiement d'applications, au moyen d'HTTP, est diponible depuis la version 1.0 du framework .NET, mais il a subi de nombreuses modifications qui l'ont rendu plus performant. Pour mettre en place ClickOnce, il vous suffit de possder: Visual Studio 2005 (actuellement en BETA 2) pour dvelopper votre application un serveur Web IIS, pour publier votre application Avec les prcdentes versions du framework .NET, excuter une application pouvait se faire via un simple lien dans une page Web: Cliquer <a href="MonProjet.exe">ici</a> pour tlcharger et excuter le logiciel <b>MonProjet.exe</b> Bien qu'efficace, cette technique prsentait tout de mme des inconvnients: le framework .NET devait tre install sur les machines cibles l'application est disponible "Offline" seulement si l'utilisateur choisit "Travailler en mode dconnect" dans son navigateur Web le fichier .config de l'application n'est pas disponible par dfaut l'application ne possde pas de raccourci sur le bureau ou dans le menu "Dmarrer"

Nous devons maintenant dfinir les autorisations de scurit. Pour le moment, cochez la case qui indique que notre application est "full trust" (on peut lui fait totalement confiance). Par mesure de scurit, il faudra mieux viter ce choisir cette option; nous verrons donc un peu plus tard dans ce tutoriel comment dfinir au mieux ces options de scurit. Passons maintenant la partie la plus importante: la publication. Passons donc dans l'onglet publication, et dfinissez l'endroit o sera publi votre application ainsi que la page d'installation de votre application. Sur cette page, vous allez dfinir si votre application sera publie sur un ftp, un partage rseau ou un serveur IIS et vous pouvez galement dfinir si l'application ne sera accessible que de facon online (retlecharge chaque fois) ou de faon offline, tlcharge, installe et accessible via le menu Dmarrer. Publishing Location indique le partage Web depuis lequel votre application sera dploiye/mise jour Install Mode and Settings permet de spcifier si votre application

Si vous aviez besoin de plus de contrle sur le dploiement ou la mise jour de votre application, vous pouviez utiliser l'"Updater Application BlockVersion 2.0": il s'agit d'un composant, dvelopp par Microsoft, qui peut dtecter, tlcharger, et mettre jour votre application. Cette technique, trs efficace mais possdant malgr tout quelques "failles" (par exemple, le code excut possde les droits "Full Trust", ce qui est potentiellement dangereux, d'un point de vue scurit, etc.) existe toujours mais laisse sa place, dans la version 2.0 du Framework .NET, ClickOnce. Pour faire simple, on peut dire que ClickOnce possde tous les

page 9

Developpez.com

Developpez Magazine
doit tre disponible "OnLine" et "OffLine" Prerequisites vous permet de spcifier les programmes pr-requis poour installer votre application Updates vous permet d'indiquer que votre application doit (ou non) vrifier la prsence de mise jour sur le serveur. Vous indiquez galement quel moment vous souhaitez faire cette vrification (avant ou aprs le dmarrage de l'application) Grce au panneau Options, vous pouvez renseigner diffrentes informations

2.3. Mise jour automatique


Pour faire une mise jour de votre application, rien de plus simple: il vous suffit faire vos modifications et de refaire un "Publish", dans Visual Studio. Ensuite, excuter votre application et ds le dmarrage, celle-ci dtectera la prsence d'une nouvelle version, la tlchargera et relancera l'application pour prendre en compte les modifications.

3. Utilisation avance
Retrouver cette dernire partie et toutes les illustrations sur notre site Developpez.com (lien 15). Une fois ces informations renseignes, un clic sur le bouton "Publish Wizard" (galement diponible depuis le menu "Build" ou bien, dans Conclusion l'explorateur de solution, via un clic droit) lance l'assistant de configuration de l'installeur ClickOnce. ClickOnce est la nouvelle technologie de dploiement et de mise jour qui possde de beaux jours devant elle: son utilisation simple et trs Le "Publish Wizard" vous permet de configurer toutes les options agrable nous permet d'affirmer que ce sera sans doute la technologie ncessaires au dploiement de votre application. qui remplacera, terme, la technologie des MSI. Un clic sur le bouton "Finish" vous permet de dployer votre application sur le serveur IIS et vous ouvre la page de publication, qu'il vous suffit d'envoyer vos utilisateurs pour qu'ils installent votre application:

LEBRUN Thomas & MORAND Louis-Guillaume


Les auteurs de cet article sont respectivement Microsoft CERTIFIED Application Developer et Microsoft CERTIFIED Professional.

2.2. Installation
Il ne nous reste plus qu' installer l'application sur le poste client. Cette installation se fait manuellement grce la page publiment prcedemment. Un clic sur le bouton "Install" vous permet de lancer l'installation de l'application sur le poste et on aperoit bien la vrification de la prsence de mise jour, juste avant le lancement:

page 10

Developpez.com

Developpez Magazine

SGBD
Les derniers tutoriels
Correspondance des fonctions Lire le cours de Igor Nikiforov (lien 32) La gestion des clusters dans les TKPROF et Explain Plan des divers SGBDR Comment tracer une session ou une Comparatif qui vous permettra traduire divers SGBDR
plus aisment une fonction d'un SGBD Comparatif des solutions de clustering de instance et interprter le rsultat avec l'outil TKPROF sous Oracle. divers diteurs. l'autre.. Lire le cours de Jaouad (lien 35) Lire le comparatif de Fabien Celaia (lien Lire le cours de Fabien Celaia (lien 33) 31)

Fonctions de traitement volues en Lire le cours de Jaouad (lien 34) Transact-SQL.

Des blocs multi-lignes au look Les fonctions sur chane de Comprendre les mcanismes internes de "Java Swing JTable" verrouillage dOracle Plugin Oracle Forms caractres en Transact-SQL Cache Buffer Chain
Lire le cours de SheikYerbouti (lien 36)

Retrouvez la rubrique SGBD sur : http://sgbd.developpez.com

Nouvelle rubrique InterBase/Firebird (SGBD)


Acceuil : http://interbase.developpez.com La F.A.Q (55 Q/R) : http://interbase.developpez.com/faq/ Les tutoriels : http://interbase.developpez.com/cours/ Les outils : http://interbase.developpez.com/outils/

UML & mthodes


Le dernier tutoriel
La programmation complexe
La complexit d'un programme apparat un dveloppeur ds que sa perception lui pose des problmes de comprhension. La taille du projet est certainement un facteur important mais la complexit perue dpend aussi de l'exprience et du savoir acquis par le programmeur. La matrise de cette complexit a un caractre gnral et ne concerne pas uniquement la programmation. Le but de ce document est de s'intresser la manire dont on peut la grer. Pour cela, on se propose de dfinir un modle de comportement bas sur une Analyse Systmique que l'on dfinit partir de quelques rgles. Une section est consacre au domaine de la programmation et une autre conclut ce document en prsentant le concept d'informatique complexe. Lire le cours de Christophe Garnier (lien 37)

Retrouvez la rubrique UML sur : http://uml.developpez.com

Web
Les derniers tutoriels
Dtection des collisions en Flash Dbuter avec PHP et MySQL
Ce court article va vous expliquer ce qu'est une collision en Divers cours et astuces de PHP, MySQL. flash, comment les dtecter et dans quel cadre les utiliser. Vous Lire les cours de Marian Muller (lien 39) devez disposer du flash player 7 pour pouvoir visualiser les animations. Il est disponible sur le site de Macromedia. Lire le comparatif de Stephane Eyskens (lien 38)

Retrouvez la rubrique Web sur : http://web.developpez.com


page 11

Developpez.com

Developpez Magazine

Pascal
Les ressources
Cours et tutoriels : 9 cours Outils : 9 outils gratuits Exercices corrigs : 49 exercices Meilleurs livres : 4 critiques F.A.Q Pascal : 114 Q/R Codes sources : 16 sources Compilateurs : 14 outils tests et comments Rubrique refaite neuf !

Retrouvez la rubrique Pascal sur : http://pascal.developpez.com

Delphi
Les derniers tutoriels
Strings et PChars en Delphi
Lorsquun ami qui crivait des DLL renvoyant des chanes de caractres passes sous la forme de PChar commena trouver normal que Delphi lve des violations daccs o renvoie parfois des valeurs incohrentes (mettant cela sur le dos dune gestion des chanes approximatives de Windows, bien sr !), jai finalement dcid de terminer ce petit document destin claircir les ides de certains Delphistes. Il na pas vocation dexpliquer en totalit les mcanismes utiliss pour grer les diffrents types de chanes que vous pourrez rencontrer en tant que programmeur Delphi, mais pourra vous claircir les ides et vous permettre dviter les erreurs courantes lors des conversions de chanes Delphi en chanes C. Lire le cours de Adrien Reboisson (lien 40) Cette seconde partie va vous apprendre amliorer un composant existant en hritant de celui-ci. En particulier, vous amliorerez le composant TImage pour lui ajouter une fonctionnalit de glisserdposer. Lire le cours de Sbastien Doeraene (lien Cration et utilisation de DLL 42)

du correcteur Apprenez crer simplement des DLL Utilisation orthographique de Word avec Delphi !. Lire le cours de Olivier Lance (lien 41) Utilisation du correcteur orthographique de Microsoft Word dans une application Amliorer un composant par Delphi. Les exemples prsents ici sont tests avec Delphi 2005 et Word 2003. hritage, partie 2 Lire le cours de Nono40 (lien 43)

avec Delphi

La F.A.Q Delphi
611 Q/R dont 64 nouvelles Tlchageable au format HTML Moteur de recherche intgr

Vu dans la F.A.Q
Comment envoyer du texte au debugger ?
Il existe une fonction de l'API Win32, OutputDebugString, permettant d'envoyer du texte vers le debugger de Delphi, ces messages tant visibles dans le "Journal d'vnements" (menu "Voir -> Fentres de dbogage -> Journal d'vnements" ou Ctrl+Alt+V). Cependant, cette fonction n'est pas trs pratique utiliser, car elle n'autorise que l'envoi d'une chane PAnsiChar "telle quelle". Une petite fonction de formatage s'avre rapidement ncessaire :
//La syntaxe de la fonction est strictement identique // celle de la procdure "Format". Procedure DebugPrintFmt ( Const FmtString : String ; Const Args : Array Of Const ) ; Begin OutputDebugString(PAnsiChar(Format(FmtString,Args))); End;

Retrouvez la rubrique Delphi sur :


http://delphi.developpez.com page 12

Mac LAK

Developpez.com

Developpez Magazine

Liens
Vous trouverez ici la liste des URL des articles cits dans ce magazine. Pour des raisons pratiques de mise en page des URL longues, ces dernires sont fournies en fin de ce magazine. Ces URL sont actives : cliquez dessus pour accder au document rfrenc. 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.
http://gfx.developpez.com/tutoriel/java/swing/drag/ http://gfx.developpez.com/tutoriel/java/swing/wait/ http://gfx.developpez.com/tutoriel/java/swing/java3d/ http://schmitt.developpez.com/tutoriel/java/jsf/introduction/ http://beuss.developpez.com/tutoriels/java/jakarta/log4j/ http://tahe.developpez.com/java/remote3tier-part1/ http://java.developpez.com/livres/#L2744019623 http://webman.developpez.com/articles/vbnet/2005/my/ http://jab.developpez.com/tutoriels/dotnet/avalon/ http://xmlrad.developpez.com/Articles/Application.NET/ http://lgmorand.developpez.com/dotnet/vs2005/ http://morpheus.developpez.com/clickonce/ http://webman.developpez.com/articles/sqlserver/sqlclr/ http://www.dotnet-developpez.com/Convertisseur/ http://morpheus.developpez.com/clickonce/ http://www.microsoft.com/france/msdn/enquete/satisfaction.mspx http://www.microsoft.com/presspass/press/2005/jun05/TechEd2005Day2PR.mspx
http://blog.developpez.com/index.php?blog=52&title=101_exemples_de_code_net_2_0_sur_le_site

http://blog.developpez.com/index.php?blog=50&title=testez_visual_studio_2005_gratuitement
http://blog.developpez.com/index.php?blog=20&title=principes_des_webservices_selon_microsof

http://loulou.developpez.com/tutoriels/moteur3d/partie6/ http://nicolasj.developpez.com/articles/file/ http://nicolasj.developpez.com/articles/incompatibilites/ http://c.developpez.com/livres/#L2841772896 http://c.developpez.com/faq/ http://c.developpez.com/sources/bcb/ http://c.developpez.com/compilateurs/ http://cafeine.developpez.com/Excel/ http://cafeine.developpez.com/PseudoContinu/ http://mhubiche.developpez.com/Access/cryptage/vigenere/ http://fadace.developpez.com/sgbdcmp/fonctions/ http://nikiforov.developpez.com/ http://fadace.developpez.com/sgbdcmp/cluster/ http://oracle.developpez.com/guide/tuning/latch/ http://oracle.developpez.com/guide/tuning/tkprof/ http://sheikyerbouti.developpez.com/fjtable-v1/ http://garnier.developpez.com/cours/design/programmationComplexe/ http://stephaneey.developpez.com/tutoriel/flashmx2004/collision/ http://mmuller.developpez.com/?p=1 http://reisubar.developpez.com/tutoriel/delphi/strings-pchars/ http://olance.developpez.com/articles/delphi/creation-dll/ http://sjrd.developpez.com/delphi/delphitutoriels/composants/heritage/ http://nono40.developpez.com/tutoriel/delphi/word/correction/

page 13

Developpez.com

Vous aimerez peut-être aussi