Author: Gabin P.

Projets

Binnerto ©, un système de gestion de bases de…

Il y a quelque mois de cela, nous vous avions laissé bien pantois. En effet, sur le site Binnerto©, un site très qualitatif de produits geek, il était jusque-là impossible de commander le moindre petit produit, et nous en sommes grandement désolés.

Mais aujourd’hui est un jour nouveau, nous venons de sortir du sable, enfin !

Vous allez désormais (dans un temps prochain (soumis à condition et à l’acceptation du crédit par votre banque)) pouvoir acheter (dans la limite des stocks disponibles et des vendeurs disponibles pour réaliser les commandes) tous les produits vendus par notre site dès maintenant grâce à un SGBDR !

Quelques petits rappels utiles et informations nécessaires à la compréhension

Vous vous demandez bien qu’est-ce qu’un SGBDR et à quoi cela peut bien servir pour commander votre produit préféré (et fort bien utile). Et bien pour une fois cette acronyme est en français (ou DBRMS dans la langue de Shakespeare), il signifie littéralement Système de Gestion de Bases de Données Relationnelles. Euuuuh quèsaco ? En fait c’est un logiciel qui permet de mettre en relation différents fichiers contenant de nombreuses données. Voyons à quoi cela ressemble dans notre cas, cela apportera plus de clarté.

Imaginons que vous vous appeliez Antonin Kroyable et que vous ayez commandé une Souris révolutionnaire pour votre tout nouvel appareil à la poire le 14 février 2022. Et bien le SGBDR ; nommons le affectueusement S&Co pour la suite pour plus de simplicité et de proximité, permet de lier trois fichiers pour les unifier. Dans un fichier vous trouverez vos informations personnelles, ce sera le fichier « client », dans un second, vous aurez toutes les informations sur cette souris, c’est-à-dire dans le fichier « produit ». Et pour la commande que vous avez faites ? Et bien elle se trouve dans le fichier « commande » évidemment. Tout le travail du S&Co et donc de lier ces trois fichiers pour avoir les informations les plus utiles pour chaque besoin, c’est-à-dire pour vous clients, et pour nous gestionnaires du site et responsables des stocks et livraisons produits, sans avoir des fichiers de 3 Km de long avec toutes les informations, dont certaines inutiles à certains mais utiles à d’autres.

Rentrons maintenant dans le cœur de la bête pour mieux l’appréhender.

Il faut savoir que ce S&Co, étant user-friendly, a une interface utilisateur (ou UI en anglais) graphique, permettant une meilleure expérience utilisateur (ou UX encore une fois en anglais), en limitant de perdre ce dernier, qui n’a pas forcément les connaissances nécessaires pour affronter la peur d’un terminal sombre et peu ragoûtant. Il est au moins rassuré, mais cela nous complexifie bien la tâche, comme nous allons le voir.

Dans cette quête de la rose-amère de la perfection du design, ce S&Co ne fera que pâle figure car étant codé extrêmement en Python avec comme interface graphique Tkinter, les possibilités de design sont amoindries comparé à d’autres langages mieux prévus pour les interfaces graphiques. Nonobstant, vous avez quand-même un produit a minima fini.

Il y aura donc, vous l’aurez compris deux parties majeures pour appréhender ce S&Co, la partie graphique, en Tkinter, qui n’est que la rustine de ce qui fait tourner la machine, ce qui est à l’intérieur, c’est-à-dire les fonctions mères pour mettre en relation SQL (le langage qui permet de parler aux tables de données ; le charmeur de données), et Python.

Le vif du sujet SQL-Python

Sans plus de divagations, voyons d’où tout est parti : SQLite. En effet, il est impossible de discuter directement avec les données en Python, ou alors cela serait très complexe.

Pour plus de facilité, on utilise à la place un autre langage, le SQL (qui est d’une facilitée incroyable en comparaison). Mais pour lier un programme Python avec du SQL il faut une bibliothèque, et c’est la que SQLite vient nous sauver ! En effet on peut rentrer des commandes SQL dans une fonction Python et avoir tous les bénéfices du SQL en ayant les retours en Python pour être réutilisés, c’est presque magique !

Réalisation des trois bases de données dans un fichier CSV

Pour commencer avec des données à chaque démarrage sans partir de rien, nous avons créé 3 fichiers CSV (où les éléments sont séparés par des virgules) que l’on récupère ensuite pour l’importer (on verra cela plus tard). Donc, comme on l’a dit plus tôt, 3 tables seront liées, il y aura donc 3 fichiers CSV qui contiendront quelques éléments pour chaque table (environ une dizaine).

Tout d’abord, il y a la table PRODUITS, dans le fichiers produits.csv. Dans cette table on présente comme suit les principales caractéristiques du produits :

id_produitnom_produitprixstock
6Binnerto en acier0.001

Toutes les données sont présentées comme cela sauf, que d’une colonne à l’autre, c’est un virgule qui les sépare. L’id_produit est un identifiant unique permettant à coup sur de retrouver le produit sans risque de se tromper (par exemple si 2 produits ont un nom identique).

Il en est de même pour la table CLIENTS sur le fichier clients.csv :

id_clientnomprenomadresse_mailadressedate_naissancedate_inscriptionvip
8KroyableAntoninantonin.kroyable@lol.mdr13 chemin des Rippes, Salle-à-Sac10-03-200711-11-2011True

De la même manière, id_client est l’identifiant unique qui correspond au client.

Passons maintenant à la dernière table, la plus importante, la table COMMANDES, dans le fichier commandes.py :

id_commandeid_client_commandeid_produitdate_commandedate_livraisonenvoyequantiteprix_total
308614-02-202219-02-2022True30.00

Encore une fois, id_commande est l’identifiant unique de la commande mais, il y a une petite subtilité encore. En effet, on va lier les deux autres tables à celle-ci avec 2 attributs : id_client_commande et id_produit, qui correspondent respectivement à la ligne de chaque table. Ainsi, avec une moindre écriture, on arrive à avoir toutes les informations pertinentes sur une seule ligne !

CRUD, la clé de voûte du projet

CRUD, de l’anglais Create, Read, Update, Delete, a été notre expression clé durant ce projet, notre guide suprême, car pour un S&Co, cela les 4 points les plus importants. Il faut pouvoir Créer des tables et des éléments dans ces tables, les Lire, les Mettre-à-Jour, mais aussi les supprimer. Voyons comment cela a pu être réalisé en Python/SQL.

1. Create

Deux choses sont à créer dans ce projet, les tables, que ce soit PRODUITS, CLIENTS ou encore COMMANDES, mais aussi les éléments qui composent ces tables, les lignes si vous vous rappelez de nos tableaux de tout-à-l’heure.

Pour créer une table, rien de plus simple comme on le voit ici avec la création de la table PRODUITS :

def create_table_produits():
    curseur.execute("CREATE TABLE IF NOT EXISTS PRODUITS(id_produit INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, nom_produit TEXT, prix NUMERIC, stock INTEGER)")
    connection.commit() #On envoie la modif dans la base de données

Le SQL est ce qui est dans la méthode .execute()

Cette fonction permet donc de créer la table PRODUITS, en vérifiant bien sûr qu’elle n’existe pas pour éviter les erreurs. Si vous vous rappelez de l’id_produit de tout à l’heure, qui permet de retrouver avec certitude un produit, et bien en SQL, c’est une PRIMARY KEY, soit une clé primaire ; une sorte de numéro d’identité du produit (qui est donc unique).

Mais on peut aussi avoir besoin de créer un enregistrement, comme suit :

def add_produits(produits_ajout):
    curseur.executemany("INSERT INTO PRODUITS(nom_produit, prix, stock) VALUES (?,?,?)", produits_ajout)
    make()

En vérifiant bien sûr que le tuple en entrée soit composé de 3 éléments.

2. Read

Pour lire, ça se corse, on peut vouloir lire tout ou partie, il a donc fallu faire des choix en réfléchissant à chaque fois au besoin le plus utile de lecture.

Ainsi on peut tout lire comme ici :

def select_all_produits():
    curseur.execute("SELECT * FROM PRODUITS")
    return [("id_produit", "nom_produit", "prix", "stock")] + curseur.fetchall()

On retourne en plus les noms des attributs afin de pouvoir les afficher comme il faut dans le tableau en Tkinter

Mais aussi comme cela :

def select_all_commandes():
    curseur.execute("SELECT nom, prenom, nom_produit, date_commande, date_livraison, envoye, quantite FROM COMMANDES AS co INNER JOIN PRODUITS AS p ON co.id_produit = p.id_produit LEFT JOIN CLIENTS AS cl ON co.id_client_commande = cl.id_client")
    return [("nom", "prenom", "nom_produit", "date_commande", "date_livraison", "envoye", "quantite")] + curseur.fetchall()

Ici, on fait une double jointure pour afficher à la place de l’id_client et de l’id_produit, le nom du client et du produit pour plus de clarté.

En jouant avec le SQL, il y a aussi des fonctions plus spécifiques comme celle qui suit permettant d’afficher toutes les commandes d’un même client :

def toutes_commandes_clients(id_client):
    curseur.execute("SELECT nom, prenom, nom_produit, date_commande, date_livraison, envoye, quantite FROM COMMANDES AS co INNER JOIN PRODUITS AS p ON co.id_produit = p.id_produit LEFT JOIN CLIENTS AS cl ON co.id_client_commande = cl.id_client WHERE id_client_commande=?",(id_client,))
    return [("nom", "prenom", "nom_produit", "date_commande", "date_livraison", "envoye", "quantite")] + curseur.fetchall()

3. Update

Pour mettre à jour, nous nous sommes demandé ce que nous aurions le plus besoin de mettre à jour dans chaque enregistrement de chaque table, et pour cela nous avons pour chaque table créé une fonction update qui change uniquement l’élément qui a le plus besoin d’être changé :

def update_commandes(id_commande, envoye: bool):
    curseur.execute("UPDATE COMMANDES SET envoye=? WHERE id_commande=?", (envoye, id_commande))
    make()

On change ici l’état de la commande avec un Booléen (Vrai/Faux), car c’est la commande que l’on est le plus amenés à réaliser.

4. Delete

Pour la suppression, afin d’être sûr de ne pas faire d’erreurs, cette dernière se base uniquement sur l’id unique de chaque enregistrement dans une table.

Ainsi :

def delete_clients(id_client):
    curseur.execute("SELECT * FROM COMMANDES WHERE id_client_commande=?",(id_client,))
    temp = curseur.fetchall()
    if str(temp) == "[]":
        curseur.execute("DELETE FROM CLIENTS WHERE id_client=?", (id_client,))
    make()

Ici, on supprime un produit en fonction de son id_produit, tout en vérifiant qu’il n’est pas utilisé dans la table commande, sinon cela pourrait poser problème.

Un affichage graphique : Tkinter

CComme dit plutôt, il faut bien interagir avec toutes ces bases de données si complexes (qu’on appellera BDD), et ça avec une interface graphique en Tkinter. Après avoir réfléchi à plusieurs croquis de ce que pourrait être l’UI (dont on vous ne donnera pas d’exemple pour ne pas nous faire voler nos maquettes), on a réussi à trouver l’UI la plus simple pour nos futurs employés, qui devront se servir de cette interface pour gérer les commandes, pendant que nous serons à Ibiza en train d’empocher un maximum d’argent.

Tous les produits de chez Binnerto en un clic

N’oublions pas le maître-mot de tout ce que l’on peut produire : LA FACILITÉ ! Il est donc inutile lorsqu’on veut sélectionner un produit d’écrire chaque lettre de ce dernier (sans oublier les potentielles erreurs de frappes ou maladresses). Nous avons donc opter pour une liste des produits qu’il suffit de sélectionner. Avec Tkinter, l’outil se nomme « Combobox » et c’est bien pratique.

from tkinter import *
from tkinter import ttk

def action(recup):
    #on appelle la fonction qui lie Python et SQL pour interagir avec la TABLE

listeproduits = ["Parpaing externe", "Clé USHellB", "Clavier Pasteur STL", "Voiture à Hydrogène", "CPU Nucléaire Leif", "Bouton d'allumage automatique", "Binnerto en acier", "Souris révolutionnaire"]
choix_prod = Label(racine, text = "Enlever Stock :")
choix_prod.place(x=300, y=130)
aff_prod = ttk.Combobox(racine, state = "readonly", values = listeproduits)
aff_prod.bind("<<ComboboxSelected>>", action)
aff_prod.place(x=265, y=170)

Comme une bonne nouvelle n’arrive jamais seule, certes l’outil « Combobox » est parfait pour ce que nous voulons faire, mais il n’est pas inclus lors de l’importation de Tkinter *. Il faut donc le rajouter à part, au péril d’un peu plus de mémoire. 

C’est bien beau de pouvoir sélectionner un produit dans une liste, mais il faut bien le récupérer pour pouvoir l’exploiter un peu. Heureusement, la méthode « .get() » permet de récupérer le choix fait par l’utilisateur, et à l’aide de la fonction ci-dessus qui affiche ce choix, on est sûr d’avoir bien récupéré le produit. Maintenant que l’on peut sélectionner un produit, il ne reste plus qu’à décider s’il faut le retirer du stock en cas de commande, ou l’ajouter en cas de fabrication (même si ce dernier cas n’arrive jamais 🤫).

Un accès aux commandes plus pratique

Nous suivons avec soin chaque commande pour la meilleure satisfaction de nos clients. C’est pour cela qu’il faut savoir à l’aide du numéro de commande : les produits qu’elle contient, le nom et prénom du client, le jour de l’envoi, si le colis a été reçu, etc…

Il faut donc qu’à l’aide de « id_commande », on trouve toutes ces informations, et cela, de façon la plus lisible possible… et pourquoi pas un tableau ?! Mais il faut d’abord récupérer le numéro d’une commande saisit dans un input :

def num_commande(event):
	n_fen = Toplevel(racine)
    t = Tableau(n_fen, select_client_specifique(int(entree.get()))) #on ouvre une nouvelle fenêtre avec le tableau représentant les données

def valide(test):
    return test.isdigit()

com_liv = Label(racine, text = "Afficher la commande d'un client (rentrez son ID)")
com_liv.place(x=900, y=130)
choix_com = racine.register(valide)
value = StringVar(racine)
entree = Entry(racine, textvariable = value, width = 30, validate = 'key', validatecommand = (choix_com,'%S'))
entree.place(x=865, y=170)
entree.bind("<Return>", num_commande)

Comme pour les produits, on récupère le numéro de la commande à l’aide de la méthode « .get() », mais cette fois-ci, uniquement lorsque nous validerons en appuyant sur la touche « Entrée » du clavier. Mais imaginons que lorsque notre employé utilise cette interface, il s’endorme sur le clavier ! Malheur ! Il faut redoubler de sécurité. C’est pour cela que dans cet input, on peut seulement y renseigner des chiffres, et cela, grâce à la fonction « valide » qui vérifie à chaque saisie si celui la est un chiffre.

