Author: Vincent ROBERT

Tutoriels

Lancer une machine virtuelle sur son ordinateur

Dans le cadre des cours de spécialité NSI, vous pouvez être amené à utiliser une machine virtuelle sur votre propre ordinateur. En informatique, une machine virtuelle (VM en anglais) est une illusion d’un appareil informatique créée par un logiciel d’émulation.

Une machine virtuelle, c’est quoi ?

D’après wikipédia

En informatique, une machine virtuelle (VM en anglais) est une illusion d’un appareil informatique créée par un logiciel d’émulation.

Le logiciel d’émulation simule la présence de ressources matérielles et logicielles telles que la mémoire, le processeur, le disque dur, voire le système d’exploitation et les pilotes, permettant d’exécuter des programmes dans les mêmes conditions que celles de la machine simulée

Une machine virtuelle, ça sert à quoi ?

D’après wikipédia

Un des intérêts des machines virtuelles est de pouvoir s’abstraire des caractéristiques de la machine physique utilisée (matérielles et logicielles — notamment système d’exploitation), permettant une forte portabilité des logiciels et la gestion de systèmes hérités étant parfois conçus pour des machines ou des environnements logiciels anciens et plus disponibles.

Les machines virtuelles sont également utilisées pour isoler des applications pour des raisons de sécurité, pour augmenter la robustesse d’un serveur en limitant l’impact des erreurs système ou pour émuler plusieurs machines sur une seule machine physique (virtualisation).

Les inconvénients des machines virtuelles sont d’une part des performances brutes sensiblement inférieures à une exécution sur le matériel en natif (ce qui peut rendre malaisé le test de jeux 3D), d’autre part de consommer une petite partie de la mémoire réelle pour leur propre fonctionnement. Leurs avantages sont de permettre des tests de variantes d’installation sur des machines simulées possédant des tailles de RAM, de mémoire graphique, et des nombres de processeurs très divers.

Une machine virtuelle en spé NSI

Le programme de la spé NSI comporte une partie qui traite des système d’exploitation, de leurs fonctionnalités et de l’utilisation du mode console d’un OS.

Pour des raisons de sécurité, sur les ordinateurs du lycée, est bloqué :

  •  le mode console 
  • la possibilité d’installer un nouvel OS 
  •  l’accès administrateur

