<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no">
  <title>Planète Web Sémantique</title>
  <updated>2008-05-16T14:25:37Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>websemantique.org</name>
    <email>websemantique@xmlfr.org</email>
  </author>
  <id>http://planete.websemantique.org/atom.xml</id>
  <link href="http://planete.websemantique.org/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://planete.websemantique.org/" rel="alternate"/>

  <entry xml:lang="en">
    <id>http://www.jisc.ac.uk/Home/news/stories/2008/05/techwatch.aspx</id>
    <link href="http://www.jisc.ac.uk/Home/news/stories/2008/05/techwatch.aspx" rel="alternate" type="text/html"/>
    <title>TechWatch report calls for libraries to adopt 'coherent approach to metadata' : JISC</title>
    <summary>"The web is having a profound impact on the role and function of libraries. This, say some commentators, goes beyond the demise of the book' and touches on a wider vision for the future and on attempts to understand how libraries are to realise that</summary>
    <updated>2008-05-16T13:14:53Z</updated>
    <category term="WebSemantique"/>
    <category term="DocumentNumerique Internet OPAC biblioth&#xE8;ques catalogage catalogue digitallibraries library marc metadonnees moteur repository search web web2.0 webdesign webofdata websemantique webservice"/>
    <author>
      <name>pablog</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://nicolas.cynober.fr/blog/68,israel-3-silicon-country.html</id>
    <link href="http://feeds.feedburner.com/~r/W3f/~3/291520094/68,israel-3-silicon-country.html" rel="alternate" type="text/html"/>
    <title>Israël #3: Silicon country</title>
    <summary>Park
City


Rotem Industrial Park
Arava


Ariel Industrial Park
Ariel


Caesarea Industrial and Business Park
Caesarea


Gav-Yam Park - Caesarea
Caesarea


Etzion Industrial Park
Efrat


Matam Scientific Industry Park
Haifa


Atarot Industrial Area
Jerusalem


Givat Ram Technology Park
Jerusalem


Givat Sha’ul Industrial Area
Jerusalem


Har Hotzvim Industrial Park
Jerusalem


Malha Technology Park
Jerusalem


Karmiel Industrial Zone
Karmiel


Peleg Golan Industrial Park
Katzrin


Kiryat Arba Business Park
Kiryat Arba


Y.S. Gat Industrial Park
Kiryat Gat


Adumim Industrial Park
Maaleh Adumim


Koren Industrial Park
Maalot


Migdal Ha’emek Science Park
Migdal HaEmek


Bar-Lev Industrial Park
Misgav


