Bienvenue sur l'espace de ressources et tutoriels des Conseillers Numériques de la Labomedia !
Vous pouvez également nous retrouver dans le monde non-numérique, les mercredis de 13H à 19H, au 108 rue de Bourgogne.

Renforcement Informatique

Plus grand, plus haut, plus fort ! Ou pas ! Pour aller plus loin dans l'informatique en toute tranquillité !

Sécuriser ses usages

Pourquoi & comment ? Comment & pourquoi ?

Sécuriser ses usages

Qu’est-ce qu’un bug ?

 

Le premier bug informatique a eu lieu en 1947. A cette époque, Mme Hopper s’attend à ce que l’ordinateur se comporte d’une certaine manière… et cela ne fonctionne pas ! Celle-ci est bien désappointée. Jusque là, l’ordinateur s’est comporté de manière toujours fiable et a toujours fait ce qu’on lui demandait. Après avoir retourné le problème dans tous les sens, et ne voyant pas d’issue, elle décide d’ouvrir le capot de la machine. Stupeur ! Dans les méandres des composants, un insecte, en anglais bug, s’est glissé et, frit par la tension électrique, a créé un court-circuit là où il ne fallait pas. Ce qui explique le comportement étrange de la machine.

En réalité, le mot était déjà utilisé avant cela, mais l’anecdote est croustillante !

Le mot désigne ce qui deviendra le plus grand fléau de l’informatique : une situation où ça devrait marcher, mais ça marche pas. Il est par essence difficile de comprendre d’où vient un bug, car si on le savait, alors ça ne serait pas un bug. Une solution courante dans le milieu informatique est de jeter l’ordinateur par la fenêtre afin de nier le problème.

Un bug célèbre concerne un jeu vidéo bien connu : le premier pac-man. Dans celui-ci, il n’est pas possible d’atteindre le niveau 257, quand bien même vous seriez très fort. En effet, dans la mémoire, le numéro de niveau est stocké dans un octet, c’est-à-dire une suite de 8 chiffres binaires. Au premier niveau, l’octet est égal à 0000 0000. Lorsqu’on gagne le premier niveau, on augmente, à partir de la droite, le compteur : 0000 0001. Lorsque l’on gagne le deuxième niveau, il n’est pas possible d’augmenter le dernier bit de l’octet, celui à droite, car il est déjà égal à 1 et que nous sommes en binaire. À la place, on augmente le bit à sa gauche, et on remet celui-ci à zéro. Nous sommes alors à 0000 0010. Mais lorsque l’on est au niveau 256, l’octet est maintenant égal à 1111 1111. Or, lorsque que l’on gagne le niveau, c’est bel et bien le bit à gauche de l’octet qui sera augmenté. Or celui-ci est hors du score du niveau, et utilisé pour tout-à-fait autre chose… qui ne voudrait pas qu’il change ! Mais l’algorithme en a décidé autrement et fout le bazar dans le programme : le jeu bugue...

Sécuriser ses usages

Ne pas saturer sa mémoire-vive

 

La mémoire vive de l’ordinateur est une mémoire particulière, rapidement accessible et modifiable, contrairement à la mémoire dite morte qui constitue le disque dur.

Lorsque vous lancez un programme, celui-ci accède à la mémoire vive. En effet, il est en général composé d’une multitude de petits algorithmes qui vous permettent de travailler. Par exemple, dans un logiciel de traitement de texte, il y a une fonctionnalité pour mettre les mots en italique, une fonctionnalité pour rajouter une image, une fonctionnalité pour centrer le contenu, une fonctionnalité pour ajouter des cadres colorés, etc.

Pour utiliser ces fonctionnalités rapidement, celles-ci sont donc chargées dans la mémoire vive. Elles y prennent de la place, et il y a donc moins d’espace pour d’autres fonctionnalités. Plus vous ouvrez d’applications et de fichiers en même temps, plus la mémoire se remplit, et plus l’ordinateur est long à réagir. Pire, si vous ouvrez trop d’applications, il ne reste plus assez de mémoire vive pour les fonctionnalités de base de votre ordinateur, celui-ci se bloque, et il faudra l’éteindre manuellement pour résoudre le problème…

La vidéo, notamment en haute définition, peut-être très consommatrice en ressources. Si votre PC est un peu âgé, il est préférable de clore toute autre application avant d’en regarder une.

Lorsque le PC est très sollicité, celui-ci commence à chauffer davantage et cela déclenche les ventilateurs. Lorsque ceux-ci se mettent à souffler, cela peut indiquer l’utilisation d’une grande partie de la mémoire vive.

Sécuriser ses usages

Qu’est-ce qu’un bon mot de passe ?

mdp.png

 

Un bon mot de passe est un mot de passe que seul vous connaissez.

 

Si vous vous mettez dans la peau d'un infâme pirate informatique, pour découvrir un mot de passe, deux solutions sont préconisées :

Pour éviter le bruteforce, il faut multiplier le nombre et le type de caractères du mot de passe.

 

Par exemple, si vous choisissez un mot de passe contenant deux lettres, alors le nombre de possibilités est de 26 pour la première, 26 pour la deuxième. Il faudra alors 26 * 26 essais pour être sûr de découvrir la bonne combinaison, soit 676 essais. Autrement dit, moins d’une seconde pour un ordinateur.

 

En utilisant majuscules, chiffres et caractères spéciaux, vous augmentez le nombre de caractères disponibles ( aux alentours de 70 ). Nous sommes donc à 70 * 70, soit 4 900 essais.

 

À chaque caractère que vous ajoutez, vous multipliez le nombre d’essai à réaliser par le nombre de caractères disponibles, ici par 70. Donc un mot de passe à trois chiffres sera compris dans un ensemble de 70 * 70 * 70 essais, soit 343 000 .

 

Un mot de passe à 15 chiffres demandera 70^15 ( 70 puissance 15 ) essais, soit : 4.7475615e+27 essais. C’est pas mal !

 

Pour accélérer les recherches, les pirates commencent en fait par les combinaisons les plus probables, c’est-à-dire contenant des dates de naissances, des prénoms, des mots. Utilisez si possible des suite aléatoires de frappes de clavier, en mémorisant le mot de passe comme une comptine pour enfant, et en utilisant la mémoire musculaire plutôt que la mémoire des lettres.

 

Pour évitez l’espionnage, rappelez-vous qu’un mot de passe est personnel, il n’a pas vocation à être communiqué. Le temps de le mémoriser, vous pouvez le noter dans un carnet anodin, qui restera dissimulé.

 

Enfin, même si cela nécessite de mémoriser plus d'informations, évitez d'utiliser deux fois le même mot de passe pour deux sites différents. Si l'un des deux sites est attaqué, et que l'attaquant récupère votre mot de passe, il possède alors le mot de passe pour les deux sites.

Sécuriser ses usages

Qu’est-ce qu’un VPN ?

Un VPN est un service internet permettant de cacher l’IP qui vous identifie sur internet.

 

En l’activant, vous communiquerez à distance avec un serveur qui s’occupera de réaliser à la place de votre ordinateur les requêtes demandées.

 

Depuis l’extérieur, c’est donc le VPN et non votre ordinateur qui sera visible, permettant d’améliorer votre anonymat.

 

Les données qui transitent entre le VPN et votre ordinateur sont chiffrées.

 

En général, il s'agit d'un service payant, sous forme d'abonnement.

Fonctionnalités avancées

Les trucs et astuces de l'informatique pour gagner en temps et en possibilités.

Fonctionnalités avancées

