Archives du mot-clé Java

Quelques liens utiles pour programmer sereinement en java

Jusqu’à présent, je vous ai présenté le java à ma façon, parce que je trouve que la manière dont mes collègues le présentent n’est jamais suffisamment pédagogique. Il faut toujours commencer par les bases, sauf que celles-ci sont toujours tellement évidentes pour le professionnel, qu’en général il en zappe une partie. N’étant dans le java que depuis un an et demi, je me souviens encore très bien de mes débuts, et de mes difficultés d’alors. Cependant il est inutile de réinventer la roue en vous exposant l’intégralité des finesses de ce vaste sujet, ce qui prendrait un temps considérable, et serait totalement inutile puisqu’il existe d’excellents tutoriels sur la toile.

Dans le cadre de mon travail, je suis un intégrateur, c’est à dire que je reprend des bouts de logiciels qui existent déjà, et j’ajoute un ciment qui me permet de les liers entre eux dans un but novateur d’interaction entre tous ces bouts de logiciels. Entre 80% et 90% du code que je manipule existe déjà! C’est le principe de base de la programmation moderne. On reprend ce qui a déjà été fait, on ajoute juste ce qui manque. Et bien je me propose de faire de même dans le cadre de ces tutoriels. Je vais donc vous inviter à puiser abondamment dans des sites comme ceux qui suivent:

Qui sont des références absolues du petit programmeur, même s’il y a de nombreuses autres sources d’informations sympathiques à trouver sur le web ;).

Tant que nous y sommes, voici un certain nombre de sites dont vous aurez rapidement besoin pour vous faciliter la programmation:

  • javadoc online vous renseignera très utilement sur toutes les classes existantes et leur usage.
  • findjar.com vous aidera à retrouver les librairies qui vous manquent, ce qui provoque ces agaçantes erreurs de « ClassNotFoundException ».
  • java examples contient des centaines de petits bouts de code qui illustrent telle ou telle fonctionnalité de java, une vraie mine d’or pour comprendre comment marchent les choses :).

Il y a aussi java source.net, mais a priori, vous n’en aurez pas besoin tout de suite ;). Voila pour les liens utiles. Alors bouquinez bien, potassez bien, et à bientôt pour quelques éclaircissements sur certains points chauds :D.

Compiler et exécuter un fichier java.

vaisseau_java_2-compil

En complément à mon article précédent, voici comment faire pour compiler et tester mon exemple:

  • D’abord, récupérez le code source sur mon pastebin.
  • Ensuite, vous allez avoir besoin d’un outil de compilation. Sous Ubuntu, faites un petit
    « sudo apt-get install gcj » pour l’installer (sachant que si vous travaillez depuis un ordinateur de votre école ou université, le paquet est probablement déjà installé, et vous pouvez sauter cette étape.
  • Ensuite, la procédure est simple: « javac monfichier.java » pour compiler (avec le ‘c’ de compilateur à la fin).
  • « java monfichier arguments » pour  lancer l’exécution (sans le ‘c’ cette fois ci, sans le « .java », et les arguments, c’est en option, ça correspond au « String [] args », l’argument de la fonction main qui est appelée pour lancer le programme).

Dans notre cas, procéder comme sur l’illustration de ce billet, je pense que c’est assez explicite ;).

Introduction à la programmation Objet (2)

vaisseau_java_2