Le Tkinter a pu grandement avancer grâce au tutoriel d’Aël D. sur Tkinter

Vous trouverez ci-dessous le projet, qui est en constante évolution :

Boucle Tutoriels

Différentes utilisations de la boucle bornée for en Python…

Essayons de dompter le tigre… ou plutôt le serpent en l’occurrence. D’ailleurs en parlant d’occurrence, plongeons dans le monde pantagruélique de la programmation et voyons aujourd’hui la boucle for.

A – Mais qu’est ce qu’une boucle, et a fortiori une boucle for ?

Et non ce n’est pas une formule magique, mais presque !

Mais d’abord l’essentiel serait de savoir ce qu’est une boucle en Python puis ensuite de l’adapter à la boucle for (c’est for en chocolat).

Alors comment dire, quand votre petit frère vous énerve tout particulièrement et que vous ne voulez pas rester trop longtemps dans cette géhenne ni faire trop d’escarmouche, alors vous avez une option, non pas la fuite, mais faire tourner en boucle ce personnage qui hante éblouit vos vies.

En lui promettant quelque chose puis en retirant cette promesse, tout en le répétant à de multiples reprises, vous parvenez par la magie du langage, d’objectiver votre conscience, pour qu’ensuite elle l’atteigne au cœur même de sa subjectivité.

Le mal étant fait, profitez de votre œuvre ! Bravo, vous avec compris le concept de boucle et ici c’est une boucle infinie. Super Mince ! Bon, il manque quelque chose pour que la boucle fonctionne vraiment et soit exécutable, c’est à dire pour que ce chérubin fasse ce que vous voulez (sinon il va rester planté là).

Par exemple quand on a peur de vous entendre dire encore une fois que les personnes âgées n’utilisant pas leurs appareils mobiles à bon escient devraient être emprisonnées à vie sur l’île de la Pêche au Sirop, on va dire : « Avant de nous dire cette frivolité tu es priés d’exercer une rotation dans le sens trigonométrique, de ta langue en faisant 7 tours ».

Ainsi vous connaissez déjà les boucles, et ici en plus c’est une boucle for, trop for ! (elle était facile j’avoue)

Donc, vous voyez le cerveau est surprenant de plasticité, vous savez dorénavant quelque chose que vous ne pensiez pas savoir, alors que vous n’avez rien appris de nouveau.

Mais alors que veut dire le mot for, que nos congénères anglicans apprécient tant ?

Selon toute vraisemblance, la traduction la plus logique serait pour, ou bien sur.

Rentrons maintenant que nous appréhendons ces points importants dans le cœur du sujet, et je peux vous dire qu’on est pas sorti du sable.

Alors, il faut savoir qu’en Python (et nous ne parlerons que du Python même si certains éléments seront présents chez d’autres espèces, sélection naturelle oblige), la boule for est une boucle conditionnelle, c’est-à-dire que comme son nom l’indique, elle est soumise à une condition. C’est pourtant clair non ?

Il faut qu’une condition sine qua none se présente pour que la boucle arrête de boucler et que votre frère vous écoute donc on fera attention à cela pour que tout se passe bien.

Pour qu’elle s’arrête il faut aussi un début. Il peut être indiqué explicitement, ou implicitement avec le sens du code.

A savoir que for ne peut pas marcher tout seul comme un grand, il doit obligatoirement être associé à un parent majeur comme une variable ou certaines fonctions.

B – Les différents usages de la boucle for

1. L’association boucle for et fonction range()

Commençons par le plus classique des points, l’appairage avec la fameuse fonction range() !

Donc vous avez un code tel qu’il suit

for i in range(debut, fin, pas):
    # je fais des choses tralalalala

On retrouve donc la structure clé ; l’instruction for, et ensuite un bazar sans nom avec la fonction range().

Décryptons tout cela en partant de la droite.

Alors range() c’est tout bête, c’est juste une fonction qui va aller de la valeur entière donnée de départ à la valeur d’arrivée en répétant cette tâche un nombre certain de fois. Et les pas seront l’écart entre deux valeurs données.

Et en fait i sera une variable temporaire de la boucle automatiquement créée par Python pour récupérer la valeur de la fonction range car sinon elle se perd.

Ainsi si l’on résume, on va parcourir toutes les valeurs entre 2 entiers avec un pas donné !

Ainsi, résumons :

for i in range(42, 50, 2):
	print(i)

Donnera :

42
44
46
48

Car oui il manquait un détail, on ne prend pas la valeur finale, mais la valeur strictement inférieure comme dernière valeur.

Par conséquent, cette boucle peut s’écrire de différentes manières en fonction du niveau de raffinement voulu :

Mode auto :

for i in range(fin):
	# laziza

Ce mode a par défaut un pas de 1 et un début à 0.

Et ici :

for i in range(debut, fin):
	# laziza

Pareil que tout à l’heure sauf qu’on donne explicitement le début.

Et donc tout cela, c’est bien magique, mais voyons un cas concret pour mieux comprendre l’utilisation.

Imaginons que j’ai une liste de matières préférées, classée par ordre de préférence décroissant ; c’est-à-dire que la matière préférée sera en premier, etc…

J’ai donc une liste comme suit :

matieres_preferees = ["NSI", "Maths Expertes", "Maths", "Physique-Chimie", "Philo", "Ma LV2", "Enseignement Scientifique", "SES"] 

Je vais donc dire au grand jour l’ordre de mes matières :

for id_matiere in range(len(matieres_preferees)):
    print("La matiere", matieres_preferees[id_matiere], "est au rang", id_matiere + 1, "dans mon ordre de préférence")
    #ou bien :  print("La matiere {} est au rang {} dans mon ordre de préférence",.format(matieres_preferees[id_matiere], id_matiere + 1) 

En fait ici la fonction len, très utile, donne la longueur de la liste, on parcourt donc la liste de son id 0 (son premier élément), jusqu’à l’id juste inférieur à la longueur de la liste, soit l’id du dernier élément de la liste.

Pour l’affichage, on rajoute un 1 à l’id de la matière, pour donner le rang, car sinon le premier élément aurait le rang 0, peu parlant en langage franchouillard.

Ce code va donc rendre :

La matiere NSI est au rang 1 dans mon ordre de préférence
La matiere Maths Expertes est au rang 2 dans mon ordre de préférence
La matiere Maths est au rang 3 dans mon ordre de préférence
La matiere Physique-Chimie est au rang 4 dans mon ordre de préférence
La matiere Philo est au rang 5 dans mon ordre de préférence
La matiere Ma LV2 est au rang 6 dans mon ordre de préférence
La matiere Enseignement Scientifique est au rang 7 dans mon ordre de préférence
La matiere SES est au rang 8 dans mon ordre de préférence

Et voila vous savez parcourir des nombres à l’aide de for et de range !

2. Le parcours d’éléments autonome (sans valeur chiffrée)

Maintenant, reprenons l’exemple précédant, et affinons le un peu pour le rendre plus élégant.

On va s’avouer quand même que l’écriture de tout à l’heure pour dire l’ordre de nos matières préférées était un peu lourd, redondant, et inutile. Il faut en effet passer par la valeur chiffrée de l’id de l’élément sur la liste pour ensuite arriver à l’élément en lui même. Or, on a vu en philosophie que le fait de traduire sa pensée subjective vers quelque chose d’objectif, comme le langage ou ici la valeur chiffrée, trahissait notre pensée. Donc ce n’est pas bon car cela ne reflète pas exactement ce qu’on veut faire, il faut donc essayer de rester dans notre idée, sans devoir passer par un élément externe pour y arriver.

Or, c’est magique, Python a parfaitement compris cela et nous propose une solution quasiment optimale pour cela ; on parcourt la liste mais sans dire d’autres éléments en utilisant la structure suivante :

for elem in groupe_d_elem:
  	#tralalilala

L’écriture est très simple, et même enfantine, parce que littéralement on dit « Pour chaque élément dans le groupe d’éléments »

A savoir que la variable plus haut nommée elem sera automatiquement créée et mise à jour par Python pour chaque valeur ; rien à faire 😉 !

Donc revenons à notre exemple, cela va donc faire comme suit :

for matiere in matieres_preferees:
  	print("La matiere est :", matiere)

Ce qui rend donc après exécution :

La matiere est : NSI
La matiere est : Maths Expertes
La matiere est : Maths
La matiere est : Physique-Chimie
La matiere est : Philo
La matiere est : Ma LV2
La matiere est : Enseignement Scientifique
La matiere est : SES

On conviendra que c’est bien pratique a écrire et ce de façon simple mais, problème, on a perdu la numérotation des matières pour savoir l’ordre.

C’est là qu’arrive une fonction encore une fois bien pratique de Python ; enumerate.

3. Enumerate, notre sauveur

On reprend donc exactement ce qu’on a écrit tout à l’heure avec le parcours simple sans le range en rajoutant quelques petits détails :

for rang_matiere, matiere in enumerate(matieres_preferees, start=1):
  	print("La matiere est :", matiere, "au rang de preference :", rang_matiere)

Et là, magie, on retrouve notre rang tant manqué !!

La matiere est : NSI au rang de preference : 1
La matiere est : Maths Expertes au rang de preference : 2
La matiere est : Maths au rang de preference : 3
La matiere est : Physique-Chimie au rang de preference : 4
La matiere est : Philo au rang de preference : 5
La matiere est : Ma LV2 au rang de preference : 6
La matiere est : Enseignement Scientifique au rang de preference : 7
La matiere est : SES au rang de preference : 8

En fait ici Python va créer 2 variables ; la variable matière vu comme tout à l’heure et une variable rang_matière, qu’il incrémente à chaque fois de 1 au fur et à mesure du passage à la matière suivante. On lui indique même un bonne valeur de départ pour être certain qu’il parte du bon nombre comme vu tout à l’heure.

Donc si on résume, pour faire ce que l’on a fait c’est-à-dire afficher le rang et la matière deux options s’offrent à nous ; la méthode « Pattes d’Ours » grossière, brutale et peu élégante avec for et la fonction range, ou bien celle avec enumerate, ou la valeur donnée et l’objet sont tous deux présents dans des variables et donc plus facilement utilisables (pour des vérification par exemple avec des tests conditionnels).

En parlant de tests conditionnels d’ailleurs, on peut sortir de la boucle for au bout d’un certain moment si on veut en utilisant break.

Prenons ici notre même exemple et imaginons qu’on veut juste afficher le top 3 des matières, cela fait donc :

for rang_matiere, matiere in enumerate(matieres_preferees, start=1):
    if rang_matiere > 3:
        break
    else:
        print("La matière", matiere, "est au rang de preference :", rang_matiere)

Cela rend donc après exécution :

La matière NSI est au rang de preference : 1
La matière Maths Expertes est au rang de preference : 2
La matière Maths est au rang de preference : 3

Magique non ?

Bien sur, l’inverse est aussi possible avec continue, c’est-à-dire que même si quelque chose est vérifié, on ne sort pas de la boucle, on continue encore.

Passons maintenant à un autre côté magique de Python, une petite astuce sur les chaînes de caractères ; en effet pour lui, ces dernières sont comme des listes, on peut donc les parcourir de la même manière.

Ainsi la phrase :

phrase = "D'apres une etude de l'INSEE la totalite des gens ayant fait NSI en Premiere et en Terminale vivraient heureux et plus longtemps que les autres"

Donnerait ceci en faisant un petit booster pour n’afficher que les mots :

for id_lettre, lettre in enumerate(phrase):
    if lettre == " ":
        pass
    else:
        print(lettre, end="")
        if id_lettre == len(phrase) - 1 or phrase[id_lettre + 1] == " ":
          print("\n")

Cela donnerait donc :

D'apres

une

etude

de

l'INSEE

la

totalite

des

gens

ayant

fait

NSI

en

Premiere

et

en

Terminale

vivraient

heureux

et

plus

longtemps

que

les

autres

On remarquera ici encore quelques petites astuces sur les boucles for. Il y a tout d’abord le pass, qui permet de sauter une répétition si jamais il se passe quelque chose (ici s’il y a un espace), mais aussi les vérifications d’id de la phrase pour savoir si c’est la fin d’un mot ou non.

4. Un petit plus, l’usage de yield associé à la boucle for

yield en Python est un petit peu particulier. Pour le définir, on pourrait le qualifier comme un return, mais qui s’incrémenterait de 1 tout seul à chaque appel. Comme pour return, il ne peut donc être utilisé que dans une fonction.

Voyons un exemple pour mieux l’appréhender :

def nombre_ex():
    for i in range(40,43):
        print("Nouvelle valeur !")
        yield i

On associe donc à yield, la valeur de i comprise entre 40 et 42.

Si on appelle juste la fonction telle qu’elle dans un terminal Python, on obtient un retour étrange :

>>> nombre_ex()
<generator object nombre_ex at 0x100e2a490>

Etrange, la fonction n’est pas perçue comme une fonction, mais comme un générateur, et elle n’est pas exécutée ! C’est tout simplement parce que yield à la place de return joue la place d’un générateur, vu qu’il s’incrémente d’une valeur.

On peut donc utiliser la boucle for sur ce générateur :

temp_iter = nombre_ex()
for elem in temp_iter:
  print(elem)

Ce qui nous fait donc :

Nouvelle valeur !
40
Nouvelle valeur !
41
Nouvelle valeur !
42

C – L’instanciation d’un itération

1. L’itération d’un objet

Pour les adeptes de la POO (Programmation Orientée Objet), n’oublions pas qu’il existe une méthode, pour pouvoir rajouter à votre classe la possibilité d’être itérative selon votre volonté !

Il s’agit de la méthode __iter__ ; comme indiqué dans son nom, elle permet à votre classe de devenir … itérative !

Mais comment concrètement cela marche ?

Voyons déjà sa structure de base et son explication à l’aide d’un exemple neutre.

class maClasse:
    def __init__(self):
        #J'initie ma classe
    #[...]
    def __iter__(self): #autres arguments si voulu
        #Je retourne mon objet itératif
    def __next__(self):
        if condition is verifie:
      		#Je passe à l'élément suivant dans mon itération en suivant certaines conditions
        else:
            raise StopIteration #on stoppe l'itération si la condition n'est pas vérifiée
        
temp = maClasse("""Tartampion""")
for elem in temp:
    #Réaliser une action

Comme vous le voyez, comme pour les méthodes __init__, ou bien __str__ (qui permet d’utiliser la fonction print()), les méthode __iter__ et __next__ sont implicites. Sachez que l’on reconnait ces méthodes dites implicites mais qui sont bien utiles par la présence de doubles underscores (_) avant et après le terme de la méthode.

Ici __iter__ et __next__ sont au cœur même du concept d’itération pour Python. Et c’est ici qu’il faut comprendre quelque chose d’important dans le fonctionnement de for (que je n’exprime que maintenant supposant que si vous êtes ici, c’est que vous maîtrisez mieux tous les concepts de programmation de base).