Qu’est-ce que le clic droit de la souris ?

En règle générale, le clic droit de la souris permet d’ouvrir un petit menu qui concerne l’élément sur lequel vous avez cliqué.

 

C’est un excellent raccourci pour éviter de passer par le menu du logiciel, et pour voir quelles actions il est possible d’effectuer sur l’élément que vous avez pointé.

Fonctionnalités avancées

Qu'est-ce que copier / coller / couper ?

Copier / Coller / Couper sont trois actions qui vous permettent de copier et déplacer des données. Ce mécanisme se sert d'un endroit de l'ordinateur appelé presse-papier pour stocker des données. Les raccourcis associés sont : ctrl + c, ctrl + v et ctrl + x.

 

copiercollercouper.png

 

Il est intéressant de noter que du fait que l'ordinateur stocke toutes les informations sous forme de 0 et de 1, n'importe quelle donnée peut être copiée et collée : un dossier, du texte, une portion d'image, un logiciel...

C'est un moyen rapide de transférer des fichiers d'un dossier à un autre, par exemple sur une clef USB.

Attention ! Le presse-papier ne peut contenir qu'un élément à la fois. Si vous coupez un document, puis en coupez un autre avant d'avoir collé le premier, celui-ci risque d'être perdu !

Fonctionnalités avancées

Qu’est-ce que permet Enregistrer-Sous ?

Enregistrer-Sous est une fonctionnalité souvent présente dans le menu Fichier d’un logiciel.

 

Elle permet d’enregistrer le document en cours d’édition sous un autre nom que celui actuellement édité : elle créé donc une copie du document, et toute modification du document n’affectera pas la sauvegarde précédente du fichier.

 

Elle permet donc de garder un modèle à côté, ou de générer facilement une version à jour en gardant la structure initiale, si le document doit par exemple être mis-à-jour tous les mois pour la période en cours, comme dans le cas d'un suivi mensuel de trésorerie.

 

Le raccourci clavier associé est généralement Ctrl + Maj + S .

Fonctionnalités avancées

À quoi sert Control + F ?

Control + F, en référence au mot find, en anglais, signifiant trouver, ouvre une petite boîte qui vous permet de spécifier du texte à trouver dans le document en cours, par exemple un fichier texte ou une page internet.

 

Il permet d’accéder rapidement à une information si le texte est très long, ou de vérifier que le texte traite bien du sujet recherché.

Fonctionnalités avancées

Qu’est-ce qu’un algorithme ?

Imaginez que vous avez faim. C’est un problème. Pour le résoudre, vous pouvez, par exemple, le diviser en deux étapes : premièrement, cuisiner, ensuite, vous goinfrer goulûment. Pour cuisiner, vous suivrez probablement une recette de cuisine. La recette de cuisine est un outil bien pratique : lorsque que vous suivez les étapes une à une, elle vous permettent d’obtenir à la fin un résultat, par exemple un gâteau à la crème fourré au fraises. Avec du coulis.


Un algorithme est une méthode permettant de résoudre un problème. La recette de cuisine est un algorithme par excellence : une succession d’étape qui permet d’arriver à un résultat connu à l’avance. Comme nous l’avons vu précédemment un algorithme peut lui-même être divisé en petits algorithmes, qui eux-même peuvent être divisés, etc.


Les algorithmes sont au cœur de l’informatique. Les transistors, les petits composants électroniques au sein de l’ordinateur, peuvent être reprogrammés sous-différentes formes qui correspondent à un algorithmes. Il peuvent être reprogrammés en calculatrice, en logiciel de dessin, en moteur de recherche.

On entend souvent parler des algorithmes des grandes plateformes, par exemple de l'algorithme de Google. En fait, ces entreprises ont créé des programmes informatiques extrêmement complexes. Il paraît que celui de Google fait plus de 2 000 milliards de lignes. Celui-ci est constitué de myriades d'algorithmes plus spécialisés, qui eux-même se décomposent, jusqu'à arriver à de petites briques fondamentales. Cela peut donner le tournis, car personne ne sait réellement comment celui-ci fonctionne entièrement. Certains savent comment l'algorithme marche dans sa globalité mais ne savent pas comment les sous-parties fonctionnent, d'autres savent comment marche une partie précise mais pas comment le tout est articulé.

Découvrir la programmation

Hello World ! Pour les premiers pas en programmation, c'est par ici !

Découvrir la programmation

Qu'est-ce qu'une variable ?

Une variable est un composant fondamental en programmation. Il s'agit de créer une information dans l'ordinateur que nous pourrons utiliser et modifier.

Voici la syntaxe habituelle qui permet de créer une variable. En informatique, on appelle cela déclarer une variable :

int ma_variable = 7;

Disséquons, un à un, les composants de cette ligne de code.






Veuillez noter que la syntaxe peut varier en fonction du langage de programmation que vous utilisez. Python, qui est un langage simplifié, vous permet d'écrire l'équivalent de la ligne précédente en omettant le type et le point-virgule :

ma_variable = 7

Ce qu'il est important de comprendre à propos de la variable, c'est que lorsque nous la déclarons, nous créons un espace dans la mémoire de l'ordinateur qui pourras retenir une information. Le nom de la variable est l'équivalent de l'adresse de cet espace de mémoire. Quand nous utilisons le nom de la variable, nous accédons à son contenu :

ma_variable = "Hello World";
print( ma_variable );

Dans l'exemple ci-dessus, nous créons une variable, puis nous demandons de l'afficher à l'écran. C'est bien "Hello World" qui s'affiche, et non ma_variable.


Assez intuitivement, une des propriétés de la variable est de pouvoir... varier. Il est possible de changer son contenu au cours du programme :

string ma_variable = "Hello World";
print( ma_variable );
ma_variable = "Bonjour Monde";
print( ma_variable );

Ici, c'est d'abord "Hello World", puis "Bonjour Monde" qui est affiché à l'écran. Le contenu de la variable est donc modifié en cours de route.

Vous noterez qu'il n'est pas nécessaire de réassigner le type quand on change le contenu, je n'ai donc pas remis le mot "string" quand je lui ai assigné le contenu "Bonjour Monde".


Mais qu'est-ce que le type d'une variable ?

Le type d'une variable permet à l'ordinateur de savoir comment l'interpréter. Il en existe quatre fondamentaux :

En guise d'exemples :

int mon_nombre_entier = 7;
float mon_nombre_a_virgule = 1.7;
char ma_lettre = "a";
bool mon_booleen = True;

En réalité, nous utilisons très rarement le type char. À la place, nous utilisons un type qui agrège plusieurs chars ensemble, nommé string, et qui permet d'écrire du texte directement :

string mon_texte = "Hello World";

Pourquoi utilise-t'on des types ?

En fait, l'ordinateur n'a pas notre capacité intuitive de reconnaître des objets. Prenons par exemple une variable qui contient le texte suivant :

string mon_texte = "Il y a 5 pommes sur une table.";

Imaginons maintenant que nous réduisions cette phrase uniquement au caractères "5".

string mon_texte = "5";

Si nous demandons à l'ordinateur de multiplier cette variable par deux :

string mon_texte = "5";
print( mon_texte * 2 )

Eh bien celui-ci n'y arrive pas, car il n'est pas capable de se rendre compte que dans ce cas, "5" est à la fois un symbole d'écriture ET un chiffre. Comme nous avons utilisé le type string, celui-ci n'est pas capable de se rendre compte qu'on pourrait en faire un int !  En fait, il ne ferait pas la différence avec la demande suivante, qui est absurde :

