<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xprov</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xprov"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Xprov"/>
	<updated>2026-05-21T04:51:29Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO704_:_Analyse_d%27algorithmes&amp;diff=10141</id>
		<title>INFO704 : Analyse d&#039;algorithmes</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO704_:_Analyse_d%27algorithmes&amp;diff=10141"/>
		<updated>2017-07-03T11:44:02Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; Responsable de 2015 à 2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
* Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
== Quelques ressources bibliographiques ==&lt;br /&gt;
&lt;br /&gt;
Ouvrage de référence :&lt;br /&gt;
# Cormen, Leiserson, Rivest et Stein, Algorithmique, 3e edition (2009). ( Aussi appelé &amp;quot;Introductino à l&#039;algorithmique&amp;quot; pour les deux premières éditions )&lt;br /&gt;
&lt;br /&gt;
Autres références bibliographiques :&lt;br /&gt;
# Wilf, Algorithms and Complexity, (1994). [http://www.math.upenn.edu/%7Ewilf/AlgoComp.pdf Disponible en ligne]&lt;br /&gt;
# Garey et Johnson, Computers and intractability a guide to the theory of NP-completeness. (1979).&lt;br /&gt;
# Paschos, Complexité et approximation polynomiale, (2004).&lt;br /&gt;
# Hopcroft et Ullman, Introduction to automata theory, languages, and computation, (1979).&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
 - Énoncé du TP, première partie : [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/tp-part-1.pdf tp-part-1.pdf].&lt;br /&gt;
 - Énoncé du TP, deuxième partie : [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/tp-part-2.pdf tp-part-2.pdf].&lt;br /&gt;
 - Programmes pour générer des instances : [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/gen3SAT.py gen3SAT.py] [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/genCA.py genCA.py] [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/3SATtoCA.py 3SATtoCA.py].&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
Cours 1 et 2 (13 septembre) : Introduction&lt;br /&gt;
 - Exemple &amp;quot;Tri lent&amp;quot; [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO704/tri.tgz Programme C/gtk pour illustrer différents algorithmes de tri].&lt;br /&gt;
 - Notions d&#039;instance et de problème&lt;br /&gt;
 - Encodage d&#039;une instance&lt;br /&gt;
 - Feuille de rappels et exo [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/grandO.pdf Grand-O].&lt;br /&gt;
 - Feuille de rappels et exo [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/log_exp.pdf Logarithme et exponentielle].&lt;br /&gt;
 - Feuille de rappels et exo [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/analyse_algo_base.pdf Analyse d&#039;algorithmes, les bases].&lt;br /&gt;
&lt;br /&gt;
Cours 3 et 4 (20 septembre) : Complexité temporelle des fonctions simples&lt;br /&gt;
 - Retour sur la feuille de rappels et exo &amp;quot;Analyse d&#039;algorithmes, les bases&amp;quot;.&lt;br /&gt;
 - Tests empiriques de la complexité des fonctions récursives : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/graphChrono.tgz Script pour fabriquer une courbes des temps de calcul (utilise gnuplot)].&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/fct_rec.pdf Théorèmes relatifs à la complexité temporelle des fonctions récursives].&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/exo_div_pour_regner.pdf Exercices, complexité des fonctions récursives].&lt;br /&gt;
 - [http://www.csail.mit.edu/~thies/6.046-web/master.pdf Exercices supplémentaires sur l&#039;application du &amp;quot;Théorème maître&amp;quot; (sur la page de Bill Thies, MIT)].&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/distance_min.pdf Problème du calcul de la distance minimum entre deux points].&lt;br /&gt;
&lt;br /&gt;
Cours 5 et 6 (27 septembre) : Diviser-pour-régner (suite et fin).&lt;br /&gt;
 - Comparaison d&#039;approches naïves VS diviser-pour régner (théorie et implémentation).&lt;br /&gt;
 - Problème de la distance minimum dans un nuage de points.&lt;br /&gt;
 - Problème du sous-tableau de somme maximale.&lt;br /&gt;
 - Problème de la multiplication de grands entiers.&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/graphChrono.tgz Deuxième version du script graphChrono.py pour fabriquer une courbes des temps de calcul (utilise gnuplot)].&lt;br /&gt;
&lt;br /&gt;
Cours 7 et 8 (4 octobre) : Programmation dynamique.&lt;br /&gt;
 - Solutions aux exercices du cours précédent : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/solutionsDPR/dmin.cpp dmin.cpp]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/solutionsDPR/multGrandsEntiers.cpp multGrandsEntiers.cpp]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/solutionsDPR/sommeMax.cpp sommeMax.cpp]&lt;br /&gt;
 - Distance de Levenshtein [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/Levenshtein.py Levenshtein.py] [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/animaux Petite banque de mots].&lt;br /&gt;
&amp;lt;!-- - Devoir &amp;quot;Impression équilibrée&amp;quot;&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/impression_eq.py Code à compléter (Python 2).]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO704/impression_eq-python3.py Code à compléter (Python 3).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cours 9 et 10 (18 octobre) : &lt;br /&gt;
 - Algorithmes de type &amp;quot;Retour sur bande&amp;quot;.&lt;br /&gt;
 - Cycle Eulérien VS Cycle Hamiltonien.&lt;br /&gt;
 - Complexité d&#039;un problème.&lt;br /&gt;
 - Classe P.&lt;br /&gt;
 - Types de problèmes ( décision, optimisation, existance ).&lt;br /&gt;
 - Réduction polynomiale.&lt;br /&gt;
 - Algorithme de vérification.&lt;br /&gt;
 - Classe NP.&lt;br /&gt;
&lt;br /&gt;
Cours 11 et 12 (25 octobre) :&lt;br /&gt;
 - Problèmes NP-difficiles et NP-complets.&lt;br /&gt;
 - Théorème de Cook.&lt;br /&gt;
 - Preuve de NP-Complétude : Couverture des arêtes et k-coloriage.&lt;br /&gt;
&lt;br /&gt;
== Historique ==&lt;br /&gt;
Ce cours est une refonte de [http://lama.univ-savoie.fr/mediawiki/index.php/INFO724_:_Algorithmique_avanc%C3%A9e,_graphes_et_NP-Compl%C3%A9tude INFO724 Algorithmique avancée, graphes et NP-complétude].&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=10131</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=10131"/>
		<updated>2017-06-20T09:36:42Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
== Examen de 1ere session ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/corrige.pdf Examen de 1ere session avec solution.]&lt;br /&gt;
&lt;br /&gt;
== Documentation remise à l&#039;examen ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_POSIX_resume.pdf Entêtes de fonctions POSIX -- Aide pour l&#039;examen.]&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q2.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10121</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10121"/>
		<updated>2017-06-13T15:17:42Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Examens précédents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examens précédents ==&lt;br /&gt;
&lt;br /&gt;
 - 2016-2017 : [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/MATH202_examen_avec_solution.pdf Examen de 1ere session avec solution.]&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
 - TP4 : Compression avec perte&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp4.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10120</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10120"/>
		<updated>2017-06-13T15:12:30Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examens précédents ==&lt;br /&gt;
&lt;br /&gt;
 - 2016-2017 : [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/MATH202_examen_avec_solution.pdf Examen 1ere session avec solution.]&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
 - TP4 : Compression avec perte&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp4.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10119</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=10119"/>
		<updated>2017-06-13T15:11:45Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examens précédents ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/MATH202_examen_avec_solution.pdf Examen 1ere session avec solution.]&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
 - TP4 : Compression avec perte&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp4.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9922</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9922"/>
		<updated>2017-04-11T23:40:09Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Documentation remise en classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
== Documentation remise à l&#039;examen ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_POSIX_resume.pdf Entêtes de fonctions POSIX -- Aide pour l&#039;examen.]&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q2.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9921</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9921"/>
		<updated>2017-04-11T23:39:43Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_POSIX_resume.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q2.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9895</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9895"/>
		<updated>2017-03-19T16:49:07Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q2.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9894</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9894"/>
		<updated>2017-03-14T07:01:48Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Énoncés des TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
 - TP4 : Compression avec perte&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp4.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9893</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9893"/>
		<updated>2017-03-14T07:01:28Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Énoncés des TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
- TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
- TP4 : Compression avec perte&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp4.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9892</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9892"/>
		<updated>2017-03-08T11:07:46Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si ``c`` ne satisfait pas l&#039;un des trois tests, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;ATTENTION&amp;lt;/B&amp;gt; afin d&#039;obtenir des résultat pertinents, ignorez tous les ``p_m`` dont la valeur est 0 ou 1. Si vous les incorporez dans votre calcul, tous les autres ``p_mi`` seront ignorés et le résultat final sera systématiquement 0 ou 1 (ou ``Nan`` car vous risqueriez de faire une division par zéro).&lt;br /&gt;
&lt;br /&gt;
= Bases de données à télécharger =&lt;br /&gt;
&lt;br /&gt;
Afin de tester votgre code, vous pouvez utiliser la banque de courriels suivants :&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-smb.fr/~provencal/enseignement/INFO424/emails.zip emails.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9891</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9891"/>
		<updated>2017-03-08T09:59:10Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;ATTENTION&amp;lt;/B&amp;gt; afin d&#039;obtenir des résultat pertinents, ignorez tous les ``p_m`` dont la valeur est 0 ou 1. Si vous les incorporez dans votre calcul, tous les autres ``p_mi`` seront ignorés et le résultat final sera systématiquement 0 ou 1 (ou ``Nan`` car vous risqueriez de faire une division par zéro).&lt;br /&gt;
&lt;br /&gt;
= Bases de données à télécharger =&lt;br /&gt;
&lt;br /&gt;
Afin de tester votgre code, vous pouvez utiliser la banque de courriels suivants :&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-smb.fr/~provencal/enseignement/INFO424/emails.zip emails.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9890</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9890"/>
		<updated>2017-03-08T09:58:46Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**ATTENTION** afin d&#039;obtenir des résultat pertinents, ignorez tous les ``p_m`` dont la valeur est 0 ou 1. Si vous les incorporez dans votre calcul, tous les autres ``p_mi`` seront ignorés et le résultat final sera systématiquement 0 ou 1 (ou ``Nan`` car vous risqueriez de faire une division par zéro).&lt;br /&gt;
&lt;br /&gt;
= Bases de données à télécharger =&lt;br /&gt;
&lt;br /&gt;
Afin de tester votgre code, vous pouvez utiliser la banque de courriels suivants :&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-smb.fr/~provencal/enseignement/INFO424/emails.zip emails.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9889</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9889"/>
		<updated>2017-03-08T09:49:56Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Bases de données à télécharger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bases de données à télécharger =&lt;br /&gt;
&lt;br /&gt;
Afin de tester votgre code, vous pouvez utiliser la banque de courriels suivants :&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-smb.fr/~provencal/enseignement/INFO424/emails.zip emails.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9888</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9888"/>
		<updated>2017-03-08T09:49:32Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bases de données à télécharger =&lt;br /&gt;
&lt;br /&gt;
Afin de tester votgre code, vous pouvez utiliser la banque de courriels suivants :&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-smb.fr/~provecal/enseignement/INFO424/emails.zip emails.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9887</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9887"/>
		<updated>2017-03-08T09:47:48Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, est de 1/2. Cela permet de simplifier significativement les calculs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9886</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9886"/>
		<updated>2017-03-08T09:46:43Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;on a calculé tous ces probabilités pour tous les mots ``m1, m2, m3, ..., mk``, on calcule la probabilité que le message soit un spam en calculant :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
                       p_m1*p_m2*p_m3*...*p_mk&lt;br /&gt;
  ---------------------------------------------------------------------&lt;br /&gt;
  (p_m1*p_m2*p_m3*...*p_mk) + ((1-p_m1)*(1-p_m2)*(1-p_m3)*...*(1-p_mk))&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9885</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9885"/>
		<updated>2017-03-08T09:41:56Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
Ainsi, étant donné un mot ``m`` dont l&#039;Analyseur a déterminé les probabilités suivantes :&lt;br /&gt;
&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_ham`` d&#039;apparaître dans un courriel de type ``ham``.&lt;br /&gt;
 - Le mot ``m`` a la probabilité ``p_spam`` d&#039;apparaître dans un courriel de type ``spam``.&lt;br /&gt;
