ERG::Code-2020-1

De {}
Aller à la navigation Aller à la recherche

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 et du texte au numérique. 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. À 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.

Pages des étudiant.e.s

Celia Sallet

Eloïse Tabouret

Audrey Eyckmans

Margot Lecomte

Julien Playout

Clément Bitz

Zoé Sampson

Eliott Elkaim

Alice Saunier

Juliette Milhaud

Salomé Veilleux

Rosalie Fiers

Julie Fosse

Travail de fin du premier quadri

Jusqu'ici,

- nous sommes parti de l'écriture d'un poème collectif en binaire, traduit par la suite en ascii

- nous avons vu ensemble des éléments de programation en langage python, d'abord de manière plus générique avec l'écriture de scénarios d'interactions dans le terminal, puis plus spécifiques à la manipulation de texte

- vous avez écrit des énoncés et des programmes qui manipulent le poème original. Ces énoncés sont:

  • un programme qui remplace tous les i par des points d'exclamation
  • changer les consonnes en voyelles de manière aléatoire
  • un programme qui demande à l'utilisateur le numero d'une ligne, puis qui mélange tous les mots de cette ligne
  • rapporter le nombre de voyelles dans une ligne specifiée par l'utilisateur
  • Demander à l'utilisateur de choisir un lettre et ainsi répertorier tout les mots commnçant par celle-ci.
  • Un programme qui supprime tous les "e"
  • Un programme qui demande le numero de la ligne que l'utilisateur n'a pas aimé et la supprime
  • Un programme qui supprime toutes les voyelles
  • un programme qui génère de nouveaux vers à la structure syntaxique correcte à chaque fois qu'il s'exécute

Et les différents programmes se trouvent ci-dessous, dans les notes des cours.

- ces programmes ont généré de nouveaux poèmes (et peuvent pour certains en générer d'autres à chaque exécution).

- à partir de ces différents éléments; code binaire, texte, énoncés, programmes et poème générés, je vous ai demandé de réaliser une publication en ligne, en html et css sur le serveur du cours. Ce dernier point constitue le "rendu" du premier quadri. Il s'agit bien de sélectionner ce que vous voulez publier, de travailler la mise en forme et les différentes pages en html et en css. L'ajout d'éléments "algorithmiques" tels qu'un code qui au moment où on consulte la page fait des requêtes ou transforme les données n'est pas interdit mais pas non plus nécessaire. Il y a moyen de faire quelque chose de bien "juste par le graphisme" et le contenu que vous sélectionnez.

Notes de cours

Cours du 19 mars 2021

import random
formules = {
  'salutations':{
      'coolossement':["bonjour vous","coucouuu","bjr","aaaaaah"],
      'serieusement':["salutations","bien le bonjour"]
  }
}

print(random.choice(formules['salutations']['coolossement']))

Cours du 15 mars 2021

#un programme qui récupère une recette sur unjourunerecette

import mechanize

import lxml.html

import cssselect
#import ssl


#initialisation d'un objet "navigateur" avec la librairie mechanize
navigateur = mechanize.Browser()

navigateur.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

navigateur.set_handle_robots(False)
#fin de la configuration de mechanize
'''
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context
'''

data = navigateur.open('https://www.unjourunerecette.fr/', timeout=10.0)
#convertir la source en arbre html
source = data.read()
html = lxml.html.fromstring(source)

#convertir mon sélecteur css en objet cssselect
selecteurs = cssselect.parse('#preparation li span')
#[premier selecteur]
#selecteurs[0]

#convertir mon objet cssselect en objet xpath
chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteurs[0], translate_pseudo_elements=True)

#on va appliquer le chemin xpath sur la source html
resultats = html.xpath(chemin_xpath)

for etape in resultats:
    print(etape.text_content())

Cours du 1er mars 2021: scraping

#un programme qui récupère la recette sur https://www.unjourunerecette.fr/

# sélecteur css pour atteindre les étapes de la recette: ol#preparation li span

import mechanize
import lxml.html as lh
import cssselect
import ssl


#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.set_handle_robots(False)
#fin de la configuration de mechanize

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context


data = br.open('https://www.unjourunerecette.fr/', timeout=10.0)



src = data.read()

arbre_html = lh.fromstring(src)

selecteurs = cssselect.parse('ol#preparation li span')
#[objet cssselect ol#preparation li span]

#selecteurs[0]

chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteurs[0], translate_pseudo_elements=True)
resultats = arbre_html.xpath(chemin_xpath)