string mon_texte = "pomme";
print( mon_texte * 2 )

L'ordinateur n'est à la base capable de multiplier que des int, des nombres entiers, soit des float, des nombres à virgule. Il existe également des opérations qui ne peuvent avoir lieu que sur les phrases, c'est-à-dire les string.

En réalité, les langages de programmation modernes ont été conçus pour que ce problème ne se pose plus et il devient possible de multiplier des caractères même si ce n'est pas sensé être possible à la base, s'ils correspondent bien à des nombres.

Découvrir la programmation

Qu’est-ce que le binaire ?

La notion de binaire fait référence au fait qu’au sein du matériel, l’ordinateur stocke l’ensemble des informations qu’il manipule sous forme de courant électrique, qui ne peut prendre que deux valeurs distinctes : présence ou absence de courant.

 

Ces informations sont stockées au sein de bits, qui ne peuvent donc qu’être dans deux états distincts, nommés par convention 0 en l’absence de courant, 1 en la présence de courant. Mis bout à bout, ces bits permettent alors de construire des informations plus complexes.

 

Par exemple, stocker la lettre A peut se faire à l’aide de 8 bits organisés comme suit : 01100001 . En réalité, on rajoute d’autres bits au préalable pour signifier qu’il s’agit d’une lettre et non d’un autre type d’information. Cette méthode est suffisante pour stocker n’importe quel type d’information

Découvrir la programmation

Peut-on diviser par zéro ?

Non.

Découvrir la programmation

Découvrir Python avec un ‘livre dont vous êtes le héros’ numérique

Pour télécharger la démo, c'est ici !

Présentation

Je vous propose dans ce tutoriel de découvrir les bases de la programmation en Python via le premier algorithme que j’ai moi-même codé tout seul : un ‘livre dont vous êtes le héros’ numérique.

Le principe de ces livres est de vous embarquer dans une grande aventure qui, à chaque page, vous proposera plusieurs possibilités pour faire avancer le récit, chacune vous renvoyant vers une page spécifique. À vous de découvrir le bon chemin pour atteindre le bout de l’aventure, en sauvant la princesse… ou en passant de vie à trépas.

Mais chaque chose en son temps !

En réalité, nous commencerons par une présentation des outils de base de programmation en Python, puis nous passerons à une présentation plus générale du concept de programme.


Le Python

Commençons par découvrir Python. Il s’agit d’un langage de programmation, né en 1989, qui en est actuellement à sa 3ème version. Si vous êtes friand d’histoire, n’hésitez pas à consulter la page wikipédia de Python. Python est un langage qui est beaucoup utilisé dans le milieu scientifique, car il permet de résoudre des problèmes complexes sans avoir à apprendre les codes de la programmation, en tout cas pas de manière approfondie.

Dans certains langages, il est par exemple nécessaire d’inclure un ‘ ; ‘ à la fin des instructions. Python retire cette nécessité, ainsi qu’un certains nombre de tâches rébarbatives liées aux principes informatiques. Dans les fait, il perd en flexibilité et en rapidité de calcul, mais ça n’est pas quelque chose qui nous concerne.

Un des intérêts principaux de Python est la grande panoplie de librairies qu’il possède, qui sont des petits bouts de codes prêts à l’emploi que vous pouvez utiliser pour résoudre un problème particulier. Par exemple, la librairie librosa est dédiée à la manipulation de fichier audio, pygame permet de créer des jeux vidéos.

Du fait de sa proximité avec le monde scientifique, Python est un des langages les plus utilisés dans la programmation d’intelligences artificielles.


Premier Pas : Bonjour Monde

Une tradition, tardive, du monde informatique, est de commencer la découverte d’un langage par un programme tout simple, nommé ‘Hello World‘, qui sert à vérifier que l’installation du langage a fonctionné et que nous sommes parés à commencer.

Pour installer Python, vous pouvez le télécharger depuis le site officiel. Sur Linux, à la place, on utilisera généralement la ligne de commande suivante :

sudo apt-get install python

Une fois le logiciel installé, assez bizarrement, nous pouvons commencer à écrire du code… dans n’importe quel éditeur de texte !

En effet, un fichier contenant du code n’est rien d’autre qu’un fichier texte, comme vous pourriez écrire une liste de course ou un poème en vers. Seule change l’extension, qui permet d’indiquer à l’ordinateur quel type de code il contient. L’extension associée à Python est .py, nous allons donc créer un fichier nommé hello_world.py, préférablement dans un dossier nommé Python, pour ne pas s’éparpiller. Dans ce fichier, nous écrirons une simple ligne de code :

print( "Hello World" )

Et pour l’instant, c’est tout ! Voyons maintenant comment nous pouvons exécuter ce fichier. En premier lieu, nous allons voir la méthode à l’ancienne.

À l’ancienne, nous utilisons le terminal, ou sous windows l’invite de commande, pour ce faire. Deux méthodes sont envisageables :

python /chemin/vers/mon/fichier.py

Pour l’exécuter depuis n’importe où. En général, on se rend plutôt dans le dossier, puis on l’exécute :

cd /chemin/vers/mon/dossier/
python hello_world.py

Pas besoin de retaper les commandes à chaque fois : le terminal se souvient des dernières commandes, et vous pouvez y accéder avec la flèche du haut.

Le résultat du programme apparaît à l’écran ! Vous avez affiché ‘Hello World‘ à l’écran ! C’est votre premier pas dans la matrice !

De manière plus moderne, nous utilisons généralement un IDE, c’est-à-dire un logiciel de traitement de texte adapté pour programmer. Outre des fonctionnalités avancées, il suffit en général d’appuyer sur une touche (F5, par exemple), pour lancer le programme, ce qui permet de gagner du temps. Parmi les IDE disponibles : Geany, Sublime Text, Thony…

Maintenant que vous savez faire, prenez bonne note : à chaque exemple de code que vous trouverez dans ce tutoriel, vous êtes encouragé à le copier-coller pour le tester, le modifier, l’analyser. Soyez patient.


Le matériau de base : La variable

Nous venons de voir comment afficher quelque chose dans le terminal. Ne croyez pas qu’il s’agisse de quelque chose de trivial. Si vous poursuivez le développement, c’est peut-être l’outil que vous utiliserez le plus souvent, notamment pour vous renseigner sur les erreurs qui font planter le programme.

Imaginons maintenant que, pour une raison quelconque, vous souhaitiez afficher trois fois de suite la même information à l’écran. En partant de l’exemple précédent, le code à l’intérieur du fichier ressemblerait à cela :

print( "Hello World" )
print( "Hello World" )
print( "Hello World" )

Cela fonctionne sans souci. Mais supposons maintenant que vous souhaitiez changer le texte à afficher, par exemple par ‘Bonjour Monde‘. Il vous faudrait alors changer à chaque ligne le texte entre parenthèse, ce qui est rébarbatif, et, osons le mot, tout-à-fait inadmettable.

À la place, nous allons nous servir d’un outil omniprésent dans le monde de l’informatique : la variable. L’idée est la suivante :

ma_variable = "Bonjour Monde"
print( ma_variable )
print( ma_variable )
print( ma_variable )

La première ligne de ce code constitue ce que l’on appelle une déclaration de variable. Autrement dit, à la création d’une variable. Une variable est constituée de trois élément : son nom, son contenu, et son type. Python est pensé pour que la question du type soit transparente pour l’utilisateur, nous laisserons provisoirement cette notion de côté. Ce qui nous intéresse en tant que programmateur, c’est le contenu de la variable, ici les mots ‘Bonjour Monde‘. Le nom de la variable, ma_variable, permet de faire référence au contenu de la variable.