&lt;br /&gt;
On calcule ``p_m``, la probabilité que le message soit un spam en faisant : ``p_spam / ( p_ham + p_spam )``.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9884</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9884"/>
		<updated>2017-03-08T09:36:48Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( &amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;.indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9883</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9883"/>
		<updated>2017-03-08T09:34:36Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors ``s`` n&#039;est pas un mot. On fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( String(&amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;).indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9882</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9882"/>
		<updated>2017-03-08T09:34:11Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors s n&#039;est pas un mot.&lt;br /&gt;
        // on fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( String(&amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;).indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9881</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9881"/>
		<updated>2017-03-08T09:33:59Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Aide à la programmation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Après avoir retiré les balises html du coprs d&#039;un message, il faut être en mesure de la découper en mots. Voici une méthode très simple afin de découper les lignes de texte en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le code ci-dessus, on utilise la fonction ``estMot``. Cette fonction prend en entrée une chaîne de caractères et retourne un booléen indiquant s&#039;il s&#039;agit bien d&#039;un mot ou non. Par exemple, les courriels contiennent souvent des images dont le code est inclus dans le corps du message, format des suites de caractères incompréhensibles. La fonction ``estMot`` doit être en mesure de détecter ce genre de suites de caractères qui ne correspondent pas à des mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    private boolean estMot(String s)&lt;br /&gt;
    {&lt;br /&gt;
        // Si la longueur de s est zéro ou supérieure à 25 alors s n&#039;est pas un mot.&lt;br /&gt;
        // on fixe la limite à 25 car &#039;anticonstitutionnellement&#039; est de longueur 25 !&lt;br /&gt;
&lt;br /&gt;
        // Pour chaque lettre ``c`` de ``s``, on teste :&lt;br /&gt;
        //   si ``c`` est une lettre majuscule ( &#039;A&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;Z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre minuscule ( &#039;a&#039; &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
        //   si ``c`` est une lettre accentuée ( String(&amp;quot;àÀâÂéÉèÈêÊëÊîÎïÏôÔöÖùÙ&amp;quot;).indexOf(c) != -1 )&lt;br /&gt;
        //   Si c&#039;est n&#039;entre pas dans un de ces trois cas, alors ``s`` n&#039;est pas un mot!&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9880</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9880"/>
		<updated>2017-03-08T09:25:12Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( estMot(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9879</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9879"/>
		<updated>2017-03-08T09:24:59Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( isWord(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9878</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9878"/>
		<updated>2017-03-08T09:24:48Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Aide à la programmation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
    for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
    {&lt;br /&gt;
        s = s.toLowerCase();&lt;br /&gt;
        if ( isWord(s) )&lt;br /&gt;
        {&lt;br /&gt;
            // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9877</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9877"/>
		<updated>2017-03-08T09:24:06Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
 for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
 {&lt;br /&gt;
 s = s.toLowerCase();&lt;br /&gt;
 if ( isWord(s) )&lt;br /&gt;
 {&lt;br /&gt;
   // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9876</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9876"/>
		<updated>2017-03-08T09:23:56Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Identifier les mots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 // on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
 for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
 {&lt;br /&gt;
 s = s.toLowerCase();&lt;br /&gt;
 if ( isWord(s) )&lt;br /&gt;
 {&lt;br /&gt;
   // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9875</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9875"/>
		<updated>2017-03-08T09:23:33Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Voici une méthode très simple afin de découper les lignes d&#039;un courriel en mots.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
// on suppose que &#039;ligne&#039; de type String et contient une ligne de texte&lt;br /&gt;
for ( String s : (subject + &amp;quot; &amp;quot; + body).split( &amp;quot;[ ,.!?&#039;’…]&amp;quot; ) )&lt;br /&gt;
{&lt;br /&gt;
s = s.toLowerCase();&lt;br /&gt;
if ( isWord(s) )&lt;br /&gt;
{&lt;br /&gt;
  // ajouter ce mot à la l&#039;ensemble des mots de ce message.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9874</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9874"/>
		<updated>2017-03-08T09:19:56Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Identifier les mots ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous lisez les lignes du //corps// d&#039;un courriel,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9873</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9873"/>
		<updated>2017-03-07T15:54:48Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Déroulement (2016-2017) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q2.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9871</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9871"/>
		<updated>2017-03-07T13:05:16Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Feuilles de TD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Première feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Deuxième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Troisième feuille de TD.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td4.pdf Quatrième feuille de TD.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
- TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9870</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9870"/>
		<updated>2017-03-05T18:35:51Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;br /&gt;
    - Trace 2D&lt;br /&gt;
&lt;br /&gt;
 - TD7&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-td7.pdf Énoncé du TD7.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9869</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9869"/>
		<updated>2017-03-05T17:48:29Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9868</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9868"/>
		<updated>2017-03-04T19:52:35Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Calcul des probabilités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme suggéré, nous feront l&#039;hypothèse que, de manière générale, la probabilité qu&#039;un message reçu soit un spam, P(S), est de 1/2. Il en va de même avec la probabilité qu&#039;un message soit un ham, P(H), que nous fixons à 1/2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9867</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9867"/>
		<updated>2017-03-04T19:49:52Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Calcul des probabilités =&lt;br /&gt;
&lt;br /&gt;
Une fois votre programme d&#039;analyse terminé, votre second programme, le juge, détermine si un courriel donné est un spam ou non. Le détail des calcul est bien expliqué sur la page wikipedia : &lt;br /&gt;
&lt;br /&gt;
 Probabilité pour un mot : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Calculer_la_probabilit.C3.A9_qu.27un_message_contenant_un_mot_donn.C3.A9_soit_un_spam&lt;br /&gt;
 &lt;br /&gt;
 Combiner les probabilités : https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam#Combiner_les_probabilit.C3.A9s_individuelles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9866</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9866"/>
		<updated>2017-03-04T18:30:29Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
En entête du fichier, ajoutez la ligne :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante, affiche la liste des fichiers et dossiers présents dans le dossier ``chemin``.&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String chemin )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File( chemin );&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9865</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9865"/>
		<updated>2017-03-04T18:29:17Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
= Présentation du projet =&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
= Serveur SVN =&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
= Aide à la programmation =&lt;br /&gt;
&lt;br /&gt;
== Lister les fichiers présents dans un dossier ==&lt;br /&gt;
&lt;br /&gt;
  En entête du fichier, ajoutez la ligne :&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String name )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File(name);&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9864</id>
		<title>INFO424 : Projet en informatique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO424_:_Projet_en_informatique&amp;diff=9864"/>
		<updated>2017-03-04T18:28:31Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable pour 2016--2017: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
== Présentation du projet ==&lt;br /&gt;
&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/presProjet.pdf Diaporama d&#039;introduction.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/objectifs.pdf Liste des objectifs.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Premier checkout du dépôt SVN ==&lt;br /&gt;
&lt;br /&gt;
Cette manipulation n&#039;est à effectuer &#039;&#039;&#039;une seule fois&#039;&#039;&#039; par chacun des membres de l&#039;équipe. Le résultat sera la création d&#039;un dossier qui sera &#039;&#039;&#039;synchronisé&#039;&#039;&#039; entre les membres de l&#039;équipe par un &#039;&#039;&#039;gestionnaire de versions&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Avec un éditeur de texte, ouvrir le fichier &#039;&#039;&#039;~/.ssh/config&#039;&#039;&#039; et y ajouter les lignes suivantes (VOTRENOM doit être remplacé par votre nom d&#039;utilisateur) :&lt;br /&gt;
 Host serveursvn&lt;br /&gt;
 Hostname os-vps418.infomaniak.ch&lt;br /&gt;
 User VOTRENOM&lt;br /&gt;
 Port 622&lt;br /&gt;
&lt;br /&gt;
* Ouvrir un terminal et entrer la commande :&lt;br /&gt;
 ssh serveursvn&lt;br /&gt;
&lt;br /&gt;
* Une fois connecté, entrez la commande :&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
* Si la réponse &#039;&#039;&#039;n&#039;est pas&#039;&#039;&#039; &amp;quot;depots&amp;quot;, c&#039;est que la connexion a échouée... vérifiez les étapes précédentes. Si la réponse &#039;&#039;&#039;est&#039;&#039;&#039; &amp;quot;depots&amp;quot; alors changez votre mot de passe en entrant la commande :&lt;br /&gt;
 passwd&lt;br /&gt;
&lt;br /&gt;
* Changer votre mot de passe &#039;&#039;&#039;n&#039;est pas optionnel&#039;&#039;&#039;. D&#039;ici quelques jours un script tentera de se connecter en utilisant votre ancien mot de passe. S&#039;il réussi, il &#039;&#039;&#039;supprimera&#039;&#039;&#039; tout vos fichiers !&lt;br /&gt;
&lt;br /&gt;
* Déconnectez vous en faisant CTRL-D.&lt;br /&gt;
&lt;br /&gt;
* Dans le terminal, positionnez vous dans un dossier approprié pour effectuer le &amp;quot;checkout&amp;quot;. Le &amp;quot;checkout&amp;quot; va créer un dossier du même nom que votre équipe de projet. Pour effectuer le &amp;quot;checkout&amp;quot; faites (EQUIPE doit être remplacé par votre nom d&#039;équipe tel qu&#039;écrit au champs GROUP sur la feuille qui vous a été distribuée) :&lt;br /&gt;
 svn checkout svn+ssh://serveursvn/var/svn/EQUIPE&lt;br /&gt;
&lt;br /&gt;
* C&#039;est fini ! Un des membres de l&#039;équipe va maintenant ajouter au dépôt les guides et les fichiers java réalisés lors de la première séance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ne plus entre son mot de passe à chaque connexion ==&lt;br /&gt;
&lt;br /&gt;
Lorsque vous interragissez avec votre dépôt &#039;&#039;&#039;svn&#039;&#039;&#039; vous établissez d&#039;avord une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039;. Il existe deux façons de s&#039;identifier lorsqu&#039;on établie une connexion &#039;&#039;&#039;ssh&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* Entrer un mot de passe.&lt;br /&gt;
* Échanger des clés.&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;identifier par échange de clé, il faut posséder une paire &#039;&#039;&#039;clé publique / clé privée&#039;&#039;&#039;. Tout d&#039;abord, vérifiez si vous possédez déjà des clés, entrez la commande : &lt;br /&gt;
 ls ~/.ssh/id_rsa*&lt;br /&gt;
&lt;br /&gt;
Si les deux fichiers &#039;&#039;&#039;id_rsa&#039;&#039;&#039; et &#039;&#039;&#039;id_rsa.pub&#039;&#039;&#039; sont listés alors vous possédez déjà des clés. Sinon, entrez la commande : &lt;br /&gt;
 ssh-keygen&lt;br /&gt;
Acceptez les valeurs pas défaut et n&#039;entre rien comme &#039;&#039;&#039;passphrase&#039;&#039;&#039;. Voilà, vos clés ont été générées.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Activez l&#039;identification par échange de clés&#039;&#039;&#039;. Entrez la commande : &lt;br /&gt;
 ssh-copy-id serveursvn&lt;br /&gt;
Vous entrez alors votre mot de passe pour la dernière fois. À partir de ce moment vous serez identifier pas échange de clés.&lt;br /&gt;
&lt;br /&gt;
= Lister les fichiers présents dans un dossier =&lt;br /&gt;
&lt;br /&gt;
  En entête du fichier, ajoutez la ligne :&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    import java.io.File;&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    static void listeFichiersDansDossier( String name )&lt;br /&gt;
    {&lt;br /&gt;
        File dossier = new File(name);&lt;br /&gt;
        File[] listeDesFichiers = dossier.listFiles();&lt;br /&gt;
        for ( File f : listeDesFichiers ) {&lt;br /&gt;
            if ( f.isFile() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Fichier : &amp;quot; + f.getName());&lt;br /&gt;
            } else if ( f.isDirectory() ) {&lt;br /&gt;
                System.out.println(&amp;quot;Dossier &amp;quot; + f.getName());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - Convertir une image ( ex : ``fichierEntree.jpg`` ) d&#039;un format quelconque en ppm : &lt;br /&gt;
   &#039;&#039;&#039;$ convert fichierEntree.jpg -compress none fichierSortie.ppm&#039;&#039;&#039;&lt;br /&gt;
   (Nécessite la librarie ``imagemagick``)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - Script pour saisir une image depuis la webcam et la convertir au format ppm : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/takePicture.sh takePicture.sh]&lt;br /&gt;
   (requiert d&#039;avoir installé les pacquets ``streamer`` et ``imagemagick``)&lt;br /&gt;
   Sous une architecture Debian (Ubuntu, Mint, etc.) il suffit d&#039;entrer la commande suivante :&lt;br /&gt;
   &#039;&#039;&#039;$ sudo apt-get install streamer imagemagick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 - Un peu de lecture sur les deux éditeurs de texte les plus célèbres : [https://fr.wikipedia.org/wiki/Guerre_d&#039;%C3%A9diteurs Wikipedia]&lt;br /&gt;
&lt;br /&gt;
 - Feuille TODO au format pdf : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.pdf projet424.pdf]&lt;br /&gt;
 - Feuille TODO à ajouter à votre dépôt : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO424/projet424.tex projet424.tex]&lt;br /&gt;
&lt;br /&gt;
 - Courbe en S, afin d&#039;éviter d&#039;avantage de confusion, voici le calcul de la courbe en S&lt;br /&gt;
   pour modifier le contraste d&#039;une image. Dans le bout de code qui suit, &#039;&#039;&#039;x&#039;&#039;&#039; est la valeur&lt;br /&gt;
   du pixel considéré, &#039;&#039;&#039;moy&#039;&#039;&#039; la valeur moyenne de tous les pixels de l&#039;image, &#039;&#039;&#039;d&#039;&#039;&#039; est le &lt;br /&gt;
   degré de la courbe (valeur choisie par l&#039;utilisateur) et &#039;&#039;&#039;y&#039;&#039;&#039; est la nouvelle valeur du pixel.&lt;br /&gt;
   &amp;lt;code&amp;gt;&lt;br /&gt;
        if ( x &amp;lt;= moy ) {&lt;br /&gt;
            tmp = x/moy;&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = tmp*moy;&lt;br /&gt;
        } else {&lt;br /&gt;
            tmp = 1.0 - ( (x-moy) / (1.0-moy) );&lt;br /&gt;
            tmp = Math.pow( tmp, d );&lt;br /&gt;
            y = (1.0-tmp)*(1.0-moy) + moy;&lt;br /&gt;
        }&lt;br /&gt;
   &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne  : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/liresurentreestandard.adb En Ada.]&lt;br /&gt;
&lt;br /&gt;
Lire sur l&#039;entrée standrad ligne par ligne et découpe ces lignes mot à mot : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/LireSurEntreeStandard.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Récupérer les arguments de la ligne de commande :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.adb En Ada.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.java En Java.]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/arguments.py En Python.]&lt;br /&gt;
&lt;br /&gt;
Un makefile pour compiler un programme Ada, compiler une classe Java et vérifier la syntaxe d&#039;un fichier Python : &lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/exempleMakefile.tgz Exemple de makefile.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Responsable pour 2013--2014: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
&lt;br /&gt;
Documents :&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/projet.pdf Description du projet.]&lt;br /&gt;
&lt;br /&gt;
Code fourni : télécharger une des archives ci-dessous. Pour savoir quelle version télécharger, exécutez la commande :&lt;br /&gt;
&lt;br /&gt;
$ dpkg -l libjava-gnome-java&lt;br /&gt;
&lt;br /&gt;
et regardez la version de la libraire.&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.0.tgz code_de_base-v4.0.tgz]&lt;br /&gt;
* [http://lama.univ-savoie.fr/~provencal/INFO424/code_de_base-v4.1.tgz code_de_base-v4.1.tgz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilisation du clavier sous java-gnome ==&lt;br /&gt;
&lt;br /&gt;
* Dans la classe Interface, ajouter les imports :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import org.gnome.gdk.EventKey;&lt;br /&gt;
import org.gnome.gdk.Keyval;&lt;br /&gt;
import org.gnome.gdk.ModifierType;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Dans le constructeur de la classe Interface, après la ligne &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w = new Window();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Il suffit de définir les fonction qui seront appelées lorsqu&#039;on appuie (Press) et/ou relâche (Release) une touche.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
w.connect(new Widget.KeyPressEvent() {&lt;br /&gt;
public boolean onKeyPressEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a appuyé sur UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
w.connect(new Widget.KeyReleaseEvent() {&lt;br /&gt;
public boolean onKeyReleaseEvent(Widget source, EventKey event) {&lt;br /&gt;
	final Keyval key;&lt;br /&gt;
	final ModifierType mod;&lt;br /&gt;
&lt;br /&gt;
	key = event.getKeyval();&lt;br /&gt;
	mod = event.getState();&lt;br /&gt;
&lt;br /&gt;
	if (key == Keyval.Up) {&lt;br /&gt;
		System.out.println( &amp;quot;On a relaché  UP!&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Code et exemples fourni :&lt;br /&gt;
* Exemple d&#039;interface graphique et de lecteur ligne par ligne. &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.tgz Code, version java (format tgz).] &lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/java.zip Code, version java (format zip).] &lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.tgz Code, version python (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/python.zip Code, version python (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.tgz Trois images pour tester l&#039;interface graphique (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/images.zip Trois images pour tester l&#039;interface graphique (format zip.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.tgz Exemple simplissime de jeu via automate (format tgz).]&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/chat.zip Exemple simplissime de jeu via automate (format zip).]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exoMap.java Exercice sur l&#039;utilisation d&#039;un MAP.]&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/maison.zip Exemple de jeu vu en classe :  &amp;quot;Maison&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # [http://lama.univ-savoie.fr/~provencal/INFO424/exempleInterface-avec-menu.zip Exemple d&#039;interface graphique avec un petit menu.]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9861</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9861"/>
		<updated>2017-02-24T13:08:03Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Énoncés des TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
- TP3 : Cryptographie&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp3.html Lien vers le sujet].&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9860</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9860"/>
		<updated>2017-02-21T16:16:38Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Déroulement (2016-2017) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol.c Solution de la question 1 (compiler avec option &#039;&#039;&#039;-lpthread&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution alternative de la question 1 (compiler avec option &#039;&#039;&#039;-lrt&#039;&#039;&#039;)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6-q1-sol-bis.c Solution de la question 2]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO510_:_Algorithmique_:_structures_de_donn%C3%A9es_complexes&amp;diff=9859</id>
		<title>INFO510 : Algorithmique : structures de données complexes</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO510_:_Algorithmique_:_structures_de_donn%C3%A9es_complexes&amp;diff=9859"/>
		<updated>2017-02-21T15:30:12Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cours du semestre 5 de la licence STIC TRI et ESET.&lt;br /&gt;
&lt;br /&gt;
Responsable INFO510 (2016-2017): Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examen 1ere session ==&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/examen.pdf Sujet de l&#039;examen]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/correction.pdf Correction de l&#039;examen]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes de cours ==&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/notes-de-cours.pdf Notes de cours]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aide pour l&#039;examen ==&lt;br /&gt;
 - La feuille suivante vous sera remise lors de l&#039;examen : [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/entetes.pdf entetes.pdf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Examen 1ere session 2015-2016 ==&lt;br /&gt;
&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/examen.pdf Énoncé]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/solution.pdf Solution]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD ==&lt;br /&gt;
&lt;br /&gt;
- [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td1.pdf Première feuille de TD]&lt;br /&gt;
&lt;br /&gt;
- [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td2.pdf Deuxième feuille de TD]&lt;br /&gt;
&lt;br /&gt;
- [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td3.pdf Troisième feuille de TD]&lt;br /&gt;
&lt;br /&gt;
- [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td4.pdf Quatrième feuille de TD] [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td4-sol.pdf Solution à 1a) et 1b).]&lt;br /&gt;
&lt;br /&gt;
- [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td5.pdf Cinquième feuille de TD]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td0.pdf Feuille d&#039;exercices &amp;quot;En attendant le premier TD&amp;quot;]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td1.pdf Première feuille de TD, structures de contrôle, tableaux et chaînes de caractères]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td2.pdf Deuxième feuille de TD, Algorithmes de tri]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td-tris.c td-tris.c (sources à télécharger)]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/timeUtil.h timeUtil.h (sources à télécharger)]&lt;br /&gt;
#* [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/td-listes.pdf Troisième feuille de TD : listes]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
TP1 : Labyrinthes&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp1.pdf Énoncé au format pdf]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp1.zip Code source]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TP2 : k-Moyennes&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp2.pdf Énoncé au format pdf]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp2.zip Code source]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
TP2 : Liste, Files, Piles !&lt;br /&gt;
Commencez par télécharger le fichier ci-dessous, extraire son contenu et compiler le programme. Ce TP est composé de 5 exercices. Chacun de ces exercices est décrit dans les commentaires de la fonction &#039;&#039;&#039;main&#039;&#039;&#039;.&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp2.zip info510-tp2.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TP3 : Calcul d&#039;enveloppe convexe.&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/info510-tp3.pdf Énoncé du TP (info510-tp3.pdf)]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/tp3.c Fichier source tp3.c]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/Point.h Fichier source Point.h]&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/DoubleFile.h Fichier source DoubleFile.h]&lt;br /&gt;
 - Si vous n&#039;avez pas confiance en votre implémentation de listes réalisée au TP2, utilisez celle-ci : [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/Liste.h Fichier source Liste.h]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement INFO510 (2016/2017) ==&lt;br /&gt;
&lt;br /&gt;
Cours 1 : Introduction et description du langage de pseudo-code.&lt;br /&gt;
 - Qu&#039;est-ce que l&#039;algorithmique ? &lt;br /&gt;
 - Démarche &amp;quot;Problèmes -&amp;gt; Programme&amp;quot;&lt;br /&gt;
 - Types de base&lt;br /&gt;
 - Structures de contrôle&lt;br /&gt;
 - Types complexes (tableaux et entités)&lt;br /&gt;
&lt;br /&gt;
Cours 2 : Fonctions et chaines de caractères&lt;br /&gt;
 - Fonctions&lt;br /&gt;
 - [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/langage.pdf Résumé du langage Pseudo-Code.]&lt;br /&gt;
 - Type abstrait&lt;br /&gt;
 - Chaine de caractères&lt;br /&gt;
&lt;br /&gt;
Cours 3 : Récursivité&lt;br /&gt;
 - Récursivité : principe, exemples et trace.&lt;br /&gt;
 - Cas d&#039;étude : calculette ( notation polonaise, lecture d&#039;entiers )&lt;br /&gt;
&lt;br /&gt;
Cours 4 : Files et Piles (1/2)&lt;br /&gt;
 - Type abstrait File, définition, fonctionnement et exemple.&lt;br /&gt;
 - Type abstrait Pile, définition, fonctionnement et exemple. &lt;br /&gt;
 - Implémentation du type Pile.&lt;br /&gt;
&lt;br /&gt;
Cours 5 : Files et Piles (2/2)&lt;br /&gt;
 - Solution au problème &amp;quot;bien parenthésé&amp;quot; en utilisant une pile.&lt;br /&gt;
 - Implémentation du type File via un tableau circulaire.&lt;br /&gt;
&lt;br /&gt;
Cours 6 : Type abstrait Ensemble.&lt;br /&gt;
 - Implémentation du type Ensemble par un tableau non-trié.&lt;br /&gt;
 - Implémentation du type Ensemble par un tableau trie et recherche dichotomique.&lt;br /&gt;
&lt;br /&gt;
== Quelques ressources pour l&#039;étudiant ==&lt;br /&gt;
&lt;br /&gt;
Attention, ces ressources ne servent que de compléments pour les modules INFO510 et ne remplacent en aucun cas les cours, TDs et TPs.&lt;br /&gt;
&lt;br /&gt;
0. Présentation du premier cours [http://www.lama.univ-savoie.fr/~provencal/enseignement/INFO510/INFO510--intro.pdf Diaporama].&lt;br /&gt;
&lt;br /&gt;
1. Notes de cours d&#039;autres enseignants.&lt;br /&gt;
#* Notes de cours de Jacques-Olivier Lachaud (responsable du module de 2007 à 2011) : [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO510/Cours/notes-de-cours.pdf Fichier pdf].&lt;br /&gt;
#* cours Algo de Eric Sopena, Univ. Bordeaux 1, partie I [http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO510/Cours/cours-ES-1.ps Fichier PostScript]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* 2013-2014 : Xavier Provençal (C/TD/TP), Louis Cuel (TD/TP)&lt;br /&gt;
* 2012-2013 : Xavier Provençal (C/TD/TP), Louis Cuel (TD/TP)&lt;br /&gt;
* 2011-2012 : Jacques-Olivier Lachaud (C/TD/TP), Louis Cuel (TD/TP)&lt;br /&gt;
* 2010-2011 : Jacques-Olivier Lachaud (C/TD/TP), Mouhammad Said (TD/TP)&lt;br /&gt;
* 2009-2010 : Jacques-Olivier Lachaud (C/TD/TP), Laurent Boyer (TD/TP)&lt;br /&gt;
* 2008-2009 : Jacques-Olivier Lachaud (C/TD/TP), Laurent Boyer (TD/TP)&lt;br /&gt;
* 2007-2008 : Jacques-Olivier Lachaud (C/TD/TP)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Historique ==&lt;br /&gt;
&lt;br /&gt;
=== Déroulement INFO510 (2015/2016) ===&lt;br /&gt;
* Cours 1 : Introduction et description du langage de pseudo-code.                   &lt;br /&gt;
* Cours 2 : Description du langage de pseudo-code (suite et fin)         &lt;br /&gt;
* Cours 3 : Exercices         &lt;br /&gt;
* Cours 4 : Algorithmes de tri simples         &lt;br /&gt;
* Cours 5 : Tri (suite)         &lt;br /&gt;
* TD1 : Feuilles &amp;quot;Quelques exercices en attendant les TD&amp;quot; et première feuille de TD.         &lt;br /&gt;
* Cours 6 : Tri (suite et fin), TAD         &lt;br /&gt;
* Cours 7 : TAD (suite et fin)&lt;br /&gt;
&lt;br /&gt;
=== Déroulement INFO510 (2014/2015) ===&lt;br /&gt;
* Cours 1 : Qu&#039;est-ce que l&#039;algorithmique ? Problèmes -&amp;gt; Programme. Types et structures de contrôle.&lt;br /&gt;
* Cours 2 : Types complexes (tableaux, entités), Action/Fonctions (I).&lt;br /&gt;
* Cours 3 : Actions/Fonctions (II), récursivité, algorithmes sur les tableaux (I).&lt;br /&gt;
* Cours 4 : Tris simples.&lt;br /&gt;
* Cours 5 : Tri rapide.&lt;br /&gt;
* TD1 : Puissance 4 en salle machine (TP0)&lt;br /&gt;
* Cours 6 : Tri rapide (suite et fin). TAD : les listes.&lt;br /&gt;
* Cours 7 : Première implémentation de listes : premières cases d&#039;un tableau.&lt;br /&gt;
* TD2 : Manipulation de listes.&lt;br /&gt;
* TD3 : Implémentation de listes : listes chaînées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Déroulement INFO510 (2013/2014) ===&lt;br /&gt;
* Cours 1 : Qu&#039;est-ce que l&#039;algorithmique ? Problèmes -&amp;gt; Programme. Types et structures de contrôle.&lt;br /&gt;
* Cours 2 : Types complexes (tableaux, entités), Action/Fonctions (I).&lt;br /&gt;
* Cours 3 : Actions/Fonctions (II), récursivité, algorithmes sur les tableaux (I).&lt;br /&gt;
&lt;br /&gt;
* TD 1 : Exercies sur les tableaux (I).&lt;br /&gt;
* Cours 5 : Tri rapide.&lt;br /&gt;
* TD 2 : Puissance 4, exercies sur les tableaux (II).&lt;br /&gt;
* TD 3 : (salle machine) Implémentation du Puissance 4.&lt;br /&gt;
* Cours 6 : Types de données abstraits, listes (I) : utilisation.&lt;br /&gt;
* Cours 7 : Listes (II) : implémentation par tableaux, implémentation par listes chaînées.&lt;br /&gt;
* TD 4 : Exercices sur les tris simples.&lt;br /&gt;
* TD 5 : Exercices sur le tri rapide et l&#039;utilisation de listes.&lt;br /&gt;
* TP1 : tris&lt;br /&gt;
* TD 6 : Types abstraits de données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Déroulement INFO510 (2012/2013) ===&lt;br /&gt;
* (Cours 1) 18 septembre : Qu&#039;est-ce que l&#039;algorithmique ? Problèmes -&amp;gt; Programme. Types et structures de contrôle.&lt;br /&gt;
* (Cours 2) 21 septembre : Types complexes (tableaux, entités), Action/Fonctions (I).&lt;br /&gt;
* (Cours 3) 25 septembre : Actions/Fonctions (II), récursivité, algorithmes sur les tableaux (I).&lt;br /&gt;
* (TD 1) 28 septembre : Exercies sur les tableaux (I).&lt;br /&gt;
* (Cours 4) 1 octobre : Fouille dichotomique, tri simples (I).&lt;br /&gt;
* (TD 2) 5 octobre : Puissance 4, exercies sur les tableaux (II).&lt;br /&gt;
* (Cours 5) 9 octobre : Tri simples (II), tri fusion, tri rapide (I).&lt;br /&gt;
* (Cours 6) 17 octobre : Tri rapide (II), types de données abstraits, liste (I).&lt;br /&gt;
* (TD 3) 22 octobre : (salle machine) Implémentation du Puissance 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Déroulement INFO510 (2011/2012) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* (Cours 1) jeudi 15 septembre : Qu&#039;est-ce que l&#039;algorithmique ? Correction + Compromis vitesse / mémoire. Rappels d&#039;algorithmique élémentaire (I).&lt;br /&gt;
* (Cours 2) lundi 19 septembre : Rappels d&#039;algorithmique élémentaire (II). Types complexes (Tableaux, Entités). Actions/Fonctions (I).&lt;br /&gt;
* (Cours 3) mardi 19 septembre : Actions / Fonctions (II). Récursivité. Algorithmique sur les tableaux. (I).&lt;br /&gt;
* (TD 1) mardi 19 septembre et mercredi 20 septembre : TD 1 - Exercices sur actions/fonctions et tableaux.&lt;br /&gt;
* (TD 2) vendredi 23 septembre : TD 1 - Exercices sur actions/fonctions et tableaux (II)&lt;br /&gt;
* (Cours 4) mercredi 28 septembre : Tri (I). Tris de base.&lt;br /&gt;
* (Cours 5) vendredi 30 septembre : Tri (II). Tri rapide.&lt;br /&gt;
* (Cours 6) mardi 4 octobre. Structures séquentielles: listes.&lt;br /&gt;
* (TD 3) mercredi 5 octobre. TD machine. TP0 - Années bissextiles, Puissance 4.&lt;br /&gt;
* (Cours 7) jeudi 6 octobre. Structures séquentielles: listes (fin). Piles. Files.&lt;br /&gt;
* (TD 4) jeudi 6 octobre. fiche TD 3 : Tri. Dichotomie. Tri sélection. Pire cas quicksort et randomisation.&lt;br /&gt;
* (TP 1) jeudi 13 octobre. TP 1 : Tri.&lt;br /&gt;
* (TD 5) vendredi 7 octobre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Déroulement INFO510 (2010/2011) ===&lt;br /&gt;
&lt;br /&gt;
* (Cours 1) lundi 4 octobre : Qu&#039;est-ce que l&#039;algorithmique ? Correction + Compromis vitesse / mémoire. Rappels d&#039;algorithmique élémentaire (I).&lt;br /&gt;
* (Cours 2) mercredi 6 octobre : Rappels d&#039;algorithmique élémentaire (II). Types complexes (Tableaux, Entités). Actions/Fonctions (I).&lt;br /&gt;
* (TD 1) lundi 11 octobre : Exercices sur actions/fonctions et tableaux.&lt;br /&gt;
* (Cours 3) mercredi 13 octobre : Actions / Fonctions (II). Récursivité. Algorithmique sur les tableaux. (I).&lt;br /&gt;
* (Cours 4) mercredi 13 octobre : Tri (I). Tris de base.&lt;br /&gt;
* (Cours 5) mardi 19 octobre : Tri (II). Tri rapide. Sélection.&lt;br /&gt;
* (Cours 6) vendredi 22 octobre : Structures séquentielles (I). Principe. Pile. File.&lt;br /&gt;
* (TD 2) vendredi 22 octobre :  TD machine (TP0)&lt;br /&gt;
* (TD 3) mardi 2 novembre : Exercices sur actions/fonctions et tableaux.&lt;br /&gt;
* (Cours 7) mercredi 3 novembre : Structures séquentielles (II). Files à double entrées. Listes.&lt;br /&gt;
* (TD 4) mercredi 3 novembre : Exercices autour des tris.&lt;br /&gt;
* (TD 5) vendredi 5 novembre : Exercices sur listes. Implémentation des listes par tableaux avec chaînage.&lt;br /&gt;
* (TD 6) lundi 8 novembre : Applications des structures séquentielles. Hachage.&lt;br /&gt;
* (TD 7) mercredi 10 novembre : Applications des structures séquentielles. Radix-tri, tri fusion.&lt;br /&gt;
* (TP 1) vendredi 12 novembre : TP sur les tris.&lt;br /&gt;
* (TP 2) vendredi 12 novembre : TP sur les files à double-entrée. Application au calcul de l&#039;enveloppe convexe. (I)&lt;br /&gt;
* (TP 3) mercredi 17 novembre : TP sur les files à double-entrée. Application au calcul de l&#039;enveloppe convexe. (II)&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9858</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9858"/>
		<updated>2017-02-16T06:45:17Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Énoncés des TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
   - [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/tp2-images.zip tp2-images.zip (banque d&#039;images)]&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9857</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9857"/>
		<updated>2017-02-16T06:44:32Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Énoncés des TP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : Compression LZ78&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp2.pdf Sujet, version pdf]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp2/math202-tp2.html Sujet, version html (nécessaire pour copier/coller)]&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9856</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9856"/>
		<updated>2017-02-15T10:51:43Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Déroulement (2016-2017) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
 - TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9855</id>
		<title>INFO622 : Systèmes de synchronisation et Processus</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO622_:_Syst%C3%A8mes_de_synchronisation_et_Processus&amp;diff=9855"/>
		<updated>2017-02-15T10:17:37Z</updated>

		<summary type="html">&lt;p&gt;Xprov : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Responsable pour 2015--2016: [http://www.lama.univ-savoie.fr/~provencal Xavier Provençal]&lt;br /&gt;
* Intervenants : Xavier Provençal (CM/TD/TP), Rodolphe Lepigre (TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ouvrage de référence ==&lt;br /&gt;
&lt;br /&gt;
# Andrew Tanenbaum, Systèmes d&#039;exploitation. Principalement les chapitres 2 et 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation remise en classes ==&lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-1.pdf Entêtes de fonctions POSIX (I).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-2.pdf Entêtes de fonctions POSIX (II).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-3.pdf Entêtes de fonctions POSIX (III).]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-4.pdf Entêtes de fonctions POSIX (IV).]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fct_posix-5.pdf Entêtes de fonctions POSIX (V).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TP ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TP0&#039;&#039;&#039; : Écrire un programme qui répond à la question : quel est le comportement par défaut de la mémoire partagée (obtenue par : shm_open + ftruncate + mmap) lors que le processus effectue un &#039;&#039;&#039;fork&#039;&#039;&#039; ?  Est-elle copiée ou est-elle partagée entre les processus père et fils ? Inscrivez votre réponse à la question en commentaire au début du fichier.&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Parallélisation du tri rapide&lt;br /&gt;
   - Un peu de documentation sur le tri rapide : &lt;br /&gt;
     - Wikipedia : https://fr.wikipedia.org/wiki/Tri_rapide&lt;br /&gt;
     - OpenClassRooms : https://openclassrooms.com/courses/le-tri-rapide-qsort&lt;br /&gt;
     - Un petit vidéo : https://www.youtube.com/watch?v=xcyDSLSkb0k&lt;br /&gt;
&lt;br /&gt;
 - TP1 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp1.tgz code fourni.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 - TP2 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp2.tgz Fichiers sources, les exercices sont en commentaire dans le fichier tp2.c]&lt;br /&gt;
&lt;br /&gt;
 - TP3 : &lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tp3.pdf Énoncé du TP.]&lt;br /&gt;
    [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-tp3.tgz Fichiers sources du simulateur.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2016-2017) ==&lt;br /&gt;
&lt;br /&gt;
 - CM1 : Multiprogrammation ( [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/info622-pres-intro.pdf Présentation d&#039;introduction (pdf) ] )&lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
 - CM2 : Processus et threads&lt;br /&gt;
    - Commandes : fork, waitpid, wait.&lt;br /&gt;
    - Threads, définition, principe, fonctionnement, librairie pthread.&lt;br /&gt;
    - Méthodes d&#039;exclusion mutuelle (partie 1).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores (principe)&lt;br /&gt;
      - Sémaphores POSIX anonymes. &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td3.pdf Énoncé du TD3.]&lt;br /&gt;
&lt;br /&gt;
 - CM4 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Sémaphore POSIX nommés.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/createur.c Programme createur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/gestionnaire.c Programme gestionnaire.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/parleur.c Programme parleur.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/destructeur.c Programme destructeur.c]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Principes de base : shm_open, ftrunctate, mmap.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_maStruct.h Fichier entête mp_maStruct.h]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_lecture.c Programme mp_lecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/mp_affichage.c Programme mp_affichage.c]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4.pdf Énoncé du TD4.]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td4_q3.c Solution de l&#039;exo 3.]&lt;br /&gt;
&lt;br /&gt;
 - CM5 : &lt;br /&gt;
    - Barrières de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Programme barriere.c]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Retour sur le problème ``producteur/consommateur`` : [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_naif.c prodCons_naif.c  ]  [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_sem.c prodCons_sem.c  ]&lt;br /&gt;
    - Communication inter-processus&lt;br /&gt;
      - Schémas de base&lt;br /&gt;
      - Descripteurs de fichier&lt;br /&gt;
      - Appels systèmes : &#039;&#039;&#039;read&#039;&#039;&#039; et &#039;&#039;&#039;write&#039;&#039;&#039;&lt;br /&gt;
      - Tubes UNIX (première partie)&lt;br /&gt;
        - Principes de bases&lt;br /&gt;
&lt;br /&gt;
 - TD5 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td5.pdf Énoncé du TD5.]&lt;br /&gt;
&lt;br /&gt;
 - CM6 : &lt;br /&gt;
    - Tubes UNIX (suite et fin)&lt;br /&gt;
       - Tubes nommés et non-nommés&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c Programme tubeFork.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c Programme fifoLecture.c]&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c Programme fifoEcriture.c]&lt;br /&gt;
    - Fonction &#039;&#039;&#039;select&#039;&#039;&#039;&lt;br /&gt;
         - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c Programme fifoLectureMultiple.c]&lt;br /&gt;
&lt;br /&gt;
- TD6 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/td6.pdf Énoncé du TD6.]&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
== Déroulement (2015-2016) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM1 : &lt;br /&gt;
    - Introduction à la multiprogrammation&lt;br /&gt;
    - Condition de concurrence&lt;br /&gt;
    - Section critique.&lt;br /&gt;
    - Banque virtuelle : exemple de condition de concurrence &lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM1/banqueVirtuelle.c programme ``banqueVirtuelle.c``.]&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 - TD1 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1.pdf Énoncé du TD1 (en salle machine).]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q1a.c Solution question 1a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2a.c Solution question 2a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2c.c Solution question 2c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q2e.c Solution question 2e)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3a.c Solution question 3a)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3d.c Solution question 3d)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD1-sol/q3e.c Solution question 3e)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM2 : &lt;br /&gt;
    - Threads et processus. &lt;br /&gt;
    - Ressources physiques et espace d&#039;adressage. &lt;br /&gt;
    - Commandes fork, wait, pthread_create, pthread_join.&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM2/zombies.c programme ``zombies.c``.] &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (première partie).&lt;br /&gt;
