Questions/Réponses sur le cours

I. Présentation

Sur cette page, j'essaie de recenser les différentes questions d'intérêt général qui ont pu m'être posées pendant la phase de lecture du cours.

Les questions sont regroupées d'abord par période de mise à jour, puis par partie. Le but est que vous retrouviez facilement, d'une fois sur l'autre, les questions/réponses que j'ai rajoutées depuis votre dernière visite.

II. Les Questions, ... et les réponses

PartieLocalisationQuestionRéponse
25 mai 2020
ToutIl semblerait que le cours traite un certain nombre de points qui ne sont pas au programme de Terminale. Est-ce normal ?En effet, le cours correspond au programme du DIU Enseigner l'Informatique au Lycée, qui a été conçu pour vous donner un début de vraie formation en informatique, avec du recul par rapport à la matière. Nous pourrons discuter plus précisément pendant la semaine de cours de ce qui relève directement du programme de NSI.
I.A Bases de données relationnellesExercice 2Les thèmes sont directement rattachés au jeu. Du coup, n'a-t-on pas la dépendance fonctionnelle nomJeu → thème ?Non. En effet, pour qu'il y ait dépendance fonctionnelle de nomJeu vers thème, il faudrait qu'on puisse définir une fonction qui, à un nomJeu associe son éventuel thème. Or ici, on ne peut avoir une telle fonction puisque que pour un nomJeu donné, il peut y avoir plusieurs images.
I.A Bases de données relationnellesExercice 8Pourquoi tant de redondance, avec par exemple 4 tuples pour le jeu Les chevaliers de la table ronde ?Parce que sinon, on perd de l'information. Prenons l'exemple des chevaliers de la table ronde. Imaginons les différentes requêtes suivantes :
  • trouver un jeu de Bruno Cathala sur le Moyen-Âge ;
  • trouver un jeu de Serge Laget sur le Moyen-Âge ;
  • trouver un jeu de Bruno Cathala sur la légende Arthurienne ;
  • trouver un jeu de Serge Laget sur la légende Arthurienne.
Dans tous les cas, on doit pouvoir trouver "Les chevaliers de la Table Ronde". Il faut donc bien les 4 tuples.
I.A Bases de données relationnellesDépendances fonctionnellesEst-ce qu'on se base réellement sur les enregistrements de la table pour définir ces dépendances (c'est ce que tu dis dans la définition) et non sur la logique ? Parce que si j'ai une table avec un champ prenomAuteur, nomAuteur, que tous les 'Alain ' sont français, et que tous les autres auteurs sont allemands, on va établir une df prenomAuteur → nationalitéAuteur. or lors d'un ajout d'un nouvel enregistrement d'un robert français, cette dépendance ne sera alors plus vraiesi je reprends ma définition de dépendance fonctionnelle, je dis : "sur l'ensemble des enregistrements que peut contenir la table", et non "sur l'ensemble des enregistrements que contient la table". Autrement dit, on raisonne bien sur tout ce qui est envisageable. Et non sur le contenu de la table à un instant T. D'ailleurs, pour établir une dépendance fonctionnelle, on n'a pas besoin d'avoir une table. Un schéma de relation suffit.
I.A Bases de données relationnellesVocabulaire et théorietu dis que les attributs atomiques, c'est mieux pour les recherches, ok je comprends mais ça donne pas mal de redondance, sans connaitre de théorie sur les BDD j'aurai mis un tableau pour les thèmes (et si on s'autorise pas les structures algo, un texte sous forme de tableau à parser ensuite).Les SGBD permettent d'optimiser énormément le traitement des requêtes, notamment en utilisant des index sur les champs pertinents. Un traitement exécuté par le SGBD sera bien plus rapide qu'un traitement exécuté en Python par exemple. Par ailleurs, si l'on sort de l'atomicité, il deviendra beaucoup plus difficile d'étendre les fonctionnalités de la base (nouvelles requêtes, etc.) car celle-ci aura une structure bien trop ad hoc au cahier des charges initial.
I.A Bases de données relationnellesFermeture transitiveJ'ai du mal à voir comment construire l'ensemble de toutes les relations obtenues par transitivité, réflexivité et augmentation.C'est effectivement quelque chose qui est hors programme NSI, et même plutôt hors programme DIU. Mais intuitivement, voilà comment on obtient la fermeture d'un ensemble de dépendances fonctionnelles :
fermeture(DF):

    ANCIEN_DF = {}

    NOUVEAU_DF = DF

    tant que ANCIEN_DF != NOUVEAU_DF:

        ANCIEN_DF = NOUVEAU_DF

        NOUVEAU_DF = appliquerTransformationsBase(ANCIEN_DF)

    fin tant que

    retourner NOUVEAU_DF
II.A SQLComment fait-on pour installer SQLite sous Windows 10 ?On commence par essayer de passer à autre chose que Windows. Sinon, on peut toujours se rendre à l'adresse suivante : https://www.configserverfirewall.com/windows-10/install-sqlite3-on-windows-10/.
II.A SQLExercice 8Je n'ai trouvé nulle part la trace de la table parleDe mentionnéee dans la correction;Si si, la table est mentionnée... dans la correction de l'exercice 5 du cours sur la notion de modèle conceptuel. Mais effectivement, le code de création de la table en question n'est pas donné. C'est pourquoi il est marqué, en préambule de cet exercice, que la requête est à faire sur papier.
II.A SQLIl manque des ";" à la fin des requêtes.Non, le ";" fait partie de la syntaxe de l'application SQLite, pas de la requête.
II.A SQLExercice 7Dans la correction, il y a un ORDER BY, or ce n'est pas demandé dans l'énoncé.Exact, mais si l'on se met à la place d'un utilisateur, il est impensable que le résultat d'une requête soit affiché dans un ordre non compréhensible. Il faut donc considérer qu'une requête devrait toujours avoir un ORDER BY.
II.B Interaction Python/Base de donnéesexecutemany(), c'est spécifique à sqlite ?Oui.
II.B Interaction Python/Base de donnéesPartie IV.CIl semblerait qu'il y ait une virule en trop à la fin de la ligne suivante :
curseur = connexion.execute('''SELECT nomEditeur
                               FROM editeur
                               WHERE upper(nationaliteEditeur) = upper(?)
                               ORDER BY nomEditeur''',
                            (nationalite,))
      
Non, cette virgule est nécessaire car execute attend en deuxième paramètre un tuple, réduit à un seul élément ici. Si on ne met pas cette virgule, l'analyseur syntaxique de Python interprétera (nationalite) comme la valeur simple nationalite et pas comme un tuple.
II.B Interaction Python/Base de donnéesJ'ai une erreur d'encodage des caractères signaléeSuivant votre installation de Python, de SQLite et les outils que vous utilisez, il se peut que les caractères français (notamment le "ç") posent un problème. Modifiez les scripts de remplissage de la table et supprimer ces caractères pour éviter de rester bloqué.
II.B Interaction Python/Base de donnéesLorsque que je lance la requête :
INSERT INTO Illustrateur values (7,'Cochard','David','Française')
rien ne laisse indiquer qu'il y a eu un problème. Mais après, quand je lance la requête : select * from Illustrateur , il n'y a pas de ligne 7...

Par contre, lorsque je fais les mêmes manip' depuis sqlite3, j'ai bien cette nouvelle ligne.
Il ne faut pas oublier le "commit" puis le "close" sur l'objet "connexion".
II.C Programmation Web côté serveurPartie III.Aje ne comprends pas la phrase : "On peut vérifier le code html généré en lançant directement le programme python depuis la ligne de commandeTout simplement, depuis la ligne de commande, on peut exécuter le programme Python sensé générer une page sur le serveur : python essai.py. S'affiche alors le code html de la page qui serait normalement envoyée au navigateur :
<html>
  <head>
    <title>Essai</title>
  </head>

  <body>
    <h1>Essai</h1>
    <p>Voici un exemple de page html.</p>
  </body>
</html>
III.E Programmation parallèlePartie II. En PythonPeut-on passer des paramètre à la méthode "traitementA" ?On ne peut pas passer des paramètres à "traitementA", puisqu'ici "traitementA" est une fonction et non un appel de fonction (c.f. la partie sur la programmation fonctionnelle). Pour avoir un traitement paramétré, on peut imaginer au moins 3 façons de faire :
  • utiliser une variable globale. Mais ça n'est pas très propre ;
  • utiliser une classe ; le paramètre est alors stocké dans une variable d'instance, et sera utilisé dans la méthode. On se rapproche alors du Design Pattern "Commande" (qui, en résumé, consiste à dire que l'on va utiliser des objets pour représenter des traitements) ;
  • utiliser une fonction (qui prend le paramètre de "paramétrage") qui renvoie une fonction (qui dépend du paramètre de paramétrage).