En effet, pour fonctionner, la boucle for appelle à chaque fois la fonction iter(), sur l’objet sur lequel on est. En ajoutant une méthode __iter__ à notre objet, on le rend donc « itératif » et on fait donc fonctionner la fonction iter(), et ainsi la boucle for. Mais pour l’instant cette boucle va toujours afficher le même élément, car on n’a pas expliqué comment aller à l’élément suivant ; c’est ce qui se passe avec la méthode __next__, on explique à Python comment dans une boucle il pourra aller à l’élément suivant !

Donc voilà, on a pu créer un comportement itératif pour notre classe !

Mais attention, pour pouvoir le faire, il faut bien comprendre et assimiler le fonctionnement de cette dernière, en connaissant bien les conditions de passage d’un élément à l’autre ; en prenant en quelque sorte du recul sur notre objet, pour essayer de se le représenter virtuellement, au risque d’avoir quelques surprises !

2. Des objets itératifs dans des packages

Bien évidemment, vous vous en doutez, s’il est possible de réaliser l’itération dans ses propres classes, de grands packages de classes en sont dotés, comme par exemple le package os.

Ce package présente, comme son nom l’indique, tout ce qui est en lien avec l’OS (ou système d’exploitation en français). Or dans un ordinateur, il y a quelque chose qu’on peut avoir besoin dans un programme Python, qui est présent en nombre et souvent très mal rangé. Et oui, il s’agit des documents présents dans des « directories » (ou dossiers), que la boucle for permet donc aisément de parcourir, comme suit avec ce petit exemple très simple :

import os

for filename in os.listdir("un_dossier/mon_directory/"):
    print(filename)
    if filename.endswith(".py"):
        print("Ohhh un fichier Python !!")

Comme vous le voyez, on a itéré sur les fichiers de notre directory à l’aide de cette classe (qui fonctionne moyennement sur Linux, attention), et cela est faisable sur toute classe sur laquelle le développeur en a laissé la possibilité.

Conclusion

Et voilà, vous êtes enfin arrivés au terme de ce tuto plutôt didactif, votre calvaire et enfin terminé !

Dans tout les cas j’espère que celui-ci vous aura été aussi utile à vous qu’à moi, me permettant de découvrir des talents cachés de la boucle for que je ne vais cesser d’utiliser.

La programmation et l’algorithmique prennent aujourd’hui une place toujours plus prépondérante dans nos vies, et cela ne va cesser de s’accroître. Maîtriser ces concepts de base autour de la programmation peut vous permettre de mieux appréhender ce nouveau domaine en pleine croissance, et ainsi de vous rendre compte qu’il est beaucoup plus éloigné des geeks solitaires à lunettes que vous pensiez, mais plutôt le fruit de logique, d’expériences, d’idées, et de savoir ; se rapprochant en fait d’une logique algorithmique ; mathématique.

Maintenant la boucle for n’aura (presque) plus de secrets pour vous en Python !

Tux, mascotte de Linux Tutoriels

Comment adopter Linux sans perdre son utilisation de Windows

Vous êtes heureux car Windows 11 est sorti, à vous les toutes dernières nouveautés, une nouvelle fenêtre s’ouvre sur votre vie et votre avenir, vous êtes encore plus heureux que le 25 au matin quand vous ouvrez vos cadeaux. En effet, aujourd’hui c’est un jour de fête, vous allez enfin pouvoir avoir le design tant voulu de macOS Big Sur, avec ses bords si arrondis, ses effets transparents, son Dock centré, et même son mode sombre !

Sauf que le joug du marketing et de l’obsolescence programmée vient de tomber. Vous êtes déjà trop vieux, à moins que ce soit les composants de votre PC… Votre Ryzen 5 de première génération qui marche à la perfection et parvient même à faire tourner le Démineur n’est pas accepté dans les nouvelles conditions d’installation de Windows 11, contrairement à un Intel Atom qui lui, est mis à jour.

C’est alors que descendu du ciel, vous voyez apparaître comme un oiseau de bonne augure (sauf qu’il ne vole pas, la faute à la sélection naturelle mise en exergue par Darwin), …, un pingouin !

Mais ce pingouin est particulier parce qu’au fin fond de son iris, vous pouvez voir un Gnou ?!

C’est alors que votre cerveau a un déclic ! Mais oui, il s’agit de GNU/Linux, un système d’exploitation à part entière !

Mais bon, à quoi ça sert d’installer des distributions Linux, elles sont avariées et vieillottes.

C’est alors qu’au détour d’une recherche sur l’Internet, vous apprenez que Linux est utilisé par des milliards d’appareils dans le monde, que ce soit dans les serveurs, ou alors dans tous les appareils mobiles, que ce soit les fruits ou les sucreries à la voix robotique.

Alors, si on laissait une chance à Linux ? (à moins que ce soit Linux qui nous laisse une chance)

Début sur Linux ou qu’est-ce-qu’un gestionnaire de paquets

Pour la suite du tutoriel, j’utiliserai la distribution Linux nommée Manjaro avec comme interface de bureau KDE Plasma ; il existe d’autre distribution toutes aussi nombreuses, comme les plus connues Ubuntu avec son interface de bureau Gnome, qui est tiré de Debian et que je vous recommande d’utiliser de par sa facilité.

Mais alors pourquoi est-ce que j’utilise Manjaro ?

C’est très simple, car cela me permet d’interagir avec PacMan, mais aussi pour pouvoir me vanter car cette distribution Linux est basée sur Arch, (ce même est en référence à l’apparente complexité d’utilisation d’Arch, qui était réputée à son départ extrêmement dure).

Mais donc cette histoire de PacMan, d’où ça vient ?

C’est très simple : Sur Windows vous allez avoir le Microsoft Store, et sur vos téléphones, l’App Store ou bien le Google Store, et bien, en quelque sorte, sur Linux il existe ce que l’on appelle des dépôts (ou gestionnaires de paquets) qui jouent à peu près le même rôle (bien qu’il existe des alternatives directes au Microsoft Store sur Linux, mais nous en reparlerons peut-être).

Et donc pour utiliser ces dépôts, pas d’interface graphique disgracieuse, non on utilise le terminal, cette boîte noire qui s’ouvrait discrètement quand un virus essayait d’accéder à vos données sur le bon vieux Windows.

Et donc pour donner l’ordre à des fichiers issus du dépôt de s’installer, on utilise pacman sur les distributions Arch par exemple, ainsi que apt-get sur Debian/Ubuntu (il en existe d’autre mais je ne parlerais que de ces deux là, les plus réprésentatives).

Pour pouvoir télécharger des paquets, il faut passer en super-utilisateur en précédant la commande pacman ou apt-get du fameux sudo (rien avoir avec le sport traditionnel japonais) ; c’est une sorte de mode Admin de Linux.

Bien, maintenant rentrons dans le cœur du sujet, si vous voulez bien installer Linux, vous souhaitez surtout pouvoir utiliser tout ce que vous faisiez avant avec le moins de problèmes possibles.

Et alors, bonne nouvelle, aujourd’hui tout passe par le Web, et vous avez par défaut installé le navigateur Firefox qui marche comme sur sa version Windows !

Donc c’est bon le problème est réglé, on peut utiliser la Suite Office en ligne, du cloud, du cloud gaming, toute la suite Google, etc… C’est super !

Conclusion

Ce tutoriel est fini, merci beaucoup de l’avoir suivi jusqu’au bo…

Les drivers, la clé de voûte du fonctionnement idéal d’un OS

Sauf que non ! Plusieurs problèmes se posent, même si la majorité de nos besoins est en ligne aujourd’hui, certains logiciels, ou drivers peuvent nous êtres nécessaires ou ne pas être présents en ligne, il faut donc plus aller en profondeur en commençant par les drivers pour imprimer, utiliser la connexion sans fil, etc…

Avant d’aller plus loin, la plupart des logiciels exprimés par la suite seront open-source et libres (par volonté). En effet, si l’on passe sur Linux qui est un logiciel open-source, c’est à dire dont le code est visible est modifiable par n’importe quel individu, ce qui crée une communauté d’entraide, beaucoup plus soudée que sur d’autres OS. Ainsi si vous avez le moindre problème, n’hésitez pas à demander à ces communautés qui vous répondront avec plaisir. De même et c’est un avantage indéniable, la plupart des solutions fournies qui sont donc open-source sont gratuites (vous pouvez bien sûr, et ça ne peut être que positif, faire des dons à ces fournisseurs de solutions logicielles pour les remercier dans leur dur travail). C’est toute cette éthique qui fait le cœur de Linux et que je trouve très intéressante.

Bien, revenons à nos moutons. Pour la connexion Wifi ou Bluetooth, ne croyez pas que Linux c’est l’âge de pierre ! Cela marche aussi aisément que sur Windows ou tout autre OS dans les paramètres.

Par contre pour des drivers, ça devient plus dur, prenons par exemple les imprimantes.

La plupart des imprimantes que nous avons aujourd’hui sont Bluetooth ou marchent en réseau local. Lorsque le PC que j’utilisais était encore sur Windows, les impressions buggaient à chaque fois et j’étais obligé de me connecter en filaire à l’imprimante, une galère.

Et bien sur Linux, tout est transparent et marche excellemment bien.

Prenons un exemple. Je possède une imprimante et plus particulièrement, une HP Envy, donc malheureusement il n’existe qu’un driver propriétaire pour qu’elle fonctionne.

Une fois dans les paramètres on clique donc sur Imprimantes

Puis arrive le moment du choix, étant connecté au Wifi, mon imprimante est découverte en réseau :

Il ne me suffit plus qu’à la sélectionner, et à installer le pilote.

En l’occurence celui-ci pour mon imprimante HP.

Une fois cela fait le driver est installé et magie l’impression marche du premier coup sans aucun réglage extérieur (contrairement à Windows).

Maintenant qu’on sait imprimer, on voudrait aussi regarder du contenu en streaming sur Netflix, Disney+, Apple TV+ ou encore Amazon Prime. Sauf que vous le savez peut-être mais ces vidéos ne vous appartient pas, elles vous sont juste « prêtées » en quelque sorte le temps du visionnage. Et bien pour éviter durant votre visionnage que vous ne voliez le contenu de cette vidéo (en faisant un enregistrement d’écran par exemple de tout le film), il existe ce qu’on appelle des DRM, c’est-à-dire grosso modo des sécurités (pas open-source du tout) qui vous empêche de filmer ou d’enregistrer tout contenu issu de ces vidéos. C’est d’ailleurs pour cela que si vous prenez une capture d’écran de votre smartphone par exemple en train de regarder une vidéo en streaming, la seule chose que vous verrez c’est un écran noir et rien de plus.

Sur Linux ces DRM ne sont par défaut pas activées, et vu que les services de streaming s’accèdent tous par le Web, c’est sur un navigateur comme Firefox qu’il faudra les imprimer.

Pour ce faire, rien de plus simple : Prenons l’exemple de Netflix.

Après s’être connecté à son compte sur le navigateur, une petite notification apparaît en haut de la page, comme suit :

Pour les utiliser, il suffit donc tout simplement de cliquer sur « Activer les DRM ». Après un petit chargement ça marche !

Super donc on peut regarder des vidéos en streaming sur Linux !

On a d’ailleurs presque fini avec tous les drivers, il n’en manque plus qu’un, le plus critique et le plus important, le driver de la carte graphique.

Il faut savoir que lors de l’installation, la plupart des distribution Linux installent le pilote graphique nécessaire pour votre carte graphique (en la détectant de façon autonome et automatique), ces pilotes sont donc open-source, mais il peut arriver que pour certains usage il faille utiliser le pilote issu du constructeur surtout pour les cartes graphiques Nvidia. Dans ce cas, rien de plus simple, il suffit de se rendre sur le site du constructeur et de télécharger le driver compatible Linux adapté pour sa carte graphique Nvidia, dont voici le lien.

Pour vérifier que ses drivers open-source sont bien installés, on peut se rendre dans les paramètres et vérifier automatiquement les drivers adaptés aux composants :

On clique ensuite pour vérifier, et magie les composants sont installés (ou mis à jour le cas échéant). Pour la faible puissance de mes composants, cela rend ça :

Maintenant que la plupart des composants sont au point et tournent sans aucun problème (et surtout la carte graphique), pourquoi, alors ne pas envisager de jouer.

Jouer sur Linux ?!

Et oui, car Linux permet aujourd’hui à ses utilisateurs de jouer à des jeux triples A, comme à des Open-World optimisés pour Linux et même mieux car on peut faire tourner des jeux seulement jouables sur Windows !

Tout cela se passe grâce au launcher Steam, que l’on peut préinstaller lors de l’installation de sa distribution Linux. Sinon, il suffit sur Debian/Ubuntu d’entrer dans le terminal la commande « sudo apt-get install steam » et de suivre les instructions, ou sous Arch d’écrire la commande « sudo pacman -S steam ». Si vous êtes sur d’autre OS, ou encore sur ces derniers et que le terminal vous fait peur, ouvrer la Bibliothèque d’installation de logiciels (qui a un nom différent à chaque distribution) et recherchez puis installez Steam.

Une fois cela fait, il suffit de l’ouvrir, et de se connecter à son compte. Vous retrouvez alors votre bibliothèque de jeux que vous pouviez avoir utilisé et acheté sur Windows. Et bonne nouvelle la plupart marcheront sur Linux !

En effet nombreux sont ceux qui ont été optimisés pour Linux ! Mais comment le savoir ?

C’est très simple, c’est ceux qui en plus d’avoir le logo Windows (et hypothétiquement macOS si le jeu tourne sur cet OS) ont le logo de Steam, comme sur l’exemple ci-dessous :

Il suffit juste de l’installer pour y jouer !

En revanche, il s’avèrent que certains jeux sont optimisés seulement pour Windows (ou macOS), on ne peut donc supposément pas y jouer :

Quel dommage, je ne peux pas jouer à The Witcher 3

Si on clique pour y jouer quand même, on a une erreur d’exécution qui est assez claire :

Le système nous dit que l’on est sur une plateforme invalide !

C’est alors qu’arrive Steam Play avec Proton. Steam Play permet dans Steam de faire tourner la plupart des jeux Windows grâce à Proton. Il faut savoir que Proton est basé sur Wine, vous verrez nous y reviendrons…, et qu’il n’émule pas Windows, il permet de faire tourner en natif les jeux Windows, avec donc moins de perte de performances.

Pour les jeux Windows qui ont été testé (donc souvent les plus grosses ventes / succès) Steam Play est activé par défaut. En revanche, on peut souhaiter jouer à des jeux qui n’ont pas été testé et qui n’activent donc pas par défaut Steam Play.

Pour l’activer dans tous les cas il suffit de se rendre dans les paramètres :

On remarque que par défaut Steam Play est activé pour les « jeux supportés », il suffit de cocher « Activer Steam Play pour tous les autres titres » pour que cela marche dans la plupart des autres cas, et de dire d’exécuter ces jeu avec la dernière version de Proton (6.3-8 dans mon cas), ou la version bêta, pour être sur que le plus de jeux possible fonctionnent !