&lt;br /&gt;
 - TD2 : &lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2.pdf Énoncé du TD2.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_seq.c Code question 4, version séquentielle]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_para.c Code question 4, version parallèle boguée]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_b.c Solution de 4b)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_c.c Solution de 4c)]&lt;br /&gt;
       - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD2/q4_f.c Solution de 4f)]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM3 : &lt;br /&gt;
    - Mécanismes d&#039;exclusion mutuelle (deuxième partie)&lt;br /&gt;
      - Mutex et sémaphores&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/verrou.c Programme verrou.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/mutex.c Programme mutex.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurCC.c Programme ParleurCC.c (avec condition de concurrence)]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM3/parleurSem.c Programme ParleurSem.c (sans condition de concurrence)]&lt;br /&gt;
    - Communication interprocessus&lt;br /&gt;
      - Problème &amp;quot;producteurs/consommateurs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 - TD3 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD3.pdf Énoncé du TD3.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/td3_q1.c Solution de la question q1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons.c Implémentation du problème ``producteurs/consommateurs`` (avec attente active et conditions de concurrence).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prod_cons_sol.c Solution au problème ``producteurs/consommateurs`` (avec n producteur et m consommataeurs, sans conditions de concurrence).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM4 :&lt;br /&gt;
    - Sémaphores nommés vs non-nommés&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémaphore non-nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semThread.c Parleur/gestionnaire avec threads et sémaphore non-nommé.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/semForkBobo.c Parleur/gestionnaire avec fork et sémpaphore non-nommé (non-fonctionnel).]&lt;br /&gt;
      - Implémentation du duo &amp;quot;Parleur/gestionnaire&amp;quot; avec un sémphore nommé.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/createur.c createur.c (crée un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/gestionnaire.c gestionnaire.c (fait des POST sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/parleur.c parleur.c (fait des WAIT sur un sémaphore nommé).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/destructeur.c destructeur.c (détruit un sémaphore nommé).]&lt;br /&gt;
    - Mémoire partagée&lt;br /&gt;
      - Exemple simplissime d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_1.c mp_1.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_2.c mp_2.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
&lt;br /&gt;
 - TD4 :&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4.pdf Énoncé du TD4.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q1.c Solution de la question 1 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q2.c Solution de la question 2 (fichier source).]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD4/q3.c Solution de la question 3 (fichier source).]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - CM5&lt;br /&gt;
    - Mémoire partagée (suite et fin)&lt;br /&gt;
      - Solution du devoir sur le comportement par défaut de la mémoire partagée lors d&#039;un fork.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/sol_devoir.c sol_devoir.c]&lt;br /&gt;
      - Exemple un peu plus évolué d&#039;utilisation de mémoire partagée.&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_maStruct.h mp_maStruct.h.]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_affichage.c mp_affichage.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
        - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/CM4/mp_lecture.c mp_lecture.c (à compiler avec l&#039;option -lrt).]&lt;br /&gt;
    - Variable de condition&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/decrementeur_varcond.c Programme ``decrémenteur`` avec une variable de condition.]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/prodCons_cnd.c Implémentation de ``Producteur/consommateur`` avec des variables de condition.]&lt;br /&gt;
    - Barrière de synchronisation&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/barriere.c Exemple simplissime d&#039;utilisation d&#039;une barrière de synchronisation.]&lt;br /&gt;
