Trieur Organisé de Solutions et de Ressources Informatiques

logo du site TOSRI

27 septembre 2010

Niveau : personne ne possdant pas de comptences de bases en informatique

Linux : Les bases de la console

Ce billet fait office d'aide mémoire pour les bases de la console Linux. Ces petites bases vous permettront de créer des scripts plus puissants et plus efficaces. Elles ne sont pas indispensables, juste nécessaires ;-)
Nous allons découvrir tout ceci :

Les opérateurs :

Ils permettent d'exécuter des commandes à la suite selon ce qui s'est passé à la commande précédente.

  • Le "commande1 && commande2" : il regarde le code erreur de la commande1, si celle-ci s'est bien passée (code retour=0) alors on exécute la commande2 sinon on ne fait pas la commande2
  • Le "commande1 || commande2" : Comme son collègue, il regarde le code erreur de la commande1, mais cette fois-ci, il ne lance la commande2 que si la commande1 a échouée (code retour != 0)
  • Le "commande1 ; commande2" : Celui là est spécial, il ne regarde pas ce qui s'est passé avant. Il exécute bêtement les commandes1 puis la commande2.

Les trois flux standards :

  • Le flux 0 : Il est aussi appelé stdin. Il s'agit du flux d'entrée. Une redirection du flux d'entrée dans une commande permet des fois de changer le comportement de la commande.

Exemple avec grep "te" <test qui cherche le mot "te" dans le fichier test placé sur l'entrée (stdin) de grep

  • Le flux 1 : il est aussi appelé stdout. Il s'agit du flux standard de sortie. Tout ce qui est affiché sur l'écran est par défaut envoyé sur stdout. Cependant, les messages d'erreurs ne sont (normalement) pas envoyé sur ce flux.

Exemple : cat coucou > coucoubis (qui nous fait une copie de fichier !)

  • Le flux 2 : Il s'agit de stderr. C'est le flux d'erreur. Toutes les erreurs de retour au sein des programmes doivent être envoyé sur ce flux. Il est extrêmement pratique !

Exemple : make 2>erreur.log. Cet exemple permet de récupérer toutes les erreurs lors de la compilation et de les mettre dans un fichier de log.

Les tubes

Cette technique est relativement simple et puissante. Elle permet de rediriger le flux d'un programme vers un autre. On peut donc utiliser le résultat d'une commande en entrée dans la commande suivante. Petit exemple : ps aux | grep apache2 permet d'envoyer dans la commande grep les processus courants et de rechercher (grep) la ligne où apache2 apparait. Pratique pour récupérer rapidement un PID (Process ID)

Raccourcis

  • Le !! permet de voir la dernière commande et de la ré-exécuter.
  • Le !24 permet de voir la 24ème commande de l'historique (voir la commande history) et de la ré-exécuter.

Variable shell

Certaines variables contiennent des informations sur votre environnement, il peut être pratique, voire nécessaire de les récupérer

  • echo $? : permet de voir le code retour de la dernière commande exécutée. (rappel : 0 -> ok, différent de 0 -> erreur)
  • echo $$ : donne le PID du shell courant
  • echo $! : très intéressant, donne le PID du dernier travail lancé en arrière plan
  • echo $HOME : renvoi le chemin du répertoire personnel de l'utilisateur
  • echo $PATH : liste des chemins possibles des commandes exécutables
  • echo $PS1 : affiche l'invite principale du shell
  • echo $PWD : renvoi le chemin du répertoire courant
  • echo $RANDOM : donne un nombre entier aléatoire compris entre 0 et 32767

Plus de complément sur http://www.epons.org/shell-bash-variables.php

Exécuter un fichier