Dans l’exemple précédent, quand on demande d’afficher la variable en utilisant son nom, c’est son contenu qui est affiché dans le terminal. Il est donc maintenant possible de modifier uniquement le contenu de la variable, à la première ligne, pour modifier les trois éléments affichés dans le terminal.

Il est possible de changer le contenu d’une variable au cours du programme :

ma_super_variable = "Hello World"
print( ma_super_variable )
ma_super_variable = "Bonjour Monde"
print( ma_super_variable )

Sans rentrer dans les détails pour l’instant, un exemple un peu plus complexe :

mon_compteur = 0

while mon_compteur < 101:
	print( mon_compteur )
	mon_compteur = mon_compteur + 1

Le Couteau Suisse : La fonction

Voyons maintenant un deuxième outil de programmation important : la fonction. La fonction, de la même manière que la variable, permet d’associer un nom à un bout de code. Considérez le code qui suit :

def mettre_au_carre( nombre ):
	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

mettre_au_carre( 5 )
mettre_au_carre( 17 )

Ce code est scindé en deux parties distinctes : d’abord la fonction est créée, puis, deux fois, elle est utilisée.

Pour créer une fonction, on utilise la forme suivante :

def nom_de_la_fonction( argument(s) ):
>	code
>	code

D’abord, il faut indiquer à Python que l’on va créer une fonction avec le mot-clef ‘def‘. Il faut ensuite lui assigner un nom, puis, entre parenthèses, les arguments, qui viendront modifier le comportement de la fonction. Il peut ne pas y en avoir, ou y en avoir un nombre quelconque ( voir les exemples ci-dessous ). On finit ensuite par ‘ : ‘ .

Les lignes suivantes contiennent le code qui constituent la fonction. Afin d’indiquer à Python quelles lignes font partie de la fonction, on utilise un mécanisme appelé l’indentation. Ci-dessus, ces indentations sont indiquées par le signe >, que j’ai ajouté pour que l’indentation soit visible. Attention, il ne faut pas utiliser > dans votre code ! À la place, vous décalez le code vers la droite, à l’aide de la touche tabulation.

Si vous reprenez l’exemple ci-dessus, vous pouvez voir que les lignes

	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

sont indentées, car elles font partie de la fonction, alors que les lignes

mettre_au_carre( 5 )
mettre_au_carre( 17 )

ne le sont pas car elles n’en font pas partie.

Un exemple sans argument :

def print_hello_world():
	print( "Hello World" )

print_hello_world()

Un exemple avec deux arguments :

def multiplier( nombre1, nombre2 ):
	produit = nombre1 * nombre2
	print( produit )

multiplier( 5, 17 )

Utilisateur, erreur et type

Voyons maintenant une fonction utile intégrée à Python : input(). Elle permet à l’utilisateur de rentrer du texte, via le clavier, dans le programme :

print( "Quel est votre nom ?" )
nom_utilisateur = input()
print( "Enchanté, " + nom_utilisateur )

Bien. Adaptons cette idée à notre fonction mettre_au_carre() afin de proposer un programme interactif qui permette à l’utilisateur de mettre au carré le nombre qu’il tape dans le terminal. Pour rappel, n’hésitez pas à prendre votre temps pour comprendre comment le code est construit avant de le tester :

def mettre_au_carre( nombre ):
	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

print( "Quel nombre souhaitez-vous élever au carré ?" )
nombre_a_mettre_au_carre = input()
mettre_au_carre( nombre_a_mettre_au_carre )

Avez-vous essayé ? Que se passe-t’il ?

J’ai essayé avec 5… Le résultat n’était pas très concluant ! Voici ce que le terminal m’a répondu :

Traceback (most recent call last):
  File "carre.py", line 8, in <module>
    mettre_au_carre( nombre_a_mettre_au_carre )
  File "carre.py", line 3, in mettre_au_carre
    le_carre_du_nombre = nombre * nombre
TypeError: can't multiply sequence by non-int of type 'str'

Malheureusement, les ordinateurs n’ont pas encore intégré la politesse… Il s’agit d’un message d’erreur. En général, les premières lignes nous indiquent où se situe l’erreur, et la dernière nous explique pourquoi ça coince :

TypeError: can't multiply sequence by non-int of type 'str'

Ici, Python est mécontent pour une raison d’apparence simple mais en fait assez subtile. En français courant, il se plaint en fait d’être incapable de multiplier un mot. Pour comprendre cela, il faut revenir à la notion de type de variable que nous avons écartée plus tôt.

Dans la manière dont il fonctionne, un ordinateur ne sait pas vraiment ce qu’est un nombre. De son point de vue, il ne voit défiler que des suites de 0 et de 1. Pour un peu mieux différencier ces informations, il a été programmé pour interpréter les variables selon des grandes catégories. Les plus simples sont les suivantes :

Dans notre cas, la fonction input() prend uniquement du texte en entrée, c’est-à-dire une information de type string. Nous pourrions taper n’importe quel mot dans le terminal, par exemple ‘pomme’, ‘cinq’, ou encore ‘5’. Dans le dernier cas, l’ordinateur continue de traiter cette information comme un mot, et non un nombre, là où un humain saurait directement reconnaître un nombre. Ainsi, dans le cas actuel, quand nous lui demandons de multiplier ‘5’ par ‘5’, c’est pour lui comme si nous lui demandions de multiplier ‘pomme’ par ‘pomme’. Ce qui lui déplaît.

Pour ce faire, il faut convertir le mot en entrée en nombre entier, à l’aide de la fonction int() :

def mettre_au_carre( nombre ):
	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

print( "Quel nombre souhaitez-vous élever au carré ?" )
nombre_a_mettre_au_carre = input()
nombre_a_mettre_au_carre = int( nombre_a_mettre_au_carre )
mettre_au_carre( nombre_a_mettre_au_carre )

Grâce à cette conversion, j’obtiens bien 25 en entrant 5 dans le programme !


Vrai ou Faux : Avec des si, on mettrait Python en bouteille ?

Mais je vous vois venir ! Que se passe-t’il si l’on demande maintenant de mettre ‘pomme’ au carré ?

Ben oui, ça plante…

int() ne fonctionne que si le mot que vous voulez convertir correspond effectivement à un nombre entier. Le cas échéant…

Une bonne partie du travail de développeur consiste à prévenir ce genre d’erreur, qui ne font pas sens dans l’absolu mais sont effectivement possibles.

Voici une solution à ce problème qui nous permettra d’introduire un troisième outil, la condition if :

def mettre_au_carre( nombre ):
	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

print( "Quel nombre souhaitez-vous élever au carré ?" )
nombre_a_mettre_au_carre = input()

if nombre_a_mettre_au_carre.isnumeric():
	nombre_a_mettre_au_carre = int( nombre_a_mettre_au_carre )
	mettre_au_carre( nombre_a_mettre_au_carre )

Ici, nous demandons à l’ordinateur de mettre le nombre au carré, après conversion, si et seulement si le mot donné correspond effectivement à un nombre entier.

Incisons un peu le code :

nombre_a_mettre_au_carre.isnumeric()

Ici, nous utilisons une fonction un peu spéciale, isnumeric(), qu’il n’est possible d’utiliser qu’avec une variable de type string, donc contenant du texte. Utilisée comme cela, elle équivaudra à la réponse à la question « Est-ce que ce texte est l’équivalent d’un nombre ? ».

