ERG::Code-2019-1
Introduction
Ce cours est destiné aux étudiant.e.s de BAC2. Cette année, nous nous concentrons sur le rapport du numérique au texte. Les interactions textuelles avec les machines, le code générateur de poésie, le code en tant que poésie, le code secret, le code caché. Nous serons amenés à créer des poésies algorithmiques, des générateurs de textes, des machines à plagier, des bots twitter, des ordinateurs qui parlent. À travers différentes expérimentations menées en atelier, nous aborderons plusieurs langages de programmation, concepts informatiques et exemples dans les champs de l'art, du design, de l'histoire de l'informatique et autres.
Pages des étudiants
Séances
14/10/2019: écriture de programme Python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Un script qui suit l'idée du livre dont vous êtes le héros, avec des réponses OUI on NON. Ex: La voiture bouge OU le cheval rose? réponse:
#Le programme donne le choix entre le vers n°1 ou le vers n°3
#Selon le choix de l'utilisateur, il affiche le vers 1 et le vers 2 ou le vers 3 et le vers 4
#Le choix est gardé en mémoire pour afficher le poème résultant à la fin du script
#1 charger le poème dans une variable
with open('poeme', 'r') as tete:
poeme = tete.read()
'''
La voiture bouge
Le pied crisse
Le ceval rose
Perdant son ame
Qu'etait la vie
Le flux cosmique
La nuit est loin,
Le ciel est gris
Je suis tombee
Tout en hauteur
5lK5J 8.21JsMc1Js
j'aime la nuit
Il saigne peu,
Et s'Vk va tot
Un jour se leve
Les oiseaux chantent
'''
print(poeme)
'''
0 1 2 3 4 5 6 7
['La voiture bouge', 'Le pied crisse', 'Le ceval rose', 'La voiture bouge', 'Le pied crisse', 'Le ceval rose', 'Le pied crisse', 'Le ceval rose']
['v', 'o', 'i', 't', 'u', 'r', 'e']
'''
#2 décomposer le poème en lignes (et stocker le résultat dans un tableau)
lignes = poeme.splitlines()
'''
print("Choisissez entre ces deux vers:")
print(" Pour "+lignes[0]+" tapez 1")
print(" Pour "+lignes[2]+" tapez 2")
#choix = input()
choix = int(raw_input())
if(choix == 1):
print(lignes[0])
print(lignes[1])
else:
print(lignes[2])
print(lignes[3])
print("Choisissez entre ces deux vers:")
print(" Pour "+lignes[4]+" tapez 1")
print(" Pour "+lignes[6]+" tapez 2")
#choix = input()
choix = int(raw_input())
if(choix == 1):
print(lignes[4])
print(lignes[5])
else:
print(lignes[6])
print(lignes[7])
'''
reponses = ''
for compteur in range(0, len(lignes), 4):
print("Choisissez entre ces deux vers:")
print(" Pour "+lignes[compteur]+" tapez 1")
print(" Pour "+lignes[compteur+2]+" tapez 2")
#choix = input()
choix = int(raw_input())
if(choix == 1):
reponses = reponses + str(choix)
print(lignes[compteur])
print(lignes[compteur + 1])
else:
reponses = reponses + str(choix)
print(lignes[compteur + 2])
print(lignes[compteur + 3])
#reponses = 1212
'''
0 1 2 3
1 2 1 2
0 1 6 7 8 9 14 15
'''
print(reponses)
for compteur in range(0, len(reponses)):
choix = int(reponses[compteur])
#on affiche les lignes correspondantes
if(choix == 1):
#print(lignes[0])
#print(lignes[1])
#print(lignes[4])
#print(lignes[5])
print(lignes[compteur * 4])
print(lignes[compteur * 4 + 1])
else:
#print(lignes[2])
#print(lignes[3])
#print(lignes[6])
#print(lignes[7])
print(lignes[compteur * 4 + 2])
print(lignes[compteur * 4 + 3])
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Le script decidera quelle phrase va le mieux avec la personalité de l'utilisateur en fonction de sa ville de naissance (addition de la valeur de chaque lettre). Si la valeur numérique de la ville est plus grande que le nombre de phrases disponibles, le compteur 'recommence'. Si l'utilisateur veut connaitre son mot préféré, il peut le faire en fonction de son âge multiplié par sa ville.
import string
import unicodedata
#1 charger le poème dans une variable
with open('poeme', 'r') as tete:
poeme = tete.read()
lignes = poeme.splitlines()
print("Où es-tu né(e)?")
#ville = input()
ville = raw_input()
ville = unicodedata.normalize('NFD', unicode(ville, 'utf-8')).encode('ascii', 'ignore')
ville = ville.lower()
asciiChars = list(string.ascii_lowercase)
'''
bruxelles
['a', 'b'...]
'''
nbreVille = 0
for compteur in range(0, len(ville)):
searchLettre = ville[compteur]
for compteur2 in range(0, len(asciiChars)):
laLettreQuonRegarde = asciiChars[compteur2]
if(laLettreQuonRegarde == searchLettre):
nbreVille = nbreVille + compteur2
break
'''
while nbreVille >= len(lignes):
nouveauNombre = 0
for compteur in range(0, len(str(nbrVille))):
nouveauNombre = nouveauNombre + int(nbrVille[compteur])
nbreVille = nouveauNombre
'''
nbreVille = nbreVille % len(ville)
print(lignes[nbreVille])
07/10/2019: introduction Python
Boucles et variables
#!/usr/bin/env python
#!python
# -*- coding: utf-8 -*-
'''
Un programme qui demande le prenom de l'utilisateur
dlkdsqjdsq
'''
print("Qui est-ce?")
#input()
bloup = raw_input()
'''
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
print("Salut "+bloup)
'''
#boucle infinie
'''while True:
print("Salut "+bloup)'''
#boucle while avec compteur
'''
compteur = 0
while compteur < 10:
print("Salut "+bloup)
compteur = compteur + 1
'''
#boucle for
'''
for compteur in range(0, 100):
print("Salut "+bloup+" "+str(compteur))
'''
'''
0 1 2 3 4 5
[L | i | o | n | e | l]
'''
#print(bloup[2])
#le nombre de cases (de caracteres) de la variable bloup
print(len(bloup))
Conditions
#!/usr/bin/env python
# coding: utf-8
'''
<
>
>=
<=
==
!=
'''
print("Quel est ton age?")
age = int(raw_input())
if age < 10:
for compteur in range(0, age):
print(compteur)
if compteur == 5:
print("déjà 5 ans!")
print "Oh ben t'es tout petit"
elif age < 20:
print("Oh ben t'es tout jeune")
elif age < 30:
print("Oh ben t'es presque vieux")
else:
print "Oh ben t'es tout vieux"
print("Tu vas mourir dans "+str(88 - age))
Exercice
Écrire un scénario de script python pour traiter le poème collectif; mettre ce scénario dans la page personnelle sur le wiki.
30/09/2019 :introduction langages
Poésie binaire: suite
1001100 1100001 1011111 1110110 1101111 1101001 1110100 1110101 1110010 1100101 1011111 1100010 1101111 1110101 1100111 1100101 1001100 1100101 1011111 1110000 1101001 1100101 1100100 1011111 1100011 1110010 1101001 1110011 1110011 1100101 1001100 1100101 0100000 1100011 1100101 1110110 1100001 1101100 0100000 1110010 1101111 1110011 1100101 1010000 1100101 1110010 1100100 1100001 1101110 1110100 0100000 1110011 1101111 1101110 0100000 1100001 1101101 1100101 1010001 1110101 0100111 1100101 1110100 1100001 1101001 1110100 0100000 1101100 1100001 0100000 1110110 1101001 1100101 1001100 1100101 0100000 1100110 1101100 1110101 1111000 0100000 1100011 1101111 1110011 1101101 1101001 1110001 1110101 1100101 1001100 1100001 0100000 1101110 1110101 1101001 1110100 0100000 1100101 1110011 1110100 0100000 1101100 1101111 1101001 1101110 0101100 1001100 1100101 0100000 1100011 1101001 1100101 1101100 0100000 1100101 1110011 1110100 0100000 1100111 1110010 1101001 1110011 1010011 1101111 1110101 1110011 0100000 1101100 0100111 1101111 1100011 1100101 1100001 1101110 0100000 1101100 1100101 0100000 1100011 1101111 1110010 1100001 1101001 1101100 0100000 1100100 1101111 1110010 1110100 10010101100101010000011100111110101110100111100110100000111010011011111101101110001011001011100101 101010011011111110101111010001000001100101110111001000001101000110000111101011110100110010111101011110010 1101010 0100111 1100001 1101001 1101101 1100101 1101100 1100001 1101110 1110101 1101001 1110100 1001001 1101100 0100000 1110011 1100001 1101001 1100111 1101110 1100101 0100000 1110000 1100101 1110101 0101100 1000101 1110100 0100000 1110011 0100111 1010110 1101011 0100000 1110110 1100001 0100000 1110100 1101111 1110100 1010101 1101110 1101010 1101111 1110101 1110010 1110011 1100101 1101100 1100101 1110110 1100101 1001100 1100101 1110011 1101111 1101001 1110011 1100101 1100001 1110101 11110001100011 1101000 1100001 1101110 1110100 1100101 1101110 1110100 1001010 0100111 1100001 1101001 0100000 1110110 1110101 0100000 1101100 1100001 0100000 1101101 1100101 1110010 1010011 1110101 1110010 0100000 1101100 0100111 1001001 1101110 1110100 1100101 1110010 1101110 1100101 1110100 1010001 1110101 1101001 0100000 1110110 1100101 1110101 1110100 0100000 1100010 1101001 1100101 1101110 0100000 1100100 1101111 1101110 1101110 1100101 1110010 0110001 0110000 1101000 0100000 1100100 1100100 0100000 1110011 1100101 1110011 0100000 1101010 1101111 1110101 1110010 1101110 1100101 1100101 1110011 0111111
Le code ci-dessus converti en caractères (binaire vers ASCII) grâce à moulinette.py:
La voiture bouge Le pied crisse Le ceval rose Perdant son ame Qu'etait la vie Le flux cosmique La nuit est loin, Le ciel est gris Je suis tombee Tout en hauteur 5lK5J 8.21JsMc1Js j'aime la nuit Il saigne peu, Et s'Vk va tot Un jour se leve Les oiseaux chantent
23/09/2019: texte et code
Notes
* spécificité numérique ** virtuel, intangible ** source d'énergie, réseau (électrique ou autre) ** information codée, binaire ----> 0 1 compter en: base 10 0 1 2 3 4 5 6 7 8 9 10 base 4 0 1 2 3 10 11 12 13 20 base 2 (binaire) 0 1 10 11 100 101 110 111 1000 à chaque colonne une valeur: 16 8 4 2 1 1 0 1 1 1 comme en base 10: 90 9 1 0 0 coder une couleur 128 64 32 16 8 4 2 1 1 1 1 1 1 1 1 1 0000 0000 0000 0010 = 256 valeurs possibles (en comptant le 0 comme une valeur) pour chaque canal de couleur (Rouge, Vert, Bleu) 1 canal est codé en 00000000 = 8 bits = 1 byte = 1 octet. on peut donc coder une couleur avec 3 octets, souvent représentés en base 16 (hexadécimal): FF0000
Slides
Voir: slides 01: texte et code
1. INTERNATIONAL MORSE CODE, HAND SENDING - https://archive.org/details/gov.archives.arc.36813 Department of Defense. Department of the Army. Office of the Chief Signal Officer. (09/18/1947 - 02/28/1964)
- Le code morse, inventé par Samuel F. B. Morse en 1832.
- Directions pour tracer les lettres
- Les confusions possibles si l'opérateur fait une erreur de rythme
2. TM 11-459 International Morse Code (Instruction) - 1959 - https://archive.org/details/Tm11-4591957/page/n3
- Le télégraphe "a contribué plutôt à lier inextricablement la technologie et la place de l'humain" (K. Hayles - Lire et penser en milieux numériques p. 223)
3. Direct service guide for telegraphic cipher - 1939 - https://archive.org/details/directservicegui00sldu/page/20
- Premier objectif: la compression (pour des raisons économiques)
- 2e objectif: la discrétion
- 3e objectif: le controle des erreurs
4. Bentley's second phrase code - 1929 - https://archive.org/details/bentleyssecondph00bent/page/778
- Les codes ne sont plus liés au langage naturel
5. Idem
- Ici, un "tableau de mutilation" qui permet de corriger un code mal transmis (qui contient une erreur d'une lettre)
6. Teleprinter n°7 - Creed & Company - 1930
- Frederick G. Creed, inventeur du téléscripteur (vers 1910), ancien télégraphiste, canadien
7. Un exemple de téléscripteur - 1932, Londres
8. Code baudot - 1888
- Un encodage des caractères sur 5 chiffres, 5 bits
- Utilisé (dans des versions ultérieures) sur les premiers téléscripteurs
- Nécessité de définir une vitesse de modulation, "baudrate" en anglais, qui définit le nombre de symboles envoyés en 1 seconde -> la question du début et de la fin!
- Donald Murray adapte le code baudot en 1902 et attribue aux lettres les plus utilisées de l'alphabet les positions impliquant le moins de trous
- En 1924, adaptation du code baudot-Murray par l'organisme International Telegraph Union en International Telegraph Alphabet No. 2 (ITA2)
9. ASCII - American Standard Code for Information Interchange - 1963 - pré 1971
- sur 7 bits
Exercice : poésie binaire
Chaque étudiant.e écrit sur un pad commun au moins deux vers de 4 pieds en binaire en utilisant le tableau de conversion ASCII suivant:
Fichier:Binarypoetry-2019-09-23 14.06.43 cut.mp4
Déroulement du cours
Le cours ne nécessite aucun prérequis si ce n'est une capacité d'attention pendant les séances. Cette attention implique qu'à certains moments, par exemple lors des moments de discussions ou de présentations, il sera demandé aux étudiant.e.s de fermer leur ordinateur, que l'usage des smartphones est interdit et que les étudiant.e.s doivent arriver à l'heure au cours (9h, le lundi matin).
Comme il s'agit d'un cours technique, les travaux se feront majoritairement en classe et il n'est pas absolument nécessaire de travailler en dehors du cours, à part pour documenter les travaux ou préparer leurs présentations (les cotations).
Le cours fonctionne en évaluation continue, ce qui signifie que chaque exercice réalisé en atelier aura une note attribuée. Pour réussir le cours, il faut essentiellement être présent.e.
À cette évaluation continue s'ajoute deux notes en décembre et en mai qui correspondent aux moments de cotations. Il est demandé pour ces cotations de présenter une sélection des travaux réalisés jusque là.
La difficulté technique, bien que présente, ne doit pas constituer une barrière pour assister au cours. Il ne sera pas demandé aux étudiant.e.s d'être performant.e.s mais plutôt de ne pas se braquer et d'accepter d'être inefficaces durant des périodes qui semblent parfois longues (voire trouver du plaisir dans ces périodes de recherches). L'entraide et le partage sont encouragés. Tout sera fait pour éviter des comportements de mise à distance du savoir entre celles et ceux "qui savent" et les "newbies".
Chaque étudiant.e a accès à ce wiki, qui servira durant toute l'année à documenter les travaux. La création des comptes pour le wiki se fait au début du deuxième cours (au moment de l'inscription au cours).