Une app Windows sur Linux ? Ceci n’est pas un émulateur !

Tout à l’heure j’ai évoqué Wine, un acronyme pour « Wine Is Not an Emulator », lui même un acronyme pour « Wine Is Not an Emulator »… (vous avez compris le petit clin d’œil récursif). Et bien, sachez que ce logiciel très ancien permet de faire tourner nombre d’applications Windows sous Linux ! Magique, au moins les applications que vous utilisiez jadis et qui ne sont pas optimisées pour Linux peuvent être utiles en utilisant ce logiciel magique.

On va installer deux composants ici, Wine donc, mais aussi PlayOnLinux, qui n’est d’autre qu’un solution graphique pour Wine, pour ceux qui sont frileux d’utiliser le terminal et de se débrouiller seuls.

Pour installer Wine, rien de plus simple : Sur Debian/Ubuntu, c’est : « sudo apt-get install wine », et sur les distributions Arch : « sudo pacman -S wine » ; vous avez compris la mécanique ! Pour tous les autres, ça se passe sur votre bibliothèque d’app à moins de connaître la commande pour utiliser votre dépôt.

De même pour PlayOnLinux, ou la commande Debian est : « sudo apt-get install playonlinux » et pour Arch : « sudo pacman -S playonlinux ». On peut aussi retrouver cette app dans la bibliothèque d’app.

Ensuite, pour utiliser les fonctionnalités de Wine, il suffit de télécharger un fichier .exe et de l’exécuter depuis le gestionnaire de fichier (Clic droit / Ouvrir avec Wine). S’il ne manque pas des bibliothèques, alors l’exécuteur de l’app s’ouvrira et vous pourrez procéder à l’installation.

Par exemple, l’émulateur Casio 90E+ disponible uniquement sur Windows et macOS, tourne parfaitement sur Linux :

On retrouve ici l’utilitaire d’installation qui va installer l’app dans une zone de Linux, ou le format des dossiers de Windows est reproduit.

L’installation finie, Wine crée un lien de cette app vers votre bureau et vous pouvez l’utiliser !

En revanche, certaines grosses apps comme par exemple celle de la suite Adobe, peuvent nécessiter l’installation de composants externes, c’est pour cela que pour ce genre d’app, je vous recommande de passer par PlayOnLinux qui possède pour les apps les plus usités, un installateur adapté qui en plus d’installer l’exécutable avec Wine, va aussi installer tous les composants externes nécessaires. Pour ouvrir PlayOnLinux, il suffit de taper dans une page de terminal la commande : « playonlinux » et l’app s’ouvrira :

Il suffit ensuite de cliquer sur Installer pour choisir les apps à installer, logique !

Et voilà vous pouvez ensuite indiquer les apps que vous souhaitez avoir et, sous réserve d’avoir le .exe de l’app, vous pourrez lancer l’installation. Bien évidemment certaines apps ne marcheront malheureusement pas, si c’est le cas, faites un tour sur les communautés de Wine et de PlayOnLinux, pour savoir si le problème est connu ou non, ou si une solution alternative existe.

Conclusion « brève » mais intéressante

Bien ce tutoriel touche bientôt à sa fin et vous vous disez que l’on n’a toujours pas évoqué l’essentiel. En effet je suppose que les seules apps nécessaires aujourd’hui possèdent toutes des alternatives open-source comme Libre Office par exemple en opposition à l’Office de Microsoft, mais je ne souhaitais pas faire une liste exhaustive trop redondante de toutes ces apps, si vous en avez besoin, libre à vous de faire des recherches pour trouver ces alternatives, qui sont très connues et souvent aussi pratiques et puissantes que leurs cousines privées. Encore mieux certaines apps comme Blender par exemple pour la modélisation 3D sont open-source et sont leaders dans leur domaine ; tout le monde les utilise ! Alors bien évidemment, des versions Linux existent. L’essentiel étant de savoir ce que l’on a besoin (par exemple un logiciel de traitement de texte) et de taper sur votre moteur de recherche favori « alternative Linux [Nom de l’app privée] ». Bien sur, s’il n’existe pas d’alternatives pour vos besoins, tournez vous vers Wine, il y a de forte chance que cela fonctionne.

Linux au fil de ces années s’est beaucoup démocratisé, de part la volonté des individus à avoir plus de contrôle sur leur vie privée, leurs données, plus de possibilité de modularité, etc… tous les désavantages d’OS payants comme Windows. C’est donc forcément que des alternatives ont vu le jour par des passionnés qui voulaient que cela corresponde exactement aux besoins de la communauté.

Un seul bémol si je puis dire sur ces alternatives, qui est dans les idées reçues autour de Linux, est le design des logiciels, souvent très vieillot. Et bien c’est vrai, ce n’est pas qu’une idée reçue, mais cela tend à changer de part la volonté des utilisateurs. De même la communauté open-source se développe, même à l’aide d’acteurs privés, Apple s’est très récemment engagé auprès Blender pour l’aider dans son développement aussi bien économique que logiciel, soutenant cette communauté open-source (et permettant d’avoir plus d’amélioration de Blender pour son système).

Nous sommes donc arrivés à la fin, j’espère que cela vous aura convaincu d’installer et d’utiliser Linux au lieu de Windows, car vous avez vu que vous n’aurez pas à drastiquement changer votre utilisation, grâce aux solutions mises en place par des passionnés, car après tout l’humanité n’est-elle pas que le fruit d’échange entre les individus, ce que l’on retrouve dans l’essence même de Linux et de l’open-source.

DS

Correction du sujet de l’épreuve Blanche de 1ère NSI,…

Dans le cadre de l’évaluation en contrôle continu, les élèves étudiant la spécialité NSI passent des épreuves de de contrôle continu lors du troisième trimestre de leur année de première.

Introduction

Les épreuves de la session 2021 ont été annulés, mais les épreuves blanches dans notre établissement ont été maintenues.

Nous vous proposons la correction de cette épreuve. Elle contient 40 questions de la banque officielle des sujets ainsi qu’une question « One More Thing » sur deux points. Il est néanmoins hypothétiquement possible que certaines des réponses proposées dans ce sujet ne soient pas à 100 % « totalement officielles ».

Le sujet est disponible en version PDF :

Cette correction a été entièrement préparé et rédigé sur ce site web par nos élèves de la spécialité NSI du lycée Louis Pasteur.

Les sujets sont sous licence CC BY-NC-SA 3.0 FR, le présent corrigé est sous la même licence.

Thème A : types de base

Question A.1
Quel est un avantage du codage UTF8 par rapport au codage ASCII ?

Réponses
A. il permet de coder un caractère sur un octet au lieu de deux
B. il permet de coder les majuscules
C. il permet de coder tous les caractères
D. il permet de coder différentes polices de caractères
E. UTF8 permet de descendre de la montagne même quand ASCII ce n’est pas possible.

Correction : Réponse C
Après une très longue réflexion, la E nous semblait être la plus pertinente. Néanmoins n’aimant pas le Ski mais préférant la course à pied, nous avons plutôt choisi la C. En effet UTF8 permet de coder tous les caractères et même le très franchouillard « Â » ou encore le « ß » de nos cousins germains.

Question A.2
On considère les codes ASCII en écriture hexadécimale (en base 16).Retour ligne automatique
Le code ASCII de la lettre A est 0x41, celui de la lettre B est 0x42, celui de la lettre C est 0x43, etc. Quel est le code ASCII, en hexadécimal, de la lettre X (c’est la 24e lettre de l’alphabet usuel).

Réponses
A. 0x58 
B. 0x64 
C. 0x7A
D. 0x88

Correction : Réponse A
Ici le piège si on ne lisait que les chiffres c’était de croire que le X qui est la 24 ème lettre de l’alphabet usuel (soit la 24 lettre en décimal). On additionnait donc des décimaux et des hexadécimaux et paf, on tombait en plein dans l’erreur. Il faut donc convertir 23 (car il y a 23 d’écart entre A et X) en hexadécimal, puis l’additionner à l’hexadécimal de A. Et paf, ça fait des chocapics (où plutôt 0x58) !

Question A.3
Quelle est la représentation en binaire de l’entier 64 sur un octet ?

Réponses
A. 0101 0000
B. 1100 0100
C. 0100 0000
D. 0000 1100

Correction : Réponse C
C’est dans cette question où on verra qui sont les béotiens du binaire, je crois qu’on ne peut faire plus simple, tomberas-tu dans le piège qui te dit que c’est trop facile donc tu coches autre chose (d’illogique evidemment) puis en fait il s’avère que tu avais raison, donc tu as un énorme seum pasque tu sais que tu avais bon. Bref, j’espère que tu as la C sinon tu crains.

Question A.4
Quelle est l’écriture hexadécimale de l’entier dont la représentation en binaire non signé est 1100 0011 ?

Réponses
A. BB
B. C3
C. CB
D. 7610

Correction : Réponse B
Excepté si vous souhaitez vous rendre dans le chaleureux (et très perdu) canton d’Eu, ou avoir une carte bancaire, ou même écraser un bébé (???), euuu je vous conseille de prendre la Citroen C3, c’est la plus fiable et vous aurez moins de problèmes.

Thème B : types construits

Question B.1
On considère le script suivant :

t = [2, 8, 9, 2]
t[2] = t[2] + 5

Quelle est la valeur de t à la fin de son exécution ?

Réponses
A. [42, 13, 9, 2]
B. [2, 8, 14, 2]
C. [7, 13, 14, 7]
D. [7, 13, 9, 42]

Correction : Réponse B
Bon, même si le 42 attire inéluctablement nos regards, on doit l’oublier (excusez nous). Ça nous laisse plus que deux possibilités, B et C. Si vous vous débrouillez super bien en calcul mental, vous verrez que 9+5=14. Vérifier le calcul si vous doutez évidemment, je ne suis sure de rien. Donc, on remplace à l’indice 2 (n’oubliez pas qu’on commence avec l’indice 0 dans une liste) avec votre calcul effectué avec brio ci-dessus. On se demande où ils sortent leur réponse C quand même.

Question B.2
Que vaut l’expression [ 2*k for k in range(5) ] ?

Réponses
A. [0,2,4,6,8]
B. [2,4,6,8,10]
C. [1,2,4,8,16]
D. [2,4,8,16,32]

Correction : Réponse A
Une seule réponse sera l’élue, avec un zéro dedans puisque le inrange(5) démarre dès 0, donc sauf si vous avez des problèmes de vue, ou autres hein (ignare), impossible de trouver autre chose.

Question B.3
Après l’affectation suivante :

alphabet = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]

quelle est l’expression qui permet d’accéder à la lettre E ?

Réponses
A. alphabet[42]
B. alphabet[’E’]
C. alphabet[4]
D. alphabet[5]

Correction : Réponse C
Donc, pour trouver l’expression qui permet d’accéder à la lettre E, il suffit de compter à quel rang elle est dans l’alphabet. Ensuite il nous faut retrancher à ce nombre 666, puis ajouter un peu de poudre de perlimpinpin de 69, quelques carabistouilles de 42 et enfin, traverser 120 fois la rue pour trouver un travail. Et voilà ! Vous tombez sur la réponse C (le premier indice de la liste est 0).

Question B.4
On définit le dictionnaire d = ’a’ : 1, ’b’ : 2, ’c’ : 3, ’z’ : 26. Quelle expression permet de récupérer la valeur de la clé ’z’ ?

Réponses
A. d[4]
B. d[26]
C. d[z]
D. d[’z’]

Correction : Réponse D
Vous savez utiliser un dictionnaire ? Et ben voilà c’est pareil ! On cherche la “définition” (appelée ici “valeur”) de “z” donc tape donc la réponse D, et magie on a comme retour la valeur de “z”.

Question B.5
On définit : L​ = [10,9,8,7,6,5,4,3,2,1] Quelle est la valeur de L[L[3]] ?

Réponses
A. 3
B. 4
C. 7
D. 8

Correction : Réponse A

Il faut apprendre à décomposer on cherche donc le retour de la liste L d’indice de la valeur de l’indice 3 de la liste L. Autrement dit, on regarde la valeur d’indice trois. Comptons :
1, 2, 3 ; c’est donc “8” ! Et bien non chers nsistes ! Il ne faut pas oublier que pour une liste en Python, la première valeur est celle d’indice “0”. Donc la valeur d’indice “3” est “7” !
On cherche ensuite la valeur de la liste d’indice “7” ; soit “3” !!

Question B.6
On exécute le code suivant :

A = [ [ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ] ] 
B = [ [ 0 , 0 , 0 ], [ 0 , 0 , 0 ], [ 0 , 0 , 0 ] ] 
for i in range( 3 ):
	for j in range( 3 ): 
		B[i][j] = A[j][i]

Que vaut B à la fin de l’exécution ?

Correction : Réponse C

Pour l’audace, la E. Nan plus sérieusement, il faut d’abord comprendre ce que fait le programme. On se rend compte que la liste B va être « remplie » des éléments de la liste A mais pas dans l’ordre, seulement, il y a des petits pièges, puisque le programme ne fait pas qu’inverser la liste, mais les indices de la liste. Ainsi pour une valeur de B ; soit B[i][j], on mettra la valeur de A[j][i]. 
Un exemple parle toujours mieux : 
Si on a B[1][2] ; soit la troisième valeur de la deuxième sous-liste de B, on va y mettre comme valeur, celle de A[2][1] ; soit 8 !

Thème C : traitements de données en table

Question C.1
On définit la fonction suivante qui prend en argument un tableau non vide d’entiers :

def f (T) : 
    s = 0
    for k in T: 
        if k == 8 :
            s = s+ 1 
        if s > 1 :
            return True 
        else :
            return False

Dans quel cas cette fonction renvoie-t-elle la valeur True ?

Réponses
A. dans le cas où 8 est présent au moins une fois dans le tableau T
B. dans le cas où 8 est présent au moins deux fois dans le tableau T 
C. dans le cas où 8 est présent exactement une fois dans le tableau T 
D. dans le cas où 8 est présent exactement deux fois dans le tableau T
Correction : Réponse B

Question C.2
Soit le tableau défini de la manière suivante :
tableau = [[​1​,​3​,​4​],[​2​,​7​,​8​],[​9​,​10​,​6​],[​12​,​11​,​5​]]
On souhaite accéder à la valeur 12, on écrit pour cela :
Réponses
A. tableau[4][1]
B. tableau[1][4]
C. tableau[3][0]
D. tableau[0][3]

Correction : Réponse C
Encore une fois on a affaire à ces foutus tableaux de tableaux grrrr, bref simplement de la logique, comme dhab vous avez l’indice 0 en premier, donc pour trouver 12, selon ce raisonnement foncièrement bon, vous allez au tableau 3, indice 0 (pasque on va du plus grand au plus petit, bref si tu comprends pas va voir ton cours loulou).

Question C.3
On définit :