&lt;br /&gt;
 - TD5&lt;br /&gt;
    - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
 - CM6&lt;br /&gt;
    - Tubes Unix&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/tubeFork.c tubeFork.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoEcriture.c fifoEcriture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLecture.c fifoLecture.c]&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/fifoLectureMultiple.c ficoLectureMultiple.c (utilisation de la fonction select)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - TD6&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/TD5.pdf Énoncé du TD5.]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v1.c Solution question 1 (Version sémaphores).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q1_v2.c Solution question 1 (Version attente active).]&lt;br /&gt;
     - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/TD/q2.c Solution question 2.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 - CM7&lt;br /&gt;
    - Tubes Unix (suite et fin)&lt;br /&gt;
    - Interblocages&lt;br /&gt;
      - [http://lama.univ-savoie.fr/~provencal/enseignement/INFO622/banqueVirtuelle2.c banqueVirtuelle2.c]&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9854</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9854"/>
		<updated>2017-02-14T08:56:14Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Cours magistraux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : À venir.&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9853</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9853"/>
		<updated>2017-02-14T08:56:01Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Cours magistraux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : À venir.&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78 ( [https://fr.wikipedia.org/wiki/LZ77_et_LZ78 wikipedia] ).&lt;br /&gt;
  - Algorithme LZW ( [https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch wikipedia] ).&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire ( [https://fr.wikibooks.org/wiki/Approfondissements_de_lyc%C3%A9e/Arithm%C3%A9tique_modulaire wikibooks] ).&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes) ( [https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage wikipedia], [ http://www.apprendre-en-ligne.net/crypto/cesar/ Lien externe ] )&lt;br /&gt;
    - Masque jetable (et sa variante binaire) ( [https://fr.wikipedia.org/wiki/Masque_jetable wikipedia], [https://fr.wikipedia.org/wiki/Fonction_OU_exclusif#Exemple_d.27utilisation_en_cryptographie wikipedia] ).&lt;br /&gt;
  - Fonction à sens unique ( [http://ibni.over-blog.com/article-fonctions-a-sens-unique-121526504.html Lien externe] ).&lt;br /&gt;
  - Échange de clés Diffie-Hellman ( [https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman wikipedia] ).&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9852</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9852"/>
		<updated>2017-02-14T08:48:24Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Cours magistraux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : À venir.&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( [https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ( [https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( [https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( [https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ( [https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], [https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78.&lt;br /&gt;
  - Algorithme LZW.&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire.&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes).&lt;br /&gt;
    - Masque jetable (et sa variante binaire).&lt;br /&gt;
  - Fonction à sens unique.&lt;br /&gt;
  - Échange de clés Diffie-Hellman.&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9851</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9851"/>
		<updated>2017-02-14T08:47:41Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Cours magistraux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : À venir.&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .([https://fr.wikipedia.org/wiki/Virgule_flottante wikipedia] )&lt;br /&gt;
  - ASCII et UTF-8. ([https://fr.wikipedia.org/wiki/UTF-8 wikipedia] )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ([https://en.wikipedia.org/wiki/Variable-length_code wikipedia] )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ([https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft wikipedia] )&lt;br /&gt;
  - Codes préfixes. ([https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe wikipedia] et [https://en.wikipedia.org/wiki/Prefix_code wikipedia] )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe],[https://fr.wikipedia.org/wiki/Codage_de_Huffman wikipedia] )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78.&lt;br /&gt;
  - Algorithme LZW.&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire.&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes).&lt;br /&gt;
    - Masque jetable (et sa variante binaire).&lt;br /&gt;
  - Fonction à sens unique.&lt;br /&gt;
  - Échange de clés Diffie-Hellman.&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9850</id>
		<title>MATH202 : Mathématiques pour le numérique 2</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=MATH202_:_Math%C3%A9matiques_pour_le_num%C3%A9rique_2&amp;diff=9850"/>
		<updated>2017-02-14T08:46:25Z</updated>

		<summary type="html">&lt;p&gt;Xprov : /* Cours magistraux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable du cours : Xavier Provençal&lt;br /&gt;
&lt;br /&gt;
 Intervenants : &lt;br /&gt;
  - Pierre Hyvernat (TD/TP)&lt;br /&gt;
  - Jacques-Olivier Lachaud (TD/TP)&lt;br /&gt;
  - Florent Lorne (TP)&lt;br /&gt;
  - Xavier Provençal (CM/TD/TP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feuilles de TD == &lt;br /&gt;
&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td1.pdf Feuille TD1.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td2.pdf Feuille TD2.]&lt;br /&gt;
 - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/td3.pdf Feuille TD3.]&lt;br /&gt;
&lt;br /&gt;
== Énoncés des TP ==&lt;br /&gt;
&lt;br /&gt;
 - TP1 : Images et couleurs&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/math202-tp1.pdf Énoncé du TP1 : Images et couleurs.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/tp1-NOM.py Fichier &amp;quot;tp1-NOM.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/image.py Fichier &amp;quot;image.py&amp;quot;.]&lt;br /&gt;
   - [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/imagesTest.zip Fichier &amp;quot;imagesTest.zip&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
 - TP2 : À venir.&lt;br /&gt;
&lt;br /&gt;
== Cours magistraux ==&lt;br /&gt;
&lt;br /&gt;
 CM1 : Codage et décodage ( [http://lama.univ-smb.fr/~provencal/enseignement/MATH202/MATH202_intro.pdf Présentation d&#039;introduction.] )&lt;br /&gt;
  - Base 2 et complément à 2. ( [https://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux wikipedia] )&lt;br /&gt;
  - Virgule flottante .( https://fr.wikipedia.org/wiki/Virgule_flottante )&lt;br /&gt;
  - ASCII et UTF-8. ( https://fr.wikipedia.org/wiki/UTF-8 )&lt;br /&gt;
  - Notions théoriques : alphabet, mot, langage, code.&lt;br /&gt;
&lt;br /&gt;
 CM2 : Codes à longueur variable. ( https://en.wikipedia.org/wiki/Variable-length_code )&lt;br /&gt;
  - Pourquoi utiliser des codes à longueur variable ? (rép : fréquences différentes)&lt;br /&gt;
  - Inégalité de Kraft. ( https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_de_Kraft )&lt;br /&gt;
  - Codes préfixes. ( https://fr.wikipedia.org/wiki/Code_pr%C3%A9fixe et https://en.wikipedia.org/wiki/Prefix_code )&lt;br /&gt;
  - Codage de Huffman. ( [http://lama.univ-savoie.fr/~provencal/enseignement/MATH202/huffman.pdf Algorithme remis en classe], https://fr.wikipedia.org/wiki/Codage_de_Huffman )&lt;br /&gt;
  - Compression de données, principes de base, impossibilité à tout compresser.&lt;br /&gt;
&lt;br /&gt;
 CM3 : Compression de données&lt;br /&gt;
  - Compression par dictionnaire.&lt;br /&gt;
  - Algorithme LZ78.&lt;br /&gt;
  - Algorithme LZW.&lt;br /&gt;
  - Introduction à l&#039;arithmétique modulaire.&lt;br /&gt;
&lt;br /&gt;
 CM4 : Cryptographie&lt;br /&gt;
  - Cryptographie, principes de base.&lt;br /&gt;
  - Cryptographie à clé secrète.&lt;br /&gt;
    - Chiffre de César (et ses variantes).&lt;br /&gt;
    - Masque jetable (et sa variante binaire).&lt;br /&gt;
  - Fonction à sens unique.&lt;br /&gt;
  - Échange de clés Diffie-Hellman.&lt;br /&gt;
  - Cryptographie à clé publique (principes de base)&lt;/div&gt;</summary>
		<author><name>Xprov</name></author>
	</entry>
</feed>