Author: Raphael C.

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 :

Tutoriels

Comment créer de FAUX virus

Les virus que je présente ici sont totalement inoffensifs. Cependant, ils sont à faire (et peuvent être envoyé) seulement pour vous, ou maximum, pour des proches ! Vous devez connaître la personne qui exécute ce virus pour l’aider si elle n’arrive pas à l’arrêter. Merci bien.

Maintenant que cela est dit, on va pouvoir attaquer. Mais dans un premier temps, de quoi je parle quand je dis un « faux virus » ?

 

1. Qu’est-ce qu’un « faux virus » ?

Un faux virus est, selon moi, un exécutable qui correspond à toutes les caractéristiques d’un réel virus. Donc avec le fait qu’un code exécute des tâches tout seul comme un grand. Mais les faux virus ont la réputation d’être un peu plus sympa 🙂 en effet, ils ne feront rien de grave à votre PC. Ils ne sont souvent qu’une simple boucle infinie pour embêter les collègues. De plus, contrairement aux virus plus « classiques », ces faux virus sont généralement en fichier .bat ou .vbs !

 

2. Les outils nécessaires

C’est virus en .bat ou .vbs ne fonctionneront que sur le système d’exploitation le plus critiqué, mais le plus utilisé, j’ai nommé : Windows.

Comme il y a de très fortes chances que vous soyez sur Windows ou que votre victime (ami) le soit aussi, il vous faut bien un logiciel pour coder ces virus… pour cela, on va utiliser l’IDE le plus difficile de ces 15 dernières années : le bloc note ! On ne va pas s’embêter à télécharger VS Code ou même Fleeet pour ça.

 

3. Coder

        a. Avant de coder

Enfin, on ne va pas coder de suite, on va faire comme si vous n’avez jamais utilisé d’ordinateur de votre vie et que vous pensez qu’une souris ne peut être qu’un animal.

Donc, après avoir allumé votre PC (tuto ici) (ou ici s’il a été en contact avec de l’eau) plusieurs choix s’offrent à vous, je vais en montrer deux. Soit vous faites un Clic Droit sur votre Bureau > Nouveau > Document Texte

Ou alors, si vraiment vous avez la flemme de faire 3 clics, vous pouvez cliquer sûr Rechercher puis écrire « Bloc-notes » (même si « blo » suffit) puis appuyer sur la touche Entrée.

 

 

 

 

 

 

 

 

 

 

 

Magnifique ! Vous avez ouvert un Bloc-notes ! On va pouvoir attaquer les choses sérieuses. Maintenant que cela est fait, on peut s’attaquer au vrai code !

 

        b. Les codes en .bat

Commençant gentiment, ce premier « virus » va simplement lancer un cmd afin d’afficher du texte (+ d’autres choses si vous le voulez). Dans le fichier texte vous pouvez copier coller ce code :

