21 janvier 2015 Association Philotechnique, Paris Bertrand Roehner: ROEHNER@LPTHE.JUSSIEU.FR http://www.lpthe/jussieu/~roehner/teaching5.html COURS DE PROGRAMMATION SOMMAIRE ************ Chapitre 1 Le monde des ordinateurs *** Tours de table pour connaitre vos souhaits *** Le monde des ordinateurs: deux architectures. *** L'architecture en infonuage (``cloud computing'') *** Windows et LINUX *** Comment expliquer le succes de Windows? *** De quoi l'avenir sera-t-il fait? *** Cliquer ou programmer? *** En informatique, pour creer il faut programmer *** Pourquoi l'Europe est-elle tragiquement a la traine? *** Le role des fondations dans le developpement informatique *** Le cas de Wikipedia ************ Chapitre 2 Qu'est ce qu'un langage de programmation? *** Paralleles entre un langage de programmation et une langue *** L'obstacle majeur: comment corriger les erreurs? *** Le formalisme du codage: parallele avec l'ecriture de la musique *** Un large choix de langages: html, javascript, C, C++ *** Pourquoi apprendre la programmation en creant des images? *** Le dilemme: faire simple mais pauvre ou bien riche mais complique. ************ Chapitre 3 Instructions en ligne de commande *** Telecharger le logiciel PAW sur votre portable *** Exemples simples d'instructions *** Notions de graphique et de coordonnees *** Difference entre variable passive et variable active *** Segment de droite joignant deux points *** Plusieurs graphiques sur la meme page *** Utilisation de vecteurs *** Exemple d'une commande pourvue de plusieurs options ************ Chapitre 4 Notions de base de la programmation *** Executer une macro sous Windows *** La macro a tiroirs anim3.kumac *** Difference entre une variable et sa valeur *** Operations simples *** Commande GOTO -> 1: *** Execution sequentielle *** Commande IF ... (si...) *** Un jeu: qui a les reflexes les plus rapides? *** Forme plus generale de la commande IF: IF... THEN *** Boucle DO *** Interpreter les messages d'erreur *** Exercice a tenter chez vous: somme des premiers nombres ************ Chapitre 5 Application des notions de base *** Macros simples *** Moins simple! Doubles crochets *** Premiere application: passage aux majuscules ou minuscules *** Second exemple d'application: Mr, Mme, Mlle *** Second exemple d'application: Mr, Mme, Mlle *** Troisieme application: nombre de lettres *** Notion de macro utilitaire *** Importance des macros utilitaires *** Exercice a tenter chez vous: ecriture d'autres dialogues ************ Chapitre 6 Stuxnet inaugure les armes informatiques *** Cibles des virus *** Pourquoi faut-il des centrifugeuses a l'Iran? *** Deroulement de l'operation ``Stuxnet'' *** Autre moyen pour introduire un virus: les disques durs ************ Chapitre 7 Capture d'un drone americain par l'Iran (2011) *** Prise de controle du drone *** Les reactions americaines *** Conclusion ************ Chapitre 8 Le reseau de calcul mondial du LHC *** Le LHC *** Collisions de protons au LHC *** Pourquoi le LHC produit-il un flux enorme de donnees? *** Caracteristiques techniques du LHC *** Le reseau de calcul du LHC *** Comparaison entre le RHIC, le Tevatron et le LHC OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ************ Chapitre 1 Le monde des ordinateurs *** Tours de table pour connaitre vos souhaits. Mieux comprendre vos souhaits me permettra de mieux repondre a vos attentes. Tour de table 1: Pourquoi vous etes vous inscrit a ce cours et qu'en attendez-vous? Etes vous inscrits a d'autres cours? Tour de table 2: Avez-vous entendu parler de Linux? Qu'en savez-vous? Avez-vous entendu parler de MATLAB? Qu'en savez-vous? Tour de table 3: Est-ce que vous pourriez envisager de consacrer un peu de temps a faire des tests chez vous ou bien dans un transport en commun (train, RER)? Si, pour une raison ou une autre, vous decidez par la suite d'arreter ce cours, n'hesitez pas a m'en parler au prealable. Le cas echeant ce genre d'information me permettra de mieux repondre aux attentes dans une annee ulterieure. *** Le monde des ordinateurs: deux architectures 1975-1990: L'architecture: serveur-clients ordinateur central (mainframe) + multiples terminaux (computer terminals) t | t- OC - t | t Dans cette architecture les logiciels sont disponibles sur l'ordinateur central. Les terminaux n'ont que des fonctions reduites leur permettant de servir d'interface entre l'ordinateur central et le terminal. L'utilisateur peut lancer l'execution d'un programme. L'ordinateur central va l'executer et transmettre les resultats au terminal de l'utilisateur. On retrouvera cette relation 30 ans plus tard avec les telephones portables. 1990-2015: Des ordinateurs personnels plus ou moins relies en reseau. PC=Ordinateur personnel (Personal Computer) developpe initialement par IBM pc-pc-pc-pc-pc-pc ou pc=pc=pc=pc=pc=pc Dans cette architecture tous les ordinateurs disposent de tous les logiciels que l'utilisateur peut etre amene a utiliser. La consequence est que chaque utilisateur doit acheter ces logiciels et que son ordinateur doit avoir suffisamment de memoire pour les heberger. C'est evidemment une solution qui n'est ni economique, ni rationnelle puisqu'on duplique a l'infini ce qui etait auparavant partage. C'est en somme la meme difference qu'entre un train et des voitures individuelles. Quelle est la difference entre pc-pc-pc-pc-pc-pc ou pc=pc=pc=pc=pc=pc? Dans la seconde architecture, tous les fichiers, aussi bien les logiciels utilitaires que les fichiers personnels des utilisateurs, sont partages. Cela permet a chaque utilisateur de faire des calculs (ou toute autre operation) sur n'importe quel ordinateur du reseau. C'est en somme une formule proche de celle de l'ordinateur central mais avec une plus grande integration puisque tous les fichiers sont partages et non pas seulement les logiciels. 2010 -> Par le biais des telephones portables (ainsi que des tablettes) on revient a l'architecture de l'ordinateur central. Deux choses ont change toutefois: (1) Le vocabulaire. ordinateur central -> serveur terminal -> telephone portable ou tablette logiciel -> application (2) Les contenus echanges. Alors que dans les annees 1980s, il s'agissait essentiellement d'applications scientifiques maintenant c'est de la musique, des films, des nouvelles. *** L'architecture en infonuage (``cloud computing'') L'architecture appelee ``cloud computing'', litteralement calcul en nuage, mais plus communement appele calcul en reseau ou infonuage est en somme un retour a l'architecture vue en premier lieu avec un ordinateur central et des terminaux mais avec cette difference que l'ordinateur central n'est plus un ordinateur unique mais en fait une grappe d'ordinateurs qui peuvent ne pas etre situes au meme endroit ou qui peuvent meme etre dans des pays differents. Comme exemple d'application on peut citer les jeux video. Le jeu en reseau permet de jouer a des jeux video sur son ecran d’ordinateur alors que le logiciel de jeu tourne sur des serveurs a distance. Ceux-ci renvoient la video de ce qui a ete joue en lecture en continu (ce qui est communément appelé ``streaming''). Ainsi avec ce systeme il n'y a plus besoin de console de jeu. Les joueurs doivent seulement posseder un ordinateur relie a l'Internet et une manette de jeu. Cependant, il faut realiser que par la multiplication des intermediaires le fonctionnement en reseau diminue la continuite et donc la qualite du service par rapport à celle d'un jeu heberge localement. Une autre illustration de cette reduction de qualite est donnee par les liaisons telephoniques par ``Skype''. Pour les liaisons longue distance, certains jours c'est telement mauvais que c'est quasiment incomprehensible. Pour l'instant la generalisation du systeme infonuage aux ordinateurs reste tres partielle, de l'ordre de 10% vers 2010. Un frein a l'extension de ce systeme est du aux problemes de securite. Une banque, une grande entreprise ou bien le ministere de la defense ne peuvent pas se fier aux services de societes d'infonuage comme Google ou Oracle dont les serveurs sont situes essentiellement aux Etats-Unis et dont on sait depuis les revelations d'Edgar Snowden qu'elles ont passe des contrats de partenariat avec la ``National Security Agency'' americaine pour espionner les pays etrangers. Sur un site Internet date de 2014 on peut lire: ``Microsoft's Azure [formerly called Windows Azure] is the only real threat to LINUX cloud dominance. All other major cloud software platforms are based on Linux and open source software''. Ce qu'on peut traduire par: Azure, la plate-forme en nuage de Microsoft [avant 2014 elle s'appelait Windows Azure] est le seul concurent non-LINUX dans le secteur du calcul sur reseau. A part cela, toutes les principales plateformes de calcul sur reseau sont basees sur Linux et sur des logiciels libres et ouverts. Cela nous amene a regarder de plus pres les relations entre Windows et LINUX. *** Windows et LINUX Windows et LINUX sont deux systemes d'exploitation. Cela nous amene a nous demander ce qu'est le systeme d'exploitation d'un ordinateur. Comme vous le savez sans doute, a leur niveau le plus elementaire les ordinateurs marchent sur un mode binaire; ils ne connaissent que deux signaux 0 et 1. A ce niveau on est dans du tres rudimentaire. Le systeme d'exploitation (``operating system'' en anglais) est l'interface entre les informations que vous entrez dans l'ordinateur et le niveau des signaux binaires ou se font reellement les operations. On pourrait penser qu'il existe de nombreux systemes d'exploitation. En fait, fondamentalement il n'en existe que deux: Windows et LINUX. Bien sur pour chacun de ces systemes il y a eu des versions successives. Vous connaissez tous Windows XP, ou Windows Vista ou Windows 7. Windows a ete a l'origine concu par Microsoft pour les ordinateurs personnels individuels. Dans les annees 1980s ce fut MS-DOS: Microsoft Disk Operating System, puis dans les annees 1990s ce fut Windows et ses versions successives. Au contraire, des les annees 1980s UNIX et son successeur LINUX ont ete concus pour permettre aux ordinateurs de communiquer entre eux. C'est une difference capitale. Sous Windows les ordinateurs ne peuvent communiquer entre eux que de facon tres malaisee. La communication dont il est question ici n'est pas juste l'envoi de messages electroniques mais le fait de pouvoir faire des calculs a distance sur une autre machine. A l'heure actuelle, environ 90% des ordinateurs utilises dans le monde fonctionnent sous Windows. Qu'en est-il des 10% restants? LINUX est present lorsqu'on a besoin de faire communiquer les ordinateurs. * La grande majorite des serveurs (c'est-a-dire les noeuds du reseau Internet) fonctionnent sous LINUX. * LINUX est aussi present dans des laboratoires scientifiques en particulier aux Etats-Unis et en Europe. C'est le cas du laboratoire ou je travaille. * LINUX est aussi utilise par les systemes d'exploitation des telephones portables. Ainsi ``Android'' est un systeme d'exploitation pour ordiphones (l'appelation francaise pour ``smartphone'') base sur LINUX et developpe par la societe americaine Google. * LINUX est egalement utilise dans les services de calcul en reseau dont on va parler dans un moment. *** Comment expliquer le succes de Windows? LINUX est un logiciel gratuit et ouvert. Ouvert signifie que n'importe quel utilisateur peut en principe lire le code du logiciel qu'il utilise. De plus, il permet une communication facile entre ordinateurs. Par ailleurs la plupart des logiciels qui fonctionnent sur les machines LINUX sont egalement gratuits et ouverts. Au contraire, Windows est un logiciel qui n'est pas gratuit et qui est opaque dans le sens ou on ne peut pas acceder au code-source c'est-a-dire a ses lignes de programme. Un systeme opaque comme Windows pose de redoutables problemes de securite car il peut fort bien (a dessein ou non) contenir une faille qui permettra a une personne exterieure de s'immiscer dans l'ordinateur. Je vous raconterai une telle histoire lors d'un cours ulterieur. Par ailleurs, comme on l'a deja dit, Windows ne permet pas une communication facile entre ordinateurs. Mais alors comment expliquer le succes prodigieux de Windows? On peut citer plusieurs raisons. * Le prodigieux developpement des ordinateurs personnels INDIVIDUELS dans les annees 2000s a conduit assez naturellement a la predominance de Windows qui avait ete cree dans cette optique. * Par ailleurs, comme vous le savez, lorsqu'on achete un ordinateur Windows y est installe d'office. Cela est bien sur une formidable incitation. Il y a eu, a la fois en Europeet aux Etats-Unis des plaintes pour atteinte au libre jeu de la concurrence, mais dont il n'est jamais sorti grand chose. * Une troisieme raison est que Windows se prete bien mieux a une utilisation occasionnelle que LINUX car, comme on va le voir dans un instant, LINUX exige bien davantage de comprendre ce que l'on fait. *** De quoi l'avenir sera-t-il fait? L'epoque des ordinateurs individuels faiblement connectes ou vous etes obliges de telecharger tous les logiciels que vous voulez utiliser, cette epoque parait revolue. C'est non seulement une perte de temps mais aussi un gachis d'espace memoire. L'architecture centree sur des serveurs ou des milliers d'applications sont disponibles (sans qu'il soit necessaire de les telecharger) parait etre l'avenir. Le futur de Windows tel qu'on l'a connu jusqu'a present parait donc compromis. Cependant les ordinateurs n'ont pas encore pris le virage qu'ont pris les telephones. Il est clair que dans les versions futures de Windows, Microsoft va essayer de prendre ce virage tout en conservant sa part de marche. Il faut noter que Microsoft est deja tres present dans les services de calcul en reseau. Comment ce virage se fera-t-il? On peut penser que cela dependra largement de ce qui va se passer en Chine. Pourquoi? Jusqu'ici Windows avait 100% du marche chinois. Quoique LINUX ne soit pas inconnu des Chinois, ils ne l'utilisent pas. Or, en avril 2014 il y a eu le probleme de Windows XP. Windows XP est sorti le 25 octobre 2001. Sa commercialisation fut arretee le 30 juin 2008. Le 8 avril 2014, Microsoft arreta la maintenance de Windows XP. Cela signifie en particulier qu'aucun message relatif a des failles (par exemple des failles de securite) ne sera plus publie. Cela signifie aussi que les versions les plus recentes des applications (par exemple les jeux electroniques) ne seront sans doute plus compatibles avec Windows XP. Or entre 40% et 60% des ordinateurs chinois (les chiffres different selon la source) sont a l'heure actuelle (janvier 2015) sous Windows XP. Pour eviter la repetition d'un semblable probleme avec des versions ulterieures de Windows, le gouvernement chinois a recommande aux administrations et aux entreprises d'Etat de ne plus s'equiper avec Windows mais d'utiliser une version chinoise de LINUX. Cette recommandation sera-t-elle suivie? Durant l'automne 2014, lors d'un sejour a Pekin, mes collegues chinois m'ont dit qu'ils avaient beaucoup de mal a acceder a Google. Par contre sur le poste LINUX que j'utilisais on pouvait acceder a Google sans le moindre probleme (hormis la lenteur de certaines connections). Cependant cette incitation n'a pas suffi a faire basculer mes collegues de Windows a LINUX. En principe, selon les plans du governement chinois, chaque annee environ 15% des ordinateurs des entreprises d'Etat devraient basculer de Windows a LINUX. Ainsi la transition devrait etre achevee en 6 ans c'est-a-dire en 2020. Cela se fera-t-il? *** Cliquer ou programmer A l'epoque (evoquee ci-dessus) des ordinateurs centraux avec terminaux ces derniers n'avaient pas de souris. Cliquer etait donc exclu. Comment faisait-on? Prenons comme exemple l'impression d'un fichier (appele a.txt) Comment fait-on en cliquant? On clique sur l'icone (1) -> le fichier s'ouvre a l'ecran -> puis on clique sur le menu ``Fichier'' (2) -> ce menu s'ouvre a l'ecran -> puis on clique sur ``Imprimer'' (3) -> une fenetre s'ouvre -> dans cette fenetre il y a un menu donnant la liste des imprimantes -> on clique sur une des imprimantes (4) -> dans la fenetre d'impression il y a aussi une case permettant de choisir le nombre d'exemplaires, on tape par exemple ``2'' (5) -> puis on clique sur la case ``Imprimer'' (6) -> puis il faut refermer le fichier qu'on a ouvert, pour cela on clique sur ``Fichier'' (7), puis sur ``Quitter'' (8). Au total 8 clics. Comment fait-on sans cliquer? Par exemple sous LINUX, sans avoir besoin d'ouvrir le fichier au prealable on va taper dans la fenetre de commande la ligne suivante: lpr -Partaban -#2 a.txt lpr est l'abbreviation de ``laser printer'' (imprimante laser) -Partaban indique que le nom de l'imprimante est ``artaban'' -#2 indique qu'on veut deux copies. a.txt indique le nom du fichier a imprimer. C'est assurement plus rapide. De plus la commande lpr comporte quantite d'options que vous n'avez pas forcement dans le menu d'impression. Par exemple, vous pouvez imprimer a la file autant de fichiers que vous voulez. Ainsi: lpr -Partaban -#2 a.txt b.txt c.txt va imprimer deux copies de chacun des 3 fichiers a.txt, b.txt, c.txt. Voici un autre exemple. Supposons que vous ayez un grand nombre de fichiers de type texte et vous voudriez savoir lesquels contiennent le mot ``Michel''. Voici comment faire: grep -iwl *.txt enquete.txt meiji.txt ordres.txt La premiere ligne est l'instruction de commande et elle est suivie des reponses. Il y a donc 3 de mes fichiers qui contiennent le mot physique. Comment faut-il comprendre la premiere ligne? * grep est la commande. -iwl sont des options et *.txt est la cible de la commande. * -i signifie que je ne veux pas faire de difference entre majuscules et minuscules, c'est-a-dire que MICHEL me convient aussi bien que Michel. * w signifie que je ne veux inclure le mot que s'il apparait isolement. Je ne veux pas inclure Micheline. * l signifie que je ne veux connaitre que les noms des fichiers. Sans le l la commande reproduirait la ligne ou se trouve le mot. * Enfin, l'etoile * devant txt est une sorte de caractere joker qui remplace n'importe quel caractere. Peut-etre penserez vous ``si c'est tellement plus facile comment se fait-il que LINUX ne soit pas plus utilise?'' En dehors des raisons commerciales, il y a sans doute aussi une raison intellectuelle. La methode en cliquant ne necessite aucune comprehension. Par contre la seconde methode necessite de comprendre ce qu'on fait. Pourquoi? La commande lpr est en principe destinee a imprimer un fichier de type texte. Si je l'utilise sur un fichier qui est en fait une image, au lieu d'imprimer une image le resultat pourra etre d'imprimer le code qui sert a fabriquer l'image. Non seulement ce sera une impression sans utilite mais de plus ce pourra etre un fichier de plusieurs dizaines de pages. Ce qu'on vient de dire pour l'impression s'applique a toutes les operations. Ainsi si je veux visualiser une image, dans Windows je vais cliquer sur l'icone. Si j'ai le logiciel approprie, l'image va apparaitre sans que je sache trop avec quel logiciel elle a ete ouverte. Au contraire, en utilisant une commande il me faut savoir quel est le type du fichier et avec quel logiciel on peut l'ouvrir. Ainsi, selon le type du fichier je vais taper: * pour un fichier txt -> emacs a.txt * pour un fichier pdf -> acroread test.pdf * pour un fichier Postcript -> gv paw.ps * pour un fichier jpg -> gwenview paw.jpg En resumant, on peut dire que cliquer est une solution de facilite qui permet a l'ordinateur de faire les choses dans votre dos. Au contraire quand vous donnez a l'ordinateur des commandes vous l'obligez a faire exactement ce que vous voulez. Dans ce second cas c'est vous le ``patron'' alors que dans le premier c'est vous qui etes obliges de vous regler sur l'ordinateur. ``Il ne veut pas m'ouvrir ce fichier mais je ne sais pas pourquoi'' peut-on entendre par exemple. Dans la section qui suit vous allez voir que ce choix n'est pas sans consequences economiques. *** En informatique, pour creer il faut programmer En informatique comme dans d'autres domaines, on peut distinguer deux categories: les createurs et les utilisateurs. Par exemple, en prenant l'avion nous sommes des utilisateurs d'un moyen de transport pour lequel il a fallu des createurs. Lorsque nous utilisons Windows ou LINUX nous sommes des utilisateurs. En informatique, une condition necessaire (quoique non suffisante) pour devenir creatif est de pouvoir programmer. Pour vous en convaincre voici une observation simple. Affichez sur votre ordinateur la page de recherche ``Google''. Dans la barre de menus en haut de l'ecran, allez dans Tools -> ``Web developer'' et cliquez sur ``Page Source''. Une fenetre s'ouvre qui contient du code html comme indique par la premiere ligne. Le reste du code est tres touffu et ne permet guere de voir le lien entre le code et la page qui est affichee. Pour voir ce lien plus clairement, allez dans la page d'accueil de ce cours a l'adresse suivante: http://www.lpthe.jussieu.fr/~roehner/teaching6.html Puis, comme precedemment, cliquez sur ``Page Source''. Cette fois le code html qui apparait a un lien bien plus direct avec ce que vous voyez sur la page. Vous voyez qu'il y a deux sortes d'ecriture. * Il y a du texte qui correspond au texte que vous voyez sur la page. * Il y a des choses comprises entre < >. Ce sont des commandes. Ces commandes peuvent etre ou bien passives ou bien actives. Comme exemple de commande passive on peut citer celle qui est au debut de la premiere ligne: definit la taille des caracteres, ici 2 crans plus grand que la taille standard. Un exemple simple de commande active est