Misgav Industrial [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img align="left" height="352" src="http://nicolas.cynober.fr/blog/images/israelsiliconvalley.jpg" style="margin-right: 1em;" width="150"/></p>
<table cellpadding="3">
<tr>
<th>Park</th>
<th>City</th>
</tr>
<tr>
<td><a href="http://www.rotemi.co.il/Park/">Rotem Industrial Park</a></td>
<td>Arava</td>
</tr>
<tr>
<td><a href="http://www.moit.gov.il/NR/exeres/1F78002E-0DF6-4171-BD07-BA47E52C05E8.htm">Ariel Industrial Park</a></td>
<td>Ariel</td>
</tr>
<tr>
<td><a href="http://www.caesarea.org.il/park/">Caesarea Industrial and Business Park</a></td>
<td>Caesarea</td>
</tr>
<tr>
<td><a href="http://www.gav-yam.co.il/GavYam/site/gavyam/eng/projects/Assets.asp?fid=286">Gav-Yam Park - Caesarea</a></td>
<td>Caesarea</td>
</tr>
<tr>
<td><a href="http://www.moit.gov.il/NR/exeres/22CF1E2B-646F-4C5F-8680-A17BE562841B.htm">Etzion Industrial Park</a></td>
<td>Efrat</td>
</tr>
<tr>
<td><a href="http://www.gav-yam.co.il/GavYam/site/gavyam/eng/items/popup.asp?fid=285&amp;NP=361">Matam Scientific Industry Park</a></td>
<td>Haifa</td>
</tr>
<tr>
<td><a href="http://jda.co.il/front/ShowCategory.aspx?ItemId=1685">Atarot Industrial Area</a></td>
<td>Jerusalem</td>
</tr>
<tr>
<td><a href="http://www.gatiltd.co.il/location_heb_ram.shtml">Givat Ram Technology Park</a></td>
<td>Jerusalem</td>
</tr>
<tr>
<td><a href="http://jda.co.il/front/ShowCategory.aspx?CatId=106">Givat Sha’ul Industrial Area</a></td>
<td>Jerusalem</td>
</tr>
<tr>
<td><a href="http://www.hotzvim.org.il/">Har Hotzvim Industrial Park</a></td>
<td>Jerusalem</td>
</tr>
<tr>
<td><a href="http://www.gatiltd.co.il/location_heb_malha.shtml">Malha Technology Park</a></td>
<td>Jerusalem</td>
</tr>
<tr>
<td><a href="http://www.karmiel.biz/park.asp">Karmiel Industrial Zone</a></td>
<td>Karmiel</td>
</tr>
<tr>
<td><a href="http://peleg.golan.org.il/">Peleg Golan Industrial Park</a></td>
<td>Katzrin</td>
</tr>
<tr>
<td><a href="http://www.moit.gov.il/NR/exeres/0CD6B733-881E-4F8C-8F2E-9A5D21C373BF.htm">Kiryat Arba Business Park</a></td>
<td>Kiryat Arba</td>
</tr>
<tr>
<td><a href="http://www.ysgat.co.il/">Y.S. Gat Industrial Park</a></td>
<td>Kiryat Gat</td>
</tr>
<tr>
<td><a href="http://www.moit.gov.il/NR/exeres/9145477D-5748-4730-B8B0-A2038F066A28.htm">Adumim Industrial Park</a></td>
<td>Maaleh Adumim</td>
</tr>
<tr>
<td><a href="http://www.maltar.org.il/koren/">Koren Industrial Park</a></td>
<td>Maalot</td>
</tr>
<tr>
<td><a href="http://www.africa-israel.com/nechasim/eng/inner.asp?id=5330&amp;pext=project">Migdal Ha’emek Science Park</a></td>
<td>Migdal HaEmek</td>
</tr>
<tr>
<td><a href="http://www.misgav.org.il/bar_lev/">Bar-Lev Industrial Park</a></td>
<td>Misgav</td>
</tr>
<tr>
<td><a href="http://www.misgav.org.il/teradyon/">Misgav Industrial Park</a></td>
<td>Misgav</td>
</tr>
<tr>
<td><a href="http://www.p-shahak.co.il/">Shahak Industrial Park</a></td>
<td>Nahal Iron</td>
</tr>
<tr>
<td><a href="http://www.africa-israel.com/nechasim/eng/inner.asp?id=5310&amp;pext=project">Kiryat Weizmann Science Park</a></td>
<td>Nes Ziona</td>
</tr>
<tr>
<td><a href="http://www.omer.muni.il/hadover/omer/park_heb.htm">Omer Industrial Park</a></td>
<td>Omer</td>
</tr>
<tr>
<td><a href="http://www.open-museums.co.il/en/tefen/">Tefen Industrial Park</a></td>
<td>Tefen</td>
</tr>
</table>
<p><br/> <br/><br/>
Quand on jette un œil à la <a href="http://www.science.co.il/Technology-Incubators.asp">liste des incubateurs</a>, les <a href="http://www.science.co.il/Venture-Capital-Funds.asp">fonds de capital risque</a>, les universités technologiques, et leur répartition sur le territoire on se rend compte qu’on ne peut plus parler de “silicon valley” mais plutôt de “silicon country” ou “silicon wadi”, le nom local.</p>
<p>Pourquoi Silicon Country ?</p>
<ul>
<li>Universités avec des <a href="http://nicolas.cynober.fr/blog/67,israel-2-une-vision-des-hautes-technologies.html">spécialités dans tous les domaines du high-tech</a>. De la robotique, à l’IT, en passant par les biotechs, toutes les branches sont représentées.</li>
<li>Un réseau de donateurs qui ont supporté la construction de ces universités et qui supportent toujours certains programmes. Des juifs (ou non) du monde entier qui aident le pays à se développer économiquement.</li>
<li>Liens très fort entre les entreprises et les universités (on retrouve <a href="http://www.google.fr/custom?domains=nicolas.cynober.fr&amp;q=San+Francisco+%23&amp;sitesearch=nicolas.cynober.fr&amp;sa=Rechercher&amp;client=pub-4955688586684065&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23E1771E%3BGL%3A1%3BDIV%3A%23FFFFFF%3BVLC%3A66B5FF%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3AFFFFFF%3BALC%3A3D81EE%3BLC%3A3D81EE%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BLH%3A50%3BLW%3A500%3BL%3Ahttp%3A%2F%2Fnicolas.cynober.fr%2Ffiles%2Fblog-banner.png%3BS%3Ahttp%3A%2F%2Fhhttp%3A%2F%2Fnicolas.cynober.fr%2Fblog%2F%3BFORID%3A1&amp;hl=fr">le modèle américain</a>). Très faible taux de chômage des jeunes.</li>
<li>Une fois sortie de l’université avec votre projet. Un bataillon d’investisseurs spécialisés dans le early-stage viennent vous aider à vous lancer. Israël veut d’ailleurs devenir un centre mondial de la finance.</li>
<li>Beaucoup d’incubateurs sont financés par l’état, vous ne payerez rien. Votre entreprise sera crée en 1 jour avec 15$. Je crée actuellement ma propre entreprise, ce n’est pas du tout le même délire ici en France.</li>
<li>On vous aide alors à vous développer à l’international. En effet pas de survie possible sur le marché locale, le business développement est roi.</li>
<li>Le tout dans un contexte multiculturel qu’on retrouve aussi en Californie. Dans la même soirée à Tel-Aviv j’ai rencontré des jeunes travaillant dans la high-tech avec des racines russes, turques, françaises, américaines, éthiopiennes et aux confessions diverses. L’entreprise multiculturelle facteur clé de réussite ?</li>
<li>Aujourd’hui la high-tech représente plus de 50% des exportations.</li>
</ul>
<p>Il me semble qu’Israël est aujourd’hui le pays rêvé des Geeks. Et <a href="http://ouriel.typepad.com/myblog/2008/05/realizing-time.html">nous sommes tous des geeks</a> ? Une économie tournée complètement sur le high-tech, le soleil, des kilomètres de plages superbes, des femmes magnifiques… Et je ne suis pas le seul à avoir fait ce constat, de plus en plus de français effectuent leur <a href="http://fr.altermedia.info/general/emigration-vers-israel-baisse-de-lalya-de-france-depuis-lavenement-de-sarkozy_13288.html">alya</a>, faisant au passage flamber les prix de l’immobilier.</p>
<img height="1" src="http://feeds.feedburner.com/~r/W3f/~4/291520094" width="1"/></div>
    </content>
    <updated>2008-05-16T09:19:26Z</updated>
    <category term="Israel"/>
    <category term="Geek"/>
    <category term="Silicon Country"/>
    <category term="Silicon Valley"/>
    <author>
      <name>Nicolas</name>
    </author>
    <source>
      <id>http://nicolas.cynober.fr/blog</id>
      <author>
        <name>Nicolas Cynober</name>
      </author>
      <link href="http://nicolas.cynober.fr/blog" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/W3f" rel="self" type="application/rss+xml"/>
      <subtitle>Le World Wide Web, en Français ...</subtitle>
      <title>W3F - Web Sémantique, Twine, W3C, Web 3.0, Média - Nicolas Cynober</title>
      <updated>2008-05-16T09:20:49Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://nicolas.cynober.fr/blog/67,israel-2-une-vision-des-hautes-technologies.html</id>
    <link href="http://feeds.feedburner.com/~r/W3f/~3/290859856/67,israel-2-une-vision-des-hautes-technologies.html" rel="alternate" type="text/html"/>
    <title>Israël #2: Une vision des hautes technologies</title>
    <summary>Ce voyage a été tellement dense que je ne saurais par ou commencer. Les parallèles avec la silicon valley californiène sont multiples, je reviendrais dessus. La découverte de ce pays via un axe à la fois historique et technologique est passionnante. Mais aussi la découverte de la culture du pays, qui d’une manière générale a [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img align="left" height="140" src="http://nicolas.cynober.fr/blog/images/israelinside.jpg" width="150"/>Ce voyage a été tellement dense que je ne saurais par ou commencer. Les parallèles avec la silicon valley californiène sont multiples, je reviendrais dessus. La découverte de ce pays via un axe à la fois historique et technologique est passionnante. Mais aussi la découverte de la culture du pays, qui d’une manière générale a été pleine de surprises, je reviendrais peut être dessus dans un billet futur.</p>
<p>J’aimerais donc commencer par un bref article sur ce qu’est la High-Tech en Israël (<a href="http://ashomer.blogspot.com/2008/04/1948-2008-panorama-de-leconomie-disrael.html">les chiffres ici</a>). Pour caricaturer le discours de <a href="http://www.catalyst-fund.com/team.asp?id=1#name13">Yair Shamir</a>, figure emblématique de la high-tech locale, on pourrait résumer cette situation par:</p>
<ul>
<li>Pas de pétrole</li>
<li>Une région désertique</li>
<li>Des voisins moins développés et parfois hostiles</li>
<li>Une nécessité de se concentrer sur des activités à hautes valeurs ajoutées et facilement exportables.</li>
<li>Bien plus que la high-tech, Israël se focalise aujourd’hui sur le “brain”.</li>
</ul>
<p>Je ne vais pas développer ici les facteurs de succès mais j’aimerais tout fois appuyer sur deux notions très importantes. Tout d’abord il faut bien se rendre compte qu’Israël n’a pas de marché locale, ou en tout cas très réduit, et <strong>toutes</strong> les start-up sont donc tournées vers l’internationale. Cela se caractérise par une culture d’entreprise très ouverte, des employés et des investisseurs venant de tous les continents, de toutes religions. Autre point, toutes les personnalités rencontrées dans mon voyage ont évoqués les stratégies de business développement, les partenariats et les opportunités de tel ou tel marché, avec tel ou tel pays. Il y a autant d’entreprise Israélienne au NASDAQ que d’entreprises canadiennes… A cela s’ajoute une fibre entrepreneuriale très forte, on est là-bas bien loin des mentalités françaises…</p>
<p>Le deuxième point se résume par un exemple. Une jeune start-up Israélienne développe actuellement un petit boitier à placer dans votre voiture qui va analyser toutes les caractéristiques de votre conduite (vitesse, accélération, consommation d’essence, etc…). Ce boitier va permettre aux assurances de fournir des tarifs adaptés aux conducteurs. Si vous conduisez bien, vous payerez moins. On pourrait penser que la valeur de l’entreprise réside dans le fait qu’ils seront capables d’équiper toutes les marques, tous les modèles de voiture, de créer des partenariats avec les assurances et les constructeurs, et d’imposer leur standard dans plusieurs pays. Et bien non. On vous apprend là-bas que la vraie valeur réside dans le logiciel permettant de créer le profil du conducteur: un outil très évolué, avec des algorithmes protégés. C’est là que réside le véritable avantage concurrentiel. Tout le reste est copiable d’une manière ou d’une autre par un concurrent.</p>
<p>Résultat ? Tous le reste est “outsourcé” dans différents pays. Le boitier sera très certainement fabriqué en Chine, pays qui prend de plus en plus de place dans la balance du pays. Oubliez les idées préconçues d’un état dépendant des Etats-Unies.</p>
<p>La suite demain…</p>
<p>A voir aussi l’article de Daniel Rouach, qui fait <a href="http://www.israelvalley.com/news/2008/05/15/17381/israel-france-carnet-de-route-escp-eap-les-israeliens-une-incroyable-vitalite-des-grues-des-grues-tout-le-temps">le bilan de ce voyage sur IsraelValley</a>.</p>
<img height="1" src="http://feeds.feedburner.com/~r/W3f/~4/290859856" width="1"/></div>
    </content>
    <updated>2008-05-15T12:06:31Z</updated>
    <category term="Israel"/>
    <category term="Silicon Valley"/>
    <category term="Yair Shamir"/>
    <author>
      <name>Nicolas</name>
    </author>
    <source>
      <id>http://nicolas.cynober.fr/blog</id>
      <author>
        <name>Nicolas Cynober</name>
      </author>
      <link href="http://nicolas.cynober.fr/blog" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/W3f" rel="self" type="application/rss+xml"/>
      <subtitle>Le World Wide Web, en Français ...</subtitle>
      <title>W3F - Web Sémantique, Twine, W3C, Web 3.0, Média - Nicolas Cynober</title>
      <updated>2008-05-16T09:20:49Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://lacot.org/blog/2008/05/14/php-frameworks-for-business.html</id>
    <link href="http://lacot.org/blog/2008/05/14/php-frameworks-for-business.html" rel="alternate" type="text/html"/>
    <title xml:lang="en">PHP Frameworks for business : a white paper</title>
    <summary xml:lang="en">Taken during the play shhh directed by Alexandre Blazy - White masks : it's you, it's me, Flickr

After a very long experience working with various PHP Frameworks, Clever Age has finally published today a White Paper about PHP Frameworks for the business world (in french).

It has taken us a lot of time to produce this document, but I am very glad to have lead its writing and to have co-written such a quality paper. The book deals with various aspects of the PHP Frameworks : functional, technical and strategical questions, and presents with more details several points like authentication, security, extensibility, documentation, etc. Four major frameworks are included in the study and have been evaluated using the QSOS method : CakePHP, CodeIgniter, Symfony, and the Zend Framework.

The paper is written in french, and is available upon request ; we just hope it might help you in the choice of one PHP Framework and/or to improve your developments around PHP.</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p class="illustration">
<img alt="White masks : it's you, it's me" src="http://lacot.org/images/2008/05/white-masks-its-you-its-me.jpg"/>
</p>
<p class="illustration-comment">
Taken during the play <a href="http://www.myspace.com/shhhlapiece" hreflang="fr">shhh</a> directed by Alexandre Blazy - <a href="http://www.flickr.com/photos/clear-cls-key-off/2479745027/"><q>White masks : it's you, it's me</q>, Flickr</a>
</p>
<p>After a very long experience working with various PHP Frameworks, <a href="http://www.clever-age.com/">Clever Age</a> has finally published today a <a href="http://www.clever-age.com/veille/publications/livres-blancs/livre-blanc-frameworks-php-pour-l-entreprise.html" hreflang="fr">White Paper about PHP Frameworks for the business world</a> (in french).</p>
<p>It has taken us a lot of time to produce this document, but I am very glad to have lead its writing and to have co-written such a quality paper. The book deals with various aspects of the PHP Frameworks : functional, technical and strategical questions, and presents with more details several points like authentication, security, extensibility, documentation, etc. Four major frameworks are included in the study and have been evaluated using the <a href="http://www.qsos.org/?lp_lang_pref=en">QSOS</a> method : <a href="http://www.cakephp.org/">CakePHP</a>, <a href="http://codeigniter.com/">CodeIgniter</a>, <a href="http://www.symfony-project.org/">Symfony</a>, and the <a href="http://framework.zend.com">Zend Framework</a>.</p>
<p>The paper is written in french, and is available upon request ; we just hope it might help you in the choice of one PHP Framework and/or to improve your developments around PHP.</p></div>
    </content>
    <updated>2008-05-14T19:25:12Z</updated>
    <author>
      <name>Xavier Lacot</name>
      <email>xavier@lacot.org</email>
    </author>
    <source>
      <id>http://lacot.org/blog</id>
      <author>
        <name>Xavier Lacot</name>
        <email>xavier@lacot.org</email>
      </author>
      <link href="http://lacot.org/blog" rel="alternate" type="text/html"/>
      <link href="http://lacot.org/syndication/blog.atom" rel="self" type="application/atom+xml"/>
      <title xml:lang="en">Chez Xavier - Thoughts</title>
      <updated>2008-05-14T20:27:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.mahalo.com/Microformats</id>
    <link href="http://www.mahalo.com/Microformats" rel="alternate" type="text/html"/>
    <title>Microformats - Mahalo</title>
    <summary>microformats on mahalo</summary>
    <updated>2008-05-14T14:00:32Z</updated>
    <category term="WebSemantique"/>
    <category term="Microformats search websemantique"/>
    <author>
      <name>aurelien</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:24Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.slideshare.net/mstrickland/the-evolution-of-web-30</id>
    <link href="http://www.slideshare.net/mstrickland/the-evolution-of-web-30" rel="alternate" type="text/html"/>
    <title>un site de partage web3</title>
    <updated>2008-05-14T12:44:38Z</updated>
    <category term="WebSemantique"/>
    <category term="mobile web3 websemantique"/>
    <author>
      <name>besquent</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:24Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.biologeek.com/2008/05/failles-de-securite-debian-et-django/</id>
    <link href="http://www.biologeek.com/2008/05/failles-de-securite-debian-et-django/" rel="alternate" type="text/html"/>
    <title xml:lang="fr">Failles de sécurité (Debian et Django)</title>
    <summary type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mettez à jour <a href="http://lists.debian.org/debian-security-announce/2008/msg00152.html">vos serveurs et clefs</a> et <a href="http://www.djangoproject.com/weblog/2008/may/14/security/">vos sources Django</a>.</p></div>
    </summary>
    <updated>2008-05-14T06:58:58Z</updated>
    <author>
      <name>David Larlet</name>
    </author>
    <source>
      <id>http://www.biologeek.com/</id>
      <author>
        <name>David Larlet</name>
      </author>
      <link href="http://www.biologeek.com/" rel="alternate" type="text/html"/>
      <link href="http://biologeek.com/journal/rss.php" rel="self" type="application/atom+xml"/>
      <rights xml:lang="fr">Copyright (c) 2004-2008, David Larlet, Licence (presque) Libre: http://www.biologeek.com/contact/#licence</rights>
      <subtitle xml:lang="fr">Dernières mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle>
      <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title>
      <updated>2008-05-16T14:25:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.websemantique.com/</id>
    <link href="http://www.websemantique.com/" rel="alternate" type="text/html"/>
    <title>web Sémantique | RDF, Dublin Core, SIOC, MicroFormats, Google Base, Référencement SEO, méta-</title>
    <updated>2008-05-13T12:57:31Z</updated>
    <category term="WebSemantique"/>
    <category term="semantique web3 websemantique"/>
    <author>
      <name>besquent</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-14T17:25:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.linux.com/feature/133558</id>
    <link href="http://www.linux.com/feature/133558" rel="alternate" type="text/html"/>
    <title>Brad Neuberg, Google Gears, and the future of the Web - Linux.com</title>
    <updated>2008-05-13T09:43:42Z</updated>
    <category term="WebSemantique"/>
    <category term="Internet ajax database future google informatique innovation interview javascript moteur programming search searchengine software technology web web2.0 websemantique"/>
    <author>
      <name>pablog</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:24Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.powerset.com/</id>
    <link href="http://www.powerset.com/" rel="alternate" type="text/html"/>
    <title>Powerset</title>
    <updated>2008-05-13T09:41:41Z</updated>
    <category term="WebSemantique"/>
    <category term="Internet datamining findability innovation interface language mashup moteur search searchengine web web2.0 websemantique wikipedia"/>
    <author>
      <name>pablog</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.biologeek.com/2008/05/sharkwater-les-seigneurs-de-la-mer/</id>
    <link href="http://www.biologeek.com/2008/05/sharkwater-les-seigneurs-de-la-mer/" rel="alternate" type="text/html"/>
    <title xml:lang="fr">SharkWater (les seigneurs de la mer)</title>
    <summary type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>Si vous n'avez pas peur de déprimer, c'est <a href="http://www.sharkwater.com/">un excellent documentaire</a>. Certaines choses paraissent tellement insignifiantes après ça... le monde va mal.</p></div>
    </summary>
    <updated>2008-05-13T07:56:56Z</updated>
    <author>
      <name>David Larlet</name>
    </author>
    <source>
      <id>http://www.biologeek.com/</id>
      <author>
        <name>David Larlet</name>
      </author>
      <link href="http://www.biologeek.com/" rel="alternate" type="text/html"/>
      <link href="http://biologeek.com/journal/rss.php" rel="self" type="application/atom+xml"/>
      <rights xml:lang="fr">Copyright (c) 2004-2008, David Larlet, Licence (presque) Libre: http://www.biologeek.com/contact/#licence</rights>
      <subtitle xml:lang="fr">Dernières mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle>
      <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title>
      <updated>2008-05-16T14:25:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://apassant.net/blog/2008/05/13/sioc-based-microblogging/</id>
    <link href="http://apassant.net/blog/2008/05/13/sioc-based-microblogging/" rel="alternate" type="text/html"/>
    <title>SIOC-based microblogging</title>
    <summary>As John Breslin already detailed last week, we (Tuukka Hastrup, Uldis Bojars, John and myself) recently work on SMOB, a semantic microblogging architecture, that will be presented at next SFSW workshop, co-located with ESWC in Tenerife.

While there have been a lot of buzz recently regarding ways to provide open alternatives ...</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>As <a href="http://johnbreslin.com">John Breslin</a> already <a href="http://www.johnbreslin.com/blog/2008/05/09/prototype-for-distributed-decentralised-microblogging-using-semantics/">detailed</a> last week, we (<a href="http://tuukka.iki.fi/">Tuukka Hastrup</a>, <a href="http://captsolo.net">Uldis Bojars</a>, John and myself) recently work on <a href="http://smob.sioc-project.org">SMOB</a>, a semantic microblogging architecture, that will be <a href="http://www.semanticscripting.org/SFSW2008/papers/11.pdf">presented</a> at next <a href="http://semanticscripting.org/SFSW08">SFSW</a> workshop, co-located with <a href="http://eswc2008.org">ESWC</a> in Tenerife.</p>
<p>While there have been <a href="http://www.techcrunch.com/2008/05/05/twitter-can-be-liberated-heres-how/">a</a> <a href="http://chrissaad.wordpress.com/2008/05/05/decentralized-microblogging-twitter-20/">lot</a> <a href="http://www.scripting.com/stories/2008/05/04/whyDecentralizingTwitterIs.html">of</a> <a href="http://blog.broadbandmechanics.com/2008/05/rss-xmpp-decentralized-twitter">buzz</a> recently regarding ways to provide open alternatives to Twitter, then fun thing is that we worked on this in last January while I visited <a href="http://deri.ie">DERI</a>. Our main goal was to show how Semantic Web technologies could provide an open-platform for such way of publishing content, mainly using <a href="http://foaf-project.org">FOAF</a> and <a href="http://sioc-project.org">SIOC</a>. Moreover, one of our aim was also to demonstrate how such technologies can provide users a way to control, share and remix their data as they want, not depending on a third-party service, a goal also shared by the <a href="http://dataportability.org">dataportability</a> project. In that way, SMOB-published data really belongs to the user that wrote it. Indeed, while SMOB servers (which display a faceted view of agregated posts as you can see on the <a href="http://smob.sioc-project.org/server/">demo server</a>) store data in their local triple-store, this information (i.e. each update) is hosted on the client side and available in RDF.</p>
<p>At the moment, the complete updates dataset is public, and can be browsed with any RDF browser as the picture below shows (with <a href="http://dig.csail.mit.edu/2007/tab/">Tabulator</a>) but we plan to introduce more advanced authentication and privacy issues, in which <a href="http://openid.net">OpenID</a> could have a role to play.</p>
<p style="text-align: center;"><img alt="smob-rdf.png" src="http://apassant.net/wp/../uploads/2008/05/smob-rdf.png"/></p>
<p>Users can parse it as any RDF data, mash-it up with other information, eg their FOAF profile (SMOB allows to <a href="http://smob.googlecode.com/svn/trunk/client/config_dist.php">re-use</a> existing FOAF profile as the <code>foaf:maker</code> of each update), or any other RDF data. And most important, if a SMOB server closes, they still own their data.</p>
<p>Moreover, since SMOB content is SIOC-based, it becomes part of the SIOC-o-sphere, and could be merged with your other social media contributions (from any <a href="http://sioc-project.org/applications">SIOC application</a>) and discovered thanks to recent <a href="http://sindice.com/dev?section=siocapi">APIs</a> and <a href="http://sindice.com/dev?section=siocwidget">WordPress plug-in</a> introduced by <a href="http://sindice.com">Sindice</a> (automatic <a href="http://pingthesemanticweb.com">PTSW</a> / Sindice pings will be soon in the code <a href="http://smob.googlecode.com/svn/trunk/">repository</a>). This is one more advantage of getting a common semantics to model your data wherever they come from.</p>
<p style="text-align: center;"><img alt="smobsphere.png" src="http://apassant.net/wp/../uploads/2008/05/smobsphere.png"/></p>
<p>Finally, we just introduced in <a href="http://smob.googlecode.com">SMOB</a> a way to publish not only to a dedicated server, but also to Twitter. So that you’ll get a real-time, self-hosted and long-life archive of your twits in RDF. Isn’t that cool ?</p>
<p style="text-align: center;"><img alt="smob-tw.png" src="http://apassant.net/uploads/2008/05/smob-tw.png"/></p></div>
    </content>
    <updated>2008-05-12T23:04:25Z</updated>
    <category term="WebSemantique"/>
    <category term="Semantic Web"/>
    <category term="dataportability"/>
    <category term="microblogging"/>
    <category term="sioc"/>
    <category term="smob"/>
    <category term="twitter"/>
    <author>
      <name>Alex</name>
    </author>
    <source>
      <id>http://apassant.net</id>
      <author>
        <name>Alexandre Passant</name>
      </author>
      <link href="http://apassant.net" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/apassant/blog" rel="self" type="application/rss+xml"/>
      <title>Alexandre Passant</title>
      <updated>2008-05-12T23:04:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://fr.techcrunch.com/2008/05/12/premiere-presentation-de-powerset-le-moteur-de-recherche-semantique/</id>
    <link href="http://fr.techcrunch.com/2008/05/12/premiere-presentation-de-powerset-le-moteur-de-recherche-semantique/" rel="alternate" type="text/html"/>
    <title>TechCrunch en français " Première présentation de Powerset, le moteur de recherche sémantique</title>
    <updated>2008-05-12T14:40:41Z</updated>
    <category term="WebSemantique"/>
    <category term="internet webs&#xE9;mantique"/>
    <author>
      <name>melasse</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.lespetitescases.net/moat-donner-du-sens-a-vos-tags</id>
    <link href="http://www.lespetitescases.net/moat-donner-du-sens-a-vos-tags" rel="alternate" type="text/html"/>
    <title>MOAT : donner du sens à vos tags | Les petites cases</title>
    <updated>2008-05-12T13:47:55Z</updated>
    <category term="WebSemantique"/>
    <category term="folksonomy tag tagging web webs&#xE9;mantique"/>
    <author>
      <name>melasse</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://fr.techcrunch.com/2008/04/26/la-recherche-par-mots-clefs-atteint-elle-ses-limites/</id>
    <link href="http://fr.techcrunch.com/2008/04/26/la-recherche-par-mots-clefs-atteint-elle-ses-limites/" rel="alternate" type="text/html"/>
    <title>TechCrunch en français " La recherche par mots-clefs atteint-elle ses limites?</title>
    <updated>2008-05-12T08:53:48Z</updated>
    <category term="WebSemantique"/>
    <category term="Search WebSemantique"/>
    <author>
      <name>alexismons</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/</id>
    <link href="http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/" rel="alternate" type="text/html"/>
    <title xml:lang="fr">Bonnes pratiques et astuces Python</title>
    <summary type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>Ça faisait un moment que je n'avais pas parlé des 
<a href="http://www.biologeek.com/bonnes-pratiques,python/">bonnes pratiques Python</a> mais l'approche de 
<a href="http://fr.pycon.org/">Pycon fr</a> (où je présenterai Django : 
<a href="http://fr.pycon.org/programme/pourquoi-django/">le pourquoi</a> et 
<a href="http://fr.pycon.org/programme/django-au-quotidien-qualite-et-performances/">le comment</a> 
le 18 mai), l'événement Python incontournable avec 
<a href="http://fr.pycon.org/programme/">un programme des plus alléchants</a>, m'a bien 
motivé pour effectuer la traduction de 
l'<a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/">une des meilleures présentation</a> 
par <a href="http://python.net/~goodger/">David Goodger</a> que je connaisse qui remet 
les bonnes pratiques Python à plat, ce qui est toujours bon avant d'aller plus loin.</p>
<h2>La lisibilité est importante</h2>
<blockquote>
<p>Les programmes doivent être écrits pour être lus par des gens et 
    accidentellement exécutés par les machines.</p>
<p>-- Abelson &amp; Sussman, <em>Structure and Interpretation of Computer Programs</em></p>
</blockquote>
<p>Essayez de rendre vos programmes faciles à lire et évidents.</p>
<h2>PEP 8 : Style Guide pour le code Python</h2>
<p>Une lecture immanquable : <a href="http://www.python.org/dev/peps/pep-0008/">http://www.python.org/dev/peps/pep-0008/</a> 
(PEP = Python Enhancement Proposal)</p>
<p>Un PEP est une document procurant des informations à la communauté Python, ou
décrivant une nouvelle fonctionnalité de Python et ses processus ou de son
environnement.</p>
<p>La communauté Python a ses propres standards sur ce à quoi doit ressembler le
code, codifiés dans le PEP8. Ces standards sont différents de ceux des autres
communautés, comme C, Java, etc.</p>
<p>L'indentation et les espaces étant si importants en Python, ce Style Guide est
une standard. Il est important que vous adhériez au guide ! La plupart des
projets suivent ces conventions.</p>
<h2>Whitespace 1</h2>
<ul>
<li>4 espaces par niveau d'indentation.</li>
<li>Pas de tabs.</li>
<li>Ne <strong>jamais</strong> mixer des tabs et des espaces.</li>
<li>Un saut de ligne entre les fonctions.</li>
<li>Deux sauts de ligne entre les classes.</li>
</ul>
<h2>Whitespace 2</h2>
<ul>
<li>Ajoutez un espace après ", ", dans les dictionnaires, les listes, les
tuples, les arguments d'une liste d'arguments et après ":" dans les
dictionnaires mais pas avant.</li>
<li>Mettez des espaces autour des assignements et des comparaisons (excepté
pour les arguments d'une liste).</li>
<li>Pas d'espace aux ouvertures/fermetures de parenthèses ou juste avant une
liste d'arguments.</li>
<li><p>Pas d'espace en ouverture/fermeture de docstrings.</p>
<pre><code>def make_squares(key, value=0):
    """Return a dictionary and a list..."""
    d = {key: value}
    l = [key, value]
    return d, l
</code></pre></li>
</ul>
<h2>Nommage</h2>
<ul>
<li><code>joined_lower</code> pour les fonctions, méthodes et attributs</li>
<li><code>joined_lower</code> ou <code>ALL_CAPS</code> pour les constantes</li>
<li><code>StudlyCaps</code> pour les classes</li>
<li><code>camelCase</code> <strong>seulement</strong> pour suivre des conventions pré-existantes</li>
<li>Attributs: <code>interface</code>, <code>_internal</code>, <code>__private</code></li>
</ul>
<p>Mais essayez d'éviter la forme <code>__privée</code>. Je ne l'utilise jamais.
Faites moi confiance. Si vous l'utilisez, vous le regretterez plus tard.</p>
<h2>Longues lignes et continuité</h2>
<p>Garder une taille de ligne inférieure à 80 caractères.</p>
<p>Utilisez la continuité implicite des lignes au sein des 
parenthèses/crochets/accolades :</p>
<pre><code>def __init__(self, first, second, third,
             fourth, fifth, sixth):
    output = (first + second + third
              + fourth + fifth + sixth)
</code></pre>
<p>Utilisez les backslashs en dernier recours :</p>
<pre><code>VeryLong.left_hand_side \
    = even_longer.right_hand_side()
</code></pre>
<p>Les backslashs sont locaux, ils doivent terminer la ligne sur laquelle
ils sont. Si vous ajoutez un espace après le backslash, ça ne sert à rien.
Ah aussi, c'est laid.</p>
<h2>Longues chaînes de caractères</h2>
<p>Les chaînes de caractères adjacentes sont concaténées par le parser:</p>
<pre><code>&gt;&gt;&gt; print 'o' 'n' "e"
one
</code></pre>
<p>Les espaces entre les chaînes ne sont pas requis, mais aident à la 
lisibilité. Tous les types de quotes sont utilisable :</p>
<pre><code>&gt;&gt;&gt; print 't' r'\/\/' """o"""
t\/\/o
</code></pre>
<p>La chaîne précédée par "r" est une chaîne de type "raw". Les backslashs
ne sont pas évalués comme étant des caractères d'échappement dans les 
chaînes de type raw. Elles sont utiles pour les expressions régulières
et les chemins de fichiers Windows.</p>
<p>Notez que les chaînes de caractères nommées <strong>ne sont pas</strong> concaténées :</p>
<pre><code>&gt;&gt;&gt; a = 'three'
&gt;&gt;&gt; b = 'four'
&gt;&gt;&gt; a b
  File "&lt;stdin&gt;", line 1
    a b
      ^
SyntaxError: invalid syntax
</code></pre>
<p>Cela vient du fait que la concaténation automatique est une fonctionnalité
du parser/compiler Python, pas de l'interpréteur. Vous devez utiliser le 
signe "+" pour concaténer des chaînes de caractères à l'éxecution.</p>
<pre><code>text = ('Long strings can be made up '
        'of several shorter strings.')
</code></pre>
<p>Les parenthèses autorisent la continuité implicite des lignes.
Les chaînes de caractères sur plusieurs lignes utilisent les triple quotes :</p>
<pre><code>"""Triple
double
quotes"""

'''\
Triple
single
quotes\
'''
</code></pre>
<p>Dans le dernier exemple ci-dessus (simple triple quotes), notez 
l'utilisation du backslash pour échapper les nouvelles lignes. Cela élimine
les nouvelles lignes en conservant les quotes joliment alignées à gauche.
Les backslashs doivent être à la fin de leurs lignes.</p>
<h2>Déclarations</h2>
<p>Bon :</p>
<pre><code>if foo == 'blah':
    do_something()
do_one()
do_two()
do_three()
</code></pre>
<p>Mauvais :</p>
<pre><code>if foo == 'blah': do_something()
do_one(); do_two(); do_three()
</code></pre>
<p>Les espaces et l'indentation sont de bons indicateurs visuels du flot du
programme. L'indentation de la seconde ligne du "Bon" ci-dessus montre
au lecteur que quelque chose va se produire, alors que le manque
d'indentation dans le "Mauvais" exemple cache le "if".</p>
<p>Les déclarations multiples sur une même ligne sont une torture.
En Python, <em>la lisibilité compte</em>.</p>
<h2>Docstrings et Commentaires</h2>
<p>Docstrings = <strong>Comment utiliser</strong> le code</p>
<p>Commentaires = <strong>Pourquoi</strong> (rationnel) et <strong>comment le code fonctionne</strong></p>
<p>Les docstrings expliquent <strong>comment</strong> utiliser le code et sont là pour
<strong>les utilisateurs</strong> de votre code. Quelques usages :</p>
<ul>
<li>Expliquer le but d'une fonction même si ça vous semble évident car ça ne
semblera pas forcément évident à une personne plus tard.</li>
<li>Décrire les paramètres attendus, les valeurs retournées et les exceptions
levées.</li>
<li>Si la méthode est fortement couplée à un seul appelant, mentionner
la fonction appelante (attention au fait que celle-ci puisse changer).</li>
</ul>
<p>Les commentaires expliquent <strong>pourquoi</strong> et sont pour les mainteneurs de 
votre code. Examples incluant des notes pour vous-même, comme :</p>
<pre><code># !!! BUG: ...

# !!! FIX: This is a hack

# ??? Why is this here?
</code></pre>
<p>Les deux types sont de <strong>votre</strong> ressort donc écrivez de bonnes docstrings
et de bons commentaires !</p>
<p>Les docstrings sont utiles pour un usage interactif (<code>help()</code>) et pour
les systèmes d'auto-documentation.</p>
<p>Les commentaires et docstrings faux sont pire que tout. Donc conservez les
à jour ! Lorsque vous effectuez des modifications, assurez vous que les
commentaires et les docstrings sont cohérents avec le code.</p>
<p>Il y a <a href="http://www.python.org/dev/peps/pep-0257/">un PEP entier consacré aux docstrings, PEP 257, "Docstring
Conventions"</a>.</p>
<h2>La pratique a raison de la théorie</h2>
<p>Il y a toujours des exceptions. Issu du PEP 8 :</p>
<blockquote>
<p>Mais plus important : sachez être pertinents - parfois le style guide ne 
    s'applique pas. Lorsque vous avez un doute, utilisez votre raison. Étudiez 
    d'autres possibilités et décidez de ce qui vous semble le mieux. 
    Et n'hésitez pas à demander !
  Deux bonnes raisons de ne pas suivre une règle particulière :</p>
<p>(1) Lorsque appliquer la règle va rendre le code moins lisible, même pour 
    quelqu'un qui est habitué à lire du code qui suit les règles.</p>
<p>(2) Pour être cohérent avec du code préexistant qui enfreint aussi ces règles 
    (peut-être pour des raisons historiques) -- même si c'est aussi une opportunité 
    pour faire un peu de nettoyage (dans un pur style XP).</p>
</blockquote>
<p>... mais la pratique ne doit pas réduire la théorie à néant !</p>
<p>On plonge maintenant au cœur du tutoriel : les astuces. On va commencer avec 
les plus faciles et augmenter progressivement le niveau.</p>
<h2>Variables intermédiaires</h2>
<p>Dans les autres langages :</p>
<pre><code>temp = a
a = b
b = temp
</code></pre>
<p>En Python :</p>
<pre><code>b, a = a, b
</code></pre>
<p>Vous l'avez peut-être déjà rencontré mais savez vous comment ça fonctionne ?</p>
<ul>
<li>La <strong>virgule</strong> est la syntaxe de construction du tuple.</li>
<li>Un tuple est créé à droite (tuple packing).</li>
<li>Un tuple en est la cible à gauche (tuple unpacking).</li>
</ul>
<p>La partie à droite est <strong>unpackée</strong> dans les noms de tuple de la partie à
gauche.</p>
<p>D'autres exemples:</p>
<pre><code>&gt;&gt;&gt; l =['David', 'Pythonista', '+1-514-555-1234']
&gt;&gt;&gt; name, title, phone = l
&gt;&gt;&gt; name
'David'
&gt;&gt;&gt; title
'Pythonista'
&gt;&gt;&gt; phone
'+1-514-555-1234'
</code></pre>
<p>Utile dans les boucles sur des données structurées (la variable <code>l</code> 
ci-dessus a été conservée) :</p>
<pre><code>&gt;&gt;&gt; people = [l, ['Guido', 'BDFL', 'unlisted']]
&gt;&gt;&gt; for (name, title, phone) in people:
...     print name, phone
...
David +1-514-555-1234
Guido unlisted
</code></pre>
<p>Chaque item de <code>people</code> est unpacké dans le tuple <code>(name, title, phone)</code>.</p>
<p>Il est aussi possible de faire le chemin inverse, il faut juste s'assurer
d'avoir la même structure à droite et à gauche :</p>
<pre><code>&gt;&gt;&gt; david, (gname, gtitle, gphone) = people
&gt;&gt;&gt; gname
'Guido'
&gt;&gt;&gt; gtitle
'BDFL'
&gt;&gt;&gt; gphone
'unlisted'
&gt;&gt;&gt; david
['David', 'Pythonista', '+1-514-555-1234']
</code></pre>
<h2>Aller plus loin avec les tuples</h2>
<p>On a vu que la <strong>virgule</strong> était le constructeur du tuple, pas les 
parenthèses. Par exemple :</p>
<pre><code>&gt;&gt;&gt; 1,
(1,)
</code></pre>
<p>L'interpréteur Python montre les parenthèses pour que ce soit plus clair
et je vous conseille de faire de même :</p>
<pre><code>&gt;&gt;&gt; (1,)
(1,)
</code></pre>
<p>Mais n'oubliez pas la virgule !</p>
<pre><code>&gt;&gt;&gt; (1)
1
</code></pre>
<p>Dans un tuple contenant un seul élément, la virgule est nécessaire. Dans
un tuple avec plus de 2 éléments, la virgule finale est optionnelle.
Pour un tuple vide, une paire de parenthèses suffit :</p>
<pre><code>&gt;&gt;&gt; ()
()

&gt;&gt;&gt; tuple()
()
</code></pre>
<p>Une erreur de typo courante est de laisser une virgule alors que vous ne
souhaitez pas avoir un tuple. Il est très facile de l'oublier dans votre
code :</p>
<pre><code>&gt;&gt;&gt; value = 1,
&gt;&gt;&gt; value
(1,)
</code></pre>
<p>Donc si vous vous retrouvez avec un tuple alors que vous ne vous y 
attendiez pas, cherchez la virgule ! (<em>Note du traducteur</em> : de ma propre
expérience, il est plus courant d'oublier la virgule pour un tuple ne 
contenant qu'un seul élément, dans les settings de Django par exemple,
cherchez plutôt la virgule manquante dans ces cas là).</p>
<h2>Le "_" interactif</h2>
<p>C'est une fonctionnalité très utile que peu de développeurs connaissent.
(<em>Note du traducteur</em> : bien entendu 
<a href="http://www.biologeek.com/bonnes-pratiques,python/python-et-underscore/">vous n'en faites pas partie</a> 
et vous connaissez les dangers associés.)</p>
<p>Dans un interpréteur interactif, que vous évaluiez une expression ou que
vous appeliez une fonction, le résultat est stocké dans une variable
temporaire, <code>_</code> (un underscore) :</p>
<pre><code>&gt;&gt;&gt; 1 + 1
2
&gt;&gt;&gt; _
2
</code></pre>
<p><code>_</code> stocke la dernière valeur <em>affichée</em>.</p>
<p>Lorsqu'un résultat vaut <code>None</code>, rien n'est affiché, donc <code>_</code> ne change
pas. C'est normal !</p>
<p>Ça ne marche que dans un interpréteur interactif, pas dans un module.</p>
<p>C'est particulièrement utile lorsque vous travaillez sur un problème de
manière interactive, et que vous souhaitez stocker la valeur du dernier
résultat :</p>
<pre><code>&gt;&gt;&gt; import math
&gt;&gt;&gt; math.pi / 3
1.0471975511965976
&gt;&gt;&gt; angle = _
&gt;&gt;&gt; math.cos(angle)
0.50000000000000011
&gt;&gt;&gt; _
0.50000000000000011
</code></pre>
<h2>Construction de chaînes de caractères</h2>
<p>Commençons avec une liste de chaînes de caractères :</p>
<pre><code>colors = ['red', 'blue', 'green', 'yellow']
</code></pre>
<p>On veut concaténer ces chaînes ensemble pour en créer une longue.
Particulièrement lorsque le nombre de sous-chaînes est gros...</p>
<p>Ne faites pas :</p>
<pre><code>result = ''
for s in colors:
    result += s
</code></pre>
<p>C'est très lent.
Ça utilise énormément de mémoire et de performances. La somme va additionner,
stocker, et ensuite passer à la suite pour chaque étape intermédiaire.</p>
<p>Faites plutôt ceci :</p>
<pre><code>result = ''.join(colors)
</code></pre>
<p>La méthode <code>join()</code> fait toute la copie en une seule passe.</p>
<p>Lorsque vous ne traitez qu'une petite centaine de chaînes de caractères,
ça ne fait aucune différence. Mais prenez l'habitude de construire vos
chaînes de façon optimale, car avec des milliers ou des boucles, ça <strong>va</strong>
faire la différence.</p>
<h2>Construire des chaînes, solutions 1</h2>
<p>Voici quelques techniques pour utiliser la méthode <code>join()</code>.</p>
<p>Si vous voulez un espace comme séparateur :</p>
<pre><code>result = ' '.join(colors)
</code></pre>
<p>ou une virgule et un espace :</p>
<pre><code>result = ', '.join(colors)
</code></pre>
<p>voici un cas courant d'utilisation :</p>
<pre><code>colors = ['red', 'blue', 'green', 'yellow']
print 'Choose', ', '.join(colors[:-1]), \
      'or', colors[-1]
</code></pre>
<p>Pour faire une phrase grammaticalement correcte, on veut des virgules entre
chaque valeurs sauf la dernière, où l'on préfère un "ou". La syntaxe de
découpage d'une liste s'occupe du reste. La "partie jusqu'à -1" (<code>[:-1]</code>) 
retourne tout sauf la dernière valeur, que l'on peut concaténer avec nos
virgules.</p>
<p>Bien sûr, ce code ne fonctionnera pas avec les cas particuliers comme une
liste de taille 0 ou 1. Ce qui retourne :</p>
<pre><code>Choose red, blue, green or yellow
</code></pre>
<h2>Construire des chaînes, solutions 2</h2>
<p>Vous avez besoin d'appliquer une fonction pour générer les chaînes initiales :</p>
<pre><code>result = ''.join(fn(i) for i in items)
</code></pre>
<p>Ça utilise une <em>generator expression</em>, dont on parlera plus tard.</p>
<p>Si vous devez modifier les chaînes de manière incrémentale, commencez par
les stocker dans une liste pour commencer :</p>
<pre><code>items = []
...
items.append(item)  # de nombreuses fois
...
# une fois la liste complétée
result = ''.join(fn(i) for i in items)
</code></pre>
<p>On accumule les parties de la liste afin de pouvoir appliquer le <code>join</code>,
ce qui est plus rapide.</p>
<h2>Utilisez <code>in</code> lorsque c'est possible (1)</h2>
<p>Bon :</p>
<pre><code>for key in d:
    print key
</code></pre>
<ul>
<li><code>in</code> est généralement plus rapide.</li>
<li>Ce pattern marche aussi pour des items dans des containers arbitraires 
(comme les listes, les tuples ou les tests).</li>
<li><code>in</code> est aussi un opérateur (comme on va le voir).</li>
</ul>
<p>Mauvais :</p>
<pre><code>for key in d.keys():
    print key
</code></pre>
<p>C'est limité aux objects ayant une méthode <code>keys()</code>.</p>
<h2>Utilisez <code>in</code> lorsque c'est possible (2)</h2>
<p>Mais <code>.keys()</code> est <strong>nécessaire</strong> lorsque vous modifiez le dictionnaire :</p>
<pre><code>for key in d.keys():
    d[str(key)] = d[key]
</code></pre>
<p><code>d.keys()</code> crée une liste statique des clés du dictionnaire. Sinon, vous 
allez lever une exception "RuntimeError: dictionary changed size during iteration".</p>
<p>Utilisez <code>key in dict</code>, et non <code>dict.has_key()</code> :</p>
<pre><code># faites ça :
if key in d:
    ...do something with d[key]

# mais pas ça :
if d.has_key(key):
    ...do something with d[key]
</code></pre>
<p><code>in</code> est ici utilisé comme un opérateur.</p>
<h2>La méthode <code>get</code> des dictionnaires</h2>
<p>On doit souvent initialiser les entrées d'un dictionnaire avant de les utiliser:</p>
<p>Voici la manière naïve de faire :</p>
<pre><code>navs = {}
for (portfolio, equity, position) in data:
    if portfolio not in navs:
        navs[portfolio] = 0
    navs[portfolio] += position * prices[equity]
</code></pre>
<p><code>dict.get(key, default)</code> permet de ne pas avoir à se soucier du test :</p>
<pre><code>navs = {}
for (portfolio, equity, position) in data:
    navs[portfolio] = (navs.get(portfolio, 0)
                       + position * prices[equity])
</code></pre>
<p>Beaucoup mieux.</p>
<h2>La méthode <code>setdefault</code> des dictionnaires (1)</h2>
<p>Ici on doit initialiser les valeurs d'un dictionnaire mutables. Chaque valeur 
du dictionnaire sera une liste. Voici la manière naïve :</p>
<pre><code>equities = {}
for (portfolio, equity) in data:
    if portfolio in equities:
        equities[portfolio].append(equity)
    else:
        equities[portfolio] = [equity]
</code></pre>
<p><code>dict.setdefault(key, default)</code> s'occupe de ça de manière beaucoup plus rapide :</p>
<pre><code>equities = {}
for (portfolio, equity) in data:
    equities.setdefault(portfolio, []).append(equity)
</code></pre>
<p><code>dict.setdefault()</code> est équivalent à "get ou set &amp; get".  Ou 
"set si nécessaire, puis get". C'est particulièrement rapide si votre clé de 
dictionnaire est coûteuse à générer ou longue à taper.</p>
<p>Le seul problème avec <code>dict.setdefault()</code> c'est que la valeur par défaut est 
évaluée, qu'elle soit utilisée ou non. Ça ne pose problème que si la clé est 
coûteuse à calculer.</p>
<p>Si la valeur par défaut <strong>est</strong> coûteuse à calculer, vous devriez plutôt
utiliser la classe <code>defaultdict</code>.</p>
<h2>La méthode <code>setdefault</code> des dictionnaires (2)</h2>
<p>On va voir qu'il est possible d'utiliser <code>setdefault</code> pour déclarer une valeur par défaut :</p>
<pre><code>navs = {}
for (portfolio, equity, position) in data:
    navs.setdefault(portfolio, 0)
    navs[portfolio] += position * prices[equity]
</code></pre>
<p>La méthode <code>setdefault</code> d'un dictionnaire retourne la valeur par défaut, mais 
nous l'ignorons ici. On tire profit d'une conséquence de l'utilisation de 
<code>setdefault</code>, la valeur n'est initialisée que si elle n'existe pas déjà.</p>
<h2><code>defaultdict</code></h2>
<p>Nouveau avec Python 2.5.</p>
<p><code>defaultdict</code> est nouveau dans Python 2.5, il fait partie du module 
<code>collections</code>. <code>defaultdict</code> est identique aux dictionnaires classiques, 
excepté pour deux cas :</p>
<ul>
<li>il prend un premier argument optionnel : une fonction factory par défaut</li>
<li>lorsqu'une clé de dictionnaire est rencontrée pour la première fois, la
fonction factory par défaut est appelée et le résultat initialise la
valeur du dictionnaire.</li>
</ul>
<p>Il y a deux manières d'accéder à <code>defaultdict</code> :</p>
<ul>
<li><p>importer le module <code>collections</code> et l'appeler à travers le module :</p>
<pre><code>import collections
d = collections.defaultdict(...)
</code></pre></li>
<li><p>ou importer <code>defaultdict</code> directement :</p>
<pre><code>from collections import defaultdict
d = defaultdict(...)
</code></pre></li>
</ul>
<p>Voici l'exemple déjà traité, où chaque valeur du dictionnaire fois être 
initialisé pour être une liste vide, réécrit en utilisant <code>defaultdict</code> :</p>
<pre><code>from collections import defaultdict

equities = defaultdict(list)
for (portfolio, equity) in data:
    equities[portfolio].append(equity)
</code></pre>
<p>Il n'y a plus d'astuce ici. Dans ce cas, la fonction factory par défaut est 
<code>list</code>, ce qui retourne une liste vide.</p>
<p>C'est la manière d'avoir un dictionnaire avec les valeurs par défaut à 0, 
utilisez <code>int</code> comme factory :</p>
<pre><code>navs = defaultdict(int)
for (portfolio, equity, position) in data:
    navs[portfolio] += position * prices[equity]
</code></pre>
<p>Il faut faire attention à <code>defaultdict</code> quand même. Vous ne pouvez pas 
utiliser l'exception <code>KeyError</code> sur un dictionnaire initialisé avec <code>defaultdict</code>. 
Vous devez utiliser la condition "key in dict" si vous voulez vérifier 
l'existence d'une clé de manière spécifique.</p>
<h2>Construire et scinder des dictionnaires</h2>
<p>Voila une technique utile pour construire un dictionnaire à partir de deux 
listes (ou séquences), une liste pour les clés, une liste pour les valeurs :</p>
<pre><code>given = ['John', 'Eric', 'Terry', 'Michael']
family = ['Cleese', 'Idle', 'Gilliam', 'Palin']
pythons = dict(zip(given, family))
&gt;&gt;&gt; pprint.pprint(pythons)
{'John': 'Cleese',
 'Michael': 'Palin',
 'Eric': 'Idle',
 'Terry': 'Gilliam'}
</code></pre>
<p>L'inverse est trivial bien sûr :</p>
<pre><code> &gt;&gt;&gt; pythons.keys()
 ['John', 'Michael', 'Eric', 'Terry']
 &gt;&gt;&gt; pythons.values()
 ['Cleese', 'Palin', 'Idle', 'Gilliam']
</code></pre>
<p>Notez que l'ordre du résultat des .keys() et .values() à est différent des 
listes utilisées lors de la création du dictionnaire. L'ordre d'entrée est 
différent de l'ordre de sortie car un dictionnaire n'est pas ordonné. 
Par contre, l'ordre des clés est consistant avec celui des valeurs, à condition 
que le dictionnaire n'ait pas été modifié entre temps.</p>
<h2>Tester des valeurs vraies</h2>
<p>Il est élégant et rapide de tirer partie des avantages de Python en ce qui 
concerne les valeurs booléennes :</p>
<pre><code># faites ça :     # et pas ça :
if x:             if x == True:
    pass              pass
</code></pre>
<p>Test d'une liste :</p>
<pre><code># faites ça :     # et pas ça :
if items:         if len(items) != 0:
    pass              pass

                  # et surtout pas ça :
                  if items != []:
                      pass
</code></pre>
<h2>Valeurs vraies</h2>
<p>Les noms <code>True</code> et <code>False</code> sont des instances intrinsèques à Python de type 
<code>bool</code>, des valeurs booléennes. Comme <code>None</code>, il n'existe qu'une seule 
instance de chaque.</p>
<table>
<thead>
<tr>
<th>
                False
            </th>
<th>
                True
            </th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>False</code> (== 0)
            </td>
<td>
<code>True</code> (== 1)
            </td>
</tr>
<tr>
<td>
<code>""</code> (empty string) 
            </td>
<td>
                toutes les chaînes à part <code>""</code> (<code>" "</code>, 
                <code>"nimportequoi"</code>)
            </td>
</tr>
<tr>
<td>
<code>0</code>, <code>0.0</code>
</td>
<td>
                n'importe quel chiffre à part <code>0</code>
                (1, 0.1, -1, 3.14)
            </td>
</tr>
<tr>
<td>
<code>[]</code>, <code>()</code>, 
                <code>{}</code>, <code>set()</code>
</td>
<td>
                n'importe quel container non vide
                (<code>[0]</code>, <code>(None,)</code>, <code>['']</code>)
            </td>
</tr>
<tr>
<td>
<code>None</code>
</td>
<td>
                pratiquement tous les objets qui ne sont
                explicitement équivalents à False
            </td>
</tr>
</tbody>
</table>
<p>Voici par exemple un objet qui est toujours vrai :</p>
<pre><code>&gt;&gt;&gt; class C:
...  pass
...
&gt;&gt;&gt; o = C()
&gt;&gt;&gt; bool(o)
True
&gt;&gt;&gt; bool(C)
True
</code></pre>
<p>Pour contrôler la valeur booléenne d'une instance ou d'une classe définie, 
utilisez les méthodes spéciales <code>__nonzero__</code> ou <code>__len__</code>. Utilisez 
<code>__len__</code> si votre classe est un container qui a une taille :</p>
<pre><code>class MyContainer(object):

    def __init__(self, data):
        self.data = data

    def __len__(self):
        """Return my length."""
        return len(self.data)
</code></pre>
<p>Si votre classe n'est pas un container, utilisez <code>__nonzero__</code> :</p>
<pre><code>class MyClass(object):

    def __init__(self, value):
        self.value = value

    def __nonzero__(self):
        """Return my truth value (True or False)."""
        # This could be arbitrarily complex:
        return bool(self.value)
</code></pre>
<p>En Python 3.0, <code>__nonzero__</code> a été renommé <code>__bool__</code> afin d'être consistant 
avec le type <code>bool</code> natif.  Pour être compatible, ajoutez ceci à la définition 
de votre classe :</p>
<pre><code>__bool__ = __nonzero__
</code></pre>
<h2>Index &amp; Item (1)</h2>
<p>Voici une manière élégante de vous épargner quelques lignes si vous avez 
besoin d'une liste de mots :</p>
<pre><code>&gt;&gt;&gt; items = 'zero one two three'.split()
&gt;&gt;&gt; print items
['zero', 'one', 'two', 'three']
</code></pre>
<p>Prenons l'exemple d'un itération entre les items d'une liste, pour laquelle 
nous voulons à la fois l'item et la position (l'index) de cet item dans la liste :</p>
<pre><code>                  - ou -
i = 0
for item in items:      for i in range(len(items)):
    print i, item               print i, items[i]
    i += 1
</code></pre>
<h2>Index &amp; Item (2): <code>enumerate</code></h2>
<p>La fonction <code>enumerate</code> prend une liste et retourne des paires (index, item) :</p>
<pre><code>&gt;&gt;&gt; print list(enumerate(items))
[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')]
</code></pre>
<p>Il est nécessaire d'avoir recours à une <code>list</code> pour afficher les résultats 
car <code>enumerate</code> est une fonction fainéante, générant un item (une paire) à 
la fois, seulement lorsqu'il est demandé. Une boucle <code>for</code> nécessite un tel
mécanisme. <code>enumerate</code> est un exemple de <strong>générateur</strong> dont on parlera plus 
tard des détails. <code>print</code> ne prend pas un résultat à la fois mais doit être 
en possession de la totalité du message à afficher. On a donc converti 
automatiquement le générateur en une liste avant d'utiliser print.</p>
<p>Notre boucle devient beaucoup plus simple :</p>
<pre><code>for (index, item) in enumerate(items):
    print index, item

# comparé à :              # comparé à :
index = 0               for i in range(len(items)):
for item in items:              print i, items[i]
    print index, item
    index += 1
</code></pre>
<p>La version avec <code>enumerate</code> est plus courte et plus simple que la version 
de gauche, et plus facile à lire que les deux autres.</p>
<p>Un exemple montrant que la fonction <code>enumerate</code> retourne un itérateur 
(un générateur est une sorte d'itérateur) :</p>
<pre><code>&gt;&gt;&gt; enumerate(items)
&lt;enumerate object at 0x011EA1C0&gt;
&gt;&gt;&gt; e = enumerate(items)
&gt;&gt;&gt; e.next()
(0, 'zero')
&gt;&gt;&gt; e.next()
(1, 'one')
&gt;&gt;&gt; e.next()
(2, 'two')
&gt;&gt;&gt; e.next()
(3, 'three')
&gt;&gt;&gt; e.next()
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
StopIteration
</code></pre>
<h2>Les autres langages ont des "variables"</h2>
<p>Dans de nombreux autres langages, assigner une variable revient à mettre une 
valeur dans une boîte.</p>
<pre><code>int a = 1;
</code></pre>
<p>
<img alt="Bo&#xEE;te 1 a" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/a1box.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>La boîte "a" contient maintenant un integer 1.</p>
<p>Assigner une autre valeur à la même variable remplace le contenu de la boîte :</p>
<pre><code>a = 2;
</code></pre>
<p>
<img alt="Bo&#xEE;te 2 a" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/a2box.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>Maintenant la boîte "a" contient un integer 2.</p>
<p>Assigner une variable à une autre crée une copie de la valeur et la met 
dans une nouvelle boîte :</p>
<pre><code>int b = a;
</code></pre>
<p>
<img alt="Bo&#xEE;te 2 a" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/a2box.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>
<img alt="Bo&#xEE;te 2 b" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/b2box.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>"b" est une seconde boîte, avec une copie de l'entier 2. La boîte "a" en a
une copie séparée.</p>
<h2>Python a des "noms"</h2>
<p>En Python, un "nom" ou "identifiant" est comme une étiquette attachée à un 
objet.</p>
<pre><code>a = 1
</code></pre>
<p>
<img alt="Tag 1 a" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/a1tag.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>Ici, un objet integer 1 a une étiquette appelée "a".</p>
<p>Si on réassigne "a", on déplace juste l'étiquette sur un autre objet :</p>
<pre><code>a = 2
</code></pre>
<p>
<img alt="Tag 2 a" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/a2tag.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>
<img alt="1" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/1.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>Maintenant le nom "a" est attaché à un objet entier 2.</p>
<p>L'objet entier 1 n'a plus le tag "a". Il peut encore exister mais on n'y a
plus accès via le nom "a". (Lorsqu'un objet n'a plus aucune référence ou 
étiquette, il est supprimé de la mémoire.)</p>
<p>Si l'on assigne un nom à un autre, on attache juste une autre étiquette à 
un objet existant :</p>
<pre><code>b = a
</code></pre>
<p>
<img alt="Tag 2 a b" src="http://media.biologeek.com/images/python_astuces_bonnes_pratiques/ab2tag.png" style="margin: 0pt auto; display: block;"/>
</p>
<p>Le nom "b" est juste une seconde étiquette attachée au même objet que "a".</p>
<p>Bien que l'on réfère communément aux "variables" en Python (car c'est une
terminologie commune aux autres langages), on manipule vraiment de "noms" ou
"identifiants". En Python, les "variables" sont des étiquettes pour des
valeurs, non des boîtes nommés.</p>
<p>Si vous ne comprenez rien au reste de ce tutoriel, j'espère que vous aurez$
au moins retenu la façon dont les noms fonctionnent. Une bonne compréhension
vous permettra d'apprendre rapidement et d'éviter des erreurs comme celle-ci:</p>
<h2>Valeurs de paramètres par défaut</h2>
<p>C'est une erreur courante que les débutants font souvent. Même les 
développeurs plus expérimentés la font s'ils n'ont pas compris comment
fonctionnent les noms en Python.</p>
<pre><code>def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list
</code></pre>
<p>Le problème ici c'est que la valeur par défaut <code>a_list</code>, une liste vide,
est évaluée lors de la définition de la fonction. Ainsi à chaque fois que
vous appelez la fonction vous obtenez la <strong>même</strong> valeur par défaut.
Essayez plusieurs fois :</p>
<pre><code>&gt;&gt;&gt; print bad_append('one')
['one']

&gt;&gt;&gt; print bad_append('two')
['one', 'two']
</code></pre>
<p>Les listes sont modifiables, vous pouvez modifier leur contenu. La bonne 
manière d'avoir une liste par défaut (ou dictionnaire, ou set) est de la
créer au moment du lancement, <strong>au sein de la fonction</strong> :</p>
<pre><code>def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list
</code></pre>
<h2>Formattage des chaînes de caractères avec %</h2>
<p>L'opérateur <code>%</code> fonctionne en Python comme la fonction <code>sprintf</code> de C.</p>
<p>Bien sûr si vous ne connaissez pas C, ça ne vous aide pas. Pour faire simple,
vous définissez un template ou format et des valeurs qui seront interprétées.</p>
<p>Dans cet exemple, le template contient deux spécifications de conversion
"%s" signifie "insérer une chaîne de caractère ici" et "%i" signifie 
"convertir un integer en string et l'insérer ici". "%s" est particulièrement 
utile car il utilise la fonction standard <code>str()</code> pour convertir un objet
en une chaîne de caractères.</p>
<p>Les valeurs proposées doivent correspondrent au template, on a deux valeurs
ici, un tuple.</p>
<pre><code>name = 'David'
messages = 3
text = ('Hello %s, you have %i messages'
        % (name, messages))
print text
</code></pre>
<p>Ce qui donne :</p>
<pre><code>Hello David, you have 3 messages
</code></pre>
<p>Les détails sont dans la <em>Python Library Reference</em>, section 2.3.6.2,
"String Formatting Operations". Mettez cette page en favoris !</p>
<p>Si vous ne l'avez pas encore fait, allez sur python.org, téléchargez la
documentation en HTML (dans un .zip ou une archive), et installez la sur
votre machine. Il n'y a rien de mieux que d'avoir la ressource de référence
à portée de clavier.</p>
<h2>Formattage des chaînes de caractères avancé</h2>
<p>Pourquoi est-ce qu'il y a autant de personnes qui ne réalisent pas qu'il y
a d'autres façons de formater les chaînes de caractères qui peuvent s'avérer
plus puissantes ?</p>
<p>Avec des noms grâce à un dictionnaire :</p>
<pre><code>values = {'name': name, 'messages': messages}
print ('Hello %(name)s, you have %(messages)i '
       'messages' % values)
</code></pre>
<p>Ici on a spécifié les noms des valeurs interprétées, qui constituent les
clés du dictionnaire.</p>
<p>Vous trouvez qu'il y a de la redondance ? Les noms "name" et "messages"
sont déjà définis localement. On peut en tirer parti.</p>
<p>En utilisant les variables locales :</p>
<pre><code>print ('Hello %(name)s, you have %(messages)i '
       'messages' % locals())
</code></pre>
<p>La fonction <code>locals()</code> retourne un dictionnaire de toutes les variables
locales disponibles.</p>
<p>C'est très puissant. Grâce à ça, vous pouvez formater toutes les chaînes de 
caractères que vous voulez sans avoir à vous soucier de la correspondance
positionnelle avec les valeurs soumises en argument.</p>
<p>Mais le pouvoir peut être dangereux. ("With great power comes great
responsibility.")  Si vous utilisez <code>locals()</code> avec un template issu d'une
ressource externe, vous exposez l'intégralité de votre espace de noms local.
C'est une chose à garder en tête.</p>
<p>Pour examiner votre espace de nom local :</p>
<pre><code>&gt;&gt;&gt; from pprint import pprint
&gt;&gt;&gt; pprint(locals())
</code></pre>
<p><code>pprint</code> est un module très utile. Si vous ne le connaissiez pas déjà,
essayez de jouer avec. Ça rend le debugging des données structurées beaucoup
plus simple !</p>
<h2>Formattage des chaînes de caractères avancé</h2>
<p>L'espace de nom des attributs d'une instance d'objet est simplement un 
dictionnaire, <code>self.__dict__</code>.</p>
<p>En utilisant l'espace de nom d'une instance :</p>
<pre><code>print ("We found %(error_count)d errors"
       % self.__dict__)
</code></pre>
<p>Equivalent à, mais moins flexible que :</p>
<pre><code>print ("We found %d errors"
       % self.error_count)
</code></pre>
<p>Note: Les attributs d'une classe sont dans le <code>__dict__</code> de la classe. 
Les espaces de noms sont hérités et constituent donc des dictionnaires
chaînés.</p>
<h2>List Comprehensions</h2>
<p>Les list comprehensions ("listcomps" pour les intimes) sont des raccourcis
syntaxiques pour ce pattern généralement utilisé.</p>
<p>La manière traditionnelle avec <code>for</code> et <code>if</code> :</p>
<pre><code>new_list = []
for item in a_list:
    if condition(item):
        new_list.append(fn(item))
</code></pre>
<p>En utilisant une list comprehension :</p>
<pre><code>new_list = [fn(item) for item in a_list
            if condition(item)]
</code></pre>
<p>Les listcomps sont claires et concises, directes. Vous pouvez avoir plusieurs
boucles <code>for</code> et conditions <code>if</code> au sein d'une même listcomp, mais
au-delà de deux ou trois, ou si les conditions sont complexes, je vous 
suggère d'utiliser l'habituelle boucle <code>for</code>. En appliquant le Zen de Python, 
utilisez la méthode la plus lisible.</p>
<p>Par exemple, la liste des carrés de 0 à 9 :</p>
<pre><code>&gt;&gt;&gt; [n ** 2 for n in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
</code></pre>
<p>La liste des nombres premiers au sein de la précédente liste :</p>
<pre><code>&gt;&gt;&gt; [n ** 2 for n in range(10) if n % 2]
[1, 9, 25, 49, 81]
</code></pre>
<h2>Generator Expressions (1)</h2>
<p>Faisons la somme des carrés des nombres inférieurs à 100 :</p>
<p>Avec une boucle :</p>
<pre><code>total = 0
for num in range(1, 101):
    total += num * num
</code></pre>
<p>On peut aussi utiliser la fonction <code>sum</code> qui fait plus rapidement le 
travail pour nous en construisant la bonne séquence.</p>
<p>Avec une list comprehension :</p>
<pre><code>total = sum([num * num for num in range(1, 101)])
</code></pre>
<p>Avec une generator expression :</p>
<pre><code>total = sum(num * num for num in xrange(1, 101))
</code></pre>
<p>Les generator expressions ("genexps") sont comme les list
comprehensions, excepté dans leur calcul, les genexps sont fainéantes.
Les listcomps calculent l'intégralité du résultat en une seule passe, pour
le stocker dans une liste. Les generator expressions calculent une valeur à
la fois, lorsqu'elle est nécessaire. C'est particulièrement utile lorsque la
séquence est très longue lorsque la liste générée n'est qu'une étape
intermédiaire et non le résultat final.</p>
<p>Dans ce cas, on est uniquement intéressé par la somme, on n'a pas besoin de
la liste des résultats intermédiaires. On utilise <code>xrange</code> pour la même 
raison, ça génère les valeurs une par une.</p>
<h2>Generator Expressions (2)</h2>
<p>Par exemple si on doit faire la somme des carrés de plusieurs milliards
d'entiers, on va arriver à une saturation de la mémoire avec une list
comprehension, mais les generator expressions ne vont avoir aucun problème.
Bon ça va prendre un certain temps par contre !</p>
<pre><code>total = sum(num * num
            for num in xrange(1, 1000000000))
</code></pre>
<p>La différence de syntaxe est que les listcomps ont des crochets, alors que
les genexps n'en ont pas. Les generator expressions nécessitent parfois des
parenthèses par contre, vous devriez donc toujours les utiliser.</p>
<p>En bref :</p>
<ul>
<li>Utilisez une list comprehension lorsque le résultat escompté est la liste.</li>
<li>Utilisez une generator expression lorsque la liste n'est qu'un résultat
intermédiaire.</li>
</ul>
<p>Voici un récent exemple de ce que j'ai vu au boulot.</p>
<p>On avait besoin d'un dictionnaire qui corresponde aux chiffres des mois (à
la fois via des chaînes de caractères et via des integers) au code des mois 
pour un client. Cela peut être fait avec une ligne de code.</p>
<p>Ça fonctionne de la manière suivante :</p>
<ul>
<li>La fonction de référence <code>dict()</code> prend en argument une liste de paires
de clés/valeurs (2-tuples).</li>
<li>On a une liste des codes des mois (chaque code est une simple lettre, et
une chaîne de caractères est aussi une simple liste de lettres). On parcours
cette liste pour obtenir à la fois le code du mois et l'index.</li>
<li>Le nombre des mois commence à 1 mais Python commence l'indexation à 0,
le nombre des mois correspond dont à index+1.</li>
<li>On veut avoir la correspondance à la fois avec les nombres et les chaînes
de caractères. On peut utiliser les fonctions <code>int()</code> et <code>str()</code> pour 
ça et itérer dessus.</li>
</ul>
<p>L'exemple en question :</p>
<pre><code> month_codes = dict((fn(i+1), code)
     for i, code in enumerate('FGHJKMNQUVXZ')
     for fn in (int, str))
</code></pre>
<p>Le résultat obtenu pour <code>month_codes</code> :</p>
<pre><code>{ 1:  'F',  2:  'G',  3:  'H',  4:  'J', ...
 '1': 'F', '2': 'G', '3': 'H', '4': 'J', ...}
</code></pre>
<h2>Ordonner</h2>
<p>Il est très simple d'ordonner une liste en Python :</p>
<pre><code>a_list.sort()
</code></pre>
<p>(Notez que la liste est ordonnée sur place, la liste originale est ordonnée
et la fonction <code>sort</code> <strong>ne retourne pas</strong> une liste ou une copie.)</p>
<p>Mais que faire lorsque vous avec une liste de données à ordonner, mais
quelle ne s'ordonne pas de manière naturelle ? Par exemple ordonner selon
la première colonne, puis la quatrième.</p>
<p>On peut utiliser la fonction de référence <code>sort</code> avec une méthode définie
par nos soins :</p>
<pre><code>def custom_cmp(item1, item2):
    returm cmp((item1[1], item1[3]),
               (item2[1], item2[3]))

a_list.sort(custom_cmp)
</code></pre>
<p>Ça marche, mais c'est extrêmement lent pour les listes énormes.</p>
<h2>Ordonner avec DSU</h2>
<p>DSU = Decorate-Sort-Undecorate</p>
<p>Note: DSU n'est bien souvent plus nécessaire, cf. section suivante.</p>
<p>Au lieu de créer une fonction de comparaison personnalisée, on crée une
liste intermédiaire qui va pourvoir être ordonnée naturellement :</p>
<pre><code># Decorate:
to_sort = [(item[1], item[3], item)
           for item in a_list]

# Sort:
to_sort.sort()

# Undecorate:
a_list = [item[-1] for item in to_sort]
</code></pre>
<p>La première ligne crée une liste contenant des tuples, une copie de la valeur
à ordonner en premier argument, suivi de la valeur complète de la liste.</p>
<p>La seconde ligne ordonne grâce à la fonction Python, ce qui est très rapide.</p>
<p>La troisième ligne récupère la <strong>dernière</strong> valeur de la liste une fois
ordonnée. Souvenez-vous, cette dernière valeur correspond à l'item complet.
On n'utilise plus la partie ayant permis d'ordonner, elle a joué son rôle
et n'est plus utile.</p>
<p>C'est un compromis espace mémoire + complexité vs. temps. Plus simple et
rapide mais on est obligé de dupliquer la liste originale.</p>
<h2>Ordonner avec keys</h2>
<p>Python 2.4 a introduit un nouvel argument à la méthode <code>sort</code> des listes,
"key", qui permet de spécifier une fonction à un argument qui est utilisée
pour comparer chaque élément d'une liste avec les autres. Par exemple :</p>
<pre><code>def my_key(item):
    return (item[1], item[3])

to_sort.sort(key=my_key)
</code></pre>
<p>La fonction <code>my_key</code> va être appelée une fois par item de la liste <code>to_sort</code>.</p>
<p>Vous pouvez utiliser votre propre fonction ou utiliser une fonction existante
qui ne prend qu'un seul argument :</p>
<ul>
<li><code>str.lower</code> pour ordonner alphabétiquement sans tenir compte de la casse.</li>
<li><code>len</code> pour ordonner selon la taille des items (chaînes de caractères ou containers).</li>
<li><code>int</code> ou <code>float</code> pour ordonner numériquement avec des valeurs qui sont
des chaînes de caractères comme "2", "123", "35".</li>
</ul>
<h2>Generators</h2>
<p>On a déjà vu les generator expressions. On peut créer nos propres generators,
comme des fonctions :</p>
<pre><code>def my_range_generator(stop):
    value = 0
    while value &lt; stop:
        yield value
        value += 1

for i in my_range_generator(10):
    do_something(i)
</code></pre>
<p>Le mot-clé <code>yield</code> transforme une fonction en generator. Lorsque vous
appelez une fonction generator, au lieu d'exécuter le code directement,
Python retourne un objet generator, qui est un itérateur. Il a une méthode
<code>next</code>. Les boucles <code>for</code> appellent la méthode <code>next</code> de l'itérateur,
jusqu'à ce qu'une exception du type <code>StopIteration</code> soit levée.
Vous pouvez lever l'exception <code>StopIteration</code> explicitement ou de manière
implicite comme dans le code ci-dessous.</p>
<p>Les générateurs peuvent simplifier la manière de gérer les 
séquences/itérateurs, car on n'a pas besoin de créer des listes 
intermédiaires. Ça ne génère qu'une valeur à la fois.</p>
<p>Voici comment la boucle <code>for</code> fonctionne réellement. Python analyse la
séquence déclarée avec le mot-clé <code>in</code>. Si c'est un simple container (comme
une liste, un tuple, un dictionnaire, un set ou un container défini par
l'utilisateur) Python le converti en itérateur. Si c'est déjà un itérateur,
Python ne fait rien.</p>
<p>Python appelle ensuite de manière itérative la méthode <code>next</code> de
l'itérateur, assignant la valeur retournée au compteur de la boucle (<code>i</code> 
dans notre cas), et exécute le code indenté. C'est répété, encore et encore
jusqu'à ce que <code>StopIteration</code> soit levée, ou qu'un <code>break</code> soit exécuté.</p>
<p>Une boucle <code>for</code> peut être dotée d'un <code>else</code>, au sein de laquelle le
code est exécuté si rien ne s'est produit dans la boucle for, mais <strong>non</strong>
après un <code>break</code>. Cette distinction permet de faire des choses élégantes.
<code>else</code> est rarement utilisé avec la boucle <code>for</code> mais peut s'avérer
très puissant lorsque la logique correspond à ce que vous souhaitez faire.</p>
<p>Par exemple, si on doit vérifier qu'une condition est toujours remplie par
tous les items d'une liste :</p>
<pre><code>for item in sequence:
    if condition(item):
        break
else:
    raise Exception('Condition not satisfied.')
</code></pre>
<h2>Exemple de generator</h2>
<p>Filtrer les colonnes vides à partir d'un fichier CSV (ou des items d'une liste) :</p>
<pre><code>def filter_rows(row_iterator):
    for row in row_iterator:
        if row:
            yield row

data_file = open(path, 'rb')
irows = filter_rows(csv.reader(data_file))
</code></pre>
<h2>Lire les lignes d'un fichier de données</h2>
<pre><code>datafile = open('datafile')
for line in datafile:
    do_something(line)
</code></pre>
<p>C'est possible car les fichiers sont dotés d'une méthode <code>next</code>, comme
d'autres itérateurs : les listes, les tuples, les dictionnaires (pour leurs
clés), les generators.</p>
<p>Il y a un piège ici : étant donnée la façon dont sont mises en cache les
données, vous ne pouvez pas utiliser à la fois les méthodes <code>.next</code> et
<code>.read*</code> à moins que vous n'utilisez Python 2.5+.</p>
<h2>EAFP vs. LBYL</h2>
<p>Il est plus facile de demander le pardon que la permission (EAFP) vs. analyser 
avant d'échouer (LBYL). Généralement EAFP est préféré, mais pas toujours.</p>
<ul>
<li>Duck typing
Si ça marche comme un canard, parle comme un canard et ressemble à un
canard : c'est un canard.</li>
<li>Exceptions
Essayez de forcer le type si un objet doit être d'un type particulier.
Si <code>x</code> doit être une chaîne de caractères pour que votre code
fonctionne, pourquoi ne pas appeler <code>str(x)</code> au lieu d'essayer quelque`
chose comme <code>isinstance(x, str)</code>.</li>
</ul>
<h2>Exemple EAFP <code>try/except</code></h2>
<p>Vous pouvez encapsuler vos exceptions dans un bloc <code>try/except</code> pour
pour récupérer les erreurs et vous allez probablement arriver à une solution
qui est beaucoup plus générale que si vous aviez essayer d'anticiper chaque
cas.</p>
<pre><code>try:
    return str(x)
except TypeError:
    ...
</code></pre>
<p>Note: Spécifiez toujours l'exception à attraper. N'utilisez jamais 
<code>except</code> tout seul. Sinon <code>except</code> va cacher d'autres exceptions qui 
risquent d'être levées rendant votre code très difficile à debugger.</p>
<h2>Importer</h2>
<pre><code>from module import *
</code></pre>
<p>Vous avez probablement déjà vu cette manière de faires des imports avec une
"étoile". Vous l'appréciez peut-être. <strong>Ne l'utilisez pas.</strong></p>
<p>Pour paraphraser un exemple très connu :</p>
<blockquote>
<p>LUKE: Est-ce que <code>from module import *</code> est meilleur que des imports explicites ? <br/>
  YODA: Non, pas meilleur. Plus rapide, plus simple, plus séduisant. <br/>
  LUKE: Mais comment saurais-je pourquoi les imports explicites sont meilleurs que les formes étoilées ? <br/>
  YODA: Tu sauras lorsque ton code dans 6 mois tu essayeras de lire.</p>
</blockquote>
<p>Les imports étoilés sont le mauvais côté de la Force en Python.</p>
<p>Les imports de type <code>from module import *</code> polluent votre espace de nom.
Vous allez avoir des choses que vous n'attendiez pas. Vous pouvez avoir des
conflits avec les noms que vous avez défini localement. Vous n'allez plus
savoir d'où viennent certains noms. Bien que ce soit un raccourci pratique,
ça ne doit pas arriver en production.</p>
<p>Morale : <strong>n'utilisez pas d'imports étoilés !</strong></p>
<p>Il est bien meilleur de référencer les noms à partir de leurs modules :</p>
<pre><code>import module
module.name
</code></pre>
<p>importer un module avec un nom plus court si nécessaire (avec <code>alias</code>) :</p>
<pre><code>import long_module_name as mod
mod.name
</code></pre>
<p>ou importer juste les noms dont vous avez besoin de manière explicite :</p>
<pre><code>from module import name
name
</code></pre>
<p>Notez qu'il est nécessaire d'utiliser "reload()" sur un module lorsque vous
utilisez le prompt interactif si vous éditez celui-ci.</p>
<h2>Modules et scripts</h2>
<p>Pour faire à la fois un module importable et un script exécutable :</p>
<pre><code>if __name__ == '__main__':
    # script code here
</code></pre>
<p>Lorsqu'il est importé, un attribut<code>__name__</code> est setté, correspondant au 
nom du fichier du module, sans ".py". Le code ci-dessus ne va donc pas être
lancé lors d'un import. Lorsqu'il est lancé comme un script, l'attribut
<code>__name__</code> est setté à "<strong>main</strong>" et le script va être exécuté.</p>
<p>Excepté pour certains cas spéciaux, vous ne devriez placer aucun code 
important au plus haut niveau. Placez votre code dans des fonctions, classes,
méthodes et protégez le avec <code>if __name__ == '__main__'</code>.</p>
<h2>Structure d'un module</h2>
<pre><code>"""module docstring"""

# imports
# constants
# exception classes
# interface functions
# classes
# internal functions &amp; classes

def main(...):
    ...

if __name__ == '__main__':
    status = main()
    sys.exit(status)
</code></pre>
<p>C'est la façon dont un module devrait être structuré.</p>
<h2>Utilisation de la ligne de commande</h2>
<p>Exemple (<em>Note du traducteur</em> : <a href="http://www.biologeek.com/bonnes-pratiques,python/un-template-python-pour-parser-des-arguments/">j'ai déjà parlé de ça aussi</a>) :</p>
<pre><code>#!/usr/bin/env python

"""
Module docstring.
"""

import sys
import optparse

def process_command_line(argv):
    """
    Return a 2-tuple: (settings object, args list).
    `argv` is a list of arguments, or `None` for ``sys.argv[1:]``.
    """
    if argv is None:
        argv = sys.argv[1:]

    # initialize the parser object:
    parser = optparse.OptionParser(
        formatter=optparse.TitledHelpFormatter(width=78),
        add_help_option=None)

    # define options here:
    parser.add_option(      # customized description; put --help last
        '-h', '--help', action='help',
        help='Show this help message and exit.')

    settings, args = parser.parse_args(argv)

    # check number of arguments, verify values, etc.:
    if args:
        parser.error('program takes no command-line arguments; '
                     '"%s" ignored.' % (args,))

    # further process settings &amp; args if necessary

    return settings, args

def main(argv=None):
    settings, args = process_command_line(argv)
    # application code here, like:
    # run(settings, args)
    return 0        # success

if __name__ == '__main__':
    status = main()
    sys.exit(status)
</code></pre>
<h2>Packages</h2>
<pre><code>package/
    __init__.py
    module1.py
    subpackage/
        __init__.py
        module2.py
</code></pre>
<ul>
<li>Utilisés pour organiser un projet.</li>
<li>Réduisent le nombre d'entrées lors du chargement.</li>
<li>Réduisent les conflits en cas d'imports.</li>
</ul>
<p>Exemple :</p>
<pre><code>import package.module1
from packages.subpackage import module2
from packages.subpackage.module2 import name
</code></pre>
<p>En Python 2.5 on a maintenant les imports absolus et relatifs via un import
du futur :</p>
<pre><code>from __future__ import absolute_import
</code></pre>
<p>Je n'ai pas encore eu l'occasion de tester ça moi-même, on va donc couper
court à toute discussion à ce sujet.</p>
<h2>Simple is Better Than Complex</h2>
<blockquote>
<p>Débugger est deux fois plus difficile que d'écrire du code en premier jet.
  De plus, si vous écrivez le code aussi intelligemment que possible, vous
  êtes, par définition, pas assez intelligent pour le débugger.</p>
<p>-- Brian W. Kernighan, co-auteur de <em>The C Programming Language</em>
     et le "K" dans "AWK"</p>
</blockquote>
<p>En d'autres termes, gardez vos programmes simples !</p>
<h2>Ne réinventez pas la roue</h2>
<p>Avant d'écrire une seule ligne de code,</p>
<ul>
<li>Vérifiez que cela n'est pas dans la bibliothèque standard de Python.</li>
<li>Vérifiez que cela n'est pas dans le <a href="http://cheeseshop.python.org/pypi">Python Package Index</a> (the "Cheese Shop")</li>
<li>Cherchez sur le web. <em>Google is your friend.</em></li>
</ul>
<h2>Retour du traducteur</h2>
<p>Pour terminer, et si vous souhaitez aller plus loin, une 
<a href="http://www.dabeaz.com/generators/">excellente présentation sur les générateurs</a> 
que je n'aurais malheureusement pas le temps de traduire permet d'envisager la 
programmation Python d'une manière tout à fait différente. Elle est orientée 
administration système mais elle peut vraiment être appliquée à de nombreux cas. 
Et si vous voulez comprendre l'intérêt des décorateurs, 
<a href="http://avinashv.net/2008/04/python-decorators-syntactic-sugar/">un bon exemple</a> 
vaut mieux que tous les discours. Mangez du Python, c'est bon pour la santé !</p></div>
    </summary>
    <updated>2008-05-11T18:50:44Z</updated>
    <category term="bonnes-pratiques"/>
    <category term="python"/>
    <category term="conferences"/>
    <category term="django"/>
    <category term="traduction"/>
    <author>
      <name>David Larlet</name>
    </author>
    <source>
      <id>http://www.biologeek.com/</id>
      <author>
        <name>David Larlet</name>
      </author>
      <link href="http://www.biologeek.com/" rel="alternate" type="text/html"/>
      <link href="http://biologeek.com/journal/rss.php" rel="self" type="application/atom+xml"/>
      <rights xml:lang="fr">Copyright (c) 2004-2008, David Larlet, Licence (presque) Libre: http://www.biologeek.com/contact/#licence</rights>
      <subtitle xml:lang="fr">Dernières mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle>
      <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title>
      <updated>2008-05-16T14:25:16Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.christian-faure.net/2008/05/11/gerard-granel-com/</id>
    <link href="http://feeds.feedburner.com/~r/christian-faure/wMuM/~3/288053784/" rel="alternate" type="text/html"/>
    <title>Gérard Granel “.com”</title>
    <summary>Une très bonne nouvelle que ce site dédié à Gérard Granel, fait par des proches.
On y trouvera notamment des textes de cours (et je me régale en ce moment avec celui sur Gramsci), des extraits, des entretiens. A noter le texte d’introduction, écrit par Elisabeth Rigal elle-même, remarquable et vivifiant.

Enfin, quelques photos qui m’ont submergé [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><!-- ALL ADSENSE ADS DISABLED -->
<p>Une très bonne nouvelle que <a href="http://www.gerardgranel.com/index.html">ce site</a> dédié à Gérard Granel, fait par des proches.</p>
<p>On y trouvera notamment des textes de cours (et je me régale en ce moment avec celui sur <a href="http://fr.wikipedia.org/wiki/Antonio_Gramsci">Gramsci</a>), des extraits, des entretiens. A noter le <a href="http://www.gerardgranel.com/txt_pdf/0-present_site.pdf">texte d’introduction</a>, écrit par Elisabeth Rigal elle-même, remarquable et vivifiant.</p>
<p><a id="more-455"/></p>
<p>Enfin, <a href="http://www.gerardgranel.com/photos2.html">quelques photos</a> qui m’ont submergé d’émotion.</p>
<p><em>En discussion avec Heidegger lors du séminaire du Thor en 1968 :</em><br/>
<img height="426" src="http://www.gerardgranel.com/images/photo_6.jpg" width="438"/></p>
<p><em>En 1997, Photographié par Jean-Luc Nancy :</em><br/>
<img height="684" src="http://www.gerardgranel.com/images/photo_7.jpg" width="437"/><br/>
Si vous avez été un élève de Granel, n’hésitez pas à partager vos souvenirs, vos notes de cours, etc.
</p>
<p/><a href="http://www.christian-faure.net/index.php?tag=granel" rel="tag">Granel</a> <a href="http://www.christian-faure.net/index.php?tag=rigal" rel="tag">rigal</a><img height="1" src="http://feeds.feedburner.com/~r/christian-faure/wMuM/~4/288053784" width="1"/></div>
    </content>
    <updated>2008-05-11T13:27:06Z</updated>
    <category term="Philosophie"/>
    <category term="Granel"/>
    <category term="rigal"/>
    <author>
      <name>Christian</name>
    </author>
    <source>
      <id>http://www.christian-faure.net</id>
      <author>
        <name>Christian Fauré</name>
      </author>
      <link href="http://www.christian-faure.net" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/christian-faure/wMuM" rel="self" type="application/rss+xml"/>
      <subtitle>Hypomnemata : supports de mémoire</subtitle>
      <title>Christian Fauré</title>
      <updated>2008-05-11T13:29:22Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.la-grange.net/2008/05/11/terre-et-morsure</id>
    <link href="http://www.la-grange.net/2008/05/11/terre-et-morsure" rel="alternate" type="text/html"/>
    <title>La terre et la morsure</title>
    <summary>Dans la forêt dense normande de taillis au printemps, pris dans la foule des fougères, des ronces, des jeunes noisetiers, mon pas volontaire s'appuie sur le bois mort, la profondeur du sol et le craquement des feuilles mortes. Il fait chaud. Les orties brûlent mes chevilles. Je m'écorche les mains sur les épines et les tiges. Cependant, je ne peux m'empêcher de sourire. La morsure de la terre est le plus doux témoignage de ma liberté.</summary>
    <updated>2008-05-10T17:03:06Z</updated>
    <category term="souvenir, cuisine, promenade, carnet"/>
    <source>
      <id>http://www.la-grange.net/</id>
      <author>
        <name>Karl Dubost</name>
        <email>karl@la-grange.net</email>
      </author>
      <link href="http://www.la-grange.net/" rel="alternate" type="text/html"/>
      <link href="http://www.la-grange.net/feed.rdf" rel="self" type="application/atom+xml"/>
      <rights>Creative Commons Karl Dubost</rights>
      <subtitle>Chroniques d'un poète urbain</subtitle>
      <title>Karl - Le carnet Web</title>
      <updated>2008-05-10T17:03:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://websemantique.org/PagePrincipale</id>
    <link href="http://websemantique.org/PagePrincipale" rel="alternate" type="text/html"/>
    <title>Web Sémantique:PagePrincipale</title>
    <updated>2008-05-10T12:13:40Z</updated>
    <category term="WebSemantique"/>
    <category term="websemantique"/>
    <author>
      <name>cesartheodore</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </author>
      <link href="http://del.icio.us/tag/websemantique" rel="alternate" type="text/html"/>
      <link href="http://del.icio.us/rss/tag/websemantique" rel="self" type="application/atom+xml"/>
      <title>del.icio.us/tag/websemantique</title>
      <updated>2008-05-16T13:25:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.biologeek.com/2008/05/sejour-barcelone/</id>
    <link href="http://www.biologeek.com/2008/05/sejour-barcelone/" rel="alternate" type="text/html"/>
    <title xml:lang="fr">Séjour à Barcelone</title>
    <summary type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>Retours rapides après quelques jours :
</p>
<ul>
<li>
     Le catalan est plus proche du français que l'espagnol, pratique pour se faire comprendre après 10 ans sans avoir sorti un mot d'espagnol ;
 </li>
<li>
     339 mails non lus (hors listes de diffusion) et 528 billets dans mon agrégateur... ;
 </li>
<li>
     Port Aventura &gt;&gt; Disneyland Paris : les attractions sont vraiment impressionnantes ;
 </li>
<li>
<a href="http://immateriel.wordpress.com/2008/05/09/oreilly_france_c_est_deja_du_passe/">O'Reilly France</a> n'est plus. Préoccupant.
 </li>
<li>
     Ne cherchez pas les toilettes mais les lavabos en Espagne ;
 </li>
<li>
     Biologeek down pendant 12h, j'investigue ;
 </li>
<li>
     La boutique du Barça doit être plus grande que celles de l'OM, du PSG et de l'OL réunies.
 </li>
</ul></div>
    </summary>
    <updated>2008-05-09T20:29:38Z</updated>
    <author>
      <name>David Larlet</name>
    </author>
    <source>
      <id>http://www.biologeek.com/</id>
      <author>
        <name>David Larlet</name>
      </author>
      <link href="http://www.biologeek.com/" rel="alternate" type="text/html"/>
      <link href="http://biologeek.com/journal/rss.php" rel="self" type="application/atom+xml"/>
      <rights xml:lang="fr">Copyright (c) 2004-2008, David Larlet, Licence (presque) Libre: http://www.biologeek.com/contact/#licence</rights>
      <subtitle xml:lang="fr">Dernières mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle>
      <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title>
      <updated>2008-05-16T14:25:17Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.christian-faure.net/2008/05/09/introduction-a-lentreprise-20/</id>
    <link href="http://feeds.feedburner.com/~r/christian-faure/wMuM/~3/286961338/" rel="alternate" type="text/html"/>
    <title>Introduction à l’Entreprise 2.0</title>
    <summary>L’entreprise 2.0 est constitutive de deux tendances majeures :

La première tendance est celle du web 2.0 où il s’agit, comme on s’en doute, de mettre du web 2.0 dans le système d’information de l’entreprise.
La deuxième tendance est celle du “Software as a Service“, voire du “quelque chose as a Service” (XaaS), qui constitue une nouvelle [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><!-- ALL ADSENSE ADS DISABLED -->
<p>L’entreprise 2.0 est constitutive de deux tendances majeures :</p>
<ul id="dym10">
<li id="dym11">La première tendance est celle du <span style="font-weight: bold;">web 2.0</span> où il s’agit, comme on s’en doute, de mettre du web 2.0 dans le système d’information de l’entreprise.<br id="vw0o0"/></li>
<li id="dym12">La deuxième tendance est celle du “<span style="font-weight: bold;">Software as a Service</span>“, voire du “quelque chose as a Service” (XaaS), qui constitue une nouvelle façon de consommer les technologies de l’information, avec de nouvelles offres portées par de nouveaux acteurs dans le périmètre de l’entreprise.</li>
</ul>
<p><a id="more-454"/><br/>
<img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E1.jpeg" width="400"/><br id="uzhy0"/> Les deux tendances sont très <span style="font-weight: bold;">intimement liées</span> en ce sens que les solutions web 2.0 que le grand public connaît sont toutes, originairement, en mode Software as a Servce (SaaS). C’est à dire qu’aucune installation sur l’ordinateur individuel n’est requise : on accède directement à l’interface d’une application SaaS en utilisant un navigateur web, ce qui implique, comme on le verra, que les donnés soient stockées ailleurs que sur l’ordinateur, où dans le système d’information de l’entreprise. Elles sont souvent hébergées et gérées par l’acteur SaaS lui-même.</p>
<p><br id="gmm_0"/>Commençons par le Web 2.0.<br id="lt2o1"/> <br id="u_1y0"/> Premier constat, dès que l’on évoque le web 2.0 dans des réunions d’entreprise, les discussions partent dans tous les sens. C’est un sujet qui souvent passionne et où chacun a sa propre compréhension, mais <span style="font-weight: bold;">cet enthousiasme et cette profusion fait souvent peur aux décideurs</span> en entreprise. Ils n’y voient que confusion et manque de maturité.<br id="oamz0"/> D’où la nécessité de donner une vision structurante du Web 2.0 pour mettre l’entreprise dans de meilleures prédispositions aux opportunités offertes.<br id="q53.0"/> <br id="q53.1"/> Je distingue trois composantes, que je nomme souvent “l’ADN du Web 2.0″, et qui sont : la <span id="m5qu0"><strong id="nzc-0">participation</strong></span>, la <strong id="jbjx0">simplicité</strong>, et enfin l’<span id="dunn0"><strong id="nzc-2">ouverture des données</strong></span>. Voyons ce qu’elles signifient.<br id="vhau0"/><br/>
<span style="font-weight: bold;">1. La participation :</span><br/>
C’est l’axe business et organisationnel du Web 2.0.<br/>
<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E2.jpeg" width="401"/></p>
<p>Cet axe est très souvent mal compris ; aucune des entreprises avec lesquelles j’ai discuté ne le comprenait proprement. Souvent, on confond “participation” avec “volontariat” ou encore avec “personnalisation”, voire même avec des démarches de management des connaissances classiques.</p>
<p>Or, les mécanismes participatifs qui sont à l’oeuvre dans l’économie du Web 2.0 sont d’une <span style="font-weight: bold;">puissance énorme</span> : actuellement ils font, et défont, des empires. Toute entreprise qui est en contact direct avec le marché des <span style="font-style: italic;">consumers</span>, du grand public, peut dévisser si un de ses concurrents, voire un nouvel acteur, met au point des mécanismes participatifs dans son coeur de métier.<br/>
Pour comprendre les enjeux de l’axe participatif du Web 2.0 il faut utiliser le concept de <span style="font-weight: bold;">milieu associé</span> que l’on emprunte à <a href="http://fr.wikipedia.org/wiki/Gilbert_Simondon">Gilbert Simondon</a>.</p>
<p>La quasi totalité des entreprises travaillent en mode dissocié, c’est à dire que leur état d’esprit est le suivant :</p>
<div style="margin-left: 40px;">“je produits et je vends, des services ou des produits, et vous les achetez”, dit autrement : “je produits, vous consommez, chacun à sa place”.</div>
<p>Il y a une dissociation entre le producteur et le consommateur, contrairement à ce que l’on constate sur le Web 2.0 où les producteurs peuvent être, en même temps, des consommateurs.<br/>
Accepter de mettre de la participation dans une entreprise c’est donc accepter de basculer dans un milieu associé, c’est à dire <span style="font-weight: bold;">accepter que ses clients prennent part, en amont, au design et à la conception des services ou des produits de l’entreprise</span>. C’est aussi accepter, en interne, de repenser les logiques d’organisation du travail afin de s’émanciper des pures logiques hiérarchique et administratives.<br/>
Autant dire que toutes les organisations n’ont pas le même degré de maturité face à cette bascule en mode participatif.</p>
<p><span style="font-weight: bold;">2. La simplicité :</span><br/>
C’est le volet <span style="font-style: italic;">design</span> du Web 2.0.<br/>
<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E3.jpeg" width="401"/></p>
<p>Il s’agit de la simplicité des interfaces applicatives, qui relèvent bien souvent du cauchemar dès qu’on franchit les pares-feux des entreprises. Cela s’explique car les utilisateurs des applications sont rarement ceux qui décident ; dans le meilleur des cas on les consulte pour les fonctionnalités attendues, mais <span style="font-weight: bold;">les interfaces de travail sont bien souvent la cinquième roue du carrosse</span>.<br/>
Simplicité des interfaces renvoie donc à la convivialité des interfaces utilisateurs ainsi qu’à <span style="font-weight: bold;">la réflexion autour du poste de travail en entreprise</span>. Derrière cet aspect on retrouve également toutes les logiques de Rich Internet Application (RIA) ou Rich Desktop Application (RDA) dont Google, Microsoft et Adobe sont les principaux acteurs.<br/>
Mais l’axe simplicité du Web 2.0 renvoie aussi à <span style="font-weight: bold;">la simplicité des services</span>. Si les site web 2.0 qui ont du succès c’est toujours parce qu’ils proposent un service très simple, pas besoin d’une formation ou d’un mode d’emploi. Les solutions web 2.0 ne font qu’une chose et en général elle le font bien : Flickr pour partager des images, Youtube pour partager des video, Del.ico.us pour partager des bookmarks, etc. On est à l’opposé de la logique du “tout intégré” que portent généralement les systèmes d’informations des entreprises, induisant des lourdeurs dans la gestion et l’évolution de celui-ci. Par provocation on pourrait dire que la logique du web 2.0 c’est une logique du tout désintégré.</p>
<p><span style="font-weight: bold;">3. L’ouverture des données :</span><br/>
C’est le volet technique du Web 2.0.<br/>
<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E4.jpeg" width="401"/></p>
<p>Pour que les données et les services puissent collaborer et constituer un écosystème il faut que l’accès aux données soit non seulement possible mais aussi favorisé. Pour cela, l’ensemble des logiciels doivent proposer des <span style="font-weight: bold;">APIs </span>(Application Programming Interface). Ces APIs décrivent comment accéder aux données et aux services de l’application, c’est grâce à elles que les programmeurs peuvent créer de nouveaux services très simplement à partir d’autres services et réutiliser des données existantes.</p>
<p>C’est cette possibilité qui permet de faire des <span style="font-style: italic;">Mashups</span>, c’est à dire des mélanges de données provenant de différents services applicatifs (ce que fit Google en proposant des APIs pour Google Maps permettant d’exposer des données pour géolocaliser un lieu sur une carte).</p>
<p>Dans le périmètre de l’entreprise, les applications doivent proposer des APIs pour pouvoir exposer des données qui seront utilisées ailleurs, et pourquoi pas <span style="font-weight: bold;">à l’extérieur de l’entreprise</span>. Pour une banque de détail par exemple, il s’agira d’exposer les données financières des clients pour leur permettre de consulter leur état de compte dans un portail personnalisé grand public comme Netvibes ou iGoogle. C’est à dire que les données de l’entreprise peuvent être consultées <span style="font-weight: bold;">indépendamment de l’interface que propose la banque</span> sur son propre site web.</p>
<p>Bien sûr, les application natives du web 2.0 (Blogs, wiki) ont cet  “ADN du Web 2.0″, et donc cette ouverture des données en standard en proposant des APIs et en générant des flux Atom/RSS.</p>
<p>Voyons à présent les logiques industrielles et économiques dernières le web 2.0.<br/>
Le Web 2.0 a changé la figure du web en ce sens que le web a commencé à devenir non plus un web de pages mais un <span style="font-weight: bold;">web de données</span>.<br/>
<img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E5.jpeg" width="400"/><br/>
Dans le web de pages, les informations sont stockées puis projetées sur la toile, c’est un procédé essentiellement cinématographique qui est à l’oeuvre, avec le public des internautes qui regarde et consulte les pages sur la toile.</p>
<p>Avec le web 2.0, les sites web proposent de <span style="font-weight: bold;">stocker les données des internautes</span> (le fameux User Generated Content), le sites web deviennent dès lors de moins en moins des vitrines de documents commerciaux mais de véritables applications qui se nourrissent du contenu envoyé par les utilisateurs.<br/>
Avec les données des utilisateurs (documents, photos, video, audio) sur le web, on peut dire que le Web devient la plate forme de données pour le grand public. Mais cela va beaucoup plus loin car le web devient également la plate-forme de toute l’industrie des technologies de l’information.</p>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E6.jpeg" width="400"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">Mais si le web est la plate-forme, qu’est ce que le Web aujourd’hui ?</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E7.jpeg" width="400"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">Comme on l’a vu, c’est le web 2.0, mais peut-importe son nom, c’est juste le web d’aujourd’hui. En revanche, ce que l’on voit moins, c’est que <span style="font-weight: bold;">le web 2.0 n’est que la partie visible de l’iceberg</span>, la partie immergée étant le Software as a service. Et ce pour une raison bien simple : tout les services web 2.0 reposent sur des logiciels qui ne sont pas installés sur l’ordinateur, ou dans le système d’information (je mets de côté les logiques hybrides de type RIA, RDA, voire même les plugins Firefox).</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">Je rappelle ici après les bases de définition de ce qu’est le Software as a Service.
<p style="font-weight: bold;">Full Web :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E8.jpeg" width="400"/><br/>
Le SaaS est totalement intégré dans l’environnement du web, dans son architecture et dans le respect des standards. En conséquence on accède aux services en mode SaaS par HTTP et via une URL, et bien sûr on offre toutes les APIs qui vont bien.
<p style="font-weight: bold;">Économies d’échelle et outil de production :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E9.jpeg" width="400"/><br/>
Un acteur SaaS est de facto dans une logique industrielle d’économie d’échelle. Il doit bénéficier d’infrastructures importantes pour la production de ses services, soit les siennes s’il veut être un acteur de rang 1, soit celles d’un partenaire (par exemple Amazon) s’il est un acteur de rang 2.
<p style="font-weight: bold;">Sans installation :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E10.jpeg" width="400"/><br/>
Aucune installation dans le système d’information et aucun accès à l’environnement desktop sur le poste de travail n’est nécessaire. Tout passe par le navigateur.
<p style="font-weight: bold;">Multi-tenants :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E11.jpeg" width="401"/><br/>
Une seule instance du logiciel pour x clients. Ce qui signifie que l’environnement de production est mutualisé et virtualisé. Aucun hébergement dédié pour un client n’est possible. Et ce, contrairement aux solutions ASP qui disposent d’un environnement dédié pour chaque client et qui donc ne peuvent bénéficier des vertus de la mutualisation (nouveaux clients = nouvelles bases de données).
<p style="font-weight: bold;">Web Analytics :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E111.jpeg" width="400"/><br/>
Une solution SaaS n’est viable que si elle dispose de puissants outils d’analyse et de reporting pour détecter les tendances d’utilisation et de comportement des clients. Grâce à çà, les évolutions seront plus en phase avec les pratiques des utilisateurs. Le vrai métier d’un acteur SaaS c’est de “tâter le pouls” de ses utilisateurs en quasi temps réel.
<p style="font-weight: bold;">Agilité :</p>
</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E12.jpeg" width="226"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">La conséquence de plusieurs des points précédents est qu’une solution SaaS doit faire preuve d’agilité dans l’évolution de la solution. Les développements sont incrémentaux, c’est le règne du Beta, de l’essai et de l’expérimentation permanents pour coller au plus prêts du marché et générer le plus d’innovation possible.Mais pourquoi la démarche de fond qu’est le Software as a Service va-t-elle avoir le même impact sur le monde de l’entreprise que celui quel a dans le domaine du grand public ?<br/>
Pour le comprendre on s’aidera du paradigme de la <a href="http://fr.wikipedia.org/wiki/Long_tail">long tail</a> dans le schéma ci-dessous :</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="301" src="http://www.christian-faure.net/wp-images/entreprise2.0/E13.jpeg" width="401"/><br/>
On voit bien que les acteurs proposant des solutions en mode SaaS viennent soit du marché grand public, soit du marché des PME. Or, les technologies de l’information restent une industrie et à ce titre sont soumise à certaines logiques industrielles dont l’une des toutes premières est la nécessité de faire des<span style="font-weight: bold;"> économies d’échelle pour abaisser les coûts.</span></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E14.jpeg" width="400"/><br/>
Oeuvrant sur le marché grand public, les acteurs SaaS ont de facto conçu des solutions utilisées par des millions d’utilisateurs, constituant ainsi une des condition de base pour faire des économies d’échelles, à savoir <span style="font-weight: bold;">un marché de masse</span>.</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E15.jpeg" width="401"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">Ce marché de masse étant constitué par l’agrégation de millions d’utilisateurs :</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E16.jpeg" width="401"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">Enfin, pour répondre à ce marché de masse, il a fallu constituer un véritable <span style="font-weight: bold;">outil de production industriel de masse</span>, renvoyant tous les acteurs dit “professionnels” au rang d’artisans. Aujourd’hui prêt de 2% de la production électrique totale des USA est consommée par les <span style="font-style: italic;">data centers</span>, fini de rigoler donc.</div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;"><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E17.jpeg" width="401"/></div>
<div id="b0ey" style="padding: 1em 0pt; text-align: left;">La conséquence de cette mutation industrielle est que le système d’information d’une entreprise va être de plus en plus déporté de ses locaux vers les plates-formes web en mode SaaS (voir le parallèle fait par Nicholas Carr dans son dernière livre “The big Switch”, même si le livre est très médiocre). Autre conséquence bien sûr :<span style="font-weight: bold;"> les données ne vont plus être dans le giron technologique de l’entreprise</span>.<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E18.jpeg" width="401"/>Les données du système d’information de l’entreprise vont être réparties sur ce que l’on commence à appeler des super-plateformes :<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E19.jpeg" width="401"/>
<p><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E20.jpeg" width="400"/></p>
<p><img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E21.jpeg" width="400"/><br/>
Attention, tout n’est pas magique, il y a des <span style="font-weight: bold;">points de vigilance</span> que chaque entreprise doit évaluer.</p>
<p><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E23.jpeg" width="400"/></p>
<p><span style="font-weight: bold;">La qualité réseau :</span> dans l’optique d’une bascule de plusieurs milliers d’utilisateurs vers des solutions en mode SaaS il vaut mieux muscler la qualité réseau de la connexion internet (qui est généralement médiocre dans les entreprises). La bonne nouvelle est que le coût de la bande passante internet est moins chère que celui des réseaux internes (LAN ou WAN), mais il faudra quand même revoir la politique réseau de l’entreprise.</p>
<p><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E24.jpeg" width="400"/></p>
<p><span style="font-weight: bold;">La Road Map</span> (modifications et ajout de nouvelles fonctionnalités) d’une solution SaaS est quelque chose que l’entreprise ne va plus maîtriser. On le voit au quotidien avec les modification que fait Google sur Google Doc : un coup l’interface change, de nouvelles fonctions sont ajoutées, et tout cela bien sûr sans demander l’avis des clients ou des utilisateurs. Il faudra notamment mettre en place un support/help desk musclé car le moindre changement et c’est des milliers d’appels assurés (je ne trouve plus le bouton “Enregistrer”!)</p>
<p><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E25.jpeg" width="401"/></p>
<p>La confidentialité des données est bien sûr un sujet de discussion majeur. Mais il est en grande partie psychologique de mon point de vue.</p>
<p><img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E26.jpeg" width="400"/></p>
<p>Autre point à aborder avant de passer au SaaS : <span style="font-weight: bold;">le Off Line</span>. Que vont faire tous vos employés s’ils ne se sont plus connectés ? Il faudra identifier les situations de mobilité et d’absence de connexion afin de mesurer objectivement l’impact que peut avoir le mode déconnecté sur certaines populations. Jetez également un oeil aux modes déconnectés qui existent (en natif chez Microsoft pour cause de client lourd, intégré ou à venir chez Salesforce et Google).</p>
<p><img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E27.jpeg" width="400"/></p>
<p>Le <span style="font-weight: bold;">statut juridique</span> des acteurs en mode SaaS reste encore flou : souvent ils ont le statut de “fournisseurs de contenu”, étrange quand on sait que c’est vous qui fournissez vos données! Sachez également que la législation Américaine et Européenne n’est pas la même. Il existe des solutions sectorielles en mode SaaS incompatibles avec la législation européenne qui interdit à certaines entreprises de déléguer la gestion et le stockage des données à des tiers.<br/>
<img height="300" src="http://www.christian-faure.net/wp-images/entreprise2.0/E28.jpeg" width="401"/></p>
<p>Bien sûr il faudra évaluer <span style="font-weight: bold;">les modalités de sortie de la solution SaaS</span>, ce n’est pas après une migration massive des données qu’il faudra réaliser qu’il n’y a rien de prévu pour automatiser l’export des données (on parle de Rollback).</p>
<p><img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E29.jpeg" width="400"/></p>
<p>Dernier point, il ne faudrait pas passer d’une logique de silos applicatifs dans le système d’information tant décriée, à une logique de silos sur le Web. Les solutions SaaS choisies devront <span style="font-weight: bold;">être interopérables avec d’autres offres SaaS et bien évidemment continuer à être articulées avec les application patrimoniales</span> (Legacy qui restent dans le systèmes d’information. La richesse des APIs sera ici déterminante.<br/>
<img height="299" src="http://www.christian-faure.net/wp-images/entreprise2.0/E30.jpeg" width="400"/></p>
<p>Nous voilà arrivés au terme de cette introduction à l’Entreprise 2.0 avec, pour terminer, un petit schéma qui résume la définition suivante :</p>
<div style="margin-left: 40px;">Une entreprise 2.0 est une entreprise qui est soumise à un double mouvement de balancier : d’un côté elle met du Web 2.0 dans son système d’information, et de l’autre elle commence à basculer une partie de son portefeuille applicatif en mode SaaS.</div>
<p><img height="303" src="http://www.christian-faure.net/wp-images/entreprise2.0/E31.jpeg" width="400"/></p></div>
<p/><img height="1" src="http://feeds.feedburner.com/~r/christian-faure/wMuM/~4/286961338" width="1"/></div>
    </content>
    <updated>2008-05-09T17:05:43Z</updated>
    <category term="Internet"/>
    <category term="Entreprise"/>
    <category term="Technique"/>
    <category term="Economie"/>
    <author>
      <name>Christian</name>
    </author>
    <source>
      <id>http://www.christian-faure.net</id>
      <author>
        <name>Christian Fauré</name>
      </author>
      <link href="http://www.christian-faure.net" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/christian-faure/wMuM" rel="self" type="application/rss+xml"/>
      <subtitle>Hypomnemata : supports de mémoire</subtitle>
      <title>Christian Fauré</title>
      <updated>2008-05-11T13:29:22Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://apassant.net/blog/2008/05/09/first-workshop-on-social-data-on-the-web-at-iswc2008/</id>
    <link href="http://apassant.net/blog/2008/05/09/first-workshop-on-social-data-on-the-web-at-iswc2008/" rel="alternate" type="text/html"/>
    <title>First workshop on Social Data on the Web at ISWC2008</title>
    <summary>As you may have already read, the 1st workshop on Social Data on the Web (SDoW2008) will be held at next ISWC, at the end of October in Karlshrue and I'm really glad to co-chair it with Uldis, John and Sergio.

If you work on a related field, either as a ...</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>As you may have <a href="http://www.wikier.org/blog/sdow2008">already</a> <a href="http://ebiquity.umbc.edu/blogger/2008/05/06/social-data-on-the-web-workshop-at-iswc-2008/">read</a>, the 1st workshop on Social Data on the Web (<a href="http://sdow2008.semanticweb.org">SDoW2008</a>) will be held at next <a href="http://iswc2008.semanticweb.org/">ISWC</a>, at the end of October in Karlshrue and I’m really glad to co-chair it with <a href="http://captsolo.net">Uldis</a>, <a href="http://johnbreslin.com">John</a> and <a href="http://wikier.org">Sergio</a>.</p>
<p>If you work on a related field, either as a researcher, industrial or <span rel="foaf:depiction"><span><span><span rel="rdfs:seealso"><span rel="cfp:subevent">developer</span></span></span></span></span>, you’re more than welcome to submit a paper, a poster or a demo until the 25th of July via <a href="http://www.easychair.org/conferences/?conf=sdow2008">easychair</a>. More information about the topics and organization of the workshop it can be found on the <a href="http://sdow2008.semanticweb.org">SDoW2008 website</a>.</p>
<p>While talking about the <em>Social Web</em>, the proceedings of the <a href="http://bis.kie.ae.poznan.pl/11th_bis/wscfp.php?ws=saw2008http://bis.kie.ae.poznan.pl/11th_bis/wscfp.php?ws=saw2008">SAW2008</a> workshop that was held tuesday in Innsbruck will be online soon on <a href="http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/">CEUR-WS</a> website (<a href="http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-333/">Vol. 333</a>). Here are also the <a href="http://www.slideshare.net/terraces/social-networks-and-data-portability-using-semantic-web-technologies/">slides</a> of <a href="http://apassant.net/blog/2008/05/02/semantic-web-talks-in-innsbruck/">our talk</a> I gave here, and <a href="http://www.slideshare.net/terraces/combining-structure-and-semantics-for-ontologybased-corporate-wikis/">the one I gave</a> in the main conference about <a href="http://www.springerlink.com/content/t15655020j234g8k/?p=1a43211fa9f94abfa2aa487b46bab4ae&amp;pi=0">another paper</a> (that should be soon uploaded here).</p></div>
    </content>
    <updated>2008-05-09T11:00:02Z</updated>
    <category term="WebSemantique"/>
    <category term="Semantic Web"/>
    <category term="bis2008"/>
    <category term="dataportability"/>
    <category term="iswc2008"/>
    <category term="saw2008"/>
    <category term="sdow2008"/>
    <category term="slideshare"/>
    <category term="socialgraph"/>
    <author>
      <name>Alex</name>
    </author>
    <source>
      <id>http://apassant.net</id>
      <author>
        <name>Alexandre Passant</name>
      </author>
      <link href="http://apassant.net" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/apassant/blog" rel="self" type="application/rss+xml"/>
      <title>Alexandre Passant</title>
      <updated>2008-05-12T23:04:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://lacot.org/blog/2008/05/09/le-debut-de-la-gloire.html</id>
    <link href="http://lacot.org/blog/2008/05/09/le-debut-de-la-gloire.html" rel="alternate" type="text/html"/>
    <title xml:lang="en">Le début de la gloire</title>
    <summary xml:lang="en">On Strange days, facing yourself is worth stopping the time... One night on the Earth, Flickr

Vous pouvez me voir en vidéo, pour de vrai comme à Hollywood, sur tv4it.net, une chaîne de télévision Web sur laquelle je suis intervenu il y a deux semaines au sujet des RIA et autres RDA :</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p class="illustration">
<img alt="One night on the Earth" src="http://lacot.org/images/2008/04/one-night-on-the-earth.jpg"/>
</p>
<p class="illustration-comment">
On <a href="http://www.lastfm.fr/music/The+Doors/_/Strange+Days">Strange days</a>, facing yourself is worth stopping the time... <a href="http://www.flickr.com/photos/clear-cls-key-off/2427513166/"><q>One night on the Earth</q>, Flickr</a>
</p>
<p>Vous pouvez <a href="http://www.tv4it.net/permalink/5265/riarda-sur-quelle-technologie-miser-.aspx">me voir en vidéo</a>, pour de vrai comme à Hollywood, sur <a href="http://www.tv4it.net/">tv4it.net</a>, une chaîne de télévision Web sur laquelle je suis intervenu il y a deux semaines au sujet des RIA et autres RDA :</p>
<p>
</p></div>
    </content>
    <updated>2008-05-09T02:40:00Z</updated>
    <author>
      <name>Xavier Lacot</name>
      <email>xavier@lacot.org</email>
    </author>
    <source>
      <id>http://lacot.org/blog</id>
      <author>
        <name>Xavier Lacot</name>
        <email>xavier@lacot.org</email>
      </author>
      <link href="http://lacot.org/blog" rel="alternate" type="text/html"/>
      <link href="http://lacot.org/syndication/blog.atom" rel="self" type="application/atom+xml"/>
      <title xml:lang="en">Chez Xavier - Thoughts</title>
      <updated>2008-05-14T20:27:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>http://www.go3r.org/</id>
    <link href="http://www.go3r.org/" rel="alternate" type="text/html"/>
    <title>Go3R</title>
    <summary>Moteur de recherche scientifique basé sur la sémantique. Woaw! Contre les expérimentations animales.</summary>
    <updated>2008-05-08T21:23:08Z</updated>
    <category term="WebSemantique"/>
    <category term="activism moteurdiversweb search websemantique"/>
    <author>
      <name>of</name>
    </author>
    <source>
      <id>http://del.icio.us/tag/websemantique</id>
      <author>
        <name>del.icio.us</name>
      </a