contacts = { 'Toto' : 'toto@nsi.fr' , 'Chloé' : 'chloe@nsi.com' , 'Paul' :'paul@nsi.net' , 
            'Clémence' : 'clemence@nsi.org' }

Parmi les propositions suivantes, laquelle est exacte ?

Réponses
A. ’Chloé’ est une valeur de la variable contacts
B. ’Chloé’ est une clé de la variable contacts
C. ’Chloé’ est un attribut de la variable contacts
D. ’Chloé’ est un champ de la variable contacts
E. ’Chloé’ a été identifiée “cas contact” par le ministère de l’éducation nationale

Correction : Réponse B
Si j’étais vous je m’approcherais pas de Chloé. Bon ça fait une semaine maintenant, vous pouvez aller lui faire plein de poutoux ! Si vous voulez quand même la dm, vous lui envoyez un petit mail 😉 Bref, quesque chloé ? Nan c’est pas une personne débilos, c’est la clé de ton cœur (oof) :)) Donc grâce à la force de l’amour tu as trouvé la réponse !

Question C.4 (Pas Picasso)
Laquelle de ces listes de chaînes de caractères est triée en ordre croissant ?

Réponses
A. [’Chat’, ’Chien’, ’Cheval’, ’Cochon’] 
B. [’Chat’, ’Cheval’, ’Chien’, ’Cochon’] 
C. [’Chien’, ’Cheval’, ’Cochon’, ’Chat’] 
D. [’Cochon’, ’Chien’, ’Cheval’, ’Chat’]

Correction : Réponse B
On ne parle pas d’ordre croissant de préférence, nan nan, mais bien au niveau de la place des lettres dans l’alphabet. Étant tous des non illettrés, nous savons que O est après H, et que E avant I, donc sauf si vous lisez à l’envers, quoique très courant de nos jours, je vous propose la réponse B (en plus le chat est clairement au dessus du cheval, du chien et du cochon, c’est pas pour rien qu’il était adulé en Egypte hein).

Thème D : interactions entre l’Homme et la Machine sur le Web

Question D.1
Par quoi commence l’URL d’une page Web sécurisée ?

Réponses
A. http 
B. https 
C. ftp 
D. smtp

Correction : Réponse B
Regarde l’URL de ton site préféré (nsi.xyz evidemment), il y aura toujours “http” mais si tu veux être sur que ce site est sécurisé il y aura un “s” comme pour “sécurité_juste_pour_toi”. Tu pourras donc livrer tes informations les plus privées à Google comme tes mot de passe, tes codes de carte bleu, etc… (même si il sait déjà tout 🤫).

Question D.2
Quelle méthode d’envoi des paramètres est-il préférable d’utiliser, pour un formulaire d’une page web, destiné à demander à l’utilisateur un mot de passe pour se connecter (le protocole utilisé est HTTPS) ?

Réponses
A. la méthode PASSWORD 
B. la méthode CRYPT
C. la méthode GET 
D. la méthode POST

Correction : Réponse D
Euuuuuu alors, non ca peut pas etre un caveau souterrain servant de sépulcre, ni un mot de passe (oui vous avez vu on parle couramment anglais ici). Plus que 2 possibilités, mais seule la méthode POST vous permet d’entrer un mdp sur un site sécurisé (qui va encore sur ce genre de site mon dieuuuuu).

Question D.3
Parmi les langages suivants, lequel est exécuté sur le serveur lors de la consultation d’une page Web ?

Réponses
A. JavaScript
B. HTML 
C. CSS 
D. PHP

Correction : Réponse D
Le PHP, c’est lourd, complexe ! C’est pour cela que ce langage s’exécute côté serveur. Sinon ça serait trop complexe pour ton ordi qui a fait les 2 guerres mondiales. On laisse tous ces calculs à des supers machines de la mort qui tuent, et comme ça toi, t’es tranquille.

Question D.4
Quelle est la machine qui exécute un programme JavaScript inclus dans une page HTML ?

Réponses
A. le serveur WEB qui contient la page HTML 
B. la machine de l’utilisateur qui consulte la page HTML 
C. un serveur du réseau 
D. un routeur du réseau

Correction : Réponse B
Une fois que tu as reçu les programmes venant du serveur, alors tout se fait sur ta machine, y compris les programmes JavaScript. Au passage, une petite astuce, si sur ton site tu appelles un script JS, appelle le à la fin de ton script HTML, comme ça la page s’affiche et après calcul le Java (ce qui est donc “plus mieux” rapide).

Question D.5
Quelle est la balise HTML utilisée pour indiquer un titre de niveau d’importance maximum ?

Réponses
A. la balise <h0>
B. la balise <h1>
C. la balise <head>
D. la balise <header>

Correction : Réponse B
Bon, j’ai vraiment besoin de développer ça ?! Juste tu veux un titre en HTML, alors tu utilises <h1>.

Question D.6
Dans le code HTML les délimiteurs tels que et s’appellent ?

Réponses
A. des bornes
B. des balises
C. des paragraphes
D. des liens

Correction : Réponse Ø
Bhahahahahah là y a pas de réponse, juste tu marques que le prof a fait une erreur –oui les profs en font-, ducoup t’as un point gratos et ça fait assez plaiz surtout quand tu verras ta note (oof).

Question D.7
Parmi GET et POST, quelle méthode d’envoi de formulaire crypte les informations envoyées au serveur ?

Réponses
A. les deux : GET et POST
B. GET seulement
C. POST seulement
D. aucune des deux

Correction : Réponse D
GET et POST sont fourbes ! Ces deux méthodes sont hyper utiles, MAIS elles ne cryptent rien, ce qui n’est pas vraiment super pour nous… Mais pas le choix d’utiliser autre chose, tant pis 🤷‍♂️ (si on peut utiliser https au moins c’est crypté ! mais si on utilise get alors ça apparaît dans l’url donc pas ouf ! Le nec ++ ultra c’est donc POST + HTTPS mais bon on sait pas pour la NSA (pas encore…)).

Question D.8
Parmi les éléments suivants, lequel est un protocole ?

Réponses
A. GET
B. POST
C. HTTP
D. HTML

Correction : Réponse C
GET et POST étaient précédemment définis comme étant des méthodes, donc pourquoi ça deviendrait un protocole ???? La réponse est vraiment dans les questions précédentes, donc bon, je sais pas quoi vous dire de plus mmmmmm. HTML est un langage de balisage, tout comme LateX, plus qu’une réponse, faites par élimination (même si devant la copie j’avoue qu’on panique).

Question D.9
Pour créer un lien vers la page d’accueil de Wikipédia, que devra-t-on écrire dans une page Web ?

Réponses
A. <​a target="http://fr.wikipedia.org">Wikipédia</a>
B. ​<a href="http://fr.wikipedia.org" />
C. <​a href="http://fr.wikipedia.org">Wikipédia</a>
D. ​<link src="http://fr.wikipedia.org">Wikipédia</link>

Correction : Réponse C
OUIII WIKIPEDIA, on va encore pouvoir faire toutes nos recherches dessus (sans tricher), et c’est les profs qui nous donnent le droit donc, tout est permis !!!! Bon la si vous trouvez pas le bon vous craignez, ça on l’a vu en SNT (vous avez eu la chance de le voir ; nuance), même si oui on a rien fait dans cette matière l’année dernière, je l’admet, ON A QUAND MÊME VU LES LIENS, cherchez pas des excuses.

Thème E : Architectures matérielles et système d’exploitation

Question E.1
Identifier parmi les éléments suivants celui qui n’est pas un capteur.
A. haut-parleur 
B. caméra 
C. accéléromètre 
D. microphone

Correction : Réponse A
Essayez de crier dans un haut-parleur. Bravo vous avez cassé la membrane de la Devialet à 1500 € !! Vous avez plus qu’à prendre des écouteurs de Ryanair en les mettant dans l’enceinte pour pas que vos parents vous défoncent. Tout ça parce que vous êtes pas capables de savoir qu’un haut-parleur n’enregistre pas du son.

Question E.2
Lequel de ces objets n’est pas un périphérique ? 
A. le clavier 
B. une clé USB 
C. la carte graphique 
D. la carte mère

Correction : Réponse D
Un périphérique est un objet que tu rajoutes à ton PC, mais sans cet objet ton PC pourra toujours fonctionner. On peut faire marcher fonctionner un PC sans clavier, sans clé USB, ni carte graphique. Mais sans carte mère… c’est un peu complexe.

Question E.3
L’adresse IP du site www.education.gouv.fr est 185.75.143.24. Quel dispositif permet d’associer l’adresse IP et l’URL www.education.gouv.fr ? 
A. un routeur 
B. un serveur DNS 
C. un serveur de temps 
D. un serveur Web 
E. L’application TousAntiCovid, qui empêche également le virus de rentrer dans les écoles.

Correction : Réponse B
Tu as désormais l’adresse IP du gouvernement !! Trop bien, tu peux maintenant hacker tout le gouvernement en passant par un serveur DNS et ainsi te mettre plein de 20/20 (c fo ils ont pas eu le budget pour avoir un serveur à eux tout seul ; essayez de taper l’I.P. sur internet) ! (tu peu le fer poure moua estépé). Par contre a-t-on des retours sur l’efficacité de TousAntiCovid (aka HadopiCovid) ?!

Question E.4
L’architecture client-serveur : 
A. est un mode de communication entre programmes 
B. est une architecture matérielle de coopération entre machines 
C. est un mode de communication entre routeurs 
D. est un mode de communication entre commutateurs 
E. est le mode de fonctionnement des restaurants avant la crise sanitaire, qui sont actuellement fermés donc je ne peux pas répondre à la question car je dois respecter les gestes barrières.

Correction : Réponse A
Attention à ne pas confondre hardware et software.
L’architecture client-serveur est un mode de communication entre programmes, au même type que l’’architecture P2P. Elle ne dépend pas du hardware, mais bien du logiciel installé, qui peut être un client ou un serveur. (Corrigé par un enseignant)

Thème F : langages et programmation

Question F.1 (Ca va vite)(Attention vous avez pas le permis hein)
On considère le code suivant :
Quelle construction élémentaire peut-on identifier dans le code ci-dessus ?

if x < 4 :
	x = x + 3
else :
	x = x - 3

Réponses
A. une boucle non bornée 
B. une structure conditionnelle 
C. une boucle bornée
D. un appel de fonction
E. Un troll des cavernes
F. La réponse F.

Correction : Réponse B
Vous pouvez répéter la question ??
Fioooooooum ! Est-ce que qu’il y a besoin de tant déblatérer sur celle-là, c’est pourtant évident !

Question F.2 (Après F1 (normalement))
La fonction suivante calcule la racine carrée du double d’un nombre flottant. from math import sqrt Quelle est la précondition sur l’argument de cette fonction ?

def racine_du_double(x):
   return sqrt(2*x)

Réponses
A. x < 0 
B. x >= 0 
C. 2 * x > 0 
D. sqrt(x) >= 0

Correction : Réponse B
Ton prof de maths ne t’a jamais dit qu’une racine carré NE PEUT PAS manger de la soupe et de la pizza en même temps être négative ; une racine carrée, c’est toujours content (on garde ça pour le prochain spot de pub sur les maths) !

Question F.3
On considère le code suivant : Quelles sont les préconditions sur les arguments ?

def puiss(y,x): 
	res = y 
	for i in range(x): 
	    res = res*y 
	return res

Réponses
A. les arguments doivent être obligatoirement de type entier 
B. les arguments peuvent être de type entier ou flottant 
C. le type des arguments n’a pas d’importance 
D. il n’y a pas de préconditions dans ce cas

Correction : Réponse A
T’as déjà essayé de multiplier un nombre décimal en python ? Si oui ça marche ? Si oui dis moi comment tu fais !! Bon t’as bien compris qu’on peut pas… donc on s’assure bien que ce soit un entier avant tout.

Question F.4 (fait Alt+F4 stp)
Quelle est la valeur de la variable x à la fin de l’exécution du script suivant :

def f(x):
   x = x + 1
   return x + 1
x = 0
f(x+1)

Réponses
A. 0 
B. 1 
C. 2 
D. 3 
E. Georges

Correction : Réponse A
La variable x définie par x=0 est une variable globale qui n’a aucun rapport avec la variable locale nommé x de la fonction f. L’appel f(0+1) retourne bien la valeur 3, mais ce n’est pas la question posée. La variable globale n’a pas été modifiée, sa valeur est toujours 0. (Corrigé par un enseignant)

Question F.5(prenez un peu d’air frais)
On exécute le script suivant.

a = 11
for i in range(3):
   a = a * 2
   a = a - 10

Que contient la variable a​ ​à la fin de cette exécution ?

Réponses
A. 0 
B. 14 
C. 18 
D. 26

Correction : Réponse C
Dans le for i in range, ça veut dire que i ira pas jusqu’à 3 mais s’arrêtera à 2. Mais vous me diriez “Mon ptit bonhomme”, mais il part d’où ce A ?
Et bien c’est simple de rien, comme nous dans 3 ans sur le marché du travail. Mais rien c’est pas une valeur ?! 
Si, j’ai un indice le premier nombre arabe, le début de tout, le nombre “presque” suprême.
Et oui c’est le 0 !
Donc i va prendre les valeurs de 0, puis 1, puis 2, en faisant pendant ce temps sa mixture avec a.

Question F.6
On définit la fonction suivante :

def f(x,y):
     x = x +y
     y = x -y
     x = x -y
    return (x,y)

Quel est la valeur renvoyée par l’appel de patrick ​de chez carglass (mais non c’est Olivier de Carglass ) f(2019,2020)​ ?
Réponses
A. (2019,2019)
B. (2019,2020)
C. (2020,2019) 
D. (2020,2020)

Correction : Réponse C
OH MON DIEU DES MATHS J’AI ENVIE DE ME CREVER LES YEUX ET DE BOIRE MON SANG, bref.
La réponse est C, car elle est forcément égale à 2019 : (2020+2019)-2020 = 2019 (un vase peut y arriver, même un spé philo peut le faire).

Question F.7 (Vous avez vérifié nos fautes ?)
Un programme Python commence par la ligne : import​ os

À quoi sert cette ligne ?
Réponses
A. C’est du poulet basquaise
B. c’est la déclaration du système d’exploitation (operating system)
C. Python 3.6 exige cette ligne au début de tout programme
D. c’est la déclaration d’une bibliothèque (ou module) que le programme compte utiliserRetour ligne automatique
Correction : Réponse A
Bon la on se pose même pas la question, la nourriture est prioritaire partout. Juste le poulet c’est pas fou, on aurait pu trouver mieux hein. (os → module déclaré, pas de bouffe, dommage, un jour omega nous livrera à domicile). Donc réponse D, on verra si vous lisez toutes nos réponses de folie comme ça.

Question F.8
La fonction Python suivante ne calcule pas toujours correctement le résultat de 𝑥 𝑦 pour des arguments entiers. Parmi les tests suivants, lequel va permettre de détecter l’erreur ?

