<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title type="html">Blog Flox-arts.net</title>
<subtitle type="html">recueil informatique en tout genre</subtitle>
<link href="http://blog.flox-arts.net/feed.php?atom" rel="self" type="application/atom+xml"/>
<link href="http://blog.flox-arts.net/" rel="alternate" type="text/html"/>
<updated>2009-11-01T15:55:00+00:00</updated>
<id>urn:md5:bc19d264b3b082b7ad88b8f31d1895bb</id>
<generator uri="http://pluxml.org/">PluXml 4.3.2</generator>
<entry>
	<title>PluXml version 4.2 !</title> 
	<link href="http://blog.flox-arts.net/?article28/pluxml-version-4-2"/>
	<id>urn:md5:157e6657e928c2d2964d068a625fc8c3</id>
	<updated>2009-11-01T15:55:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Pluxml</dc:subject>
	<content type="html">&lt;p&gt;&lt;strong&gt;OUF&lt;/strong&gt;, la voil&amp;agrave; enfin cette nouvelle version &lt;a href=&quot;http://telechargements.pluxml.org/pluxml-blog-beta4-2.zip&quot;&gt;pluxml blog beta 4.2&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://pluxml.org/?categorie3/a-propos-de-pluxml&quot;&gt;Stéphane, Annie, Amaury et moi même&lt;/a&gt; vous présentons tout de suite les nouveautés de cette mouture.&lt;/p&gt;&lt;h3&gt;Nouvelle interface d&#039;administration plus ergonomique&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nouveau design&lt;/li&gt;