Dans mon exemple d’hier, je vous donnais les clés de la compréhension des fondamentaux de l’orienté objet. Nous gagnons aujourd’hui un petit peu en complexité. Cette classe est la même que celle d’hier, mais enrichie par l’arrivée de différentes nouveautés.

  • Comme vous pouvez le remarquer, il est possible d’initialiser les attributs de la classe à l’extérieur du constructeur. C’est une facilité qui permet d’apporter de la clarté dans le code, car comme ça seuls les champs qui doivent varier sont initialisés dans le constructeur.
  • Vous remarquez également que nous avons ici deux constructeurs, la chose est rendue possible par le fait que les deux ne prennent pas le même nombre ni le même type de paramètres. Ce n’est d’ailleurs pas réservé aux constructeurs, c’est le cas de n’importe quelle fonction. Par exemple vous pouvez avoir une fonction chargerPreferences(String nomFichier) et une fonction chargerPreferences(FileReader fichier), étant entendu que la première va ouvrir le fichier spécifié puis faire appel à l’autre. Et dans le cas présent, vous remarquerez qu’effectivement le constructeur qui prend le plus de paramètres fait appel au constructeur simple par le biais du mot clé « this ». Ce mot clé permet soit de désigner le constructeur de la classe s’il est utilisé comme fonction, soit de désigner une instance de la classe. Bien sûr il n’est pas obligatoire de lier les constructeurs, on aurait pu recopier le premier dans le deuxième, et éviter le renvoi. Mais en règle général en programmation, on évite de dupliquer le code tout simplement parce que s’il y a une modification à faire, on aime bien n’avoir à la faire qu’une seule fois.
  • Vous remarquerez enfin l’apparition du mot clé « static ». Ce mot clé permet de désigner une fonction ou un paramètre comme indépendant d’un objet particulier, mais au contraire commun à tous les objets de la classe. C’est un peu l’analogue d’une variable globale. Vous pouvez créer 100 vaisseaux, tous de nom, de couleur et de nombre de canons différents, mais si vous modifiez la variable nombre de vaisseaux, tous seront affectés, parce que c’est une variable dite « de classe et non d’instance », c’est à dire qu’elle ne s’applique pas à un objet particulier de la classe, mais à l’ensemble de ces objets.
  • et puis il y a la fonction public static void main(String args). Comme vous le remarquerez, cette fonction est « static », donc ne s’applique pas à un objet particulier mais à l’ensemble de la classe. En particulier, par convention, ce nom et cette signature de fonction désignent le bout de code qui doit être appelé pour lancer le programme.
  • Que dire d’autre, System.out.println() est une fonction qui permet d’afficher la chaine de caractères spécifiée à l’écran. On peut concaténer deux chaines de caractères avec des ‘+’. Il est également possible de concaténer des entiers avec une chaine de caractères, et comme vous le voyez, si jamais ça sort de l’écran, on peut étaler sur plusieurs ligne, le programme s’en fout du moment qu’il y a bien le point virgule à la fin de l’instruction ;).

Je sens que vous êtes légèrement perdus, donc je vais faire un bref rappel sur les variables:

  • On appelle variable d’instance un attribut qui décrit une caractéristique d’un objet de la classe. Chaque objet de la classe possède cet attribut (couleur, nombre de canons, nom…) mais il peut être différent en fonction de l’objet. On y accède en utilisant le nom de la variable suivit d’un point et du nom de l’attribut, par exemple vaisseau1.couleur pour obtenir la couleur du vaissau1 ou encore vaisseau2.nombre_de_canons pour obtenir le nombre de canons du vaisseau2.
  • On appelle méthode d’instance une méthode (fonction) qui peut s’appliquer à une instance (un objet) particulier de la classe, exemple accelerer(), que  l’on applique à un objet particulier, par exemple vaisseau1.accelerer() pour faire bouger le vaisseau1.
  • On appelle variable de classe une variable qui ne dépend pas d’un objet de la classe, mais qui est commun à tous les objets. Ces variables sont repérées par le mot clé « static ». Exemple, nombre_vaisseaux est une variable de classe. Si on la modifie, elle change pour tous les objets. On peut y accéder par le nom de la classe suivit d’un point et du nom de la variable, par exemple VaisseauSpatial.nombre_vaisseaux permettrait d’y accéder depuis une autre classe,
  • de même qu’une autre classe pourrait lancer la méthode main par l’instruction VaisseauSpatial.main(args); En effet la méthode main elle non plus ne s’applique pas à un objet particulier, mais comme toutes les méthodes statiques, elle s’applique à manipuler des objets de la classe.