def puissance (x,y):
   p = x
   for i in range (y - 1):
      p = p * x
   return p

Réponses
A. puissance(2,0) 
B. puissance(2,1) 
C. puissance(2,2) 
D. puissance(2,10)

Correction : Réponse A
On sait bien que 20 = 1 ! Mais si on regarde le logarithme népérien de 0, on remarque que la réponse A permet avec certitude de déclarer Patrick Balkany comme prochain guest de Just Dance after the covid. (#Lourdeur)

Thème G : algorithmique

Question G.1 (meilleure classe, confirmé par près de π/3*100 de tous les rédacteurs)

Que fait la fonction suivante :

def trouver(L):
   i = 0
   for j in range(1, len(L)):
      if L[j] >= L[i]:
         i = j
   return i

Réponses
A. elle renvoie le maximum de la liste 
B. elle renvoie le minimum de la liste 
C. elle renvoie l’indice de la première occurrence du maximum de la liste 
D. elle renvoie l’indice de la dernière occurrence du maximum de la liste

Correction : Réponse D
Que nous imaginassions nous trouver dans un champ de pommes. On choisit la plus grande (je t’ai vu sourir raph), et si deux font la même taille on prend la deuxième.
Donc voilà vous savez on vire donc la A et la B car ça retourne l’indice tout ça. Ensuite on l’a dit si y en a 2 on prend la deuxième, donc c’est la réponse D. (Bon on avoue, on a un peu triché on a incanté le dieux des 1G1 et du 42 pour trouver la réponse, car c’est l’entier entre les deux extrêmes du deuxième dieu, soustrait au G du dieu de la classe :)).

Question G.2 (ahhhhh les G2 y en a qu’une qui est bien…🥰) (en effet)
On exécute le script suivant :

compt = 0
resultat = 1
while compt != 7 :
   resultat = resultat * compt
   compt = compt + 1

Laquelle de ces affirmations est vraie ?

Réponses
A. Le script ne s’arrête pas
B. Le script entre 7 fois dans la boucle et à la fin de son exécution, r​esultat ​vaut 0 
C. Le script entre 7 fois dans la boucle et à la fin de son exécution, r​esultat ​vaut 720 
D. Le script entre 6 fois dans la boucle et à la fin de son exécution, ​resultat ​vaut 0

Correction : Réponse B
Déjà quelque chose multiplié par 0, tu sais que ça fait 0 (sauf ∞ mais on parle pas de ça maintenant). Donc notre fameux “temp”, il rentre 7 fois dans la boucle parce que “while != 7” veut dire “ca rentre tant que c’est différent du chiffre 7”.
Mais bon c’est une situation temporaire comme ils disent tous au début donc on s’en fiche un peu.

Question G.3
Quelle est la valeur du couple (​ s,i)​ à la fin de l’exécution du script suivant ?

s = 0
i = 1
while i < 5:
   s = s +i
   i = i + 1

Réponses
A. (4, 5) 
B. (10, 4) 
C. (10, 5) 
D. (15, 5) 
E. (42, 5)

Correction : Réponse C
Bah là y’a rien à dire… juste c’est des maths de la logique banane / humour d’arbre !

Question G.4 (G4 Cube)
La fonction suivante doit calculer le produit de tous les éléments de la liste passée en paramètre. Avec quelles expressions doit-on la compléter pour que cette fonction soit correcte ?

def produit (L):
p = …
for elt in L:
     .......
     return p

Réponses
A. 1 puis p​ = p * elt 
B. 0 puis ​p = p * elt 
C. 1 puis p​ = elt
D. 0 puis ​p = elt
Correction : Réponse A

Un produit fois 0 c’est comme si on vous donnait 42 fois 0 PS5 (de toute façon y en a plus ils sont pas foutu d’en produire 2), donc c’est pas bon vu qu’on en veut. Donc c’est forcément 1. Il ne reste que la A et la C (à la fin il n’en restera qu’un 😁). et vu qu’on veut faire le produit de tout c’est forcément la A !

Question G.5 (The last) (but not the least)
Quelle est la valeur de e​lement ​à la fin de l’exécution du code suivant :

L = [ 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 , 0 , 2 ] 
element = L[ 0 ]
	for k in L:
	    if k > element: 
	        element = k

Réponses
A. 0 
B. 1 
C. 4 
D. 10

Correction : Réponse C
La dernière question, elle nous promet une difficulté intense, une réflexion poussée, un stress à son comble. Non c’est une liste, dur retour à la réalité, de nos actes, nos pensées, nos vies inintéressantes.
En fait on cherche juste la valeur de la liste la plus grande (toujours cette notion de plus grand, pourquoi comparer les gens c’est inutile, on est tous unique, donc comparer des gens ou même des nombres ça revient à les dégrader). Pourquoi, ici 4 serait supérieur aux autres, c’est injuste pour le 0 qui est très beau, pourquoi, pourquoi ?!!

Pour le petit bonus,

bah c’est juste 36 // 42 // 666 // 404 (logique).
On tiendrait quand même à parler de quelques succès des One More Thing :
On peut trouver un Mac que je suis le seul à trouver magnifique le Powerbook G3 aussi nommé Clamshell,

Il est pas magnifique ce PowerBook G3 Clamshell 🥰 ?

Ici vous verrez une magnifique photo de cette beauté colorée

Bon après il y a aussi des ratés commes : 
– Itunes Match (si quelqu’un connait, qu’il lève la main) 
– Face Time

Bref on espère que ça vous aura plus.
42,
Peace,
NSI

One more thing

Ce script ci-dessous est exécuté.

Vous devez déterminer les valeurs des variables quarantedeux , Quarantedeux , quaranteDeux et QuaranteDeux à la fin de l’exécution de ce script.

# déclaration des variables
wan, tu, free, fore, faiv, sɪks, seven = 7, 6, 5, 4, 3, 2, 1
quarantedeux = Quarantedeux = quaranteDeux = QuaranteDeux = 0
 
# déclaration des fonctions
 
def double(x):
    return x ** 2
 
def cube(y):
    return 2 * y
 
def carre(z):
    return z ** 3
 
# déclaration des affectations de variables
 
quaranteDeux = fore + fore * ( double( wan + faiv ) )
 
if carre(sɪks) == cube(fore):
    quarantedeux = 666
else :
    quarantedeux = 42
   
while QuaranteDeux != 42:
    QuaranteDeux += 1
   
for i in range(7):
    Quarantedeux = 6 * i

Le dernier exercice de ce sujet n’est pas corrigé ici mais plus haut hihihi.

Sachez juste que derrière une variable appelée 42 peut se cacher autre chose que 42. 😂

Conclusion

Vous pouvez réagir ici :

En particulier si les élèves auteurs de ce corrigé se sont trompés.

Le précédent corrigé : Correction du sujet n°42 de la BNS des E3C de NSI

contenait lui 2 erreurs fâcheuses 😱

NumApps

Des simulateurs web pour la NumWorks

Le logiciel de la NumWorks est sous licence Creative Commons, ce qui autorise la modification du code de la calculatrice et sa redistribution en respectant quelques règles.

Le simulateur officiel de la NumWorks

Un simulateur web construit sur du HTML, CSS et Javascript est proposé en ligne, gratuitement sur le site officiel de la calculatrice, il est présenté comme un outil idéal pour les démonstrations en classe et c’est une réalité.

  • Il est gratuit,
  • Il est accessible en ligne et hors ligne (téléchargeable gratuitement),
  • Il gère le mode plein écran pour un usage au vidéoprojecteur,
  • il est responsive et s’adapte à la taille de votre écran,
  • il gère l’enregistrement de la session et le partage de celle-ci par lien
    (cette dernière fonctionnalités n’est pas encore parfaitement stable à la date du 27 avril 2021)

En ligne : https://www.numworks.com/fr/simulateur/

Les simulateurs modifiés de la NumWorks

Nous vous proposons 3 simulateurs web légèrement modifiés de la NumWorks.

Pour un usage en ligne, nous les avons hébergé sur des sous domaines de ce site web.

Epsilon simulateurOmega simulateurPsi simulateur
epsilon.nsi.xyzomega.nsi.xyzpsi.nsi.xyz
Image modifiée par nos soins
Patché par Joachim Le Fournis
Simulateur officiel de Omega
https://getomega.dev/releases
Dérivé du projet NSIos
Gabin P. et Raphaël C.

Et parce que vous souhaitez peut-être changer d’ambiance un menu de navigation vous permet de passer de l’un des simulateurs à l’autre.

Patchs sur le simulateur epsilon

Quelques modifications ont été apportées au simulateur epsilon.nsi.xyz par rapport au simulateur officiel du constructeur de la calculatrice.

  1. L’image de la calculatrice a été modifiée pour avoir un rendu plus flat, pas parfait mais suffisant pour nous permettre de faire les captures d’écran que nous utilisons pour notre sélection NumApps.
  2. Le fond d’écran à été modifié pour la même raison.
  3. Les scripts natifs ont été effacés, il ne doivent donc pas être désactivés ou supprimés manuellement à chaque fois
  4. La taille des copiés / collés de scripts python externe à été porté à 16 ko contre environ 8 ko pour la version officielle.

Ces modifications codées par Jaochim Le Fournis nous permettent d’importer via un simple CTRL + V un script python rapidement et facilement, et ce sans se soucier des scripts python déjà présents, ni de la taille du script.

Design non flat / Design flat

Tutoriels

Découvrir les rudiments de Xcode

Découvrir les rudiments de Xcode, pour faire du développement mobile (iOS ou iPadOS), ou logiciel (MacOS, Windows…) ou juste pour le plaisir.

Si vous vous trouvez ici, c’est que vous souhaitez découvrir l’IDE Xcode, et peut être, découvrir la programmation pour iOS et MacOS !

1. Présentation générale

Mais avant toute chose, qu’est-ce-que Xcode, et plus généralement, un IDE ? 
Cet acronyme signifie simplement Integrated Development Environment, c’est à dire en bon français, un Environnement de Développement Intégré. Pour faire plus simple, c’est souvent un logiciel avec différents outils qui permettent de construire un code, pour une application par exemple plus facilement. Il nous apporte ainsi, une auto-complétion, mais aussi un débogueur performant pour aider à remarquer les erreurs ainsi qu’une ribambelle d’autres avantages propres à chaque IDERetour ligne automatique
En somme vous pouvez choisir l’IDE qui vous plaît le plus, mais cela est soumis à certaines conditions. En effet cela dépend du langage que vous voulez utiliser, des appareils destinés à ce langage, etc…

On en arrive donc à la particularité d’Xcode qui fait son attrait, et cela est tout simple, il permet de développer officiellement pour MacOS, iOS et iPadOS, car il est fourni par Apple. En effet, nous le verrons par la suite dans le tutoriel, grâce à lui, on peut essayer ses apps directement sur les appareils. (On peut programmer avec le langage d’Apple, le Swift (N.D.L.R. : C’est un langage open-source sorti en 2014, qui est utilisé sur tous les appareils Apple aujourd’hui mais qui se développe peu à peu sur le monde Linux avec les serveurs et qui dans sa dernière version 5.3, vient d’apparaître sur Windows !) avec d’autres IDE, mais on ne peut ni envoyer ses apps, ni les tester sur les appareils).Retour ligne automatique
Mais c’est aussi un IDE complet et multi-langage qui peut être utilisé pour autre chose. Alors, pourquoi s’encombrer à avoir de multiples IDE, alors que l’on peut en avoir un performant, car optimisé pour l’OS, souvent mis à jour et possédant une communauté prête à vous aider au besoin.
Si cela vous intéresse, vous trouverez ici la liste exhaustive (en anglais) des langages compatibles.

2. Installation du logiciel

Avant de commencer, sachez que le logiciel est arrivé à sa version 12 depuis novembre. Donc, les explications seront données par rapport à cette version. Il se peut que si vous avez des versions antérieures, vous n’ayez pas les mêmes outils à votre disposition. La meilleure chose à faire est donc de mettre à jour Xcode.

Rentrons maintenant dans le cœur du sujet, en commençant par son installation.
Pour ce faire, rien de plus simple, il vous suffit d’ouvrir le Mac App Store et de taper Xcode puis de le télécharger.
Une fois la longue installation des 11,666 Go terminée, vous pourrez enfin cliquer sur Ouvrir, pour entrer dans le logiciel !

3. Découverte de base du logiciel et mise en place d’un projet

Nous allons maintenant enfin plonger dans les profondeurs abyssales du logiciel et le découvrir. Son utilisation est assez intuitive, même sans forcément connaître le langage de programmation sur le bout des doigts. Néanmoins, et cela est vraiment nécessaire, il vous faudra maîtriser la langue de 007, car le logiciel est tout bonnement en anglais et n’a pas été traduit en français, mais ça va bien se passer ne vous inquiétez pas !

On comprend mieux avec un exemple. Vous allez donc suivre la réalisation d’une « mini-application » pour iPhone en Swift grâce à Xcode, et à ce qu’il apporte.

Le projet est simple, montrer à la Terre entière l’utilité du nombre 42 grâce à la phrase iconique : « 42 is the Answer to the Ultimate Question of Life, the Universe, and Everything » (ce qui est évidemment vrai).

Pour ce faire, il faut d’abord créer un projet sur Xcode. L’application étant ouverte, il vous suffit de cliquer sur Create a new Xcode project.

On arrive ensuite sur une page pop-up qui nous propose des templates(c’est à dire des « formes de projets », déjà paramétrés, avec le langage Swift), pour les différents appareils de la marque à la pomme. Tant mieux pour nous alors parce que les paramétrages plus profonds sont uniquement compréhensibles par des cupertiniens initiés.

On veut faire une App pour iOS (l’OS des iPhone) ; ces deux mots sont quasiment identiques en anglais, il suffit donc d’aller dans l’onglet iOSpuis de cliquer sur App puis Next.

Maintenant un tout nouveau pop-up s’ouvre, et ce dernier est très important pour la suite. Il vous faut donc rajouter un nom au projet (Product Name), puis juste en dessous, se trouve un lien avec marqué Team. Ce lien est très important car il permet à Xcode de reconnaître qui fait l’application, permettant la création du projet ainsi qu’un certificat. Ce dernier atteste que l’application que vous avez créée peut fonctionner, que ce soit sur votre ordinateur ou sur d’autres appareils, comme nous le verrons plus tard. Il vous suffit alors de cliquer sur Add Account, puis de vous connecter à votre compte Apple Developper (gratuit).

Si vous n’en n’avez pas, pas de panique ! Il vous suffit juste de vous connecter sur le site Apple Developper avec votre identifiant et mot de passe de votre compte Apple, puis d’accepter le contrat.

