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
Partie | Localisation | Question | Réponse |
---|---|---|---|
25 mai 2020 | |||
Tout | Il 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 relationnelles | Exercice 2 | Les 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 relationnelles | Exercice 8 | Pourquoi 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 :
|
I.A Bases de données relationnelles | Dépendances fonctionnelles | Est-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 vraie | si 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 relationnelles | Vocabulaire et théorie | tu 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 relationnelles | Fermeture transitive | J'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 SQL | Comment 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 SQL | Exercice 8 | Je 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 SQL | Il 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 SQL | Exercice 7 | Dans 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ées | executemany(), c'est spécifique à sqlite ? | Oui. | |
II.B Interaction Python/Base de données | Partie IV.C | Il 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ées | J'ai une erreur d'encodage des caractères signalée | Suivant 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ées | Lorsque 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é serveur | Partie III.A | je 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 commande | Tout 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èle | Partie II. En Python | Peut-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 :
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èle | Partie III. Données partagées | Y 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 | 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 Listes | Réimplantation de map et filter | Que 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. |