J’espère avoir été suffisamment compréhensible. Ce que je raconte est un peu dur à suivre, parce que malgrès tout je suis obligé d’introduire peu à peu le vocabulaire de base du programmeur java. Enfin vous avez l’exemple du code source pour comprendre, et en extrapolant un peu par rapport aux autres langages vous devriez avoir les outils pour piger le truc. Je précise que j’ai utilisé le logiciel très connu Eclipse pour programmer ma classe. Ceci dit vous n’en avez absolument pas besoin pour débuter. N’importe quel éditeur de texte basique comme Notepad++ sous Windows, et Gedit sous Linux vous permettrons d’avoir le minimum de coloration syntaxique sans avoir besoin de passer par des choses plus compliquées. Disons que c’est pour moi une habitude et un outil de travail. Je consacrerai sans doute prochainement un article aux environnements de développement.

Pour finir, voici ce que l’on vois lorsqu’on lance ce programme:

vaisseau_java_2-exe

Comme vous le voyez, le main a été appelé, il a déclaré deux vaiseaux qui ont été construits d’après ses spécifications, et il leur a appliqué quelques méthodes d’instance. La variable nombre_vaisseaux a bien été incrémentée deux fois, autant de fois que des vaisseaux ont été construits (elle n’a été initialisée q’une seule fois lors du premier appel de la classe).

Introduction à la programmation Objet

Je me rappelle encore de mon premier cours sur le java. Le prof a expliqué en un quart d’heure ce qu’était une classe, et ce qu’était une instance, et a passé l’heure suivante à employer à tout bout de champ des expressions comme « variable de classe », « variable d’instance », méthode et constructeur, de sorte que tout le monde s’est retrouvé instantanément largué, parce que le temps de se rappeler de ce qu’est un constructeur, le prof était déjà passé à autre chose. On va essayer d’être un peu plus simples.

Le principe de la programmation objet, c’est que dans tout programme, on manipule des objets. Par exemple un jeu de simulation de combat spatial contiendra des vaisseaux, des canons, des projectiles, un espace 3D, etc, tous ces objets interagissant entre eux. Le principe de la programmation objet, c’est de rassembler dans un même bout de programme (la classe) tout ce qui se rapporte à un objet particulier, à savoir: ses caractéristiques (les attributs), par exemple la couleur du vaisseau, son nombre de canons ou sa vitesse, et les actions qu’on peut effectuer avec cet objet (les méthodes), par exemple accélérer, ralentir, etc. On y ajoute aussi un bout de code qui explique comment faire pour créer un nouvel objet. Voici un exemple qui illustre mon explication:

vaisseau_java

Ce qu’il faut retenir, c’est que cette classe décrit comment tous les objets de type VaisseauSpatial seront. Mais il peut y en avoir plusieurs. Chaque fois que l’on va vouloir créer un nouveau vaisseau, on va appeler la fonction/méthode qui porte le même nom que la classe: c’est le constructeur. L’appel de cette fonction réserve la place en mémoire pour stocker un nouveau vaisseau spatial, initialisé comme le dit le constructeur. Par exemple, dans un autre programme, on pourra trouver la séquence suivante:

VaisseauSpatial vaisseau1 = new VaisseauSpatial();
VaisseauSpatial vaisseau2 = new VaisseauSpatial();
vaisseau1.couleur = « jaune »
vaisseau2.accelerer();

Qu’est-ce qui se produit exactement? Eh bien deux objets décrits par la classe précédentes et stockés dans les variables vaisseau1 et vaisseau2 sont créés. La couleur du vaisseau1 ne nous plait pas, donc on la change, et on demande au vaisseau2 d’accélérer un peu. Vous remarquerez la manière dont on s’y prend pour accéder à tout ce qui se rapporte à un objet: on met le nom de la variable, un « . », et le nom du paramètre (attribut) ou de la fonction (la méthode) qu’on veut appeler sur cet objet.

