Différences entre les versions de « ERG::Code-2019-2 »
(37 versions intermédiaires par 5 utilisateurs non affichées) | |||
Ligne 5 : | Ligne 5 : | ||
==Pages des étudiants== | ==Pages des étudiants== | ||
[[Utilisateur:Claudia|Claudia]] | [[Utilisateur:Claudia|Claudia]] | ||
+ | |||
[[Utilisateur:Stijn|Stijn]] | [[Utilisateur:Stijn|Stijn]] | ||
+ | |||
[[Utilisateur:Zoe.vds|Zoe]] | [[Utilisateur:Zoe.vds|Zoe]] | ||
+ | |||
[[Utilisateur:Gesine|Gesine]] | [[Utilisateur:Gesine|Gesine]] | ||
+ | |||
[[Utilisateur:Thomas|Thomas]] | [[Utilisateur:Thomas|Thomas]] | ||
+ | |||
[[Utilisateur:Violette|Violette]] | [[Utilisateur:Violette|Violette]] | ||
+ | [[Utilisateur:LenaS|Lena]] | ||
+ | |||
+ | [[Utilisateur:Marco|Marco]] | ||
==Séances== | ==Séances== | ||
+ | ===16/04/2020=== | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | import datetime | ||
+ | import time | ||
+ | |||
+ | |||
+ | file = open("frequence.json", "r") | ||
+ | derniere_execution = file.read | ||
+ | |||
+ | #2020-04-16 11:53:56.184902 | ||
+ | moment1 = datetime.strptime(derniere_execution, '%Y-%m-%d %H-%M-%S.%f') | ||
+ | print(moment1) | ||
+ | |||
+ | |||
+ | delai = moment2-moment1 | ||
+ | print(delai.total_seconds()) | ||
+ | |||
+ | if delai.total_seconds() > 2: | ||
+ | print('ok') | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | <syntaxhighlight lang="python"> | ||
+ | import datetime | ||
+ | import time | ||
+ | |||
+ | |||
+ | moment1 = datetime.datetime.now() | ||
+ | print(moment1) | ||
+ | |||
+ | time.sleep(3) | ||
+ | |||
+ | moment2 = datetime.datetime.now() | ||
+ | |||
+ | print(moment2) | ||
+ | |||
+ | delai = moment2-moment1 | ||
+ | print(delai.total_seconds()) | ||
+ | |||
+ | if delai.total_seconds() > 2: | ||
+ | print('ok') | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===05/03/2020: twitter bots: on avance=== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | import requests | ||
+ | import json | ||
+ | import sys | ||
+ | import time | ||
+ | import datetime | ||
+ | |||
+ | from urllib.request import urlopen | ||
+ | from urllib.parse import quote | ||
+ | |||
+ | |||
+ | #https://api.tomtom.com/search/2/geocode/87%20rue%20du%20Page%2C%20Bruxelles.json?limit=1&countrySet=FR%2CBE&language=fr-FR&key=***** | ||
+ | |||
+ | #https://api.tomtom.com/search/2/geocode/87%20rue%20du%20page%20Bruxelles.json?limit=1&countrySet=BE%2CFR&language=fr-FR&key=***** | ||
+ | apiURL = "https://api.tomtom.com/search/2/geocode" | ||
+ | # apiKey | ||
+ | |||
+ | adresse = quote("87 rue du Page, Bruxelles") | ||
+ | |||
+ | |||
+ | tomtomURL = "{0}/{1}.json?limit=1&countrySet=BE,FR&language=fr-FR&key={2}".format(apiURL,adresse,apiKey) | ||
+ | #tomtomURL = apiURL+'/'+adresse+'.json?limit=1&countrySet=BE,FR&language=fr-FR&key='+apiKey | ||
+ | |||
+ | getData = urlopen(tomtomURL).read() | ||
+ | result = json.loads(getData) | ||
+ | print(result['results'][0]['position']) | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | #0 ON Récupère le fichier json et on le convertit en tableau | ||
+ | dejaTweetes = ['19809898', '1798798798798', '87987987987987'] | ||
+ | |||
+ | #1 RÉCUPÉRER UN TWEET QUI CONTIENT LES MOTS "SOUS L'ARBRE" | ||
+ | #2 est-ce que l'id de ce tweet est dans le tableau dejaTweetes? | ||
+ | ##Si oui, on ne fait rien | ||
+ | ##Si non, on exécute le traitement et on ajoute l'id du tweet au tableau dejaTweetes | ||
+ | |||
+ | #à la fin, on enregistre le tableau dans un fichier json externe | ||
+ | </pre> | ||
+ | |||
+ | ===20/02/2020: web scraping=== | ||
+ | ====Librairies Python==== | ||
+ | * pour naviguer: | ||
+ | ** pycurl (http://pycurl.io/) | ||
+ | ** urllib2 (https://docs.python.org/2/library/urllib2.html) | ||
+ | ** requests (https://requests.readthedocs.io/en/master/) | ||
+ | ** mechanize (https://mechanize.readthedocs.io/en/latest/index.html) | ||
+ | * pour parser: | ||
+ | ** beautifulsoup (https://www.crummy.com/software/BeautifulSoup/bs4/doc/) | ||
+ | ** lxml (https://lxml.de/xpathxslt.html) | ||
+ | ** cssselect (https://cssselect.readthedocs.io/en/latest/) | ||
+ | |||
+ | *User agent : | ||
+ | **What is my browser (https://www.whatismybrowser.com/guides/the-latest-user-agent/firefox) | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | import mechanize | ||
+ | import lxml.html as parser | ||
+ | import cssselect | ||
+ | |||
+ | #01. naviguer sur le site cible | ||
+ | ### on déclare un browser | ||
+ | br = mechanize.Browser() | ||
+ | |||
+ | ### on ajoute des infos sur le navigateur | ||
+ | br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0')] | ||
+ | |||
+ | ### on ignore la gestion des robots du serveur | ||
+ | br.set_handle_robots(False) | ||
+ | |||
+ | ### on récupère le code source de la page | ||
+ | data = br.open('https://poesie.webnet.fr/lesgrandsclassiques/Authors/B', timeout=10) | ||
+ | |||
+ | #print(data.read()) | ||
+ | |||
+ | #02. parser la source pour récupérer les liens | ||
+ | source = data.read() | ||
+ | |||
+ | #unicode_src = source.decode('utf-8', 'ignore') | ||
+ | |||
+ | tree = parser.fromstring(source) | ||
+ | |||
+ | ##pour chaque objet de type selector déduit du sélecteur css | ||
+ | for selector in cssselect.parse('.author-list__link'): | ||
+ | ##on convertit l'objet selector en xpath | ||
+ | xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector) | ||
+ | ##pour chaque lien trouvé par ce xpath | ||
+ | for link in tree.xpath(xpath_selector): | ||
+ | print(link.get('href')) | ||
+ | print(link.text_content()) | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | import mechanize | ||
+ | import lxml.html as parser | ||
+ | import cssselect | ||
+ | import random | ||
+ | |||
+ | def getHtmlTree(url): | ||
+ | ### on récupère le code source de la page | ||
+ | data = br.open(url, timeout=10) | ||
+ | |||
+ | #print(data.read()) | ||
+ | |||
+ | #02. parser la source pour récupérer les liens | ||
+ | source = data.read() | ||
+ | |||
+ | #unicode_src = source.decode('utf-8', 'ignore') | ||
+ | |||
+ | tree = parser.fromstring(source) | ||
+ | |||
+ | return tree | ||
+ | |||
+ | def getRandomLink(url, cssSelector): | ||
+ | tree = getHtmlTree(url) | ||
+ | |||
+ | ##pour chaque objet de type selector déduit du sélecteur css | ||
+ | for selector in cssselect.parse(cssSelector): | ||
+ | ##on convertit l'objet selector en xpath | ||
+ | xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector) | ||
+ | ##pour chaque lien trouvé par ce xpath | ||
+ | links = tree.xpath(xpath_selector) | ||
+ | |||
+ | return random.choice(links).get('href') | ||
+ | |||
+ | |||
+ | |||
+ | #01. naviguer sur le site cible | ||
+ | ### on déclare un browser | ||
+ | br = mechanize.Browser() | ||
+ | |||
+ | ### on ajoute des infos sur le navigateur | ||
+ | br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0')] | ||
+ | |||
+ | ### on ignore la gestion des robots du serveur | ||
+ | br.set_handle_robots(False) | ||
+ | |||
+ | link1 = getRandomLink('https://poesie.webnet.fr/lesgrandsclassiques/Authors/B', '.author-list__link') | ||
+ | |||
+ | #print('https://poesie.webnet.fr'+link1) | ||
+ | |||
+ | url = '%s%s' % ('https://poesie.webnet.fr', link1) | ||
+ | |||
+ | poemeurl = '%s%s' % ('https://poesie.webnet.fr', getRandomLink(url, '.author-list__link')) | ||
+ | |||
+ | poemeTree = getHtmlTree(poemeurl) | ||
+ | |||
+ | #.poem__content | ||
+ | |||
+ | for selector in cssselect.parse('.poem__content'): | ||
+ | ##on convertit l'objet selector en xpath | ||
+ | xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector) | ||
+ | ##pour chaque poème trouvé par ce xpath | ||
+ | poems = poemeTree.xpath(xpath_selector) | ||
+ | print(poems[0].text_content()) | ||
+ | |||
+ | #print(poem.text_content()) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===13/02/2020: writing bot: Twitter API=== | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/env python3 | ||
+ | # coding: utf-8 | ||
+ | |||
+ | from acces import * | ||
+ | import tweepy | ||
+ | import time | ||
+ | |||
+ | auth = tweepy.OAuthHandler(consumer_key, consumer_secret) | ||
+ | auth.set_access_token(access_token, access_token_secret) | ||
+ | |||
+ | |||
+ | api = tweepy.API(auth) | ||
+ | ''' | ||
+ | while True: | ||
+ | api.update_status(status='Tu veux un camembert?') | ||
+ | time.sleep(600) | ||
+ | ''' | ||
+ | |||
+ | '''tweets = tweepy.Cursor(api.search, q='fromage', tweet_mode='extended').items(10) | ||
+ | ''' | ||
+ | ''' | ||
+ | tweets = tweepy.Cursor(api.user_timeline, '@booba', tweet_mode='extended').items(10) | ||
+ | |||
+ | for tweet in tweets: | ||
+ | print('###'+tweet.full_text+'###') | ||
+ | ''' | ||
+ | user = api.get_user('@poete_nrv') | ||
+ | print(user.id) | ||
+ | #api.send_direct_message(user.id, 'tu veux un camembert?') | ||
+ | api.create_friendship(user.id, True) | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===06/02/2020: 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/ | ||
+ | |||
+ | Ressources | ||
+ | |||
+ | https://botwiki.org | ||
+ | |||
+ | ====Créer un bot Twitter==== | ||
+ | * Créer un compte Twitter | ||
+ | * Convertir le compte en compte développeur (https://developer.twitter.com/en/apps) | ||
+ | * Attendre la validation de la conversion par Twitter | ||
+ | |||
+ | Voir https://help.twitter.com/en/rules-and-policies/twitter-automation | ||
+ | |||
+ | ===12/12/2019=== | ||
+ | ====La suite==== | ||
+ | Le poème de base, plus long avec les vers de tout le monde. | ||
+ | <pre> | ||
+ | Les éditions | ||
+ | "Le Canapé" | ||
+ | m'avaient donné | ||
+ | une mission : | ||
+ | un grand roman | ||
+ | transformiste. | ||
+ | C'est vrai ou faux | ||
+ | un ou zéro | ||
+ | C'est noir ou blanc | ||
+ | larme amme bien | ||
+ | le code binaire | ||
+ | tout est très claire | ||
+ | L'ORDINATEUR | ||
+ | Circuits Immenses | ||
+ | Zéros et uns | ||
+ | Rythment le cod(e). | ||
+ | Répétition, | ||
+ | Zéros et uns | ||
+ | Saut a la ligne, | ||
+ | C'est un secret. | ||
+ | Écrire à l'ordinateur, | ||
+ | ou à la main ? | ||
+ | Écrire sur le passé, | ||
+ | ou sur demain ? | ||
+ | Écrire des mots, | ||
+ | ou un poème ? | ||
+ | Écrire sur l'amour, | ||
+ | ou sur la haine ? | ||
+ | Plus de points | ||
+ | d’interrogation, | ||
+ | écrivez juste | ||
+ | une assertion ! | ||
+ | </pre> | ||
+ | |||
+ | ===05/12/2019: conception édition suite=== | ||
+ | ====Évolution du projet==== | ||
+ | <pre> | ||
+ | Un livret pour une feuille A3 recto-verso dans une couverture / pochette sur laquelle figure les instructions de pliage / dépliage. La manipulation permet de voir soit les poèmes les uns à la suite des autres soit les codes et les énoncés. | ||
+ | Chaque code + énoncé est directement derrière le poème associé. | ||
+ | </pre> | ||
+ | |||
+ | ====Outils de travail==== | ||
+ | serveur ftp: curlybraces.be, ergstudent.curlybraces | ||
+ | |||
+ | pad de travail: https://pad.lvh2.com/p/poetry | ||
+ | |||
+ | accès http: http://curlybraces.be/erg/2019-2020/poetry/ | ||
+ | |||
+ | ===21/11/2019: conception édition=== | ||
+ | <pre> | ||
+ | Types de contenus: | ||
+ | * l'énoncé en français des programmes | ||
+ | * le code source des programmes | ||
+ | * les liens entre énoncés et codes sources | ||
+ | * le résultat des programmes | ||
+ | * les liens entre codes sources et résultats | ||
+ | * la poésie initiale en binaire | ||
+ | * la poésie initiale en ascii | ||
+ | * date et heure de l'exécution | ||
+ | * auteurs des programmes | ||
+ | * liens entre auteurs et codes sources | ||
+ | * liens entre auteurs et énoncés | ||
+ | * titre? | ||
+ | * typologie de programmes | ||
+ | (ajout d'éléments, inversion, random, suppression de caractères) | ||
+ | * interaction ou pas | ||
+ | </pre> | ||
+ | <pre> | ||
+ | * distinguer code source (couleur?) | ||
+ | * vis à vis entre ascii et binaire ou deux parties | ||
+ | * manière de montrer l'interaction/l'éxécution | ||
+ | -> voir le terminal? capture d'écran? | ||
+ | -> date et heure | ||
+ | * nom des programmes : auteur ou autre | ||
+ | * choix des poésies générées : un certain nombre par programme, une sélection, si oui, quels critères | ||
+ | * montrer les échecs d'exécution? | ||
+ | |||
+ | * forme évolutive -> reliure languettes metalliques | ||
+ | * surrimpressions entre texte généré et code (riso?) | ||
+ | * le titre = poème binaire | ||
+ | * dernière chose qu'on voit (4ème de couverture?) -> poème ascii | ||
+ | |||
+ | * note d'intention | ||
+ | * chapitrage -> titres qui sont des chemins dans un disque (/home/lecteur/poesie/titre du poème) | ||
+ | * structure du livre | ||
+ | **titre | ||
+ | **note d'intention | ||
+ | **manipulations | ||
+ | ***inversion | ||
+ | ****énoncé en français | ||
+ | ****résultat | ||
+ | ****code python | ||
+ | ****énoncé en français | ||
+ | ****résultat | ||
+ | ****code python | ||
+ | ***remplacement | ||
+ | ****énoncé en français | ||
+ | ****résultat | ||
+ | ****code python | ||
+ | **poème en ascii | ||
+ | |||
+ | |||
+ | * quel est le but? rendre clair? jouer sur le brouillage? esthétique du code, choses qui se croisent. | ||
+ | -> la lecture du code pour un être humain, quels dispositifs graphiques mettre en place et pourquoi? | ||
+ | |||
+ | * thèmes: ajout, suppression, remplacement, inversion, aléatoire | ||
+ | * textes résultats: tous les poèmes ont le même nombre de ligne donc ils occupent la même hauteur (celui qui supprime une ligne sur deux -> une ligne sur deux est blanche) | ||
+ | * Raymond Queneau, exercices de style -> différents résultats pour un programme | ||
+ | * chaque chapitre a une police monospace différente | ||
+ | * séparer les résultats des processus de création donc | ||
+ | -> une partie avec les vers de chacun en binaire et en ascii | ||
+ | -> une partie avec les énoncés et les codes sources classés par typologie | ||
+ | -> une partie que les résultats, classés par typologie | ||
+ | |||
+ | |||
+ | * deux types de mises en exergue selon les propositions: | ||
+ | -> soit on met l'accent sur la traduction entre énoncé, résultat, code source | ||
+ | -> soit on met l'accent sur le processus de création, donc du contexte avec des éléments comme date, | ||
+ | captures d'écran, interactions | ||
+ | -> soit on met l'accent sur le rapport entre les différents résultats et donc leurs similarités et différences | ||
+ | |||
+ | * proposition: trois livrets ou trois parties distinctes pour les trois types de texte: | ||
+ | énoncé, résultat, code source. -> les trois parties ont une autonomie, l'accent est mis sur les différences | ||
+ | et similarités entre les textes. La question du contexte d'exécution ou de fabrication se retrouve dans | ||
+ | la navigation (marges extérieures) | ||
+ | </pre> | ||
+ | ====Références publications==== | ||
+ | http://sync.abue.io/ | ||
+ | |||
+ | http://www.coryarcangel.com/things-i-made/2016-061-the-source-digest-srf-038 et http://www.coryarcangel.com/downloads/the-source-digest-2016-061-digital-master-ih.pdf | ||
+ | |||
+ | http://novel.coryarcangel.com/ | ||
+ | |||
+ | ===07/11/2019: Introduction web et html=== | ||
+ | ====Notes Internet==== | ||
+ | <pre> | ||
+ | INTERNET | ||
+ | réseaux | ||
+ | serveur / client | ||
+ | data (données) | ||
+ | communication (entre machines) -> protocoles | ||
+ | décentralisé | ||
+ | |||
+ | web | ||
+ | navigateur | ||
+ | client ftp | ||
+ | </pre> | ||
+ | ====Démo html==== | ||
+ | <syntaxhighlight lang="html5"> | ||
+ | <!doctype html> | ||
+ | <html> | ||
+ | <head> | ||
+ | <title>Poème</title> | ||
+ | <meta charset="utf-8"> | ||
+ | |||
+ | </head> | ||
+ | |||
+ | <body> | ||
+ | |||
+ | <section> | ||
+ | <header>En-tête de la section</header> | ||
+ | <h1>Mon poème</h1> | ||
+ | <h2>Sous-titre</h6> | ||
+ | <article> | ||
+ | <p> | ||
+ | <a href="http://www.curlybraces.be">Transformiste</a> poeme noir | ||
+ | L'immense plus | ||
+ | Le secret ecrit | ||
+ | Les binaires <span>demains</span> rythment | ||
+ | Les mains, | ||
+ | Une haine binaire et une juste haine | ||
+ | L'immense interrogation | ||
+ | Claire repetition juste | ||
+ | Une repetition transformiste : | ||
+ | Des mains, les haines, un plus ! | ||
+ | Les secrets blancs et le faux demain | ||
+ | Les missions blanches, | ||
+ | L'assertion vraie ? | ||
+ | Claire edition transformiste | ||
+ | Un saut juste | ||
+ | Claire mission claire | ||
+ | L'ordinateur juste ou une noire assertion | ||
+ | Blancs ordinateurs clairs | ||
+ | Une grande mission ecrit ! | ||
+ | Une noire assertion ecrit, | ||
+ | Les points immenses et blancs | ||
+ | Le poeme ecrit | ||
+ | Noir passe faux | ||
+ | L'edition. | ||
+ | La vraie edition m'avait donne ? | ||
+ | </p> | ||
+ | </article> | ||
+ | <footer>pied de page</footer> | ||
+ | </section> | ||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===24/10/2019: Poésie algorithmique avec Python suite et fin=== | ||
+ | ====Le programme de Lena==== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | ''' | ||
+ | Pourquoi ne pas essayer d'inverser le premier et dernier mot de chaque phrases. Ainsi que la première et la dernière lettre du premier mot de chaque phrases. | ||
+ | ''' | ||
+ | |||
+ | |||
+ | |||
+ | with open('poetry', 'r') as teteLecture: | ||
+ | poeme = teteLecture.read() | ||
+ | |||
+ | poemeLignes = poeme.splitlines() | ||
+ | ''' | ||
+ | for ligne in poemeLignes: | ||
+ | print(ligne) | ||
+ | |||
+ | for compteur in range(0, len(poemeLignes)): | ||
+ | ligne = poemeLignes[compteur] | ||
+ | |||
+ | ''' | ||
+ | |||
+ | |||
+ | |||
+ | for ligne in poemeLignes: | ||
+ | |||
+ | words = ligne.split(" ") | ||
+ | # 0 1 | ||
+ | #['la', 'maison'] | ||
+ | premierMot = words[0] | ||
+ | |||
+ | premiereLettre = premierMot[0] | ||
+ | |||
+ | #premierMot[0] = premierMot[len(premierMot) - 1] | ||
+ | |||
+ | premierMot = premierMot[len(premierMot) - 1] + premierMot[1:] | ||
+ | #naison | ||
+ | premierMot = premierMot[:len(premierMot)-1] + premiereLettre | ||
+ | |||
+ | #premierMot[len(premierMot) - 1] = premiereLettre | ||
+ | |||
+ | words[0] = premierMot | ||
+ | |||
+ | |||
+ | #la | ||
+ | words[0] = words[len(words)-1] | ||
+ | #['maison', 'maison'] | ||
+ | words[len(words)-1] = premierMot | ||
+ | #['maison', 'maison'] | ||
+ | |||
+ | print(' '.join(words)) | ||
+ | '''newline = "" | ||
+ | for word in words: | ||
+ | newline = newline + word + " " | ||
+ | |||
+ | |||
+ | print newline | ||
+ | ''' | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ====Dernier énoncé==== | ||
+ | <pre> | ||
+ | Le programme demande à l'utilisateur le nombre de vers à générer. | ||
+ | Le programme génère autant de vers aléatoires que le nombre entré par l'utilisateur, à partir des mots du poème source et en utilisant la formule syntaxique "article + nom + complément + verbe" | ||
+ | |||
+ | Une fois que ça marche deux améliorations possibles: | ||
+ | * accorder en genre et en nombre les phrases (ortographe inclusive ou non) | ||
+ | * avoir plusieurs formules syntaxiques et les choisir aléatoirement (ou selon une certaine logique) à chaque vers | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | ====Poèmes générés==== | ||
+ | |||
+ | ===17/10/2019: Scripts python suite=== | ||
+ | <pre> | ||
+ | Les editions | ||
+ | "Le Canape" | ||
+ | m'avaient donne | ||
+ | une mission : | ||
+ | un grand roman | ||
+ | transformiste. | ||
+ | Cest vrai ou faux | ||
+ | un ou zero | ||
+ | Cest nomr ou blanc | ||
+ | larme amme bien | ||
+ | le code binaire | ||
+ | touts est tres claire | ||
+ | L ORDINATEUR | ||
+ | Circuits Immenses | ||
+ | Zeros et uns | ||
+ | Rythment le cod(e). | ||
+ | Repetition, | ||
+ | Zeros et uns | ||
+ | Saut a la ligne, | ||
+ | C'est un secret. | ||
+ | </pre> | ||
+ | |||
+ | ====Le programme de Claudia==== | ||
+ | Résolution collective de l'énoncé posé par [[Utilisateur:Claudia|Claudia]] | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | ''' | ||
+ | Un programme qui demande à l'utilisateur « pair ou impair ? ». | ||
+ | Si l'utilisateur répond « pair », ne sont affichées que les lignes paires. | ||
+ | Si l'utilisateur répond « impair », ne sont affichées que les lignes impaires. | ||
+ | ''' | ||
+ | |||
+ | |||
+ | |||
+ | with open('poetry', 'r') as teteLecture: | ||
+ | poeme = teteLecture.read() | ||
+ | |||
+ | poemeLignes = poeme.splitlines() | ||
+ | |||
+ | ''' | ||
+ | 0 1 2 3 | ||
+ | ['Première ligne', 'Deuxième ligne', 'Troisième ligne', 'Quatrième ligne'] | ||
+ | |||
+ | ''' | ||
+ | |||
+ | print("pair ou impair?") | ||
+ | #reponse = input() | ||
+ | reponse = raw_input() | ||
+ | print(poemeLignes) | ||
+ | if reponse == "impair": | ||
+ | #afficher les lignes paires | ||
+ | indice = 0 | ||
+ | else: | ||
+ | #afficher les lignes paires | ||
+ | indice = 1 | ||
+ | |||
+ | |||
+ | while indice < len(poemeLignes): | ||
+ | print(poemeLignes[indice]) | ||
+ | indice = indice + 2 | ||
+ | </syntaxhighlight> | ||
+ | |||
===10/10/2019: Scripts python=== | ===10/10/2019: Scripts python=== | ||
====Donnez-moi un P!==== | ====Donnez-moi un P!==== | ||
Ligne 68 : | Ligne 711 : | ||
else: | else: | ||
print("Oh ben t'es tout vieux") | print("Oh ben t'es tout vieux") | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ====Le programme de Zoé==== | ||
+ | Résolution collective de l'énoncé posé par [[Utilisateur:Zoe.vds|Zoé]] : | ||
+ | Le programme permute les mots de moins de 3 lettres, et les mots de plus de 5 lettres. | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | #Le programme permute les mots de moins de 3 lettres, et les mots de plus de 5 lettres. | ||
+ | |||
+ | with open('poetry','r') as lecture: | ||
+ | poyeme = lecture.read() | ||
+ | |||
+ | poyeme_lines = poyeme.splitlines() | ||
+ | |||
+ | |||
+ | #Etape 1: enregistrer tous les mots de plus de 5 lettres dans un tableau | ||
+ | plus_cinq = [] | ||
+ | |||
+ | for poyeme_line in poyeme_lines: | ||
+ | words = poyeme_line.split(' ') | ||
+ | for word in words: | ||
+ | nbLettres = len(word) | ||
+ | if nbLettres > 5: | ||
+ | plus_cinq.append(word) | ||
+ | |||
+ | #print(plus_cinq) | ||
+ | |||
+ | |||
+ | #Etape 2: enregistrer tous les mots de moins de 3 lettres dans un tableau | ||
+ | moins_trois = [] | ||
+ | |||
+ | for poyeme_line in poyeme_lines: | ||
+ | words = poyeme_line.split(' ') | ||
+ | for word in words: | ||
+ | nbLettres = len(word) | ||
+ | if nbLettres < 3 and word != '': | ||
+ | moins_trois.append(word) | ||
+ | |||
+ | #print(moins_trois) | ||
+ | |||
+ | #Etape 3: parcourir le texte et remplacer les mots de moins de 3 lettres par les mots de 5 lettres et inversément | ||
+ | compteur_permutations_moins_trois = 0; | ||
+ | compteur_permutations_plus_cinq = 0; | ||
+ | |||
+ | for poyeme_line in poyeme_lines: | ||
+ | words = poyeme_line.split(' ') | ||
+ | new_line = '' | ||
+ | |||
+ | for word in words: | ||
+ | |||
+ | #une condition qui teste si le mot fait moins de 3 lettres | ||
+ | if word in moins_trois: | ||
+ | |||
+ | new_word = plus_cinq[compteur_permutations_moins_trois % len(plus_cinq)] | ||
+ | compteur_permutations_moins_trois = compteur_permutations_moins_trois + 1 | ||
+ | #print(new_word) | ||
+ | new_line = new_line + " " + new_word | ||
+ | elif word in plus_cinq: | ||
+ | new_word = moins_trois[compteur_permutations_plus_cinq % len(moins_trois)] | ||
+ | compteur_permutations_plus_cinq = compteur_permutations_plus_cinq + 1 | ||
+ | new_line = new_line + " " + new_word | ||
+ | #print(new_word) | ||
+ | else: | ||
+ | new_line = new_line + " " + word | ||
+ | #print(word) | ||
+ | |||
+ | |||
+ | print(new_line) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ligne 368 : | Ligne 1 084 : | ||
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: | 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: | ||
https://upload.wikimedia.org/wikipedia/commons/c/cf/USASCII_code_chart.png | https://upload.wikimedia.org/wikipedia/commons/c/cf/USASCII_code_chart.png | ||
− | |||
− | |||
==Déroulement du cours== | ==Déroulement du cours== |
Version actuelle datée du 10 mai 2020 à 10:31
Introduction
Ce cours est destiné aux étudiant.e.s de BAC3. 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
16/04/2020
import datetime
import time
file = open("frequence.json", "r")
derniere_execution = file.read
#2020-04-16 11:53:56.184902
moment1 = datetime.strptime(derniere_execution, '%Y-%m-%d %H-%M-%S.%f')
print(moment1)
delai = moment2-moment1
print(delai.total_seconds())
if delai.total_seconds() > 2:
print('ok')
import datetime
import time
moment1 = datetime.datetime.now()
print(moment1)
time.sleep(3)
moment2 = datetime.datetime.now()
print(moment2)
delai = moment2-moment1
print(delai.total_seconds())
if delai.total_seconds() > 2:
print('ok')
05/03/2020: twitter bots: on avance
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import time
import datetime
from urllib.request import urlopen
from urllib.parse import quote
#https://api.tomtom.com/search/2/geocode/87%20rue%20du%20Page%2C%20Bruxelles.json?limit=1&countrySet=FR%2CBE&language=fr-FR&key=*****
#https://api.tomtom.com/search/2/geocode/87%20rue%20du%20page%20Bruxelles.json?limit=1&countrySet=BE%2CFR&language=fr-FR&key=*****
apiURL = "https://api.tomtom.com/search/2/geocode"
# apiKey
adresse = quote("87 rue du Page, Bruxelles")
tomtomURL = "{0}/{1}.json?limit=1&countrySet=BE,FR&language=fr-FR&key={2}".format(apiURL,adresse,apiKey)
#tomtomURL = apiURL+'/'+adresse+'.json?limit=1&countrySet=BE,FR&language=fr-FR&key='+apiKey
getData = urlopen(tomtomURL).read()
result = json.loads(getData)
print(result['results'][0]['position'])
#0 ON Récupère le fichier json et on le convertit en tableau dejaTweetes = ['19809898', '1798798798798', '87987987987987'] #1 RÉCUPÉRER UN TWEET QUI CONTIENT LES MOTS "SOUS L'ARBRE" #2 est-ce que l'id de ce tweet est dans le tableau dejaTweetes? ##Si oui, on ne fait rien ##Si non, on exécute le traitement et on ajoute l'id du tweet au tableau dejaTweetes #à la fin, on enregistre le tableau dans un fichier json externe
20/02/2020: web scraping
Librairies Python
- pour naviguer:
- pycurl (http://pycurl.io/)
- urllib2 (https://docs.python.org/2/library/urllib2.html)
- requests (https://requests.readthedocs.io/en/master/)
- mechanize (https://mechanize.readthedocs.io/en/latest/index.html)
- pour parser:
- beautifulsoup (https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
- lxml (https://lxml.de/xpathxslt.html)
- cssselect (https://cssselect.readthedocs.io/en/latest/)
- User agent :
- What is my browser (https://www.whatismybrowser.com/guides/the-latest-user-agent/firefox)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import mechanize
import lxml.html as parser
import cssselect
#01. naviguer sur le site cible
### on déclare un browser
br = mechanize.Browser()
### on ajoute des infos sur le navigateur
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0')]
### on ignore la gestion des robots du serveur
br.set_handle_robots(False)
### on récupère le code source de la page
data = br.open('https://poesie.webnet.fr/lesgrandsclassiques/Authors/B', timeout=10)
#print(data.read())
#02. parser la source pour récupérer les liens
source = data.read()
#unicode_src = source.decode('utf-8', 'ignore')
tree = parser.fromstring(source)
##pour chaque objet de type selector déduit du sélecteur css
for selector in cssselect.parse('.author-list__link'):
##on convertit l'objet selector en xpath
xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector)
##pour chaque lien trouvé par ce xpath
for link in tree.xpath(xpath_selector):
print(link.get('href'))
print(link.text_content())
#!/usr/bin/python
# -*- coding: utf-8 -*-
import mechanize
import lxml.html as parser
import cssselect
import random
def getHtmlTree(url):
### on récupère le code source de la page
data = br.open(url, timeout=10)
#print(data.read())
#02. parser la source pour récupérer les liens
source = data.read()
#unicode_src = source.decode('utf-8', 'ignore')
tree = parser.fromstring(source)
return tree
def getRandomLink(url, cssSelector):
tree = getHtmlTree(url)
##pour chaque objet de type selector déduit du sélecteur css
for selector in cssselect.parse(cssSelector):
##on convertit l'objet selector en xpath
xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector)
##pour chaque lien trouvé par ce xpath
links = tree.xpath(xpath_selector)
return random.choice(links).get('href')
#01. naviguer sur le site cible
### on déclare un browser
br = mechanize.Browser()
### on ajoute des infos sur le navigateur
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0')]
### on ignore la gestion des robots du serveur
br.set_handle_robots(False)
link1 = getRandomLink('https://poesie.webnet.fr/lesgrandsclassiques/Authors/B', '.author-list__link')
#print('https://poesie.webnet.fr'+link1)
url = '%s%s' % ('https://poesie.webnet.fr', link1)
poemeurl = '%s%s' % ('https://poesie.webnet.fr', getRandomLink(url, '.author-list__link'))
poemeTree = getHtmlTree(poemeurl)
#.poem__content
for selector in cssselect.parse('.poem__content'):
##on convertit l'objet selector en xpath
xpath_selector = cssselect.HTMLTranslator().selector_to_xpath(selector)
##pour chaque poème trouvé par ce xpath
poems = poemeTree.xpath(xpath_selector)
print(poems[0].text_content())
#print(poem.text_content())
13/02/2020: writing bot: Twitter API
#!/usr/bin/env python3
# coding: utf-8
from acces import *
import tweepy
import time
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
'''
while True:
api.update_status(status='Tu veux un camembert?')
time.sleep(600)
'''
'''tweets = tweepy.Cursor(api.search, q='fromage', tweet_mode='extended').items(10)
'''
'''
tweets = tweepy.Cursor(api.user_timeline, '@booba', tweet_mode='extended').items(10)
for tweet in tweets:
print('###'+tweet.full_text+'###')
'''
user = api.get_user('@poete_nrv')
print(user.id)
#api.send_direct_message(user.id, 'tu veux un camembert?')
api.create_friendship(user.id, True)
06/02/2020: 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/
Ressources
Créer un bot Twitter
- Créer un compte Twitter
- Convertir le compte en compte développeur (https://developer.twitter.com/en/apps)
- Attendre la validation de la conversion par Twitter
Voir https://help.twitter.com/en/rules-and-policies/twitter-automation
12/12/2019
La suite
Le poème de base, plus long avec les vers de tout le monde.
Les éditions "Le Canapé" m'avaient donné une mission : un grand roman transformiste. C'est vrai ou faux un ou zéro C'est noir ou blanc larme amme bien le code binaire tout est très claire L'ORDINATEUR Circuits Immenses Zéros et uns Rythment le cod(e). Répétition, Zéros et uns Saut a la ligne, C'est un secret. Écrire à l'ordinateur, ou à la main ? Écrire sur le passé, ou sur demain ? Écrire des mots, ou un poème ? Écrire sur l'amour, ou sur la haine ? Plus de points d’interrogation, écrivez juste une assertion !
05/12/2019: conception édition suite
Évolution du projet
Un livret pour une feuille A3 recto-verso dans une couverture / pochette sur laquelle figure les instructions de pliage / dépliage. La manipulation permet de voir soit les poèmes les uns à la suite des autres soit les codes et les énoncés. Chaque code + énoncé est directement derrière le poème associé.
Outils de travail
serveur ftp: curlybraces.be, ergstudent.curlybraces
pad de travail: https://pad.lvh2.com/p/poetry
accès http: http://curlybraces.be/erg/2019-2020/poetry/
21/11/2019: conception édition
Types de contenus: * l'énoncé en français des programmes * le code source des programmes * les liens entre énoncés et codes sources * le résultat des programmes * les liens entre codes sources et résultats * la poésie initiale en binaire * la poésie initiale en ascii * date et heure de l'exécution * auteurs des programmes * liens entre auteurs et codes sources * liens entre auteurs et énoncés * titre? * typologie de programmes (ajout d'éléments, inversion, random, suppression de caractères) * interaction ou pas
* distinguer code source (couleur?) * vis à vis entre ascii et binaire ou deux parties * manière de montrer l'interaction/l'éxécution -> voir le terminal? capture d'écran? -> date et heure * nom des programmes : auteur ou autre * choix des poésies générées : un certain nombre par programme, une sélection, si oui, quels critères * montrer les échecs d'exécution? * forme évolutive -> reliure languettes metalliques * surrimpressions entre texte généré et code (riso?) * le titre = poème binaire * dernière chose qu'on voit (4ème de couverture?) -> poème ascii * note d'intention * chapitrage -> titres qui sont des chemins dans un disque (/home/lecteur/poesie/titre du poème) * structure du livre **titre **note d'intention **manipulations ***inversion ****énoncé en français ****résultat ****code python ****énoncé en français ****résultat ****code python ***remplacement ****énoncé en français ****résultat ****code python **poème en ascii * quel est le but? rendre clair? jouer sur le brouillage? esthétique du code, choses qui se croisent. -> la lecture du code pour un être humain, quels dispositifs graphiques mettre en place et pourquoi? * thèmes: ajout, suppression, remplacement, inversion, aléatoire * textes résultats: tous les poèmes ont le même nombre de ligne donc ils occupent la même hauteur (celui qui supprime une ligne sur deux -> une ligne sur deux est blanche) * Raymond Queneau, exercices de style -> différents résultats pour un programme * chaque chapitre a une police monospace différente * séparer les résultats des processus de création donc -> une partie avec les vers de chacun en binaire et en ascii -> une partie avec les énoncés et les codes sources classés par typologie -> une partie que les résultats, classés par typologie * deux types de mises en exergue selon les propositions: -> soit on met l'accent sur la traduction entre énoncé, résultat, code source -> soit on met l'accent sur le processus de création, donc du contexte avec des éléments comme date, captures d'écran, interactions -> soit on met l'accent sur le rapport entre les différents résultats et donc leurs similarités et différences * proposition: trois livrets ou trois parties distinctes pour les trois types de texte: énoncé, résultat, code source. -> les trois parties ont une autonomie, l'accent est mis sur les différences et similarités entre les textes. La question du contexte d'exécution ou de fabrication se retrouve dans la navigation (marges extérieures)
Références publications
http://www.coryarcangel.com/things-i-made/2016-061-the-source-digest-srf-038 et http://www.coryarcangel.com/downloads/the-source-digest-2016-061-digital-master-ih.pdf
http://novel.coryarcangel.com/
07/11/2019: Introduction web et html
Notes Internet
INTERNET réseaux serveur / client data (données) communication (entre machines) -> protocoles décentralisé web navigateur client ftp
Démo html
<!doctype html>
<html>
<head>
<title>Poème</title>
<meta charset="utf-8">
</head>
<body>
<section>
<header>En-tête de la section</header>
<h1>Mon poème</h1>
<h2>Sous-titre</h6>
<article>
<p>
<a href="http://www.curlybraces.be">Transformiste</a> poeme noir
L'immense plus
Le secret ecrit
Les binaires <span>demains</span> rythment
Les mains,
Une haine binaire et une juste haine
L'immense interrogation
Claire repetition juste
Une repetition transformiste :
Des mains, les haines, un plus !
Les secrets blancs et le faux demain
Les missions blanches,
L'assertion vraie ?
Claire edition transformiste
Un saut juste
Claire mission claire
L'ordinateur juste ou une noire assertion
Blancs ordinateurs clairs
Une grande mission ecrit !
Une noire assertion ecrit,
Les points immenses et blancs
Le poeme ecrit
Noir passe faux
L'edition.
La vraie edition m'avait donne ?
</p>
</article>
<footer>pied de page</footer>
</section>
</body>
</html>
24/10/2019: Poésie algorithmique avec Python suite et fin
Le programme de Lena
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Pourquoi ne pas essayer d'inverser le premier et dernier mot de chaque phrases. Ainsi que la première et la dernière lettre du premier mot de chaque phrases.
'''
with open('poetry', 'r') as teteLecture:
poeme = teteLecture.read()
poemeLignes = poeme.splitlines()
'''
for ligne in poemeLignes:
print(ligne)
for compteur in range(0, len(poemeLignes)):
ligne = poemeLignes[compteur]
'''
for ligne in poemeLignes:
words = ligne.split(" ")
# 0 1
#['la', 'maison']
premierMot = words[0]
premiereLettre = premierMot[0]
#premierMot[0] = premierMot[len(premierMot) - 1]
premierMot = premierMot[len(premierMot) - 1] + premierMot[1:]
#naison
premierMot = premierMot[:len(premierMot)-1] + premiereLettre
#premierMot[len(premierMot) - 1] = premiereLettre
words[0] = premierMot
#la
words[0] = words[len(words)-1]
#['maison', 'maison']
words[len(words)-1] = premierMot
#['maison', 'maison']
print(' '.join(words))
'''newline = ""
for word in words:
newline = newline + word + " "
print newline
'''
Dernier énoncé
Le programme demande à l'utilisateur le nombre de vers à générer. Le programme génère autant de vers aléatoires que le nombre entré par l'utilisateur, à partir des mots du poème source et en utilisant la formule syntaxique "article + nom + complément + verbe" Une fois que ça marche deux améliorations possibles: * accorder en genre et en nombre les phrases (ortographe inclusive ou non) * avoir plusieurs formules syntaxiques et les choisir aléatoirement (ou selon une certaine logique) à chaque vers
Poèmes générés
17/10/2019: Scripts python suite
Les editions "Le Canape" m'avaient donne une mission : un grand roman transformiste. Cest vrai ou faux un ou zero Cest nomr ou blanc larme amme bien le code binaire touts est tres claire L ORDINATEUR Circuits Immenses Zeros et uns Rythment le cod(e). Repetition, Zeros et uns Saut a la ligne, C'est un secret.
Le programme de Claudia
Résolution collective de l'énoncé posé par Claudia
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Un programme qui demande à l'utilisateur « pair ou impair ? ».
Si l'utilisateur répond « pair », ne sont affichées que les lignes paires.
Si l'utilisateur répond « impair », ne sont affichées que les lignes impaires.
'''
with open('poetry', 'r') as teteLecture:
poeme = teteLecture.read()
poemeLignes = poeme.splitlines()
'''
0 1 2 3
['Première ligne', 'Deuxième ligne', 'Troisième ligne', 'Quatrième ligne']
'''
print("pair ou impair?")
#reponse = input()
reponse = raw_input()
print(poemeLignes)
if reponse == "impair":
#afficher les lignes paires
indice = 0
else:
#afficher les lignes paires
indice = 1
while indice < len(poemeLignes):
print(poemeLignes[indice])
indice = indice + 2
10/10/2019: Scripts python
Donnez-moi un P!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from time import sleep
import time
print("Qui est-ce?")
name = raw_input()
name = unicode(name, "utf-8")
message = 10
print("Salut %s %s" % (name, message))
for i in range(0, len(name)):
print("Donnez-moi un %s " % name[i])
for j in range(0, 5):
print(name[i])
sleep(0.5)
print("%s!" % name)
Oh ben t'es tout vieux
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
<
>
<=
>=
==
!=
'''
print("Quel âge as-tu?")
age = int(raw_input())
#age = input()
if age < 10:
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 tout vieux")
else:
print("Oh ben t'es tout vieux")
Le programme de Zoé
Résolution collective de l'énoncé posé par Zoé : Le programme permute les mots de moins de 3 lettres, et les mots de plus de 5 lettres.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Le programme permute les mots de moins de 3 lettres, et les mots de plus de 5 lettres.
with open('poetry','r') as lecture:
poyeme = lecture.read()
poyeme_lines = poyeme.splitlines()
#Etape 1: enregistrer tous les mots de plus de 5 lettres dans un tableau
plus_cinq = []
for poyeme_line in poyeme_lines:
words = poyeme_line.split(' ')
for word in words:
nbLettres = len(word)
if nbLettres > 5:
plus_cinq.append(word)
#print(plus_cinq)
#Etape 2: enregistrer tous les mots de moins de 3 lettres dans un tableau
moins_trois = []
for poyeme_line in poyeme_lines:
words = poyeme_line.split(' ')
for word in words:
nbLettres = len(word)
if nbLettres < 3 and word != '':
moins_trois.append(word)
#print(moins_trois)
#Etape 3: parcourir le texte et remplacer les mots de moins de 3 lettres par les mots de 5 lettres et inversément
compteur_permutations_moins_trois = 0;
compteur_permutations_plus_cinq = 0;
for poyeme_line in poyeme_lines:
words = poyeme_line.split(' ')
new_line = ''
for word in words:
#une condition qui teste si le mot fait moins de 3 lettres
if word in moins_trois:
new_word = plus_cinq[compteur_permutations_moins_trois % len(plus_cinq)]
compteur_permutations_moins_trois = compteur_permutations_moins_trois + 1
#print(new_word)
new_line = new_line + " " + new_word
elif word in plus_cinq:
new_word = moins_trois[compteur_permutations_plus_cinq % len(moins_trois)]
compteur_permutations_plus_cinq = compteur_permutations_plus_cinq + 1
new_line = new_line + " " + new_word
#print(new_word)
else:
new_line = new_line + " " + word
#print(word)
print(new_line)
03/10/2019 : introduction langages
Poésie binaire: suite
100001001100101010000011100101100101110011111001011101110010000011101101100001110110011101000001101110000111011001110011010000011011011100101110111011100111100101111001101000001111010110100111000111101000000011011101101100101111001011110101100111110110111001011101100110010111011101111110000110110101101101001110010111100100100000100010011000011100111110010111011100100000111011111001011001010001101110010111011100100000110010111001011101110010000011001001100001110011101000001101110110100111001011110100000110110011101101111110111111010011110100010000011011011100101110010111001001000011101001100101111001011101011100111 100110011001011110011010000011001011100100110100111101001101001110111111011101110011000110101000101001100110010101000001000011110000111011101100001111000011001010100010000110111011010100111110000111101101100001110100111001011101110111010001000001100100110111111011101101110110010100011011110101110111011001010100000110110111010011110011111001111010011101111110111001000000111010000110111101011101110010000011001111110010110000111011101100100010000011100101101111110110111000011101110000110111101001110010110000111011101110011110011011011111110010110110111010011110011111010011001010101110 1000011 1100101 1110011 1110100 0100000 1110110 1110010 1100001 1101001 0100000 1101111 1110101 0100000 1100110 1100001 1110101 1111000 0001101 1110101 1101110 0100000 1101111 1110101 0100000 1111010 1100101 1110010 1101111 0100000 0001101 1000011 1100101 1110011 1110100 01000001101110 1101111 1101101 1110010 0100000 1101111 1110101 0100000 1100010 1101100 1100001 1101110 1100011 0100000 0001101 1101100 1100001 1110010 1101101 1100101 0100000 1100001 1101101 1101101 1100101 0100000 1100010 1101001 1100101 1101110 0100000 0001101 1101100 1100101 0100000 1100011 1101111 1100100 1100101 0100000 1100010 1101001 1101110 1100001 1101001 1110010 1100101 0100000 0001101 1110100 1101111 1110101 1110100 1110011 0100000 1100101 1110011 1110100 0100000 1110100 1110010 1100101 1110011 0100000 1100011 1101100 1100001 1101001 1110010 1100101 10011000100000100111110100101000100100100110011101000001101010010001011010101101001000011011001010101111101010110001010100000101001110000011001110101001101000001000101101001010100101000101101010110100100001101101000010011111010101101001001000001000100100010110100110100000100011110100101001111101001101000001010100101100110100001000101101001100011011000100100010110100110100000101011010010011000101101010110110000100000101000010100101001001100111010000111001001101000010001011010011000110110011001000001010000010101101001001100010101000001000100101010101000001010000101001010010011001110100001110001010001101100110010001010100000100001110010001001111100100110110000100000100010010101010100000101001010011111001001000110110000110100000100010110100111010100010000010101001001111100100101000001010001101010110010010100000101001010010011001110100001110001010001101100001101000001000101101001110101000100000100110110011111001001010000010100011010101100100101000001000010100111110010011010100 100001111010011110010110001111101011101001111010011100110100000100100111011011101101110010111011101110011110010111100110001101101000111010111010010100000111001101001111100001110011111001011101110110001111001011101110111010000011011010110110000111100101101001110000111101001101001110111111011101110011000110110100001110010110111111001101110101111001111010011101111110111001000001100100110010100011010110000010000011001011110100010000011001001100101010000001100010001101100110011000011101110110011111000011100111100101010000011001000100111111010111011100001101100111010111101001110010110010101000001110101110111011010011110110110010111100101110011 1011010110010111100101101111111001101000001100101111010001000001110101110111011100110001101101001011110011110100110100011011011100101110111011101000100000110110011001010100000110001111011111100100010100011001010101001010111000011011010010110010111100001100101111010011010011110100110100111011111101110010110000011011011010110010111100101101111111001101000001100101111010001000001110101110111011100110001101101001111000011110101111010001000001100001010000011011001100001010000011011001101001110011111011101100101010110000011011000011010011111001011110011111010001000001110101110111001000001110011110010111000111110010110010111101000101110 10011111100011110001111010001101001SP1100100SP11101001100001110110011100001100001SP110100111011011110000110110011011111110010110000111011101101111SP11010011101100SP1110010110100111000111101111111001011001001101111CR11001001101001SP1100011110111111011011110000110010111011101110011110000111100101100101SP119991111919911101111SP110001111011001011000SP1100101SP11100111110100110000111101001101111SP111010011011111101100111010011011110101110CR1100001110110011011001100001SP11100111101111110011111101100110100011100001SP110010011001011101100SP110110111010011101111SP11100001100101111010011101001101111SPCR11010001100001SP1100010111010111100111110011110000011110100110111SP11001011100100SP1101000110111SP1100001111000011001011110010111010011011111011110CR100111011001011101100SP1110100110010111100101110010110111111100101100101SP11001001100101110110011011001100001SP1110100110000111011101100001SP1100010111010111010011100001SP0101100CR11001111110000011011100110110011001011100111110011111010011100001110111011101001100101SP11000111110111111011011100101SP111010111011101100001SP1100010110111111000010101100CR11010001101111SP1110010110100011100011110111111011101101111111001111000111101001111010111101001101111SP11011001100001SP111001111001011101110111001111101001110001011010011101100110100111101001100001SP11101011101101110000111011101100001CR110100011101110SP1110101SP11101001101111111001011100111101111SP11001001101001SP11000111100001111001011011101100101SP110001111000011110010110111011000010101110
Le code ci-dessus converti en caractères (binaire vers ASCII) grâce à moulinette.py:
B2P92srw;0v:pv9P6rw9ryP=4qt;2y=3vrv2w?k4ry"0srw;reen een dag nietNooit meedCSKW Les editions"Le Canape"m'avaient donneune mission :un grand romantransformiste. Cest vrai ou fauxun ou zero Cest nomr ou blanc larme amme bien le code binaire touts est tres claire L ORDINATEURJ_+A'&A%%+$&A%&A)3!&-+0A!%!&-A*A!%0A*A%'(A)A#+A%'(A#+A Circuits ImmensesQkRAfOCOK]GK]heSCiS_]f_MkgS_\AIJ�`AKhAIJ@b]OCOW86:z92P:w4{2y9 Zeros et unsRythment le cod(e).Repetition,Zeros et unsSaut a la ligne,C'est un secret.
Tentatives de classements des langages de programmation
css, html, javascript + jquery python, ruby, C, Assembleur, PHP Processing, Java, C++, XML, binaire, ASP, Pascal, Turbo pascal, C#, SQL -------------------------------------------------- Langage web -- langages côté client css, html, javascript + jquery, XML -- langages côté serveur ASP, PHP, ruby, python, java, javascript -- langage côté serveur spécifique aux bases de données SQL Langage pas web assembleur, binaire processing, java, python, C, C#, C++,Pascal, Turbo Pascal, ruby javascript (nodejs), XML, html, css, PHP ------------------------------------------------- Langages compilés C, C#, C++,Pascal, Turbo Pascal, assembleur, java, python, Processing -> le compilateur convertit le langage de haut niveau vers le binaire Langages interprétés javascript, XML, html, css, PHP, python, ruby ----------------------------------------------- Langages orientés objets C++, Java, Processing, Python, javascript, ruby Langage procéduraux C, Pascal, Turbo Pascal, assembleur ------------------------------------------------- Langages descriptifs html, css, xml Langages algorithmiques Les autres XML <users> <user> <name>Lionel Maes</name> <email>lionel@lavillahermosa.com</email> </user> <user> <name>Protch</name> </user> </users> HTML <body> <h1>Le titre de la page</h1> <article>Et le texte de l'article</article> </body> javascript alert('coucou les amis'); alert('vous avez bien dormi?'); ------------------------------------- Processing (Java) print("coucou les amis"); Javascript console.log("coucou les amis"); Python print("coucou les amis") PHP echo "coucou les amis"; ---------------------------------------------------------- Python x = 0 PHP $x = 0; BASH x=0
Hello python
#!python
# -*- coding: utf-8 -*-
print("Qui est-ce?")
name = input()
#name = raw_input()
#La ligne ci-dessous affiche Salut et le nom de l'utilisateur
#print("Salut "+name)
#boucle infinie
'''
while True:
print("Salut "+name)
print("Comment ça va?")
'''
#boucle while avec compteur
'''
compteur = 0
while compteur < 10:
print("Salut "+name)
compteur = compteur + 1
'''
#boucle for avec compteur
'''
for compteur in range(0, 10):
print("Salut "+name)
'''
'''
0 1 2 3 4 5
['L'|'i'|'o'|'n'|'e'|'l']
'''
print(name[2])
indice = 2
print(name[indice])
print("boum c'est fini")
Exercice : donnez moi un P, donnez moi un Y...
Écrire un programme Python qui affiche les lettres d'un prénom les unes à la suite des autres.
26/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 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 10 11 12 13 20 0 1 10 11 100 101 110 111 1000 16 8 4 2 1 1 0 1 1 1 90 9 1 0 0 couleur 128 64 32 16 8 4 2 1 1 1 1 1 1 1 1 1 0000 0000 0000 0010 = 255 00000000 = 8 bits = 1 byte = 1 octet FF 00 00 ---------- 1 1 1 1 1 1 1 a 1 0 0 0 0 1 1 a 1 1 0 0 0 0 1 b 0 1 0 0 0 1 1 b 1 1 0 0 0 1 0 c 1 1 0 0 0 1 1 c 1 1 0 0 0 1 1 d 0 0 1 0 0 1 1 d 1 1 0 0 1 0 0 A 1 0 0 0 0 0 1 A 1 0 0 0 0 0 1 F 0 1 1 0 0 0 1 F 1 0 0 0 1 1 0
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:
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 jeudi 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).