qui definit un nouveau paragraphe et va donc provoquer un saut de ligne. Comme exemple plus complique de commande active on peut citer les deux lignes qui commencent par: . Ces deux lignes creent les deux images. A l'interieur de cette commande vous voyez des signes =: SRC="pawc2.jpg" height=250 width=177 align=RIGHT * SRC (abbreviation de ``source'') donne le nom du fichier qui contient l'image. * ``height'' (hauteur) et ``width'' (largeur) definissent la hauteur et la largeur de chaque image. * ``align'' definit le cote ou je veux mettre les images. Dans le cas present elles sont serrees a droite. Par cet exemple vous voyez que derriere chaque site Internet il y a un code que quelqu'un a ecrit. Certes, il existe des modeles de page Internet qui vous permettent de creer votre page sans ecrire une seule ligne en html. Mais vous vous rendez bien compte que derriere le modele qui vous est propose il y a du html (ou un autre langage). Pour partager des fichiers avec d'autres personnes vous pouvez creer votre propre site Internet. Mais cela n'est meme pas necessaire puisque vous pouvez aussi le faire en passant par un logiciel comme ``Facebook'' (qu'on pourrait traduire par ``album de portaits''). Mais la encore, vous vous rendez bien compte que lorsque vous cliquez sur une page ``Facebook'' ca marche uniquement parce que derriere ``Facebook'' il y a un code qui comporte sans doute plusieurs milliers de lignes. En somme, en informatique sans programmation point de creation. Quand nous nous contentons de cliquer nous sommes des sujets dont les actions sont limitees et circonscrites a ce que le createur du code veut bien nous laisser faire. En bref, les programmeurs sont les patrons et les cliqueurs leurs sujets. *** Pourquoi l'Europe est-elle tragiquement a la traine? Il faut helas faire une constation quelque peu amere. Pratiquement tous les langages et tous les logiciels les plus utilises, du moins ceux que je connais, ont ete crees aux Etats-Unis. Pensons a Word, PowerPoint, Excel, Photoshop et bien d'autres. Dans cette industrie l'Europe brille par son absence. Vue l'importance croissante de l'informatique, on peut dire que l'Europe est tragiquement a la traine. Certes, il est vrai que les ordinateurs sont une invention americaine. Cependant, on aurait pu s'attendre a ce qu'au fil des decennies l'Europe rattrape son retard. Cela s'est produit en aeronautique avec des societes comme Airbus ou Ariane Espace. Helas, au cours des 20 dernieres annees, au lieu de se combler, l'ecart s'est accentue. Avec Google, Facebook, Twitter, Amazon, Wikipedia la suprematie de l'industrie informatique americaine est maintenant complete au point que cela pose les problemes de securite que vous savez. A quoi attribuer cette incapacite europeenne? Il y a sans doute deux raisons (i) Penurie de programmeurs (ii) Penurie de financements appropries. Voyons ces raisons plus en detail. * En France et sans doute de facon plus generale en Europe, le nombre des personnes sachant programmer est tres reduit. La programmation est a peine enseignee dans le secondaire. Comme il n'y a pas de CAPES ou d'aggregation d'informatique le peu qui est enseigne l'est comme une annexe du cours de mathematiques. C'est desastreux, car on peut etre un eleve mediocre en mathematiques mais doue pour la programmation. Dans le superieur, il existe certes un cursus d'informatique mais qui est, la encore, trop sous la dependance des mathematiciens. Cela pousse les chercheurs vers des developpements theoriques aux depens de la creation et du developpement de logiciels. La mise au point de logiciels demande patience, constance et continuite, ce que ne permet guere l'organisation actuelle de la recherche scientifique. Celle-ci favorise au contraire le court terme dans la mesure ou il faut publier beaucoup d'articles et epouser les ``modes'' du moment. Des logiciels furent certes crees en Europe (par exemple celui que nous utiliserons) mais aucun n'a reussi a s'imposer mondialement. La raison en fut sans doute un manque de constance et de continuite. En bref, le developpement de logiciels ne devrait etre confie ni a des chercheurs universitaires ni a des entreprises privees. En tous cas pas uniquement. Il faut une structure differente qui est celle que l'on trouve aux Etats-Unis et qui est expliquee ci-dessous. * Dans la seconde raison c'est le mot ``approprie'' qui est important. Aux Etats-Unis il y a un foisement de financements, en apparence a fonds perdus, par divers organismes allant du Departement de la defense a des fondations privees. Comment peut-on s'en rendre compte? *** Le role des fondations dans le developpement informatique Sur Internet il y a pour chaque langage de programmation des sites d'aide aux utilisateurs. Mais quand on compare les forums francais et americains on voit une grande difference. Sur les premiers les reponses tiennent en quelques lignes et sont assez superficielles. Sur les seconds on trouve des reponses tres elaborees au point meme que leurs auteurs ont souvent fait des tests specialement pour repondre. Comme exemple concret, on peut prendre le cas d'un logiciel qui s'appelle ``ImageMagick'' et que nous utiliserons par la suite. C'est un logiciel gratuit et librement telechargeable. Or, on s'apercoit qu'il y a aux Etats-Unis toute une communaute de programmeurs qui ont cree ce logiciel et continuent de le developper. Comment est-ce possible s'agissant d'un logiciel libre? Qui paie ces programmeurs? La reponse nous est fournie par l'article de Wikipedia intitule ``ImageMagick''. C'est la societe du Pont de Nemours (de son nom complet E.I. du Pont de Nemours ou E.I. sont les initiales des deux prenoms du fondateur, a savoir Eleuthere et Irenee) qui fut a l'origine de ce logiciel en 1992 Ensuite c'est la fondation a but non lucratif ``ImageMagick Studio LLC'' qui l'a repris et qui est propriétaire du logiciel. LLC signifie ``Limited Liability Company'' = societe a responsabilite limitee. Autrement dit, les programmeurs qui developpent ImageMagick sont payes par la fondation ``ImageMagick Studio LLC''. A premiere vue cela ressemble a un investissement a fond perdu qui se poursuit depuis 23 ans. En fait, c'est finalement par de tels investissements que l'Amerique a pu assoir sa domination. Comme autre illustration, on peut citer UNIX et LINUX. Nous avons dit plus haut que ces systemes d'exploitation constituent une alternative a Windows. Bien qu'il s'agisse de logiciels libres ils ont aussi ete developpes aux Etats-Unis. *** Le cas de Wikipedia Comme troisieme exemple on peut citer Wikipedia. Cette encyclopedie en ligne est geree par la ``Wikimedia Foundation, Incorporated''. C'est une organisation à but non lucratif creee en juin 2003 et regie par les lois de l'Etat de Floride. Cette fondation possede tous les serveurs installes en Floride sur lesquels sont heberges les projets Wikimedia. En tant que fondation, Wikimedia peut avoir des mecenes et peut recevoir des dons. C'est en somme le statut qu'avaient jadis nos monasteres. Wikipedia dit que son personnel propre est constitue d'une petite equipe mais cela ne prend pas en compte toutes les personnes qui travaillent pour Wikipedia a temps partiel. Mis a part l'ecriture d'articles en anglais, la tache la plus importante de Wikipedia est leur mise en forme et leur traduction en un grand nombre d'autres langues. De fait, la majorite des articles en francais de Wikipedia sont des traductions partielles ou completes des articles originaux en anglais. Quand on sait le temps que prend une traduction on comprend que cela n'est possible qu'avec l'aide de nombreux traducteurs. Ceux-ci ne sont pas payes directement par Wikimedia car il faut entretenir le mythe que Wikipedia est l'oeuvre de volontaires, mais plutot par des fondations associees a Wikimedia. Ces traducteurs peuvent etre des traducteurs professionnels payes comme travailleurs autonomes (en anglais ``freelancer'') ou bien encore de jeunes stagiaires en cours d'etude pour devenir traducteur ou interprete. A titre d'illustration on peut citer l'exemple suivant. Le site Internet suivant: http://en.wikipedia.org/wiki/User:SHurley619 reproduit le temoignage d'un jeune Americain qui en 2013 a travaille en ``freelance'' pour une societe faisant un travail de sous-traitance pour Wikipedia. Il devait mettre en forme (en suivant des instructions tres detaillees) des articles Wikipedia deja ecrits. Son nom de plume etait SHurley619 et il etait paye $20 par article. Son contrat comprenait un engagement de confidentalite (``nondisclosure agreement'') dont il ne donne pas (et pour cause!) le detail. Il etait enregistre comme editeur de Wikipedia et il pouvait choisir lui-meme les articles a remettre en forme. Cela exclut qu'il ait ete engage dans le seul but de mettre en forme des articles de complaisance pour une compagnie specifique, comme cela est suggere sur un autre site Internet. ************ Chapitre 2 Qu'est ce qu'un langage de programmation? *** Parallele entre un langage de programmation et une langue Peut-etre vous posez-vous des questions du genre: * ``Que faut-il faire pour apprendre a programmer?'' * ``Combien de temps faut-il pour apprendre a programmer, un mois, un an ou 10 ans?'' Il est facile de repondre a ces questions en faiant un parallele avec l'apprentissage d'une langue etrangere. Supposons que vous vouliez apprendre l'allemand. Tout d'abord il vous faut apprendre un nombre notable de mots, puis il faut savoir comment les relier pour en faire des phrases qui expriment des idees, des intentions ou des questions. C'est exactement pareil en programmation. Il vaut faut d'abord apprendre un grand nombre d'instructions. Nous avons vu precedemment des exemples d'instructions a propos de l'ecriture d'une page Internet avec html. Puis, il faut enchainer ces instructions pour que votre programme fasse le travail que vous souhaitez. Lorsque vous saurez dire une phrase simple en allemand vous pourrez passer a la phase pratique consistant a vous adresser a un allemand. C'est la que les choses se compliquent car il va falloir comprendre la reponse de votre interlocuteur. Par exemple si vous demandez ``Ou est le bureau de poste'' vous pourrez avoir toutes sortes de reponses: ``Excusez-moi, je n'ai pas compris'', ``Pourriez-vous repeter?'', ``Il n'y a pas de bureau de poste dans ce village'', ``Le bureau de poste est au bout de la rue''. Tres probablement, si vous n'avez eu qu'une ou deux semaines de cours vous ne comprendrez pas la reponse ce qui empechera tout dialogue. En programmation, c'est egalement au niveau de la reponse que les choses se compliquent. C'est ce que nous alons voir dans la section suivante relative aux messages d'erreur. *** L'obstacle majeur: comment identifier et corriger les erreurs? Votre programme va etre lu par le compilateur qui est une sorte de correcteur d'orthographe et de syntaxe informatique: Programme -> lecture par le compilateur -> messages d'erreur Il va donc falloir comprendre les messages d'erreur. Ceux-ci sont (bien sur) en anglais et de plus ils peuvent ne pas etre bien clairs. En fait, leur degre de clarte depend de la qualite du compilateur. Certes, si votre programme est parfait, il n'y aura pas de messages d'erreur; il va uniquement produire le resultat attendu. Mais lors d'un premier essai cela est peu probable. Pour un compilateur donne la clarte du message depend grandement du type d'erreur. Voici deux exemples de messages d'erreur delivres par PAW, le premier fort clair, le second tres opaque. --------------------------------------- *** Unknown command: MESAGE --------------------------------------- *** Break *** Segmentation violation Traceq lun = 0, level = 99 TRACEQ. In-line trace-back still not available. Longjump -------------------------------------- Dans le premier cas on se doute de suite qu'on a fait une faute d'orthographe dans le mot MESSAGE. Par contre, le second diagnostic est completement incomprehensible et opaque. Pourtant l'erreur qui le genere est tres simple. Au lieu de separer deux instructions successives par un point-virgule (;) on les a separe par un double point-virgule (; ;) Ce simple changement affole completement le compilateur qui ne sait quoi repondre a part de dire qu'il est perdu. Cet exemple nous fait toucher du doigt la principale difficulte dans l'apprentissage de la programmation. De la meme facon que la reponse a la question sur le bureau de poste peut varier a l'infini, de meme il y a une tres grande diversite dans les messages d'erreur envoyes par le compilateur. A ce stade il est essentiel de pouvoir demander de l'aide sans quoi le decouragement guette. Revenons a notre question du debut: combien de temps faut-il compter pour comprendre les differentes reponses que peut faire un allemand. Peut-etre 2 a 3 mois d'etude a plein temps. C'est sans doute aussi le temps qu'il faut compter pour pouvoir ecrire un programme simple, comprendre les messages d'erreur du compilateur et rectifier les erreurs. Cependant au bout de 2-3 mois on ne sera pas capable d'ecrire l'allemand correctement. Pour cela il faudra sans doute compter 6 mois a un an. C'est sans doute aussi le temps qu'il faut avant de pouvoir ecrire de facon efficiente un programme un peu complique. Ces remarques peuvent paraitre decourageantes. Que pouvons nous faire en 10 seances? La encore, le parallele avec l'allemand peut nous guider. Si on me donne un modele de phrase, par exemple: ``Aujourd'hui, je fais de la programmation.'' je peux, sans prendre trop de risques, y faire certaines modifications telles que: ``Demain, je ferai de la programmation.'' ``Demain et les jours futurs, je ne ferai que de la programmation.'' C'est de cette facon que nous procederons. Je vous donnerai un canevas (depourvu d'erreur) qui fera une certaine tache. Puis, vous apporterez des modifications a ce canevas de facon a lui faire produire des choses quelque peu differentes. Si des erreurs sont signalees par le compilateur elles seront forcement limitees a vos changements ce qui permettra de les localiser assez facilement *** Le formalisme du codage: parallele avec l'ecriture de la musique La pluplart des langages de programmation ont l'aspect peu engageant d'un formalisme hermetique et incomprehensible. A mon avis, le langage que nous utiliserons me parait un des moins hermetiques. A titre d'illustration, voici dans 3 langages differents comment on fait ecrire ``Bonjour!'' a l'ecran. ---------------------------------------------- * Langage (1): #include int main (void) { puts ("Bonjour!"); return 0; } ---------------------------------------------- * Langage (2): Message Bonjour! ---------------------------------------------- * Langage (3): window.onload = function () { // Recuperation de l'objet mon_canvas dans la variable canvas var canvas = document.getElementById("mon_canevas"); // recuperation du context de dessin 2D var context = canvas.getContext('2d'); // Ecriture du texte Bonjour!" context.beginPath(); context.fillStyle = 'green'; // couleur de remplissage context.font = "18px Helvetica";// taille et choix de la police context.fillText("Bonjour!", 130, 20);//position x=130 px; y=30 px context.stopPath(); } ----------------------------------------------- Quelle facon vous parait la plus simple? Cet exemple a surtout l'avantage de me mettre dans la meme situation que vous. En effet, je ne connais pas du tout le langage (1) qui est du langage C et seulement un peu le langage (3) qui est du Javascript. Cela me permet de realiser a quel point le formalisme de ces langages peut paraitre bizarre au premier abord. Par exemple dans (3) les parentheses () qui ne contiennent rien me paraissent vraiment etranges. En somme, il faut accepter ce formalisme sans se poser trop de questions. Pour prendre un autre exemple, pour une personne qui n'a jamais vu une portee musicale il doit paraitre bien curieux qu'on puisse s'en servir pour jouer de la musique. *** Un large choix de langages: html, javascript, C, C++, PAW, bash Dans la section precedente on a vu 3 examples de langages. Il en existe bien d'autres. Pourquoi y en a-t-il autant et pourquoi sont-ils si differents? Chacun a un objectif particulier. On dit que les esquimaux ont 20 adjectifs differents pour exprimer la qualite de la neige: poudreuse, croutee, gelees, tollee, etc. Ceci est bien sur du au fait que pour leur vie quotidienne la qualite de la neige a une grande importance. Il en est de meme pour les langages. Ils ont tous plus ou moins les memes fonctions de base: faire des operations, ecrire ou lire sur un fichier, etc mais selon leur objet propre ils seront plus riches en instructions dans leur domaine de predilection. Ainsi un logiciel graphique tel que celui que nous utiliserons permet de controler les parametres d'un graphique jusque dans les plus petits details. D'autres comme html ou javascript ont pour objet de faire des choses pour Internet. D'autres comme bash sont specialises dans la manipulation des fichiers mais savent a peine faire une addition. *** Pourquoi apprendre la programmation en creant des images? Comme on vient de le dire, les langages de programmation sont tres divers. Dans ce cours on propose de s'initier a la programmation en creant des images. Pourquoi un tel choix? On peut citer deux raisons. * Creer une motivation * S'assurer par un simple coup d'oeil si le programme se deroule comme prevu. Voyons ces raisons plus en detail. Pour apprendre a parler l'allemand il faut aller dans le pays et pratiquer. Lorsque les Allemands comprennent ce qu'on leur dit on aura fait un premier pas. De meme, pour apprendre la programmation il faut ecrire des programmes, non pas quelques uns mais des dizaines. Tout programme a pour finalite de realiser une certaine tache. Si on veut motiver les etudiants il convient de leur proposer des taches qui ont pour eux un certain interet. Or, a cause du succes des jeux electroniques, des l'ecole primaire de nombreux eleves revent de devenir des createurs de jeux electroniques. La creation d'images et d'animations est sans doute ce qui se rapproche le plus de ce reve. Quand on met au point un nouveau programme il y a deux phases. D'abord il faut s'assurer que le programme ``tourne'' sans generer d'erreur. Ensuite, il faut s'assurer que le programme fait bien ce qu'on veut qu'il fasse. Cette seconde etape peut etre difficile. Supposons que vous ecriviez un programme destine a calculer la trajectoire que doit suivre un engin spatial pour se satelliser autour de la planete Mars. Comment savoir si les resultats donnes par le programme sont corrects? Le seul test vraiment probant est de voir si la mission de la sonde spatiale reussit. C'est manifestement un test tres couteux en argent, en temps et en energie. Quand on realise une image ou une animation, le test est bien plus simple. Il suffit de regarder l'image ou bien de voir comment se deroule l'animation. En un simple coup d'oeil on verra si c'est conforme a l'attente. *** Le dilemme: faire simple mais pauvre ou bien riche mais complique. Une fois que ce choix de creer des images a ete fait le professeur de programmation est devant un dilemme: faire des programmes simples mais qui ne feront que des dessins rudimentaires ou bien faire des images plus realistes mais qui demanderont des programmes plus compliques. Bien entendu il faut commencer par des programmes simples mais si on se cantonne a cela les etudiants risquent d'etre decus. Pour les motiver on leur a promis des animations, il faut donc tenir cette promesse. Pour repondre a ce dilemme on a prevu deux phases, chacune de 3 a 4 seances. Dans la premiere on n'utilisera qu'un nombre reduit (environ une vingtaine) d'instructions. Le but sera d'apprendre a jouer avec ces instructions. On ne pourra creer que des dessins rudimentaires, mais on s'en contentera. Dans la seconde phase on apprendra a utiliser des macros existantes pour creer des images et des animations plus satisfaisantes. ************ Chapitre 3 Instructions en ligne de commande *** Telecharger le logiciel PAW sur votre portable *** Exemples simples d'instructions (1) MESSAGE Bonjour -> affiche a l'ecran la ``chose'' qui suit MESSAGE Exemple: PAW > MESSAGE Bonjour Bonjour Notez qu'a la place de Bonjour on pourrait mettre n'importe quoi Exemple: PAW > MESSAGE addition 1+1=3 2qazx addition 1+1=3 2qazx (2) Difference entre commande et cible Vocabulaire: On dit que l'ensemble ``MESSAGE Bonjour'' est une instruction. Mais dans cette instruction il y a 2 parties distinctes: MESSAGE est la commande, alors que Bonjour est la cible a laquelle la commande s'applique. Vous pouvez changer a votre gre cette seconde partie, mais vous ne pouvez pas changer la commande. Exemples: PAW > MESSAGE Au revoir Au revoir PAW > MESAGE Au revoir *** Unknown command: MESAGE Du fait de la faute d'orthographe, la commande n'est pas reconnue par le compilateur. Celui-ci renvoie un message d'erreur disant ``commande inconnue''. La commande MESSAGE et la cible se distinguent aussi d'une autre facon: pour la commande, vous pouvez utiliser indifferemment des majuscules ou des minuscules, le resultat n'est pas modifie. Par contre pour la cible, les majuscules ou minuscules seront reproduites fidelement. Ceci est pour vous permetre d'ecrire des mots en respectant les majuscules et minuscules. Exemples: PAW > MeSSaGe Bonjour Bonjour PAW > messaGE bonjour bonjour Notez que si vous entrez seulement MESSAGE cela va generer une ligne blanche ce qui est souvent utile pour separer des lignes d'impression successives. Exemple: PAW > MESSAGE PAW > (3) Pour separer deux instructions on met un point virgule Exemple: PAW > MESSAGE a ; MESSAGE b ; MESSAGE c a b c (4) Les instructions successives s'executent dans l'ordre dans lequel on les a ecrites. On dit qu'elles sont executees de facon sequentielle. Exemple: PAW > MESSAGE b ; MESSAGE a ; MESSAGE c b a c *** Notions de graphique et de coordonnees Cet exemple est destine a vous rappeler la notion de coordonnee dans un graphique. Cette notion de coordonnees cartesienne est vue en mathematique sans doute en classe de 3e du college. Elle est fondamentale pour tous les graphiques que nous ferons par la suite. Dans la zone de commande tapez les instructions suivantes: PAW > NULL 0 10 0 10 PAW > KEY 1 5 PAW > KEY 4 5 PAW > KEY 7 5 PAW > CLR Remarque: Le mot anglais KEY signifie clef mais aussi touche (comme dans l'expression ``keyboard''). Dans votre fenetre graphique il va apparaitre successivement un repere avec des axes gradues de 0 a 10, puis 3 ronds (en noir) places aux positions (x=1,y=5),(x=2,y=5),(x=3,y=5). Enfin, la commande CLR (=clear=effacer) fait tout disparaitre. *** Difference entre variable passive et variable active Une variable passive, aussi appelee variable d'environnement, ne fait aucune action qui soit visible a l'ecran mais elle donne des indications qui seront utilisees par les commandes actives qui suivent. Les variables d'environnement sont l'analogue de ce que vous choisissez dans un menu pour changer la taille des caracteres ou leur couleur. Le choix ainsi fait restera en vigueur jusqu'a ce qu'il soit supplante par un autre choix pour la meme variable. Pour toute variable d'environnement il y a toujours un choix par defaut. Ainsi, si vous ne specifiez rien la couleur sera du noir; il aura de meme une valeur par defaut pour la taille du rond fait par KEY. Dans l'exemple qui suit on va changer la couleur et la taille. La couleur se change par l'instruction: IGSET PMCI 2 IGSET indique la famille a laquelle appartient la commande. Il n'y a que 3 familles: IGSET, SET et OPTION. PMCI est l'acronyme pour: Poly Marker Color Index = indice de couleur pour marqueur multiple. La taille se change par l'instruction: SET KSIZ 0.5 KSIZ est l'acronyme pour: K=key, SIZ=size Notons que la valeur par defaut de ce parametre est: 0.28 Exemple: NULL 0 10 0 10 IGSET PMCI 1 ; SET KSIZ 0.28 KEY 1 5 IGSET PMCI 2 ; SET KSIZ 2 KEY 4 5 IGSET PMCI 3 ; SET KSIZ 4 KEY 7 5 CLR *** Segment de droite joignant deux points Voici une seconde illustration de la notion de coordonnees. Tapez les intructions suivantes: NULL 0 10 0 10 LINE 1 7 6 1 La ligne droite relie le point (1,7) au point (6,1). Bien entendu on peut changer les attributs graphiques de ce segment de droite, en particulier sa couleur, son epaisseur ou son type. La couleur va se changer par: IGSET PLCI 2 [PLCI=Poly Line Color Index] L'epaisseur va se changer par: IGSET LWID [LWID=Line Width=epaisseur de la ligne] En voici une illustration: IGSET LWID 70 ; IGSET PLCI 2 LINE 6 1 7 5 *** Plusieurs graphiques sur la meme page Donnons un dernier exemple de graphique. L'instruction ZONE 2 3 va faire 6 graphiques sur la meme page, 2 en largeur et 3 en hauteur. Pour le verifier tapez les instructions suivantes. Pour entrer les 6 instructions NULL pensez a rappeler l'instruction precedente ZONE 2 3 NULL 0 1 0 1 NULL 0 1 0 1 NULL 0 1 0 1 NULL 0 1 0 1 NULL 0 1 0 1 NULL 0 1 0 1 CLR Bien sur, pour faire plus joli on peut aussi changer les couleurs: ZONE 2 3 SET XCOL 1 ; SET YCOL 1 ; SET BCOL 1 ; NULL 0 1 0 1 SET XCOL 2 ; SET YCOL 2 ; SET BCOL 2 ; NULL 0 1 0 1 SET XCOL 3 ; SET YCOL 3 ; SET BCOL 3 ; NULL 0 1 0 1 SET XCOL 4 ; SET YCOL 4 ; SET BCOL 4 ; NULL 0 1 0 1 SET XCOL 5 ; SET YCOL 5 ; SET BCOL 5 ; NULL 0 1 0 1 SET XCOL 6 ; SET YCOL 6 ; SET BCOL 5 ; NULL 0 1 0 1 Il est fastidieux d'avoir a repeter 6 fois pratiquement la meme ligne. C'est justement l'ecriture d'un programme qui va permettre d'automatiser la quasi-repetition des 6 lignes. C'est ce que nous allons voir maintenant. *** Les commandes $TIME et $MACHINE Sur la ligne de commande tapez: $TIME En principe vous aurez la reponse: Unknown command: 15.54.14 Vous voyez que le compilateur dit d'abord qu'il ne comprend pas la commande, puis il l'execute quand meme! Cet exemple doit vous inciter a ne pas toujours prendre pour argent comptant tout ce que dit le compilateur. Puis faites le meme test avec $MACHINE *** Definition et importance des vecteurs en programmation. Qu'est ce qu'un vecteur? Vous pouvez oublier la definition donnee en classe de mathematiques. En programmation, un vecteur est tout simplement une suite de nombres. Ainsi, V=1,5 est un vecteur qui a 2 composantes 1 et 5. On dira que c'est un vecteur a 2 dimensions. Au niveau des composantes on utilise la notation suivante: V(1)=1, V(2)=5 Voici deux autres exemples de vecteurs: W=2,4 H=3,0,119 W est de dimension 2 comme V alors que H est de dimension 3. De la meme facon on pourrait definir un vecteur ayant un tres grand nombre de composantes. Ainsi un vecteur de dimension un million serait une suite d'un million de nombres. Par ailleurs, un vecteur de dimension 1 sera equivalent a un nombre ordinaire. Vous voyez donc que cette notion de vecteur est une generalisation de la notion de nombre. Sur deux vecteurs de meme dimension on peut definir des operations comme l'addition, la multiplication, la division exactement comme on le fait pour deux nombres. Ainsi pour les vecteurs V et W precedents: addition: V+W=3,9 multiplication: V*W=2,20 division: V/W=1/2,5/4 Pourquoi les vecteurs sont-ils d'une grande importance en programmation? Cela est du a l'existence dans les ordinateurs de processeurs vectoriels qui peuvent traiter un vecteur globalement. De cette facon une operation sur deux vecteurs va prendre a peu pres le meme temps qu'une operation sur deux nombres. S'il s'agit de vecteurs de dimension elevee cela peut representer un gain de temps de calcul considerable. C'est la raison pour laquelle PAW adore les vecteurs mais n'aime guere qu'on lui fasse utiliser des nombres. Cela se traduit par le fait que dans PAW l'ecriture des operations sur des vecteurs est bien plus simple que l'ecriture des operations sur des nombres. C'est en quelque sorte une incitation permanente a n'utiliser que des vecteurs. *** Utilisation de vecteurs dans PAW Les vecteurs doivent d'abord etre crees, puis on veut pouvoir les imprimer a l'ecran par exemple pour verifier qu'ils ont bien les valeurs souhaitees. Une fois que les vecteurs ont ete crees on peut les utiliser de multiples facons, par exemple faire des operations ou un graphique. Pour creer un vecteur on ecrit: VECTOR/CREATE X(4) R 0 1 2 3 Comment fait-il comprendre la commande VECTOR/CREATE? VECTOR designe une famille de commandes qui sont toutes relatives aux vecteurs. CREATE designe un choix particulier dans cette famille. 4 est la dimension du vecteur. R signifie que les composantes du vecteur sont des nombres qui peuvent etre des nombres non-entiers. Tous les vecteurs que nous utliserons seront uniquement de ce type. 0,1,2,3 sont les composantes du vecteur. Notez que VECTOR/CREATE peut etre abrege en VE/CR. Pour detruire un vecteur: VE/DELETE V ou en abrege: VE/DE V. Pour detruire d'un seul coup tous les vecteurs existants: VE/DE * Retenez a ce propos qu'en Unix, l'etoile a le sens de ``n'importe lequel''. Applications Pour illustrer tout ce qui precede entrez les instructions suivantes sur la ligne de commande. Notez que les operations arithmetiques sur les vecteurs doivent etre precedes du mot SIGMA qui est le nom du logiciel qui les realise. VE/CR X(4) R 0 1 2 3 ; VE/PRINT X VE/CR Y(4) R 0 1 4 9 ; VE/PRINT Y VE/LIST SIGMA S=X+Y ; VE/PR S SIGMA P=X*Y ; VE/PR P SIGMA D=Y/X ; VE/PR D SIGMA E=X**3 ; VE/PR E VE/LIST VE/DELETE S,P VE/DE D *** Exemple d'une commande pourvue de plusieurs options: GRAPH Jusqu'ici nous n'avons vu que des commandes simples de PAW qui n'avaient pas d'option ou seulement une ou deux. En realite la plupart des commandes ont plusieurs options. L'analogue pour une langue est le fait qu'un mot a en general plusieurs sens tres differents. Par exemple le mot ``portee'' peut designer une portee musicale sur laquelle on ecrira des notes ou bien la portee d'un canon, c'est-a-dire la distance a laquelle il peut tirer. Une commande avec plusieurs options est un petit monde en soi qu'il faut explorer en essayant successivement les differentes cas. C'est ce que nous allons faire ici pour la commande GRAPH. Tout d'abord assurez-vous que les vecteurs X,Y,E precedemment crees existent toujours. Puis entrez les instructions suivantes et regardez ce que cela donne. GRAPH 4 X Y AWL* CLR NULL 0 4 -5 30 GRAPH 4 X Y L IGSET PLCI 2 ; GRAPH 4 X E L ; IGSET PLCI 1 CLR NULL 0 4 -5 30 IGSET PLCI 1 ; GRAPH 4 X E L* IGSET PLCI 2 ; GRAPH 4 X E C ; IGSET PLCI 1 CLR IGSET MTYP 20 ; IGSET MSCF 2 GRAPH 4 X Y AWLP ************ Chapitre 4 Notions de base de la programmation *** La notion de programme: macro, script Dans ce qui precede on a entre les instructions dans la ligne de commande. Mais cette facon de faire est tres limitee. On peut le voir de suite par le test suivant. Une operation essentielle est de pouvoir donner une valeur a une variable, Cela se fait en ecrivant: A=2. Dans cette ecriture, A est la variable et par l'instruction A=2 on lui donne la valeur 2. On dit qu'on assigne a la variable A la valeur 2. Mais si j'essaie d'entrer cette instruction dans la ligne de commande j'obtiens: PAW > A=1 *** Unknown command: A=1 Dans la suite nous allons utiliser des programmes. Qu'est ce qu'un programme? Ces programmes sont constitues d'une suite de lignes qui vont etre executees a la suite dans l'ordre ou elles sont ecrites. Selon le langage utilise, ces programmes portent divers noms: macro (qui est le nom que nous utiliserons), script, subroutine. Le mot anglais ``routine'' a comme en francais le sens de repetitif, mais il a aussi le sens d'une procedure qu'on effectue dans un certain ordre. C'est dans ce sens de ``sequence d'instructions'' qu'il est employe ici. Une ``subroutine'' sera donc une sous-partie d'une telle sequence d'instructions. *** Executer une macro sous Windows Avant de pouvoir executer une macro il faut faire quelques preparatifs du cote Windows. Tout d'abord il vous faut ouvrir dans Windows un fichier de type ``txt'' (c'est-a-dire de type texte). Pourquoi un tel fichier? Un fichier Word de type doc contient des instructions de formattage, par exemple: ``saut de paragraphe'' ou bien ``police de caractere en italique'', etc. Bien que ces formattages ne soient pas visibles a l'ecran, ils existent dans le fichier et quand PAW voudra executer ligne par ligne les commandes de ce fichier, les instructions de formattage seront incomprehensibles pour lui et il produira une avalanche de messages d'erreur. Une fois que vous aurez ouvert un fichier de type txt tapez les instructions ci-dessous, puis enregistrez le fichier sous le nom: anim3.kumac En effet, il est d'usage que les fichiers executables par paw s'appellent s1b.kumac, truc.kumac, machin.kumac. Cependant ce label .kumac ne change pas la nature reelle du fichier qui reste essentiellement un fichier texte (txt). Ce fichier doit etre dans le meme dossier que le module d'execution de PAW (pawNT.exe). --------------- Conseils complementaires sur les rapports entre Windows et PAW (1) Pour fabriquer un fichier purement texte (sans formattage donc) il est conseille d'utiliser l'editeur NotePad++. Pour le trouver vous pouvez utiliser la fonction ``recherche'' a laquelle vous acceder en cliquant sur l'icone (utilisee aussi pour arreter l'ordinateur) situee en bas a gauche de l'ecran. Pour rechercher tapez ``NotePad'' dans la lucarne de recherche. Puis cliquez sur le dossier ``NotePad++'' qui apparait. (2) Lorsque vous faites ``Enregistrer sous'' sur un fichier kumac il faut vous assurer que le fichier sera bien enregistre dans le meme dossier que celui ou se trouve le module d'execution de PAW (pawNT.exe). (3) Comme dit plus haut, parce que c'est l'usage vous donnerez a ces fichiers un nom se terminant par kumac: truc.kumac, machin.kumac. etc (utilisez plutot des lettres minuscules et non des majuscules). (4) Lorsque vous avez enregistre le fichier il apparait tout en haut de l'ecran, le chemin menant a ce fichier. Verifiez que le fichier est bien dans le meme dossier que le module d'execution de PAW. Autrement au moment de l'execution PAW ne trouvera pas le fichier et donnera un message d'erreur pour s'en plaindre. Concretement, si ce dossier s'appelle PAW, il faut que ce nom apparaisse juste a gauche du nom de votre fichier. (5) L'un des menus en haut du fichier s'appelle ``Encodage''. Ouvrez-le et verifiez que que c'est bien ``ANSI'' qui est choisi (le choix est materialise par un point en face de la ligne). En particulier il faut eviter le choix ``UTF-8'' (3e ligne) car dans cette option un ``BOM'' (Byte Order Mark) est rajoute au debut du fichier ce qui serait pour PAW une instruction incomprehensible. (6) Pour ouvrir un fichier de type kumac (par ex s1b.kumac) deja existant il ne faut pas cliquer avec le bouton gauche mais avec le bouton droit car cela vous donne le choix du logiciel qui va ouvrir le fichier. Parmi ceux-ci vous choisirez NotePad++. ------------- Une fois que vous etes dans le bon repertoire (et le bon dossier) ouvrez un fichier avec ``Notepad''. Vous y mettrez les 3 lignes suivantes: MACRO TEST MESSAGE Bonjour RETURN Puis vous enregistrez ce fichier avec le nom: test.kumac. Le type .kumac sera donne a tous les fichiers destines a etre executes par PAW. Cela vous permettra d'identifier aisement ces fichiers par la suite. Enfin, retournez dans la fenetre de commande de PAW et tapez: EXEC TEST Si tout se passe bien, PAW vous repondra ``Bonjour''. *** La macro a tiroirs anim3.kumac Une fois que le test precedent a ete reussi, nous allons pouvoir creer le fichier qui nous servira a stocker toutes les macros que nous allons creer au cours de ce semestre. Pour cela ouvrez un nouveau fichier avec Notepad et tapez-y les lignes suivantes: un fichier ayant pour nom ``anim3.kumac'' . Puis tapez dans ce fichier les lignes suivantes. Vous pouvez omettre les lignes de commentaires. Vous les rajouterez par la suite a partir du site du cours par un copier-coller. MACRO ANIM3 * MACROS CREEES DANS LE COURS DE PROGRAMMATION 2015 * ANIM3 EST UNE SUPER-MACRO, C'EST-A-DIRE * COMME UN LIVRE DONT LES MACROS QUI SUIVENT SERAIENT * LES CHAPITRES. * * POUR EXECUTER LA ``MACRO AA'' QUI SUIT, ON * ENTRE LA COMMANDE SUIVANTE DANS LA FENETRE DE COMMANDE: * EXEC ANIM3#AA * RETURN *********************************************** MACRO AA * TOUTES LES LIGNES COMMENCANT PAR * SONT DES * COMMENTAIRES, CAD DES CHOSES QUI NE SONT PAS * EXECUTEES. LE BUT DES COMMENTAIRES EST DE DIRE * CE QUE LA MACRO EST CENSEE FAIRE. CELA * FACILITE GRANDEMENT UNE RELECTURE ULTERIEURE. * MESSAGE Bonjour * RETURN *********************************************** Puis, enregistrez le fichier sous le nom anim3.kumac. Ce nom est le debut du mot animation et le chiffre 3 fait reference au fait que c'est la 3e annee que ce cours est enseigne. Enfin dans la fenetre de commande de PAW tapez: EXEC ANIM3#AA Si tout se passe bien, PAW repondra ``Bonjour'' Une fois que ce test marche vous etes pret pour essayer les autres macros. Dans la suite de ce chapitre on va decouvrir les commandes de base que l'on trouve dans tout langage, a savoir: * Ligne commentaire * GOTO * IF * DO Pour cela recopiez les macros suivantes dans votre fichier anim2.kumac. Des que vous avez recopie une macro executez-la. Vers la fin, il y a un jeu qui nous permettra de nous distraire un peu. *** Difference entre une variable et sa valeur Une variable n'est en somme rien d'autre qu'une lettre ou un ensemble de lettres, par exemple, A ou bien X ou bien VAR ou bien XY. En definissant un nom de variable la seule condition est de ne pas mettre de blanc entre les lettres, sinon le compilateur va considerer qu'il s'agit de deux variables. Lorsqu'on ecrit: A=3, on donne une valeur numerique a la variable. Dans ce cas la difference entre la variable et sa valeur est claire car la variable est une lettre alors que sa valeur est un nombre. Mais en fait, la vrai distinction entre les deux est que la variable est a gauche et sa valeur a droite. Ce point est capital. Ainsi si j'ecris: A=radio, A sera la variable et radio sera sa valeur. Comment dans une macro fait-on la distinction entre une variable et sa valeur? C'est tres simple. Pour recuperer la valeur qui est cachee dans la variable on la met entre crochets -> [A] ************************************************ MACRO AB * DIFFERENCE ENTRE UNE VARIABLE A ET SA VALEUR [A] * MESSAGE * VALEUR NUMERIQUE A=1 MESSAGE A ; MESSAGE [A] * * VALEUR TEXTE A=radio MESSAGE A ; MESSAGE [A] * * LA VALEUR DE LA VARIABLE PEUT MEME CONTENIR DES BLANCS A=Radio France MESSAGE A ; MESSAGE [A] * MESSAGE * RETURN ************************************************ *** Operations simples La macro ci-dessous illustre les 4 operations de base ainsi que la concatenation. Notez, qu'il faut se limiter a 2 nombres. Si on veut faire une operation sur plusieurs nombres, comme par exemple 1+4+5-3 il faut utiliser la commande $EVAL. ************************************************ MACRO AC * OPERATIONS SIMPLES A=10 ; B=1 S=[A]+[B] ; D=[A]-[B] ; P=[A]*[B] ; R=[A]/[B] MESSAGE MESSAGE S=[S] D=[D] P=[P] R=[R] * * PRETEZ ATTENTION AUX ECRITURES SUIVANTES A=[A]+10 ; B=[B]+[B] MESSAGE A=[A] B=[B] * * COMMANDE $EVAL E=$EVAL([S]+[D]+[P]+[R]) ; MESSAGE E=[E] * * CONCATENATION DE TEXTE A=radio ; B=France C=[A]//[B] MESSAGE A=[A] B=[B] C=[C] MESSAGE * RETURN ********************************************** *** Commande GOTO -> 1: La commande GOTO permet d'aller a une ligne ulterieure ou anterieure. Cette ligne sera reperee par un symbole suivi d'un double point. ************************************************ MACRO AD * L'INSTRUCTION GOTO (ALLER A) * MESSAGE * MESSAGE 1 GOTO 2 MESSAGE 2 2: MESSAGE 3 GOTO FIN MESSAGE 4 FIN: MESSAGE 5 * MESSAGE * RETURN ************************************************ *** Execution sequentielle Comme nous l'avons deja vu avec les instructions en ligne de commande, l'execution se fait de facon sequentielle: une ligne apres l'autre, et sur une meme ligne de gauche a droite. Cependant il est important d'observer qu'il peut y avoir des retours en arriere imposes par une instruction GOTO MACRO AE * UNE MACRO S'EXECUTE DE FACON SEQUENTIELLE, * C'EST-A-DIRE UNE INSTRUCTION APRES L'AUTRE DANS * L'ORDRE OU ELLES SONT ECRITES DANS LE PROGRAMME, * MAIS IL PEUT Y AVOIR DES INSTRUCTIONS FAISANT * RECULER VERS UNE LIGNE ANTERIEURE. * UN PEU COMME DANS UN JEU DE SOCIETE QUAND * ON TIRE LA CARTE ``RETOURNER A LA CASE DE DEPART'' * * UNE MACRO * NE S'ARRETE QUE SI ON LUI DONNE L'ORDRE DE * S'ARRETER * * POUR STOPPER L'EXECUTION DE CETTE MACRO FAIRE * ``Control c'' ou ``Control z''. * LA PREMIERE COMMANDE PERMET (EN PRINCIPE) D'ARRETER * EN RESTANT DANS paw. LA SECONDE ARRETE LA MACRO * EN SORTANT DE paw. * MESSAGE S=0 1: S=[S]+1 ; MESSAGE S=[S] GOTO 1 MESSAGE * RETURN ************************************************ *** Commande IF ... (si...) Cette commande permet de faire un test et en fonction du resultat du test, on a faire une action ou une autre. Dans la macro ci-dessous on va se servir de la commande IF pour faire la somme des premiers nombres entiers. A titre de curiosite on va mesurer le temps que met le programme pour faire cette somme. Cela se fait par la commande T=$CPTIME. CP est l'acronyme de Central Processor, l'unite centrale de l'ordinateur. Cette commande donne le temps ecoule, soit depuis le debut de la macro, soit depuis le precedent appel a cette commande. On voudrait en deduire le temps que met l'odinateur pour faire une addition. En fait, en plus de l'addition elle-meme, on repete aussi l'ecriture de S et on repete le test IF. Apres avoir execute la macro, neutralizez l'instruction MESSAGE en mettant un * devant et relancez la macro. Est-ce que le temps d'execution est nettement plus court? Notez les deux temps observes en vue du jeu propose dans la macro AG ************************************************ MACRO AF * LA COMMANDE IF (SI...) * COMMENT PEUT-ON ARRETER LA MACRO PRECEDENTE SANS * FAIRE ``Control c''? -> ON UTILISE UN ORDRE IF. * * CETTE MACRO REPOND AUSSI A LA QUESTION: * COMBIEN DE TEMPS PREND UNE ADDITION? * T=$CPTIME MESSAGE S=0 1: S=[S]+1 MESSAGE S=[S] IF [S]=1000000 GOTO 2 GOTO 1 2: * LA COMMAMDE $CPTIME (Central Processing unit) DONNE LE * TEMPS ECOULE DEPUIS LE PRECEDENT APPEL A $CPTIME T=$CPTIME ; MESSAGE T=[T] * RETURN ************************************************ *** Un jeu: qui a les reflexes les plus rapides? La macro suivante est un jeu. On a de nouveau supprime la commande IF ce qui signifie que pour arreter l'execution il faut faire ``Ctr c''. On va essayer d'entrer cette commande le plus rapidement possible. La personne qui aura reussi a faire l'arret sur la plus petite valeur de S aura gagne. De plus, a partir des valeurs de S de chacun, on pourra savoir quel est le temps correspondant. ************************************************ MACRO AG * UNE FORME PLUS LUDIQUE DE LA MACRO ANIM3#AE: * QUI ARRIVERA A ARRETER LA MACRO LE PLUS VITE? * * LA MACRO AF PERMET D'ESTIMER LE TEMPS QUE PREND 1 ADDITION (+IF) * (A) AVEC IMPRESSION A L'ECRAN DES VALEURS INTERMEDIAIRES: * (1) SUR eris (frequence=2.6 GHz, 2 proc): 0.041 ms = 41 micro-s * (2) SUR anubis (frequence=3.4 GHz, 4 proc): 0.013 ms = 13 micro-s * * (B) SANS IMPRESSION A L'ECRAN DES VALEURS INTERMEDIAIRES: * (2) SUR anubis: 0.003 ms = 3 micro-s * * ON PEUT NOTER QUE 10,000 OU 100,000 ADDITIONS CONDUISENT AU MEME * TEMPS POUR 1 ADDITION. * * SI LA frequence EST DE f=3.4 GHz, UN CYCLE DURE: T=1/f=0.3 nano-s * DONC 13 micro-s REPRESENTE: 43,000 CYCLES. * T1=0.041 MESSAGE S=0 1: S=[S]+1 ; T=[S]*[T1] ; MESSAGE S=[S] T=[T] ms GOTO 1 MESSAGE * RETURN *********************************************** *** Forme plus generale de la commande IF: IF... THEN La macro AH illustre une forme plus generale de la commande IF. ************************************************ MACRO AH * AUTRE FORME DE LA COMMANDE IF -> IF ... THEN (SI ... ALORS) * MESSAGE S=0 1: S=[S]+1 ; MESSAGE S=[S] IF [S]=200 THEN ; GOTO 2 ; ENDIF GOTO 1 MESSAGE 2: RETURN ********************************************** *** Boucle DO Une boucle DO permet de repeter autant de fois que l'on veut un ensemble d'instructions. Sa syntaxe est illustree par l'exemple ci-dessous. ************************************************ MACRO AI * AUTRE FACON DE FAIRE CE QUE FAIT ANIM3#AH * PAR L'UTILISATION D'UNE BOUCLE DO * MESSAGE * DO S=1,200 ; MESSAGE S=[S] ; ENDDO * MESSAGE * RETURN ************************************************ ************************************************ MACRO AJ * AUTRE FACON D'ECRIRE LA BOUCLE DO * LA BORNE SUPERIEURE EST ECRITE SOUS LA FORME [N] * MESSAGE * N=300 DO S=1,[N] ; MESSAGE N=[N] S=[S] ; ENDDO * MESSAGE * RETURN ************************************************ *** Interpreter les messages d'erreur On va donner deux exemples d'erreur qui ne sont pas faciles a reperer, (1) Dans la macro ANIM3#AC remplacez MACRO AC par MACRA AC. Puis dans la fenetre de commande faites: EXEC ANIM3#AA Que constatez-vous et comment comprendre et interpreter cette avalanche de messages d'erreur? Puisque l'erreur se situe dans une macro qui n'est PAS executee, on voit que le compilateur a deux niveaux de verification. Le premier au niveau de la syntaxe globale, le second au niveau de ce qu'il execute. Ici les messages ont ete generes par le premier niveau. (2) Dans la macro ANIM3#AJ neutralisez l'instruction N=300 en mettant une etoile devant. Une fois precede d'une etoile, cette ligne sera consideree comme un commentaire et ne sera pas executee. Puis dans la fenetre de commande, faites: EXEC ANIM3#AJ Vous obtenez le message d'erreur suivant: *** Invalid arithmetic expression in file ./anim3.kumac 161: *N=300 161 est le numero de cette ligne. Voyez que ce message est quelque peu trompeur car l'expression invalide n'est manifestement pas dans la ligne indiquee puisque c'est un commentaire. Elle est dans la ligne: DO S=1,[N] En effet, cette instruction attend 2 nombres. Pour le 1 il n'y a pas de probleme, mais le second element ne convient pas car [N] n'est pas un nombre du fait que la variable N n'a pas ete definie. Ceci est une erreur fort commune. Des qu'on oublie de definir une variable on va se heurter a un message d'erreur similaire. (3) Dans la macro ANIM3#ab remplacez MESSAGE A ; MESSAGE [A] par: MESSAGE A ; ; MESSAGE [A] Le message d'erreur qui en resulte est-il facile a interpreter? Comment peut-on reperer ce type d'erreur? *** Exercice a tenter chez vous: somme des premiers nombres Laissez-moi d'abord vous raconter une anecdote relative au mathematicien Carl Friedrich Gauss (1777-1855), un des grands noms des mathematiques. Alors qu'il etait a l'ecole primaire, a l'age de 9 ou 10 ans, leur instituteur pour etre tranquille pendant un moment demanda a ses eleves de faire la somme des 200 premiers nombres. Au bout de deux minutes le jeune Gauss lui donna la reponse, a savoir 20100. Comment avait-il fait? Vous savez sans doute qu'il y a pour la somme des n premiers nombres la formule suivante: S1 = 1+2+3+...+n = n(n+1)/2 L'exercice que je vous propose consiste a ecrire une macro utilisant une boucle DO pour calculer cette somme directement, c'est-a-dire en faisant comme si on ne connaissait pas la formule ci-dessus. Puis vous pourrez verifier si le resultat que vous donne la macro correspond bien a ce que donne la formule. Ensuite, vous pourrez repeter le meme exercice pour la somme des carres des premiers nombres. Dans ce cas la formule est: S2=1*1+2*2+3*3+...+n*n = n(n+1)(2n+1)/6 Vous pouvez aussi essayer de verifier la formule suivante decouverte par le mathematicien suisse Leonhard Euler en 1735. S=1/(1^2)+1/(2^2)+1/(3^2)+ ... = pi^2/6=1.6449... La convergence de cette serie est fort lente. Ainsi, pour obtenir 4 décimales exactes, il faut additionner plus de 15,000 termes de la somme. ************ Chapitre 5 Application des notions de base Les exemples suivants ont un double but. * Les personnes qui sont allergiques aux chiffres et preferent les mots trouveront ici des exemples similaires a ceux vus precedemment avec des nombres. * Pour retenir les notions de base precedentes, il faut au moins les voir deux fois. On va utiliser ce qu'on a appris jusqu'ici. De plus cette application va nous permettra quelque chose d'essentiel dans la programmation, a savoir l'appel a une macro utilitaire. On expliquera pourquoi c'est une etape capitale quand on aura vu de quoi il s'agit. Recopiez successivement chacune des macros suivantes dans votre fichier anim3.kumac. Des que vous en avez recopie une, executez la. Il y a de nombreuses parties communes donc n'hesitez pas a faire du ``copier-coller'' *** Macros simples ************************************************ MACRO DA MESSAGE Bonjour! RETURN ************************************************ MACRO DB * ON RAJOUTE UNE LIGNE BLANCHE AU DEBUT ET A LA FIN MESSAGE ; MESSAGE Bonjour! ; MESSAGE RETURN ************************************************ MACRO DC * CROCHET: DIFFERENCE ENTRE B ET [B] MESSAGE B=Bonjour! MESSAGE B ; MESSAGE [B] MESSAGE RETURN ************************************************ *** Moins simple! Doubles crochets Dans certains cas on est amene a utiliser des doubles crochets. Les macros suivantes illustrent comment ca marche. ******************************************* MACRO DD * DOUBLE CROCHETS: [B[I]] * * COMMENCONS PAR LES SIMPLES CROCHETS MESSAGE I=1 ; MESSAGE I ; MESSAGE [I] B1=Bonjour! ; MESSAGE B1 ; MESSAGE [B1] * * PASSAGE AUX DOUBLES CROCHETS MESSAGE MESSAGE BI ; MESSAGE [BI] ; MESSAGE B[I] ; MESSAGE [B[I]] MESSAGE * RETURN ********************************************** MACRO DE * BOUCLE DO * B1=Bonjour! ; B2=Au revoir * MESSAGE DO I=1,2 ; MESSAGE [B[I]] ; ENDDO MESSAGE * RETURN ********************************************** MACRO DF * BOUCLE DO AVEC PLUS DE MOTS * A1=Yvette ; A2=Natalia ; A3=Keyhaneh ; A4=Bonko A5=Jeanine ; A6=Michel ; A7=Eva ; A8=Audry * MESSAGE N=8 DO I=1,[N] ; MESSAGE [A[I]] ; ENDDO MESSAGE * RETURN ********************************************** *** Premiere application: passage aux majuscules ou minuscules Supposez que vous ayez une liste de 1,000 noms en majuscules mais que pour une raison ou une autre il vous les faut en minuscules. Vous n'allez pas tout retaper. La macro suivante montre comment proceder. ********************************************** MACRO DG * 1e EXEMPLE POUR MONTRER A QUOI PEUT SERVIR UNE BOUCLE DO * ECRITURE DES NOMS EN MAJUSCULES OU MINUSCULES * A1=Yvette ; A2=Natalia ; A3=Keyhaneh ; A4=Bonko A5=Jeanine ; A6=Michel ; A7=Eva ; A8=Audry * MESSAGE N=8 DO I=1,[N] ; A[I]=$UPPER([A[I]]) ; MESSAGE [A[I]] ; ENDDO MESSAGE DO I=1,[N] ; A[I]=$LOWER([A[I]]) ; MESSAGE [A[I]] ; ENDDO MESSAGE * RETURN ********************************************** *** Second exemple d'application: Mr, Mme, Mlle Supposez que devant vos 1,000 noms il faille rajouter Mr Mme ou Mlle. Vous n'allez pas faire cela nom par nom. La macro suivante montre comment faire. ********************************************** MACRO DH * 2e EXEMPLE POUR MONTRER A QUOI PEUT SERVIR UNE BOUCLE DO * ON FAIT PRECEDER LES NOMS DE Mr., Mme ou Mlle * A1=Yvette ; A2=Natalia ; A3=Keyhaneh ; A4=Bonko A5=Jeanine ; A6=Michel ; A7=Eva ; A8=Audry * C1=Mlle ; C2=Mlle ; C3=Mr. ; C4=Mr. ; C5=Mlle ; C6=Mr. C7=Mlle ; C8=Mr. * MESSAGE N=8 DO I=1,[N] ; A[I]=[C[I]] [A[I]] ; MESSAGE [A[I]] ; ENDDO MESSAGE * RETURN ********************************************** *** Troisieme application: nombre de lettres Dans cette application on va compter le nombre de lettres que comprend chaque prenom. ********************************************** MACRO DI * 3e EXEMPLE POUR MONTRER A QUOI PEUT SERVIR UNE BOUCLE DO * ON COMPTE LE NOMBRE DE LETTRES DE CHAQUE NOM * A1=Yvette ; A2=Natalia ; A3=Keyhaneh ; A4=Bonko A5=Jeanine ; A6=Michel ; A7=Eva ; A8=Audry * MESSAGE N=8 DO I=1,[N] ; L=$LEN([A[I]]) ; MESSAGE [L] lettres ' ' [A[I]] ; ENDDO MESSAGE * RETURN ********************************************** MACRO DJ * 4e EXEMPLE POUR MONTRER A QUOI PEUT SERVIR UNE BOUCLE DO * ON EXTRAIT LA PREMIERE LETTRE DU PRENOM * A1=Yvette ; A2=Natalia ; A3=Keyhaneh ; A4=Bonko A5=Jeanine ; A6=Michel ; A7=Eva ; A8=Audry * MESSAGE N=8 DO I=1,[N] ; D=$SUBSTRING([A[I]],1,1) ; MESSAGE [D] ' ' [A[I]] ; ENDDO MESSAGE * RETURN ************************************************** *** Notion de macro utilitaire La notion de macro utilitaire est la cle de voute de la programmation. Qu'est-ce qu'une macro utilitaire? C'est une macro qui realise une certaine tache qui depend d'un certain nombre de parametres. Pourquoi est-ce la cle de voute de la programmation? Vous connaissez peut-etre la regle celebre enoncee par le mathematicien et philosophe Rene Descartes: ``Diviser chacune des difficultes que j'examinerai en autant de parcelles qu'il se pourra et qu'il sera requis pour mieux les resoudre.'' C'est exactement ce que l'on fait en utilisant une macro utilitaire. Au lieu d'ecrire un programme de 1,000 lignes d'un seul tenant on va ecrire un programme de 10 lignes et dans chacune de ces lignes on va appeler une macro utilitaire de 100 lignes. Quels sont les avantages? * D'une part le programme sera plus clair * Mais surtout ces macros utilitaires pourront (si elles sont bien concues) servir de nombreuses fois dans des programmes differents. En somme les macros utilitaires sont les briques de la programmation. Ceci est illustre par les exemples ci-dessous. (1) Macro utilitaire avec un seul argument (a) Definition de la macro utilitaire ************************************************* MACRO BONJ * exemple d'usage: EXEC ANIM3#BONJ Julie -> dit: Bonjour Julie * Julie est l'argument * CETTE MACRO UTILITAIRE RAJOUTE ``Bonjour'' DEVANT TOUT PRENOM * P=[1] MESSAGE MESSAGE Bonjour [P]! MESSAGE * RETURN ************************************************** (b) Test de la macro utilitaire ************************************************** MACRO TESTBONJ * TEST DE LA MACRO ANIM3#BONJ * EXEC ANIM3#BONJ Julie EXEC ANIM3#BONJ Audry * RETURN ************************************************** (2) Macro utilitaire avec 2 arguments (a) Definition de la macro utilitaire ************************************************* MACRO BONJ2 * usage: EXEC ANIM3#BONJ2 Julie Sophie -> Bonjour Julie + Bonjour Sophie * CETTE MACRO UTILITAIRE RAJOUTE ``Bonjour'' DEVANT 2 prenoms * P1=[1] ; P2=[2] MESSAGE MESSAGE Bonjour [P1]! MESSAGE Bonjour [P2]! MESSAGE * RETURN ************************************************** (b) Test de la macro utilitaire ************************************************** MACRO TESTBONJ2 * TEST DE LA MACRO ANIM3#BONJ2 * EXEC ANIM3#BONJ2 Julie Sophie EXEC ANIM3#BONJ2 Alphonse Charles * RETURN ************************************************** (3) Un second exemple avec 2 arguments (a) Definition de la macro utilitaire ************************************************* MACRO DIA * usage: EXEC ANIM3#DIA [H] [F] -> dialogue entre [H] et [F] * ANIM3#DIA EST UNE MACRO UTILITAIRE DANS LE SENS OU * ELLE EST UN OUTIL QUI VA ETRE APPELE DANS UNE AUTRE * MACRO. ELLE DEPEND DE 2 VARIABLES QU'ON REPERE * PAR LEUR ORDRE. * H=[1] ; F=[2] MESSAGE MESSAGE _ [H]: Coucou, [F]. MESSAGE _ [F]: Que deviens-tu [H]? MESSAGE _ [H]: Tu viens prendre un cafe? MESSAGE * RETURN ********************************************** (b) Test de la macro utilitaire ********************************************** MACRO TESTDIA * TEST DE LA MACRO DIA * GOTO 1 H=Mathieu ; F=Fanto EXEC ANIM3#DIA [H] [F] 1: * * PLUSIEURS APPELS SUCCESSIFS (SANS BOUCLE DO) GOTO 2 H=Mathieu ; F=Fanto EXEC ANIM3#DIA [H] [F] * H=Jacques ; F=Julie EXEC ANIM3#DIA [H] [F] * H=Michel ; F=Yvette EXEC ANIM3#DIA [H] [F] 2: * PLUSIEURS APPELS SUCCESSIFS (AVEC BOUCLE DO) *GOTO 3 H1=Mathieu ; F1=Fanto H2=Jacques ; F2=Julie H3=Michel ; F3=Yvette * *TRACE ON WAIT N=2 DO I=1,[N] ; EXEC ANIM3#DIA [H[I]] [F[I]] ; ENDDO *TRACE OFF 3: * RETURN ************************************************ Dans les exemples precedents, les arguments de la macro utilitaire etaient des chaines de caracteres. En fait, les arguments peuvent tout aussi bien etre des nombres ou aussi des vecteurs (c'est-a-dire des suites de nombres). Cela est illustre par les deux exemples ci-dessous. (4) Un exemple avec comme arguments: nombre + chaine de caractere (a) Macro utilitaire ********************************************* MACRO BONJ3 * usage: EXEC ANIM3#BONJ3 2 Julie -> Bonjour Julie! + Bonjourr Julie! * N=[1] ; P=[2] * A=Bonjou MESSAGE DO I=1,[N] ; A=[A]r ; B=[A] [P]! ; MESSAGE [B] ; ENDDO MESSAGE * RETURN ********************************************* (b) Test de la macro utilitaire ********************************************* MACRO TESTBONJ3 * TEST DE LA MACRO UTILITAIRE ANIM3#BONJ3 * N=5 ; P=Julie EXEC ANIM3#BONJ3 [N] [P] * RETURN ******************************************** BONJ3 genere une seule sequence de N bonjours. Si on veut generer plusieurs sequences, on peut mettre un vecteur a la place de N. C'est ce que montre l'exemple ci-dessous. (5) Un exemple avec comme arguments: vecteur + chaine de caractere (a) Macro utilitaire ********************************************* MACRO BONJ4 * usage: EXEC ANIM3#BONJ4 V Julie -> idem que BONJ3 mais plus general * CETTE MACRO A POUR ARGUMENT UN VECTEUR ET UNE CHAINE DE CARACTERES * SIGMA V=[1] ; P=[2] KM=$SIGMA(NCO(V)) * DO K=1,[KM] N=V([K]) * A=Bonjou MESSAGE DO I=1,[N] ; A=[A]r ; B=[A] [P]! ; MESSAGE [B] ; ENDDO MESSAGE ENDDO * RETURN ********************************************* (b) Test de la macro utilitaire ********************************************* MACRO TESTBONJ4 * TEST DE LA MACRO UTILITAIRE ANIM3#BONJ4 * VE/CR W(3) R 2 10 ; P=Julie EXEC ANIM3#BONJ4 W [P] * VE/DE * RETURN ********************************************* *** Importance des macros utilitaires Pourquoi la procedure decrite dans les macros TESTBONJ et TESTDIA est-elle importante? Je pense que vous le devinez aisement. Elle permet de fractionner les taches en sous-taches plus simples. Supposons que j'ai besoin d'ecrire ``Bonjour X'' avec 100 prenoms differents. Au lieu d'avoir a ecrire 100 fois ``Bonjour'' ce qui est long meme si je fais du copier-coller, avec le systeme de la macro utilitaire je n'ai besoin d'ecrire ``Bonjour'' qu'une seule fois. Certes, l'exemple qu'on a vu est rudimenaire mais vous comprenez certainement que le meme principe pourra s'appliquer a des cas plus compliques. Vous comprenez aussi que le systeme n'a d'utilite reelle que s'il y a repetition de quelque chose, dans le cas present repetition de ``Bonjour''. Sans repetition il n'y a aucune economie possible. *** Exercice a tenter chez vous: ecriture d'autres dialogues Vous pouvez chez vous faire des macros similaires en changeant les dialogues et les prenoms. ************ Chapitre 6 Stuxnet inaugure les armes informatiques *** Cibles des virus Stuxnet est un virus informatique qui, entre 2008 et 2010, a reussi a deteriorer des centrifugeuses utilisees en Iran pour l'enrichissement de l'uranium 235. Avant Stuxnet les attaques informatiques n'avaient ciblees que les ordinateurs et se limitaient principalement aux activites suivantes. * Ralentir ou mettre hors circuit des ordinateurs en les saturant de messages. C'est une attaque temporaire sans grande gravite. * Voler des fichiers de donnees * Detruire des donnees. De ces trois cibles c'est le vol de donnees qui apparait le plus commun. De nombreux episodes de cette sorte ont ete relates par les medias dans les annees passees. Detruire des donnees apparait relativement difficile car tous les systemes importants font des sauvegardes automatiques sur des supports qui peuvent etre physiquement separes de l'ordinateur et donc bien moins vulnerables que la memoire centrale. Ainsi le type de destruction cause par Stuxnet apparait tout a fait nouveau et semble ouvrir des perspectives pour detruire des installations ennemies par des attaques informatiques. Toute la question est de savoir si ces moyens serons effectivement utilises. Les armes bacteriologiques avaient aussi paru tres prometteuses (si l'on peut dire) mais n'ont finalement jamais ete utilisees hormis peut-etre durant la guerre de Coree. L'episode Stuxnet montre clairement que pour reussir a deteriorer un nombre assez faible de centrifugeuses (de l'ordre de 1,000 selon des chiffres americains, soit environ 10% du nombre total) il a fallu l'accumulation de nombreuses failles et un travail d'epionnage prealable qui a pris beaucoup de temps. A cela il faut ajouter le travail necessaire pour l'ecriture du code contenu dans le virus. En somme le rapport resultats/efforts deployes fut mediocre. Les attentats a l'explosif qui eurent lieu dans les memes annees apparaissent plus efficaces. le 29 novembre 2010 deux specialistes du nucléaire furent victimes d'attentats a la bombe par des assaillants a moto, alors qu'ils se rendaient a leur travail. L’un des scientifiques fut tue (le troisieme en 2 ans) et l'autre blesse. Le 17 aout 2012, un jour avant la visite d’inspecteurs internationaux de l’AIEA pour une visite surprise de Fordo, les lignes electriques du site furent coupees à l'aide d'explosifs. Une panne de courant est un moyen d'infliger des dommages aux centrifugeuses car cela entraine des brusques changements de vitesse. Le chapitre suivant traitera d'un cas quelque peu similaire ou un pays a pu prendre possession d'un avion telecommande appartenant a un autre pays. Avant de parler de l'operation Stuxnet on peut se poser une question preliminaire qui est la plupart du temps escamote dans les medias. *** Pourquoi faut-il des centrifugeuses a l'Iran? Dans le journal ``Le Monde'' du 8 juillet 2014 on peut lire: L'Iran veut produire le combustible necessaire pour ses futures centrales nucleaires. L'objectif est d'avoir vingt centrales d'ici une vingtaine d'annees. Les Iraniens estiment qu'il leur faut pour cela environ 190,000 centrifugeuses. Cependant l'article n'explique pas pourquoi il faut un programme d'enrichissement de l'uranium pour des centrales civiles. Au printemps 2009, 7000 de ces centrifugeuses avaient été installees et avaient enrichi 1.2 tonne d’uranium à 4% * Savez-vous quel est le type de combustible utilise par les centrales nucleaires actuelles? * Savez-vous quelle est la quantite de combustible utilise par un reacteur nucleaire de 1,000 MW en une annee? * Savez-vous quel est le combustible utilise pour fabriquer une bombe atomique. * Ou et par quelle methode la France produit-elle le combustible necessaire a ses centrales? Il y a 4 degres de concentration en uranium 235. (1) Etat naturel: 0.7% Les proportions entre les deux principaux isotopes formant l'uranium naturel sont pratiquement les mêmes : 238U : 99.3 % ; 235U : 0.7% (2) Reacteurs a eau pressurisee: 4% (3) Production d'elements radioactifs en particulier pour la medecine: 20% (4) Bombe: 90% La masse critique d'une boule de matériau pur est d'environ 50 kg pour l'uranium 235. La bombe larguee sur Hiroshima contenait 64 kg d'uranium 235. La masse critique necessaire est d'autant plus grande que le taux d'enrichissement est plus faible, non seulement du fait de la moindre quantite d'U235 disponible mais aussi parce que la presence d'238U inhibe la reaction en chaine Comme la recharge d'un reacteur civil contient 30,000 kg d'uranium a 4% cela fait 1,200 kg d'uranium pur soit l'equivalent de 18 bombes de type Hiroshima. Incidemment, il est facile de se rendre compte que ce sont les premieres etapes de l'enrichissement qui sont les plus difficiles a realiser ne serait ce que pour la raison simple qu'aux faibles concentrations on est oblige de trainer comme un poids mort d'enormes quantites d'U238 qui ne servent a rien. [Centrifuges have a separation factor per stage of 1.3 The separation factor is defined as the ratio between the relative isotopic abundance of the product and that of the waste.] L’uranium enrichi aux environs de 20% sert de combustible à de petits réacteurs, notamment pour la production d’isotopes à des fins médicales. Les 190 kilogrammes enrichis à 20% fin aout 2012 sont a comparer aux 30 tonnes de la recharge de combustible annuelle d'un reacteur REP (REP=Reacteur a Eau Pressurisee) enrichi à 4%, soit en kilogrammes d'uranium-235, 39 kg contre 1,200 kg kg. En novembre 2012 le pays avait produit au total 7,611 kilos d'uranium enrichi jusqu'à 5%. On est encore loin des 30 tonnes necessaires pour une recharge annuelle. En novembre 2013 l'Iran a accepte de transformer la moitie de ses 200 kilos d'uranium à 20% en uranium à 5% et l'autre moitie en combustible pour son reacteur medical de Teheran. Usine d'enrichissement Eurodif de Tricastin inauguree en avril 1979. Le procede utilise fut d'abord la diffusion comme a l'usine a vocation militaire de Pierrelatte puis on est passe a la centrifugation. A partir de 1958 à Pierrelatte sa première usine d’enrichissement pour satisfaire ses besoins militaires (par diffusion). Reacteur de Bushehr (ou Busher) 1989 : Les Iraniens demandent a Siemens de finir Busher. Sous la pression americaine, le gouvernement allemand n'accorde pas la licence d'exportation des equipements. *** Deroulement de l'operation ``Stuxnet'' Dans ce qui suit on s'appuie sur tois sources: un long article du New York Times paru en juin 2012, un article Wikipedia en francais qui fut ecrit en 2012 (et pas reactualise depuis), enfin un livre de Mr. Kim Zetter paru en novembre 2014. On verra d'ailleurs que sur certains points ces sources sont contradictoires. Quel etait le probleme? * Les contrifugeuses au nombre de plusieurs milliers (voir photo) etaient commandees par ordinateur selon un dispositif mis au point par la firme allemande Siemens. * Le batiment de Natanz abritant tout le dispositif etait physiquement separe d'Internet. Le but etait de prendre le controle du dispositif Siemens et d'envoyer aux contrifugeuses des commandes (par ex les faire tourner trop vite) susceptibles de les deteriorer. Comment introduire le virus dans le batiment? Le moyen retenu fut de l'introduire dans des cles USB appartenant a des societes iraniennes appelees a travailler a Natanz, dans l'espoir que les employes les utiliseraient sur place. Il va sans dire que l'utilisation d'un tel moyen ne marche qu'une seule fois. Des que la cible se rend compte par quel canal on essait de l'attaquer des mesures de protection vont etre prises. C'est la un aspect qui n'est pas clairement explique dans les comptes rendus. En effet ceux-ci nous disent que l'operation a dure 4 ans de 2006 a 2010. En fait, l'attaque parvint sans doute a se dissimuler un certain temps car meme en l'absence de toute interference, les centrifugeuses iraniennes etaient peu fiables a cette epoque et tombaient souvent en panne. Il faut se rappeler que la separation isotopique de l'uranium 235U et de l'238U se fait par ultracentrifugation, à des vitesses de rotation de l'ordre de 300.000 tr/min, ce qui est 20 fois plus que les vitesses de rotation des centrifugeuses utilisees en biologie. Meme en temps normal, seulement 60% des centrifugeuses etaient en etat de marche. Autrement dit, quand des pannes survenaient le premier reflexe n'etait pas d'incrimer un sabotage. Inversement, il ne fut pas facile pour les attaquants de determiner quelle fut reellement le nombre des centrifugeuses mises hors d'usage. Revenons a la progression du virus vers les centrifugeuses. Pour concevoir le virus il fallut d'abord faire de l'espionnage industriel pour connaitre les codes de divers modeles de cles USB, puis s'approprier le code du dispositif Siemens. Cela prit environ 3 ans de 2006 a 2009. En 2009 on commenca par introduire le virus par Internet dans 5 compagnies iraniennes travaillant dans le nucleaire. Comme ces compagnies travaillaient pour de nombreux clients on ne peut guere s'etonner que le virus toucha un grand nombre d'entreprises. D'apres l'article de Wikipedia 30,000 ordinateurs furent affectes en Iran. Comme certaines de ces entreprises etaient en contact avec des entreprises etrangeres 15,000 autres ordinateurs furent affectes en Inde, en Allemagne et en France. Certains de ces ordinateurs etaient utilises en rapport avec un dispositf Siemens mais comme l'objectif du virus etait tres specifique il ne semble pas y avoir eu de dommage. A ce sujet, l'article du NYT donne une interpretation tres differente et, a mon sens, peu plausible. Il affirme que jusqu'a l'ete 2010 le virus resta confine dans l'usine de Natanz et qu'il s'en echappa brusquement par suite d'une erreur de programmation. En realite, c'est en juin 2010 que la partie Windows du virus fut identifiee par une societe de securite informatique basee en Bielorussie. A partir de cette date il n'etait donc plus possible de nier que le virus s'etait propage assez largement. Une fois dans l'usine de Natanz, il fallait que le virus prenne le controle des centrifugeuses en lieu et place du dispositif Siemens initial. Pour cela furent utlisees 3 failles du systeme Windows: l'une connue depuis 2008, les deux autres inconnues a ce jour et qui ont donne lieu q des messages de securite publies par Microsoft le 16 juillet 2010 et le 14 septembre 2010 respectivement. Ces deux dernieres sont donc ce que l'on appelle des vulnerabilites de jour zero, en anglais ``Zero day vulnerability''. Grace a ces failles, le virus a pu se faire attribuer des privileges d'administrateur ce qui l'autorisait en particulier a installer les programmes executables pour reprogrammer les centrifugeuses. **** Autre moyen pour introduire un virus: les disques durs Comment introduire un virus dans une installation physiquement separee de l'Internet? Comme explique ci-dessus ce probleme fut resolu en passant par les cles USB. Cependant c'est un moyen fort aleatoire car on ne sait pas de facon sure quand les entreprises ciblees vont aller travailler sur le site de Natanz, ni si elles utiliseront leurs cles USB. De plus, en cas de suspicion, les cles USB seront immediatement interdites. Il existe un moyen bien plus radical qui est d'implanter un virus sur les disques durs des ordinateurs des leur fabrication. A la mi-fevrier 2015 une depeche de l'agence Reuters a revele que Kaspersky, une societe de securite informatique russe, a trouve la presence d'un virus dans des disques durs d'ordinateurs. Plus precisement, le virus etait cache dans ce que l'on appelle le ``firmware'' qui sont des lignes de code installees par le fabricant pour permettre au disque de fonctionner. Ce code ne peut pas etre efface par l'utilisateur lors du formatage du disque dur. Evidemment, cela suppose la collaboration du fabricant. Ces virus ont ete trouves dans les disques durs de nombreuses entreprises, en particulier Western Digital, Seagate, Toshiba, IBM, Micro Technology and Samsung. Western Digital, Seagate et Micro ont declare n'avoir pas connaissance de ce probleme alors que Toshiba et Samsung n'ont pas fait de commentaires (Smith 2015). Les specialistes pensent que pour ecrire le code de ces virus il a fallu avoir acces au code source du fabriquant de disque dur. Notons que souvent la partie logiciel du disque est fournie par une societe differente de celle qui fabrique le disque dur lui-meme. Pour d'autres infos sur cette question on peut faire une recherche Internet avec les mots-cles: drive + virus + Kaspersky + equation group References Sanger (D.E.) 2012: Confront and conceal. Obama's secret wars and surprising use of American power. Crown. Sanger (D.E.) 2012: Obama order sped up wave of cyberattacks against Iran. New York Times 1 June 2012. Smith (C.) 2015: One of NSA's most precious spying tools was just uncovered. http://bgr.com/2015/02/17/nsa-hard-drive-firmware-virus/ Wikipedia 2012: Stuxnet (version francaise) [L'article fut ecrit en 2012 et n'a pas ete revise a ce jour (2 fevrier 2015) Zetter (K.) 2014: Countdown to zero day. Stuxnet and the launch of the world's first digital weapon. ************ Chapitre 7 Capture d'un drone americain par l'Iran (2011) *** Prise de controle du drone Le 4 decembre 2011 les Iraniens ont reussi a faire atterrir sur un terrain d'aviation iranien. Il s'agissait d'un drone de plusieurs metres d'envergure. Comment ont-ils procede? Sur un drone il y a deux modes de fonctionnement: * Controle depuis un centre de pilotage qui peut etre situe a plusieurs milliers de kilometres. Le signal de radio-commande peut etre transmis au drone par satellite. * Cependant ce signal peut etre brouille si l'ennemi connait la frequence d'emission. Lorsque ce signal est brouille, le drone peut basculer en fonctionnement autonome c'est-a-dire qu'il va se reperer par une centrale inertielle qui lui permet a tout moment de connaitre sa propre vitesse et donc en principe sa position Cependant dans ce type de vol il y a toujours une derive due aux changements de vent imprevus si bien qu'il faut recaler sa position periodiquement en utilisant une balise GPS. C'est a ce moment qu'une interference est possible. Un article americain qui relate cette prise de controle dit simplement que les Iraniens ont pu couvrir le veritable signal GPS venant des satellites par un signal plus fort qui a fait croire au drone qu'il allait atterrir sur sa base de depart alors qu'en fait il etait dirige vers un terrain situe a 225 km a l'interieur de la frontiere entre l'Iran et l'Afghanistan. Cependant on peut penser qu'il y a des protections contre un deroutement aussi important et que le guidage iranien a donc du demander beaucoup de souplesse. Un En fait ce modele de drone appele RQ-170 a ete utilise pour des survols de l'Iran ou de l'Afghanistan depuis 2008. Cela a donc laisse 3 ans aux ingenieurs iraniens pour une etude approfondie. *** Les reactions americaines Les premieres interpretations americaines avaient toutes pour but d'expliquer comment le drone avait pu se retrouver entre les mains des Iraniens sans pour autant admettre qu'il y ait pu y avoir une prise de controle electronique Il fut d'abord affirme que l'avion avait percute le sol et s'etait casse en trois morceaux (ou davantage) qui avaient ensuite ete reassemblees par les Iraniens et repeintes pour dissimuler les lignes de cassure. Toutefois si le drone avait vraiment percute le sol depuis une altitude de 15 km il aurait sans doute ete dans un etat rendant son re-assemblage impossible. Devant les difficultes de cette these elle fut remplacee par une variante ou le drone est muni d'un parachute qui lui permet de se poser en douceur. Voir la photo. Dans ce scenario lorsque le contact est rompu avec le poste de commande le drone se met a tourner en rond, puis descend avec le parachute apres avoir epuise son carburant. Il y a cependant deux difficultes a cette these. * La documentation relative au drone n'a jamais auparavant fait etat d'un parachute ou d'un volume a bord de l'avion ou il pourrait etre place. D'ailleurs il n'y a de parachute sur aucun des autres drones americains qui sont connus. * Surtout on ne comprendrait pas la finalite d'un tel parachute car si le drone doit rencontrer un probleme en pays etranger il est bien preferable que l'avion s'ecrase en se volatilisant en debris minuscules. Autrement dit, une cartouche d'explosif paraitrait plus appropriee qu'un parachute. * L'idee meme qu'en cas de rupture de liaison on ferait tourner un drone en rond en territoire etranger parait absurde. Il vaudrait bien mieux le faire voler en ligne droite vers la frontiere pour le mettre a l'abri. Les journalistes americains ont aussi fait l'objection suivante. Si vraiment les Iraniens avaient acquis la possibilite de prendre le controle des drones americains, pourquoi n'ont-ils pas garde cette capture secrete dans l'espoir de repeter l'operation. A premiere vue l'argument apparait serieux. Cependant une decalaration faite a l'epoque par l'ex vice-president Dick Cheney apporte un element d'explication. ``The right response twould have been to go in immediately after it had gone down and destroy it. You can do that from the air.'' cad: ``Il aurait fallu immediatement envoyer des avions pour le detruire''. Si Cheney est bien renseigne cela suggere que la perte du drone fut immediatement observee ainsi que son emplacement. Dans ces conditions, le silence iranien n'aurait guere trompe le Pentagone. *** Conclusion Pour le moment nous ne savons toujours pas precisement comment la prise de controle fut effectuee. Dans les scenarios americains les Iraniens n'avaient pas grand chose a faire pour recuperer le drone. Ils n'avaient meme pas besoin de l'avoir reperer. Au contraire dans le scenario de la prise de controle, il y avait plusieurs etapes difficiles. * Reperer le drone voulant a haute altitude alors qu'il est cense n'avoir qu'une signature radar tres reduite. * Envoyer un brouillage a la bonne frequence et suffisamment fort et cible pour couvrir le guidage par le poste de controle. * Simuler les signaux GPS avec les codes appropries. ************ Chapitre 8 Le reseau de calcul mondial du LHC *** Le LHC *** Collisions de protons au LHC *** Pourquoi le LHC produit-il un flux enorme de donnees? *** Caracteristiques techniques du LHC *** Le reseau de calcul du LHC *** Comparaison entre le RHIC, le Tevatron et le LHC Dans une precedente lecon nous avons parle du calcul sur reseau (en anglais ``cloud computing''). Il s'agit d'un ensemble d'ordinateurs interconnectes qui se comporte comme un ordinateur unique en ce sens qu'ils contiennent tous les memes logiciels et l'utilisateur fait ses calculs sans avoir a se demander sur quel systeme ses calculs se font effectivement. Actuellement le plus grand reseau au monde a offrir un tel service est le reseau mondial de calcul du LHC (en anglais LHC Worldwide Computer Grid, ce qui donne le sigle LHCWCG). Mis a part le reseau du LHC, la plupart des systemes de calcul sur reseau ont ete developpees dans un but commercial par les geants americains de l'informatique tels que Microsoft, Google, Oracle, IBM. Le reseau du LHC n'a pas de vocation commerciale mais fut une necessite scientifique car sans un seul reseau il aurait ete tout a fait impossible de digerer l'enorme flux de donnees produits par le LHC. Aussi, avant de parler du reseau de calcul il nous faut expliquer ce qu'est le LHC et quel est de defi informatique que pose cette experience. *** Le LHC LHC est un sigle qui signifie ``Large Hadron Collider'' dont la traduction francaise serait: ``Grand Collisionneur de Hadrons''. Qu'est ce qu'un hadron et qu'est ce qu'un collisionneur? Pour ce qui nous concerne, on peut dire que les hadrons sont des protons. Un collisionneur de protons est une machine qui projette les uns contre les autres des protons se deplacant dans des directions opposees, un peu comme une voiture qui remonterait une rue etroite a sens interdit et heurterait frontalement une voiture venant en sens oppose P ----> <---- P Que va-t-il se passer dans une telle collision? *** Collisions de protons au LHC Une image (voir le transparent) prise un court instant apres la collision montre un tres grand nombre de particules differentes qui emergent du lieu de collision. D'ou viennent-elles? Vous savez peut-etre qu'en physique il y a equivalence entre masse et energie. C'est ce que traduit la fameuse relation: E=mc^2 ou E designe une quantite d'energie, m la masse correspondante et c la vitesse de la lumiere Or dans le LHC les protons ont une vitesse qui est tres proche de la vitesse de la lumiere. Plus precisement chaque proton a une vitesse egale a 99.9999991% de la vitesse de la lumiere; rappelons qu'un objet materiel ne peut pas atteindre ou depasser la vitesse de la lumiere. Comme les protons ont une grande energie cinetique (un millionieme de Joule par proton), lors de leur collision, une grande partie de cette energie se transformera en matiere, c'est ce qui explique la creation d'un vaste faisceau de particules nouvelles. Mais, direz-vous peut-etre, toutes ces collisions ne sont-elles pas identiques? Pourquoi en creer des millions? Les collisions ne sont pas identiques pour deux raisons principales. * Un proton est une particule d'un diametre assez important. Par exemple un proton est 1800 fois plus lourd qu'un electron. Il peut donc y avoir divers types de collisions frontales. Les protons peuvent juste s'effleurer ou bien se heurter sur leur peripherie ou encore se heurter de plein fouet. On comprend bien que cela conduira a tout un eventail de resultats. * Meme les collisions de plein fouet (c'est-a-dire quand les particles sont sur la meme ligne) ne seront pas identiques car elles dependent de l'etat interne des protons. Dans notre parallele precedent, s'il y a par ex 3 passagers, selon les places qu'ils occupent dans la voiture le resultat de la collision ne sera pas le meme. En conclusion, il y aura un eventail presque infini de collisions. Pari les milliards de collisions differentes les physiciens doivent selectionner celles qui les interessent. C'est la recherche d'une aiguille dans un tas de foin. C'est cette recherche qui a necessite la creation du reseau informatique. A eux tous seuls, les milliers d'ordinateurs qui existent au CERN n'etaient pas capable d'analyser les donnees decrivant toutes ces collisions. *** Pourquoi le LHC produit-il un flux enorme de donnees? LE LHC est actuellement l'accelerateur le plus puissant au monde mais il a eu des predecesseurs. L'un de ceux-ci fut le LEP dont le sigle signifie Large Electron-Positron collider. Le LEP fut construit au CERN entre 1980 et 2000 et, comme deja souligne au debut de ce cours, c'est pour l'exploitation des resultats du LEP que fut cree PAW. L'exploitation des resultats du LEP fut beaucoup plus facile que pour ceux du LHC, preuve en est qu'a l'epoque Internet demarrait a peine et il n'y avait guere de possibilites de calcul sur reseau. Il y a deux raisons a cela: * Le LEP etait environ 65 fois moins puissant (0.2 TeV contre 13 TeV, TeV=10^12 electron volts). Donc il y a moins de production de nouvelles particules lors d'une collision. * Comme deja dit, l'electron est bien plus petit que le proton, donc il y a une variete bien moins grande de collisions frontales. Une autre raison est que l'electron a des interactions moins forte que les protons. Bref, au LEP les collisions etaient beaucoup plus ``propres'' et donc plus faciles a analyser. *** Caracteristiques techniques du LHC Il faut faire deux choses (i) accelerer les protons (ii) les maintenir sur une trajectoire circulaire alors qu'ils ne demandent qu'a aller en ligne droite. Le premier point ne pose guere de difficulte, mais le second devient de plus en plus difficile quand les protons vont plus vite. Il faut pour cela des champs magnetiques tres forts, et pour creer ces champs il faut faire passer dans des bobines des courants de plusieurs milliers d'amperes. Si on fait passer un courant de plusieurs milliers d'ampere dans un fil de cuivre il va chauffer enormement. Pour eviter cela on utilise une propriete decouverte en 1911. Un chercheur hollandais decouvrit qu'en dessous de -270 degre le mercure n'a plus de resistance electrique. On dit qu'il est devenu supraconduncteur. Helas le cuivre ne presente pas cette propriete. Les fils electriques utilises dans les electro-aimants du LHC sont en niobium et titane. Pour refroidir toute la structure a cette temperature il faut environ 6 semaines et environ 100 tonnes d'helium. Comme l'azote liquide est environ 50 fois moins cher que l'helium liquide on commence le refroidissement avec de l'azote. Environ 10,000 tonnes d'azote liquide sont necessaires pour une operation de refroidissement. En fonctionnement normal, le LHC consomme 120 MW, soit la consommation des 500,000 habitants de la région de Genève. *** Le reseau de calcul du LHC Le centre du dispositif est bien sur le CERN lui-meme avec ses 10,000 serveurs et ses 100,000 processeurs. On peut noter que le CERN est double d'une annexe situee a Budapest (a 1,000km du CERN) et qui pourrait temporairement remplacer le CERN en cas de probleme. Les deux centres sont reliees par une liaison de 100 Gbit/s. Pour permettre une comparaison, lorsque dans mon labo je telecharge un fichier j'ai habituellement un debit de 250 kbit/s. Ce qu'on appelle en France du tres haut debit correspond a 100 Mbit/s, soit donc mille fois moins que sur la liaison CERN-Budapest. Le CERN est relie aux 13 centres de rang 1 par des lignes en fibre optique ayant un debit de 10 Gbit/s, c'est-a-dite 100 fois mieux que le tres haut debit. En France le centre de rang 1 est le CC-IN2P3 = Centre de Calcul de l'Institut National de Physique Nucleaire et Physique des Particules, situe a Lyon (8,200 processeurs). *** Comparaison entre le RHIC, le Tevatron et le LHC Comme vous le savez peut-etre, la decouverte du boson de Higgs fut annoncee le 4 juillet 2012 lors d'une conference tenue au CERN. Par de ca la decouverte elle-meme ce qui fut remarquable fut la rapidite avec laquelle les observations furent analyses. Si vous allez sur les sites du Tevatron et du RHIC qui sont deux accelerateurs americains vous verrez que l'analyse des observations se fait souvent deux ou trois ans apres l'enregistrement des donnees. A quoi cette difference est-elle due? L'ideal est d'avoir des procedures informatiques permettant l'analyse automatique des observations. S'il faut faire cela de facon manuelle a certains stades, l'analyse va etre considerablement allongee. Mais, vue la grande diversite des reactions possibles (cf la discussion ci-dessus), la mise sur pied de telles procedures demande un enorme travail de mise au point qui se fait en grande partie sur des simulations. C'est ce qu'on appelle la phase de simulation et reconstruction. On entend par la qu'a partir des traces observees on veut reconstituer la reaction qui s'est produite. C'est grace aux programmes d'analyse automatique qu'on peut traiter les milliards de collisions observes, les filtrer et les ************ Chapitre 9 Creer une animation Comme vous le savez, une animation, un dessin anime ou un film ne sont rien d'autre qu'une suite d'images. Lorsque les images defilent devant nos yeux a une vitesse d'environ 25 images par seconde on a l'impression de voir un mouvement a cause de la persistance des images sur la retine de l'oeil. Avec une telle vitesse chaque image restera affichee durant 1000/25=40 ms. Notez qu'il faut bien distinguer la vitesse a laquelle on filme et la vitesse avec laquelle on fait defiler le film. Pour voir le developpement d'une tulipe on prendra une image par jour. Pour voir une balle de fusil passer a travers un verre on prendra une image par micro-seconde. Mais dans les deux cas il faut faire defiler le film a une vitesse d'au moins 25 images par seconde pour qu'il ne soit pas saccade. Si on fait defiler a 100 images par seconde le film ne paraitra pas saccade mais sa duree sera 4 fois plus faible ce qui n'est pas souhaitable. La vitesse a laquelle on filme depend bien sur de la scene qu'on filme. Si on filme le developpement d'une tulipe a raison d'une image par semaine le film sera saccade quel que soit la vitesse de defilement. Dans ce chapitre nous allons mettre cette technique en oeuvre de la facon la plus simple possible. La premiere animation que nous allons creer correspond a ce qu'on verrait si on s'approche d'un mur carre peint en vert. Au fur et a mesure qu'on s'approche l'image va s'agrandir. La seconde reproduit une eclipse de soleil totale ou partielle De quels ingredients aurons-nous besoin dans la premiere animation? Il faut d'abord creer un contour carre ou rectangulaire, puis le colorer en vert, puis faire changer sa taille, puis faire defiler ces images a la vitesse appropriee. *** Creer un carre vert ************************************ MACRO BOITE1 * DESSINER UNE BOITE * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] * IGSET PLCI 3 XA=-4 ; XB=4 ; YA=-1 ; YB=1 ; BOX [XA] [XB] [YA] [YB] * RETURN ************************************ Pour remplir la boite de couleur on utilise les parametres de remplissage FAIS et FACI. Le premier definit le style de remplissage, par ex couleur ou hachures. Le second definit la couleur de remplissage. ************************************ MACRO BOITE2 * DESSINER UNE BOITE REMPLIE DE COULEUR * * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] * * DEFINITION DES PARAMETRES DE REMPLISSAGE * FILL AREA INTERIOR STYLE: 1=SOLID, 3=HATCH (HACHURES) IGSET FAIS 1 * FILL AREA COLOR INDEX IGSET FACI 3 * IGSET PLCI 3 XA=-4 ; XB=4 ; YA=-1 ; YB=1 ; BOX [XA] [XB] [YA] [YB] * RETURN *************************************** Comme dans la suite on veut faire varier le cote du carre on introduit ce cote sous la forme d'une variable qu'on appelera C. *************************************** MACRO BOITE3 * DESSINER UNE BOITE CARRE DE COTE C PLACEE AU CENTRE DU GRAPHE * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] IGSET FAIS 1 ; IGSET FACI 3 ; IGSET PLCI 3 * C=1 XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * RETURN ************************************** *** Boites successives Dans un premier essai on separe les images successives a l'aide de la commande WAIT. Cette commande depend de 2 variables: une suite de caracteres qui vont s'afficher a l'ecran, et un temps exprime en secondes. ************************************** MACRO BOITE4 * DESSINER UNE SUCCESSION DE BOITES DE TAILLES CROISSANTES 1,2,3,... * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] IGSET FAIS 1 ; IGSET FACI 3 ; IGSET PLCI 3 * DO C=1,4 XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * * TEMPORISATION D=2 ; WAIT C=[C] [D] ENDDO * RETURN ******************************************* Malheureusement la commande WAIT ne permet pas d'avoir des temps inferieurs a 1 seconde. Pour cela, on va simplement occuper l'ordinateur a une tache comme faire des additions avant qu'il ne puisse afficher l'image suivante. Quelle valeur faut-il choisir pour JM? Notez que pour le defilement il y a une vitesse minimum en-dessous de laquelle on verra un film saccade. Mais pour un film comme le notre ne comportant pas de scene de la vie courante il n'y a pas de seuil superieur pour la vitesse Pour le film cree dans BOITE5 il y a donc deux parametres: * la vitesse de defilement qui est fixe par JM * la duree totale du film qui est fixe par N (une fois JM choisi) Vous pouvez changer ces deux parametres pour voir quels sont les effets. ******************************************* MACRO BOITE5 * TRANSFORMATION EN DESSIN ANIME * IL FAUT PLUS D'IMAGES ET UNE ATTENTE DE SEULEMENT 1/20s ENTRE * DEUX IMAGES SUCCESSIVES * T1=$CPTIME * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] IGSET FAIS 1 ; IGSET FACI 3 ; IGSET PLCI 3 * N=100 DO I=1,[N] C=[I]/[N] ; C=5*[C] XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * * TEMPORISATEUR ENTRE DEUX IMAGES SUCCESSIVES JM=1000 DO J=1,[JM] ; A=1 ; B=2 ; C=[A]+[B] ; ENDDO * ENDDO * * DUREE D'UNE IMAGE T2=$CPTIME ; T2=[T2]/[N] ; T2=1000*[T2] MESSAGE duree une image = [T2] ms * RETURN ********************************************** Dans la macro suivante on fait quelques fignolages pour ameliorer la presentation. ********************************************** MACRO BOITE6 * FIGNOLAGES: * (1) ENLEVER LES CHIFFRES DES AXES ET LES AXES EUX-MEMES * (2) FAIRE UN GRAPHIQUE PAR IMAGE * (3) AUGMENTER LE NOMBRE D'IMAGES * (4) CONTROLER LE TEMPS QUE DURE CHAQUE IMAGE * EN ENREGISTRANT LE TEMPS D'EXECUTION * T1=$CPTIME X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 IGSET FAIS 1 ; IGSET FACI 3 ; IGSET PLCI 3 * N=500 DO I=1,[N] NULL [X1] [X2] [Y1] [Y2] AB C=[I]/[N] ; C=5*[C] XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * * TEMPORISATEUR ENTRE DEUX IMAGES SUCCESSIVES JM=1000 DO J=1,[JM] ; A=1 ; B=2 ; C=[A]+[B] ; ENDDO * ENDDO * * DUREE D'UNE IMAGE T2=$CPTIME ; T2=[T2]/[N] ; T2=1000*[T2] MESSAGE duree une image = [T2] ms * RETURN ************************************** *** Changement de couleur En plus de la taille on peut aussi faire changer de facon continue la couleur. Pour cela on utilise la commande COLOR_TABLE. Dans la macro qui suit on s'exerce a l'utilisation de cette commande. ************************************** MACRO BOITE7 * COMMENT CHANGER LA COULEUR EN MEME TEMPS QUE LA TAILLE? * REVENONS A LA MACRO BOITE3 * X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] IGSET FAIS 1 I=101 R=0 ; G=0 ; B=1 R=0.95 ; G=0.95 ; B=0.95 | gris clair R=1 ; G=1 ; B=0 | jaune R=0.9 ; G=0.9 ; B=0 | jaune fonce R=1 ; G=0 ; B=0.1 | rouge grenadine R=1 ; G=0 ; B=0.5 | rouge framboise * COLOR_TABLE [I] [R] [G] [B] IGSET FACI [I] ; IGSET PLCI [I] * C=3 XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * RETURN ************************************* Pour changer en meme temps la couleur et la taille il suffira de combiner BOITE7 ET BOITE6. Notez qu'on peut aussi changer la couleur de facon brusque comme dans la macro ci-dessous. ************************************* MACRO BOITE8 * CHANGEMENT DE COULEUR * T1=$CPTIME X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 IGSET FAIS 1 IGSET FACI 3 ; IGSET PLCI 3 * N=500 DO I=1,[N] NULL [X1] [X2] [Y1] [Y2] AB * * CHOIX DE LA COULEUR IC=$EVAL(1+INT([I]/100)) ; MESSAGE [IC] IGSET FACI [IC] ; IGSET PLCI [IC] C=[I]/[N] ; C=5*[C] XA=-[C] ; XB=[C] ; YA=-[C] ; YB=[C] ; BOX [XA] [XB] [YA] [YB] * * TEMPORISATEUR ENTRE DEUX IMAGES SUCCESSIVES JM=1000 DO J=1,[JM] ; A=1 ; B=2 ; C=[A]+[B] ; ENDDO * ENDDO * * DUREE D'UNE IMAGE T2=$CPTIME ; T2=[T2]/[N] ; T2=1000*[T2] MESSAGE duree une image = [T2] ms * RETURN ********************************************** *** Representer une eclipse de soleil Pour faire une eclipse de soleil il faut 3 ingredients: un ciel bleu, un soleil rouge et la lune. De ces 3 elements seule la lune a besoin de bouger. Autrement dit, on va avoir un decor constitue des elements fixes (ciel+soleil) et un element mobile a l'interieur de ce decor. Cette combinaison decor+element mobile se retrouve dans la plupart des animations. Pour faire le soleil et la lune il faut une instruction faisant un cecle. Ce sera l'instruction ARC avec laquelle il faudra d'abord se familiariser ************************************************** MACRO REPERE * ON DESSINE UN REPERE X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 ; NULL [X1] [X2] [Y1] [Y2] * RETURN ************************************************** MACRO CIEL * DESSIN DU CIEL BLEU * ON UTILISE LES MEMES INSTRUCTIONS QUE DS ANIM3#BOITE2 * * FOND DE CIEL BLEU EXEC ANIM3#REPERE X1=-5 ; X2=5 ; Y1=-5 ; Y2=5 IGSET FAIS 1 ; IGSET FACI 4 ; BOX [X1] [X2] [Y1] [Y2] * RETURN **************************************************** MACRO SOLEIL * SOLEIL ROUGE FAIT AVEC L'INSTRUCTION ARC * EXEC ANIM3#REPERE IGSET FAIS 1 ; IGSET FACI 2 * * APPRENTISSAGE DE L'INSTRUCTION ARC * (XC,YC) -> COORDONNEES DU CENTRE * R1=RAYON INTERIEUR, R2=RAYON EXTERIEUR * A1=ANGLE INITIAL (en degres), A2=ANGLE FINAL (sens anti-horaire) XC=1 ; YC=0 ; R1=1 ; R2=2 ; A1=0 ; A2=90 *ARC [XC] [YC] [R1] [R2] [A1] [A2] * QUELS PARAMETRES FAUT-IL CHOISIR POUR FAIRE UN SOLEIL? * XC=1 ; YC=0 ; R1=0 ; R2=2 ; A1=0 ; A2=360 ARC [XC] [YC] [R1] [R2] [A1] [A2] * RETURN **************************************************** MACRO LUNE * LUNE. EN PRINCIPE ON NE LA VOIT PAS, MAIS DANS UNE PREMIERE * ETAPE ON VA LA DESSINER EN NOIR * EXEC ANIM3#REPERE IGSET FAIS 1 ; IGSET FACI 1 XC=-2 ; YC=0 ; R1=0 ; R2=2 ; A1=0 ; A2=360 ARC [XC] [YC] [R1] [R2] [A1] [A2] * RETURN *************************************************** On va maintenant combiner les macros precedentes. Cependant, pour qu'on voit a la fois le ciel, le soleil et la lune, il faut changer quelque chose dans les macros CIEL, SOLEIL et LUNE. Je vous laisse trouver quoi. **************************************************** MACRO ECLIPSE1 * ON COMBINE: REPERE + CIEL + SOLEIL + LUNE * POURQUOI LE CIEL BLEU EST-IL EFFACE? QUE FAIRE POUR Y REMEDIER? * EXEC ANIM3#REPERE EXEC ANIM3#CIEL EXEC ANIM3#SOLEIL EXEC ANIM3#LUNE * RETURN **************************************************** ECLIPSE1 donne une bonne image fixe. Il faut maintenant faire bouger la Lune. Pour cela il faut changer la variable XC qui definit l'abscisse de son centre. Dans ce but nous allons transformer la macro LUNE en une macro utilitaire ayant la position de son centre comme argument. Comme le montre la macro ULUNE il suffit de changer peu de choses. *************************************************** MACRO ULUNE * usage: EXEC AINM3#ULUNE [XL] -> dessine la lune a l'abscisse XL * IDENTIQUE A LA MACRO LUNE SAUF QU'ON PEUT CHANGER L'ABSCISSE DU CENTRE * XC=[1] IGSET FAIS 1 ; IGSET FACI 1 YC=0 ; R1=0 ; R2=2 ; A1=0 ; A2=360 ARC [XC] [YC] [R1] [R2] [A1] [A2] * RETURN ***************************************************** MACRO TESTULUNE * TEST DE LA MACRO ULUNE * EXEC ANIM3#REPERE XL=2 ; EXEC ANIM3#ULUNE [XL] * RETURN ****************************************************** Grace a la macro ULUNE on peut maintenant faire bouger la lune. On commence par faire un film-test qui n'a que peu d'images afin de voir si tout se passe bien. ****************************************************** MACRO ECLIPSE2 * ON FAIT AVANCER LA LUNE VERS LA DROITE * * ON FAIT UNE BOUCLE SUR LES POSITIONS DE LA LUNE N=8 * ON UTILISE L'INSTRUCTION ``ARRAY'' POUR CREER UNE SUITE DE N=8 * NOMBRES ESPACES REGULIEREMENT ENTRE A=-3 ET B=4 A=-3 ; B=4 ; SIGMA XV=ARRAY([N],[A]#[B]) DO I=1,[N] * * ON MET EN PLACE LE DECOR: REPERE+CIEL+SOLEIL EXEC ANIM3#REPERE EXEC ANIM3#CIEL EXEC ANIM3#SOLEIL * LUNE XL=XV([I]) ; EXEC ANIM3#ULUNE [XL] * * TEMPORISATEUR D=3 ; WAIT I=[I]_L=[XL] [D] * ENDDO * RETURN ****************************************************** ECLIPSE2 montre qu'on obtient bien ce qu'on souhaite. On peut ameliorer l'apparence en faisant quelques fignolages. ************************************************** MACRO ECLIPSE3 * FIGNOLAGES: * ON ENLEVE LES CHIFFRES DES AXES, * ON AUGMENTE LE NOMBRE D'IMAGES, * ON DIMINUE LA TEMPORISATION * T1=$CPTIME * * ON FAIT UNE BOUCLE SUR LES POSITIONS DE LA LUNE N=1000 DO I=1,[N] * * ON MET EN PLACE LE DECOR: REPERE+CIEL+SOLEIL EXEC ANIM3#REPERE EXEC ANIM3#CIEL EXEC ANIM3#SOLEIL * LUNE MESSAGE I=[I] PAS=7/[N] XL=$EVAL(-3+([I]-1)*[PAS]) ; EXEC MAPM#ULUNE [XL] * * TEMPORISATEUR JM=2000 DO J=1,[JM] ; A=1 ; B=2 ; C=[A]+[B] ; ENDDO * ENDDO * * DUREE D'UNE IMAGE T2=$CPTIME ; T2=[T2]/[N] ; T2=1000*[T2] MESSAGE ; MESSAGE duree pour une image = [T2] ms * RETURN ***************************************************** Que faudrait-il encore ameliorer? * Il y a des bandes blanches qui passent sur l'ecran. Cela est sans doute du au fait que l'instruction NULL de la macro REPERE cree un repere blanc, mais je ne comprends pas pourquoi cela se traduit par des bandes blanches. De toutes facons, cela disparaitra quand on fera un film avec des images successives. * La Lune ne devrait pas apparaitre en noir sur le ciel bleu. En fait, dans une eclipse on ne voit que la partie de la lune qui est devant le soleil. Comment ameliorer cela? Il faut faire un cache qui mette du bleu partout sauf a l'emplacement du soleil. Le principe en est donne dans la macro CACHE. Les vecteurs XV et YV definissent le contour qu'il faudrait suivre avec une paire de ciseau pour decouper un carre de la taille du soleil au centre d'une feuille de papier. Evidemment, au lieu de decouper un carre il faudrait decouper un rond. Le principe serait le meme, mais le detail serait un peu plus complique. On commence par tracer le contour defini par XV et YV pour verifier que c'est correct. On activera l'instruction FAREA ensuite. **************************************************** MACRO CACHE * EXEC MAPM#REPERE N=13 S=1 C1=0+[S] ; C2=-2+[S] ; C3=-2+[S] ; C4=2+[S] ; C5=2+[S] ; C6=0+[S] VE/CR XV([N]) R [C1] [C2] [C3] [C4] [C5] [C6] 0 5 5 -5 -5 0 0 VE/CR YV([N]) R -2 -2 2 2 -2 -2 -5 -5 5 5 -5 -5 -2 * GRAPH [N] XV YV L* * IGSET FAIS 1 ; IGSET FACI 4 *FAREA [N] XV YV * VE/DE XV,YV * RETURN ************************************************ On combine avec les autres macros apres avoir desactive l'instruction REPERE de CACHE. ************************************************* MACRO ECLIPSE4 * ON COMBINE: REPERE + CIEL + SOLEIL + LUNE + CACHE * EXEC ANIM3#REPERE EXEC ANIM3#CIEL EXEC ANIM3#SOLEIL EXEC ANIM3#LUNE EXEC ANIM3#CACHE * RETURN *************************************************** Une fois que vous vous etes assure que le cache remplit bien son office vous pouvez le rajouter dans les animations ECLIPSE2 et ECLIPSE3. ************ Chapitre 10 Images matricielles et vectorielles Pour ce chapitre, allez sur la page suivante de mon site. http://www.lpthe.jussieu.fr/~roehner/imavec.html Vous y trouverez des exemples d'images matricielles et vectorielles. *** Image matricielle Qu'est ce qu'une image matricielle? C'est une image similaire a celle qu'on peut prendre avec un appareil photo, que ce soit un appareil a pellicule ou bien un appareil numerique. Lorsqu'on agrandit de facon importante une photo-pellicule le grain de la pellicule devient visible et impose une limite a tout agrandissement ulterieur. D'ailleurs ce grain est aussi visible sur une photo non agrandie si on la regarde avec un microscope. Il en est exactement de meme pour une photo numerique. Seul le vocabulaire sera different. Au lieu de grain on parlera de pixel. La densite des pixels impose une limite a l'agrandissement de l'image. Le mot ``matriciel'' vient de ce que le reseau constitue par les pixels figure une sorte de matrice. Le Larousse donne la definition suivante d'une matrice: arrangement ordonne d'un ensemble d'elements. Une fois que l'image sera sur l'ecran de votre ordinateur vous pouvez l'agrandir en utilisant le menu correspondant. Cependant un procede plus rapide est de maintenir enfoncee la touche ``Control'' et en meme temps de tourner la molette centrale de la souris. L'agrandissement fait apparaitre que l'image est en fait composee d'innombrables rectangles qui sont les pixels. Plus il y a de pixels par centimetre carre, plus l'image peut etre agrandie. Le nombre de bits par pixel depend du nombre de couleurs autorisees pour chaque pixel. Avec 16 couleurs par pixel il faut (au moins) 4 bits par pixel (2**4=16). Quelle est la relation entre nombre de pixels et taille du fichier? L'image du Concorde fait: 27KB=27,000 bytes =27,000 octets=216,000 bits. Par ailleurs, elle contient: 600X284 pixels. La division donne 1.26 bit/pixel ce qui est bien moins que ce qu'on attendait. Pourquoi? Chaque type d'image a un systeme de compression. Ici il s'agit d'une image de format jpg (=Joint Photographic Experts Group). Selon le niveau de qualite qu'on desire il y a tout une gamme de facteurs de compression, depuis un facteur 5 pour une image de haute qualite jusqu'a un facteur 30 pour une image de basse qualite. Pour plus de details on pourra consulter l'article Wikipedia intitule ``Pixel''. *** Image vectorielle Qu'est ce qu'une image vectorielle (en anglais ``Vector graphics'')? D'un point de vue pratique c'est une image qu'on peut agrandir a l'infini. Avant de se demander comment cela est possible, faisons le meme test d'agrandissement que pour les images precedentes. Cette fois vous ne voyez apparaitre aucun rectangle. L'image reste nette quel que soit l'agrandissement meme a des rapports x10 ou x50. Comment comprendre ce miracle? On peut en effet bien parler de ``miracle'' car l'ecran de votre ordinateur est lui-meme constitue de pixels. En l'observant avec une loupe a fort grossissement vous voyez clairement les pixels. Comment alors est-il possible que l'agrandissement ne soit pas limite par ces pixels? La reponse est qu'a chaque fois qu'on agrandit on observe en fait une image differente. Prenons l'exemple du point central en bleu. Vu sa petite taille sur l'image initiale, il ne contient que quelques pixels de l'ecran. Mais sur le fichier ce ne sont pas des indications relatives aux pixels qui sont donnees. Ce qui est donne, est une code disant en substance: ``Faire un point bleu de coordonnee (0,0) et de taille egale au centieme de la dimension horizontale du graphique''. L'interface entre le fichier et l'ecran ou apparait l'image (ce qu'on appelle le ``pilote de peripherique'', en anglais ``device driver'') va alors recalculer a quels pixels de l'ecran cela correspond. Ainsi quel que soit l'agrandissement, le point fera toujours un centieme de la taille du graphique. Par exemple avec un agrandissement de 10 il occupera non plus quelques pixels mais quelques centaines de pixels de l'ecran. A la place de l'expression ``image vectorielle'' il serait sans doute plus suggestif de dire ``image mathematique'' car a chaque visualisation l'image est ``recalculee''. Quels sont les avantages d'une image vectorielle? Mise a part la precision deja evoquee, on peut voir que la taille du fichier est minuscule, seulement 3.5 K. En fait cette taille est completement independante des pixels et ne depend que du nombre total d'elements que comporte le graphique. Ainsi s'il y a un million de points distincts la taille du fichier sera plus importante. Quels sont les formats d'image permettant des images vectorielles? Historiquement, le premier fut le format Postscript. C'est la raison pour laquelle PAW produit des images Postscript. En fait Postscript est un langage de programmation et tel est aussi le cas de la plupart des autres formats donnant des images vectorielles. Le format pdf (Portable Document Format) utilise ici permet aussi des images vectorielles. Par contre un format comme ``jpeg'' utilise pour l'image du Concorde ne le permet pas. Mais alors comment se fait-il que l'image de l'ellipse vue en premier lieu, qui est une image pdf, ne soit pas vectorielle? Les formats vectoriels Postscript et pdf peuvent faire a la fois du vectoriel et du matriciel. Cette image a ete convertie de postscript a pdf par un convertisseur qui n'a pas preserve les instructions vectorielles et n'a fait qu'une conversion des pixels ce qui est evidemment bien plus facile. Au contraire la seconde image de l'ellipse a ete obtenue par un convertisseur (a savoir: ps2pdf) respectant le caractere vectoriel. Pour plus de details on pourra consulter l'article Wikipedia intitule: ``Image vectorielle". *** Exemple de fichier Postscript Postscript est en fait un langage de programmation. Chaque image vectorielle correspond a une macro ecrite dans ce langage. Nous donnons ci-dessous un exemple qui represente un segment horizontal trace en rouge. La macro comporte environ une centaine de lignes mais on en a coupe une partie qui n'a guere d'interet pour nous. Notez l'instruction pour la ``Bounding box'' au debut, et les instructions (tout a la fin) relatives au segment (col4 correspond au rouge, si on remplace col4 par col0 on a un trait noir). Notez aussi l'instruction ``showpage''. Si on l'enleve, plus aucune image ne s'affiche. FICHIER POSTSCRIPT POUR UN SEGMENT HORIZONTAL ROUGE ------------------------------- %!PS-Adobe-3.0 EPSF-3.0 %%Title: test.fig %%Creator: fig2dev Version 3.2 Patchlevel 5d %%CreationDate: Thu Apr 9 13:35:19 2015 %%For: roehner@eris.lpthe.jussieu.fr (Bertrand ROEHNER) %%BoundingBox: 0 0 223 7 %Magnification: 1.0000 %%EndComments %%BeginProlog /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def - - end /cp {closepath} bind def /ef {eofill} bind def - - %%EndProlog pageheader % % Fig objects follow % here starts figure with depth 50 % Polyline 0 slj 0 slc 60.000 slw n 2400 2700 m 6000 2700 l gs col4 s gr % here ends figure; pagefooter showpage %%Trailer %EOF ************ Chapitre 11 Ecrire sa premiere macro SOI-MEME Au cours des chapitres precedents nous avons vu de nombreux exemples, mais jusqu'ici vous n'avez pas eu l'occasion d'ecrire une macro par vous-meme. Ce chapitre vous y invite. Voici quelques conseils. Avant de donner des conseils plus specifiques voici un conseil general. Un programme s'ecrit par un processus ``essais, erreurs, corrections''. C'est-a-dire qu'on va faire une premiere execution, puis on va corriger les erreurs et relancer l'execution. On va poursuivre ce processus jusqu'a ce qu'enfin le resultat soit conforme a notre attente. Une consequence de cette facon de faire est qu'il faut voir le compilateur comme un ami qui essait de nous aider en nous signalant nos erreurs. Bien qu'il puisse a l'occasion nous envoyer une avalanche (pas tres digeste) de messages d'erreur, il ne faut pas voir le compilateur comme un ``empecheur de tourner en rond''. ETAPES pour ECRIRE une MACRO (1) Trouver une macro qui fait quelque chose de similaire a ce qu'on veut faire et qui puisse donc servir de MODELE et de point de depart. (2) Trouver les INSTRUCTIONS nouvelles dont on aura besoin. Au besoin, cela peut vous amener a consulter le manuel pour preciser l'utilisation d'une commande. (3) INSERER les instructions nouvelles dans la macro-modele aux lignes appropriees, (4) EXECUTER et corriger les erreurs de syntaxe s'il y en a. Les erreurs de syntaxe sont en general faciles a corriger. (5) Si le compilateur signale des erreurs qu'on ne comprend pas, inserer des BALISES, c'est-a-dire des messages du genre: ``MESSAGE un'', ``MESSAGE deux'' pour reperer la ligne ou se produit l'erreur. (6) Une fois que votre macro ``tourne'' sans erreur, assurez-vous que ce qu'elle produit repond bien a votre attente. ************ Chapitre 12 Comment conserver les images creees par PAW? Dans le chapitre precedent vous avez cree des images. Vous souhaitez peut-etre les conserver ou bien les envoyer a des amis. Comment faire? La solution la plus simple et qui donne la meilleure qualite d'image est de laisser PAW creer un fichier Postscript de votre image. Comme vous l'avez compris par le chapitre ``Image matricielle - Image vectorielle'' ce fichier permettra de generer une image vectorielle, c'est-a-dire de haute qualite et cela avec une taille de fichier tres reduite. Cependant, pour visualiser un fichier Postscript il faut un visualiseur (par exemple ``ghost view'') et, pour une raison qui m'echappe, de tels visualiseurs ne sont pas tres repandus sur les ordinateurs fonctionnant sous Windows. Il nous faudra donc avoir recours a des convertisseurs disponibles sur des sites Internet ce qui complique les choses. PAW nous offre aussi la possibilite de generer une image au format gif (Graphics Interchange Format), mais comme on le verra cela produit une image qui n'est pas forcement tres fidele. De plus, elle sera matricielle et non vectorielle. *** La commande ITX Pour commencer, nous allons nous initier a la commande ITX (Input TeXt) qui permet d'ecrire quelque chose sur un graphique. Grace a cette instruction nous pourrons voir de facon claire (et meme spectaculaire) la difference de qualite entre diverses images. ************************************ MACRO ITXTEST * FAMILIARISATION AVEC LA COMMANDE ITX. * MAIS LES GRANDES VALEURS DE CHHE NE FONT EFFET QUE SUR LE * FICHIER POSTSCRIPT. A L'ECRAN DIRECT, OU SOUS FORME gif * ON N'A QUE DES PETITES TAILLES. * * REMISE DE TOUS LES PARAMETRES A LEUR VALEUR PAR DEFAUT IGSET * ; SET * ; OPTION * * * CHOIX DE LA POLICE (C'EST-A-DIRE DU TYPE DE CARACTERE) * LE CODE 20 CORRESPOND A DU ``TIMES GRAS'' IGSET TXFP -20 * * TAILLE DES CARACTERES (CHHE=CHaracter HEight) * AUGMENTER PROGRESSIVEMENT LA TAILLE DE 1 JUSQU'A 20 PAR EX, * VOUS VERREZ QU'A PARTIR D'UNE CERTAINE VALEUR CA NE FAIT PLUS EFFET. * EN FAIT, CA FAIT EFFET, MAIS SEULEMENT SUR L'IMAGE POSTCRIPT IGSET CHHE 1 * * COULEUR DES CARACTERES (0=BLANC, 1=NOIR, 2=ROUGE, 3=VERT, 4=BLEU) * (TXCI=TeXt Color Index) IGSET TXCI 3 * * ANGLE (EN DEGRES) PAR RAPPORT A L'AXE HORIZONTAL (TANG=Text ANGle) IGSET TANG 80 * * POSITION DE LA CHAINE DE CARACTERES PAR RAPPORT AU POINT DE * REFERENCE (ESSAYER AUSSI IGSET TXAL 23 -> CENTRE) IGSET TXAL 0 * X1=0 ; X2=10 ; Y1=0 ; Y2=10 ; NULL [X1] [X2] [Y1] [Y2] XP=5 ; YP=5 ; ITX [XP] [YP] Test * RETURN ************************************* *** Creer une image gif Quel que soit le format du fichier image, le processus est en gros toujours le meme. Avant de faire le dessin il faut ouvrir un fichier ou le dessin va s'enregister. Puis, une fois le dessin realise, il faut clore ce fichier. La macro qui suit genere un fichier: image2.gif ************************************* MACRO IMAGEGIF * COMMENT CONSERVER L'IMAGE QUE VOUS VENEZ DE FAIRE SOUS LA * FORME D'UN FICHIER QUE VOUS POURREZ ENVOYER A VOS AMIS (1) * * PAW OFFRE 2 POSSIBILITES * LA PREMIERE (MAIS PAS LA MEILLEURE) EST DE FABRIQUER * UNE IMAGE AU FORMAT gif (Graphics Interchange Format) * PICT/DEL * ; PICT/CR image2 * IGSET TXFP -20 ; IGSET CHHE 15 ; IGSET TXCI 6 ; IGSET TANG 60 NULL 0 10 0 10 XP=5 ; YP=5 ; ITX [XP] [YP] Test * PICT/PRINT image2.gif * RETURN ************************************* *** Creer une image Postscript La macro qui suit genere un fichier: image2.ps ************************************* MACRO IMAGEPS * COMMENT CONSERVER L'IMAGE QUE VOUS VENEZ DE FAIRE SOUS LA * FORME D'UN FICHIER QUE VOUS POURREZ ENVOYER A VOS AMIS (2) * * LA MEILLEURE SOLUTION EST DE LAISSER PAW FAIRE UN FICHIER * POSTSCRIPT CAR CELA DONNERA UNE REPRODUCTION FIDELE * DE L'IMAGE. * * ENSUITE, COMME NOUS N'AVONS PAS DE VISUALISEUR DE FICHIER * POSTSCRIPT, IL FAUDRA CONVERTIR LE FICHIER ps EN pdf * POUR CELA ON POURRA UTILISER LE SITE SUIVANT: * * ps -> pdf (respecte le caractere vectoriel de l'image ps) * http://www.q2tek.com/conversion_tools/ps2pdf/ * * Si vous voulez une image jpg (un format tres standard) * vous pouvez utiliser le site suivant. * Cette conversion fera perdre le caractere vectoriel * mais est neanmoins plus fidele que l'image gif genere * par PAW. * * ps -> jpg (remplace l'image vectorielle par une image matricielle) * http://image.online-convert.com/fr/convertir-en-jpg * FORTRAN/FILE 66 image2.ps ; META 66 -111 * IGSET TXFP -20 ; IGSET CHHE 15 ; IGSET TXCI 6 ; IGSET TANG 60 NULL 0 10 0 10 XP=5 ; YP=5 ; ITX [XP] [YP] Test * CLOSE 66 * RETURN ************************************* Si pour une raison ou une autre la conversion par le site q2tek ne marche pas vous pouvez neanmoins voir le resultat en allant sur http://www.lpthe.jussieu.fr/~roehner/pawfr3fig.html Cliquez sur les images jpg et pdf. ************ Chapitre 13 Le developpement de logiciels ouverts. *** Developpement collectif Les logiciels ouverts, particulierment ceux de la mouvance LINUX, sont des creations collectives par des programmeurs qui en regle generale ne se connaissent pas. Intuitivement, on se demande bien comment des bouts de programme developpes de facon separee peuvent s'harmoniser et constituer un tout coherent. On a raison de se poser cette question car en effet c'est un point central. Cette necessite d'harmoniser les contributions individuelles se pose dans tout projet collectif, qu'il s'agisse de construire une voiture, un avion ou une raffinerie. Mais le developpement de logiciels comporte deux grandes differences: (1) Contrairement a un avion qui aboutit a un produit final qui avait ete predefini au depart, les logiciels sont en evolution constante un peu comme un arbre qui developpe sans cesse de nouvelles branches. (2) Alors qu'un avion est concu au sein d'une entreprise, un logiciel va etre developpe par un reseau de programmeurs dissemines geographiquement et qui n'ont guere d'occasions de se rencontrer. Dans les dernieres decennies il s'est developpe tout un univers centre autour du developpement logiciel. Les mots-cles en sont: * Gestion de revisions ou ``revision control'' * Gestion de configuration logicielle ou ``Software configuration management'' (SCM) * Git (mot d'argot d'anglais britannique prononce ``guit'' designant une personne deplaisante) * Valivation et verification de logiciel ou ``Software verification and validation'' (V and V). Il y a de longs articles Wikipedia sur chacune de ces notions. Ils sont souvent tres techniques et pas bien clairs pour les non-specialistes, mais on peut neanmoins y glaner quelques elements. Avant d'expliquer plus en detail comment fonctionne un systeme SCM, on peut rappeler le cas de ImageMagick deja cite dans un chapitre precedent. *** L'exemple de ImageMagick Rappelons que c'est la société de produits chimiques ``Du Pont de Nemours'' qui est a l'origine de ce logiciel. Le developpement commenca en 1987 sous la direction de David Pensak et avec la collaboration du reseau Usenet. ImageMagick devint un logiciel en acces libre sur Usenet des 1990. A l'epoque c'etait une chose nouvelle. Le site suivant http://www.imagemagick.org/script/history.php explique qu'en 1990 la propriete de ImageMagick fut transferee a une societe a but non lucratif appellee ``ImageMagick Studio LLC''. LLC signifie ``limited liability company'' ce qui montre que bien qu'a but non lucratif il s'agit neanmoins d'une societe commerciale et non d'une simple association type 1901. Une LLC est une entite commerciale hybride mi-entreprise et mi-association de type partenariat. Comme une entreprise, une LLC est a responsabilite limitee en ce sens que les proprietaires de la LLC, appeles ``membres'', sont proteges par rapport aux dettes eventuelles de la LLC. Comme une association, une LLC est affranchie d'impots sur le revenu. De 1990 a 1995 le developpement de ImageMagick resta en sommeil, mais sans etre completement gele en ce sens que les erreurs signalees par les utilisateurs etaient corrigees. Le developpement reprit en 1995 grace a quelques nouveaux arrivants, en particulier: Bob Friesenhahn (*), Glenn Randers-Pehrson, William Radcliffe, Leonard Rosenthol, Anthony Thyssen, Fred Weinhaus. Quel etait le statut professionnel de ces personnes et qui les renumeraient, cela nous l'ignorons. (*) I am the principle maintainer of GraphicsMagick, an image processing application as well as the author of Magick++, the C++ API for ImageMagick and GraphicsMagick. Prior to spinning up the GraphicsMagick project, I helped develop ImageMagick for 5 years. Bob Friesenhahn . Cette personne est un des piliers de GraphicsMagick. Est-elle renumeree pour ce travail? Ce n'est pas precise sur son CV. En tous les cas il est clair d'apres son CV que Friesenhahn a developpe GraphicsMagick a temps partiel car il a occupe d'autres fonctions professionnelles durant la decennie ecoulee. Une branche separee s'est creee en 2002 du fait de choix differents faits par une partie des developpeurs. Cette branche qui s'appelle ``GraphicsMagick'' reste (pour le moment) compatible avec ImageMagick. ``ImageMagick'' est une marque deposee qui fut enregistree aux Etats-Unis en 2005. *** Le triptyque: fondation + systeme SCM + programmeurs individuels Ce bref rappel nous montre le role des fondations qui sont en charge du developpement d'un logiciel et des programmeurs-developpeurs payes (a plein temps ou sur contrat) par cette fondation. Jusqu'ici nous n'avions pas explique comment le travail des ces developpeurs etait organise et harmonise. Clairement, les systemes de SCM repondent a ce but. Cela signifie qu'un noyau de permanents va definir les grandes lignes reglant le fonctionnement du SCM et fixer quelques axes pour le developpement futur. Ensuite, a l'interieur de ce cadre, les programmeurs pourront intervenir avec une relative autonomie. L'autonomie individuelle permise au programmeur par ce systeme de gestion souple fait de lui reellement un developpeur. Il n'est pas un simple tacheron a qui on assigne des taches et cela est certainement une importante source de motivation. Rappelons que la fondation n'a pas d'imperatif de profit mais a pour but ``d'occuper le terrain''. Le systeme de SCM permet une structure souple dans laquelle les idees individuelles sont valorisees. La structure arborescente qui en resulte repond tres bien a l'objectif d'occupation du terain. En resume, grace a la structure d'un systeme de SCM, une fondation peut piloter de facon souple le developpement d'un logiciel par un reseau de programmeurs renumeres. Evidemment ce systeme ne peut fonctioner que grace au soutien financier de mecenes. La fondation Wikipedia fonctionne egalement sur ce modele. On peut s'en rendre compte par la facon rigoureuse dont sont conserves les historiques de chaque article ou bien la facon systematique dont sont developpes les articles a l'interieur d'une meme famille. A titre d'illustration on peut penser aux series ``rois de France'', ``revolutions'', ``famines''. *** Elements essentiels d'un systeme de SCM Lorsqu'un programmeur veut se joindre a un groupe de developpement il lui faut d'abord investir du temps pour comprendre comment fonctionne ce groupe. Cela passe par les points suivants. (1) A quel point en est le developpement? Cela suppose qu'un manuel a ete redige qui explique en detail le fonctionnment de chacune des commandes creees (il peut y en avoir des centaines). La plupart du temps ces manuels prennent modele sur le manuel de Linux (par exemple pour comprendre la commande ``grep'' on va taper: man grep). (2) Dans quels languages doivent etre ecrits les additions. Souvent il y a un large choix. Ainsi les commandes de ImageMagick sont compatibles avec de nombreux langages: bash, perl, C++, etc. (3) Il lui faut se familiariser avec les interfaces de programmation (ou API=Application Programming Interface) qui lui permettront de mettre en oeuvre des ressources pre-existantes. Par exemple, si comme c'est souvent le cas, le travail du programmeur necessite l'utilisation d'une base de donnees, il lui faudra choisir un Systeme de Gestion de Base de Donnees (SGBD ou en anglais: DataBase Management System soit DBMS) repondant a ses besoins puis apprendre a l'utiliser. (4) Enfin, une fois qu'il aura ecrit une contribution, il lui faudra se familiariser avec le systeme de SCM par lequel sa contribution pourra etre integree au logiciel. Toutes ces taches demandent un notable investissement en temps, surtout lorsqu'on se joint a un SCM pour la premiere fois. On doit donc s'attendre a ce qu'un programmeur n'y consente que s'il est sur de pouvoir le rentabiliser, ce qui en pratique implique un recrutement (a temps plein ou a temps partiel) sur un contrat de plusieurs annees. *** Illustration sur le cas de GraphicsMagick Allez sur le site suivant: http://www.graphicsmagick.org/ On y explique ce que permet de faire ce logiciel. Vous voyez aussi un encadre qui s'appelle: ``Mercurial Repository'' ``Mercurial'' est le nom du SCM qui est utilise par les developpeurs de GraphicsMagick. En cliquant dessus vous etes transfere vers le site suivant. http://sourceforge.net/p/graphicsmagick/code/ci/default/tree/ Sur ce site, vous voyez une longue liste de complements et de corrections qui ont ete apportes a ce logiciel dans les dernieres semaines. Cela vous montre que le SCM est le coeur du developpement d'un logiciel. Ce qui est surprenant en verite est le fait qu'on en entend si peu parler. Lors d'un cours precedent nous avons observe que l'Europe est de facon tragique en retard dans le developpement de logiciels. En fait il y a quelques rares niches ou des logiciels europeens ont pu s'imposer. Par exemple, la societe Dassault a cree un logiciel d'imagerie qui est utilise par de nombreuses industries pour la conception et la production de pieces industrielles. Mais vous voyez que dans ce cas le logiciel a ete developpe au sein d'une meme societe. C'est tres different du processus ``bourgeonnant'' des SCM. *** Exrait de la complainte d'un personne qui a contribue. 2014-03-10 I submitted a patch several weeks ago, and it was horrible. Here's how it went down: (1) Spend an hour navigating aforementioned terrible website looking for how to submit a patch. (2) Copy patch to my clipboard and dump it into the contact form (3) Hit send (4) Never hear back from anyone about it (5) After several weeks notice that my patch has been applied and has been in two releases of ImageMagick, and there's no attribution like you see with git. It's like you're actually trying to make it difficult for people to give you code. *** Remerciements I would like thank all the contributors to Imagemagick for such a terrific tool and all their hard work. Special thanks goes to Magick, Anthony and RMabry. Magick started and has devoted many years to this effort. I am continually amazed at how quickly he gets bugs fixed and new releases out. Fred Weinhaus *** Extrait d'un message recu de Bob Friesenham (28 avril 2015) John Cristy told us that we were all equals and that if he registered "ImageMagick Studio" like a business that we would all be equal parties. However, he registered "ImageMagick Studio" only under his name and later told us that this was to "protect" us. He also tried to register "ImageMagick" as a registered trademark without informing us. These actions (and other more significant once) lead to a parting of ways and emergence of GraphicsMagick. ************ Chapitre 14 Realisation d'une serie de drapeaux Dans un premier temps, on a dessine un seul drapeau a 3 bandes horizontales. Dans un second temps, on a ecrit une macro utilitaire (dont les arguments sont trois couleurs) permettant de dessiner n'importe quel drapeau ayant trois bandes horizontales. Cela s'applique par exemple aux pays suivants: Allemagne, Armenie, Autriche, Bolivie, Bulgarie, Colombie, Estonie, Gabon, Lithuanie. Pour connaitre les couleurs de ces drapeaux on pourra se reporter a la page suivante: http://www.lpthe.jussieu.fr/~roehner/pawfr3fig.html