Je n’en dirai pas plus pour aujourd’hui, nous avons vu l’illustration de base du concept, il restera encore à voir comment l’utiliser, c’est un chouia plus complexe, mais pas tant que ça.

Introduction au langage Java

duke3d

Je me demande bien pourquoi je n’ai pas encore parlé du java sur ce blog alors qu’il s’agit de mon langage de programmation préféré. Et comme j’ai tout un tas d’astuces à vous faire partager sur ce langage si sympathique, je me devais de faire une courte introduction sur le langage, son utilité, sa raison d’être, etc.

Alors je vais tacher d’être clair et synthétique, ce qui signifie que je risque aussi d’en oublier. Pour les détails, se reporter à l‘article correspondant de Wikipedia (qui est un peu technique). Alors la première chose qu’il faut avoir en tête, c’est qu’autrefois (jusqu’à il y a 15 ans), les ordinateurs n’étant pas rapides, il convenait d’utiliser des langages de programmation très efficaces qui collent beaucoup à la machine pour en tirer une efficacité maximale. Exemples: le C, l’assembleur, voire même le langage machine pour les plus courageux (le langage machine n’apportant en fait pas grand chose de plus que l’assembleur). La contrepartie à payer était la suivante: La programmation était plus compliquée pour  le programmeur, et les programmes étaient dépendants du système d’exploitation et des caractéristiques physiques de l’ordinateur du programmeur.

De nos jours, les objectifs des programmeurs ont cependant changé. On dispose désormais de machines puissantes, et on veut des langages de programmation faciles d’utilisation permettant de faire de belles choses. Dans ce cadre, la programmation objet a de beaux jours devant elle, et le java en est une référence. Voici maintenant les caractéristiques principales de ce langage:

  • Programmation Objet
  • Sécurité
  • Fort typage et bonne Traçabilité des bugs.
  • Portablilité
  • Facilité d’utilisation et notamment facilité d’interfaçage avec les réseaux de télécommunications et les autres technologies.

Reste à expliquer ce qu’est la programmation objet. Nous verrons cela dans un article ultérieur. La portabilité est sans nul doute l’avantage le plus connu, puisqu’elle permet d’exécuter indifféremment le même langage sur des machines différentes équipées de matériels physiques différents et tournant sous des systèmes d’exploitation différents. Et voici comment ça fonctionne:

Lorsque l’on compile un code java, celui ci est traduit sous forme de bytecode par le compilateur. Le bytecode correspond en gros à une phase intermédiaire de compilation. Il s’agit de la phase la plus poussée jusqu’à laquelle on peut aller avant d’avoir à se préoccuper du système d’exploitation ou des caractéristiques physiques de l’ordinateur.

Ensuite, sur chaque ordinateur où l’on veut exécuter un programme java, on installe un programme que l’on appelle machine java. C’est ce programme qui va se charger d’interpréter le bytecode pour permettre son exécutions sur la machine en question. La machine java dépend bien sûr par contre du système d’exploitation. Alors c’est sûr que ça peut paraitre un peu bête d’un certain point de vue, parce que comparé à un programme écrit dans un autre langage, on installe deux programmes (la machine java +le programme) au lieu d’un seul, et qu’en plus l’exécution sera plus lente vu qu’il faut le temps que le bytecode soit interprété. Mais dés le moment où l’on installe plus d’un programme, on gagne au contraire en place, vu que toute l’interface avec le système est déjà là. Les développeurs gagnent énormément de temps puisqu’au lieu de devoir développer une version de leur programme par système d’exploitation cible, ils n’en ont plus qu’une à développer, et en outre les avantages de facilité d’utilisation, de communication, et de sécurité, alliés à la philosophie de l’orienté objet font du java un langage tout à fait incontournable et très en vogue en ce moment…