mode CON: COLS=700
color 4
@echo off
echo -----------------------------------------------------------------------------------------------------------
echo VOUS AVEZ UN VIRUS
echo CE VIRUS SE PROPAGERA DANS TOUT VOS FICHIERS DANS 10 SECONDES, BON COURAGE (ps : c'est une blague)
                                                                                          
echo                                         -:+osyyhhhhhyyo+:.                                         
echo                                     -odNMMMMMMMMMMMMMMMMMMNh+-                                     
echo                                   :hMMMMMMMMMMMMMMMMMMMMMMMMMMmo.                                  
echo                                 -hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy-                                
echo                               :hNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy.                              
echo                             :dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm/                             
echo                            /NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMo                            
echo                           .NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM/                           
echo                           oMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN.                          
echo                           hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM+                          
echo                           dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMo                          
echo                           hMMd-+ydNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmhs+/hMM+                          
echo                           sMMs   `-+hmMMMMMMMMMMMMMMMMMMMMMMMds:.`   sMM.                          
echo                           :MMh       ./ymMMMMMMMMMMMMMMMMMmy:`       dMd                           
echo                           `NMM/         ./sdNMMMMMMMMMNds/.         +MM+                           
echo                            oMMN+.          `.:odMMMdo:.`          .+NMN`                           
echo                             +NMMNdyo/:--...-:+ymdmmmy+:-...--:+oydmMMMo                            
echo                              :mMMMMMMMMNNNNNMMMs`h`sMMMNNNNNMMMMMMMMMM`                            
echo                             `ymMMMMMMMMMMMMMMMy``d``yMMMMMMMMMMMMMMMMm`                            
echo                             .MMMMMMMMMNmdNMMMN.`hMy`.NMMMMMMNmdmNMMMMM+                            
echo                             /MMMMMMNy/.``dMMMMdoMMM+dMMMMMM+-```-NMMMm.                            
echo                            `sNMmmd/.    hMMMMMMMMMMMMMMMMM:    -mNd+`                             
echo                               -/. -/-    mMMMmMMMmNMN+sNMMN`    `--                                
echo                                          /MMN-MMM:hMm mMMN+                                        
echo                                          `MMM:MMM/dMN.MMMy                                         
echo                                           NMM/MMM/mMN-MMMo                                         
echo                                           mMM/MMM/mMN:MMM+                                         
echo                                           dMM/NMM/NMN/MMM/                                         
echo                                           hMM/mMM/NMN+MMM-                                         
echo                                           yMM/dMM:NMm+MMM.                                         
echo                                           oMM:hMM-NMh+MMN                                          
echo                                           /MM:yMM`mMo+MMd                                          
echo                                            -+`+hy sd.-ys:                                          

timeout 10
cd..
dir /s
pause 10

(Le « /s » est facultatif, car il affichera TOUS les fichiers de l’ordinateur ! C’est donc trèèèèèès long et non-nécessaire.)

Il va falloir faire en sorte que ce fichier .txt devienne un fichier .bat, pour cela : soit vous effectuez le raccourci clavier Ctrl+Maj+S ou vous le faites à l’ancienne : Fichier > Enregistrer sous…

 

 

 

 

  

Il vous suffit de sélectionner l’emplacement d’où placer votre fichier (je vous conseil le bureau, c’est plus pratique), de le renommer comme vous voulez, mais de ne surtout pas oublier le .bat à la fin ! Sinon ça ne marchera pas. Plus qu’à enregistrer. Un nouveau icône apparaîtra, et voilà votre petit faux virus.

 

 

 

 

 

 

 

 

 

 

 

Je vous laisse faire pour l’exécuter (il suffit de double-cliquer) pour voir le résultat.

 

Ce premier virus affiche seulement du texte (ce qui est beaucoup trop gentil). On va s’attaquer à un virus tout aussi inoffensif, mais qui va pouvoir exécuter un logiciel bien pratique, la calculatrice ! Pour ça, créer un nouveau fichier texte et copier coller ce code :

@echo off
:main
start sol.exe
start calc.exe
goto :main

Vous pouvez de nouveau enregistrer ce fichier comme le précédent, mais toujours sans oublier le .bat à la fin (et avec un autre nom, c’est mieux).

Si vous lisez un peu ce code, vous avez peut-être compris que ce fichier .bat va lancer en boucle des calculatrices et ça même quand on fermera le message d’erreur. Il va bien falloir faire en sorte que cette exécution cesse ?! Pour ça, il va falloir ouvrir le Gestionnaire de tâches. Soit vous effectuer le raccourci clavier Ctrl+Maj+Echap. Ou vous faites un Clic Droit sur la barre des tâches et sélectionner Gestionnaire des tâches (3ème ligne en partant du bas). Il reste plus qu’à faire un Clic Gauche sur Interpréteur de Commande Windows et de cliquer sur Fin de tâche. Les calculatrices ne se lanceront plus désormais !

Résultat du virus, à chaque clic de « OK » ou de « X » une nouvelle calculatrice va apparaître.

Vous venez de créer 2 fichiers .bat, un qui affiche du texte, l’autre qui exécute un logiciel ! Vous êtes de vrai petit chef, mais justement, on va continuer avec les fichiers en .vbs !

 

        c. Les codes en .vbs

Que ce soit un fichier en .bat ou .vbs, c’est la même chose pour les créer ! La seule différence est lors de l’enregistrement, il ne faut pas oublier de remplacer le .txt en .vbs (et plus .bat).

On va commencer gentiment en créant un texte infini. Encore une fois, il suffit de coller ce code dans un bloc-notes et de l’enregistrer :

do
msgbox "Salut"
msgbox "Je suis en NSI"
msgbox "42, la grande question sur la vie, l'univers et le reste"
loop

Évidemment, vous pouvez modifier le texte que vous voulez afficher. Mais c’est important de ne pas mettre d’espace entre le texte et les guillemets. Il suffit de l’enregistrer (en .vbs), de lancer, et pour l’arrêter, il faut retourner dans les Gestionnaire de tâches pour mettre fin à cette tâche.

 

 

 

 

 

 

 

 

 

 

On va finir avec du lourd. Ce dernier virus se lance sans laisser de trace visible, pas de fenêtre qui s’affiche 🙂 ce fichier en .vbs va jouer une musique (que vous déciderez) et lira un texte (la aussi au choix) !! Vous pouvez même le combiner au premier faux virus (vous faites ce que vous voulez, vous êtes grand quand même).

On va commencer par mettre une musique dans le même dossier que 2 fichiers texte. Pour que ce soit plus facile, on la renomme : musique.mp3. Dans mon cas, c’est un remix entre une alarme nucléaire et la musique du Rick Roll ! (pour ne pas oublier que c’est une blague). Dans le premier fichier texte (que l’on nommera « text.txt »), on écrit le texte que l’on veut, une voix va lire tout ce que vous avez écrit ! Dans mon cas, ce sera une fable de La Fontaine. Puis, pour le second fichier texte, on peut copier coller ce code avant de l’enregistrer en fichier .vbs !

Set WshShell = CreateObject("WScript.Shell")
repertoire = WshShell.CurrentDirectory
CreateObject("Wscript.Shell").Run "wmplayer /play /close """ & repertoire & "\musique.mp3""", 0, False

Dim speaks, speech
Set speech = CreateObject("sapi.spvoice")
Dim oFso, f
set oFso = CreateObject("Scripting.FileSystemObject")
set f = oFso.OpenTextFile("text.txt", 1)
while Not f.AtEndOfStream
	speech.Speak f.ReadLine
Wend
f.Close

Et voilà ! Si vous l’exécutez, la musique se joue, et le texte se lit !

 

 

Un petit bonus…

En voyant la tête des logos des fichiers .bat ou .vbs, on n’a clairement pas envie de cliquer dessus. Mais si on pouvait justement changer cela ?? 🤔🤫 pour remédier à ce petit problème, on va prendre le chemin de l’icône de Google Chrome par exemple. Faites un Clic Droit sur Chrome > Propriétés > Ctrl+C (on copie le chemin (en bleu)).

Ensuite, on créer un raccourci du (par exemple) 4ème virus. Il faut faire un Clic Droit > Créer un raccourci, qu’on peut renommer Google Chrome.

Il reste seulement à aller dans les Propriétés du raccourci, de cliquer sur Changer d’icône, de coller le chemin de l’icône de Chrome, d’appuyer sur Entrée, de cliquer sur OK et Appliquer avant de quitter.

Votre faux virus donne maintenant un peu plus envie de cliquer dessus ! 😉

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

Comment optimiser Windows 10 ?

Ce tutoriel a été entièrement rédigé par un élève en spécialité NSI au Lycée Louis Pasteur. Pour en savoir plus : Les tutoriels en spécialité NSI 

 

On est d’accord, Windows (et plus particulièrement Windows 10) est le système d’exploitation le plus claqué au sol, le moins bien optimisé. Je vais donc te montrer comment optimiser Windows 10 sans logiciel ! Tu vas voir c’est assez simple, on va juste utiliser les paramètres. Et on ira du plus facile au plus extrême.

 

1. Des petites tâches très simples

A. Effacer les icônes

On va commencer très gentiment. Comme par exemple : supprimer les icônes sur ton bureau. Calculer et afficher chaque icône demande des ressources au démarrage, mais aussi à chaque retour Windows. Pour éviter ça, soit tu supprimes quelques icônes (comme celles que tu utilises le moins). Ou alors, sur ton bureau tu fais : Clic droit, « Affichage », « Afficher les éléments du Bureau » (pareil pour les réafficher).

B. Vider la corbeille

On va aussi supprimer pleins de fichiers qui restent sur ton ordi, et qui (encore une fois) peuvent le ralentir. Tout d’abord tu peux vider la corbeille. Pour ça, fais un Clic droit sur la corbeille, puis sur « Vider la corbeille ».

C. Supprimer les fichiers temporaires

On va aller un peu plus loin ! Sur ton clavier appuie sur la touche « Windows » + r, une fenêtre s’ouvrira en bas à gauche. Tu peux alors écrire « temp » puis sur la touche « Entrée » de ton clavier. Tous les fichiers que tu vas voir sont des fichiers temporaires, mais qui restent pour toujours (logique Windows). Ça peut être des diagnostics de bug, des erreurs, etc… tu peux donc supprimer tous ces fichiers (sauf quelques-uns que tu ne pourras pas supprimer). Pour ça, appuie sur les touches « Ctrl » + a de ton clavier pour tout sélectionner, puis sur la touche « Suppr » pour les mettre à la poubelle. Cette étape est la même en entrant « %temp% » et « prefetch » dans la fenêtre de Windows + r.

 

 

2. Jouons dans les paramètres

Il se peut que tu ne saches même pas comment lancer la fenêtre des paramètres Windows. C’est le début, c’est normal. Dans un premier temps, clique sur le logo Windows en bas à gauche. Puis clique sur l’engrenage (2ème en partant du bas).

A. Les mises à jour

Et oui ! c’est tout simple mais c’est la raison numéro 1 des latences de ton ordi. Pour voir si ta machine est à jour, clique sur l’onglet « Mise à jour et sécurité ». Puis il te suffit de cliquer sur « Rechercher des mises à jour ». En bonus, dans l’onglet « Optimisation de la distribution », je te conseille de désactiver les « Téléchargements à partir d’autres PC ». Cela te fera gagner de la rapidité et du débit internet, car ton PC va arrêter d’envoyer des éléments à d’autres PC. en effet, cette option n’est intéressante que pour un administrateur de réseau (ayant donc plusieurs pc), pour les gérer plus facilement.

B. Système

Comme vu précédemment, plus on a d’espace de stockage, plus le PC se comportera mieux. On va approfondir ce nettoyage. Pour ça, de retour dans les paramètres, clique sur l’onglet « Système ». Puis dans « Stockage », active « L’assistant de stockage ». Enfin, clique sur « L’exécuter maintenant » et vérifie qu’il soit bien activé « Chaque mois ». Tu peux ensuite mettre les durées que tu préfères. Pour nettoyer le disque directement, sélectionne « Nettoyer maintenant ».

C. Confidentialité

Windows veut tout savoir sur toi. Et pour arriver à ses fins, il va te demander plein d’informations personnelles en arrière-plan (sans que tu le saches sinon ce n’est pas drôle). Et comme tu t’en doutes, ça rend Windows très instable en plus de ne pas protéger ta vie privée ! Pour désactiver tout ça, et retrouver une vie paisible : clique sur l’onglet « Confidentialité » dans les paramètres, dans « Général » tu peux désactiver les 4 (ou le premier et le dernier comme moi, car ils prennent le plus de ressources). Dans « Diagnostics et commentaires », tu désactives tout. Dans « Diagnostics de l’application », encore une fois tu désactives. Puis dans « Historique des activités », tu peux décocher les 2 cases. Pour finir, dans « Applications en arrière-plan », tu peux tout désactiver, sauf Windows Defender/Sécurité Windows, et Office (si tu as une licence), ainsi, Plus 1 ou 2 applications si tu le souhaites.

D. Jeux

Beaucoup de gens se disent « Un mode jeux ?! Super ça doit booster mon jeu ! » NON ! Déjà en jeu, les performances sont les mêmes avec ce mode activer ou non, mais surtout, en bureautique, Windows va être à l’affût pour savoir quand tu vas vouloir l’activer. Donc encore un programme qui tourne pour rien. Pour arrêter ce programme, dans l’onglet « Jeux » des paramètres, puis dans « Xbox Game Bar » tu désactives la barre d’éléments. Si tu joues à la manette, tu peux donc, aussi décocher la case.

E. Applications

Il y a pleins d’applications sur ton ordi que tu n’utilises pas. Même si tu penses le contraire, tu joues vraiment au solitaire de Microsoft ?! Pour libérer de l’espace de stockage et quelques performances, on va désinstaller tout ça. Dans mon cas, je vais désinstaller Mozilla Firefox. Pour ce faire, dans les paramètres, clique sur l’onglet « Applications », clique sur l’application que tu veux supprimer, puis sur « Désinstaller ». Il te suffira de confirmer.

Bravo ! T’en as fini dans les paramètres. Mais ce n’est pas fini 🙂

On va attaquer le niveau au-dessus ! Tu l’as donc compris, ça sera un peu plus complexe, mais c’est là où tu gagneras le plus de performances.

 

3. Des paramètres plus … avancés

A. Supprimer les fichiers inutiles cachés

Encore une fois, on va supprimer des fichiers temporaires et inutiles. Mais encore plus cachés. On va aller dans la source de ce que l’on cherche : les paramètres de ton stockage. Il te faut tout d’abord lancer « L’explorateur de fichiers », puis sélectionner « Ce PC », sur ton disque dur, tu fais Clique Droit« Propriétés ». Une nouvelle page va s’ouvrir, clique alors sur « Nettoyage de disque ». Tu peux alors tout sélectionner et cliquer sur « Nettoyer les fichiers système ».

B. Performances élevées

Si t’as un PC portable, c’est indispensable ! Même si c’est aussi utile sur les PC fixes. La consommation va un tout petit peu augmenter (et encore c’est presque rien) mais les différences se voient de plus en plus. Pour mettre ton ordi en « Performances élevées », recherche « Panneau » et clique sur « Panneau de configuration », sélectionne ensuite « Options d’alimentation », puis active « Performances élevées ».

C. Applications au démarrage

Le retour de Windows qui fait plein de tâche sans rien te dire ! Y compris le lancement automatique d’applications à chaque démarrage. C’est ce qui te prend le plus de RAM (mémoire vive). Le style d’application qui se lance à coup sûr, ce sont les launchers de tes jeux ! Pour les désactiver, appuie simultanément sur Ctrl + Alt + Suppr, clique sur « Gestionnaire des tâches », une nouvelle fenêtre va se lancer, sélectionne alors « Plus de détails ». Pour finir, dans l’onglet Démarrage, sélectionne une application (où il y a écrit « Activé » à droite), puis clique sur « Désactiver ». Je te déconseille de faire ça pour « Windows Security » et ton « Gestionnaire audio ».

D. Affichage

Même si depuis le début, on a l’impression que je déteste Windows, ce n’est pas le cas ! Il reste un très joli système d’exploitation ! Sauf qu’évidemment, ça prend une bonne partie des performances ! Comme, par exemple, l’ombre des fenêtres et leurs animations, etc… Si ton PC à vraiment besoin de la moindre puissance, désactive tout, sauf la « Lisser les polices d’écran ». Sinon c’est vraiment moche. Pour faire ça, lance « L’explorateur de fichiers », puis fais un Clic droit sur « Ce PC », et clique sur « Propriétés ». Sur la nouvelle fenêtre qui s’ouvre, clique sur « Paramètres avancées du système », sur la nouvelle fenêtre, re sélectionne « Paramètres », enfin, tu peux tout désactiver, ou sélectionner les 3 comme moi pour avoir la meilleure qualité/performance ! En bonus, dans l’onglet « Avancé », sélectionne « Les programmes ». Cela va mettre les performances de ton processeur dans les applications en cours et non celles en arrière-plan.

E. Affichage Nvidia

Cette étape est seulement pour ceux qui ont une carte vidéo Nvidia dans leurs PC. On va continuer à choisir les paramètres pour avoir la meilleure qualité/performance. Pour ça, il va falloir tout d’abord faire un Clic droit sur ton bureau et sélectionner « Panneau de configuration NVIDIA ». Clique ensuite sur l’onglet « Régler la taille et la position du bureau », puis pour « Effectuer la mise à l’échelle sur : », sélectionne « Processeur graphique ». Fini cette tâche en cliquant sur « Appliquer ». Ensuite, dans l’onglet « Régler les paramètres d’image avec Aperçu », sélectionne « Utiliser mes préférences pour améliorer : », puis place le curseur sur « Performances ». Pour finir, clique sur « Appliquer ». A noter que la différence de pixel entre « Qualité » et « Performances » n’est absolument pas la même que montré dans ce paramètre ! En jeu, la différence est à peine notable. Enfin, dans l’onglet « Gérer les paramètres 3D », met « DSR – Facteurs » sur Off (pour ça, il te suffit de désactiver tout), puis met « Filtrage de texture – qualité » sur « Hautes performances », pour finir, met « Mode de gestion de l’alimentation » sur « Privilégier les performances maximales ». Pour finir, clique sur « Appliquer ». A noter que la consommation de ton PC sera à peine affectée.

4. Conclusion

Si t’as fait tout ça, tu peux peut-être voir une différence ! Plus ton PC est déjà une machine de guerre, moins il y aura de différence. Personnellement, avec mon PC fixe qui est déjà très puissant, j’ai eu de 5 à 7% de performances en plus ! J’ai fait les mêmes tests avec un PC fixe moins puissant, il a gagné 6 à 9% de performances ! Mais les différences les plus notables sont sur les PC portables. Sur un ancien PC portable, j’ai réussi à avoir 9 à 12% de performances supplémentaires !! Ce qui est loin d’être négligeable au quotidien. Après évidemment que si tu as un processeur des années 1742 et 500 Mo de RAM, je peux pas beaucoup t’aider… fin si je te conseil vivement d’acheter un SSD (=disque dur beaucoup plus performant que les HDD), de l’installer dans ton PC et de mettre Windows dessus. De plus, si tu fais extrêmement attention sur internet, tu peux aussi désactiver Windows Defender ! Mais je te le déconseille vivement. C’est à tes risques et périls. Mais même si avec tout ça, ton Windows est vraiment beaucoup trop lent… tu peux toujours supprimer le fichier « Win32 » (ne le fait surtout pas !). Ou alors passer sur « Linux » 😉🤔 Pour finir, si tu as vraiment peur que Windows t’espionne et que tu te moques des performances tu peux néanmoins passer sur Windows XP, avec lui aucun problème de sécurité (mais des performances amoindries), la preuve il te demande ton autorisation pour tout !

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 !!!