Manipuler une machine virtuelle permet de disposer d’une machine sur laquelle on peut installer un système libre (Ubuntu sera choisit pour sa simplicité), et sur ce système d’exploitation vous serez administrateur (vous pourrez donc tout casser par exemple, ou installer un virus (si vous y arrivez) sur votre machine virtuelle sans pour autant contaminer votre système d’exploitation natif.

Mon ordinateur peut-il faire tourner une machine virtuelle ?

Le fonctionnement (ou le non fonctionnement) d’une VM dépend des éléments suivants :

  • processeur : Si votre processeur est très vieux ou très peu puissant, il ne pourra pas faire tourner une machine virtuelle.
  • Chipset : Certains chipset peuvent bloquer mais en général il s’agit plus d’un réglage à faire dans le BIOS
  • BIOS : Il est parfois nécessaire d’accéder au BIOS et d’y modifier un paramètre.
  • Système d’exploitation

Mon processeur est-il capable de faire tourner une machine virtuelle ?

L’article sur le site du fabricant de processeur intel est particulièrement bien écrit : 
Processeur Intel

Si vous n’arrivez pas à faire tourner une machine virtuelle, dans 90% des cas la solution sera de modifier un paramètre du BIOS de votre carte mère.

Modifier le BIOS pour faire tourner une machine virtuelle

D’après wikipédia

Le BIOS, de l’anglais Basic Input Output System (en français : « système élémentaire d’entrée/sortie ») est un ensemble de fonctions, contenu dans la mémoire morte (ROM) de la carte mère d’un ordinateur, lui permettant d’effectuer des opérations de base, lors de sa mise sous tension. Par exemple l’identification des périphériques d’entrée/sortie connectés et la lecture d’un secteur sur un disque, un CD ou une partie d’une clé USB.

Par extension, le terme est souvent utilisé pour décrire l’ensemble du micrologiciel de la carte mère.

C’est en quelque sorte le centre de contrôle de la carte mère. Sur les cartes récentes il est remplacé par sa version moderne l’UEFI.

Si au lancement de la machine virtuelle, vous avez ce message d’erreur :

Alors voici les grandes lignes de ce qu’il va falloir faire :

  1. Trouver le moyen d’accéder au BIOS de son ordinateur
  2. Trouver le bon paramètre, et le modifier
  3. Sauvegarder le nouveau paramétrage du BIOS
  4. Redémarrer la machine physique

1. Accéder au BIOS

Pour accéder au BIOS, la procédure change selon la marque, l’année de votre ordinateur, son installation…

Si ce tutoriel marche :
How to enable virtualisation vt-x/amd-v on windows 10 (in bios) suivez le !

Paramètres Windows > Mise à jour et sécurité > Récupération > Démarrage avancéRetour ligne automatique
puis : Retour ligne automatique
Dépannage > Options avancées > Changer les paramètres du microprogramme UEFI

Si cette méthode ne marche pas, il faudra spammer au redémarrage les touches permettant d’accéder au BIOS, souvent la touche « Suppr », « Del », « F2″…

BIOS – Accéder au setup du Bios

2. Trouver le bon paramètre

Ne modifiez que ce que vous comprenez.

La paramètre à modifier peut se cacher vous divers noms. 
Les deux captures d’écrans réalisées par Metais R. et Fernando L. pourront vous aider dans cette recherche.

3. Sauvegarder le nouveau paramétrage du BIOS

Vous devez sauvegarder ce nouveau réglage avant de redémarrer le PC.

4. Redémarrer la machine physique

Sur Windows 10 > Démarrer le gestionnaire de tâche et vérifier que la virtualisation est activé.

Autres débogage

Si cela ne marche toujours pas, pas de panique. Essayez les stratégie ci-dessous :

1. Désactiver Hyper-V dans les fonctionnalités de Windows

Désactiver = la case doit être décochée !

2. Modifier les paramètres de la machine virtuelle elle même

Procédure à venir …

Projets

Un Tetris en python pour la NumWorks

Tout le monde sait qu’une calculatrice programmable sert à jouer à des jeux. Or quand on parle de jeux, un des premiers à nous venir en tête est Tetris, alors pourquoi pas un Tetris pour NumWorks ?

Ainsi, après un démineur, un snake, on vous propose cette fois ci le jeu mythique de la Gameboy adapté en flat design et codé en python pour la NumWorks.

Donne moi 32 ko, je te ferai un Tetris !

Jusqu’à la version 13.2 d’Epsilon, l’OS officiel de la NumWorks, faire un jeu en python sur la couche graphique de la NumWorks était impossible et les scripts commençaient à planter dès qu’ils pesaient 3-4 ko.

Avec un tas python heap de 32 ko, on peut enfin commencer à s’amuser et monter des projets dont le code source pèse près de 8ko.

Le récit de la création d’un jeu en image

Tout commença le 19 avril 2020 dans une nuit confinée.

🧐 Bon on vient de finir nos trois projets en python, on fait quoi maintenant ?
🤓 Oh on peut acheter des contrefaçon de Gameboy sur Aliexpress pour 10€ ! Et il y a 400 jeux dedans.
🧐 La nuit porte conseil, on en parle demain, enfin dans quelques heures !

Le lendemain :

🧐 Bon on fait un Tetris. Je viens de lire l’article sur Wikipédia, c’est passionnant. Par contre par un mot à Arthur, il va nous piquer notre idée sinon. Et cette fois, on ne stocke pas coordonnées des cases occupées dans des matrices, et on va utiliser la fonction get_pixel() de la NumWorks pour déterminer si une case est occupée ou non.

et c’est ainsi qu’un premier Tétrominos apparaît à l’écran.

🤓 J’ai peut être fini la collision
🧐 Hein ?! Mais j’ai pas commencé moi…
🧐 Bon je partage l’écran. Qu’est ce qu’on a dit déjà ? 120 pixels pour le menu, 120 pixels pour le score et 42 pixels pour le jeu en lui même c’est bien ça ?


🧐 Bon je viens de finir la maquette d’une ébauche de menu, reste à le coder !
🤓 et moi je viens de finir les collisions …
🧐 Pour les couleurs ça sera délicat et subtil. On va s’écarter du code couleur original.

🧐 Et du coup on va faire un rappel dans le menu
🤓 On fixe les points d’ancrage dans les pièces, et ainsi elles peuvent tourner

Rendu final souhaité (et obtenu)

🤓 Astuce : Si tu joues sur Omega, alors l’interface du jeu n’est plus orange mais rouge, elle s’adapte au fork de Epsilon.

🧐 D’ailleurs faudra que je relance l’équipe de développement de Omega, ils m’ont promis un tas python de 120 ko et j’ai l’impression que ce projet n’avance pas !
🧐 Bon ils sont encore sur répondeur, ils ont du bloquer mon numéro !
🤓 On fait une pause, j’ai envie de jouer un peu :

🧐 Bon je vais spoiler Critor de tiplanet.org mais toujours aucune info à Arthur !
🤓 Score codé, avec des fonctions polynôme et les points marqués dépendent du niveau du jeu …
🧐 Niveau max : 99, Score max : 999 999
🤓 Vitesse du jeux codé, avec une fonction logarithme népérien car un polynôme n’était pas adapté …

🧐 Bon maintenant s’agit de faire un gros score, histoire d’être certain que Critor ne nous batte pas !

Commencé un dimanche, fini le mercredi suivant, c’était presque trop facile !

🧐 Je reviens, je vais conseiller à Critor de commencer level 42, ça plantera son score !

Meilleurs scores

🧐 Il a commencé sa partie directement au niveau 42, du coup son score est à peine acceptable !🤓 En plus, il a triché ! Il a utilisé une vision prédictive triple et la grille d’aide !

Bien évidemment, il a nié avoir triché 🙄

Je ne les ai même pas utilisés, c’était pour mettre à l’écran le maximum d’éléments visuels, car j’étais parti pour l’utiliser également comme photo d’illustration d’article

Xavier Andréani, alias Critor du tiplanet.org

Mais nous ne sommes pas dupes non plus !

Epsilon 20…

31 Janvier 2023, une nouvelle version du système d’exploitation de la NumWorks est publié : Epsilon 20 ! 😍
NumWorks décide alors d’enfin implémenter le tableau périodique (qui était déjà d’ailleurs disponible sur Omega depuis un bon moment) dans son système, mais décide également de mettre à jour le fonctionnement du codage des couleurs dans l’application Python, ce qui a pour effet de mettre le Tetris, sortie 3 ans plus tôt, complètement KO et dysfonctionnel…

2,5 ans plus tard

🧐 Bon, ça fait plus de 2 ans que le Tetris est planté, il va falloir faire quelque chose…
🧐 Demande de l’aide à Kevin
🤓 Un peu sous l’eau en ce moment, ça bosse ici (il faut bien payer les impôts pour augmenter les parlementaires et les professeurs)
😎 J’aurai un peu de temps après mes partiels, je peux y jeter un œil et en profiter pour mettre à jour l’interface, j’aurai juste à reprendre le code de l’UI/UX du Mastermind, il est flexible et facilement implémentable
😎 Bon ça m’a pris toute la journée mais c’est censé être bon, j’en ai aussi profiter pour rajouter un système de pause, je me souviens qu’à l’époque c’était frustrant de perdre sa partie quand le prof passait derrière…
🧐 Tsss

Réagir ou commenter ce jeu

N’hésitez à réagir à cet article sur le forum tiplanet.org associé :
Tetris en Python pour NumWorks 13.2.0+

Vous pouvez également réagir à l’annonce de ce Tetris posté sur twitter :

https://twitter.com/nsi_xyz/status/1259418545173209089

Projets

Un menu en python pour les jeux sur la…

Un jeu commence souvent par un écran de paramétrage. Celui-ci doit être ergonomique, intuitif, et permettre à l’utilisateur final de personnaliser son expérience ludique. Cette article présente l’un des tout premier menu adaptable conçu en python pour la calculatrice NumWorks, ainsi que 3 exemples d’utrilisation.

Le contexte

Avec la sortie de la version 13.2.0 d’Epsilon, l’OS qui anime la calculatrice NumWorks, les capacités de la calculatrice à exécuter des scripts python a été doublée.

Le tas python « heap » est ainsi passé de 16ko à un peu plus de 31ko.
Et on peut donc désormais se lancer dans des projets un peu plus ambitieux.

Après avoir développé chacun un démineur en python pour la NumWorks, nous avons décidé de mettre au point un système de menu commun, paramétrable, utilisable dans ces deux démineurs et dans le snake que Arthur Jacquin a développé.

Ce menu a été codé pour permettre un maximum de souplesse, donc n’hésitez pas à l’utiliser comme tel ou à l’adapter.

D’un écran statique à un menu dynamique

Le « menu » originel de l’un des deux démineurs n’est en fait que du texte, affiché quelques secondes, uniquement lors du premier lancement du jeu. On ne peut pas interagir, et il va falloir intuiter le fonctionner des différentes touches.

Sur une application de calcul mental, nous avions conçu un vrai menu en mode texte :

Avec un système de navigation interne au menu primitif mais fonctionnel.

L’idée était donc de créer un menu ergonomique, sur la couche graphique de la NumWorks.

Les quelques croquis conceptuels ci-dessous illustrent parfaitement le cheminement fait d’essais/erreurs pour concevoir un menu simple, intuitif, ergonomique. La démarche est évidemment ponctuée de tests de positionnement.

Croquis

Test

Vertical ou horizontal ? Hybride ? Finalement, c’est l’affichage vertical qui est retenu, avec une coloration de l’objet actif pour une navigation claire, simple, en flat design.

Fonctionnalités

  • S’accorde avec la couleur de l’OS (Epsilon est orange, Omega rouge),
  • Permet le paramétrage de 1 à 5 paramètres, comportant autant d’options que souhaité,
  • Permet une option par défaut pour les paramètres,
  • Design épuré, minimaliste,
  • Possibilité d’afficher des informations sur plusieurs lignes.

Brancher le menu sur votre programme

Il suffit ensuite d’appeler la fonction menu() avec votre application. Elle retourne une liste des paramètres validés.

Il est souhaitable de faire cet appel proprement, et de prévoir le cas ou le menu n’est pas disponible, ainsi si le menu n’est pas présent sur la calculatrice, alors le jeu fonctionnera quand même avec des paramètres par défaut.

Par exemple :

try:
    mines, co, cr = menu("MINESWEEPER",
         "Lancer la partie",
         ["Mines", 22, 32, 42, 12],
         ["Commandes", " Nav: Flèches", " Déminer: OK", "Drapeau: DEL", "Rejouer: OK"],
         ["Crédits", "Arthur J.", "Vincent R."])[0]
except :
    mines = 20

Pour les utilisateurs avancés de ce menu, il est également possible de modifier les paramètres d’affichage avec une version souple (les versions du menu seront déclinées en fin d’article), permettant ainsi d’afficher plus de 5 paramètres, des chaînes de caractères plus longues, ou d’ajuster selon vos goûts.

Un branchement plus détaillé est présenté à la fin de cet article.

Paramètres de la fonction()

Le deuxième paramètre est le nom de l’action correspondant à la validation des paramètres, ici « Lancer la partie ».

Les paramètres suivants sont stockés dans des listes, il peut y en avoir jusqu’à 4 ou 5 et le dernier gère l’affichage sur deux lignes de manière optionnelle. Chaque paramètre comporte, dans l’ordre :

  • 1 nom (chaîne de caractère)
  • 1 ou plusieurs options

Affichage d’information

Les paramètres, comme leur nom l’indique, sont destinés à paramétrer l’expérience qui suivra ce menu. Cependant, vous pouvez également les utiliser pour afficher des informations, telles que les crédits ou les commandes. C’est notamment pour cela qu’est prévu l’affichage sur plusieurs lignes (qui est optionnel).

L’affichage multiligne n’est utilisable uniquement sur le dernier paramètre, et réduit évidemment le nombre de paramètres possibles. Pour l’activer, il suffit de séparer le contenu de la première ligne et celui de la deuxième par un dollar ($), par exemple :

  • « Auteur$Vincent Robert »
  • « Site web$nsi.xyz/snake »
  • « Navigation$Flèches »

Le dollar ($) est un caractère ACSII standard mais il faudra le saisir depuis le workshop, il n’est pas disponible de le saisir directement sur la calculatrice.

Epsilon ou Omega ?

L’essai d’une fonction exclusive à Omega suffit, et permet un accord visuel de l’objet actif avec la barre de titre de l’écran :

def omega(): # Vérificateur d'OS
    try: get_keys()
    except: return False
    else: return True

Détection des touches

Les différents projets, et notamment les jeux, nécessitent très souvent un système de détection des touches pressées. La fonction wait() est destinée à cet usage, et s’importe en même temps que le menu. Pratique !

def wait(buttons = range(53)): # Attends qu'une des touches précisées soit pressée
    while True:
        for i in buttons:
            if keydown(i):
                while keydown(i): True # Fonction anti-rebond
                return i

La fonction, par défaut, attendra qu’une des 46 touches soit pressée. Cependant, pour plus d’efficacité et pour n’avoir à traiter uniquement les signaux qui vous intéressent, vous pouvez passer en paramètre la liste des touches à interroger.

La table des codes clavier de la NumWorks est accessible sur cet article de Ti-Planet.

Table des codes clavier

Tester le menu

Le menu est disponible ici :

MenuVersion AVersion B
VariationsLe titre est en noir, quelques variations dans le code mais le rendu final est identiqueLe titre est en bleue, quelques variations dans le code mais le rendu final est identique
Téléchargermenu.pymenu.py
Démonstrationmenu_demo.pymenu_demo.py
Développementmenu_devn.a.

Pour le voir en action directement dans le workshop, vous pouvez utiliser une version non branchée mais autonome, ce sont les scripts menu_demo.py.

Une version de développement est également disponible, si vous souhaitez changer ou tester d’autres réglages : menu_dev.py

À la parution de cet article, quelques scripts utilisent ce menu, ce qui peut vous donner une idée plus concrète des usages possibles du menu :

Liendemine.pysnake.pycalcul.py
Taille8.42 ko8.42 ko8.42 ko
Auteur principalRobert VincentArthur JacquinFedyna Kevin
Menu

Ces applications existent en deux versions :

app.py est l’application qui intègre une copie du code du menu, app_se.py désigne une édition spéciale, allégée de menu qui est appelé depuis un autre script. Ainsi, le code du menu est mutualisé, ce code occupe donc moins de place car l’espace de stockage des scripts sur la calculatrice est limité.

Les applications app_se.py peuvent se lancer à priori sans le menu, mais dans ce cas là, il n’est pas possible de paramétrer l’application. On a encore quelques bug à résoudre, un try import semble ne pas fonctionner … On travaille sur ce sujet. Les applications sans _se sont par contre fonctionnelles.

Si l’équipe de Numworks nous lit, on aimerait bien

  • profiter un peu des 8 Mo de la ROM de la N0110, et donc avoir plus de 32ko pour stocker nos scripts
  • Que les touches les touches manquantes soient mappés sur le workshop, c’est à dire qu’il faut mapper toutes les touches en fait et non pas seulement 7…

Brancher proprement le menu sur une application

Un branchement propre est un branchement qui se comporte ainsi :

  • Si au lancement du script, la fonction menu() n’est pas détectée alors le jeux ou l’application se lance avec les paramètres par défaut, c’est un fonctionnement dégradé mais l’application marche. (On a encore quelques bug à résoudre)
  • Si au lancement du script, la fonction menu() est détectée, le menu se lance.

Exemple de branchement qui intègre le mode de fonctionnement dégradé :

def start():
    global mines, triche, graphisme
    try:
        mines, triche, graphisme, com, cre = menu("Démineur", "Lancer la partie",
                                                  ["Mines", 19, 22, 25, 28, 31, 33, 36, 39, 42, 7, 10, 13, 16],
                                                  ["Mode Triche", "non", "oui"],
                                                  ["Graphisme", "sobre", "classique"],
                                                  ["Commandes", "Nav: Flèches", "Déminer: OK", "Drapeau: Retour",
                                                   "Rejouer: Maison", "Triche: shift"],
                                                  ["Crédits", "Site web$nsi.xyz/demine", "Auteur$Vincent Robert",
                                                   "Contributeur$Bisam tiplanet.org",
                                                   "Contributeur$Critor tiplanet.org", "Contributeur$Arthur Jacquin"])
        triche = 0 * (triche == "non") + 1 * (triche == "oui")
        graphisme = 0 * (graphisme == "sobre") + 1 * (graphisme == "classique")
    except:
        mines, triche, graphisme = 19, 0, 0
    jeux()

Pour que tout ceci marche, il faut que la calculatrice importe le script menu.py et le script qui utilise le menu lors de la bascule vers la console d’éxécution. Ce fonctionnement ne peut malheureusement pas être simulé sur le workshop, mais sur calculatrice cela fonctionne.

Depuis le gestionnaire de script python, il suffit d’activer les options :
« Importation auto dans la console » des deux scripts.

Vous pouvez réagir à cet article sur le topic tiplanet.org de cette news :
Snake, calcul mental, et interface lancement jeux Python

Projets

Un démineur en python sur la NumWorks

Le démineur, jeu de réflexion dont le but est de localiser des mines cachées dans une grille représentant un champ de mines virtuel, avec pour seule indication le nombre de mines dans les zones adjacentes est désormais porté en python sur ta NumWorks !

Souvenir de jeunesse

J’ai découvert la programmation sur une désormais antique Casio 9960GT, propulsé par son CPU 8 bits à 4,3 MHz. Lycéen et autodidacte, j’ai alors entrepris de créer un démineur sur ma calculatrice et cela fut pour moi une découverte de différents concepts en algorithmique.

Le processeur de cette génération de calculatrice était tellement lent et l’accès à la mémoire encore plus lent que chaque test logique prenait un temps considérable. Le démineur codé et parfaitement fonctionnel se montrait ainsi d’une lenteur remarquable au premier lancement lors de l’affichage de la couche graphique, il fallait près de 42 secondes pour initialiser la couche graphique.

Quelques caractéristiques de ce démineur :

  • 5 niveau de difficulté
  • un plateau de jeu de 14 cases par 7, soit 98 cases en tout.
  • L’initialisation de la couche graphique prenait à elle seule plus de 30 secondes
  • La navigation était fluide, mais la fonction découverte pouvait prendre une bonne dizaine de seconde.

Sur une NumWorks, en Python

20 ans plus tard, l’idée est donc de coder un nouveau démineur, en python, et de le faire tourner sur la calculatrice à la mode du moment : une NumWorks, propulsé par un CPU ARMv7 à 100 / 200 mhz, donc probablement plus de 50 fois plus rapide que celui de mon antique Casio.

Mes élèves de seconde étant tous équipés de cette calculatrice, ils pourront s’amuser en silence quand les cours sont trop ennuyeux, et cela montrera aux futurs élèves de la spécialité NSI les possibilités de la calculatrice et la souplesse du langage python.

L’objectif est de sortir ce démineur pour la sortie officielle de la version 13 de Epsilon, le logiciel sous licence CC BY-NC-SA de la calculatrice NumWorks. La version 13 de Epsilon introduit beaucoup d’améliorations et de nouveautés à l’application Python, celle qui nous intéresse particulièrement et le getkey, la capacité de la calculatrice dans un script python à détecter si une touche est pressée.

Le site tiplanet.org ayant déjà bien documenté cette fonctionnalité, on dispose donc déjà des codes associés aux touches :

Créer une interface graphique

Pour faire un démineur, on a besoin d’un tableau de n lignes et p colonnes dans lequel on va afficher une mine, un drapeau ou un chiffre.

Il faut donc s’adapter à la résolution de l’écran, et la principale contrainte à prendre en compte est la taille d’affichage des chiffres.

Puis on les met en couleur

et enfin on code les mines et le drapeau.

#codage des couleurs
co=color
f,h,n = 255,127,0
c=[co(f,f,f), co(45,125,210), co(151,204,4), co(238,185,2), co(244,93,1), co(215,65,167), co(n,n,n), co(n,n,n), co(n,n,n),
   co(h,h,h),co(192,192,192),co(96,96,96),co(253,236,185)]
def terrain(): #Affiche la grille
  fill_rect(8,21,300,200,c[9])
  for y in range(21,243,20):
    for x in range(8,309):
      set_pixel(x,y,c[10])
  for x in range(8,320,20):
    for y in range(21,222):
      set_pixel(x,y,c[10])
def cl(x,y):
  fill_rect(9+20*x,22+20*y,19,19,c[0])
 
def drapeau(x,y):
  fill_rect(17+20*x,26+20*y,3,9,c[12])
  fill_rect(17+20*x,36+20*y,3,3,c[12])
 
def mine(x,y): # Ce code ne sera pas retenu pour la version finale.
  cl(x,y);
  fill_rect(12+20*x,36+20*y,13,4,c[9])
  fill_rect(14+20*x,34+20*y,9,2,c[11])
  fill_rect(17+20*x,32+20*y,3,2,c[5])

Une matrice pour stocker les mines

Le plus simple est de stocker les mines dans une matrice 10×15.
Pour cela on défini une matrice en python et on la rempli de 0.

m = [[0 for y in range(10)] for x in range(15)]

puis un script génère des bombes, codées 999 dans la matrice.

def gvt(): #fonction renommée depuis ...
  b = 20
  while b>0:
    x, y = randint(0,14),randint(0,9)
    if m[x][y]!=999:
      m[x][y]=999
      b-=1
      for p in range(max(0,x-1),min(15,x+2)):
        for q in range(max(0,y-1),min(10,y+2)):
          if m[p][q]!=999:m[p][q]+=100  

Le script ci-dessus a deux fonctions, il place les 20 mines puis « calcule » pour chaque case le nombre de bombes dans les 8 cases autour.

Ainsi, la matrice contient à ce stade uniquement des entiers :
soit des 0 (0 bombes dans les 8 cases environnantes), soit des multiples de 100, soit des 999.

Pourquoi 100 et pas 1 pour indiquer qu’il y a une bombe ?

Car on va utiliser cette matrice pour y stocker une information importante, à savoir si la case a été découverte ou pas.

m[i][j]La case (i,j) contientDans les 8 cases autour de la case (i,j) il y acase découverte
9991 mineon ne sait pasnon sinon (…)
3420 mine3 minesoui
3000 mine3 minesnon
420 mine0 mineoui
10 mine0 mineen cours de découverte
00 mine0 minenon

Calcul du nombre de mines de chaque case

En parcourant l’article Wikipédia sur le démineur lors de la rédaction de ce compte rendu, j’y ai découvert que j’ai construit intuitivement l’un des deux algorithmes classiques pour le calcul des nombres des différentes cases du démineur.

Sur mon antique Casio 9960GT, j’utilisais l’algorithme par case :

explorer tableau par case
si case est vide
nombre := compter_mines(case.voisinage)
case.valeur = nombre<

et sur la NumWorks, j’ai construit une version légèrement adapté de l’algorithme par mine :

// Placement de la mine
explorer mine.voisinage par case
si case est vide
incrémenter case.valeur

Dans une première version en python, j’utilisais la partie décimale pour y stocker le 42 ou le 0.01, ainsi cela donnait 1,42 si il y a une mine dans le voisinage et que la case est déjà découverte, mais ceci posa un problème, le test :

if 1.42-round(1.42)==42

ne marchait pas, car python ne dispose pas d’un moteur de calcul exact sur les réels.
Le résultat du calcul 1.42-1 en python est 0.419999999999999

Par ailleurs, stocker en réel et non un entier est susceptible de consommer plus de mémoire, donc le stockage de l’information sous la forme d’entier est préférable pour les tests conditionnels.

Une fonction pour les découvrir toutes !

A partir de la matrice, on peut exécuter un script qui révèle les positions et vérifie que tout fonctionne correctement :

def verif():
  for x in range(15):
    for y in range(10):
      if m[x][y]==666:
        mine(x,y)
      elif m[x][y]>0:
        chiffre(x,y)

La fonction chiffre elle a pour objectif d’afficher le nombre de bombes autour :

def chiffre(x,y):
  cl(x,y)
  nb[1]+=(m[x][y]%100!=42)
  i=m[x][y]-m[x][y]%100
  m[x][y]=i+42
  if i>=100:v=int(i/100);draw_string(str(v),13+20*(x),23+20*(y),c[v],c[0])
  deminage()

pas à pas de la fonction chiffre :

  • cl(x,y) éclairci la case
  • nb[1] s’incrémente de 1 si la case n’a pas déjà été découverte, c’est le compteur de la victoire
  • Si la valeur m[x][y] contenait Z00 elle sera désormais de Z42, Z étant un entier entre 0 et 8.
  • On affiche la valeur de Z, avec une couleur adaptée.
  • On exécute le script deminage(), qui calcule le score et vérifie si l’on a gagné.

Le plus difficile à coder est la fonction de découverte de proche en proche, si on dévoile une case ne contenant aucune mine, et pas de mine non plus dans les 8 cases alentours, il faut faire un « script récursif » de traitement et de découverte de ces cases.

La fonction decouvre() est la suivante :

def decouvre(x,y):
  i=1
  while i>0:
    chiffre(x,y)
    for p in range(max(0,x-1),min(15,x+2)):
      for q in range(max(0,y-1),min(10,y+2)):
        if m[p][q]>=100:chiffre(p,q)
        elif m[p][q]==0:m[p][q]+=1
    i=0
    for p in range(15):
      for q in range(10):
        if m[p][q]%100==1:i=1;x=p;y=q;p=14;q=9

Elle est appelée par la fonction marche() :

def marche(x,y):
  if m[x][y]>=999:explose()
  elif m[x][y]>=100:chiffre(x,y)
  else:decouvre(x,y)

Ainsi la fonction découverte n’est appelée que si on « marche » sur une case sans mine, et que les 8 cases aux alentours ne contiennent également aucune mine.

Elle teste les 8 cases du voisinage, affiche le chiffre de celles qui doivent afficher un chiffre. Si les cases contiennent un 0, il devient 1 et devra être traité par le script ultérieurement.

Ce fonctionnement n’est pas optimal en temps de calcul, mais il ne crée aucun nouvel objet en mémoire. Il n’est pas vraiment non plus récursif au sens python pour éviter là encore de consommer trop de mémoire.

Une précédente version ajoutait les coordonnées des cases à traiter dans une liste, mais cette liste grossissait et pouvait saturer la mémoire.

Piloter un drone sur un terrain miné

Il ne reste plus qu’à coder la navigation dans l’écran, c’est à dire l’interaction entre l’affichage et le clavier de la calculatrice.

a,r,t,l,k,s=set_pixel,fill_rect,draw_string,range,keydown,sleep
p=[[6,5],[7,5]]
 
def survol():
  x, y = p[1][0], p[1][1]
  v = m[x][y]
  gps(x,y)
  # t(str(int(v/100)),20,2)
  x, y = p[0][0], p[0][1]
  v = m[x][y]
  if p[1][0]!=x or p[1][1]!=y:
    if (v-42)%100==0:gps(x,y,0)
    else:gps(x,y,9)
  del p[0]
 
def gps(x,y,i=6):
  r(9+20*x,22+20*y,19,2,c[i])
  r(26+20*x,22+20*y,2,19,c[i])
  r(9+20*x,22+20*y,2,19,c[i])
  r(9+20*x,39+20*y,19,2,c[i])
 
def drone():
  while not k(6):
    if k(0):p.append([max(p[0][0]-1,0),p[0][1]])
    if k(3):p.append([min(p[0][0]+1,14),p[0][1]])
    if k(1):p.append([p[0][0],max(p[0][1]-1,0)])
    if k(2):p.append([p[0][0],min(p[0][1]+1,9)])
    if k(4):marche(p[0][0],p[0][1])
    if k(17) or k(16):drapeau(p[0][0],p[0][1])
    if k(52):nb[2]=0;nb[0]=22;minage(nb[0]);s(1)
    if k(45):nb[0]=min(nb[0]+5,90);minage(nb[0]);s(1)
    if k(46):nb[0]=max(nb[0]-5,10);minage(nb[0]);s(1)
    if len(p)>1:survol();s(0.120)

La fonction survol() déplace le curseur, en rétablissant l’affichage de la case précédemment survolée à l’aide de la fonction gps().

la fonction drone() attend que l’utilisateur appuie sur une touche du clavier.

ToucheCode toucheAction
Flèche haut1se déplacer
Flèche bas2se déplacer
Flèche gauche0se déplacer
Flèche droite3se déplacer
OK4marcher sur la case
Clear ou Tolbox17Afficher un drapeau
Maison6quitter la boucle
+45ajouter 3 mines et recommencer la partie
46enlever 3 mines et recommencer la partie
EXE52recommencer la partie avec les paramètres par défaut

Le nombre de mine par défaut est fixé à 19 pour un plateau de 150 cases, soit un ratio de 12.7%.

Le démineur de Microsoft sur Windows 10, appelé Minesweeper propose des ratios de 11,1%, 15%, et 20% respectivement pour les modes faciles, moyen et difficile.

Le nombre de mine qu’il est possible de placer est un nombre dans la liste :
13, 16, 19, 22, 25, …, 40 mais une petite astuce mathématiques permet de choisir n’importe quel entier entre 11 et 42 pour désigner le nombre de mine.

Oui n’importe quel nombre entier entre 11 et 42 alors que l’interface et l’utilisation des touches [+] et [-] ne permet que d’ajouter ou d’enlever 3 mines…

Epsilon version 13.2

La sortie de la version 13.2.0 d’Espilon, le logiciel qui anime la NumWorks permet de faire tourner sans problème ce démineur. Si dans la version 13.0.0 et 13.1.0 le démineur ne fonctionnait pas à cause d’une affectation insuffisante de mémoire pour l’exécution des scripts python, la version 13.2.0 résout ce problème qui n’est plus qu’un mauvais souvenir. Ainsi, la NumWorks est l’une des calculatrice la plus rapide lors de l’exécution des scripts Python, et que pour un prix d’achat de 79€ elle n’a clairement aucune concurrence dans cette gamme de prix.

Omega, un firmware alternatif pour votre NumWorks

Le logiciel de la NumWorks est libre et ouvert, ce qui est très appréciable et on peut même dire admirable dans l’univers très fermé des calculatrices.

Ainsi, tout le monde peut accéder au code source, le lire, le modifier et le redistribuer en respectant les conditions imposées par la licence CC BY-NC-SA.

Une équipe de passionné a donc décidé de développer un firmware alternatif, et il l’ont appelé Omega. Ils intègrent différentes amélioration, et poussent les developpeur du firmware stock à s’améliorer sans cesse.

Pour tester ce démineur, tu dois :

  • Soit mettre à jour ta calculatrice en version 13.2.0 au minimum.
  • Soit installer le firmware Omega.
InstallerLien hypertexte
1. Installer Le firmware Omegaen quelques clics
1. Ou mettre à jour Epsilonen quelques clics
2. Installer le démineurworshop

Le démineur en version 1.20

Une nouvelle version de ce démineur est sortie le 18 avril 2020, elle intègre un menu graphique python développé en interne pour cette occasion.

Le script du démineur pèse désormais 8.42ko, et le démineur peut désormais être paramétré par un menu graphique, interactif et intuitif.

De nouvelles options ont été ajoutées :

  1. Le choix du graphisme : Flat vs Classique
  2. Un mode triche à tester avec la touche MAJ de l’ordinateur ou Shift sur la calculatrice.

Quelques dernières remarques

Si tu souhaites réagir à cet article, tu es invité à le faire sur ce forum :
[tiplanet.org] Un démineur en python pour la NumWorks, tu y trouvera des discussions pointues sur l’utilisation de la mémoire lors de l’éxécution d’un script Python.

Entre le script initial et le script proposé en ligne à cet instant, de nombreuses réécritures portions du code ont été réécrites, mais les explications de cet article restent valables.

Tutoriels

Se connecter au serveur nsi42.net

Le site nsi42.net a pour vocation à héberger les sites internet des élèves, réalisés dans le cadre des cours de SNT (2nde) ou de spécialité NSI. Ce tutoriel explique comment accéder aux services offerts par ce serveur.

Ce tutoriel est destiné uniquement aux élèves du lycée Louis Pasteur, seuls nos élèves disposeront d’un compte sur le serveur nsi42.net

Pour rendre public un site web, il faut le déposer les fichiers HTML, CSS, JPG, etc … sur un serveur distant, connecté 24h/24 à internet, en utilisant un client FTP qui lui même utilise le protocole File Transfer Protocol (FTP)

Une fois déposé sur le serveur, votre site internet est visible depuis n’importe quel ordinateur connecté à internet.

Se connecter au serveur FTP du site nsi42.net

1. Télécharger le client FTP FileZilla

Recommandé : FileZilla_3.X.X_win64.zip

Attention : Il faut télécharger FileZilla Client et pas FileZilla serveur.

Lien direct vers les clients FTP : 2go.ovh/filezilla

2. Extraire les fichiers de l’archive .zip

Sur Windows 10, clic croit >Extraire tout suffira.

3. Lancer l’exécutable filezilla.exe

4. Saisir les informations de connexion dans la barre de connexion rapide.

Ces informations sont sur la feuille « Identifiants serveur nsi42.net » qui vous a été distribuée.

5. Cliquer sur « Connexion rapide »

Un message inquiétant peut vous demandez d’accepter un certificat de sécurité, il faudra accepter ce certificat.

Si tout ce passe bien, vous aurez des lofgs qui ressemble à ceci :

Statut : Résolution de l’adresse de ftp.nsi42.net
Statut : Connexion à 109.234.161.108:21…
Statut : Connexion établie, attente du message d’accueil…
Statut : Initialisation de TLS…
Statut : Vérification du certificat…
Statut : Connexion TLS établie.
Statut : Connecté
Statut : Récupération du contenu du dossier…
Statut : Contenu du dossier « / » affiché avec succès

6. Transférer les fichiers (le fichier index.html par exemple) sur le serveur.

Lire un tutoriel expliquant la base du fonctionnement du client FTP vous aidera à comprendre la suite.

Système d’exploitationClient FTP recommandéTutoriel de prise en main
Windowsfilezilla ClientTutoriel
maxOsfilezillaTutoriel
Linuxsudo apt install filezillaTu n’as besoin d’aide si tu utilises déjà Linux !

Une fois connecté, vous pouvez déposer vos fichiers sur le serveur. Un simple glisser / déposer fonctionnera.

Par défaut, et pour éviter les abus, l’espace maximal de stockage a été défini à 2000 MB par compte.

Nous vous rappelons que vous ne devez déposer aucun fichier protégé par des droits d’auteur sur le serveur.

Il est nécessaire que l’une des pages s’appelle index.html sinon n’importe quel visiteur pourra parcourir l’intégralité de l’arborescence des fichiers.

Il ne faut utiliser aucun caractère accentué, ni espace dans les noms des fichiers ou des dossiers.

Vérifier que vos fichiers sont bien en ligne

Vous pouvez vérifier que vos fichiers sont bien accessible en ligne à l’adresse suivante : https://nsi42.net/001/

Bien évidemment, vous devez remplacer 001 par votre identifiant numérique unique , il s’agit d’un nombre à trois chiffres.

Par défaut, et provisoirement votre site internet n’est pas accessible depuis un sous-domaine, ce sous domaine sera mis en place ultérieurement.

Nous vous proposerons alors de choisir le sous domaine, si votre site internet traite des pirates hackeurs célèbres, votre sous domaine pourra alors être : 
hackeurs.nsi42.net et un visiteur pourra accéder à votre site depuis cette adresse.

Pour que vous compreniez bien ces notions, le tableau récapitulatif ci dessous vous propose les 3 situations possibles :

Adresse à testerRéponse du serveurExplication
https://nsi42.net/mitnick.kev/Not FoundL’utilisateur mitnick.kev@nsi42.net n’existe tout simplement pas, vérifiez que vous avez correctement saisi l’adresse
https://nsi42.net/snowden.ed/Index of /snowden.edL’utilisateur snowden.ed@nsi42.net existe, il dispose bien d’un espace sur le serveur, et pour l’instant il n’a placé aucun fichier index.html donc un visiteur peut parcourir l’arborescence des fichiers (dans le cas présent, aucun fichier n’a été déposé)
http://2020.nsi42.net/Le fichier index.html déposé sur le serveur via FTP est envoyé par le serveur au visiteurUn des élèves de la spé NSI à activé son compte, déposé un fichier index.html et demandé un sous domaine du domaine nsi42.net

Si tu souhaites toi aussi avoir ton propre sous-domaine, il te faut attendre un peu que tes enseignants procèdent à la distribution, en général au mois de Janvier pour les élèves de 1ère. Inutile de les contacter par courriel, un lien dans le cours sur les interactions client-serveur te permettra de choisir ce sous domaine.

Projets

Le défi de python, concours tiplanet.org

En naviguant par hasard sur le site tiplanet.org, nous sommes tombé sur un défi Python et comme se perfectionner en python était l’un de nos objectifs, autant joindre l’utile à l’agréable.

Concours de rentrée 2019 – défi de Python

Pour le défi python 2019 des sites internet tiplanet.org et planet-casio.com , il fallait se constituer une main de 10 pokemons maximum et leur attribuer une priorité d’attaque.

Pour cela, un script Python va offrir à ta calculatrice la fonction pk(n,p) pour ajouter un Pokémon à ta main, avec :
n, le numéro de Pokémon de 1 à 94
p, la priorité d’attaque que tu souhaites donner au Pokémon en question (1 par défaut)

Dans la suite de l’article, le « nous » fait référence au participant 16 et au participant 17, car nous avons réalisé les recherches en commun.

Recherche pifométrique manuelle

Comme beaucoup de joueurs, nous avons commencé par générer des mains au petit bonheur la chance, gratifié d’un score maximum de 44,2 nous sommes vite passé à une autre méthode.

Nous aurions bien voulu commencer les recherches sur la NumWorks, mais les problèmes de mémoires dont-elle souffre à cette époque, avant la mise à jour 13.2 rendent ces recherches impossibles sur la calculatrice.

Ajouter quelques lignes de codes au script de 3.7 ko aurait fait planter la calculatrice.

Nous sommes donc passé sur Thonny et y avons exécuté nos scripts pythons

10 attaques mêlant force brute et analyse statistique

Attaque n°1 : 10n tirages aléatoires

Après avoir neutralisé les fonctions print(), les affichages des scripts du concours, et rajouté quelques variables globales, une boucle de tirage aléatoire fut codée :

import random
 
score, scoremax = 0.0, 0.0
code, codemax = 0.0, 0.0
tentative = 0
 
def tiragemain():
  for i in range(1,11,1):
    pokemonaleatoire = random.randint(1,94)
    score=pk(pokemonaleatoire,i)
  return score,code
 
while score<49.3:
  # Les trois lignes ci-dessous réinitialisent le script, qui tourne sans s'arrêter
  na,pkl=21,[]
  lnm =["Bulbizarre","Herbizarre","Florizarre","Salameche","Reptincel","Dracaufeu",
        "Carapuce","Carabaffe","Tortank","Chenipan","Chrysacier","Papilusion","Aspicot",
        "Coconfort","Dardargnan","Roucool","Roucoups","Roucarnage","Rattata","Rattatac",
        "Piafabec","Rapasdepic","Abo","Arbok","Pikachu","Raichu","Sabelette","Sablaireau",
        "Nidoran F","Nidorina","Nidoqueen","Nidoran M","Nidorino","Nidoking","Melofee",
        "Melodelfe","Goupix","Feunard","Rondoudou","Grodoudou","Nosferapti","Nosferalto",
        "Mystherbe","Ortide","Rafflesia","Paras","Parasect","Mimitoss","Aeromite","Taupiqueur",
        "Triopikeur","Miaouss","Persian","Psykokwak","Akwakwak","Ferosinge","Colossinge","Caninos",
        "Arcanin","Ptitard","Tetarte","Tartard","Abra","Kadabra","Alakazam","Machoc","Machopeur",
        "Mackogneur","Chetiflor","Boustiflor","Empiflor","Tentacool","Tentacruel","Racaillou",
        "Gravalanch","Grolem","Ponyta","Galopa","Ramoloss","Flagadoss","Magneti","Magneton",
        "Canarticho","Doduo","Dodrio","Otaria","Lamantine","Tadmorv","Grotadmorv","Kokiyas",
        "Crustabri","Fantominus","Spectrum","Ectoplasma"]
  mrandmax,mrand,mfmax,nn,mp=2**31-1,0,93,getlinechars(True)-na,na//2
  tentative = tentative+1
  score,code = tiragemain()
  if score>scoremax:
    scoremax = score
    codemax = code
    print("################# tirage n°",tentative,"score =", scoremax,"avec le code", codemax,"#################", round(score,8))

Le résultat n’est pas optimal, on ne tire aléatoirement que les Pokémons en passant naïvement que les forces sont forcement des entiers entre 1 et 10.

Mais on arrive à fabriquer des scores aux alentours de 46,2.
En une nuit, on arrive péniblement à réaliser entre 4 et 7 millions de tirages.

A ce stade de la recherche, compte tenu de nos hypothèses, on cherche une solution optimale parmi 3 . 1019 possibilités. Toute force brute est impossible.

Attaque n°2 : 10n tirages aléatoires

On décide de faire tourner le script précédent et de mémoriser les compositions des mains supérieures à 46

On va donc réaliser quelques millions de tirages, et dénombrer les Pokemons qui ont permis de faire une main supérieure à 46

  if score>46:
    for i in listeobtenu:
      benchmark46(i,score)

Le lendemain, nous avons un histogramme qui nous donne des Pokemons performant.

[0, 54, 25, 143, 11, 99, 39, 23, 5, 10, 6, 11, 9, 17, 10, 31, 70, 13, 12, 10, 48, 15, 38, 51, 18, 6, 21, 33, 13, 19, 5, 8, 13, 48, 13, 33, 35, 5, 31, 24, 31, 9, 33, 94, 28, 13, 5, 106, 16, 8, 34, 51, 27, 6, 13, 3, 36, 33, 42, 4, 17, 9, 72, 311, 3, 16, 30, 25, 32, 74, 13, 60, 172, 40, 12, 62, 44, 1, 8, 38, 6, 32, 15, 22, 21, 101, 25, 24, 73, 19, 26, 5, 33, 4, 18]

Le Pokemon 63 (Abra) est sorti 311 fois dans la nuit dans des mains valant plus de 46 points. Le 64 lui était très mauvais, et il n’était que dans 3 mains valant plus de 46 points.

Attaque n°3 : Tirages aléatoires sur liste optimale

Le deuxième jour, nous avons poursuivi les tirages aléatoires mais sur des listes optimales générées à l’aide de l’histogramme de la veille.

Liste large : [ 3 , 5 , 16 , 33, 43, 47, 51, 58, 62, 63, 69, 71, 72, 73, 75, 76, 85, 88 ]
Liste short : [ 3 , 5 , 16 , 47, 62, 63, 69, 72, 75, 85, 88]

Au lieu de tirer au hasard un Pokémon parmi 94, on le tirait dans une liste prédéfini à diverses positions (nous pensions que la force était la position, donc un entier entre 1 et 11)

def tiragemain():
  listeobtenu =[]
  top = [ 3 , 5 , 16 , 47, 62, 63, 69, 72, 75, 85, 88]
  random.shuffle(top)
  for i in range(1,11,1):    
    pokemonaleatoire = top[i-1]
    listeobtenu.append(pokemonaleatoire)
    score=pk(pokemonaleatoire,i)
  for i in listeobtenu:
    benchmark(i,score)
  if score>47:
    for i in listeobtenu:
      benchmark47(i,score)
  return score,code,listeobtenu

5 000 000 de tirages plus tard, pas de grandes améliorations, 47.6 est notre meilleur score, mais c’est déjà un joli résultat.

Attaque n°4 : Valeur moyenne des mains

Toutes les tentatives pour optimiser la valeur moyenne des mains ont échouées.
Le calcul lui même de cette moyenne n’étant pas concluant.

Attaque n°5 : Recherche des Pokémon forts sur R

En lisant le forum associée à ce défi sur Planète Casio, on croit comprendre qu’il n’y a pas un nombre fini de combinaison, donc si on tire n dans les entiers entre 1 et 94, p lui serait un réel. On relance les scripts précédents et miracle on passe au dessus de 47.8.

def tiragemain():
  listeobtenu =[]
  for i in range(1,11,1):    
    pokemonaleatoire = random.randint(1,94)
    listeobtenu.append(pokemonaleatoire)
    score=pk(pokemonaleatoire,uniform(0,2**31-1))
  if score>46:
    for i in listeobtenu:
      benchmark47(i,score)
  return score,code,listeobtenu

Après avoir affiné la liste des Pokémons optimaux, on relance les autres scripts qui mélangent, permutent, tirent d’après la liste optimale, et on obtient nos premiers score à 48.

code0^uxOeh%_##>(6#))*&#^heO0xku#_D#’’#%$*.0
Score48.1283516409064348.14694065075124

Attaque n°6 : Élimination des plus faibles

N’étant pas certains d’avoir la main optimale, on essaye de remplacer un Pokémon par tous les autres pour voir si le score s’améliore. Cette méthode ne permet pas de progresser.

Attaque n°7 : Tentative de spécifications des fonctions

On décide alors de documenter le code, de le décrypter, d’essayer de voir si on ne peut pas faire le problème à l’envers, c’est une attaque par spécification du code.

def mmod(a, b):
    # retourne la partie décimale de a a vérifier
    # si a est un entier, retourne 0
    # ?? intérêt , a % b économise de la mémoire
    return a % b
 
 
def getplatform():
    # retourne la valeur 1
    # ?? intérêt ?
    return 1
 
 
def getlinechars(o=False):
    # Cette fonction est une bague. Elle est appelée une unique fois avec true
    # et alors getlinechars(True) retourne 99
    c = 2 ** 31 - 1
    k = getplatform()
    # ?? k = 1 ;-)
    if k >= 0:
        # k = 1 donc est exécuté dans 100% des cas ...
        c = [53, o and 99 or 29, o and 509 or 21, 31, 32, c, c][k]
    return c  # c= 99  ... sauf astuce et codage plus bas ^^
    # pas défaut, en l'absence de True getlinechars() retourne 29

Les premières fonctions sont faciles à spécifier. Les variables sont parfois rigolotes :

na = 21
# 42/2 ? :-) Utilisé 2 fois, jamais modifié
mrandmax = 2 ** 31 - 1
# valeur max d'un entier positif signé codé en 32 bits... spé NSI inside
mrand = 0
# rien d'aléatoire ici, sera modifié par la fonction mseed()
mfmax = 93
# 94-1
nn = getlinechars(True) - na
# nn = 99-21 = 78 (sans calculatrice !)
mp = na // 2
# mp = 10, jamais modifié, utilisé une seule fois f° pk

mais nous sommes restés coincés sur les fonctions getattack(), clean() et surtout pk(). µ
Par contre la fonction setst() nous a passionné ! Le script original à peine modifié, commenté et codé en pep8 :

Attaque n°08 : Manipulations autour du code réponse

La liste des Pokémons est codée en dur dans le script, mais il n’en est rien de leurs qualités ni de la valeur de force optimale pour chaque Pokémon. Cette dernière est donc calculée. Or la chaîne de caractère du code réponse semble peu varier lorsque de l’on tire depuis une liste fixé de Pokémons.

Nous comprenons que :

  • La partie gauche code la liste des Pokémons
  • La partie droite leur force
  • Pour un code « ABCDEFGHIJ0987654321« , on a 10 couples (un exemple est ici en gras) qui définissent les 10 Pokémons et leurs points d’attaque.
  • On peut faire de jolie permutation sans changer le score obtenu car les couples n’influent pas les uns sur les autres
  • Il n’y a aucune clé de vérification, on peut tester des codes au hasard sans avoir la moindre idée de la main des Pokémons et de leur forces
  • Les forces sont codés par des caractères ASCII, on n’est plus du tout dans R mais de retour dans N.
def i2c(k):
    # Transforme un nombre décimal en chaine de caractère
    return chr(k + 33)
 
 
def c2i(c):
    # transforme une chaine de caractère ayant un élèment en valeur décimale
    # cette valeur décimale sera comprise entre 32 (a) et 89 (z)
    return ord(c) - 33

En modifiant à la main la partie droite de la chaîne de caractère, on arrive à modifier très substantiellement le score, à la hausse comme à la baisse. Notre premier 49 est obtenu en bricolant à la main la chaîne de caractère.

codeu^KhxO_%#l » » »l » » »%%%
Score49.031613189324844

C’était assez jouissif il faut dire, en changeant un caractère parmi les 10 derniers, notre score pouvait plonger OU augmenter bien plus vite que tous nos algorithme de tirages aléatoires qui tournaient des nuits complètes…

Ce code réponse ne contient que 20 caractères, on connaît déjà les 10 premiers (du moins on le pense) il ne nous reste plus qu’à utiliser la force brute sur les dix derniers caractères.

Attaque n°09 : Force brute

Grace à notre compréhension obtenue avec l’attaque n°08, on a supposé que pour une liste de 10 Pokémons, il existe une suite de forces optimales. On a ainsi écrit un petit script permettant de trouver cette suite optimale :

lc = [None,"!","!","!","!","!","!","!","!","!","!"]
carac = '!"#$%&'+"'"+'()*+^;_,-./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def cons(liste):
    # Construit le code
    global cc
    cc = ""
    for j in range(len(liste)):
        cc = cc+liste[j]
def turboBoost(pokemons,vitesse=1,style=1):
    # Prend une main de pokemon et lui donne des steroides
    # la chaine finale sous forme de liste pour modifier les caracteres
    lc[0]=pokemons
    # les caracteres a tester (tout ce qui est possible)
    for l in range(vitesse+3):  
        # creation du code par test (5x ou 4x pour trouver "l'etat stable" a tout les coups)
        # vitesse 1 = rapide, vitesse 2 = lent mais plus sur
        for i in range(1,11):
            # On initialise tout
            global cc
            cons(lc)
            scores = [0]
           
            for k in range(len(carac)):
                # On recense le score pour chaque caractere
                lc[i] = carac[k]
                cons(lc)
                score = setst(cc)
                scores.append(score)
            # On prend le gagnant, c'est notre partie de cle
            lc[i] = carac[scores.index(max(scores))-1]
            # on cree le code final
            cons(lc)
         # style pour la fonction (purement cosmetique)
        if style:
            print(int((l+1)*100/(vitesse+3)),"%")
            if vitesse == 1:
                print("====="*(l+1)*2+"....."*(8-(l+1)*2))
            if vitesse == 2:
                print("===="*(l+1)*2+"...."*(10-(l+1)*2))
    score = setst(cc)
    print(cc+" :",score,": "+code)

On remarque qu’il est nécessaire d’avoir une liste pour modifier les éléments de la chaîne de caractères un par un à une position donnée.

Rien qu’avec ce script, on a pu augmenter considérablement le score des meilleurs Pokémons issus des attaques précédentes :

Avant :

u^KhxO_%#l » » »l » » »%%%Retour ligne automatique
Out[17] : 49.031613189324844

Après :

turboBoost(« u^KhxO_%#l »)Retour ligne automatique
25 %Retour ligne automatique
==========…………………………Retour ligne automatique
50 %Retour ligne automatique
====================………………..Retour ligne automatique
75 %Retour ligne automatique
==============================……….Retour ligne automatique
100 %Retour ligne automatique
========================================

u^KhxO_%#l » » »^ » »1″ » » : 49.29025926955508 : u^KhxO_%#l » » »d » »3″ » »

Cette optimisation du membre de droite nous permettait de faire la même chose pour le membre de gauche.

On a alors écrit une fonction utilisant notre fonction d’optimisation pour tester chaque caractères pour le membre de gauche en optimisant le score à chaque fois pour trouver le code parfait.

def chasseAuxPokemons(vitesse=1):
    # La vitesse 1 m'a prise 9h mais a bien fonctionnée
   
    lcp = ["!","!","!","!","!","!","!","!","!","!"]
    for l in range(vitesse+3):  
        for i in range(10):
            # On initialise tout
            global cc
            cons(lcp)
            scores = [0]
           
            for k in range(len(carac)):
                # On cree la liste de Pokemons avec les caractères
                lcp[i] = carac[k]
                cons(lcp)
                # On applique le booster de performances dessus (rapide et sans les barres de %)
                turboBoost(cc,1,0)
                # On recense les scores
                score = setst(cc)
                scores.append(score)
            # On prend le gagnant, c'est notre nouveau Pokemon
            lcp[i] = carac[scores.index(max(scores))-1]

Grace à cette fonction, on a pu obtenir le TOP résultat, le fameux 49,31730 :

code_h#^g0KuOS » » » » » » » »7u
Score49.31730339247606

On a donc envoyé des scores légèrement en dessous pour pouvoir nous qualifier dans les premiers.

Attaque n°10 : Force brute oui mais …

Nous avions exclus quelques caractères de cette force brute, on a donc réussi uniquement à obtenir le premier TOP résultat qui était déjà pris, le fameux 49,31730 mais pas au delà. Quand les premiers 49.319 et 49.32 ont commencé à sortir, nous avons compris que nous avions trop traîné, et qu’en intégrant d’autres caractères de la table ASCII nous aurions pu finir premier. Nous pensions que 49,31730 était le résultat optimal, nous n’avons pas testé davantage alors qu’on avait à priori la bonne méthode.

Mais notre échec relatif nous à gonflé à bloc pour le défi historique, que nous avons fait en python cela va de soit et sur PC car la mémoire de la NumWorks à la date d’octobre 2019 … enfin vous voyez de quoi on veut parler, sinon il suffit de lire ceci : Script qui refuse de s’exécuter sur la Numworks N0100 pour comprendre de quoi il retourne.

Conclusions

Nombres de tirages réalisés au total : entre 20 000 000 et 30 000 000 maximum.Retour ligne automatique
3 scripts tournaient au maximum en même temps, sur deux ordinateurs distincts.

L’année prochaine, il faudra compter sur nous ! Et cette fois-ci on commencera le défi le jour J et pas en retard. Pavel va devoir … heu non rien du tout, Pavel est très au dessus du niveau moyen. 😉

Nous remercions les organisateurs des sites tiplanet et planetcasio pour ce bon moment, cette recherche était passionnante, nous a réveillé la nuit (histoire de vérifier que les scripts tournaient bien) et maintenant les listes en python n’ont plus de secret pour nous.

Sur un autre sujet, nous supplions l’équipe de NumWorks d’augmenter la mémoire allouée aux scripts python sur la N0100 et la N0110. Ne pas pouvoir écrire un script de plus de 4ko est une absurdité !

Projets

Un générateur aléatoire de calcul mental en python pour…

Si les exercices répétitifs d’entrainement étaient tombés en disgrâce dans les précédents programmes scolaires, les nouveaux programmes de mathématiques les réintroduit, tout du moins en ce qui concerne les rituels de calcul mental en classe de seconde.

L’acquisition de ces réflexes est favorisée par la mise en place d’activités rituelles, notamment de calcul (mental ou réfléchi, numérique ou littéral). Elle est menée conjointement avec la résolution de problèmes motivants et substantiels, afin de stabiliser connaissances, méthodes et stratégies.

Extrait du programme de mathématiques, classe de seconde, 2019

Le script que nous avons conçu permet de pratiquer du calcul mental numérique, directement sur sa calculatrice, sans que les élèves n’aient la possibilité de tricher sur leur voisin et tout en proposant une correction personnalisée à chaque élève !

Un précédent script réalisé en mode texte

Un précédent script avait été codé en mode console, et il gérait un menu, lui aussi codé avec des print() et des input().

Fonctionnel, il manquait toutefois d’ergonomie, et le décalage du texte en temps réel dans le console pouvait perturber l’apprentissage.

Réécriture pour profiter de la couche graphique

Avec la sortie de la version 13.2.0 d’Espilon, le logiciel qui anime la NumWorks permet de disposer d’un tas python (heap) de 31ko et de fonctions natives tel que keydown() qui permet de récupérer le code de la touche pressée.

Une conception graphique minimaliste et intuitive a donc été pensée et codée pour sublimer ce générateur aléatoire de calculs.

Un script compatible avec notre menu graphique

En parallèle, nous avons développé Un menu en python pour les jeux sur la numworks et ce script exploite les possibilités de ce menu graphique.

RéglageOptions
ModeClassique , Rapide
Opération(s)+ , – , x , / , + – , x / , + – x , + – x /
Difficultéfacile, modéré, difficile, expert
Répétition20, 42, 50, 100, 120

Classique vs Rapide

Le mode classique interrompt le script et le chronomètre pour afficher si il y a une erreur, et indiquer quelle était la bonne réponse.

Le mode rapide est un mode d’entrainement intensif sans perturbation, que vous fassiez juste ou faux les calculs s’enchaînent et vous ne pourrez pas analyser vos erreurs.

Dans tous les cas, une fois la série de calcul terminée, un écran de synthèse résume le travail réalisé.

Quelques portions de code commentées

Le code qui génère le menu est documenté dans l’article associé : Un menu en python pour les jeux sur la numworks

Pour pouvoir être lu par notre script, la difficulté doit être représentée par un nombre.
Ainsi, on crée un code qui récupère un nombre en fonction de l’index de la première lettre dans un tableau.

["Difficulté", "  modéré", "difficile", "expert", "facile"],
dif = ["f", "m", "d", "e"].index(dif[0])

Ce dif sera un indice qui sera utilisé pour interroger la table de difficulté :

da = [1, 9]
db = [10, 19]
dc = [1, 10]
dd = [dc, [2, 10]]
diff = {"+": [[da] * 2, [db, da], [db, da], [db] * 2],
        "-": [[da] * 2, [db, da], [[10, 20], [10, 20]], [db] * 2],
        "*": [[dc] * 2, [dc] * 2, [[2, 10], [11, 20]], [[1, 25], [1, 25]]],
        "/": [dd, dd, dd, [[1, 20], [2, 20]]]}
def draw_line(x, y, clr, *ts) :

kandinsky ne dispose pas d’une fonction permettant de tracer des lignes. Or elle dispose d’une fonction qui allume un pixel d’une certaine couleur. Voici donc notre fonction pour tracer une ligne.

def draw_line(x, y, clr, *ts):
    for t in ts:
        d = list(map(lambda n: n // abs(n) if n != 0 else 0, t[0]))
        for i in range(t[1]):
            set_pixel(x + i * d[0], y + i * d[1], clr)
        x += i * d[0]
        y += i * d[1]

Quelques explications :
La fonction prend un couple (x,y) de départ, un couleur et des trajectoires (ts)

Ces trajectoires sont de la forme ([dx,dy],l)

d = list(map(lambda n: n // abs(n) if n != 0 else 0, t[0]))

Cette ligne permet d’obtenir une liste contenant uniquement des -1, 0, 1.

Améliorations possibles

Un mode d’apprentissage automatique si on dispose d’une mémoire de stockage permanente utilisable par python.

Un mode examen (Nécessite de « crypter » qq portions du code) : Le professeur génère un code unique, l’élève saisit ce code et fait une série aléatoire mais paramétré par le professeur. Un bon élève doué en programmation pourra toutefois bypasser le code et avoir tout juste sans rien faire !

Télécharger cette application

En l’état actuel, vous ne pouvez pas tester ce script directement depuis le workshop, car l’équipe de développement de la NumWorks n’a pas encore mappé les touches du clavier de l’ordinateur sur leur simulateur en ligne.

Quelques touches seulement sont actives sur le workshop, les 4 flèches, la touche Entrée et les touches Retour Arrière, Majuscule.

Ceci vous permet donc uniquement de tester le menu de cette application mais pour tester le générateur de calcul, il faudra charger le script sur la calculatrice.

Calculez bien !

Vous pouvez réagir à cet article sur le topic tiplanet.org de cette news : 
Snake, calcul mental, et interface lancement jeux Python

Quelques captures d’écrans

Projets

Le jeu du pendu en Python

Le Pendu est un jeu consistant à trouver un mot en devinant quelles sont les lettres qui le composent. Dans cet article, nous allons analyser ensemble un jeu du Pendu, fait en Python. Contrairement aux apparences, ce programme peut être très dur a réaliser, surtout pour les non-initiés.

L’article comme le code produit ci-dessous sont largement améliorable. Ce jeu inclus quelques petits bugs non résolus.

Introduction

Tout d’abord, qu’est ce qu’on attend d’un jeu du Pendu, en Python :

  • L’ordinateur choisit un mot au hasard dans une liste, un mot de huit lettres maximum. – Le joueur tente de trouver les lettres composant le mot.
  • À chaque coup, il saisit une lettre.
  • Si la lettre figure dans le mot, l’ordinateur affiche le mot avec les lettres déjà trouvées. -Celles qui ne le sont pas encore sont remplacées par des barres (_).
  • Le joueur a 6 chances. Au delà, il a perdu.

Le début du code

 print("Bienvenue dans le jeu du Pendu")
play=int(input("Tape 1 si tu veux jouer ! \n "))
if play == 1 :  
    prénom=input("Quel est ton nom ?")
    print("\n")
    print("Salut", prénom)
    import random
    liste_mots=["laitue", "hareng", "jambon", "pharynx", "phoque", "langue",
                "stylo","agent","fromage","whisky","billet","boyaux",
                "laser","joystick","crane","joyeux","cahier","camping","argent",
                "rivage","physique",]

Dans cette première partie de code, il ne faut SURTOUT pas oublier le import random, car on utilise beaucoup d’aléatoire dans ce petit jeu.
Sinon, par grand chose d’important a relever, a part la liste de mot que le jeu va utiliser pour le jeu.

Initialisations

 score = 0
    print("Tu as 6 vies")
    print("\n")
    vie = 6

La non plus, c’est pas super intéressant…
On définit juste les variables des vies et du score

while play == 1 :
        vie = 6
        mot=(liste_mots[random.randint(0,21)])
        longueur=len(mot)
        barre=["_ "]
        barre=barre*longueur
        grandeur=longueur

Attention : Ça se corse…
Avec la ligne « mot=(liste_mots[random.randint(0,21)]) », le programme choisi un mot au hasard dans la liste de mots du début.

Dans le jeu du Pendu, les lettres qui n’ont pas été trouvés sont remplacées par des barres (_), et c’est ce qu’on règle cette portion :
longueur=len(mot) calcule le nombre de lettres du mot choisi, puis barre=barre*longueur affiche le nombre de « _ » en fonction du nombre de lettres.
On l’affiche sous forme de liste, car ce sera beaucoup plus facile pour la suite du programme.
La variable « grandeur » est la même que « longueur », sauf que « grandeur » va (aussi) servir pour la suite du programme

Le jeu

  while vie!=0 and grandeur!=0 :
            lettre_choisi = input("Choisi une lettre  ")
            print("\n")
            if lettre_choisi in mot :
                print("Bravo!")
                if lettre_choisi in barre:
                    print ("Tu l'as déja dit !")
                    resultat = ' '.join(barre)
                    print(resultat)
                else:
                    position=int(mot.index(lettre_choisi))
                    barre.pop(position)
                    barre.insert(position,lettre_choisi)
                    resultat = ' '.join(barre)
                    print(resultat)
                    grandeur=grandeur-1

Tiens tiens, on retrouve « grandeur » !
En fait, grandeur sert a dire au programme quand le joueur a trouvé toute les lettres, car si le mot fait par exemple 7 lettres, on pourra logiquement trouver la bonne lettre 7 fois.
Ensuite, le programme nous demande de choisir une lettre (désolé pour la faute d’orthographe « lettre_choisi » ), et si la lettre est dans le mot, alors le programme continue.

Voila la principale difficulté du programme :L’affichage du mot
En effet, il faut afficher le mot avec toutes les lettres qu’on a trouvées.
Tout d’abord, on repére la position de la lettre trouvée avec « position=int(mot.index(lettre_choisi)) », puis on insère la lettre choisie dans la liste « barre » (_ _ _ _ _ _ _) a la bonne position. On supprime aussi une (_) pour que le mot reste a la bonne longueur avec « barre.pop(position) ».
Enfin, on transforme la liste en chaîne de caractère pour que l’affichage soit plus clair, pour finir dans la variable « résultat »

Avant de continuer, je voudrai vous montrer ce qui se passe si on met une lettre qu’on a déjà mise :
C’est exactement comme auparavant, sauf que grandeur ne diminue pas, et qu’il n’y a pas besoin d’afficher une lettre de plus, car elle a déjà été affichée

Trouver toutes ces formules m’ont causé BEAUCOUP de problèmes, donc j’espère que ce sera clair pour vous.

Sinon, si la lettre choisie n’est pas dans le mot, alors :

            else:
                print("Raté")
                if grandeur==longueur :
                    print(longueur*"_ ")
                else:
                    print (resultat)
                vie=vie-1
                print("Il te reste",vie,"vies")
                print("\n")

Sur cette partie, si le joueur se trompe des la première lettre, le programme ne peut pas afficher la variable « résultat », car elle n’existe pas encore. Le programme affiche donc seulement le mot sous forme de barre (_). Dans tout les cas, une vie est retirée.

La fin du jeu

   if vie==0 :
            print("Tu as perdu")
        elif grandeur==0 :
            print("Bravo ! Tu as trouvé le mot !")
            score=score+5
            print("Tu a gagné 5 points !")
        replay=int(input("Tape 1 pour rejouer, et sur 2 si tu veux quitter le jeu   "))
        if replay != 1 :
            break
    print(prénom,"vous avez un score de ",score)

Evidemment, si vos vies tombent à 0, vous perdez.
Si vous gagnez, vous gagnez 5 points. A 50 points vous avez une surprise….
Vous pouvez rejouer en tapant 1, et vous quittez le programme en tapant 2

Voila, j’espère vous avoir aidés a comprendre ce petit programme !
N’hésitez pas a le personnaliser, avec vos propres fonctions, ou avec quelques easters eggs sympathiques !

Le code entier est téléchargeable en bas de la page !

Tutoriels

Se monter un mini PC pour un usage bureautique

Il existe sur le marché des mini pc dont le volume est nettement inférieur à un 1 litre, qui utilisent des composants d’ordinateurs portables et qui sont néanmoins capables de fournir des performances comparables à une unité centrale classique.

Un mini PC c’est quoi ?

Un mini PC est un ordinateur de petit taille, conçu pour des usages classiques tel que la bureautique ou la navigation sur internet.

Le mac mini, le précurseur

Apple a été un précurseur dans le domaine des minis pc largement diffusé avec le mac mini lancé en 2005.

Le NUC, la version d’intel du mini PC

Conçu par Intel, les PC NUC (Next Unit of Computing) sont parmi les plus petits PC disponibles.

Ils utilisent des composants issue de l’univers des ordinateurs portables (mémoire vive au format SODIMM, disques 2.5 pouces, processeur basse consommation) et proposent néanmoins des performances de premier ordre.

Le plus gros avantage d’un mini pc est son faible encombrement comme le montre l’image ci-dessous.

Avantages et inconvenants d’un NUC

Mini PCUnité centrale classique
AvantagesFaible encombrement 
Faible consommation énergétique 
Nomade, peut-être déplacé facilement 
Esthétique 
Montage très facile
Connectivité riche 
Possibilité d’y ajouter une carte graphique 
Evolutif 
Rapport prix / performance souvent favorable 
Réparable facilement
InconvenantsPuissance plus faible du processeur 
Connectivité limitée 
Peu adapté aux jeux vidéos 
Peu évolutif 
Rapport prix / performance souvent défavorable 
Peu réparable, en cas de panne pas de pièces détachées
Encombrement 
Bruyante si refroidissement mal conçu 
Consommation énergétique plus élevée

Commander ses composants

Version 1 : La configuration la moins chère possible

ComposantMarque-ModèlePrix juillet 2019
ÉcranHP 22w Ecran PC Full HD 21,5″ Retour ligne manuel
autres écrans IPS
80€
Boîtier + Alim + Carte mère + ProcesseurIntel NUC BOXNUC6CAYH145€
Mémoire DDR3L SODIMCrucial 8Go DDR3L SODIMM36€
Disque dur SSDCrucial BX500 240 Go Retour ligne manuel
autres SSD SATA
29€
Clavier- SourisMicrosoft Kit Clavier + Souris Desktop 900 Retour ligne manuel
Autres kits clavier + souris
40€

Une configuration complète pour 330€ environ. Alors certes le processeur n’est pas un foudre de guerre, mais il est très économe en électricité.

Accompagné d’un SSD correct et d’une quantité de mémoire vive adéquate, il remplira pleinement son rôle et probablement mieux qu’une configuration du supermarché équipé d’un disque dur mécanique.

Par contre, il n’est ni évolutif ni adapté aux jeux vidéos.

Version 2 : Un choix équilibré comparable à une plateforme Ryzen 2200G

ComposantMarque-ModèlePrix juillet 2019
ÉcranBenQ GW2480 IPS Retour ligne manuel
autres écrans IPS
118€
Boîtier + Alim + Carte mère + ProcesseurIntel NUC NUC8i3BEH Retour ligne manuel
ou autres NUC
279 €
Mémoire DDR4 SODIMCrucial 16Go Kit (8Go x2) SODIMM73€
Disque dur SSDCrucial P1 500Go M.2 PCIe63€
Clavier- SourisMicrosoft Kit Clavier + Souris Desktop 900 Retour ligne manuel
Autres kits clavier + souris
40€

Cette configuration d’un coût total d’environ 600€ présente sensiblement les performance de l’unité centrale proposée dans ce tutoriel :

Assembler un ordinateur personnel pour la première fois

Les écrans sélectionnés ont une fixation VESA 100, ce qui permettra de monter le NUC derrière l’écran.

En attendant la livraison

En attendant la livraison du Intel NUC NUC8i3BEH, il convient de récupérer les notices et pilotes pour faire marcher le matériel.

Les notices seront lues avant la livraison pour gagner du temps pendant le montage, les pilotes eux seront conservés sur une clé USB et ils seront installés après le système d’exploitation

Monter la configuration

Le NUC, le SSD M.2 et les 16 GO de DDR4

1. On ouvre le NUC avec un simple tournevis

2. On installe le SSD M.2 sans forcer

3. On installe les barrettes de DDR4 au format SODIMM

4. On referme le boitier avec le tounevis.

Les images sont issues de la documentation officielle d’Intel.

Vérifier les paramètres du BIOS

Sur le système Intel NUC NUC8i3BEH on peut accéder au BIOS en appuyant sur la touche F2 durant la séquence de boot.

Accéder au BIOS permet de vérifier que tous les composants sont bien reconnus, que les températures de la carte mère et du processeur ne sont pas excessives (sinon le montage est incorrect) et les utilisateurs les plus avertis peuvent y modifier les réglages de la mémoire vive ou procéder à l’overclocking leur processeur.

Installer un système d’exploitation

Pour créer une clé USB bootable sur windows 10 on utilisera l’outil proposé par mircosoft, mais on peut aussi décider d’installer une distribution linux, ubuntu étant la plus connue.

Si aucun système n’est installé, le NUC démarrera tout seul sur la clé USB et l’installation de windows 10 sera très rapide …

Tutoriels

Assembler un ordinateur personnel pour la première fois

Lycéen intégrant une première générale spécialité NSI, je me suis rendu compte que je ne possédais plus d’ordinateur personnel, ce qui est embêtant si on ne veut pas trop squatter l’ordinateur familial.

Quitte à acheter un ordinateur, autant le monter moi même, cette expérience est profitable.

Définir son besoin

Cet ordinateur sera utilisé pour usage bureautique classique, et éventuellement pour faire du montage vidéo, de la composition musicale. Intéressé par l’animation 2d et 3d, j’aimerai en tester la modélisation.

Pour la taille de l’unité centrale, un emplacement prévu à cet effet dans mon bureau mesure 48 cm de hauteur, 23 cm de largeur et 50 cm de longueur.

Choisir ses composants

Pourquoi un SSD plutôt qu’un HDD

Un disque SSD possède une mémoire flash qui lui permet d’être plus rapide, vivre plus longtemps, consommer moins et les données ne disparaissent pas quand elle est mise hors tension. De plus, si on se penche sur L’IOPS (Input/output per second, représentant la performance des disques), le disque SSD fait du 90 000 IOPS et le disque Hdd fait seulement du 50 IOPS soit le disque SSD est 1800 fois plus performant !

Pourquoi un processeur Ryzen plutôt qu’un processeur Core i3/i5 en 2019

 Le processeur Ryzen 3 2200G possède une meilleure fréquence (vitesse) et plus de cœurs par rapport à la puce concurrente équivalente. Le Ryzen peut aussi supporter la vitesse Turbo alors que le Core i3 en est incapable. En plus, le Core i3 fait presque le double du prix du Ryzen (190€-85€) alors qu’il n’est en rien 2 fois plus puissant.

Pourquoi privilégier la quantité de mémoire vive et le SSD à la performance du processeur

Allant plus utiliser des logiciels de bureau et n’étant pas un utilisateur et un informaticien aguerri, ça serait inutile de prendre un processeur haute gamme alors qu’il y aura très peu de chance que je l’utilise à pleine capacité. Il est donc plus pratique d’augmenter la mémoire, moi qui vais utiliser la plupart du temps des logiciels. De plus, s’il n’y a pas assez de DDR (Double data rate), cela fait ramer l’ordinateur, peu importe le processeur.

Commander ses composants

ComposantMarque-ModèlePrix juillet 2019
ÉcranLG24MP88HV-S IPS135€
BoîtierCorsair Carbide 88R48 €
AlimentationCorsair VS 45040€
Mémoire DDRCorsair Vengeance LPX 8 Go40€
Disque dur SSDCrucial MX500 500 Go70€
Carte mèreMSI B450M Mortar105€
ProcesseurAMD Ryzen 32200G88€
Clavier- SourisMicrosoft Kit Clavier AZERTY + Souris Sans fil Desktop 900 USB40€

En attendant la livraison

En attendant la livraison, il convient de récupérer les notices et pilotes pour faire marcher le matériel. Les notices seront lues avant la livraison pour gagner du temps pendant le montage, les pilotes eux seront conservés en lieu sur et il seront installés après le système d’exploitation

ComposantMarque-ModèleFiche produitDocumentation
ÉcranLG24MP88HV-S IPSliendocs pilotes
BoîtierCorsair Carbide 88Rliendocs
AlimentationCorsair VS 450liendocs
Mémoire DDRCorsair Vengeance LPX 8 Goliendocs
Disque dur SSDCrucial MX500 500 Goliendocs pilotes
Carte mèreMSI B450M Mortarliendoc pilotes
ProcesseurAMD Ryzen 32200Glienpilotes
Clavier- SourisMicrosoft Kit Clavier AZERTY + Souris Sans fil Desktop 900 USBlien directdocs pilotes

Durant le transit des colis :

On prépare la clé bootable du système d’exploitation

Outil a télécharger ici

Monter la configuration

Après avoir lu attentivement les notices de la carte mère et celle du boitier, il est utile de lire quelques tutoriels. En lire plusieurs permet de bien comprendre ce qu’il va falloir faire :

GUIDE DE MONTAGE PC Retour ligne automatique
Eviter – Les erreurs de montage PC Retour ligne automatique
Guide de montage PC, Monter soi-même son PC Retour ligne automatique
MONTER SON PC LE GUIDE ULTIME Retour ligne automatique
guide-montage-pc par ldlc Retour ligne automatique
TUTO MSI – Installer un processeur AMD AM4 Retour ligne automatique
Chaîne YouTube MSI France

Nous passons donc maintenant au montage :

1-Mettre le processeur sur la carte mère

2-Mettre le ventirad sur la carte mère (la pâte thermique à déjà été appliquée, inutile d’en remettre)

3-Mettre la DDR sur la carte mère

4-Installer la carte mère dans le boitier

5-Installer l’alimentation dans le boîtier

6-Installer le disque SSD dans le boîtier

7-Branchement et « câble management » (si on peut appeler ma configuration comme ça 😅)

Démarrer une première fois le PC

À l’allumage du pc, si ce dernier ne « s’allume pas », ne paniquez pas et pensez à revoir des petits détails tout simples comme le brancher sur la bonne prise hdmi ( oui c’est du vécu…. 😅)

Inspecter le BIOS

Après avoir allumé l’ordinateur, on inspecte le BIOS afin de vérifier la température de la carte mère et du processeur. Il faut faire « Supr » au démarrage et on a accès au BIOS. La touche à utiliser dépend de la carte mère, lisez la notice !

Installer un système d’exploitation

Avant d’installer le système d’exploitation (ici Windows 10), il faut créer une clé bootable (créé plus tôt) , que vous pouvez faire ici. Une fois cela fait, allumez votre pc (branché dans la bonne prise hdmi… 😅) avec la clé bootable dedans. Après avoir répondu à plein de questions de Windows et avoir rentré votre clé d’activation, votre ordi est fin prêt à être utilisé !