for resultat in resultats:
    print("nouvelle etape:" + resultat.text_content())

Cours du 22 février 2021: tweet.py

import tweepy

#remplacer par api key et api secret key
auth = tweepy.OAuthHandler('api key', 'api key secret key')

auth.set_access_token('access token ', 'access token secret')
api = tweepy.API(auth)


api.update_status(status='tu veux un camembert?')
import tweepy

#remplacer par api key et api secret key
auth = tweepy.OAuthHandler('4GWCPBwzbHEwVUkbIUfjWzbQE', 'oJib6t7ry3Wdsqq3tRlHd6GeLrpih7yiSXLeXGxXwQYhsUChEM')

auth.set_access_token('1225142904978538496-SgCCvfhoYgGyTZzoPfywqflSr3WmGA', 'cUGhOV5FKOSahn76CCfMO3bzoZb6DSSPZ84UMMrTqBaWn')
api = tweepy.API(auth)


tweets = tweepy.Cursor(api.search, q='fromage', tweet_mode='extended').items(10)

for tweet in tweets:
    #print(tweet)
    print(tweet.full_text)

Cours du 15 février 2021 : writing bot, introduction

À propos de robots qui génèrent du texte.

Imaginer un robot qui intervient en postant du texte sur un ou plusieurs réseaux sociaux; mastodon, youtube, instagram, facebook, twitter, etc. Écrire une description de ce robot et la poster sur le wiki. La description doit répondre aux questions suivantes: - quelle(s) source(s) pour le texte - quels types de traitements sont utilisés pour générer le texte (penser aux traitements développés pendant le premier quadri) - qu'est-ce qui déclenche le post? - quel canal est utilisé pour le post?

@everyword, Allison Parrish: https://twitter.com/everyword

@nicetipsbot, Thricedotted: https://twitter.com/nice_tips_bot

@tinycarebot, Jonny Sun: https://twitter.com/tinycarebot

@infinite_scream, Nora Reed: https://twitter.com/infinite_scream

Darius Kazemi: http://tinysubversions.com/projects/

@predartbot, Maria Roszkowska et Nicolas Maigret: http://artbot.space/

Des bots qui n'écrivent pas mais qui agissent sur le web

https://wwwwwwwwwwwwwwwwwwwwww.bitnik.org/r/

Projets de l'année passée

https://twitter.com/poete_nrv/

https://twitter.com/simflouzT

https://twitter.com/baladecampagne

Cours du 7 décembre 2020

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">


  </head>

  <body>

    <h1>Ma petite page web</h1>

    <!-- ceci est un commentaire -->
    <section>
      <h2>Article principal</h2>
      <h3>Un sous-sous-titre</h3>
      <img src="images/01-01thelanmowerman.jpg">
      <p>Omnis enim deserunt sit et iusto perferendis. Magni enim recusandae saepe quis esse. Minus consequatur vitae et autem.</p>
      <p>Omnis enim deserunt sit et iusto perferendis. Magni enim recusandae saepe quis esse. Minus consequatur vitae et autem.</p>
      <p>Omnis enim deserunt sit et iusto perferendis. Magni enim recusandae saepe quis esse. Minus consequatur vitae et autem.</p>
      <pre>
        Omnis
        enim
        deserunt
        sit
      </pre>
    </section>

    <section>
        <h2>Articles secondaires</h2>
        <article>
          <h3><a href="article.html">Article 1</a></h3>
          <p>Omnis enim deserunt sit et iusto perferendis. Magni enim recusandae saepe quis esse. <a href="http://wikipedia.be">Minus consequatur</a> vitae et autem.</p>
        </article>
        <article>
          <h3>Article 2</h3>
          <p>Omnis enim deserunt sit et iusto perferendis. Magni enim recusandae saepe quis esse. Minus consequatur vitae et autem.</p>
      </article>
    </section>

    <section>
        <h2>Liens externes</h2>
        <div>
          <h4>Les liens des copains</h4>
          <ul>
            <li>Le site de Dudule</li>
            <li>Le site de Machin</li>
            <li>Le site de Gérard</li>
          </ul>
        </div>
        <div>
          <h4>Les liens des pas copains</h4>
        </div>


    </section>




  </body>
</html>

Cours du 30 novembre 2020

# -*- coding: utf-8 -*-
import random