Parmis les facilités d’utilisation on notera par exemple le fait que le programmeur n’a plus à se soucier de l’usage de la mémoire. Les allocations et désallocations dynamiques sont gérées par le système de manière automatique grâce notamment à l’existence d’un programme qui tourne en tache de fond, le ramasse miettes (garbage collector en anglais), qui se charge de repérer les objets qui ne sont plus référencés, et ne peuvent donc plus être utilisés par le programme, et qui les désalloue automatiquement.

Bien sûr cet article reste vague, beaucoup de choses n’ont pas été dites, et il faut notamment savoir que tous les avantages cités ont tout de mêmes des limites, mais bon c’était un peu dur de  tout dire en l’espace d’un article ;).

[Avancé] Comment appliquer récursivement une instruction à des fichiers sous Linux

recursion par sebr (cliquez pour afficher l'original)

recursion par sebr (cliquez pour afficher l'original)

Figurez vous qu’aujourd’hui même, on m’a transmis une archive contenant un meli-melo de fichiers .java et de fichiers .class avec pas mal de ramifications des dossiers. Or il se trouve que seuls les fichiers en .java m’intéressaient. Ne souhaitant pas passer des heures à pacourir les dossiers pour virer tous les .class manuellement, je me suis mis en quête d’une commande susceptible d’explorer récursivement les dossiers et sous dossiers, et d’en effacer tous les fichiers en .class.

Après quelques recherches dans les manpages, et quelques essais infructueux, j’ai posé la question sur irc (un salon de discussion en ligne), et j’ai immédiatement obtenu deux réponses toutes aussi fonctionnelles l’une que l’autre. Il suffisait de faire:

  • soit find . -name ‘*.class’ | xargs rm -f
  • soit find . -name ‘*.class’ -exec rm -v {} \;

Comme vous le voyez, les instructions sont composées de deux parties: la première, find . -name ‘*.class’, permet de rechercher récursivement tous les fichiers se terminant par ‘.class‘. La deuxième partie précise le traitement à appliquer aux fichiers. Les deux reviennent au même, mais la manière dont le résultat va être obtenu diffère.

Après discussion il est apparu que la première était la plus fonctionnelle au niveau de la rapidité d’exécution, car la commande rm est appelée une seule fois pour être appliquée d’un coup à toute la liste de fichiers,  tandis que la deuxième s’arrête à chaque fichier trouvé pour le supprimer avant de poursuivre la recherche, ce qui implique l’appel à la fonction rm autant de fois qu’il y a de fichiers, donc la création d’autant de processus, ce qui est couteux pour le système. Cependant la deuxième peut aussi avoir son intéret si un jour j’ai des dizaines de milliers de fichiers à supprimer, car il semblerait que le nombre d’éléments pouvant être passés dans un pipe (la barre verticale) soit limitée. Cela dit le débat reste ouvert car tous n’étaient pas d’accord sur la manière de procéder du Xargs. Voir la page de Wikipedia dédiée à Xargs (en) pour plus d’informations.

Pour conclure, ici on s’est intéressé à l’effaçage récursif d’un type donné de fichier, mais on remarquera aisément qu’en remplaçant rm par une autre commande, on peut généraliser ainsi l’application récursive d’une instruction à tous les dossiers et sous dossiers d’un répertoire.

note: ne pas faire attention aux options du rm. Je les ai reportées telles qu’on me les a données, mais il faut bien voir ce qu’elles veulent dire: le ‘-v’ de la deuxième commande, demande au rm de dire ce qu’il fait au fur et à mesure, et le ‘-f’ de la première commande demande d’ignorer les éventuels avertissements du système. Il convient de les modifier avec discernement en fonction de la situation.

PS: Faites des sauvegardes avant de faire des tests :).

Un outil très utile pour se faciliter la vie au niveau des requêtes HTTP en java

httpclient

Je n’ai pas encore parlé du langage java sur ce blog, et c’est un tort, car c’est vraiment un langage de programmation qui vaut le détour. Bon je n’aurai pas le temps de l’introduire aujourd’hui (si ce n’est pas malheureux de ne même plus avoir le temps de bloguer le Week end! 😉 ), donc je vais juste présenter pour ceux qui connaissent déjà le java un outil très utile qui s’appelle httpclient. Pour les autres, les explications viendront plus tard :).