Il faut ensuite fermer la page Account qui s’est ouverte pour revenir au paramétrage de votre projet. Dans la ligne Team, vous pouvez maintenant sélectionner votre compte. La ligne en dessous est nécessaire, Organization Identifier, elle permet à Apple d’être certain que deux apps ne seront pas identiques si vous voulez les mettre sur l’App Store (Comme c’est pas le cas, notez ici ce que vous voulez). Laissez les autres choix à leur position de base, vous pourrez essayer de les modifier, mais après on risque de rentrer dans des explications beaucoup, beaucoup plus longues ! Sachez juste que le langage utilisé sera le Swift, le langage de tous les produits Apple (aussi Open-source).

Cliquez ensuite sur Next.

Dans la page suivante, vous avez la possibilité de choisir où vous souhaitez placer votre fichier, ainsi que d’activer Git ou non.

Git permet de revenir à un programme plus ancien, si jamais votre programme actuel ne fonctionne plus (certains comprendront pour l’avoir vécu que cette option est plus qu’utile, elle est nécessaire).

Cliquez ensuite sur Create, et paf, votre App apparaît !

4. Utilisation du logiciel

On arrive alors sur un écran composé de 4 panneaux principaux. Pour l’explication, vous pourrez voir les différents panneaux, numérotés de 1 à 4, sur cette capture :

  • Le premier panneau présente les différents fichiers et dossiers présents dans l’App, il vous suffit de cliquer sur un fichier pour vous y rendre, et les fichiers sont indentés pour montrer leur appartenance au dossier. D’autres icônes sont aussi présentes en haut du panneau, la deuxième permet de voir Git c’est à dire l’historique des modifications, je vous laisse découvrir les autres icônes, qui concernent plus une utilisation très poussée du logiciel.
  • Le deuxième panneau est le cœur du logiciel, c’est tout simplement ici que se trouve le code du fichier qui est ouvert. On peut aussi trouver d’autres fichiers ou dossiers, tel que le dossier qui permet de sélectionner l’icône ainsi que les images de l’App (nommé Assets.xcassets) etc…C’est ici aussi qu’on trouve une fonctionnalité intéressante et propre à tous les IDE, j’ai nommé, la fameuse auto-complétion !Pour mieux comprendre, voici un exemple :Imaginons qu’on souhaite avoir une condition si dans notre code (if en anglais). On tape donc if dans notre code à l’endroit que l’on veut, et Xcode nous propose plusieurs propositions. Il suffit donc de cliquer sur celle qui nous intéresse.

Puis, il s’occupe de mettre en place ce que l’on a sélectionné en nous laissant des zones grisées pour nous indiquer ce qu’il faut remplir, c’est à dire ici, quel doit être la condition, et qu’est-ce qui doit découler de cette condition (noté code par l’IDE).

Maintenant, imaginons, que nous voulons créer une variable qui ne peut pas être modifiée (en Swift, une variable let ne peut pas être modifiée alors qu’une variable var si). Si l’on souhaite la modifier ensuite, Xcode nous prévient de notre erreur :

Il faut alors distinguer deux types d’erreurs qu’il va nous proposer. Des erreurs, qu’on nommera pour les besoins de la science, « résolvables » ; comme l’erreur du milieu, ainsi que des erreurs « non résolvables », ou « avec conseil ». Pour le premier type d’erreurs, Xcode nous propose de changer la variable pour la rendre globale, en cliquant sur le bouton Fix. Il ne faut quand même pas cliquer inconsciemment sur ce bouton, mais vérifier si ce qu’il nous propose est bien ce que l’on veut.

L’erreur du bas, du second type, par contre, ne peut pas être résolue, il nous explique bien gentiment le problème, mais c’est à nous de faire les actions nécessaires pour le résoudre (car la modification pourrait impacter beaucoup de chose ici).

  • Le troisième panneau, permet de voir le rendu en temps réel sur le téléphone ! Nous allons suivre son fonctionnement. Pour l’activer, il vous suffit d’appuyer sur le bouton Resume, puis, au fur et à mesure que vous modifierez quelque chose (dans le code directement ou sur cet écran), il s’actualisera.Maintenant, imaginons que nous voulons ajouter cette image, au dessus de notre texte. On peut le faire tout simplement grâce à Xcode sans taper la moindre ligne de code ! Pour ce faire, il faut appuyer sur le +, au dessus du troisième panneau, puis cliquer sur le bouton de gauche, car c’est un « objet » en Swift. Ensuite on tape dans la barre de recherche là où il y a la flèche, le terme image ; ce qu’on recherche, ça va de soi.

Il suffit ensuite de prendre la partie en rouge sur la capture d’écran avec la souris/trackpad et de la glisser sur le téléphone du panneau 3, au dessus de la phrase.

En l’occurence, ici, le petit logo (très inspiré), avec un palmier, représente l’objet Image que l’on déplace et la petite ligne bleue nous indique où cet objet va se retrouver.

Si vous regardez, le code de l’image est apparu dans le deuxième panneau (le panneau de code) !

Pour mettre l’image souhaitée, il faut vous rendre dans le dossier Assets.xcassets, faire un clic droit, puis cliquer sur Image Set.

Maintenant, la page suivante apparaît :

Il faut alors glisser depuis le Finder, l’image que l’on souhaite sur le 1x, et marquer le nom qu’on souhaite donner à l’image à droite, là où se trouve la flèche.

Après être retourné au fichier de code, on peut alors rajouter le nom de notre image (qu’on a marqué dans le Assets.xcassets), dans Image (entre les guillemets). Et voilà, l’image apparaît à l’endroit où on l’avait indiqué tout à l’heure !

On peut aussi ajouter des Modifiers grâce au + au dessus du panneau 3, puis en cliquant sur le deuxième logo comme sur la capture d’écran pour ajouter des sortes d’attributs aux objets de code, comme le soulignage à l’élément choisi.

  • Le quatrième et dernier panneau est lié avec les deux précédents, en effet, à la manière d’un éditeur de texte classique du type Word, il nous permet de changer l’écriture du texte sélectionné dans le panneau 3, sa grosseur, s’il est centré etc…, de même avec les images où l’on peut modifier leur taille et d’autres attributs. Le code sera ainsi mis à jour en fonction des modifications.

Si l’on clique, toujours dans ce dernier panneau sur le  ?, on peut voir en direct une aide rapide sur le code, comme ici, après avoir sélectionné Text :

5. Compilation et test sur différents appareils

Entrons enfin dans la dernière partie de ce tutoriel, la compilation ! On va enfin pouvoir tester notre app pour voir ce qu’elle rend !

Avant toute chose, il faut savoir que pour certains langages il faut compiler, c’est à dire traduire en quelque sorte le texte d’un langage comme le Swift vers un langage moins compréhensible voir pas du tout pour nous mais qui permet d’être exécuté par la machine.

Pour commencer, il suffit de sélectionner l’appareil de votre choix au dessus du panneau 2, on va en fait avoir l’appareil virtuellement sur l’ordinateur avec notre App à l’intérieur !

Pour l’explication, ce sera l’iPhone SE 2, mais sachez que cela marchera avec tous les appareils (même les tous derniers !).

Il faut ensuite appuyer sur le bouton « Play », la compilation commence, et le téléphone apparaît dans son simulateur, tout beau tout neuf !

Vous pouvez maintenant profiter de la plupart des fonctionnalités du téléphone sans l’avoir 😉 (et tester aussi votre App, accessoirement) !

Maintenant, imaginons que l’on souhaite stocker dans une liste des valeurs de 0 à 1 000 000 000 mais que l’on ait oublié une donnée et que les valeurs ajoutées soient immenses, sur mobile, on risque alors d’avoir à faire à des problèmes, car ces derniers n’ont pas non plus des performances extraordinaires. Lors de la compilation, cliquez sur le « pschiit » (oui, ils ont choisi en logo un pschiit, en effet !) au dessus du premier panneau.

Vous pouvez alors voir l’utilisation du CPU, de la mémoire ou encore de la batterie et cliquer dessus pour plus de détail.

Si dans notre cas, on clique sur Memory, on voit que notre App utilise entre 1,7 et 1,3 Go de RAM ce qui est énorme, surtout pour un mobile !

Il ne faut donc pas se fier au fait que l’on se trouve dans la zone verte car elle est verte en proportion de la mémoire de l’ordinateur ; il faut penser que c’est pour mobile, et donc faire attention et résoudre ce problème (qui n’est pas bloquant sur le moment), dont on n’aurait pas forcément fait attention.

Maintenant et pour finir, je vous ai gardé la fonctionnalité la plus intéressante et croustillante de cet IDE, la possibilité d’envoyer directement sur un iPhone ou un iPad son App pour la tester !

C’est ce que nous allons faire. Pour cela, il faut brancher à l’ordinateur son appareil et le sélectionner dans l’endroit où l’on à sélectionné le simulateur d’iPhone tout-à-l’heure.

(Pour les besoins de l’expérimentation, j’utiliserai l’Appareil de test n°42 ; logique !)

Maintenant, il vous suffit comme tout à l’heure d’appuyer sur le bouton « Play », et Xcode va installer les fichiers nécessaires sur votre appareil. Attention vous ne pouvez réaliser cette action que 10 fois par semaine avec un compte Apple Developper gratuit.

img_9383.jpg

Une fois que l’App a été installée, il vous suffit de vous rendre sur votre appareil dans Réglages > Général > Gestion de l’appareil et d’accepter le développeur (c’est à dire vous). C’est pour cette raison qu’au début il nous fallait des certificats.

Vous pouvez alors profiter de votre App sur votre appareil !

Et voici le rendu de notre App rendant sa gloire au 42 sur notre Appareil de test n°42 !

6. Conclusion et … petits bonus !

Dorénavant, vous savez utiliser les fonctionnalités principales de Xcode sur votre Mac pour pouvoir réaliser différentes Apps et logiciels en Swift ; faites marcher votre inspiration !

Mais au début, on avait vu que Xcode était multi-langages et on n’a parlé que de Swift, c’est normal ? Oui en effet, les templates présents sont déjà paramétrés pour Swift, mais vous pouvez sans aucun soucis faire un projet vide (Empty) puis rajouter les différents fichiers de différents langages. C’est très simple ! Dans un projet déjà paramétré ou non, dans la zone du premier panneau, il faut faire clic droit, New File… puis choisir le fichier avec le langage que l’on veut !

Et même, si vous avez lu l’article très intéressant sur le Markdown, et bien vous pouvez amortir la lourde installation de Xcode, pour faire aussi du Markdown, que ce soit pour faire le fameux Lisez-Moi (README) de vos logiciels ou encore juste pour le plaisir d’écrire en Markdown grâce aux conseils fournis dans cet autre tuto !

De plus, même si on est pas sur Windows 10 sur ce super tuto je vais vous donner un petit conseil d’optimisation de Xcode. En effet il est quelque peu gourmand, et va stocker de nombreux fichiers en cache sur tous les projets. Donc si vous n’utilisez plus des projets, vous pourrez libérer le cache (sans perdre votre projet et toutes ses données évidemment), en vous rendant dans  > À propos de ce Mac > Stockage > Gérer… > Développeur, et en vidant les caches qui ne vous intéressent plus et qui peuvent parfois faire plusieurs Go.

Grâce à Xcode vous pourrez essayer les tous nouveaux iPhone, pour rêver, l’espace d’un instant que vous les possèdez tous !

Mais il n’y a pas que ça dans cet IDE, de nombreuses possibilités s’ouvrent à vous, grâce à votre inspiration, votre volonté et au 42, évidemment…

Projets

Cubito’s Adventures, un jeu en Python pour la NumWorks

Le jeu est très simple, il faut ramasser le plus de pièces possible, et pour se déplacer, il suffit d’appuyer sur les flèches de la calculatrice. Mais attention ! Si il n’y a pas de pièce en dessous de Cubito (le personnage que vous incarnez), vous tombez ! Il est impossible de remonter si on en oublie une. Heureusement, il y a des échelles pour vous aider !
Bon courage et amusez vous bien !!

Ce projet a été réalisé par des élèves en spécialité NSI du Lycée Louis Pasteur. Ils sont également les auteurs de ce compte rendu. Pour en savoir plus : Les projets en spécialité NSI

Lien court vers ce document : https://nsi.xyz/cubito

On a tous espéré un jour pouvoir jouer sur sa calculatrice !
C’est pourquoi nous vous présentons le jeu « Cubito’s Adventures » !

Recherche d’idées et présentation du projet

Lorsque nos profs nous ont dit qu’il fallait faire un programme en Python qui tourne sur la NumWorks, on a tout de suite pensé à un petit jeu avec la surcouche graphique de la NumWorks, Kandinsky.
On voulait partir sur un jeu, oui, mais lequel ? Après être passés par une reprise du jeu Rogue sorti en 1980, ou par un Space Invaders comme en 1978, nous sommes finalement partis sur une tout autre idée, et Cubito est né !
Nous nous sommes lancés dans ce projet avec empressement.
Il consiste en un jeu sur la NumWorks avec différents niveaux.
Chaque niveau s’articule particulièrement autour de 4 paramètres que vous pouvez voir dans la capture d’écran ci-contre :

Le jeu Cubito’s Adventures sur NumWorks
  • Le personnage principal, Cubito (carré jaune),
  • L’arrivée (carré bleu),
  • Les pièces (points blancs),
  • L’échelle (rectangle blanc)

Pour gérer chaque niveau, des variables sont actualisées à chaque fois dans la barre du bas, il s’agit du score, ainsi que du niveau.
L’objectif du jeu est d’atteindre l’arrivée en ayant le plus gros score. 
Le choix des couleurs devrait certainement vous rappeler le jeu Pac-Man sorti en 1980 et dont nous nous sommes quelque peu inspiré.

Outils à notre disposition et problèmes rencontrés

On avait hâte oui, mais on n’avait pas de moyens pour tester notre programme autrement que de l’envoyer sur la NumWorks à chaque fois, ce qui est très long !!
Deux possibilités s’ouvraient alors à nous :
Nous pouvions utiliser le Workshop NumWorks, le site officiel de NumWorks qui nous permettait de tester notre programme plus simplement et en ligne mais, le site n’était pas très intuitif et nos professeurs nous ont conseillé d’utiliser Omega IDE, pour avancer plus facilement.
On s’est donc servi de l’IDE en ligne Omega IDE, issu de l’OS alternatif pour la calculatrice du même nom. (Un IDE, de l’anglais « integrated development environment  », est un logiciel en ligne ou non qui intègre toutes les fonctionnalités utiles pour pouvoir développer sur un langage et un produit (ici en l’occurrence Python et sur la NumWorks).)
Omega IDE nous permet un aperçu du rendu sur calculatrice ainsi que l’enregistrement automatique de notre code sur GitHub (plateforme de partage de codes et programmes).
Mais tout ne pouvait pas être parfait. En effet, ce site étant en version alpha (pas vraiment sorti) certains bugs pouvaient être présents dont certains particulièrement embêtant auxquels nous avons eu affaire. 
En effet, si l’on testait notre programme une fois puis qu’on le re testait une seconde fois (même 10 min plus tard) les deux programmes se mélangeaient ce qui rendait le test quasi impossible et nous obligeait à rafraîchir à chaque fois la page web. Nous avons donc dû faire avec !