La manipulation est aisée, mais encore faut-il la connaitre (ou s'en rappeler ;-) )

  • Ajoutez-vous les droits x sur le fichier (les droits d'exécution), via chmod u+x (d'autres commandes existent)
  • Lancer le programme soit par "./monprogrammeaexecuter" (sans les quotes) , soit si vous avez rajouté le chemin du dossier contenant le programme, directement "monprogrammeaexecuter" sans le . et les quotes

9 août 2010

Niveau : personne ne possdant pas de comptences de bases en informatique

Les bases en informatique : les différentes conditions

Bonjour,
Ce jour-ci si cela vous sied je vais vous enseigner comment s'utilisent les conditions.

Une condition c'est quoi ?
Imaginez un programme qui pose une question, exemple : "Saisissez un entier inférieur à 4 : ". Là votre doigt ripe sur le clavier et vous entrez 12593 (vous ripez facilement avouez le). Cette valeur n'étant pas inférieur à 4 (si si) il faut que le programme disent que vous avez ripé sur votre clavier, mais comment fait-il pour savoir ? Il utilise une condition. Il fait "si jamais la valeur que la personne vient de saisir est incorrecte je dois lui signaler !".


Le Si ... Alors


Reprenons notre exemple précédent.
Voici la condition :

"Saisissez un entier entre 1 et 4 : "
L'utilisateur saisi.
Si nombre tapé > 4 Alors
    agir
Finsi
continuer le programme

traduction code :
if(condition){
    agir
}
continuer le programme


Si on saisi 2 par exemple on ne va pas faire "agir" et on va "continuer le programme".
Si on saisi 12593 on va faire "agir" et on va "continuer le programme".

"agir" peut être beaucoup de choses, remplacer la valeur incorrecte par une valide, afficher un message d'erreur, ...
Si tout va bien est que la condition est incorrecte (si la valeur est inférieure à 4) on n'agira jamais.


Le Si ... Alors ... Sinon


Le si alors sinon sert lorsque l'on veut faire quelque chose de particulier dans le cas où la condition est vraie et autre chose quand la condition est fausse.

Exemple :
"Saisissez un entier entre 1 et 4 : "
L'utilisateur saisi.
Si nombre tapé > 4 Alors
    Afficher "Vous avez fais une erreur"
Sinon
    Afficher "Vous avez bien saisi"
Finsi
continuer le programme

traduction code :
if(condition){
    agir 1
}else{
    agir 2
}
continuer le programme


Ainsi nous avons deux messages chacun affiché dans un cas ou l'autre.


"Mais si jamais on veut plus de deux choix comment on fait ?". Il existe plusieurs solutions.
Ce qui est génial avec les conditions on peux les imbriquer comme on veux dans tous les sens.

Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon
    Si nombre tapé = 2 Alors
        Afficher "Vous avez tapé le chiffre deux"
    Sinon
        Si nombre tapé = 3 Alors
            Afficher "Vous avez tapé le chiffre trois"
        Sinon
            Afficher "Vous avez tapé autre chose que 1, 2 et 3"
        Finsi
    Finsi
Finsi

L'imbrication peut être lourde à écrire mais elle est parfois inévitable voir même plus claire et plus efficace.
Il y a un moyen de l'alléger avec la forme de condition suivante dont je vais vous parler.


Le Si ... Alors ... Sinon Si ...


Cette forme n'existe pas dans la totalité des langages et ne s'écrit pas forcément pareils partout mais elle est très utile.

Elle s'écrit :
Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon Si nombre tapé = 2 Alors
    Afficher "Vous avez tapé le chiffre deux"
Sinon Si nombre tapé = 3 Alors
    Afficher "Vous avez tapé le chiffre trois"
Finsi

Remarque : Si vous tapez 4 ou autre chose, rien ne se passera car si une condition est fausse le programme cherche à vérifier les suivantes, si aucune ne se vérifie aucune des instructions ne sera exécutée.

Vous pouvez tout à fait rajouter à la fin un sinon sans condition :
Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon Si nombre tapé = 2 Alors
    Afficher "Vous avez tapé le chiffre deux"
Sinon Si nombre tapé = 3 Alors
    Afficher "Vous avez tapé le chiffre trois"
Sinon
    Afficher "Vous avez tapé autre chose que 1, 2 et 3"
Finsi
Et vous aurez un traitement dans tous les cas.

En code on peux l'écrire de deux manières :
if(condition){
    agir 1
}elseif(condition 2){
    agir 2
}

ou
if(condition){
    agir 1
}else if(condition 2){
    agir 2
}

Soit un petit espace entre else et if ou pas.

"En effet c'est plus simple mais dans tes exemples tu traite les valeurs possibles de la même variables, il n'y a pas plus simple pour gérer une seule variable ?" Si c'est la forme suivante.


Le Selon ... Faire


Le selon sert, comme dit précédemment, à gérer plusieurs valeurs d'une même variable.
Nous allons changer d'exemple pour être plus concert.
Imaginez que vous voulez un programme qui vous donne la date et plus particulièrement le jour de la semaine (Lumdi, Mardi, ...), mais dans votre code vous ne pouvez identifier cette valeur que par un entier (de 1 à 7).
Le selon va trouver son utilité dans ce cas précis.

Algo :
Selon leJour Faire
    cas 1 : Afficher "Lundi"
                Stop
    cas 2 : Afficher "Mardi"
                Stop
    cas 3 : Afficher "Mercredi"
                Stop
    cas 4 : Afficher "Jeudi"
                Stop
    cas 5 : Afficher "Vendredi"
                Stop
    cas 6 : Afficher "Samedi"
                Stop
    cas 7 : Afficher "Dimanche"
                Stop
    par défaut : Afficher "Votre jour n'existe pas"
FinFaire

"Mais c'est quoi ces "Stop" et ce "par defaut" ? " Patience j'y viens.
Les "Stop" servent à dire "On a fini de tout faire pour le cas en cours, sort du selon et continue le programme".
"Mais pourquoi il le fait pas tout seul ?" Il s'avère que parfois avec plusieurs cas différents on a besoin des mêmes instructions. Donc plutôt que de réécrire les mêmes lignes, on enlève le stop.
Exemple :
    cas 1 :
    cas 2 : Afficher "Mardi"
                Stop

Ici que ce soit lundi ou mardi, on affichera "Mardi".
Exemple plus intéressant :
    cas 1 : Afficher "Nous somme le jour avant : "
    cas 2 : Afficher "Mardi"
                Stop
Pour Lundi on affichera le texte : "Nous somme le jour avant : Mardi".
Et pour mardi on affichera simplement "Mardi". Vous voyez toutes les possibilités ?

De plus vous pouvez traiter autant de cas que vous voulez :
Selon leJour Faire
    cas 1 : Afficher "Lundi"
                Stop
    cas 7 : Afficher "Dimanche"
                Stop
    par défaut : Afficher "Votre jour est différent du Lundi et de Dimanche"
FinFaire

Et je n'ai pas oublié de parler de "par défaut".
Ce qui est écrit dans ce cas là sera fait si aucun des cas précédents n'a été traité. C'est pourquoi on le laisse à la fin et qu'on ne lui met pas de stop (on est déjà à la fin du selon). Le "par défaut" n'es pas obligatoire, si on ne veux rien faire par exemple on ne le met pas, on peut même laisser autant de cas que l'on veut vide, le stop nous emmènera à la fin de toutes façons.

En code on peux l'écrire :
switch(leJour){
    case 1 : Afficher "Lundi"
                break;
    case 2 : Afficher "Mardi"
                break;
    case 3 : Afficher "Mercredi"
                break;
    case 4 : Afficher "Jeudi"
                break;
    case 5 : Afficher "Vendredi"
                break;
    case 6 : Afficher "Samedi"
                break;
    case 7 : Afficher "Dimanche"
                break;
    default : Afficher "Votre jour n'existe pas"
}


Remarque importante :
Le selon ne prend pas n'importe quel type de variable, il est utilisé pour les nombres et les caractères. Dans certains langages les chaines de caractères sont acceptées (PHP par exemple).


Remarque finale : Dans les langages orienté objet, il existe ce que l'on appelle des exceptions qui sont des sortes de conditions mais elles sont utilisées dans les cas d'erreur d'exécution de programme, pour faire des traitements particuliers, j'en parlerai dans un article de niveau plus avancé.


Voilà pour les différents types de conditions existantes dans le monde de la programmation. J'espère avoir été clair, n'hésitez pas à laisser des remarques et/ou des questions.

7 juillet 2010

Niveau : personne ne possdant pas de comptences de bases en informatique

Les bases en informatique : les boucles

Qu'est-ce qu'une boucle ?

Une boucle c'est deux lignes spéciales et tout ce qui est au milieu va être répété un certain nombre de fois, car après tout une boucle ça sert à ... boucler ! Merci ceux du fond !

Mais en programmation il existe de nombreuses manières de faire des boucles et je vais essayer de vous les détailler dans ce petit tutoriel.


Tant que ... Faire ...


Cette boucle est la plus basique elle s'utilise en général de la manière suivante :
while(condition){
     instructions
}


Et ça veut dire :
Tant que condition est vraie Faire
     instructions
FinFaire

En gros, aussi longtemps que la condition sera vérifiée alors les instructions seront exécutées encore et encore.

Exemple concret :
J'ai un compteur qui est initialisé à 0.
Et je fais une boucle qui dit "Tant que mon compteur est inférieur à 10 on va ajouter 1 à mon compteur".

compteur reçoit 0
Tant que compteur < 10 Faire
     compteur reçoit compteur + 1
FinFaire

Blague :
On va dire que la condition de poursuite de boucle (ou condition d'arrêt dans notre jargon) est : "1 est égal à 1".
"Mais mais c'est toujours vrai ça, non ?", En effet.
"Mais alors à chaque fois que les instructions sont finies la condition est toujours vraie ?", Oui oui.
"Mais la boucle recommencera encore ?", c'est toujours ça.
"Mais ça n'a pas de fin !", exactement là où je voulais en venir.

Vous venez de voir "la boucle infinie" !! Très peu utilisée elle sert parfois. Et je ne peux que vous conseiller de ne pas l'utiliser et pour éviter d'en faire de bien vérifier votre condition d'arrêt.

"Ouaaa alors c'est ça qui fait bloquer et tout ralentir ?!?" et oui.
Il y a d'autres manière d'en faire : des simples, des complexes, avec d'autres types de boucles, ... Je ne vais pas les détailler à chaque fois sauf si vous le demandez gentiment (demandez par pitié ...).


Répéter ... Tant que ... ou Répéter ... Jusqu'à ce que ...


Elle est très proche de tant que faire mais avec une différence expliquée plus bas.
Elle s'utilise en général de cette manière :
do{
     instructions
}while(condition)


Traduction :
Répéter
     instructions
Tant que condition est vraie

"Mais c'est quoi la différence avec la première ???" La position de la condition. Je m'explique :
"Tant que la condition est vraie alors répéter la boucle" si la condition est fausse dès le départ la boucle ne sera pas exécutée du tout. "Répéter la boucle tant que la condition est vraie" peut se traduire et est plus explicite avec "Répéter la boucle jusqu'à ce que la condition soit fausse". Je sais le vrai ou faux peut gêner au niveau du sens, mais elle reste plus compréhensible. Au final la boucle est exécutée et si la condition est fausse on arrête de tourner, mais la boucle aura été exécutée au moins une fois.

"Mais je comprends pas l'utilité d'avoir deux boucles comme ça."
Exemple concret :
"Veuillez saisir un entier supérieur à 0 : "
Vous tapez.
Le programme réfléchit, voit que vous vous êtes trompé.
"Il y a une erreur"
"Veuillez saisir un entier supérieur à 0 : "
Elle est principalement utilisée dans des cas de calculs nécessitant une nouvelle exécution jusqu'à un résultat correct, voilà pourquoi il peut être préférable de dire "Répéter jusqu'à ce que la condition soit fausse" quitte peut être à la mélanger avec l'autre, car après tout "Tant que la condition est vraie on recommence".


Pour ... De ... A ... Avec un pas de ...


Dans les boucles précédentes les conditions des boucles que nous avons vues pouvait impliquer un nombre de "boucle" plus ou moins long voir même infini ou ne pas boucler une seule fois.
Le Pour a été créé pour faire des boucles ayant un nombre de boucles fini que l'on peut connaitre à l'avance.

Il s'écrit la plupart du temps en code comme :
for(compteur = valeur; condition avec compteur; opération avec compteur){
     instructions
}


Exemple :
for(compteur = 1; compteur <= 10; compteur = compteur + 1){
     instructions
}
Traduction :
Pour compteur De 0 A 10 Avec un pas de 1 Faire
     instructions
FinFaire

Traduction (enfin) :
Faire les instructions 10 fois.
"Ah enfin je ne comprenais plus rien" Désolé, mais il faut dire qu'elle est un peu moins simple que les précédentes.
Elle s'écrit donc en trois parties : une initialisation, une condition de sortie et une opération.

Détaillons la traduction pour bien comprendre :
"Pour compteur De 0 ..."
Initialisation : la variable compteur reçoit 0.
"... A 10 ..."
Condition de sortie: tant que (tiens ça me dit quelque chose ^^) la variable n'a pas atteint la valeur 10
"... Avec un pas de 1 ... "
Opération : la variable compteur reçoit 1 de plus que lors de la boucle précédente

Dans cette boucle la variable compteur aura comme valeur 1 dans la 1ère boucle, 2 dans la 2ème, ...
Ainsi la boucle tournera 10 fois, ni plus, ni moins. J'ai entendu une remarque plus haut avec le "tant que", en effet la condition d'arrêt est bien "tant que la condition est vraie". Il serait donc possible de réécrire cette boucle avec un Tant que Faire.

Transformation en Tant que Faire :
compteur reçoit 0
Tant que compteur <= 10 Faire
     instructions
     compteur reçoit compteur + 1
FinFaire

Les deux boucles font la même chose, mais elles sont différentes, vous pouvez utiliser les deux, mais il est préférable d'utiliser le "Pour" lorsque vous connaissez le nombre de tours à faire.


Etiquette ... et Aller à ...


Ces instructions permettent de faire des boucles, mais elles sont à la fois beaucoup plus simples que les autres et font quelque chose de spécial. Elles ne se trouvent pas dans tous les langages, mais je vous en parle car on en trouve encore.

Etiquette se traduit par Label
Aller à se traduit par Goto

Exemple :
instructions 1
Etiquette 1
instructions 2
Aller à 1

Aller à 2
instructions 3
Eiquette 2

C'est un simple exemple pour bien comprendre.
Etiquette ne fait rien de spécial à part indiquer qu'elle est là.
Aller à agit directement, elle demande au programme de "sauter" toutes les instructions du code et de reprendre à l'Etiquette 1

Dans l'exemple précédent, on fait instructions 1, on passe par Etiquette 1 sans rien faire, on fait instructions 2, on tombe sur Aller à Etiquette 1, on va à Etiquette 1, on fait instructions 2, on tombe sur Aller à Etiquette 1, on va à Etiquette 1, on fait instructions 2 et ainsi de suite sans avoir de fin. Donc dans cet exemple il serait judicieux de rajouter un test pour savoir si on exécute la ligne "Aller à".

Dans la deuxième partie de l'exemple on tombe sur Aller à l'étiquette 2, on s'y rend sans jamais exécuter instructions 3.
Comme expliqué leur fonctionnement est simple, mais leur utilisation est risquée, on se perd assez facilement, il est préférable de suivre toutes les instructions bien dans l'ordre, sans avoir à aller dans tous les sens dans le code.



Voilà j'espère avoir été assez clair n'hésitez pas à laisser des commentaires s'il y a des flous ou un manque de détails.