Par exemple, ‘5’.isnumeric() équivaut à « vrai » ( en Python : True ), ‘pomme’.isnumeric() équivaut à « faux » ( en Python : False ).

C’est un type de variable que l’on appelle booléenne ( Boolean ), qui ne peut contenir que deux informations distinctes : soit True, soit False.

Elle est particulièrement utile au sein d’un programme en conjonction avec un outil nommé ‘conditionnel, dont je vous présenterai ici le plus simple : if .

if permet d’exécuter le code indenté des lignes suivantes si et seulement si la condition qui le suit est vraie. Reprenons notre exemple précédent :

if nombre_a_mettre_au_carre.isnumeric():
	nombre_a_mettre_au_carre = int( nombre_a_mettre_au_carre )
	mettre_au_carre( nombre_a_mettre_au_carre )

Ici, les deux lignes indentées ne seront exécutés que si le contenu de la variable nombre_a_mettre_au_carre correspond à un nombre entier. Le cas échéant, les lignes seront ignorées.

Pour aller plus loin, vous pouvez utiliser le mot else pour spécifier ce qu’il doit se passer au cas où la condition n’est pas respectée, mais ce n’est pas obligatoire :

def mettre_au_carre( nombre ):
	le_carre_du_nombre = nombre * nombre
	print( le_carre_du_nombre )

print( "Quel nombre souhaitez-vous élever au carré ?" )
nombre_a_mettre_au_carre = input()


if nombre_a_mettre_au_carre.isnumeric():
	nombre_a_mettre_au_carre = int( nombre_a_mettre_au_carre )
	mettre_au_carre( nombre_a_mettre_au_carre )
else:
	print( "Arrêtez de jouer l'andouille, nom d'une pipe !" )

Vous remarquerez que ce code n’est pas optimal, parce qu’il ne permet pas d’élever au carré des nombres à virgule, mais ce n’est pas très grave.


Comment taire ?

Une petite note rapide sur la ligne suivante, que vous pourriez trouver dans un code en Python :

# Je suis un commentaire !

Le symbole # permet d’indiquer à Python d’ignorer cette ligne lors de l’exécution. Il s’agit de permettre au développeur d’écrire du texte humain, pour les humains, et d’indiquer, par exemple, l’utilité d’une ligne ou un problème qu’il rencontre. On appelle ce type de ligne un commentaire.


Et ce livre, alors ?

Nous y arrivons. Un petit mot avant cela. Vous venez de découvrir, rapidement, les bases de la programmation en Python. Il était difficile d’aborder la suite sans ces prérequis.

À ce stade, je vous conseillerai d’essayer d’écrire quelques programmes de votre invention en expérimentant avec les connaissances présentées ci-dessus.

Également, vous pouvez jeter un coup d’œil sur des tutoriels et exercices en lignes, ainsi que sur la documentation du langage. Si vous persévérez, vous y passerez très certainement un petit bout de temps…


Le livre donc

Je vous propose donc de découvrir un algorithme qui permet de créer un ‘livre dont vous êtes le héros’ numérique.

Dans la partie précédente, la méthode que nous suivions était la suivante : nous présentons une fonctionnalité de Python, puis nous cherchons à comprendre ce qu’elle permet.

Ici, c’est l’inverse : nous souhaitons créer une fonctionnalité, puis nous nous demandons quels sont les outils à utiliser.

C’est le premier pas de l’étape de développement : se demander si créer l’outil auquel on pense est possible. Ici, nous voudrions afficher une histoire dans le terminal, puis proposer à l’utilisateur plusieurs choix afin qu’il puisse décider de la direction que prend son aventure. Ce qui devrait ressembler à cela :

Vous vous réveillez par un beau matin.
Après quelques étirements
et un copieux petit déjeuner,
vous arrivez dans votre salon.

Que faîtes-vous ?
[0] Sortir dans la rue
[1] Aller dans la bibliothèque

Assez intuitivement, nous savons qu’il est possible d’utiliser print() pour afficher du texte à l’écran, input() pour demander à l’utilisateur d’interagir, et if pour permettre le choix entre différentes possibilités. Nous sentons que l’algorithme est donc possible.

Si nous avions voulu que l’ordinateur, à la place, écrive le livre à l’aide d’un crayon, puis le relie, là par contre, ça n’était pas possible. En fait, si, c’était possible, mais à condition de construire un méga-robot super complexe. Vous avez compris l’idée.


À quoi ressemble le livre ?

Plutôt que de vous décrire le code ligne à ligne, je vous propose de regarder le schéma suivant comme point de départ à l’algorithme :

PlanJeu.png

Il s’agit d’un diagramme qui présente les pages du jeu que j’ai fait, ainsi que leurs connections.

En bleu, la page ‘entrée‘ est le point de départ. En gris, ce sont les ‘chemins‘, qui permettent de naviguer de page en page. En rose, ce sont les ‘impasses‘, qui terminent le jeu, de manière plus ou moins heureuse, et renvoient au début du jeu, c’est-à-dire la page ‘entrée‘.

Les flèches, quand à elles, indiquent comment communiquent les pages entre elles. Depuis l’ ‘entrée‘, par exemple, on peut aller soit dans la ‘bibliothèque‘, soit dans la ‘rue‘. Il n’est par contre pas possible de revenir à l’ ‘entrée‘. Depuis le ‘livre‘, on ne peut que repartir vers la ‘bibliothèque‘.

Si vous souhaitez créer votre propre jeu, je vous conseille de faire un schéma similaire, qui vous permet de voir si les pages s’agencent bien entre elles, et s’il est possible d’accéder à toutes les pages.


À quoi ressemble une page ?

Nous venons de comprendre ce qu’était le livre : une espèce de réseau de pages qui sont reliées entre elles.

Mais qu’est-ce qu’une page ?

Dans la version simple que je vous propose, il suffit de trois éléments pour constituer une page :

Reprenons l’exemple précédent :

Vous vous réveillez par un beau matin.
Après quelques étirements
et un copieux petit déjeuner,
vous arrivez dans votre salon.

Que faîtes-vous ?
[0] Sortir dans la rue
[1] Aller dans la bibliothèque

En italique, vous pouvez voir l’histoire de la page. En gras, ce sont les choix disponibles. Le type de page n’est pas affiché tel quel, mais puisqu’il est possible de faire un choix, il s’agit d’un ‘chemin‘.

Comment traduire cela en Python ? Eh bien j’ai pour cela utilisé un dictionnaire. Un dictionnaire permet de stocker, à l’intérieur d’une variable unique, un grand nombre de sous-variables accessibles via un mot-clef. Voici un exemple :

personne = {
  "nom": "Durand",
  "prenom": "Bernard",
  "age": 37,
  "taille": 1.74
}

print( personne["prenom"] )

Comme vous pouvez le voir, il est possible de représenter des objets complexes de cette manière. Dans notre cas, voici le fichier que j’ai créé pour la page ‘entrée, vous pouvez le copier-coller dans un fichier pour plus de lisibilité :

{
	"type": "chemin",
	"histoire": "Vous vous réveillez par un beau matin.\nAprès quelques étirements et un copieux petit déjeuner, vous arrivez dans votre salon.",
	"choix": [
		{ "proposition": "Sortir dans la rue", "vers_la_page": "rue.txt" },
		{ "proposition": "Aller dans la bibliothèque", "vers_la_page": "bibliotheque.txt" }
	]
}

Il ne s’agit même pas d’un fichier Python : il s’appelle entree.txt, et je l’ai rangé dans un sous-dossier ‘pages‘.