Un programme bien « carré »

Quand nous avons commencé notre programme, nous avons utilisé le code de l’agent 42, pour les déplacements.

Nous avions déjà réalisé un programme qui permettait les déplacements mais nous ne maîtrisions pas tout le savoir nécessaire sur le module Kandinksy au départ pour pouvoir réaliser ces déplacements.
Grâce à l’abandon de cette partie du programme, nous connaissions déjà les bases du module graphique ce qui nous a permis de mieux avancer dans notre travail par la suite.

Ce qui nous a bien aidé, c’est que dès le début, nous avons tout écrit et définit par des fonctions. Des fonctions pour chaque détails du code. Par exemple une fonction pour se déplacer, une pour la fin des niveaux etc…
Notre jeu était alors beaucoup plus facile à mettre en place, par de simples boucles comme vous pouvez ici le voir grâce à un extrait de notre fonction jeu.

def jeu():
    global niveau
    while niveau!=6:
        fill_rect(0,0,320,222,no)
        sleep(2)
        partie()
#[...]

Avec la boucle while qui teste la valeur de la variable niveau, on peut après une incrémentation (un ajout) de 1 à la variable niveau, appeler à chaque fois la fonction partie qui va à son tour appeler les déplacements, et l’initialisation de l’écran pour le niveau en question.

Évidemment, comme une bonne nouvelle n’arrive jamais seule, on a eu une petite complication car il fallait appeler chaque fonction, oui, mais par ordre d’appel très précis sinon cela ne fonctionne pas !

Notre programme a été centré sur la position des différents objets dans chaque niveau et l’interaction de Cubito avec les autres « objets ».

Un de nos plus grands problèmes dès le début était de faire en sorte que Cubito ne puisse pas sortir de l’écran de la calculatrice ! Il fallait définir le point le plus en haut à gauche et le point le plus en bas à droite, dans lequel le personnage pouvait se déplacer. Au bout de quelques heures (et beaucoup d’échecs), il fallait juste définir la « bordure » qui avait déjà été mise en place (pas avec les mêmes valeurs) par notre agent :

bordure = [0,0,190,310] #x min, y min, y max, x max

Le premier 0 est donc l’abscisse minimale de Cubito, 310 l’abscisse maximale, le deuxième 0 l’ordonnée minimale et 190l’ordonnée maximale.

Voyons maintenant un point central du jeu, la génération des pièces.

#[...]
def initiation(): #Génère les pièces
    fill_rect(0,0,320,222,no)
    for j in range(5,222,10):
        for i in range(5,320,10):
            set_pixel(i,j,bl)
#[...]

Cette fonction va donc au fur et à mesure créer une variable j, correspondant à l’ordonnée ainsi qu’une variable i, correspondant à l’abscisse, en partant de 5 à chaque fois. Puis au fur et à mesure, à chaque avancée, elle va allumer un pixel en blanc (le set_pixel). Pour le for j et i in range, le premier nombre correspond à la valeur de départ, 5 pour qu’à chaque déplacement, la pièce soit au centre de Cubito. Le deuxième nombre est la valeur maximale, car l’écran de la calculatrice est en 320 par 222. Enfin la troisième valeur correspond au « pas », c’est à dire l’avancée à chaque fois.

Pour les déplacements, voici un extrait de la fonction move :

#[...]
def move():
     if keydown(0): #gauche
            mvt[0] = max(position[0]-10, bordure[0])
            is_key_pressed = True
#[...]

Dans cette portion de code (pour aller à gauche), on dit à Cubito de se déplacer de -10 sur l’axe des abscisses. Mais comme notre personnage est un bloc de 10×10, alors il se déplace de 10 pixels par 10 pixels ; en fait il se décale d’une case ! Sans oublier qu’il laisse derrière lui une case noire pour effacer sa dernière position. Comme le fond est noir aussi, on a l’impression qu’il a disparu de son ancienne positon. C’est là toute l’illusion des déplacements !!

Un menu pour notre jeu

Nous avons voulu mettre en place un menu pour notre jeu.
Pour ne pas prendre trop de place dans le poids total du jeu, il n’est que partiellement interactif comme vous pouvez le voir dans la capture d’écran ci-dessous.

def menu():
    #[...]
    while not keydown(5):
        if keydown(4) or keydown(17):
            jeu()
#[...]

Pour afficher ce menu, nous avons juste affiché le texte à l’aide de draw_string.
Pour tout ce qui est interaction avec le joueur, c’est à dire commencer la partie, voici un extrait de code de la fonction menu :

Un problème coloré mais heureusement résolu !

Nous avons néanmoins rencontré durant ce projet, un problème épineux.
En effet, nous avions besoin d’utiliser la fonction get_pixel issue de Kandinsky qui permet de vérifier la couleur d’un pixel donné.
Ainsi, dans l’exemple ci-dessous :

Nous avons néanmoins rencontré durant ce projet, un problème épineux.
En effet, nous avions besoin d’utiliser la fonction get_pixel issue de Kandinsky qui permet de vérifier la couleur d’un pixel donné.
Ainsi, dans l’exemple ci-dessous :

Le programme trace un carré de 10 par 10 aux coordonnées (120 ; 120) et de couleur noire, soit (0,0,0) en RGB (rouge, vert, bleu), la méthode utilisée par la NumWorks pour les couleurs.

La ligne de code :

couleur_carre=get_pixel(120,120)

retournait comme valeur de la variable couleur_carre : (0,0,0).

Néanmoins, si on inversait les couleurs et que le cube était blanc sur un fond noir, le get_pixel ne retournait pas la couleur RGB du blanc : (255,255,255) mais une autre valeur incompréhensible pour nous, (248,252,248).
Après avoir demandé de l’aide à notre agent ainsi qu’aux développeurs d’Omega OS, car nous craignions que ce soit une erreur de notre part, nous avons appris que la calculatrice arrondissait le rouge tous les 8, le vert tous les 4 et le bleu tous les 8. Ce qui veut dire que les couleurs RGB rendues par le get_pixel avançaient de 8 en 8 pour le rouge, de 4 en 4 pour le vert et de 8 en 8 pour le bleu. Cette organisation complexe, nous a semblé plus claire grâce au programme fourni par notre professeur et montrant pour chaque couleur, ce qui ressortait au get_pixel.

Une fois ce souci réglé, nous pouvions enfin mettre en place les chutes et l’échelle !

Le fonctionnement des chutes peut paraître contre-intuitif au premier abord même s’il est tout à fait fonctionnel.
En effet, Cubito chute si en dessous de lui, il n’y a pas une pièce (par exemple s’il l’a déjà ramassée). 
Voici une portion de notre fonction vide qui réalise ceci :

def vide():
    global position, mvt, score, niveau
    while get_pixel(position[0]+5,position[1]+15)!=(248,252,248) and position[1]!=190:
        personnage(0)
        position[0]=position[0]
        position[1]+=10
        mvt[1]=position[1]
        score-=1
        personnage(1)
        sleep(1)
#[...]

Pour vérifier si il y a une pièce en dessous, on utilise le get_pixel que nous avons vu précédemment à la différence qu’on connait la valeur qu’il doit retourner : (248,252,248). 
Nous avons choisi d’utiliser une boucle, ce qui permet de vérifier que tant que la case au dessous n’a pas de pièce, le personnage continue de tomber, ce qui est permis par l’opérateur != (lire : « différent de »). La chute peut continuer jusqu’à arriver à la position maximale de Cubito en ordonnée : 190, sans quoi il irait sur les variables se trouvant dans la barre du bas.
On n’a donc plus qu’à ajouter 10 à l’ordonnée du personnage, à effacer son ancienne position et à créer la nouvelle à chaque tour de boucle.
Petite difficulté supplémentaire : les coordonnées de Cubito sont calculées à partir de son point le plus en haut à gauche, et les pièces sont placées de 10 en 10 mais en partant de 5.
Il faut donc pour savoir si une pièce en dessous de Cubito est présente ou non, faire le get_pixel aux coordonnées de l’abscisse de Cubito + 5 et de l’ordonnée de Cubito + 15 !

Ce get_pixel nous a aussi servi pour l’échelle comme vous pouvez le voir dans le code suivant :

#[...]
if get_pixel(position[0]+4,position[1]-39)==(248,252,248):
        personnage(0)
        position[1]-=longueur_scale+10
        position[0]=position[0]
        mvt[1]=position[1]
        personnage(1)
#[...]

En effet, au début nous avons voulu que l’échelle puisse faire monter le joueur de 40 (-40 car le point 0 est en haut), peut importe où nous étions sur l’échelle.
Mais quand l’échelle était trop proche du haut, Cubito sortait des limites du jeu.
Nous avons donc décidé que l’échelle ne pourrait être prise que du bas et ferait monter jusqu’en haut de cette dernière.
Ainsi pour vérifier que Cubito est bien tout en bas de l’échelle, qui a une longueur définie de 40, nous regardons le 39ème pixel au dessus de Cubito pour voir s’il est blanc. Si c’est le cas, le personnage se retrouve en haut de l’échelle.
Mais pourquoi le 39ème pixel et pas le 40ème, si l’échelle fait 40 de longueur ?
Tout simplement pour éviter de confondre avec une pièce, car pièce et échelle ont la même couleur !

Conclusion

Pour conclure, ce projet était ambitieux, c’était pas toujours facile, on a connu quelques tracas. 
Mais avec de la persévérance et l’aide de nos professeurs, nous avons réussi à créer un jeu qui nous satisfait réellement ! Ce challenge fut très enrichissant pour nous ! Le fait de se dire qu’en Première on a créé de toute pièce un jeu vidéo graphique alors qu’en troisième on n’avait jamais entendu parler de Python nous rend très fiers !

Et pour finir il y a pas un truc à se mettre sous la dent ?
Et bien si, un easter egg, et plus précisément un niveau unique est présent dans le jeu !!!
#[…]
Essayez de le trouver !

COMMENT TÉLÉCHARGER CE JEU POUR Y JOUER SUR MA CALCULATRICE ?

Vous trouverez dans le tableau ci-dessous les différents liens, mis à jour en fonction des évolutions du jeu, pour vous permettre de le télécharger !

ServeurWorkshop NumWorksTi-Planetnsi.xyz
Comment utiliser le codeBrancher sa calculatrice en USB et envoyer le codeTélécharger le code puis l’envoyer sur la NumWorks en passant par Omega IDE (si vous avez Omega OS)Idem
Lien URLCubito’s Adventures WorkshopCubito’s Adventures Ti-PlanetCubito’s Adventures (zip)

PS : Si la programmation sur calculatrice vous intéresse ou que vous voulez voir comment ça marche sur NumWorks, n’hésitez pas à lire : « Programmer en python et porter son code sur la NumWorks » qui vous donnera de précieux conseils pour y arriver !
Vous verrez c’est très plaisant de voir son programme avancer au fur et à mesure !!!

Découvrir

La programmation en spé NSI

En spécialité NSI, on étudie principalement le langage de programmation Python, dans lequel on écrit les algorithmes traité en classe, ainsi que le langage SQL qui permet d’interroger une base de donnée.
Les projets réalisés par les élèves leurs permettent de découvrir et de s’amuser avec du HTML, du CSS, du JavaScript.
La découverte des systèmes d’exploitations est l’occasion de s’initier au BASH.

A noter :

L’expertise dans tel ou tel langage de programmation n’est cependant pas un objectif de formation, en spécialité NSI on découvre des langages, chacun est libre d’approfondir ces connaissances lors de la réalisations des projets.

Les différents langages découverts ou approfondis

Python

Un langage de programmation est nécessaire pour l’écriture des programmes.
Les lycées français ont choisis le langage Python, qui est à la fois simple d’usage, interprété, concis, libre et gratuit, multiplateforme et largement répandu.

# Python 3
print("Hello NSI !")

HTML

Aujourd’hui, de plus en plus de nos actions se passent par le Web, qui est aux centres de nos vies. Il faut donc pour cela expliquer aux spécialités NSI, son organisation, ses complexités, et à commencer par l’HTML. Ce n’est pas vraiment un langage, car il fait le lien entre plusieurs langages, mais il est l’élément central pour le fonctionnement des pages Web comme celle que vous êtes en train de regarder.

<strike class="physique">La Physique c'est bien</strike>
<h1 id="nsi">La NSI c'est super</h1>

CSS

Nous retrouvons donc le CSS qui va de pair avec le HTML, si ce dernier est l’élément central, sans le CSS, le Web ressemblerait à la première page Web. C’est donc ce qui permet de donner un petit peu de style au Web, pour le rendre plus attrayant.

#nsi {
  color : purple;
}
.physique {
  background-color: black;
}

JavaScript

Le JavaScript est aussi un des éléments clés du fonctionnement du Web que nous aborderons en spécialité NSI. Il permet de faire fonctionner certains éléments de façon dynamique, comme un menu, mais aussi certaines interactions avec l’utilisateur comme sur notre portail des élèves et a aussi bien d’autres avantages, que vous pourrez découvrir dans le cadre des projets en spé NSI.

//let nsi;
//nsi = "En classe de première, je choisis la spécialité NSI";
window.alert("En classe de première, je choisis la spécialité NSI");

SQL

Le SQL permet de traiter simplement d’immenses bases de données, de les classifier, les regrouper, etc… Il est extrêmement puissant tout en étant d’une simplicité déconcertante, et permet à nos élèves, de mettre un pied dans le monde des bases de données immenses, ou la moindre recherche manuelle serait un parcours du combattant.

SELECT *
FROM nsi

BASH

Le BASH, c’est magique, peu de personnes vous le diront car elles n’ont pas l’occasion de l’utiliser au quotidien et de découvrir sa praticité. Mais c’est quoi au fait ? C’est tout simplement la langue du terminal, vous savez cette fenêtre noire et peu rassurante qui s’ouvre de temps en temps. Nos élèves découvrent donc cette interface au travers du monde incroyable de Linux/GNU, à travers un petit jeu interactif en ligne : Terminus

mkdir nsi
cd nsi
sudo apt-get install reussite
./reussiteNSI.elf

Les autres fondamentaux en spé NSI

De la même manière qu’un élève étudiant la spécialité Physique au lycée ne sera pas obligatoirement en charge de piloter une centrale nucléaire, les élèves étudiant la spécialité NSI ne seront pas tous développeurs informatique, et ne feront peut-être même pas un métier lié à l’informatique. Cette spécialité est ouverte à tous, filles comme garçons, intéressés de découvrir le fonctionnement des outils qui nous entourent de plus en plus, et désireux d’acquérir des compétences pour le futur.

La spécialité NSI est l’occasion de découvrir une nouvelle science, appelée informatique.
Les concepts fondamentaux étudiés en spécialité NSI vont bien au delà de la simple conception de programme, ils permettent de rentrer et de découvrir ce monde fabuleux que sont les sciences informatiques.