noms = ['soupe','pistou','alcool','Chien','casse','savon','deboires','MESSAGE','ALERTE','plafond','GQSK','s','chemin','pieton','mauX','a=our','soir']
ponctuation = [',','!']
nompropre =  [ 'Italie','Jul' ]
articles = ['la','le']
pronomspersonnel = ["Je","J'"]
pronoms = ['moi','que','ses','quoi'] 
verbe = ["aime","est","vais","danser","calisse","veux","fusse","glissait","sortez","avais","ai reve","fuit","dit","tour","tombe","taaJAIjAaSK$"]
qualificatif = ['pistou','couvert',]

vers1 = random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif)+ " " + random.choice(verbe) + " " + random.choice(ponctuation)
vers2 = random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif) + " " + random.choice(ponctuation)
vers3 = random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif) + " " + random.choice(verbe)
vers4 = random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(ponctuation)
vers5 = random.choice(verbe)  + " " + random.choice(pronomspersonnel) + " " + random.choice(articles) + " " + random.choice(noms)
vers6 = random.choice(verbe)  + " " + random.choice(pronomspersonnel) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif) 
vers7 = random.choice(nompropre) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms)
vers8 = random.choice(nompropre) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(ponctuation)
vers9 = random.choice(nompropre) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif)
vers10 = random.choice(nompropre) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(qualificatif) + " " + random.choice(ponctuation)
vers11 = random.choice(pronoms) + " " + random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms)+ " " + random.choice(qualificatif) + " " + random.choice(ponctuation)
vers11 = random.choice(pronoms) + " " + random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms)+ " " + random.choice(qualificatif)
vers12 = random.choice(pronoms) + " " + random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms)
vers13 = random.choice(pronoms) + " " + random.choice(pronomspersonnel) + " " + random.choice(verbe) + " " + random.choice(articles) + " " + random.choice(noms) + " " + random.choice(ponctuation)

structures = [ vers1 , vers2 , vers3 , vers4 , vers5 , vers6 , vers7 , vers8 , vers9 , vers10 , vers11 , vers12 , vers13 ]

rendu = random.choice(structures)

print(rendu)

Cours du 23 novembre 2020

# -*- coding: utf-8 -*-
import time
#un programme qui demande à l'utilisateur le numero de la ligne qu'il n'aime pas, puis la supprime

with open('poyeme.txt') as fichier:
    poyeme = fichier.read()
 
lignes = poyeme.splitlines()
print(lignes)

#1 demande quelle ligne 
print ("Dites moi le numéro de la ligne que vous n'aimez pas ?")
 
numero = input ()
numero = int(numero)
 
lignes = poyeme.splitlines()
 
print (lignes [numero - 1])
 
ligne = lignes [numero - 1]

time.sleep(2)
print ("D'accord, je vais remédier à cela")
time.sleep(2)

#2 Remplacement de la ligne par du vide
poyeme = poyeme.replace(ligne + "\n","")

print(poyeme)
#Un programme qui supprime tous les "e"

with open('text.txt','r') as file:
    text = file.read()


text = text.lower()

#text.replace("e","")

voldemort = 'e'

prophetie = ''

for bla in text :
    if bla == voldemort:
        prophetie = prophetie + "la lettre dont on ne prononce le son"
    else :
        prophetie = prophetie + bla
        
print(prophetie)


#un programme qui demande à l'utilisateur une lettre puis répértorie tout les mots commençant par celle-ci

with open("poyeme.txt" , 'r') as file :
 poyeme = file.read()
 
print ('Choisis une lettre !')

lettres1 = input ()

listemots = poyeme.split()

for mot in listemots:
	if mot[0] == lettres1:
		print(mot)


#Un programme qui supprime toutes les voyelles

with open("poesie.txt" , 'r') as file :
    poyeme = file.read()
 
voyelles = [ 'a', 'e', 'i', 'o', 'u' ]


 
for lettre in voyelles :
    poyeme = poyeme.replace(lettre, '')

print(poyeme)

Cours du 16 novembre 2020

Le poème converti en texte:

J'aime la soupe pistou
Le J c'est le s
L'alcool!est!mort
Je vais danser En Italie
Calisse moi la
Chien de la casse
Je veux te voir tout nu youpi
Quoi que je fusse,savon glissait.
MESSAGE D'ALERTE, SORTEZ COUVERT!
Dans ses deboires
L'a=our d'un soir
J'ai reve que J'avais un!GQSK.
Mon plafond fuit,
mauX dit,taudis
Le chemin tour .Le pieton tombe
Je taaJAIjAaSK$
with open('src.txt', 'r') as fichier:
    poyeme = fichier.read()