Comme indiqué précédemment, je créé un dictionnaire contenant trois entrées : ‘type‘, ‘histoire‘ et ‘choix‘.

Chaque dictionnaire de choix est lui-même constitué de deux paramètres : une entrée ‘proposition‘, qui indique la phrase à afficher dans le terminal pour ce choix, et une entrée ‘vers_la_page‘, qui référence le nom du fichier à charger quand l’utilisateur fait ce choix-là.

De fait, pour rajouter un choix à l’utilisateur, vous pourrez par exemple rajouter cette entrée dans le fichier, avant le crochet fermant, et en ayant ajouté une virgule après le dictionnaire de choix précédent :

{ "proposition": "Aller à la cave", "vers_la_page": "cave.txt" }

Il vous faudra ensuite, bien sûr, rédiger la page correspondante.

Pour une ‘impasse‘, c’est le même principe, mais nous indiquons

"type": "chemin",

et supprimons l’entrée ‘choix, car il n’y en a pas.

Par exemple, le fichier ‘chute.txt‘ :

{
	"type": "impasse",
	"histoire": "Vous faîtes un premier pas vers l'abîme qui s'ouvre devant vous.\nMalheureusement, les années ont érodé la pierre et l'on rendue glissante.\nLa chute est brutale, et vous ne vous en releverez pas...\n\nGAME OVER"
}

Note : vous avez pu voir ‘\n‘ se balader dans les textes ci-dessus. Il s’agit d’un symbole spécial pour demander à Python de sauter une ligne à ce moment là.


Le Code

En fait, vous avez déjà tous les outils pour créer vous-même le livre. Le code Python que j’ai créé vous permet d’écrire les fichiers textes des pages sans même avoir à vous embêter avec ce qu’il contient.

Tant que vous suivez les règles précédentes de création de page, et que vous nommez votre première page ‘entree.txt, alors le programme s’occupe tout seul d’assembler le livre pour vous.

Mais jetons quand même un coup d’œil ! Il ressemble à ceci :

import os
import json

def lire_la_page( page ):
	
	os.system( 'cls' if os.name == 'nt' else 'clear' )
	
	print( page["histoire"] )
	
	if page["type"] == "chemin":
		
		print( "\n" )
		print( "Que faîtes-vous ?" )
		
		for i in range( len( page["choix"] ) ):
			texte = "[" + str( i ) + "] "
			texte = texte + page["choix"][i]["proposition"]
			print( texte )
		
		decision = input()
		
		la_decision_est_valide = False
		if decision.isnumeric():
			if int( decision ) >= 0:
				if int( decision ) <= len( page["choix"] ):
					la_decision_est_valide = True
				
		if not la_decision_est_valide:
			lire_la_page( page )
		
		if la_decision_est_valide:
			charger_la_page( page["choix"][int( decision )]["vers_la_page"] )
	
	elif page["type"] == "impasse":
		decision = input()
		charger_la_page( "entree.txt" )

def charger_la_page( nom_du_fichier ):
	
	with open( "pages/" + nom_du_fichier,'r',encoding = 'utf-8') as mon_fichier:
		page_actuelle = json.load( mon_fichier )
		mon_fichier.close()
		lire_la_page( page_actuelle )

charger_la_page( "entree.txt" )

C’est un peu velu, mais il est long surtout parce que j’ai espacé les lignes. Si vous regardez bien, la majorité du code est en fait contenu dans deux fonctions distinctes : lire_la_page() et charger_la_page(). Commençons par oublier leur contenu un instant, et regardons le code :

import os
import json

def lire_la_page()

def charger_la_page()

charger_la_page( "entree.txt" )

C’est déjà bien plus clair ! Il s’agit là d’une vue d’ensemble de l’algorithme. En fait, cela nous permet de faire le lien avec le schéma suivant :

archisoft.jpg

 

Ce schéma, est d’une certaine manière, le travail le plus important du développeur. Il s’agit de se représenter le problème à résoudre, ici la création d’un ‘livre dont vous êtes le héros‘, comme une suite d’étapes successives, sans rentrer dans le détail.

Une fois que cette vue d’ensemble est posée, il ne reste plus qu’à mettre en place les sous-étapes, et les relier entre elles.

Dans notre cas, nous lançons le programme, puis nous répétons indéfiniment la suite ‘charger la page‘ > ‘afficher la page‘ > ‘choix‘.


Étape 1 : lancement du programme

De manière générale, la première partie d’un programme consiste à mettre en place les éléments dont le programme a besoin pour fonctionner. C’est notamment là que l’on déclare les variables, même si vous pouvez remarquer que mon programme n’en utilise pas de manière globale.

Les deux premières lignes que j’utilise permettent à Python de charger des librairies spéciales dont j’aurai besoin plus tard. Ces lignes ont donc été rajoutées pendant que j’écrivais les fonctions qui les utilisent, mais l’importation doit se faire en tout début de programme.

import os
import json

Ensuite, je créé (déclare) mes fonctions pour pouvoir les utiliser plus tard.

def lire_la_page()
def charger_la_page()

Enfin, je lance ma boucle en utilisant la fonction charger_la_page() pour ouvrir ma première page. Les fonctions doivent avoir été déclarées avant d’êtres utilisées.

charger_la_page( "entree.txt" )

Étape 2 : charger une page

Nous venons donc d’appeler la fonction charger_une_page() avec l’argument ‘entree.txt, qui correspond à notre première page. Voici le code de la fonction, dont j’ai réduit la première indentation pour plus de lisibilité :

def charger_la_page( nom_du_fichier ):
with open( "pages/" + nom_du_fichier,'r',encoding = 'utf-8') as mon_fichier:
	page_actuelle = json.load( mon_fichier )
	mon_fichier.close()
	lire_la_page( page_actuelle )

Je ne rentrerai pas spécialement dans le détail de certaines fonctionnalités, vous pouvez vous référer à la documentation en cas de besoin.

La première ligne me permet d’ouvrir le fichier dont le nom est passé en argument, et qui devra se trouver dans un dossier nommé ‘pages‘. Il est ouvert en lecture seule, et stocké dans une variable nommé mon_fichier.

La deuxième ligne transforme le contenu de la variable, qui est encore une string, en dictionnaire, et le stocke dans une variable nommé page_actuelle.

La troisième ligne ferme le fichier.

Enfin, la quatrième ligne appelle la fonction afficher_la_page(), avec comme argument le dictionnaire contenant les informations de la page à lire.


Étape 3 : la page

Voyons maintenant la fonction lire_la_page() :

def lire_la_page( page ):
os.system( 'cls' if os.name == 'nt' else 'clear' )
	
print( page["histoire"] )
	
if page["type"] == "chemin":
		
	print( "\n" )
	print( "Que faîtes-vous ?" )
		
	for i in range( len( page["choix"] ) ):
		texte = "[" + str( i ) + "] "
		texte = texte + page["choix"][i]["proposition"]
		print( texte )
		
	decision = input()
		
	la_decision_est_valide = False
	if decision.isnumeric():
		if int( decision ) >= 0:
			if int( decision ) <= len( page["choix"] ):
				la_decision_est_valide = True
				
	if not la_decision_est_valide:
		lire_la_page( page )
		
	if la_decision_est_valide:
		charger_la_page( page["choix"][int( decision )]["vers_la_page"] )
	
elif page["type"] == "impasse":
	decision = input()
	charger_la_page( "entree.txt" )