Le petit exemple suivant éclairera certainement un peu plus la dernière solution proposée :
def f(x):
    return lambda y: x + y

g1 = f(2)
g2 = f(3)

print(g1(4))
print(g2(4))
Ici, la fonction f renvoie une fonction qui ajoute x (paramètre passé à f) à y (paramètre passé à la fonction renvoyée par f). Ainsi, g1 est la fonction qui ajoute 2 à son paramètre ; g2 est la fonction qui ajoute 3 à son paramètre. En Haskell, ça s'écrirait plus simplement ainsi :
f x y = x + y

g1 = f 2

g2 = f 3
III.E Programmation parallèlePartie III. Données partagéesY a-t-il un moyen d'éviter le 'global file' dans la fonction consommer, ce qui ne semble pas très propre ? Naïvement avec un "def consommer(self, file):" plutôt que "def consommer(self):". De plus, histoire qu'au moins lors de l'appel on voit ce qu'on passe en paramètre, ne peut-on pas faire un return new_file dans la fonction "consommer" et file = consommateurA.consommer(file) dans la fonction "moteur" ?Effectivement, le "global file", n'est pas génial. Mais... c'était pour éviter d'avoir un code trop compliqué, et pour bien montrer que tout le monde travaille sur la même file. D'ailleurs, si j'avais défini un consommer(self, file), il aurait fallu que les méthodes "moteurConsommateurA" et "moteurConsommateurB" passent la file en paramètre de consommer(), et donc... qu'elles déclarent également un "global file". Une solution plus propre et relativement simple aurait été de rajouter un paramètre "file" aux constructeurs des classes Producteur et Consommateur. Par contre, la solution de créer une nouvelle file n'est pas du tout valide. En effet, on travail bien sur un objet "file" partagé par les processus. Si chaque processus se met à créer sa propre copie, plus rien ne va.
26 mai 2020
IV.B ListesRéimplantation de map et filterQue préfères-tu que l'on utilise, les compréhensions ou les fonctions map et filter ?Je n'ai pas vraiment de préférence. Je trouve la version "compréhension" très élégante, proche des maths enseignées à mon époque (mais je ne sais pas si ça s'enseigne encore, la définition d'ensemble en compréhension...), mais moins universelle en informatique. Je pense qu'il est intéressant de connaître les 2. Pour de futurs informaticiens, la version "map" et "filter" est à privilégier, mais ce n'est probablement qu'une partie mineure des élèves suivant NSI. C'est cependant une illustration assez intéressante de l'intérêt du fonctionnel, donc il ne faut pas passer à côté quand même.