Le but de cet outil est simple: mettre à la disposition des gens qui programment des applications Web en java un ensemble de fonctions qui va leur faciliter la vie. Je vous le recommande chaudement, c’est vraiment très utile et très bien fait. Alors pour le trouver, voici:

Et j’ajouterai que pour ceux qui ont le problème que j’ai eu de devoir se connecter à travers un proxy, on peut aisément le résoudre. Par exemple, supposons que quelque part dans votre code, vous ayez déclaré un nouvel Httpclient, il vous suffit de lui paramétré le proxy juste après, ce qui donnera quelque chose du style:

HttpClient client = new HttpClient();
client.getHostConfiguration().setProxy(proxyHost, proxyPort);

où proxyHost est une adresse de proxy, par exemple une IP sous forme de String, et proxyPort un entier qui repésente le numéro de port. Pour connaitre ces paramètres, il suffit de regarder quels sont ceux de votre navigateur internet et de les recopier (si vous utilisez Firefox 3, édition -> préférences -> avancé -> réseau -> paramètres).

Quelques liens utiles pour programmer sereinement

www

A la demande de quelqu’un, voici quelques uns des liens que j’utilise fréquemment pour programmer.

1) Sites généraux:

  • Google code: très utile pour trouver un petit bout de code, un fichier.h mystérieux, etc..
  • Développez.com: Sur ce site vraiment très utile, vous trouverez tout un tas de tutoriels très bien fait, et le forum est actif est très utile également. Ce site m’a bien dépanné pendant mon stage de deuxième année :).
  • Programmez.com: Site un peu similaire sur lequel on peut également trouver pas mal de tutos très intéressants.
  • Le site du zéro: On ne le présente plus, ce site est très adapté pour apprendre à partir du niveau débutant.
  • Et bien sûr, quoiqu’on n’y pense pas toujours, quelques articles de wikipédia dont celui sur la programmation ;).
  • Enfin, wikibooks sera sans doute l’un de vos amis les plus chers, ce site est vraiment génial :).

2) Sites spécifiques au langage C:

  • C++ Référence: très sympa pour retrouver rapidement le prototype d’une fonction et à quoi elle sert.
  • cplusplus.com: bon complément du précédent.

Notez que ce ne sont que les sites que je connais et que j’ai référencés dans les marque pages. Mais je ne prétend pas les avoir tous trouvés, ni avoir trouvé les meilleurs, donc pour des sites complémentaires sur le C, je vous laisser chercher ;).

3) Sites spécifiques au langage java:

  • Javadoc online: Comme son nom l’indique, ce site permet d’accéder online à la javadoc commune, vraiment très très utile. Je vous conseille de le mettre en anglais, car parfois on tombe sur des pages d’explication en français, mais qui ne sont pas de la vraie javadoc.

Et une fois encore je me limiterai à ça, même si j’ai tout plein de liens divers dans mes favoris sur le sujet. De toute manière beaucoup pointent vers l’un des sites généraux du premier paragraphe. Si vous avez besoin d’un site précis et que vous ne trouvez vraiment pas, laissez toujours un com, je regarderai si j’ai ça quelque part ;).

Autres langages:
Concernant les autres langages, je n’ai pas de site particulier les concernant, à part quelques pages spécifiques par ci par là. Pareil, jetez un coup d’oeuil au sites généraux, vous devriez pouvoir y trouver votre bonheur :o).