C’est le cœur de l’algorithme que nous voyons ici. En termes humains, il s’agit d’un décodeur de fichier ‘page. Il doit donc pouvoir manipuler un dictionnaire, qu’il corresponde à un ‘chemin‘ ou une ‘impasse‘.

Encore une fois, nous allons réduire le code pour gagner en lisibilité :

os.system( 'cls' if os.name == 'nt' else 'clear' )
print( page["histoire"] )
	
if page["type"] == "chemin":
	choses à faire pour un chemin
	
elif page["type"] == "impasse":
	choses à faire pour une impasse

Comme vous pouvez le voir, en bas, nous utilisons if, et sa contrepartie elif, pour distinguer ce qu’il y a à faire si la page est un ‘chemin‘ ou une ‘impasse. C’est justement pour cela que nous avons créé l’entrée ‘type‘.

Les deux premières lignes sont à exécuter dans les deux cas :

La première permet juste d’effacer l’affichage actuel du terminal, afin de faire place net.

La seconde affiche l’histoire à l’écran.


Étape 3 : l’ ‘impasse

Commençons par voir ce qui se passe dans le cas d’une ‘impasse‘, qui est le plus simple :

decision = input()
charger_la_page( "entree.txt" )

Dans un premier temps, nous demandons simplement un input() pour attendre que l’utilisateur valide avec la touche ‘Entrée’.

Puis, nous rechargeons la première page. Et la boucle est bouclée !


Étape 3 : le ‘chemin

Que se passe-t’il dans le cas d’un ‘chemin‘ ?

print( "\n" )
print( "Que faîtes-vous ?" )
	
for i in range( len( page["choix"] ) ):
	texte = "[" + str( i ) + "] "
	texte = texte + page["choix"][i]["proposition"]
	print( texte )
	
decision = input()
	
la_decision_est_valide = False
if decision.isnumeric():
	if int( decision ) >= 0:
		if int( decision ) <= len( page["choix"] ):
			la_decision_est_valide = True
			
if not la_decision_est_valide:
	lire_la_page( page )
	
if la_decision_est_valide:
	charger_la_page( page["choix"][int( decision )]["vers_la_page"] )

Encore une fois, saucissonnons les étapes.

En premier, nous sautons une ligne pour des questions de lisibilité, puis nous questionnons l’utilisateur :

print( "\n" )
print( "Que faîtes-vous ?" )

Ensuite, pour chacun des choix disponibles, nous affichons à l’écran le numéro du choix ainsi que son intitulé :

for i in range( len( page["choix"] ) ):
	texte = "[" + str( i ) + "] "
	texte = texte + page["choix"][i]["proposition"]
	print( texte )

À ce stade, nous attendons que l’utilisateur entre son choix :

decision = input()

Ensuite, en fonction de ce que nous indique l’utilisateur, deux choses sont possibles : soit celui-ci à entré une mauvaise information, comme ‘pomme‘, ou un nombre qui dépasse la question. Dans ce cas-là, nous tombons dans le déni et réaffichons la page.

Le cas échéant, nous allons appeler la fonction charger_la_page() avec la page demandée. Et la boucle est bouclée !


Goodbye World

Et voilà, pas besoin d’aller plus loin, la boucle est bouclée dans tous les cas, et elle s’adapte à votre nombre de page sans difficulté. C’est donc l’heure d’appeler à vos imaginations débordantes pour proposer 1 001 histoires !

Pfiou ! C’était un peu long pour une initiation, mais l’essentiel y est ! Vous avez tous les outils pour concevoir un projet et le mettre en œuvre, et en petit plus, la possibilité d’écrire un jeu vidéo narratif !

Sans plus m’étendre, je vous remercie pour la la lecture, et à bientôt !

Découvrir la programmation

Quelles sont les bases du terminal sous Linux ?

Le terminal est un outil qui peut faire peur au début. Mais pas de panique ! Dans tous les cas, c’est un outil tellement polyvalent qu’il serait inhumain de le maîtriser entièrement ! Alors comme nous serons toujours novices, faisons sans crainte nos premiers pas dans son utilisation.

Vous trouverez en fin de page un tableau récapitulatif des commandes les plus utiles.

À l’origine, le terminal s’appelle ainsi car c’était le point terminal de l’ordinateur, celui par lequel l’humain y accède. Nous parlons là d’une époque révolue où la notion d’interface graphique était inexistante. Il fallait écrire les commandes que nous souhaitions faire effectuer à l’ordinateur plutôt que de cliquer sur des icônes et des boutons à l’écran.

On parle de ici de deux concepts opposé : GUI et de CLI.

GUI, acronyme anglais de Graphical User Interface, ou Interface Graphique est un mode d’interaction simplifié avec l’ordinateur. Le but est de gagner en aisance et en rapidité principalement par le biais de boutons sur lesquels on clique avec la souris, et qui effectueront des actions préprogrammées.

CLI, acronyme anglais de Command Line Interface, ou Interface en Ligne de Commande est un mode d’interaction avec l’ordinateur. Il se caractérise par le fait de taper des suites de mots correspondant à des actions préprogrammés avant de demander à l’ordinateur de les exécuter.

Voici une opération que vous aurez, je pense, déjà réalisée : j’ai ouvert mon navigateur de fichiers, double cliqué sur un dossier et paf, son contenu s’est affiché :

FolderDisplay.png

Voici maintenant comment réaliser la même opération via le terminal :

cdls.png

Ok, pas si vite ! Que s’est-il passé ? Revenons au point de départ, au moment où j’avais uniquement ouvert mon terminal :

VirginTerminal.png

Pour des questions de clarté, j’ai retiré la bordure de la fenêtre pour ne garder que l’essentiel. Trois informations sont pour l’instant affichées.

La première, avant le @, est le nom de l’utilisateur connecté au terminal. Ici, c’est ‘simon‘. C’est moi !

Nous avons ensuite, après le @, le nom de l’ordinateur auquel le terminal est connecté. Mon ordinateur se nomme donc ‘moustache‘.

Enfin, après le ~ se trouve l’emplacement actuel où nous nous situons dans l’arborescence de fichier. $ signifie que nous sommes dans le dossier racine de l’utilisateur, autrement dit son point de départ.

La première commande que j’ai entrée dans le terminal était ‘cd nom_de_mon_dossier/‘. cd est le raccourci de change directory, qui signifie changer de dossier.

cd.png

Celle-ci permet de rentrer dans un dossier. Ici, vous pouvez voir que nous ne sommes plus dans ‘$‘, mais dans le dossier ‘/FabuleuxDossier‘.

Pour revenir en arrière, il faut utiliser la commande ‘cd ..‘. .. fait référence au dossier parent du dossier actuel :

cdback.png

La seconde commande que j’avais utilisé était ls, qui permet de lister les dossiers et fichiers présents dans le dossier actuel :

cdls.png

Cette suite de commande est donc équivalente à afficher des fichiers dans le navigateur de fichiers. Il faut cependant reconnaître que celui-ci est tout de même plus adapté car plus rapide et plus joli, de surcroît, on peut double-cliquer sur les icônes pour
ouvrir les fichiers ! Mais continuons un peu notre exploration du terminal avec l’énigme suivante :

lsa.png

Que s'est-il passé ?

En ajoutant du texte après la commande ls, j’obtiens un résultat différent ! La commande -a est une option qui s’utilise après ls, pour en modifier le comportement. Ici, ls -a affiche tous les fichiers, y compris les fichiers cachés. Trois nouveaux fichiers sont présents :

.. , comme indiqué précédemment, fait référence au dossier parent.

. , lui est une référence au dossier lui-même. Assez étrangement, chaque dossier contient une référence à lui-même.