&lt;li&gt;barre plxToolbar permettant d&#039;ajouter du code html (articles, pages statiques, éditeur de templates)&lt;/li&gt;
&lt;li&gt;suppression multiples des articles par cases à cocher&lt;/li&gt;
&lt;li&gt;2 sous-menus pour gérer les commentaires hors lignes et publiés&lt;/li&gt;
&lt;li&gt;suppression multiples de commentaires par cases à cocher&lt;/li&gt;
&lt;li&gt;publication/mise hors ligne de plusieurs commentaires grâce aux cases à cocher&lt;/li&gt;
&lt;li&gt;flux atom privés pour suivre les commentaires en ligne/hors ligne&lt;/li&gt;
&lt;li&gt;modification depuis l&#039;administration des fichiers de vos thèmes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Nouvelle librairie de médias&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nouvelle interface, gestion et navigation par sous-dossiers&lt;/li&gt;
&lt;li&gt;possibilité de déplacer les fichiers&lt;/li&gt;
&lt;li&gt;possibilité de recréer la miniature d&#039;une image ou de tout un dossier&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Navigation à partir de smartphones&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;les dossiers des thèmes pour mobile sont préfixés par &quot;mobile&quot; (exemple: mobile.defaut)&lt;/li&gt;
&lt;li&gt;détection automatique du type de navigateur&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Divers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;support de php 5.3.0&lt;/li&gt;
&lt;li&gt;flux RSS et ATOM des catégories&lt;/li&gt;
&lt;li&gt;personnalisation du format d&#039;affichage des dates&lt;/li&gt;
&lt;li&gt;ajout d&#039;un id aux items de la liste des catégories et des pages statiques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Nouvelles fonctions dans plxShow&lt;/h3&gt;
&lt;p&gt;Comment utiliser ces fonctions ? &lt;a href=&quot;http://devzone.pluxml.org/?plxShow&quot;&gt;La DevZone !&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;function racine()&lt;/li&gt;
&lt;li&gt;function mode()&lt;/li&gt;
&lt;li&gt;function artCatId()&lt;/li&gt;
&lt;li&gt;function lastArtList()&lt;/li&gt;
&lt;li&gt;function comUrl()&lt;/li&gt;
&lt;li&gt;function lastComList()&lt;/li&gt;
&lt;li&gt;function staticId()&lt;/li&gt;
&lt;li&gt;function staticUrl(()&lt;/li&gt;
&lt;li&gt;function staticInclude()&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Modifications des fonctions dans plxShow&lt;/h3&gt;
&lt;p&gt;Comment utiliser ces fonctions ? &lt;a href=&quot;http://devzone.pluxml.org/?plxShow&quot;&gt;La DevZone !&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;function artDate()&lt;/li&gt;
&lt;li&gt;function artChapo()&lt;/li&gt;
&lt;li&gt;function artContent()&lt;/li&gt;
&lt;li&gt;function artFeed()&lt;/li&gt;
&lt;li&gt;function comDate()&lt;/li&gt;
&lt;li&gt;function nbAllCat()&lt;/li&gt;
&lt;li&gt;function nbAllArt()&lt;/li&gt;
&lt;li&gt;function nbAllCom()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il nous reste plus qu&#039;à vous remercier d&#039;être toujours plus nombreux à utiliser &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml&lt;/a&gt; et à collaborer à son développement.&lt;/p&gt;
&lt;p&gt;La discussion continue &lt;a href=&quot;http://forum.pluxml.org/viewtopic.php?id=1311&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>PluXml recrute !</title> 
	<link href="http://blog.flox-arts.net/?article27/pluxml-recrute"/>
	<id>urn:md5:8ad963f0d3af4d1e2b3397af441f3725</id>
	<updated>2009-08-22T17:29:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Pluxml</dc:subject>
	<content type="html">&lt;p&gt;Suite au départ de notre designer &lt;a href=&quot;http://www.ti-pierre.fr/&quot;&gt;Ti_pierre&lt;/a&gt; et au développement de la version &lt;strong&gt;PluXml blog beta 4.2&lt;/strong&gt;, nous recherchons plusieurs personnes motivées pour rejoindre le projet PluXml.&lt;/p&gt;&lt;h4&gt;Recherche d&#039;un designer :&lt;/h4&gt;
&lt;p&gt;Suite au départ de notre designer &lt;a href=&quot;http://www.ti-pierre.fr/&quot;&gt;Ti_pierre&lt;/a&gt;, nous recherchons une personne &lt;strong&gt;créative&lt;/strong&gt;, &lt;strong&gt;disponible&lt;/strong&gt; et &lt;strong&gt;surtout passionnée par le webdesign&lt;/strong&gt; pour continuer le travail qui a été fait coté &lt;strong&gt;charte graphique&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Son travail passe en autre par les améliorations graphiques du site du projet &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml.org&lt;/a&gt; et de ses outils annexes, mais aussi par un travail sur le thème par défaut &lt;strong&gt;du blog PluXml&lt;/strong&gt;.&lt;br/&gt;Nous avons d&#039;ailleurs à ce sujet une mission très intéressante à lui confier pour la version blog beta 4.2 (mission pas notée dans la roadmap, un peu de suspense tout de même...)&lt;/p&gt;
&lt;p&gt;Sa charge de travail pourra être ponctuelle étant donné que l&#039;on ne va pas refaire la charte graphique tous les 4 matins mais il faut absolument qu&#039;il maîtrise le couple &lt;strong&gt;XHTML/CSS&lt;/strong&gt; et qu&#039;il soit respectueux des standards (on est très maniaque ;)) !&lt;/p&gt;

&lt;h4&gt;Recherche de 1 ou 2 testeurs et responsables de la communauté :&lt;/h4&gt;
&lt;p&gt;C&#039;est un poste (qui peut être partagé) que l&#039;on veut développer au sein du projet &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml&lt;/a&gt; et qui permettrait à ces personnes d&#039;être en contact permanent d&#039;une part avec &lt;a href=&quot;http://forum.pluxml.org&quot;&gt;la communauté PluXml&lt;/a&gt; et d&#039;autre part avec les développeurs du projet via la proposition de fonctionnalités et remontées d&#039;éventuels bugs.&lt;/p&gt;
&lt;p&gt;Le travail de ces personnes demande une charge de travail plus régulière avec des pics occasionnels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suivi de la communauté PluXml avec un aspect de modération. Cette fonction nécessite de connaître parfaitement le fonctionnement du script &lt;strong&gt;PluXml&lt;/strong&gt; ainsi que &lt;strong&gt;la politique du projet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tests intensifs des versions alpha que l&#039;équipe de développement (Stéphane et moi) leur fournira. Ce travail nécessite de bien connaître &lt;strong&gt;le langage PHP&lt;/strong&gt; et le fonctionnement du script &lt;strong&gt;PluXml&lt;/strong&gt;...Si cela se passe bien, afin de pérenniser et formaliser tout ça pourquoi pas &lt;strong&gt;rédiger une procédure de tests&lt;/strong&gt; !&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Intéressé ?&lt;/h3&gt;
&lt;p&gt;Si tu es intéressé pour rejoindre l&#039;équipe &lt;strong&gt;d&#039;un projet OpenSource sympatique&lt;/strong&gt;, envois nous un mail à &lt;a href=&quot;mailto:rejoindre-equipe@pluxml.org&quot;&gt;rejoindre-equipe@pluxml.org&lt;/a&gt; en te présentant toi et tes éventuels projets.&lt;/p&gt;
&lt;p&gt;La discussion continue &lt;a href=&quot;http://forum.pluxml.org/viewtopic.php?pid=10140&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>Nouveau site PluXml.org !</title> 
	<link href="http://blog.flox-arts.net/?article26/nouveau-site-pluxml-org"/>
	<id>urn:md5:422e986b3ae1869f48c744a61fe2e6f0</id>
	<updated>2009-03-20T00:00:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Pluxml</dc:subject>
	<content type="html">&lt;p&gt;&lt;img src=&quot;data/images/pluxml-org-v2.png&quot; alt=&quot;pluxml.org v2&quot; style=&quot;float:left;margin:10px;border:1px solid;&quot; /&gt;Nous avons décidé de donner un coup de jeune au site &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml.org&lt;/a&gt; qui n&#039;avait pas évolué depuis la naissance de projet en 2006.&lt;br/&gt;
C&#039;est chose faite avec ce design de notre graphiste &lt;a href=&quot;http://pluxml.org/?categorie3/a-propos-de-pluxml&quot;&gt;Ti_Pierre&lt;/a&gt; et ce logo de SapinTremblant et NS-shnalla du &lt;a href=&quot;http://forum.pluxml.org&quot;&gt;forum&lt;/a&gt;. Merci à eux !&lt;/p&gt;
&lt;p&gt;Un wiki digne de ce nom est maintenant accessible à l&#039;adresse &lt;a href=&quot;http://wiki.pluxml.org&quot;&gt;wiki.pluxml.org&lt;/a&gt; et vous pouvez avec votre compte &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml&lt;/a&gt; créer et éditer de nouvelles pages.&lt;/p&gt;
&lt;p&gt;Pour le reste, un forum sous &lt;a href=&quot;http://fluxbb.org&quot;&gt;FluxBB&lt;/a&gt; et le reste ... sous Pluxml Blog bien sûr !&lt;/p&gt;
&lt;p&gt;Article original : &lt;a href=&quot;http://pluxml.org/?article20/nouveau-site-pluxml-org&quot;&gt;http://pluxml.org/?article20/nouveau-site-pluxml-org&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>Flox-arts.net adopte le statut d&#039;auto-entrepreneur</title> 
	<link href="http://blog.flox-arts.net/?article25/flox-arts-net-adopte-le-statut-d-auto-entrepreneur"/>
	<id>urn:md5:fb9f19b14e4d46089fb547f8c4d7999a</id>
	<updated>2009-03-17T20:15:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Vie d&#039;entreprise</dc:subject>
	<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flox-arts.net&quot;&gt;Flox-arts.net&lt;/a&gt; adoptera au 1er avril 2009 le statut d&#039;auto-entrepreneur ce qui va me permettre d&#039;étendre mon activité dans les domaines suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingénierie informatique&lt;/li&gt;
&lt;li&gt;Développement de logiciels&lt;/li&gt;
&lt;li&gt;Hébergement d&#039;applications Web&lt;/li&gt;
&lt;li&gt;Maintenance et supervision de réseaux informatiques&lt;/li&gt;
&lt;li&gt;Support spécifique ou consulting pour le projet &lt;a href=&quot;http://pluxml.org&quot;&gt;PluXml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;L&#039;auto-entrepreneur, quest ce que cest ?&lt;/h3&gt;
&lt;p&gt;Disponible depuis le 1er janvier 2009, ce régime est le plus simple possible pour créer une activité indépendante (Loi de Modernisation de lEconomie du 4 août 2008).&lt;/p&gt;
&lt;h3&gt;Quels sont les avantages par rapport à la création dune entreprise individuelle ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La déclaration dexistence est simplifiée&lt;/li&gt;
&lt;li&gt;Lauto-entrepreneur est dispensé dimmatriculation à un registre&lt;/li&gt;
&lt;li&gt;Les contributions fiscales sociales sont prélevées une fois le chiffre daffaires (CA) réalisé : pas de chiffre daffaires = ni charges, ni impôt !&lt;/li&gt;
&lt;li&gt;Lentreprise ne facture pas la TVA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Source : &lt;a href=&quot;http://www.auto-entrepreneur.cci.fr&quot;&gt;http://www.auto-entrepreneur.cci.fr&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>Sortie de Pluxml blog beta 4 !</title> 
	<link href="http://blog.flox-arts.net/?article24/sortie-de-pluxml-blog-beta-4"/>
	<id>urn:md5:c4e1ddc09502ecd463f30cb8022a28a9</id>
	<updated>2008-11-02T20:00:00+00:00</updated>
	<author><name>Florent</name></author>
	<dc:subject>Pluxml</dc:subject>
	<content type="html">&lt;p&gt;&lt;img src=&quot;data/images/pluxml-site.png&quot; alt=&quot;&quot; style=&quot;float:left;margin:0 10px 0 0&quot;/&gt; Voilà, après des mois de travail, toute &lt;a href=&quot;http://pluxml.org/?003/A-propos-de-pluxml&quot;&gt;l&#039;équipe de Pluxml&lt;/a&gt; est fière de vous annoncer la sortie de cette nouvelle mouture de &lt;a href=&quot;http://pluxml.org&quot;&gt;Pluxml Blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pluxml-blog beta 4 - &lt;a href=&quot;http://download.pluxml.org/pluxml-blog-beta4.zip&quot;&gt;.zip (80ko)&lt;/a&gt; - &lt;a href=&quot;http://svn.pluxml.org/pluxml-blog/tags/beta-4.0&quot;&gt;Tag SVN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Outil de migration - &lt;a href=&quot;http://download.pluxml.org/plugins/migration-blog-beta3x-beta4.zip&quot;&gt;Pluxml blog beta 3.x =&gt; Pluxml blog beta 4&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;/p&gt;&lt;p&gt;Pour cette première sortie de la nouvelle équipe, pas mal de changement mais aussi une grosse recherche de performance !&lt;br/&gt;Allez j&#039;arrête les blasblas et je vous présente la liste des nouveautés/améliorations :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;la gestion des pages statiques (par exemple une page de contact)&lt;/li&gt;

	&lt;li&gt;choix de l&#039;encodage ISO ou UTF8&lt;/li&gt;
	&lt;li&gt;une modération des commentaires et pagination de ceux-ci dans l&#039;administration&lt;/li&gt;
	&lt;li&gt;un fil RSS et ATOM pour les commentaires (global et par article)&lt;/li&gt;
	&lt;li&gt;la gestion du tri d&#039;affichage (global et par catégorie)&lt;/li&gt;
	&lt;li&gt;une gestion de la pagination des articles au niveau des catégories&lt;/li&gt;
	&lt;li&gt;la gestion des documents&lt;/li&gt;
	&lt;li&gt;la gestion du compte rédacteur&lt;/li&gt;
	&lt;li&gt;possibilité de vérifier si l&#039;on possède la dernière version de Pluxml&lt;/li&gt;
	&lt;li&gt;gestion des pages introuvables (petit gestionnaire d&#039;erreurs)&lt;/li&gt;
	&lt;li&gt;un nouveau modèle de template avec plein de nouvelles fonctions&lt;/li&gt;
	&lt;li&gt;un panel d&#039;administration plus fonctionnel et ergonomique&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Résultat : 40% (serveur PHP5) / 30% (serveur PHP4) plus rapide que la version blog beta 3 !&lt;/strong&gt;&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;La documentation a été mis à jour et un wiki va être mis en place notamment pour vous aider à créer vos thèmes&lt;/p&gt;
&lt;p&gt;Il ne me reste plus qu&#039;à vous remercier d&#039;être toujours plus nombreux à utiliser &lt;a href=&quot;http://pluxml.org&quot;&gt;Pluxml&lt;/a&gt; et à collaborer à son développement.&lt;/p&gt;
&lt;p&gt;La discussion continue &lt;a href=&quot;http://forum.pluxml.org/viewtopic.php?id=978&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>Le projet de script Pluxml</title> 
	<link href="http://blog.flox-arts.net/?article23/le-projet-de-script-pluxml"/>
	<id>urn:md5:fac93603b37a11509f7445d3bc0dd830</id>
	<updated>2008-07-27T13:36:00+00:00</updated>
	<author><name>Florent</name></author>
	<dc:subject>Pluxml</dc:subject>
	<content type="html">&lt;p&gt;&lt;a href=&quot;http://pluxml.org&quot; title=&quot;Pluxml&quot;&gt;Pluxml&lt;/a&gt; est un script pour créer un site ou un blog, nul besoin de connaissance en programmation ni besoin d&#039;une base de données sur son hébergement, un environnement php classique lui suffit. Pluxml se veut léger et facile d&#039;utilisation grâce à une interface d&#039;administration simple et le stockage de vos écrits dans des fichiers &lt;acronym title=&quot;Extensible Markup Language&quot;&gt;Xml&lt;/acronym&gt; facilement transportables.&lt;/p&gt;
&lt;p&gt;Le créateur &lt;strong&gt;Skyline&lt;/strong&gt; a malheureusement plus beaucoup le temps de maintenir ce script et je suis donc chargé de reprendre ce projet fort intéressant.&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;img src=&quot;./data/images/sign_pluxml.jpg&quot; alt=&quot;pluxml&quot; /&gt;&lt;/p&gt;
&lt;p&gt;La version &lt;strong&gt;blog beta 4&lt;/strong&gt;, sur laquelle je travaille, sera d&#039;ailleurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;plus rapide&lt;/li&gt;
&lt;li&gt;plus fonctionnelle&lt;/li&gt;
&lt;li&gt;plus accessible&lt;/li&gt;
&lt;li&gt;respectueuse de l&#039;esprit initial du script&lt;/li&gt;
&lt;/ul&gt;</content>
</entry>
<entry>
	<title>Internet-creation.fr devient Flox-arts.net !</title> 
	<link href="http://blog.flox-arts.net/?article22/internet-creation-fr-devient-flox-arts-net"/>
	<id>urn:md5:08b1a464042a301a3ab4c5ab2c243c32</id>
	<updated>2008-07-27T13:19:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Vie d&#039;entreprise</dc:subject>
	<content type="html">&lt;p&gt;Blasé par le nom de domaine Internet-creation.fr, je l&#039;ai changé récemment pour &lt;a href=&quot;http://www.flox-arts.net&quot;&gt;Flox-arts.net&lt;/a&gt;; un petit clin d&#039;oeil à mon papa ;)&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;img src=&quot;./data/images/logo.jpeg&quot; alt=&quot;Flox-arts.net&quot; /&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>SR03 - PVM Parallel Virtual Machine</title> 
	<link href="http://blog.flox-arts.net/?article21/sr03-pvm-parallel-virtual-machine"/>
	<id>urn:md5:2b840c3df801982997d619417f8d4a63</id>
	<updated>2008-06-13T15:41:00+00:00</updated>
	<author><name>Florent</name></author>
	<dc:subject>Sys et Réseau</dc:subject>
	<content type="html">&lt;p&gt;PVM (Parallel Virtual Machine) is a byproduct of an ongoing heterogeneous network computing research project involving the authors and their institutions. The general goals of this project are to investigate issues in, and develop solutions for, heterogeneous concurrent computing. PVM is an integrated set of software tools and libraries that emulates a general-purpose, flexible, heterogeneous concurrent computing framework on interconnected computers of varied architecture. The overall objective of the PVM system is to to enable such a collection of computers to be used cooperatively for concurrent or parallel computation.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Lien vers le sujet du TD (accès interne UTC)&lt;a href=&quot;http://tuxa.sme.utc/~sr03/td_pvm.html&quot;&gt;http://tuxa.sme.utc/~sr03/td_pvm.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Application&lt;/h3
&lt;p&gt;Le but de l&#039;application est donc de calculer un produit matriciel (vecteur par vecteur ou vecteur par matrice) en parallélisant les calculs. Ce n&#039;est bien entendu qu&#039;un exemple d&#039;application destiné à montrer le fonctionnement de PVM car il n&#039;y a fait aucun intérêt à paralléliser une telle tâche. En effet, dans ce cas précis le coût de la parallélisation est plus élevé qu&#039;un calcul direct sur une machine.&lt;/p&gt;
&lt;p&gt;La difficulté de cette parallélisation concerne en fait le découpage de la matrice. En effet, pour calculer le produit matriciel d&#039;un vecteur par une matrice il faut envoyer le vecteur ainsi qu&#039;une ligne de la matrice pour calculer chaque dimension correspondante du vecteur résultant. Il faut bien voir qu&#039;il est possible que la matrice contienne plus de lignes qu&#039;il y a de machines virtuelles. A ce moment la, il faut pouvoir envoyer plusieurs lignes à chaque machine virtuelle. Cela implique d&#039;avoir un algorythme efficace permettant de répartir les lignes équitablement entre les esclaves afin d&#039;optimiser le temps de traitement général.&lt;/p&gt;
&lt;p&gt;En l&#039;occurrence, pour traiter cette problématique nous avons travaillé sur un algorythme faisant la répartition en question en fonction du nombre de lignes de la matrice et du nombre de machines virtuelles disponibles. Cet algo calcul tout d&#039;abord la division euclidienne du nombre de lignes par le nombre de machines qui correspond en fait au nombre minimum de ligne que prendra en charge chaque machine esclave. Ensuite il calcule le reste de la division euclidienne qui correspond au nombre de lignes restantes à répartir dans les machines virtuelles, ce nombre étant strictement inférieur au nombre de machine. Lorsque ce reste est égal à 0, cela veut dire qu&#039;il y a une relation de proportionnalité entre le nombre de machine et le nombre de lignes de la matrice donc ici pas de problème de répartition. Lorsque le reste n&#039;est pas égal à 0 on assigne donc à chaque machine virtuelle un nombre de lignes à traiter égal au quotient de la division euclidienne. Puis on incrémente de 1 le nombre de lignes à traiter pour un nombre de machine égal au reste. C&#039;est à dire que l&#039;on répartis les lignes restantes sur les machines virtuelles chacune leur tour. On rajoute une ligne à la 1ère machine virtuel (en plus du résultat de la division euclidienne de base) puis s&#039;il reste encore des lignes on en donne également une de plus à la machine suivante et etc. De cette manière les machines virtuelle ont au plus 1 ligne de différence à traiter. Il suffit ensuite d&#039;empaqueter le nombre de lignes dans la tâche et de les envoyer aux machines correspondantes.&lt;/p&gt;
&lt;p&gt;Accessoirement, nous avons codés des fonctions d&#039;affichage écran d&#039;une matrice et d&#039;un vecteur ainsi que des fonctions de génération aléatoire de matrices et de vecteurs pour permettre de simuler différentes situations.&lt;/p&gt;
&lt;h3&gt;Code source&lt;/h3&gt;
&lt;p&gt;mastersr03p006.c :&lt;/p&gt;
&lt;code:c&gt;
/* SR03 : mastersr03p006.c benoit.karci@etu.utc.fr &amp; florent.monthel@etu.utc.fr */

#include&lt;stdio.h&gt; 
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
#include &quot;pvm3.h&quot;
#define SLAVENAME &quot;slavesr03p006&quot;

/*
Primitive buildVecteur() : construction d&#039;un vecteur
@param n : taille du vecteur
@param val : valeur
@return vecteur (int*)
*/
int* buildVecteur(int n, int val) {

    int* vect = (int*)malloc(sizeof(int) * n);
	memset(vect, val, sizeof(int) * n);
    return vect;
}

/*
Primitive printVecteur() : impression d&#039;un vecteur
@param vect : vecteur à imprimer
@param size : taille du vecteur
@return void
*/
void printVecteur(int* vect, int size) {

	printf(&quot;|&quot;);
	int i;
	for(i=0; i&lt;size; i++) {
		printf(&quot; %d&quot;,vect[i]);
	}
	printf(&quot;|\n&quot;);
}

/*
Primitive aleatoireVecteur() : donne des valeurs aléatoires aux valeurs d&#039;un vecteur
@param vect : vecteur à traiter
@param size : taille du vecteur
@return void
*/
void aleatoireVecteur(int* vect, int size) { 

	int i;
	for( i=0; i&lt;size; i++) {
		vect[i] = rand() % 9;
	}
}

/*
Primitive printMatrice() : impression d&#039;une matrice
@param matrice : matrice à imprimer
@param sizeX : taille X
@param sizeY : taille Y
@function printVecteur
@return void
*/
void printMatrice(int** matrice, int sizeX, int sizeY) {

	int j;
    for(j=0; j&lt;sizeY; j++) {
        printVecteur(matrice[j],sizeX);
	}
}

/*
Primitive fusionLigneVecteur() : fusionne des lignes résultats avec un vecteur
@param vect : vecteur à traiter
@param ligne : ligne à traiter
@param ligneStart : identifiant de départ ds la ligne
@param ligneEnd : identifiant de fin ds la ligne
@return void
*/
void fusionLigneVecteur(int* vect, int* ligne, int ligneStart, int ligneEnd) {

	int i_ligne = 0;
	int i_vecteur;
	// On remplace les valeurs du vecteur par ceux de la ligne entre les index
	for(i_vecteur=ligneStart; i_vecteur&lt;ligneEnd; i_vecteur++) {
		vect[i_vecteur] = ligne[i_ligne];
		i_ligne ++;
	}
}

/*
Primitive calculLigneByProc() : calcul le nb de ligne à traiter pr chaque processus
@param nbProc : nb de processus total
@param sizeY : nb lignes à traiter
@return tableau nb de ligne indexé par processus (int*)
*/
int*  calculLigneByProc(int nbProc, int sizeY) {

	int num = (sizeY / nbProc) ;
	int r = sizeY%nbProc;
    // On imprime les valeurs (mode debug)
    printf(&quot;nombre de lignes initial par processus : %d\n&quot;, num);
    printf(&quot;ligne(s) restante(s) non distribuee(s) : %d\n&quot;, r);
	// On crée notre tableau (allocation) avec la valeur par défaut (num), puis o complète par le reste (r)
    int max = sizeof(int) * nbProc;
    int * nbLigneByProc = (int *) malloc (max);
    memset(nbLigneByProc, 0, max);
    int i;
	for(i=0; i&lt;nbProc; i++) {    
		nbLigneByProc[i] = num;
		if(r &gt; 0) {
			nbLigneByProc[i]++;
			r--;
		}
	}
   return nbLigneByProc;
}


/* MAIN */
int main(int argc, char ** argv) {

	int mytid;  /* my task id */
	int tids[32]; /* slave task ids */
	int numt, i, who, msgtype, nhost, narch;
	struct pvmhostinfo *hostp[32];
	int sizeX;
	int sizeY;
	int nproc;
    //enroll in pvm
	mytid = pvm_mytid();
	//initialisatio= du random
	srand((int)time(NULL));   


  if( pvm_parent() == PvmNoParent ) {
		puts(&quot;Nombre de colonnes ?&quot;); scanf(&quot;%d&quot;, &amp;sizeX);
		sizeY = sizeX;
		puts(&quot;Nombre de processus (1-32)?&quot;); scanf(&quot;%d&quot;, &amp;nproc);
    } else {
		pvm_config( &amp;nhost, &amp;narch, hostp );
		nproc = nhost;
		if ( nproc &gt; 32 )   nproc = 32 ;
        if ( sizeX &gt; 128 ) sizeX = 128;
        if ( sizeY &gt; 128 ) sizeY = 128;
    }

    /* start up slave tasks */
    numt=pvm_spawn(SLAVENAME, (char**)0, 0, &quot;&quot;, nproc, tids);

    if( numt &lt; nproc ){
       printf(&quot;Trouble spawning slaves. Aborting. Error codes are:\n&quot;);
       for( i=numt ; i&lt;nproc ; i++ ) {
          printf(&quot;TID %d %d\n&quot;,i,tids[i]);
       }
       for( i=0 ; i&lt;numt ; i++ ){
          pvm_kill( tids[i] );
       }
       pvm_exit();
       exit(1);
    }
    
    /* Begin User Program */

	// Construction du vecteur multiplicateur
	int  *vect  = (int * ) malloc( sizeof(int) *sizeX);
	memset(vect,0,sizeX * sizeof(int));
	aleatoireVecteur(vect,sizeX);
	printf(&quot;Vecteur de calcul multiplicateur : \n&quot;);
	printVecteur(vect, sizeX);
	
	// Construction de notre matrice
	int** matrice = (int **) malloc( sizeof(int *) * sizeY);
	for(i=0; i&lt; sizeY; i++) {
		matrice[i] = (int * )malloc(sizeof(int) * sizeX);
		memset(matrice[i],0,sizeX * sizeof(int));
		aleatoireVecteur(matrice[i],sizeX);
	}
	printf(&quot;Matrice generee (taille %d) : \n&quot;,sizeX);
	printMatrice(matrice, sizeX, sizeY);
	
	// Affectation des lignes aux processus
	printf(&quot;Nombre de processus demandee : %d\n&quot;,nproc);
	int * nbLigneByProc = calculLigneByProc(nproc, sizeY);
	for(i=0; i&lt;nproc; i++)
	printf(&quot;nombre de ligne pour le processus num %d : %d\n&quot;, i, nbLigneByProc[i]);

	// On envoi les lignes, on commence par la fin
	int numLigneEnd = sizeY;
	int numLigneStart;
	int nbLine;
	msgtype = 0;
	for(i=0; i&lt; nproc; i++) {
		nbLine = nbLigneByProc[i];
		numLigneStart = numLigneEnd-nbLine;
		// petit controle fort utile ;)
		if(nbLine &gt; 0) {
			/* Broadcast initial data to slave tasks */
			pvm_initsend(PvmDataDefault);
			int numLigneEndTemp = numLigneEnd;
			// Compactage des donnees ds le tampon d&#039;envoi
			pvm_pkint(&amp;numLigneStart, 1, 1);
			pvm_pkint(&amp;numLigneEndTemp, 1, 1);
			pvm_pkint(&amp;sizeX, 1, 1);
			pvm_pkint(vect, sizeX, 1);
			int j;
			for (j=numLigneStart; j&lt;numLigneEnd; j++)  {
				pvm_pkint(matrice[j], sizeX, 1);
			}
			int ptid = tids[i];
			pvm_send(ptid, msgtype);
			printf(&quot;On envoi la ligne %d a %d a destination du ptid %d\n&quot;,numLigneStart,numLigneEnd,ptid);
		}
		numLigneEnd = numLigneStart;	
	}

    /* Wait for results from slaves */
    msgtype = 5;
	int * result = buildVecteur(sizeY,0);
	int nbLignRec = 0;
	while(nbLignRec &lt; sizeY) {
		pvm_recv(-1, msgtype );
		pvm_upkint(&amp;who, 1, 1 );
		pvm_upkint(&amp;numLigneStart, 1, 1);
		pvm_upkint(&amp;numLigneEnd, 1, 1);
		nbLine = numLigneEnd-numLigneStart;
		int * resultLigne = buildVecteur(nbLine,0);
		pvm_upkint(resultLigne, nbLine, 1 );
		printf(&quot;I got  something nbLigne %d - line %d to %d from  %d\n&quot;,nbLine,numLigneStart,numLigneEnd,who);
		printVecteur(resultLigne, nbLine);
		// Ajout des lignes
		nbLignRec += nbLine;
		// Fusion result et resultLigne
		fusionLigneVecteur(result, resultLigne, numLigneStart, numLigneEnd);
    }
	// Affichage de la matrice finale
	printf(&quot;Resultat du calcul :\n&quot;);
	printVecteur(result, sizeY);
    /* Program Finished exit PVM before stopping */
    pvm_exit();
}
&lt;/code&gt;
&lt;p&gt;slavesr03p006.c :&lt;/p&gt;
&lt;code:c&gt;
/* SR03 : slavesr03p006.c benoit.karci@etu.utc.fr &amp; florent.monthel@etu.utc.fr */

#include &lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
#include &quot;pvm3.h&quot;

/*
Primitive buildVecteur() : construction d&#039;un vecteur
@param n : taille du vecteur
@param val : valeur
@return vecteur (int*)
*/
int* buildVecteur(int n, int val) {

    int* vect = (int*)malloc(sizeof(int) * n);
	memset(vect, val, sizeof(int) * n);
    return vect;
}

/*
Primitive calculProduitScal() : calcul du procuit scalaire en 2 vecteurs
@param vect1 : vecteur n°1
@param vect2 : vecteur n°2
@param size : taille vecteur
@return produit scalaire (int)
*/
int calculProduitScal(int *vect1, int *vect2, int size) {

    int i, res = 0;
    for (i=0; i&lt;size; i++) {
        res = res + vect1[i] * vect2[i];
	}
    return res;
}


/* MAIN */
int main(int argc, char ** argv) {

    int mytid; /* my task id */
    int tids[32]; /* task ids   */
	int sizeX, i, nproc, master, msgtype;
	int * vect;
	int nbLine;
	int numLigneStart;
	int numLigneEnd;

	vect = buildVecteur(sizeX,0);
    /* enroll in pvm */
	mytid = pvm_mytid();

    /* Receive data from master */
    msgtype = 0;
    pvm_recv( -1, msgtype );
	// Décompactage des données
	pvm_upkint(&amp;numLigneStart, 1, 1);
	pvm_upkint(&amp;numLigneEnd, 1, 1);
	pvm_upkint(&amp;sizeX, 1, 1);
	pvm_upkint(vect, sizeX, 1);

	int * resultLigne = buildVecteur(nbLine,0);
	int resultIterator = 0;
	nbLine = numLigneEnd - numLigneStart;
	// Constrution vecteur temporaire
	int * vecteurTemp = buildVecteur(sizeX,0);
	for(i = 0; i&lt;nbLine; i++) {
		pvm_upkint(vecteurTemp, sizeX, 1);
		resultLigne[resultIterator] = calculProduitScal(vecteurTemp,vect,sizeX);
		resultIterator++;
	}
    /* Send result to master */
    pvm_initsend( PvmDataDefault );
	// Compactage des données
	pvm_pkint(&amp;mytid, 1, 1);
	pvm_pkint(&amp;numLigneStart, 1, 1);
	pvm_pkint(&amp;numLigneEnd, 1, 1);
	pvm_pkint(resultLigne, nbLine, 1);
    msgtype = 5;
    master = pvm_parent();
    pvm_send(master, msgtype);
    /* Program finished. Exit PVM before stopping */
    pvm_exit();
}
&lt;/code&gt;
&lt;p&gt;Et enfin le makefile :&lt;/p&gt;
&lt;code:bash&gt;
# PVM_ROOT must be set to the path where PVM includes and libraries are installed.
# PVM_ARCH must be set to your architecture type (SUN4, HP9K, RS6K, SGI, etc.)
# Set ARCHLIB to any special libs needed on PVM_ARCH (-lrpc, -lsocket, etc.)
# otherwise leave ARCHLIB blank
#

SDIR =	.

OPTIONS =	-O
CFLAGS =	$(OPTIONS) -I$(PVM_ROOT)/include 

#ARCHLIB =	-lsocket -lnsl
LIBS =	-lpvm3 $(ARCHLIB)

LFLAGS =	$(LOPT) -L$(PVM_ROOT)/lib/$(PVM_ARCH)

CPROGS =	mastersr03p006 slavesr03p006

default:	mastersr03p006 slavesr03p006

all: c-all

c-all:  $(CPROGS)

clean:
	rm -f *.o mastersr03p006 slavesr03p006

mastersr03p006: $(SDIR)/mastersr03p006.c
	$(CC) $(CFLAGS) -o $@ $(SDIR)/mastersr03p006.c $(LFLAGS) $(LIBS)

slavesr03p006: $(SDIR)/slavesr03p006.c
	$(CC) $(CFLAGS) -o $@ $(SDIR)/slavesr03p006.c $(LFLAGS) $(LIBS)
&lt;/code&gt;</content>
</entry>
<entry>
	<title>Une extension Firefox Mac spéciale proxy</title> 
	<link href="http://blog.flox-arts.net/?article20/une-extension-firefox-mac-speciale-proxy"/>
	<id>urn:md5:68a6f76e7385bc30b1844f4ad2c8bf2a</id>
	<updated>2008-05-07T08:00:00+00:00</updated>
	<author><name>fmonthel</name></author>
	<dc:subject>Sys et Réseau</dc:subject>
	<content type="html">&lt;p&gt;Sous &lt;b&gt;Mac Os Leopard&lt;/b&gt;, on a la possibilité de paramétrer plusieurs configurations réseaux selon l&#039;endroit où l&#039;on se connecte.&lt;br/&gt;
Etant à l&#039;&lt;a href=&quot;http://www.utc.fr&quot;&gt;UTC&lt;/a&gt; et pour ne pas déroger à la règle la configuration de ce genre d&#039;école est assez ardu (authentification PEAP, MSCHAP, proxy) donc bien pratique Leopard...&lt;/p&gt;
&lt;p&gt;Le seul hic c&#039;est que &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot; alt=&quot;&quot;&gt;Firefox sous Mac&lt;/a&gt; ne reprend pas les paramètres proxy du système et j&#039;étais obligé de le paramétrer manuellement à chaque connexion à l&#039;&lt;a href=&quot;http://www.utc.fr&quot;&gt;UTC&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;Voilà enfin une extension dénommée &lt;b&gt;System Proxy&lt;/b&gt; qui permet à &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot; alt=&quot;&quot;&gt;Firefox&lt;/a&gt; de récupérer automatiquement les paramètres systèmes, plus besoin donc de régler mon navigateur à chaque connexion-deconnexion à l&#039;&lt;a href=&quot;http://www.utc.fr&quot;&gt;UTC&lt;/a&gt;!&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;img src=&quot;./data/images/system-proxy.png&quot; alt=&quot;&quot; style=&quot;border: 1px solid #000;&quot; /&gt;&lt;br/&gt;J&#039;ai découvert ça sur &lt;a href=&quot;http://blog.curthread.org/projects/systemproxy&quot;&gt;curthread.org&lt;/a&gt;&lt;/p&gt;</content>
</entry>
<entry>
	<title>SR03 - Rappel de SR02, fork et processus</title> 
	<link href="http://blog.flox-arts.net/?article19/sr03-rappel-de-sr02-fork-et-processus"/>
	<id>urn:md5:0bcb9afaee81ffd5ec4623ff5d0e48d5</id>
	<updated>2008-03-14T13:23:00+00:00</updated>
	<author><name>Florent</name></author>
	<dc:subject>Sys et Réseau</dc:subject>
	<content type="html">&lt;p&gt;Rappel de l&#039;UV SR02, utilisation des mécanismes de communication inter-processus.&lt;/p&gt;&lt;h2&gt;a. popen-ls.c - Exéc. commande et récup. sortie&lt;/h2&gt;

&lt;p&gt;Travail sur l&#039;exécution d&#039;une commande depuis un programme C, avec récupération de la sortie. Utilisation des directives popen(), pclose(), fgets(), fprintf(), setvbuf(), sprintf().&lt;/p&gt;

&lt;p&gt;Écrire un programme popen-ls.c qui produit la sortie suivante :&lt;/p&gt;
&lt;code:bash&gt;
$ ./popen-ls
Fichier-- popen-ls* --l=10
Fichier-- popen-ls.c --l=11
Fichier-- pps* --l=5
Fichier-- pps.c --l=6
fgets eof
sortie avait 4 lignes.
&lt;/code&gt;

&lt;p&gt;popen-ls.c utilise la commande &quot;ls&quot; (à travers un popen()), et en récupère le résultat ligne par ligne pour encadrer chaque nom de fichier listé par ses propres commentaires (Fichier-- ) et ( --l=xx).&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Nota:&lt;/u&gt; pour traiter la sortie de popen() ligne à ligne il est nécessaire de lui appliquer un setvbuf().&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Nota:&lt;/u&gt; on remarque, sur la sortie exemple ci-dessus, un marqueur &quot;*&quot; accolé à certains fichiers. Faites pareil (réponse dans man ls).&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Nota:&lt;/u&gt; popen-ls.c s&#039;écrit en 22 lignes de C.&lt;/p&gt;
&lt;code:c&gt;
/* SR03 : TD0 popen-ls.c benoit.karci@etu.utc.fr &amp; florent.monthel@etu.utc.fr */

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;

int main() {
	/* FILE *  popen(char* cmd, char* type) */
	FILE *fp;
	char line[80],buffer[100];
	/* on execute une commande shell (/bin/sh) et on place le resultat dans un FILE* grace au popen */
	fp = popen(&quot;ls -F&quot;, &quot;r&quot;);
	if(!fp) { /* erreur de fork ou de pipe du popen */
		perror(&quot;Erreur de popen\n&quot;);
		return EXIT_FAILURE;
	}
	/* permet de lire fp ligne a ligne */
	setvbuf(fp,(char*)NULL,_IOLBF,0);
	/* on parcourt tt les lignes */
	while ( fgets( line, sizeof(line), fp)) {
		/* on supprime le saut a la ligne */
		line[strlen(line)-1] = &#039;\0&#039;;
		/* on encadre notre resultat */
		printf(&quot;Fichier-- %s --l=%d\n&quot;, line,strlen(line));
	}
	/* on ferme fp */
	pclose(fp);
	return EXIT_SUCCESS;
}
&lt;/code&gt;

&lt;h2&gt;b. forkexec-ls.c - Exéc. dans un fils et récup. sortie sur un pipe&lt;/h2&gt;

&lt;p&gt;Modifier le programme popen-ls.c ci-dessus en forkexec-ls.c qui produit une sortie identique à popen-ls, mais sans utiliser la directive popen(). On remplace le popen() par :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;création d&#039;un pipe&lt;/li&gt;
&lt;li&gt;fork d&#039;un fils&lt;/li&gt;
&lt;li&gt;le fils redirige sa sortie standard sur le pipe&lt;/li&gt;
&lt;li&gt;le père boucle sur la lecture ligne par ligne de la sortie du pipe.&lt;/li&gt;
&lt;li&gt;à la fin, le père récupère le status de terminaison du fils.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;u&gt;Nota:&lt;/u&gt; forkexec-ls.c s&#039;écrit en environ 55 lignes de C.&lt;/p&gt;
&lt;code:c&gt;
/* SR03 : TD0 forkexec.c benoit.karci@etu.utc.fr &amp; florent.monthel@etu.utc.fr */

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;unistd.h&gt;

int main() {

	int fd[2]; /* déclaration pour descripteurs */ 
	pid_t pid; /* déclaration du pid */
	FILE* pRead; /* utile pour lire dans le descripteur du pipe */
	char data[255]; /* utile pour la lecture ligne par ligne */
	
	if(pipe(fd) != 0) { /* appel directive: création de 2 descripteurs */
		perror(&quot;Erreur de PIPE&quot;);
		return EXIT_FAILURE;
	}
	/* On duplique */
	pid = fork();
	if ( pid == -1 ) {
		perror(&quot;Erreur de FORK&quot;);
		return EXIT_FAILURE;
	}
	if ( pid == 0 ) { /* proc fils */
		/* on ferme le descripteur du pipe en lecture */
		close(fd[0]);
		/* on ferme le descripteur de stdout */
		close(STDOUT_FILENO);
		/* on duplique le descripteur d&#039;ecriture du pipe (il va ds stdout) */
		if(dup(fd[1]) == -1) {
			perror(&quot;FILS : erreur de duplication du descripteur d&#039;ecriture du pipe&quot;);
			exit(1);
		}
		/* on ferme pd[1] car on en a plus besoin (il est ds stdout) */
		close(fd[1]);
		/* on effectue un appel système qui va occuper le proc courant (fils) */
		execlp( &quot;ls&quot;, &quot;ls&quot;, &quot;-F&quot;, NULL );
		/* si il y aucune erreur, on execute pas les lignes suivantes */
		fprintf(stderr, &quot;FILS : erreur lors de l&#039;appel de la commande &#039;execlp&#039;\n&quot;);
	} else { /* proc pere */
		/* on ferme le descripteur du pipe en écriture */
		close(fd[1]);
		/* on va passer ce qu&#039;on lit ds le descripteur de lecture du pipe ds pRead */
		if((pRead = fdopen( fd[0], &quot;r&quot; )) == NULL) {
			perror(&quot;PERE : erreur de lecture du descripteur du pipe&quot;);
			exit(1);
		}
		/* on traite les lignes */
		while(!feof(pRead))	{
			if(fgets(data,255,pRead) != NULL) {
				data[strlen(data)-1] = &#039; &#039;;
				fprintf(stdout, &quot;Fichier-- %s --l=%d\n&quot;,data,strlen(data));
			}
		}
		/* on attend le retour du fils (son pid) */
		if(wait(NULL) == -1) {
			perror(&quot;PERE : impossible d&#039;attendre la terminaison du fils&quot;);
			exit(1);
		}
	}
	/* c&#039;est OK */
	return EXIT_SUCCESS;
}
&lt;/code&gt;

&lt;h2&gt;c. forkpipe.c - Process communiquant par un pipe&lt;/h2&gt;

&lt;p&gt;Écrire un programme qui crèe DEUX sous-process communiquant
par un pipe&lt;/p&gt;
&lt;p&gt;Le premier sous-process (fils1) écrit une suite de chaines de caractères dans le pipe. Il trouve cette suite de caractères dans un fichier input.txt.&lt;/p&gt;

&lt;p&gt;Celles-ci sont lues par l&#039;autre sous-process (fils2) et imprimées sur stdout.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Nota:&lt;/u&gt; le buffer de lecture du sous-process fils2 sera de longueur 20.&lt;/p&gt;

&lt;p&gt;&quot;fils1&quot; va envoyer sur le pipe des &quot;messages&quot; formattés ainsi :&lt;/p&gt;

&lt;code:bash&gt;
[009][input.txt]
[nnn][ligne de nnn caractères]
...
&lt;/code&gt;

&lt;p&gt;&quot;fils2&quot; va lire le pipe, reconstituer les &quot;messages&quot; et reproduire sur stdout la suite des messages encadrés d&#039;un marqueur :&lt;/p&gt;

&lt;code:bash&gt;
reçu&gt;&gt;&gt;input.txt&lt;&lt;&lt;
reçu&gt;&gt;&gt;[Fichier d&#039;entrée du programme TD0 forkpipe.c].&lt;&lt;&lt;
reçu&gt;&gt;&gt;&lt;&lt;&lt;
...
&lt;/code&gt;

&lt;p&gt;Ainsi, le premier fils envoie PLUSIEURS messages, tous de longueur INCONNUE du process lecteur, et le lecteur doit les reconstituer (séparer le premier message du deuxième, etc ...).&lt;/p&gt;

&lt;p&gt;Inventez et implantez une solution permettant cette reconstitution des messages.&lt;/p&gt;
&lt;p&gt;
Gérez les codes retour de lecture sur le pipe pour programmer correctement la terminaison du deuxième process.&lt;/p&gt;

&lt;code:c&gt;
/* SR03 : TD0 forkpipe.c benoit.karci@etu.utc.fr &amp; florent.monthel@etu.utc.fr */

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/wait.h&gt;
#include &lt;unistd.h&gt;

int main() {

	int fd[2]; /* déclaration pour descripteurs */ 
	int status;
	pid_t pid1,pid2; /* déclaration des pids */
	FILE *fRead,*pRead; /* utile pour lire le fichier et dans le descripteur du pipe */
	char data[255]; /* utile pour la lecture ligne par ligne */
	int tMessage,nConteneur,cConteneur; /* utile pour notre méthode de conteneur */
	
	if(pipe(fd) != 0) { /* appel directive: création de 2 descripteurs */
		perror(&quot;Erreur de PIPE&quot;);
		return EXIT_FAILURE;
	}
	/* On duplique une première fois */
	pid1 = fork();
	if ( pid1 == -1 ) {
		perror(&quot;Erreur de FORK 1&quot;);
		return EXIT_FAILURE;
	}
	if ( pid1 == 0 ) { /* proc fils 1 */
		/* on ferme le descripteur du pipe en lecture */
		close(fd[0]);
		/* on ferme le descripteur de stdout */
		close(STDOUT_FILENO);
		/* on duplique le descripteur d&#039;ecriture du pipe (il va ds stdout) */
		if(dup(fd[1]) == -1) {
			perror(&quot;FILS 1 : erreur de duplication du descripteur d&#039;ecriture du pipe&quot;);
			exit(1);
		}
		/* on ferme pd[1] car on en a plus besoin (il est ds stdout) */
		close(fd[1]);
		/* ouverture du fichier input.txt */
		if((fRead = fopen(&quot;input.txt&quot;,&quot;r&quot;) ) == NULL) {
			perror(&quot;FILS 1 : impossible d&#039;ouvrir le fichier input.txt&quot;);
			exit(2);
		}
		/* on va lire ligne par ligne */
		while (fgets(data,255,fRead) != NULL) {
			/* taille du message */
			tMessage = strlen(data);
			/* on va calculer dans combien de conteneur (buffeur de lecture de 20) le message tient (ajouter les caractères de traitement [001][]) */
			nConteneur = ((tMessage+7)/20)+1;
			/* on modifie le dernier caractère (caractère de fin) */
			data[tMessage-1] = &#039;\0&#039;;
			/* on imprime sur le flux du pipe le nb de conteneurs */
			printf(&quot;%d\n&quot;, nConteneur);
			/* puis le message formaté */ 
			printf(&quot;[%3d]%s\n&quot;,tMessage,data);
		}
		/* on ferme le flux */
		fclose(fRead);
	} else { /* proc père */
		/* On duplique une deuxième fois */
		pid2 = fork();
		if ( pid2 == -1 ) {
			perror(&quot;Erreur de FORK 2&quot;);
			return EXIT_FAILURE;
		}
		if ( pid2 == 0 ) { /* proc fils 2 */
			/* on ferme le descripteur du pipe en écriture */
			close(fd[1]);
			/* on va initialiser notre nb de conteneurs */
			nConteneur = -1;
			/* on va initialiser notre compteur de conteneurs */
			cConteneur = 0;
			/* on va passer ce qu&#039;on lit ds le descripteur de lecture du pipe ds pRead */
			if((pRead = fdopen( fd[0], &quot;r&quot; )) == NULL) {
				perror(&quot;FILS 2 : erreur de lecture du descripteur du pipe&quot;);
				exit(1);
			}
			/* on va lire un buffer de 20 */
			while (fgets(data,20,pRead) != NULL) {
				/* si c&#039;est le début le nb de paquet est à -1 */
				if(nConteneur == -1) {
					nConteneur = atoi(data);
					/* debut du message */
					printf(&quot;recu&gt;&gt;&gt;&quot;);
				} else {
					/* si c&#039;est le premier paquet on enlève le nb de caractères */
					if(cConteneur == 0) {
						strcpy(data,data+5);
					}
					/* on incrémente le conteneur */
					cConteneur++;
					/* on est au niveau du dernier paquet, on enlève le saut de ligne */
					if(cConteneur == nConteneur) {
						tMessage = strlen(data);
						data[strlen(data)-1] = &#039;\0&#039;;
					}
					/* on imprime notre buffer */
					printf(&quot;%s&quot;,data);
					/* on est au niveau du dernier paquet, on initialise les variables */
					if(cConteneur == nConteneur) {
						printf(&quot;&lt;&lt;&lt;\n&quot;);
						nConteneur = -1;
						cConteneur = 0;
					}
				}
			}
			/* on ferme le flux */
			if(fclose(pRead) != 0) {
				perror(&quot;FILS 2 : erreur de fermeture du descripteur du pipe&quot;);
				exit(2);
			}
		} else { /* on est dans le père */
			/* on ferme les descripteurs */
			close(fd[0]);
			close(fd[1]);
			/* on attend la terminaison des fils */
			if((waitpid(pid1,&amp;status,0) &gt; 0) &amp;&amp; WIFEXITED(status)) { //les printf sont explicites...
				fprintf(stdout,&quot;PERE : le FILS 1 s&#039;est bien termine avec exit(%d)\n&quot;,WEXITSTATUS(status));
			} else if(WIFSIGNALED(status)) {
				fprintf(stdout,&quot;PERE : le FILS 1 s&#039;est termine grace au signal %d\n&quot;,WTERMSIG(status));
			} else if(WIFSTOPPED(status)) {
				fprintf(stdout,&quot;PERE : le FILS 1 a ete stoppe par le signal %d\n&quot;,WSTOPSIG(status));
			} else {
				fprintf(stdout,&quot;PERE : le process FILS 1 de pid=%d s&#039;est terminee de facon inconnue\n&quot;,pid1);
			}
			if((waitpid(pid2,&amp;status,0) &gt; 0) &amp;&amp; WIFEXITED(status)) { //les printf sont explicites...
				fprintf(stdout,&quot;PERE : le FILS 2 s&#039;est bien termine avec exit(%d)\n&quot;,WEXITSTATUS(status));
			} else if(WIFSIGNALED(status)) {
				fprintf(stdout,&quot;PERE : le FILS 2 s&#039;est termine grace au signal %d\n&quot;,WTERMSIG(status));
			} else if(WIFSTOPPED(status)) {
				fprintf(stdout,&quot;PERE : le FILS 2 a ete stoppe par le signal %d\n&quot;,WSTOPSIG(status));
			} else {
				fprintf(stdout,&quot;PERE : le process FILS 2 de pid=%d s&#039;est terminee de facon inconnue\n&quot;,pid2);
			}
		}
	}
	/* OK */
	return EXIT_SUCCESS;
}
&lt;/code&gt;</content>
</entry>
</feed>