#print(poyeme)

lignes = poyeme.splitlines()

print(lignes)

print(lignes[1])
import random

#changer les consonnes en voyelles de manière aléatoire
with open('src.txt', 'r') as fichier:
    poyeme = fichier.read()

#1 on définit ce que sont les voyelles
voyelles = ['a', 'e', 'i', 'o', 'u']

poyeme_modifie = ''

#2 on parcourt chaque lettre du poème
for lettre in poyeme:
    print(lettre)

    #3 pour chaque lettre, on vérifie si elle est présente dans le tableau voyelles
    if lettre not in voyelles:
        #4 si elle n'est pas présente, alors on la remplace par une lettre au hasard du tableau voyelles
        poyeme_modifie = poyeme_modifie + random.choice(voyelles)
    else:
        poyeme_modifie = poyeme_modifie + lettre

print(poyeme_modifie)
import random

#changer les consonnes en voyelles de manière aléatoire
with open('src.txt', 'r') as fichier:
    poyeme = fichier.read()

poyeme = poyeme.lower()

#1 on définit ce que sont les voyelles
voyelles = ['a', 'e', 'i', 'o', 'u', 'y']

#2 on définit ce que sont les consonnes
consonnes = ['z','r','t','p','q','s','d','f','g','h','k','l','j', 'm','w','x','c','v','b','n']


#3 on parcourt le tableau de consonnes
for consonne in consonnes:
    #4 pour chaque consonne, on la remplace dans le poyeme par une voyelle au hasard
    poyeme = poyeme.replace(consonne, random.choice(voyelles))

print(poyeme)
#un programme qui demande à l'utilisateur le numero d'une ligne, puis qui mélange tous les mots de cette ligne
import time
import random


with open("poesie.txt" , 'r') as file :
 poyeme = file.read()

print ('Donnez un numéro de ligne')

numero = input ()
numero = int(numero)

lignes = poyeme.splitlines()

print (lignes [numero - 1])

ligne = lignes [numero - 1]

print ('mélangeons tout ça')


mots = ligne.split()

random.shuffle(mots)

resultat = " ".join(mots)

print(resultat)
#Un programme qui rapporte le nombre de voyelle dans une ligne spécifiée par l'utilisateur

with open("poyeme.txt" , 'r') as file :
 poyeme = file.read()
 
print ('Choisis un numéro de ligne!')
 
numero = input ()
numero = int(numero)
 
lignes = poyeme.splitlines()

ligne = lignes [numero - 1]
 
print (lignes [numero - 1])
compteur =  0
for lettre in ligne:
   
     if lettre in voyelles:
     	compteur = compteur+1

print(compteur)

Cours du 19 octobre 2020

# -*- coding: utf-8 -*-
#un script qui épelle un prénom dans un sens puis dans un autre puis qui affiche les deux premières lettres puis la deuxième et la troisième lettre
import time
print("Qui est-ce?")

name = input()
#name = raw_input()

nameLength = len(name)

#  0   1   2
#['T'|'O'|'M']

#print(name[1])

for compteur in range(0, nameLength):
    print("Donnez-moi un " + name[compteur])
    time.sleep(1)

for compteur in range(nameLength-1, -1, -1):
    print("Donnez-moi un " + name[compteur])
    time.sleep(1)

print(name[0:1])
print(name[1:2])


print(name+"!")

Cours du 12 octobre 2020

age.py

# -*- coding: utf-8 -*-

print("Quel âge as-tu?")

age = input()
age = int(age)
#age = raw_input()

print("Le double de ton age c'est " + str(age * 2))

# < > <= >= == != 
if age < 10:
    print("Oh ben t'es tout petit")
    print("Mais c'est pas grave")
elif age < 20:
    print("Oh ben t'es tout jeune")
elif age < 30:
    print("Oh ben t'es presque tout vieux")
else:
    print("Oh ben t'es presque mort")

chats.py

# -*- coding: utf-8 -*-
import time

print("Combien de petits chats?")

nbChats = input()

nbChats = int(nbChats)


for compteur in range(1, nbChats + 1):
    print(str(compteur) + " petits chats")


    time.sleep(1)

print("C'est fini")

Cours du 28 septembre 2020

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: USASCII_code_chart.png

Du code Morse à l'ASCII

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

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).