.FabuleuxFichierCaché.txt est un fichier caché à des fins didactiques. Sous Linux, un fichier commençant par « . » est considéré comme un fichier caché. Pour activer ou désactiver l’affichage de fichiers cachés dans le navigateur de fichiers, utilisez la commande ctrl + H .

 

Quelles options sont disponibles pour une commande donnée ? Une commande fort utile permet, entre autres, de répondre à cette question : man . man nom_d’une_commande affiche le manuel d’utilisation de cette commande, présentant entre autres sa fonction
et ses options. En guise d’exemple, man ls :

manls.png

Les options des commandes peuvent s’additionner. Par exemple, ls -a liste tous les fichiers à l’intérieur d’un dossier, tandis que ls -l liste les fichiers visibles dans un dossier sous format long. Ainsi, ls -la liste donc tous les fichiers d’un dossier sous format long :

lsla.png

Dernier outil fort utile du terminal : l’auto-complétion. Le terminal est doté d’un dispositif lui permettant de prédire les commandes valides que l’on essaye de taper. Dans l’exemple suivant, j’ai modifié le contenu du dossier pour qu’il contienne trois sous-
dossiers : Articles, Audio et Photos :

completion1.png

Vous pourriez croire que j’ai ensuite tapé cd Photos/ . En fait, je n’ai tapé qu’une partie de la commande : cd P . J’ai ensuite utilisé l’auto-complétion en appuyant sur la touche Tabulation. Le reste de la commande s’est affiché automatiquement ! Pourquoi ?

La commande cd permet d’accéder à un dossier. Or, avec le P que j’ai ensuite indiqué, il n’y avait qu’un résultat possible : Photos/ . Le terminal a donc compris que c’était la commande que je souhaitais et l’a complétée automatiquement.

Dans certains cas, plusieurs commandes différentes sont valides. Dans ces cas-là, appuyer une fois sur Tabulation n’a pas d’effet immédiat. Cependant, appuyer une deuxième fois sur Tabulation liste les commandes valides disponibles :

completion2.png

Il s’agit d’un excellent outil qui permet à la fois de gagner du temps et d’explorer rapidement le terminal. Par exemple pour lister toutes les commandes disponibles commençant par fi :

findfi.png

 


Trêve de bavardages ! Voici la meilleure commande de tout Linux, en deux lignes :

sudo apt-get update

sudo apt-get install nom_du_logiciel

La première ligne met à jour la base de données de logiciels de Linux. Le mot sudo, présent également à la ligne suivante, indique que l’action nécessite les privilèges de l’administrateur. Il vous sera demandé de taper votre mot de passe.

La seconde permet de récupérer un des logiciels présent sous forme de paquet dans votre distribution. Par exemple, installer GIMP se fait comme cela :

sudo apt-get install gimp

La configuration du logiciel est ensuite automatique. Une fois celle-ci terminée, vous pouvez utiliser le logiciel comme bon vous semble. N’hésitez pas à explorer la liste de logiciels disponibles, par exemple en utilisant l’auto-complétion :

completiongimp.png

Petite note sur les paquets : un paquet n’est pas nécessairement une application. En fait, c’est rarement le cas. Vous pouvez voir ci-dessus qu’en dessous du paquet gimp se trouvent de nombreux paquets commençant par gimp- . Ces paquets sont des librairies qui eux-mêmes constituent l’application. Le paquet gimp nécessite par exemple le paquet gimp-data pour fonctionner, celui-ci sera d'ailleurs installé lors de l’installation de gimp, mais ne sera pas utilisable directement. D’autres paquets, par exemple gimp-data-extras ou gimp-plugin-registry sont des paquets optionnels rajoutant des fonctionnalités au logiciel.

 


Commandes utiles

 

Commande Effet
cd dossier/ rentrer dans le dossier
cd .. revenir en arrière dans l’arborescence
cd ../.. revenir deux fois en arrière dans l’arborescence
cd revenir à la racine de l’arborescence ( $ )
ls lister les fichiers et dossiers de l’emplacement actuel
ls -a lister tous les fichiers et dossiers de l’emplacement actuel
man nom_de_commande afficher le manuel de la commande indiquée
sudo apt-get update mettre à jour la liste des paquets
sudo apt-get install nom_de_paquet installer le paquet indiqué
sudo apt-get upgrade mettre à jour les applications
sudo apt-get remove nom_de_paquet désinstaller le paquet indiqué
sudo apt-get autoremove supprimer les paquets inutiles
sudo dpkg -i fichier_de_paquet installer un paquet depuis un fichier
mkdir nom_de_dossier créer un nouveau dossier à l’emplacement actuel
rm nom_de_fichier supprimer le fichier indiqué
rm -R nom_de_dossier supprimer le dossier indiqué et l’ensemble de son contenu
mv nom_de_fichier nouveau_nom_de_fichier modifier le nom du fichier indiqué selon le nouveau nom indiqué
cp nom_de_fichier nouveau_nom_de_fichier copier le fichier sous l’appellation indiquée
file nom_de_fichier trouver le type du fichier indiqué
locate nom_de_fichier trouver toutes les occurrences du fichier indiqué à partir de l’emplacement actuel
locate *.extension trouver toutes les occurrences d’un type de fichier à partir de l’emplacement actuel
cat nom_de_fichier_texte afficher le contenu du fichier dans le terminal
more nom_de_fichier_texte afficher le contenu du fichier dans le terminal sur des pages séparées
less nom_de_fichier_texte afficher le contenu du fichier dans le terminal sur une page
nano nom_de_fichier_texte ouvrir le fichier indiqué dans l’éditeur de texte nano. Le fichier est créé s’il n’existe pas
sudo chmod +x 755 nom_de_fichier changer les permissions d’un fichier. Modifier la balise numérique en fonction des besoins
clear effacer le contenu du terminal
killall nom_de_processus forcer l’arrêt de tous les processus liés au nom indiqué
xkill permet de cliquer sur la fenêtre d’un processus pour en forcer l’arrêt
tar -xzf nom_d'archive décompresser une archive à l’emplacement actuel
sudo fdisk -l lister les périphériques de stockage et leur spécificités
sudo dd if=image_disque.iso of=/dev/sdx && sync copier l’image disque indiquée sur le périphérique indiqué
sudo systemctl start nom_de_service démarrer le service indiqué
sudo systemctl stop nom_de_service arrêter le service indiqué
sudo systemctl restart nom_de_service redémarrer le service indiqué
sudo arp-scan --local lister les appareils connectés au réseau
ssh utilisateur@adresse_ip se connecter à un ordinateur distant en SSH
sudo scp utilisateur@adresse_ip:/chemin/du/fichier nom_de_la_copie copier localement un fichier distant en SSH
cd && cd ../.. && sudo rm -R * Effacer la totalité du contenu de l’ordinateur. À éviter.
Découvrir la programmation

Débuter l'électronique et la programmation avec l'Arduino

 

Le but de cet article est de vous familiariser avec l’utilisation de la carte Arduino. Il vous présente la carte, l’interface qui vous permet de le programmer, ainsi qu’une méthodologie qui vous permettra de créer de petits projets adaptables et modulables.


L’Arduino est une petite carte électronique conçue pour favoriser l’apprentissage des technologies électroniques et numériques. D’un prix abordable ( 1€ pour les premiers prix ), elle permet un usage polyvalent et notamment le prototypage d’un certain nombre de montages. Elle est très utilisée dans le domaine artistique du fait de sa facilité de manipulation.