# wallabag_entry

title: L'échec de l'agilité : l'anarchisme confronté aux entreprises - Blog Arolla
url: http://www.arolla.fr/blog/2017/02/agilite-anarchie-dans-l-entreprise/
created_at: 2017-08-10 23:21:18
updated_at: 2017-08-10 23:21:18
mimetype: text/html
language: fr-FR
domain_name: www.arolla.fr
preview_picture: http://www.arolla.fr/blog/wp-content/uploads/2017/01/BjkX6v0CQAA4J-300x225.jpg
http_status: 200
content:
  <p>L’agilité.<br />
  Tout le monde en parle, tout le monde en fait … mais presque tout le monde affiche un sourire crispé quand on lui en parle, met des guillemets en l’énonçant, s’excuse de le faire approximativement :<br /><em>‘On fait presque du Scrum’</em>, <em>‘oui, on est “agile” (petit signe en guillemets)’</em>, <em>‘oui, oui, on est agile, enfin…’</em>.</p>
  <p>Mais au fond de quoi parle-t-on ? Qu’est-ce que ce fameux “agile” ?<br /></p>
  <p>S’adapter à un environnement changeant et surtout rectifier le tir pendant qu’il en est encore temps : c’est la première caractéristique qui me vient à l’esprit.<br />
  Le feedback permet de vérifier que l’on s’est bien compris, d’apprendre et de s’adapter. Et si la boucle de feedback est rapide, elle permet d’apprendre rapidement et donc de s’améliorer.</p>
  <p>Les pratiques agiles sont souvent mises en opposition avec la gestion de projet traditionnelle (dite “waterfall”,”cycle en V”), car elles permettent d’éviter le fameux “effet tunnel”, qui consiste à ne pouvoir recevoir de feedback qu’en fin de projet, donc quand il est trop tard.</p>
  <p>Le fait de devoir construire la route qu’emprunte le projet, au fur et à mesure qu’il avance, me fait penser à l’anarchiste <a href="https://fr.wikipedia.org/wiki/Pierre_Kropotkine">Kropotkine</a>  qui écrivait que l’harmonie dans la société se ferait “par un incessant mouvement d’ajustement et de réajustement entre une multitude de forces et d’influences”.</p>
  <p>Kropotkine se refusait, comme la plupart des anarchistes, à établir des plans précis et définitifs sur le fonctionnement que devrait avoir la société.<br />
  En effet, les anarchistes croient en l’autogestion et en l’autorégulation, et <a href="https://fr.wikipedia.org/wiki/Pierre_Kropotkine">Kropotkine</a> avait bien compris cette valeur du manifeste agile: <em><strong>L’adaptation au changement, plus que le suivi d’un plan</strong></em>.</p>
  <h1>L’ordre moins le pouvoir</h1>
  <p>L’anarchisme est aujourd’hui souvent associée et réduite au chaos et à la violence.  Afin d’éviter toute confusion, il me semble donc important de revenir sur les principes de base de l’anarchisme.<br />
  Tout d’abord, l’anarchisme prend sa source dans la contradiction entre l’Etat et la société (l’Etat ayant des buts et des objectifs en décalage avec les attentes et besoins du peuple) et souhaite éliminer cette contradiction en supprimant l’Etat.<br />
  Cela ferait de notre société une réunion libre d’êtres libres et égaux. En revanche, absence de pouvoir ne veut pas dire absence d’organisation : on parle donc bien ici d’auto-organisation.  J’imagine que vous voyez où je veux en venir.</p>
  <p>Par exemple, les anarchistes n’aiment pas vraiment la police car elle est là pour faire respecter les lois… Et les anarchistes n’aiment pas vraiment les lois.<br />
  Seraient-ils donc pour le chaos ? Pour une société où chacun pourrait tuer son prochain sur un coup de tête et voler autrui par plaisir ? Bien sûr que non.<br />
  Dans <strong><em>La morale anarchiste</em></strong>, Kropotkine explique que les lois définissent ce qui est bien ou mal dans la société, le concept de légalité se substituant ainsi à la morale.<br />
  En outre, il dénonce le fait que les lois ont tendance à se mêler de choses qui ne regardent pas l’Etat (la sexualité, les croyances, etc.) et punissent des actions hors de leur contexte. Kropotkine nous propose donc une autre vision, basée sur le bien commun.</p>
  <p><a href="http://www.arolla.fr/blog/wp-content/uploads/2017/01/anarchie.png"><img src="http://www.arolla.fr/blog/wp-content/uploads/2017/01/anarchie.png" alt="anarchie" width="220" height="220" class="aligncenter size-small wp-image-4475" /></a></p>
  <p>En effet, la seule vraie question qui semble retenir l’attention de Kropotkine est la suivante : “Est-ce bon pour la communauté ?”.<br />
  Sans la barrière entre légalité et illégalité et sans la présence des forces de l’ordre pour faire respecter ces lois, il serait à la charge de chaque individu de se poser la question et d’intervenir le cas échéant.<br />
  Il faut donc arriver à faire en sorte que les gens aient confiance en leur prise d’initiative pour qu’ils deviennent acteurs de leur société. On retrouve là la notion de Leadership portée par le lean et donc l’agilité.<br />
  Ainsi, une personne incivique dans les transports ou s’accaparant trop de ressources serait aussitôt stoppée par la population. Cette dernière ne pouvant plus se reposer sur une autorité tierce pour faire respecter l’ordre.<br />
  Cela remettrait l’éthique et la morale au centre de la société et des préoccupations des citoyens. L’effet positif serait de remettre toutes les formes de violences (physique, sociale, etc.) sur un pied d’égalité.</p>
  <h2>Agilité et anarchisme contre le dogmatisme</h2>
  <p>L’agilité prône les équipes auto-organisées et le pragmatisme. Elle propose de s’adapter plutôt que de suivre dogmatiquement des process.<br />
  Mais au final, qu’est-ce qu’un process sinon une loi dans l’entreprise ? Les agilistes n’auraient-ils pas quelques valeurs anarchistes ?<br />
  Serions-nous en train d’arriver à cette autre valeur du manifeste agile : <em><strong>Les individus et leurs interactions plus que les processus et les outils</strong></em> ?<br />
  C’est pour cela que l’on préfère, au sein des équipes agiles, respecter des règles d’équipe (règles de vie définies par l’équipe lors des rétrospectives), que des process dictés par une tierce autorité.<br />
  D’ailleurs, le 11ème principe sous-jacent au manifeste Agile l’explique bien : <strong><em>Les meilleures architectures, spécifications et conceptions émergent d’équipes auto-organisées</em></strong>.</p>
  <p>Et l’on peut noter que les anarchistes ne rejettent pas toute forme d’autorité, seulement l’autorité imposée, ce qu’explique admirablement Bakunin</p>
  <blockquote><p>
    ” Nous acceptons toutes les autorités naturelles et toutes les influences de fait, aucune de droit, car toute autorité ou toute influence de droit, et comme telle officiellement imposée devenant aussitôt une oppression et un mensonge, nous imposerait infailliblement, comme je crois l’avoir suffisamment démontré, l’esclavage et l’absurdité.</p>
  <p>  En un mot, nous repoussons toute législation toute autorité et toute influence privilégiée, patentée, officielle et légale, même sortie du suffrage universel, convaincus qu’elles ne pourront tourner jamais qu’au profit d’une minorité dominante et exploitante, contre les intérêts de l’immense majorité asservie.</p>
  <p>  Voilà dans quel sens nous sommes réellement des anarchistes.”</p>
  <p>  <em>Mikhail Bakunin</em>
  </p></blockquote>
  <p>L’absence d’autorité n’est donc pas incompatible avec la présence de leaders, en revanche, elle demande une double responsabilité : celle de vouloir mener le groupe d’une part, et pour le groupe, celle de vouloir suivre les propositions du leader.<br />
  Tout le monde est ainsi responsabilisé.</p>
  <p>Dans un registre plus <a href="https://fr.wiktionary.org/wiki/capillotract%C3%A9">capillotracté</a>, on pourrait aussi considérer la loi comme une documentation exhaustive.<br />
  L’anarchisme prônerait alors le fait d’avoir <em><strong>une société opérationnelle plus qu’une documentation exhaustive</strong></em>, c’est-à-dire une société qui fonctionne pour les personnes qui y vivent plutôt que d’avoir des lois qui expliquent comment les gens devraient se comporter.</p>
  <h2>Une histoire de confiance ?</h2>
  <p>C’est la valeur qui se cache derrière la 3e valeur du manifeste agile : <em><strong>la collaboration avec les clients plus que la négociation contractuelle</strong></em>.<br />
  Un contrat est généralement mis en œuvre pour protéger les parties l’une de l’autre. Difficile de vraiment collaborer lorsque ce qui nous unit est justement ce qui nous sépare.<br />
  On ne peut, en effet, se passer de négociations contractuelles que si les personnes présentes autour de la table ont le même but (la fameuse “communauté” par rapport à laquelle on positionne les notions de bien et de mal), hors intérêts externes.</p>
  <p>C’est pour ça qu’il faut être avec les “bonnes personnes”, centrés autour des mêmes valeurs. Autant la tâche est plus complexe dans une société car la “communauté” doit être inclusive (sinon la notion de bien par rapport à la communauté peut vite déraper), autant sur un projet, il est possible de choisir votre “communauté” ainsi que vos clients.<br />
  Profitez-en ! Car c’est le vrai point bloquant dans la vision décrite dans <em><strong>la morale anarchiste</strong></em> et vous avez le luxe de pouvoir vous mettre en conditions quasi idéales.</p>
  <h2>L’agilité, la résurrection de l’anarchisme ?</h2>
  <p>Haymarket, la révolution russe, la guerre d’Espagne… A force d’assassiner les anarchistes, le mouvement était tombé en désuétude avec ses valeurs et sa définition dénaturées.<br />
  Mais j’ai l’impression que cette philosophie a réapparu sous le nom d’agilité. Et ce n’est pas par hasard car au final, quoi de plus logique que demander aux personnes qui font (et donc savent) plutôt que de leur imposer une vision depuis l’extérieur ?<br />
  En constatant l’échec des anciennes méthodes, l’industrie a commencé à faire preuve de pragmatisme et a préféré :</p>
  <ul><li>mettre en place des boucles de feedback pour pouvoir s’adapter </li>
  <li>faire confiance aux équipes pour agir au mieux pour le projet</li>
  </ul><p>C’est donc pour moi la philosophie anarchiste qui est née à nouveau de nos projets : lorsqu’ils se sont heurtés aux limites du système hiérarchique pyramidal ainsi qu’aux plans établis à l’avance par une élite dite « sachante ».</p>
  <p>Là où agilité et anarchisme diffèrent, c’est que les équipes agiles sont auto-organisées, alors que l’anarchisme prône l’auto-gestion.</p>
  <p>La nuance entre ces termes se trouve dans la définition des objectifs. Dans l’auto-gestion, les objectifs sont définis par la communauté, alors que dans l’auto-organisation, on vous donne la liberté de moyens pour atteindre un objectif donné.<br />
  En effet, en entreprise, il semble pertinent que les objectifs à atteindre soient définis par votre patron (c’est le principe-même du salariat : l’enrôlement de personnes via un salaire pour les mettre en mouvement vers un objectif que vous désirez atteindre).</p>
  <p>D’ailleurs, c’est souvent en se trompant d’objectifs que l’on envoie ses équipes dans le mur (“implémenter Scrum”, “utiliser des micro-services”, etc. ne sont pas des objectifs).</p>
  <h1>Pourquoi l’agilité ne fonctionne-t-elle pas ?</h1>
  <p>Revenons enfin à notre sujet de départ :<br />
  Pourquoi ce malaise autour de l’agilité ? Alors certes, le malaise n’est pas ressenti partout, l’agilité fonctionnant dans beaucoup d’équipes et de petites structures.<br />
  Mais pourquoi est-elle source de malaise dans certaines structures (votre grand compte par exemple) ? Pourquoi rien ne ressort de vos cérémonies ? Pourquoi avez-vous l’impression que le sprint est devenu une course insoutenable à la productivité ?<br />
  Peut-être avez-vous tenté d’appliquer dogmatiquement Scrum, en renommant votre chef de projet “Scrum master”, en obligeant les équipes à participer à des cérémonies qu’elles ne comprennent pas ?</p>
  <p>En fait, la réponse est assez simple : vous essayez de mettre en place l’anarchisme dans une structure qui veut tout contrôler.<br />
  Par exemple : prévoir le coût des choses avant de les avoir définies (et donc au moment où l’on a le moins d’informations sur le sujet), avoir l’impression de savoir où on va, que tout est sous contrôle.<br />
  C’est pourtant l’origine de l’agilité ! On sait que ça ne va pas se passer comme prévu, réfléchissons plutôt à comment nous adapter.<br />
  Donc oui, vous essayez de mettre en place l’anarchisme dans une structure capitaliste, une de ces nombreuses entreprises qui base sa croissance sur une sur-interprétation du Darwinisme pouvant se résumer par “manger ou être mangé”.<br />
  Vous demandez à des personnes qui ont été recrutées pour leur docilité de faire preuve de leadership ?<br />
  Et à celles recrutées pour leur autorité de déléguer ?</p>
  <p>Vous n’y arrivez pas ? Vous vous confrontez à une culture contraire ? Etes forcés de mener une “conduite du changement”…? C’est étonnant !</p>
  <p>L’agilité, comme elle devrait l’être effectivement, grince et a du mal à passer. Tout simplement car elle n’est pas adaptée à notre système.<br />
  On peut aisément l’expliquer par le fait que l’agilité n’est pas une évolution de l’approche traditionnelle mais une rupture avec la pensée déterministe de cette approche (à l’image de la physique quantique qui fut une rupture avec la physique traditionnelle).<br />
  L’agilité est en rupture avec l’entreprise de la même façon que l’anarchisme serait en rupture avec notre société actuelle.<br />
  On parle ici de remettre l’Humain au centre des stratégies.</p>
  <h1>Abandonner l’agilité ?</h1>
  <p>L’agilité va à l’encontre de la façon dont est construite notre société. C’est ce qui explique cette zone de friction permanente.<br />
  Je pense sincèrement que la philosophie agile est la bonne approche, mais qu’elle n’est pas adaptée à tous les environnements.</p>
  <p>Si une méthode ne vous convient pas, arrêtez de la tordre, de la cabosser pour la faire rentrer dans votre moule. Laissez tomber et arrêter de faire souffrir vos équipes plus qu’elles ne souffrent déjà !<br /><a href="http://www.arolla.fr/blog/wp-content/uploads/2017/01/BjkX6v0CQAA4J.jpg"><img src="http://www.arolla.fr/blog/wp-content/uploads/2017/01/BjkX6v0CQAA4J-300x225.jpg" alt="bjkx6v0cqaa4j" width="300" height="225" class="aligncenter size-medium wp-image-4474" /></a></p>
  <p>Après, en ce qui me concerne, j’aime bien cette “agilité” et ses principes. Dans l’idéal, je préférerais que l’on change de société, pour aller vers plus de confiance, plus de réalisme et plus de collaboration, plutôt que de l’abandonner.<br />
  Cela permettrait qu’elle ne soit plus en rupture avec le modèle des entreprises, et on y gagnerait tous.</p>
  <p>Mais c’est un idéal encore lointain…</p>
  <p><em>sources et inspirations:</em><br />
  – <a href="http://agilemanifesto.org/iso/fr/manifesto.html">manifeste agile</a><br />
  – Baillargeon, Normand. “L’ordre moins le pouvoir : Histoire &amp; actualité de l’anarchisme”. Agone, 2008. ISBN-10: 2748900979<br />
  – Petr Alekseevitch, Kropotkine.”la morale anarchiste”. Fayard (1001 nuits) ISBN-10: 2842058372<br />
  – Mikhail, Bakounine. “Dieu et l’état”. Fayard (1001 nuits) . ISBN-10: 2842050746<br />
  – “Ni dieu Ni Maitre”, Les sales majestés. https://play.spotify.com/track/2qhMZuHIUmTh0yAZE3zVbY</p>
  <p>Merci à <a href="https://twitter.com/OyoMy">Olivier</a> pour avoir collaboré à enrichir cet article.</p>
  <p>Edit: Nous avons monté cet article en <a href="http://oyomy.fr/2017/04/agilite-anarchie-et-un-peu-plus-a-mixit-2017/">talk</a> avec <a href="https://twitter.com/OyoMy">Olivier</a></p>
  <div id="tweetbutton4473" class="tw_button"><a href="http://twitter.com/share?url=http%3A%2F%2Ftinyurl.com%2Fzccwq3g&amp;via=ArollaFr&amp;text=%23agilit%C3%A9%20en%20%C3%A9chec%2C%20ou%20l%27%23anarchie%20dans%20entreprise%20%21&amp;related=MrCafetux&amp;lang=fr&amp;count=none&amp;counturl=http%3A%2F%2Fwww.arolla.fr%2Fblog%2F2017%2F02%2Fagilite-anarchie-dans-l-entreprise%2F" class="twitter-share-button">Tweeter</a></div>


title: Les 10 pièges à éviter quand on lance sa boîte
created_at: 2017-08-10 23:21:19
updated_at: 2017-08-10 23:21:19
mimetype: text/html
language: fr
domain_name: start.lesechos.fr
preview_picture: https://start.lesechos.fr/images/2017/02/10/7325_1486743340_piege.jpg
http_status: 200
url:
  https://start.lesechos.fr/entreprendre/outils-conseils-pratiques/lancer-et-developper-l-activite/les-10-pieges-a-eviter-quand-on-lance-sa-boite-7325.php?b7Uely93v7CIh4oM.99

content:
  <div id="outer-main">







  <div id="content">

  <div id="news">
  <div class="grid">
  <div class="contain">
  <div class="row">

  <div class="col-full">

  Parcours du combattant
  <p>
  Par Matthieu Burin, co-fondateur et CEO de TravauxLib
  |

  10/02/2017 à 18:35,
  mis à jour le 20/02/2017</p>

  <div class="picture first">
  <div class="resizer">
  <img class="lazyload" alt="Dans l\'aventure entrepreneuriale, pièges éviter nombreux !" title="Dans l'aventure entrepreneuriale, les pièges à éviter sont nombreux !" src="https://start.lesechos.fr/images/2017/02/10/7325_1486743340_piege_970x545p.jpg" /></div>
  <p>Dans l'aventure entrepreneuriale, les pièges à éviter sont nombreux !  <strong>@Shutterstock</strong></p>
  </div>
  </div>

  </div>
  </div>
  </div>
  </div>
  </div>
  </div>

  <div class="footer-page">
  <div class="grid">
  <div class="contain">
  <div class="footer-page">
  <div class="grid">
  <div class="contain">



  <div class="row">
  <div class="row">
  <div class="col-full">
  <div class="section-title left">
  <p>
  </p><h2>Nous vous recommandons</h2>

  </div>
  </div>
  </div>
  <div class="row alaune">
  <div class="col-thierce tpl">


  <div class="image">
  <img alt="Dans les coulisses de l’unique lab Arts &amp; Culture de Google à Paris" src="https://start.lesechos.fr/images/2017/07/11/8853_1499770889_kkk.jpg" /></div>
  <div class="content">
  <div class="description">
  <p class="cat">StreetMap de la Culture</p>
  <h3 class="title">Dans les coulisses de l’unique lab Arts &amp; Culture...</h3>
  </div>
  </div>
  </div>
  <div class="col-thierce tpl">


  <div class="image">
  <img alt="La génération Y, digitale ou vieux jeu ?" src="https://start.lesechos.fr/images/2017/07/10/8841_1499690384_gen-y-digital.jpg" /></div>
  <div class="content">
  <div class="description">
  <p class="cat">Papier 1-1 écran</p>
  <h3 class="title">La génération Y, digitale ou vieux jeu ? </h3>
  </div>
  </div>
  </div>
  <div class="col-thierce tpl">


  <div class="image">
  <img alt="Chief happiness officer : poste stratégique ou poudre aux yeux ?" src="https://start.lesechos.fr/images/2017/07/11/8851_1499767465_licorne970.gif" /></div>
  <div class="content">
  <div class="description">
  <p class="cat">Job en vogue</p>
  <h3 class="title"> Chief happiness officer : poste stratégique ou...</h3>
  </div>
  </div>
  </div>
  </div>
  </div>



  <div class="row">
  <div class="col-full">
  <div class="section-title left">
  <p>
  </p><h2>à la une sur start</h2>

  </div>
  </div>
  </div>
   








  </div>
  </div>
  </div>
  </div>
  </div>
  </div>





  <div class="grid">
  <p>les echos start c'est :</p>
  </div>
  <div class="grid">
  <p class="right">Tous droits réservés</p>
  <p class="copyright">Conformément à la loi Informatique et Liberté n° 78-17 du 6 janvier 1978 relative à l'informatique, aux fichiers et aux libertés, nous nous engageons à informer les personnes qui fournissent des données nominatives sur notre site de leurs droits, notamment de leur droit d'accès et de rectification sur ces données nominatives. Nous nous engageons à prendre toutes précautions afin de préserver la sécurité de ces informations et notamment empêcher qu'elles ne soient déformées, endommagées ou communiquées à des tiers.</p>
  <p class="links"><a rel="nofollow" href="https://start.lesechos.fr/utiles/cookies/index.php">Cookies</a>/<a rel="nofollow" href="https://start.lesechos.fr/utiles/cgu/index.php">CGU</a>/<a rel="nofollow" href="https://start.lesechos.fr/sitemap.xml">Site Map</a></p>
  </div>
  <div id="FanFacebookModal" class="modal fade">
  <div class="modal-dialog">
  <div class="modal-content">
  <div class="modal-body">
  <div class="bloc-fanstart">
  <p>Pas encore fan des Echos START ?</p>
  <p>Pour ne rien manquer de nos conseils, témoignages, classements</p>
  <p class="txt-up">C'est par ici !</p>
  </div>
  </div>
  </div>
  </div>
  </div>
   

  <noscript>
  <img width="1" height="1" src="https://logs1122.xiti.com/hit.xiti?s=561591&amp;s2=4&amp;p=outils-conseils-pratiques::les_10_pieges_a_eviter_quand_on_lance_sa_boite___7325___&amp;di=&amp;an=0&amp;ac=1" alt="image" /></noscript>


title: Moi ministre du numérique, par Benjamin Bayart: reprendre tout dans le bon sens
url: http://www.slate.fr/tribune/85725/benjamin-bayart-moi-ministre-du-numerique-tribune
created_at: 2017-08-10 23:21:21
updated_at: 2017-08-10 23:21:21
mimetype: text/html
language: fr
domain_name: www.slate.fr
preview_picture: http://www.slate.fr/sites/default/files/styles/1090x500/public/chat_net1.jpg
http_status: 200
content:
  <div class="container-article">
      <div class="row">
        
        <div class="col-md-8">
          
            
            
                      <div class="subtitle">
              <h3>On a demandé à plusieurs personnalités ce qu'elles feraient si elles étaient nommées «chef» du numérique en France. La réponse de Benjamin Bayart.</h3>
            </div>
            
            <img src="http://www.slate.fr/sites/default/files/styles/1090x500/public/chat_net1.jpg" alt="«Gigabit Switches» par Riebart | Flickr licence CC BY" title="«Gigabit Switches» par Riebart | Flickr licence CC BY" /><p>«Gigabit Switches» par Riebart | Flickr <a href="https://creativecommons.org/licenses/by/2.0/">licence CC BY</a></p>
              <div class="container width_wrap">
            <div class="col-left">
              <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><div>
  <p>Qui va reprendre le flambeau de Fleur Pellerin? En attendant la nomination d'un(e) éventuel(le) secrétaire d'Etat ou ministre délégué(e) au Numérique, le journaliste Xavier de la Porte s'est mis, le temps d'une brillante chronique sur France Culture, <a href="http://www.franceculture.fr/emission-ce-qui-nous-arrive-sur-la-toile-moi-ministre-delegue-au-numerique-2014-04-03">dans la peau de l'heureux élu et a imaginé le programme</a> qu'il proposerait alors.</p>
  <p>Nous avons décidé de prolonger l'exercice <a href="http://www.slate.fr/story/85739/moi-ministre-du-numerique-tribune-personnalites-internet-francais">en demandant à différentes personnalités de l'Internet français</a>, politiques, entrepreneurs, mais aussi militants associatifs, de livrer leur programme et leurs idées si eux aussi, se voyaient propulsés à la tête du numérique. Nous avons proposé cela à plusieurs personnes, certaines ont décliné l'offre, d'autres n'étaient pas immédiatement disponibles...</p>
  <p><strong>Expert en télécommunications, Benjamin Bayart est un incontournable des sphères numériques. Il milite depuis des années en faveur de la neutralité du Net, du logiciel libre et de la protection de la liberté d'expression en France.</strong></p>
  </div>
  <p>Quel serait mon programme si on me demandait de devenir ministre du Numérique? Le premier point qu'il faut comprendre, c'est que ça ne serait possible que dans un contexte bien particulier.</p>
  <p>Bien entendu, il faudrait que mon programme soit porté par le reste du gouvernement, mais surtout il faudrait un environnement politique très différent de ce qu'il est aujourd'hui. Au moins sur deux directions. La première est qu'il faudrait du courage politique, c'est-à-dire tout le contraire de ce qu'on a vu avec l'«affaire des pigeons» –une décision mal réfléchie et une reculade très rapide. La seconde direction serait une analyse plus pragmatique du contexte économique, et en particulier ne pas suivre la voie sans issue de la rigueur.</p>
  <p>Mais la question du programme général d'un gouvernement que je puisse soutenir n'est pas celle qui est posée aujourd'hui. On va même faire l'inverse: quel serait le programme numérique d'un gouvernement qui pourrait me soutenir.</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, je protègerais la liberté d'expression</h3>
  <p>De toutes les libertés qui nous sont promises par la Déclaration des droits de l'homme de 1789, la liberté d'expression est la seule qui ne soit pas protégée en France. Elle est encadrée, c'est-à-dire limitée, par beaucoup de textes (l'injure, la calomnie, l'outrage à magistrat, l'apologie de crimes contre l'humanité, les haines diverses et avariées). Mais il n'y a aucun texte qui protège la liberté d'expression en elle-même. Le fait d'empêcher l'expression de la pensée ou de l'opinion d'un citoyen n'est pas un délit.</p>
  <p>Tant que cette liberté était purement théorique, avant les réseaux, avant 1990, ça pouvait coller. On protégeait la liberté de la presse par la loi de 1881, et on laissait aux gens le droit de se réunir pour discuter entre eux, ça suffisait à protéger la liberté d'expression. Depuis le numérique, ce n'est plus vrai. Il faut donc un texte pour protéger la liberté d'expression.</p>
  <p><a href="http://www.numnow.org/numnow-1-barcamp-proposition-de-loi-visant-a-proteger-la-liberte-dexpression/">Ce texte existe déjà, il est prêt</a>. Il a été rédigé, il y a maintenant plus d'un an, quand le gouvernement s'est intéressé à essayer de comprendre la neutralité du Net. Il a été transmis <a href="http://www.cnnumerique.fr/">au </a><a href="http://www.cnnumerique.fr/">Conseil national du numérique</a>. Il a été transmis à différents ministres. Probablement rangé verticalement dans la poubelle la plus proche. Moi, ministre du Numérique, ce texte serait proposé à l'Assemblée Nationale, et probablement voté sans aucune modification?</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, je fibrerais la France dans le bon sens</h3>
  <p>Ce projet majeur d'aménagement du territoire est identifié depuis déjà longtemps. Les travaux réglementaires ont commencé au milieu des années 2000. On trouvait dans les réponses à une consultation de 2006 de l'Arcep [Autorité de régulation du secteur des télécommunications] déjà beaucoup d'informations et de sujets de réflexion. Pourtant, la couverture en fibre optique de la France commence à peine, et on est en train de la faire dans le mauvais sens.</p>
  <p>Le premier élément est une inversion géographique. Il ne faut pas commencer par les centres-villes. Dans les centres-villes, il y a déjà du câble et un ADSL en général satisfaisant. Quand on fibre une ville, les gens qui ont un ADSL de mauvaise qualité se précipitent vers la fibre. Mais une grosse partie des habitants, qui ont déjà un accès convenable, ne considèrent la fibre que comme une solution de plus. Bilan, un taux d'abonnement un an après raccordement à la fibre autour de 20%, au mieux.</p>
  <p>En revanche, dans les zones les moins bien couvertes, le plus souvent en rase campagne, l'accès au réseau est mauvais. C'est là qu'il faut commencer la couverture fibre. Ce sont les logements les plus coûteux à raccorder, mais il y aura un taux d'abonnement qui sera entre 60% et 80%, donc bien plus facile à rentabiliser. L'effet sera de revitaliser des territoires qui sont en voie de désertification, de donner la possibilité à des entreprises d'aller s'y installer, simplement parce que l'infrastructure pour le permettre sera là.</p>
  <p>Le second élément est une inversion des acteurs. Quand un grand opérateur vient fournir des services sur la fibre dans un territoire, il ne localise pas son activité sur ce territoire. Les compétences techniques restent à Paris, le support reste à Marrakech, etc. Pour permettre le développement d'un tissu économique local, avec des compétences fortes sur le numérique, il faut permettre l'existence d'opérateurs locaux sur le territoire. La méthode actuelle pour la  couverture en fibre optique est de priviléger les grands opérateurs, et tout particulièrement Orange.</p>
  <p>C'est une erreur grave pour le développement économique de nos régions. Il faut au contraire protéger la place des petits opérateurs, en adaptant les possibilités pour ces acteurs d'intervenir sur le réseau financé par la puissance publique. C'est la seule piste qui garantisse une montée des compétences partout en France. C'est la seule approche qui permette un développement  économique du territoire, et pas seulement dans les tours du quartier d'affaires de La Défense.</p>
  <p>Le troisième élément est une inversion de la propriété. Le montage retenu actuellement est choisi de telle sorte que l'Etat investisse le moins possible. La puissance publique intervient donc en appoint des acteurs privés, en les subventionnant dans les zones qu'ils ne jugent pas rentables. Cette subvention est habilement maquillée pour éviter de se faire taper sur les doigts par les autorités européennes. Par exemple en déployant sur fonds publics un réseau prétendûment ouvert à tous les acteurs, mais dont les conditions d'accès (contractuelles et tarifaires) font que seuls quelques acteurs bien choisis pourront intervenir.</p>
  <p>Il faut au contraire que le réseau déployé soit essentiellement propriété de la puissance publique, en application du préambule de la Constitution, puisque c'est une infrastructure essentielle par nature monopolistique, comme le réseau routier. L'investissement à réaliser par la puissance publique est sans doute un peu plus élevé, mais c'est un investissement rentable, ce qui ne représente donc pas un obstacle majeur. La banque européenne d'investissement indique par exemple que pour le déploiement  de la fibre optique, elle peut lever des fonds, je cite «sans aucune difficulté».</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, je protégerais les identités numériques</h3>
  <p>Pour le moment, la notion d'identité numérique n'existe pas. Les rares fois où elle est évoquée par les politiques, c'est dans un contexte catastrophiste. En général pour expliquer qu'on ne doit publier sur Internet que sous son vrai nom, et que le ministère de l'Intérieur doit garder une trace, une preuve, de notre identité. C'est une vision effrayante. Il faut donc mettre en place des outils, et le faire dans le bon sens.</p>
  <p>Il faut donc mettre par écrit que les citoyens ont, avec toute légitimité, autant d'identités qu'ils le souhaitent, que ces identités sont sous leur seul contrôle. La puissance publique est, dans ce contexte, une autorité comme une autre pour assurer de l'identité de quelqu'un. Pour expliquer ça en termes techniques: en signant ma<a href="http://fr.wikipedia.org/wiki/Cl%C3%A9_de_chiffrement"> clef de chiffrement</a>, la puissance publique reconnaît que, pour ce qui la concerne, cette clef correspond à Benjamin Bayart, et donc que je peux signer avec les démarches administratives. Mais cette reconnaissance de ma clef comme étant moi est par nature une donnée personnelle. Elle ne peut donc pas être publiée, sauf à ma demande, par exemple pour justifier de mon identité auprès d'une banque.</p>
  <p>Cette approche retire à l'autorité centrale tout pouvoir de contrôle sur la vie privée des gens. L'autorité centrale peut seulement savoir que j'ai fait valider 12 clés, elle ne peut pas savoir quelle clé sert à communiquer avec qui.</p>
  <p>Il est également primordial que soit inscrit dans la loi le fait que les gens ont, de manière légitime, plusieurs identités. Ça existe depuis toujours. Les fichiers de police par exemple savent donner des alias aux gens. Une bonne partie de nos politiques sont connus sous des noms d'emprunt, généralement dérivés de leurs vrais noms.</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, je ré-aménagerais la propriété imaginaire</h3>
  <p>Le droit d'auteur est l'élément le plus connu de ce problème lié à la soi-disant propriété intellectuelle. Il faut le réformer, c'est acquis. Le système actuel, qui interdit à peu près tout, et qui garantit des revenus totalement décorellés de toute forme de travail, pose plus de problèmes qu'il n'en résoud.</p>
  <p>Il faut donc revenir à un système compréhensible. Les fondamentaux en sont assez simples. Le droit imprescriptible est le droit pour le public à accéder aux oeuvres, le droit des auteurs à jouir d'une juste rémunération ne peut exister que tant qu'il n'obère pas ce premier droit. Les premiers fondamentaux du droit d'auteur, par exemple, sont intéressants: quand il est fait commerce d'une oeuvre, une part du fruit de ce commerce doit revenir à l'auteur. L'exploitation commerciale peut faire l'objet d'un privilège momentané, sous condition qu'elle ait lieu, et que sa durée ne soit pas extravagante. Pour permettre le financement des activités créatives nouvelles, issues du numérique, la solution de la contribution créative est très adaptée.</p>
  <p>Il y a également des éléments moins connus que le droit d'auteur, qui demandent à être mis d'aplomb. Les brevets sont une source de danger, représentant plus de dommages pour la société que de bénéfices, dans certains cas. Il convient ainsi de définir que le vivant, les logiciels, les idées, les méthodes, ne sont pas brevetables. La question s'est posée au Parlement européen en 2005. Le texte initialement proposé définissait que les logiciels sont brevetables. Après le travail du Parlement, il y avait de grandes chances que le texte adopté dise précisément le contraire. Pris de panique, les pro-brevets ont voté, avec les anti-brevets, le rejet du texte avant de regarder les modifications à y apporter.</p>
  <p>Reste que l'<a href="http://www.epo.org/index_fr.html">Office européens de brevets</a> joue sur le flou de la législation actuelle pour délivrer des brevets sur des logiciels ou sur du vivant. Il faut y mettre fin, et pour ça il faut un texte clair sur le sujet. Ce texte ne peut être qu'un texte européen.</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, le numérique dans l'éducation reprendrait sa place</h3>
  <p>Dans les programmes scolaires tels qu'ils se pratiquent depuis déjà plusieurs années, le numérique tient une place idiote. On y apprend aux enfants et aux jeunes à utiliser des outils de bureautique. C'est idiot. Ils y arriveront très bien tout seuls, ils n'ont pas besoin de professeurs pour ça.</p>
  <p>En revanche, l'effet majeur d'Internet sur la société vient du fait de voir s'exprimer librement en public. Et cet effet est ignoré des enseignements. Ce n'est pas aux profs de maths ou de sciences qu'il faut confier ces enseignements. Ce sont les profs de philo et de français qui doivent être en première ligne.</p>
  <p>L'expression sur Internet est avant tout une expression publique, le plus souvent écrite. Ce qu'il faut, c'est apprendre aux enfants à écrire en public, à écrire pour un public que l'on ne connaît pas d'avance. Il est bien plus intéressant de fournir des outils à nos enfants pour réfléchir dans un mode connecté que de leur apprendre les rudiments d'un logiciel qu'ils sont capables de découvrir tout seuls.</p>
  <p>L'enseignement d'un minimum de programmation, d'un niveau similaire à ce qu'était l'<a href="http://www.cahiers-pedagogiques.com/D-ou-vient-cette-discipline">EMT</a> de ma jeunesse, est sans doute salutaire, mais moins urgent.</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, la vie privée des gens serait protégée</h3>
  <p>Je n'ai pas la place ici de développer ce dont on a besoin pour la protection des données personnelles et de la vie privée. Qu'on en retienne des concepts simples. Par exemple que les données personnelles qui sont confiées, qu'il le sache ou pas, par un citoyen à un tiers, restent sous son entier contrôle.</p>
  <p>Ainsi, les traces que chacun laisse un peu partout sur les réseaux, doivent être sous le contrôle de l'utilisateur. Il n'est pas concevable que chacun n'ait pas une connaissance claire des données qu'on a sur lui. Mon opérateur mobile a dans ses fichiers l'emplacement de mon téléphone à tout instant? Alors il doit me le dire, et il doit me permettre d'accéder à l'ensemble de ces informations, sans avoir à faire de demande particulière.</p>
  <p>Les informations personnelles doivent par ailleurs être mises à disposition dans un format ouvert et garantissant l'interopérabilité. Si je veux changer d'adresse mail par exemple, je dois pouvoir partir avec tout l'historique de ma messagerie, avec mon carnet d'adresses, et cela dans un format ouvert, pour pouvoir le réutiliser.</p>
  <h3 class="rtecenter">Moi, ministre du Numérique, le logiciel libre serait mis en avant</h3>
  <p>Le principe, là encore, est assez simple. Si la puissance publique met de l'argent dans un logiciel, alors ce doit être un logiciel libre.</p>
  <p>Les impératifs qui amènent à cette conclusion évidente sont nombreux. Que ce soient des impératifs de souveraineté nationale quand on touche à la défense, ou simplement à la notion de bien commun quand on parle des autes investissements de l'Etat ou des collectivités.</p>
  <p>Les formats de fichiers utilisés par l'administration doivent être des standards ouverts, on ne peut pas demander aux citoyens de communiquer avec l'administration selon des modèles fermés et attachés aux outils d'un éditeur de logiciels particulier, c'est l'évidence même.</p>
  <p>La mise en avant des logiciels libres, partout dans l'administration publique, en plus d'être un élément fondamental pour garantir certains principes, est un excellent moyen de développer l'industrie logicielle européenne.</p>
  <p><strong><em>Benjamin Bayart</em></strong></p>
  <p><strong>» Moi ministre du Numérique:<a href="http://www.slate.fr/story/85739/moi-ministre-du-numerique-tribune-personnalites-internet-francais"> toutes les contributions</a></strong></p>
  </div></div></div>
              
              
                          
              
              
                          
              
              
              
            </div>
            
          </div>
        </div>
        
      </div>
    </div>


title: Manifoldjs is becoming PWA Builder – Web Dev @ Microsoft – Medium
created_at: 2017-08-10 23:21:23
updated_at: 2017-08-10 23:21:23
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/1*0TNjyyOF8ODiRleg8U3TUg.png
http_status: 200
url:
  https://medium.com/web-on-the-edge/manifoldjs-is-becoming-pwa-builder-to-simplify-building-progressive-web-apps-49bff31f9380

content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Manifoldjs is becoming PWA Builder, to simplify building Progressive Web Apps</h1><p class="graf graf--p graf-after--h3">When Manifoldjs launched <a href="https://blogs.msdn.microsoft.com/johnshews_blog/2015/04/30/build-2015-and-manifoldjs/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">two years ago</a>, our goal was to allow web developers to build standalone web apps across all platforms from a single, standard manifest. As the web platform gains new capabilities and device types continue to proliferate, the industry’s collective vision for the future of web apps is evolving. Progressive Web Apps, widely regarded as the next wave in native-like web experiences, are web content that has functionality and features of desktop or mobile apps. Instead of replacing the web with a native app and going through a tedious installation process, web content gets promoted to app status when the user decides; and the environment allows for it. Progressive Web Apps (or PWAs) use a set of open standard technologies to create an application that is platform independent. One of the most important technologies here is the <a href="http://www.w3.org/TR/appmanifest/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Web App Manifest</a>, something we supported and promoted very early on. It’s only natural that Manifoldjs expand scope to support PWAs and continue to help Web Apps go beyond the browser.</p><blockquote class="graf graf--pullquote graf-after--p"><div>With this update, Manifoldjs will be renamed PWA Builder. The name will change to fit the technology, but our goal remains to help web developers keep their workflow, while enjoying native aspects of client OSes.</div></blockquote><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*T7fyycQsMQrOXC_LYkEggg.png" alt="image" /></div><h4 class="graf graf--h4 graf-after--figure">The Goal of PWA Builder</h4><p class="graf graf--p graf-after--h4">When I look at some of my favorite tools around the web, they all help me do something I <strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">can </em></strong>do myself, but better and faster. For example, I can feature detect and polyfill without <a href="https://modernizr.com/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">modernizr</a>, however Modernizr gives me a simple interface to build a targeted set of polyfills with limited overhead. Another example is <a href="https://github.com/postcss/autoprefixer" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">autoprefixer</a>. I certainly can write CSS prefixes on my own, but since I don’t want to keep up on the ever-changing world of CSS prefixes, I simply write CSS and let autoprefixer keep up on the changes.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*9SosoycZF-tH8VTrhW9BSw.png" alt="image" /></div>MODERNIZR polyfill builder web interface<p id="a24f" class="graf graf--p graf-after--figure">I want PWA Builder to be used the same way. Like Modernizr, PWA Builder will give you an easy way to provide the missing pieces of your PWA, and not weigh down your site with data you don’t need or use. Like autoprefixes, we’ll track the changes within the specs and browser implementations to make sure you’re building the most up-to-date manifests and service workers. We also have plans for additional tools that will help with other aspects of Progressive Web Apps such as https, responsive design, and touch-friendly interfaces.</p><h3 id="f186" class="graf graf--h3 graf-after--p">Tools to Simplify PWAs</h3><p class="graf graf--p graf-after--h3">I’ve talked with developers of all levels of experience and I hear consistently that the components that make up PWAs, specifically <a href="https://w3c.github.io/ServiceWorker/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">service workers</a> and the <a href="http://www.w3.org/TR/appmanifest/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">app manifest</a>, can be a challenge to work with. With PWA Builder we’ll be adding a few really great tools to assist developers in transitioning from web sites to Progressive Web Apps:</p><p class="graf graf--p graf--hasDropCapModel graf--hasDropCap graf-after--p">1.<strong class="markup--strong markup--p-strong">For the Manifest: </strong>PWA Builder’s manifest tool will scan your website, and create a full manifest from everything it can see on your site. Even bringing in things like theme color and icons if possible.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*DglDg0RcWigxlg8NTRIYYg.png" alt="image" /></div><p id="ee40" class="graf graf--p graf--hasDropCapModel graf--hasDropCap graf-after--figure">2.<strong class="markup--strong markup--p-strong"> For your Images</strong>: One of the most time consuming parts of manifest authoring is creating the icons object and the different sized icons for each platform. This tool allows you to upload one large image, and we’ll create all the sizes you need.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*0X-QYM7n6sH8Dz6FJCle-Q.png" alt="image" /></div><p class="graf graf--p graf--hasDropCapModel graf--hasDropCap graf-after--figure">3.<strong class="markup--strong markup--p-strong"> For Service Workers</strong>: The Service Worker builder allows you to select the type of functionality you would like to have in your service worker then builds out the file for you to add to your site. The list is short for now, but our goal is to build an extensive list.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*_aQ86_xdRcQVcAu73bwx2A.png" alt="image" /></div><p class="graf graf--p graf--hasDropCapModel graf--hasDropCap graf-after--figure">4.<strong class="markup--strong markup--p-strong"> Packaging</strong>: Not every platform or browser runs PWAs, so we continue to provide polyfills for platforms that lack support. We will also be<br /> introducing store submission tools to get your app into the markets that<br /> support PWAs.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*0TNjyyOF8ODiRleg8U3TUg.png" alt="image" /></div><p id="a0b4" class="graf graf--p graf-after--figure">Tools will be available in both the CLI form and through our web app.</p><h3 id="f245" class="graf graf--h3 graf-after--p">PWA Support</h3><p class="graf graf--p graf-after--h3">Progressive Web Apps are still quite new. All browser support some aspects of PWAs (like https) but some of the key technologies like service workers and W3C manifest support are not yet widely supported. The highest support is on later versions of Android. You can track the progress from <a href="https://developers.google.com/web/progressive-web-apps/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Google</a>, <a href="https://developer.mozilla.org/en-US/Apps/Progressive" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Mozilla</a>, <a href="https://dev.opera.com/articles/pwa-resources/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Opera</a> and <a href="https://medium.com/web-on-the-edge/progressive-web-apps-on-windows-8d8eb68d524e" class="markup--anchor markup--p-anchor" target="_blank">Microsoft</a> from their respective sites. Apple has not yet made any public statements on upcoming support.</p><p class="graf graf--p graf-after--p">I want to point out that service workers is currently <a href="https://developer.microsoft.com/en-us/microsoft-edge/platform/status/serviceworker/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">under development</a> on Windows 10 and Microsoft Edge and we expect to ship preview releases with service workers behind a flag later this year. We believe the addition of service workers to our current implementation of <a href="https://developer.microsoft.com/en-us/windows/bridges/hosted-web-apps" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Hosted Web Apps</a> will bring the cross platform, native-like features that characterize Progressive Web Apps. We’re hard at work building a first class <a href="https://medium.com/web-on-the-edge/progressive-web-apps-on-windows-8d8eb68d524e" class="markup--anchor markup--p-anchor" target="_blank">Progressive Web App experience</a> in Windows and Microsoft Edge — stay tuned to the <a href="https://blogs.windows.com/msedgedev" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Edge developer blog</a> for more updates as this progresses.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*otvT3DAqiPijt9AbT4As2w.png" alt="image" /></div>Progressive Web Apps allow your site to run as a stand alone app.<h3 class="graf graf--h3 graf-after--figure">Watch us Build</h3><p id="d026" class="graf graf--p graf-after--h3">Our developer community will continue to develop Manifoldjs as we also work on PWA Builder. For building production apps, we still need you to use Manifoldjs to build those hosted web apps. However we want to watch the new tool develop. You can try the preview out at:</p><p class="graf graf--p graf-after--p"><a href="http://preview.pwabuilder.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">http://preview.pwabuilder.com</a></p><p class="graf graf--p graf-after--p">or install it via npm:</p><pre class="graf graf--pre graf-after--p">&gt; npm install pwabuilder -g</pre><p class="graf graf--p graf-after--pre">If you are interested in building tools for Progressive Web Apps, we encourage you to join our project! We are an <a href="https://github.com/manifoldjs" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">open source project</a> that can only succeed with community support.</p><p class="graf graf--p graf-after--p">Our next step is a stable release which will contain a wider variety of features and even more automation. Keep your eyes open for great things to come as the tools you’ve come to know for building a hosted web app with <a href="http://www.manifoldjs.com" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Manifoldjs</a> expand to support Manifests, Service Workers, and more in <a href="http://preview.pwabuilder.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">PWA Builder!</a></p><p class="graf graf--p graf-after--p graf--trailing">Follow Jeff Burtoft on twitter @boyofgreen</p></div></div></div></div></div></div></div></div></div>


title: os01 by tuhdo
url: https://tuhdo.github.io/os01/
created_at: 2017-08-10 23:21:24
updated_at: 2017-08-10 23:21:24
mimetype: text/html
domain_name: tuhdo.github.io
http_status: 200
content:
  <p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=tuhdo1710%40gmail%2ecom&amp;lc=VN&amp;item_number=tuhdo&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3aDonate%2dPayPal%2dgreen%2esvg%3aNonHosted"><img src="https://img.shields.io/badge/Donate-PayPal-green.svg" alt="Donate" /></a></p><p>This book helps you gain the foundational knowledge required to write an
  operating system from scratch. Hence the title, 0 to 1.</p>
  <p>After completing this book, at the very least you will learn:</p>
  <ul><li>
      <p>How to write an operating system from scratch by reading hardware datasheets.
  In the real world, it works like that. You won’t be able to consult Google for
  a quick answer.</p>
    </li>
    <li>
      <p>A big picture of how each layer of a computer is related to the other, from hardware to software.</p>
    </li>
    <li>
      <p>Write code independently. It’s pointless to copy and paste code. Real learning
  happens when you solve problems on your own. Some examples are given to kick
  start, but most problems are yours to conquer. However, the solutions are
  available online for you to examine after giving it a good try.</p>
    </li>
    <li>
      <p>Linux as a development environment and how to use common tools for low-level
  programming.</p>
    </li>
    <li>
      <p>x86 assembly in-depth.</p>
    </li>
    <li>
      <p>How a program is structured so that an operating system can run.</p>
    </li>
    <li>
      <p>How to debug a program running directly on hardware with gdb and QEMU.</p>
    </li>
    <li>
      <p>Linking and loading on bare metal x86_64, with pure C. No standard library. No
  runtime overhead.</p>
    </li>
  </ul><p><a href="https://github.com/tuhdo/os01/files/828054/Operating_System_From_0_to_1.pdf">Download the book</a></p>
  <blockquote>
    <p>You give a poor man a fish and you feed him for a day. You teach him to fish
  and you give him an occupation that will feed him for a lifetime.</p>
  </blockquote>
  <p>This has been the guiding principle of the book when I was writing it. The book does
  not try to teach you everything, but enough to enable you to learn by yourself.
  The book itself, at this point, is quite “complete”: once you master part 1 and
  part 2 (which consist of 8 chapters), you can drop the book and learn by
  yourself. At this point, smart readers should be able to continue on their own.
  For example, they can continue their journeys
  on <a href="http://wiki.osdev.org/Main_Page">OSDev wiki</a>; in fact, after you study
  everything in part 1 and part 2, you only meet
  the <a href="http://wiki.osdev.org/Required_Knowledge">minimum requirement</a> by OSDev
  Wiki (well, not quite, the book actually goes deeper for the suggested topics).
  Or, if you consider developing an OS for fun is impractical, you can continue
  with a Linux-specific book, such as this free
  book <a href="https://0xax.gitbooks.io/linux-insides/content/">Linux Insides</a>, or other
  popular Linux kernel books. The book tries hard to provide you a strong
  foundation, and that’s why part 1 and part 2 were released first.</p>
  <p>The book teaches you core concepts, such as x86 Assembly, ELF, linking and
  debugging on bare metal, etc., but more importantly, where such information
  come from. For example, instead of just teaching x86 Assembly, it also teaches
  how to use reference manuals from Intel. Learning to read the official
  manuals is important because only the hardware manufacturers themselves
  understand how their hardware work. If you only learn from the secondary
  resources because it is easier, you will never gain a complete understanding of
  the hardware you are programming for. Have you ever read a book on Assembly, and
  wondered where all the information came from? How does the author know
  everything he says is correct? And how one seems to magically know so much about
  hardware programming? This book gives pointers to such questions.</p>
  <p>As an example, you should skim through chapter 4, “x86 Assembly and C”, to see
  how it makes use of the Intel manual, Volume 2. And in
  the process, it guides you how to use the official manuals.</p>
  <p>Part 3 is planned as a series of specifications that a reader will implement to
  complete each operating system component. It does not contain code aside from a
  few examples. Part 3 is just there to shorten the reader’s time when reading the
  official manuals by giving hints where to read, explaining difficult concepts
  and how to use the manuals to debug. In short, the implementation is up to the
  reader to work on his or her own; the chapters are just like university assignments.</p>
  <p>Know some circuit concepts:</p>
  <ul><li>Basic Concepts of Electricity: atoms, electrons, protons, neutrons, current flow.</li>
    <li>Ohm’s law</li>
  </ul><p>However, if you know absolutely nothing about electricity, you can quickly learn it here:
  <a href="http://www.allaboutcircuits.com/textbook/">http://www.allaboutcircuits.com/textbook/</a>, by reading chapter 1 and chapter 2.</p>
  <p>C programming. In particular:</p>
  <ul><li>
      <p>Variable and function declarations/definitions</p>
    </li>
    <li>
      <p>While and for loops</p>
    </li>
    <li>
      <p>Pointers and function pointers</p>
    </li>
    <li>
      <p>Fundamental algorithms and data structures in C</p>
    </li>
  </ul><p>Linux basics:</p>
  <ul><li>
      <p>Know how to navigate directory with the command line</p>
    </li>
    <li>
      <p>Know how to invoke a command with options</p>
    </li>
    <li>
      <p>Know how to pipe output to another program</p>
    </li>
  </ul><p>Touch typing. Since we are going to use Linux, touch typing helps. I know typing
  speed does not relate to problem-solving, but at least your typing speed should
  be fast enough not to let it get it the way and degrade the learning experience.</p>
  <p>In general, I assume that the reader has basic C programming knowledge, and can
  use an IDE to build and run a program.</p>
  <ul><li>Part 1
      <ul><li>Chapter 1: Complete</li>
        <li>Chapter 2: Complete</li>
        <li>Chapter 3: Almost. Currently, the book relies on the Intel Manual for fully explaining x86 execution environment.</li>
        <li>Chapter 4: Complete</li>
        <li>Chapter 5: Complete</li>
        <li>Chapter 6: Complete</li>
      </ul></li>
    <li>Part 2
      <ul><li>Chapter 7: Complete</li>
        <li>Chapter 8: Complete</li>
      </ul></li>
    <li>Part 3
      <ul><li>Chapter 9: Incomplete</li>
        <li>Chapter 10: Incomplete</li>
        <li>Chapter 11: Incomplete</li>
        <li>Chapter 12: Incomplete</li>
        <li>Chapter 13: Incomplete</li>
      </ul><p>… and future chapters not included yet …</p>
    </li>
  </ul><p>In the future, I hope to expand part 3 to cover more than the first 2 parts. But
  for the time being, I will try to finish the above chapters first.</p>
  <p><a href="https://github.com/tuhdo/sample-os">This repository</a> is the sample OS of the
  book that is intended as a reference material for part 3. It covers 10 chapters
  of the “System Programming Guide” (Intel Manual Volume 3), along with a simple
  keyboard and video driver for input and output. However, at the moment, only the
  following features are implemented:</p>
  <ul><li>Protected mode.</li>
    <li>Creating and managing processes with TSS (Task State Structure).</li>
    <li>Interrupts</li>
    <li>LAPIC.</li>
  </ul><p>Paging and I/O are not yet implemented. I will try to implement it as the book progresses.</p>
  <p>If you find any grammatical issues, please report it using Github Issues. Or, if
  some sentence or paragraph is difficult to understand, feel free to open an
  issue with the following title format: <code class="highlighter-rouge">[page number][type] Descriptive Title</code>.</p>
  <p>For example: <code class="highlighter-rouge">[pg.9][grammar] Incorrect verb usage</code>.</p>
  <p><code class="highlighter-rouge">type</code> can be one of the following:</p>
  <ul><li><code class="highlighter-rouge">Typo</code>: indicates typing mistake.</li>
    <li><code class="highlighter-rouge">Grammar</code>: indicates incorrect grammar usage.</li>
    <li><code class="highlighter-rouge">Style</code>: indicates a style improvement.</li>
    <li><code class="highlighter-rouge">Content</code>: indicates problems with the content.</li>
  </ul><p>Even better, you can make a pull request with the provided book source. The main
  content of the book is in the file “Operating Systems: From 0 to 1.lyx”. You can
  edit the .txt file, then I will integrate the changes manually. It is a
  workaround for now since Lyx can cause a huge diff which makes it impossible to
  review changes.</p>
  <p>The book is in development, so please bear with me if the English irritates you.
  I really appreciate it.</p>
  <p>Finally, if you like the project and if it is possible, please donate to help
  this project and keep it going.</p>
  <p>If you have any question related to the material or the development of the book,
  feel free to <a href="https://github.com/tuhdo/os01/issues/new">open a Github issue</a>.</p>


title: teesloane/Auth-Boss
url: https://github.com/teesloane/Auth-Boss
created_at: 2017-08-10 23:21:25
updated_at: 2017-08-10 23:21:25
mimetype: text/html
language: en
domain_name: github.com
preview_picture: https://avatars0.githubusercontent.com/u/12987958?v=4&s=400
http_status: 200
content:
  <h3>
        
        README.md
      </h3><p>Become an Auth Boss. Learn about different authentication methodologies on the web.</p>
  <p><strong>Table of Contents</strong></p>
  <ul><li><a href="https://github.com/teesloane/Auth-Boss#introduction">Introduction</a>
  <ul><li><a href="https://github.com/teesloane/Auth-Boss#who">Who</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#why">Why</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#how">How</a></li>
  </ul></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#examples-cases">Examples cases</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#general-best-practices">General Best Practices</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#terminology">Terminology</a>
  <ul><li><a href="https://github.com/teesloane/Auth-Boss#http">HTTP</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#https">HTTPS</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#tls--ssl">TLS / SSL</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#state">State</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#cookies">Cookies</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#sessions--session-management">Sessions / Session Management</a></li>
  </ul></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#methodologies">Methodologies</a>
  <ul><li><a href="https://github.com/teesloane/Auth-Boss#http-basic-authentication">HTTP Basic Authentication</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#session-based-authentication">Session based Authentication</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#token-based-authentication">Token based Authentication</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#jwt">JWT</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#oauth">OAuth</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#openid">OpenId</a></li>
  </ul></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#resources-and-footnotes">Resources and Footnotes</a></li>
  <li><a href="https://github.com/teesloane/Auth-Boss#thank-you">Thank-You</a></li>
  </ul><p>The intention of this document is to chronicle and catalog the methodologies of <em>authentication</em> on the web. By <em>authentication</em> I am referring to the process of creating a system through which users can "login" to an online service and be given access to otherwise protected resources.</p>
  <p>The following quote might better sum up what I'm trying to cover:</p>
  <blockquote>
  <p>Client authentication involves proving the identity of a client (or user) to a server on the Web.[1]</p>
  </blockquote>
  <hr /><h2><a id="user-content-who" class="anchor" href="https://github.com/teesloane/Auth-Boss#who"></a>Who</h2>
  <p>I am a self-taught developer with a passion for open source technology, learning, mentoring, and knowledge-sharing.</p>
  <h2><a id="user-content-why" class="anchor" href="https://github.com/teesloane/Auth-Boss#why"></a>Why</h2>
  <p>I am writing this guide because I felt woefully at a loss for finding resources that explained safe, smart and current technologies and methods for authentication in a simple and concise manner. I decided it was time to put my research hat on and do some leg work.</p>
  <h2><a id="user-content-how" class="anchor" href="https://github.com/teesloane/Auth-Boss#how"></a>How</h2>
  <p>My writing style aims to be simple, terse, and to leverage layperson terms over jargon and tech-words.</p>
  <p><strong>Disclaimer</strong> : This document does not serve as an all-encompassing catalog of all authentications methods for the web; nor does this document purport to provide the "best" methods of authentication. Nobody is paying me to display the links that I have chosen to display. If you want to pay me money for being awesome, just like... pay me some money some other way. Or go pet a puppy, or help someone carry their groceries if you see them struggling. I don't know.</p>
  <p><strong>Regarding Quotes / Citations</strong>: I have <em>very</em> informally cited my sources. If you want me to take down links / better cite my sources (beyond just a link to original posting) I can do that. Just let me know &lt;3.</p>
  <p><strong>Regarding mistakes, errors, and inconsistencies</strong>: I am bound to make mistakes and miss many things. I AM NOT A SECURITY EXPERT. If you see something that could be improved make a pull request explaining what I missed + what I can improve. Bonus points if you're not a jerk about it. Check out the <code>CONTRIBUTIONS.md</code> for more information on PRs and junk.</p>
  <p>I will use a common example across this document to illustrate a login flow both in terms of what is happening on the "client" (the user in front of their computer) and what is occurring on the "server" (behind the scenes, so to speak).</p>
  <p>Our example cases will feature a new imaginary friend: <code>Beorn</code>. Beorn likes knitting and often goes to <code>http://knittingworld.com</code> to buy supplies. Beorn has a user account on <code>knittingworld</code> and we will see him continuously login across the examples in this document.</p>
  <p>Before jumping into the technologies that exist for managing authentication, let's consider some best practices/things you should never do.</p>
  <p>Some of these following items may not directly pertain to login/authentication/user signups but are generally useful and good to know.</p>
  <ul><li>Never store passwords as plain text in a database.</li>
  <li>Never write your own hashing algorithm (unless you're really really smart)</li>
  <li>Do not write your own authentication technology (again, unless you're really really smart).</li>
  <li>Use <a href="https://en.wikipedia.org/wiki/HTTPS">HTTPS</a>.</li>
  </ul><p><strong>Some quotes</strong></p>
  <blockquote>
  <p>We also found that many Web sites would design their own authentication mechanism to provide a better user experience. Unfortunately, designers and implementers often do not have a background in security and, as a result, do not have a good understanding of the tools at their disposal[2]</p>
  </blockquote>
  <p>There is quite a bit of jargon in this sub-set of web development. Below is a list of terms that you will see again and again when it comes to authentication. Each word will link to a definition that I have found, but the descriptions written here are my attempts to create a concise summary in lay-person terms.</p>
  <p>Stands for Hyper Text Transfer Protocol. This is a big concept, and I'm not sure I can do it justice to explain simply without being reductive. The web is built around HTTP - it's the technology used to communicate between web servers and users.</p>
  <p>Your browser is considered an HTTP client because it sends <em>requests</em> to an HTTP server. There are many different kinds of <em>requests</em> that your client can make — you may have heard of some of the most popular ones — <code>GET</code> <code>POST</code> <code>PUT</code> and <code>DELETE</code>.</p>
  <p>HTTP servers send <em>responses</em> to your browser — the client. These responses come in the form of <em>resources</em>. Resources could be (but are not limited to): HTML files, images, text, JSON, and more. You can (kind of) think of <em>resources</em> as "files" that come back from a server.</p>
  <p><em>Other links on this topic</em>:</p>
  <ul><li><a href="http://www.jmarshall.com/easy/http/#whatis">HTTP Made Really Easy</a></li>
  <li><a href="https://tools.ietf.org/html/rfc2616">RFC2616</a> — this is a massive document-spec-thing on HTTP. It is listed as outdated, but also lists the documents that have superseded it.</li>
  </ul><p>HTTPS is HTTP with more security. It goes hand in hand with <code>SSL / TLS</code>. Originally made popular for payment transactions over the Internet, it has become much more widespread lately. You may recognize https as "that green text that shows up to the left of my URL in the browser"; often accompanied by an icon of a lock or something of the sort.</p>
  <p>HTTPS is HTTP wrapped in TLS (or, in the olden days, SSL) to protect traffic between browsers and servers.</p>
  <p>HTTPS encrypts the information that's sent along with your HTTP requests and the responses that are sent back. This is particularly important when we start talking about authentication!</p>
  <p>From Wikipedia:</p>
  <blockquote>
  <p>HTTPS creates a secure channel over an insecure network. This ensures reasonable protection from eavesdroppers and man-in-the-middle attacks, provided that adequate cipher suites are used and that the server certificate is verified and trusted.</p>
  </blockquote>
  <p>TLS and SSL are cryptographic protocols. TLS and SSL encrypt the data you send across a network — it is designed to prevent people from "eavesdropping" or tampering with the data that you are sending.</p>
  <p>SSLv2 and v3 are considered insecure today (see <a href="https://en.wikipedia.org/wiki/POODLE">POODLE</a>), so most HTTPS is done with TLS 1.2.</p>
  <p>There are some useful videos on youtube that help to explain some of these complex topics, but unfortunately, I can't speak to the veracity of them all. This <a href="https://www.youtube.com/watch?v=S2iBR2ZlZf0">video by MIT opencourseware</a> looks relatively useful!</p>
  <p>This document will make reference to the terms <code>state</code>, <code>stateful</code>, <code>stateless</code> and <code>piece of state</code>. These are broad terms that vary in their definition. For the sake of this article, a "piece of state" or something that is "stateful" is describing a piece of data that is living in memory...somewhere.</p>
  <p>HTTP requests are commonly described as "stateless". When you visit a website and login, you are passing some information along with your HTTP request — something that <em>identifies you</em>. Whatever method of authentication you need to use to identify yourself has to be "attached" to HTTP requests in some way or another, <em>because</em> you cannot simply store that state within the HTTP protocol itself — it has to take another form that can "ride along" with your HTTP requests, so to speak (as you will see in the rest of this documentation.).</p>
  <p>To perhaps overstate / over explain ... I think that this quote from the Scotch.io article is quite useful <a href="https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication">The Ins and Outs of Token Based Authentication</a></p>
  <blockquote>
  <p>Since the HTTP protocol is stateless, this means that if we authenticate a user with a username and password, then on the next request, our application won’t know who we are. We would have to authenticate again.</p>
  </blockquote>
  <p>Cookies, at the very base level, are small pieces of data that get stored on a <em>user's browser</em>. Cookies, in contrast to HTTP, are <em>stateful</em> — meaning that while HTTP cannot store user information, cookies can.</p>
  <p>A common example of a web cookie:</p>
  <p>Beorn visits <code>http://knittingworld.com</code> to buy some nice yarn and materials for his next knitting project. He logs in and adds three items to his cart. As he is about to "check out" in the online store and ship the items to his home, he hears a loud "bang!" and realizes that he left a can of tuna in the microwave on high. Not good! Beorn closes the browser, instantly forgetting about his new knitting materials, and goes to clean up the mess. After the smell of canned tuna has finally sunk into the walls and carpet of his home, Beorn returns to his computer and revisits <code>https://knittingworld.com</code> ... only to find his items are still in his cart. How?! Cookies.</p>
  <p>There are different kinds of cookies. Some cookies will stick around in your browser for many days, while others will disappear as soon as you close your browser.</p>
  <p>Cookies have played a big role in authentication in the past (and still do). Authentication cookies are commonly used by web servers to determine whether a user is logged in or not and what resources they have access to.</p>
  <p><a href="https://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie">Persistent cookies</a> sometimes carry a negative connotation, in that they may be used by advertisers to record information about a user's web habits. On the other hand, they are often used to save a user from having to re-enter their login credentials every time they visit a site.</p>
  <p>You can see what cookies are sent with requests by navigating to your (using Chrome, for example) developer tools and opening the <code>Network</code> tab. Refreshing your page will display a list of incoming resources, of which you can select one and view the <code>headers</code> for the page. Scroll through the list and see if you find any cookies!</p>
  <p>You can also view cookies/storage related information in the "Application" tab in your developer tools.</p>
  <p>Rather than attempt to begin with my simplistic attempt at describing sessions, I will quote from the OWASP session management cheat sheet:</p>
  <blockquote>
  <p>A web session is a sequence of network HTTP request and response transactions associated with the same user. Modern and complex web applications require the retaining of information or status about each user for the duration of multiple requests. Therefore, sessions provide the ability to establish variables – such as access rights and localization settings – which will apply to each and every interaction a user has with the web application for the duration of the session.</p>
  </blockquote>
  <p>You can find a step-by-step example of session-based authentication in the <code>Methodologies</code> section below.</p>
  <p>More links on sessions:</p>
  <ul><li><a href="http://machinesaredigging.com/2013/10/29/how-does-a-web-session-work/">How does a web session work</a></li>
  <li><a href="http://stackoverflow.com/questions/3804209/what-are-sessions-how-do-they-work">What are web sessions?</a></li>
  </ul><p>It's time to get into actual examples of authentication methods!. Following is a list of technologies for establishing an authentication solution. This is not an exhaustive list!</p>
  <p>HTTP Basic authentication (or "Basic Auth") has been around for quite some time. It seems that people tend to use it for its simplicity and its wide support across browsers. <a href="https://httpbin.org/basic-auth/user/passwd">Here is a blank page</a> that asks for Basic auth. Here's how it would work in the case of our friend Beorn:</p>
  <ul><li>Beorn goes to <code>http://knittingworld.com</code> to get some nice yarn.</li>
  <li>After picking out his yarn, he clicks "Buy" to buy it.</li>
  <li>His browser makes a GET request and the server responds that he needs to authenticate (by sending a <code>401 Unauthorized</code> status and a <code>WWW-Authenticate</code> header).</li>
  <li>Beorn types in his username and password into a login form.</li>
  <li>His browser makes the GET request with an <code>Authorization</code> header. This header might look something like this:</li>
  </ul><p><code>Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==</code></p>
  <ul><li>The server goes on to validate the authentication header and determine if Beorn can proceed to his shopping cart. The browser remembers the credentials and resends them on that domain until it is closed.</li>
  </ul><p><strong>Some important notes on HTTP Basic Authentication:</strong></p>
  <ul><li>The example authorization header above does not look like a username and password, but that is because it is base64 encoded. IT IS NOT ENCRYPTED.</li>
  <li>USE HTTPS if you are using Basic Auth. If you just use HTTP, authentication credentials are sent to a server as PLAIN TEXT. THIS IS BAD. A user's username and password are being sent over the wire merely as base64 encoded text — which is trivial to decode. By using HTTPS / TLS, you are ensuring that data sent from the client to the server is encrypted.</li>
  <li>Basic Auth, <em>as implemented by the browser</em>, is not exactly aesthetically pleasing and is rarely used today.</li>
  <li>Basic Auth with APIs, when combined with tokens, (discussed later) is just an <code>Authorization</code> header and is perfectly reasonable. It has the added benefit of not requiring the API client to maintain an extra session cookie and, since most systems, log query params but not headers, will not be logged by default.</li>
  </ul><p><strong>Links</strong></p>
  <ul><li>
  <p><a href="https://www.owasp.org/index.php/Basic_Authentication">Basic Authentication on OWASP</a></p>
  </li>
  <li>
  <p><a href="https://www.quora.com/Why-does-Stripe-use-HTTP-Basic-Auth-with-a-token-instead-of-a-header?share=1">Why does stripe use HTTP basic auth with a token instead of a header?</a></p>
  </li>
  </ul><p>Session authentication has been around for a while and is commonly practiced. The key component to Session based authentication is that a user's login is associated with a <em>piece of state</em> either <em>in memory</em> on the server, or in a key-value store (like Redis).</p>
  <p>Let's look at an example of our friend Beorn using session based authentication.</p>
  <ul><li>Beorn goes to <code>http://knittingworld.com</code> to get some nice yarn.</li>
  <li>When Beorn logs in, he is sending his credentials to a server.</li>
  <li>When the credentials reach the server, the server, in one way or another, needs to check if Beorn is a user in their database. At this point, Beorn is not yet logged in.</li>
  <li>Beorn's credentials checkout, so he can log in.</li>
  <li>Beorn needs something to <em>identify</em> him on future requests to the server — especially if he's trying to buy things that require him to be logged in. This is where the idea of authenticated sessions come in.</li>
  <li>Now that the server knows who Beorn is, and has identified him as a user in the database, the server will send him (or "return") a cookie — that can identify Beorn as someone who is "logged in" on future requests.</li>
  <li>Now that Beorn is authenticated and has a session cookie on his browser, he can go check out the yarn that is on sale for logged in members only.</li>
  <li>When Beorn goes to the page <code>http://knittingworld.com/great_deals.html</code> he is making yet another HTTP request - but this time, his session cookie will ride along with the HTTP request to the server.</li>
  <li>the server will authenticate based on the cookie matching the in-memory session information (saving the need to run to the database, check passwords, etc. — like in Basic Auth)</li>
  <li>When Beorn logs out from <code>http://knittingworld.com</code>, his session instance on the server (or on Redis, etc.) will expire and so will his session cookie.</li>
  </ul><p>Token based authentication has become more popular lately with the rise of RESTful APIs, single-page-apps, and micro-services.</p>
  <p><strong>What is a token?</strong></p>
  <p>A token is a small piece of data.</p>
  <p>An authentication system that leverages token-based-authentication means that the requests a user makes to a server carry a token along with them to perform authentication logic on. When HTTP requests are made, the token is the piece of data that verifies a user's eligibility to access a resource.</p>
  <p><strong>How is this different from cookie-based authentication?</strong></p>
  <p>Token authentication is stateless, whereas session based authentication means that somewhere on your server (or in Redis etc.) you have a piece of state that is keeping track of user sessions.</p>
  <p>Auth0's blog post <a href="https://auth0.com/blog/cookies-vs-tokens-definitive-guide/">Cookies vs. Tokens: The Definitive Guide</a> draws out a great step-by-step comparison of the difference in authentication flows between cookies and tokens (so, that means Beorn shall be missing from this example section):</p>
  <p><strong>Session based authentication flow</strong>:</p>
  <pre>1. User enters their login credentials
  2. Server verifies the credentials are correct and creates a session which is then stored in a database
  3. A cookie with the session ID is placed in the user's browser
  4. On subsequent requests, the session ID is verified against the database and if valid the request processed
  5. Once a user logs out of the app, the session is destroyed both client and server side
  </pre>
  <p><strong>Token based authentication flow</strong>:</p>
  <pre>1. User enters their login credentials
  2. Server verifies the credentials are correct and returns a signed token
  3. This token is stored client-side, most commonly in local storage - but can be stored in session storage or a cookie as well
  4. Subsequent requests to the server include this token as an additional Authorization header or through one of the other methods mentioned above
  5. The server decodes the JWT and if the token is valid processes the request
  6. Once a user logs out, the token is destroyed client-side, no interaction with the server is necessary
  </pre>
  <p>A key takeaway is that tokens are <strong>stateless</strong>. A back-end server doesn't need to keep a record of tokens, or of currently active sessions.</p>
  <p><strong>Wow tokens sound cool. Are they better than session based auth?</strong></p>
  <p>You're asking the wrong person, pal. I'm just writing this to help my brain figure things out. Like most things on the internet, there are lots of people with strong opinions one way or another. I'm doing my best to make it the case that you won't find those here (Although many of the links I've posted from my research are full of strong opinions or are financially biased).</p>
  <p>For more fun disclaimers visit the <code>disclaimer</code> section above.</p>
  <p><strong>Types of Tokens</strong>
  Some common tokens include JWT (discussed below), SWT (Simple web tokens) and SAML (security assertion markup languages)</p>
  <p><strong>Links</strong></p>
  <ul><li><a href="https://www.w3.org/2001/sw/Europe/events/foaf-galway/papers/fp/token_based_authentication/">Token Based Authentication - Implementation Demonstration - W3</a></li>
  <li><a href="http://stackoverflow.com/questions/1592534/what-is-token-based-authentication">What is token based Authentication - SO</a></li>
  <li><a href="https://auth0.com/learn/token-based-authentication-made-easy/#!">Token Based Authentication Made Easy</a></li>
  <li><a href="https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication">The Ins and Outs of Token Based Authentication</a></li>
  <li><a href="https://auth0.com/blog/cookies-vs-tokens-definitive-guide/">Cookies vs Tokens: The Definitive Guide (opinionated)</a></li>
  </ul><p>JWT stands for "JSON Web Token". JWT is a <strong>type</strong> of token-based authentication. JWT is based on a <a href="https://tools.ietf.org/html/rfc7519">web standard</a>. If you are already asking yourself/me if that makes it "better" than Token based authentication, let's table that question for another time / for people who are smarter than me. I am including a write up for JWT's here because they seem to be becoming much more common; even though they are a "subset" so to speak of the above section on "token based authentication". Once again, different methodologies of token based authentication have different pros and cons.</p>
  <p>So, a lot of the information in the <code>token based authentication</code> section above applies here.</p>
  <p>The abstract from the JWT RFC 7519 standardization states that:</p>
  <blockquote>
  <p>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.</p>
  </blockquote>
  <p>A JSON Web Token is a string of characters. It might look like this:</p>
  <pre>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
  </pre>
  <p>The above string is what you might see when you are performing authentication using JWT; it is the encoded data that is returned from a server upon authentication.</p>
  <p>JWT's are verified and made secure because they are "digitally signed" with a private-key, and authenticated with a secret key.</p>
  <p><strong>What makes up a JWT?</strong></p>
  <p>A JWT is a self-contained chunk of data. Every JWT is made up of a <code>header</code> a <code>payload</code> and a <code>signature</code>. When your server creates a token, you can also assign unique data to your token, which can be used on the front end. This can be used to save the need for making other database calls later.</p>
  <p>You should still be wary of posting confidential information in a token sent to a client.</p>
  <p><strong>Example function to create a JWT token in Python</strong>:</p>
  <div class="highlight highlight-source-python"><pre>def create_token(user):
      """Create a JWT token, set expiry, iat, etc"""
      payload = {
          'sub': user.id,
          'name': user.first_name,
          'role_id': user.role_id,
          'iat': datetime.utcnow(),
          'exp': datetime.utcnow() + timedelta(days=1)
      }
      token = jwt.encode(payload, MY_SECRET_KEY_SHHH_DONT_TELL_ANYONE, algorithm='HS256')
      return token.decode('unicode_escape')</pre></div>
  <p>The above keys <code>sub</code>, <code>iat</code> and <code>exp</code> follow the reserved JWT keys, but I've also added the <code>name</code> of the user and what <code>role_id</code> they have. You will need to get a library for encoding/decoding JWT tokens. <a href="https://jwt.io/">JWT.io</a> lists lots of libraries for many languages.</p>
  <p>In some cases, a JWT secret key may be base64 encoded — in which case, depending on your JWT library — you need to decode the secret key prior to decoding the token.</p>
  <p><strong>Links</strong></p>
  <ul><li><a href="https://jwt.io/introduction/">Introduction to JSON web tokens</a></li>
  <li><a href="https://jwt.io/">JWT Debugger</a></li>
  </ul><p>OAuth is an <em>authorization</em> protocol that allows users to perform an authentication against a server without a password. OAuth has seen various iterations — OAuth 1.0, OAuth 1.0a, and OAuth 2.0.</p>
  <p>At this point we could have a very pedantic conversation about Authentication and Authorization. But we shan't! Instead, the important thing to note is the following (thanks <a href="https://github.com/rohannair">@rohan</a>)</p>
  <ul><li>
  <p><code>Authentication</code> - Proving who you are.</p>
  </li>
  <li>
  <p><code>Authorization</code> - Determining what you have permission to do.</p>
  </li>
  </ul><p>This is a whole can of worms in itself. The OAuth docs state the following, plain and clear in their <a href="https://oauth.net/articles/authentication/">Authentication</a> article:</p>
  <blockquote>
  <p>OAuth 2.0 is not an authentication protocol.</p>
  </blockquote>
  <p>With that said, there is still good reason to discuss OAuth. In fact, the above article is quite well written, so I'm going to quote it here:</p>
  <blockquote>
  <p>Authentication in the context of a user accessing an application tells an application who the current user is and whether or not they're present. A full authentication protocol will probably also tell you a number of attributes about this user, such as a unique identifier, an email address, and what to call them when the application says "Good Morning". Authentication is all about the user and their presence with the application, and an internet-scale authentication protocol needs to be able to do this across network and security boundaries.</p>
  </blockquote>
  <blockquote>
  <p>However, OAuth tells the application none of that. OAuth says absolutely nothing about the user, nor does it say how the user proved their presence or even if they're still there. As far as an OAuth client is concerned, it asked for a token, got a token, and eventually used that token to access some API. It doesn't know anything about who authorized the application or if there was even a user there at all. In fact, much of the point of OAuth is about giving this delegated access for use in situations where the user is not present on the connection between the client and the resource being accessed. This is great for client authorization, but it's really bad for authentication where the whole point is figuring out if the user is there or not (and who they are).</p>
  </blockquote>
  <p>If you have ever logged into a service by using your Twitter, Google, or Facebook account, then you have used OAuth.</p>
  <p>OAuth Providers (Facebook, Google, etc), operate through private, unique, access tokens that provide the means of authentication for your service (the "OAuth client") to allow logins.</p>
  <p>If you want to use OAuth for your users to log into your service, you will need to register your server as an OAuth Client. This will usually set you up with a <code>client id</code>, and <code>client secret</code>. Users that log in to your service will be relocated to the OAuth Provider where the user can confirm that they do indeed want to "log in" (i.e. allow the server they are logging into, to have access to any required information from the OAuth Provider. )</p>
  <p>In the case of our friend Beorn...</p>
  <ul><li>Beorn goes to <code>http://knittingworld.com</code> to get some nice yarn.</li>
  <li>Beorn decides to log in using his Google account.</li>
  <li>Beorn is prompted to enter his Google account credentials (in the case that he isn't already logged in)</li>
  <li>After entering his credentials, Google (or whatever OAuth provider he uses) will prompt him to check that he wants to sign into <code>http://knittinggworld.com</code> with his Google account.</li>
  <li>After accepting, Beorn is redirected to <code>http://knittingworld.com</code>.</li>
  <li>If <code>knittingworld</code> needs access to a resource regarding Beorn's information, it can make requests to a <code>resource server</code> (via the OAuth provider) to access them, provided its access token is valid.</li>
  </ul><p>From the <a href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet#OAuth">OWASP Authentication Cheat Sheet</a></p>
  <blockquote>
  <p>The recommendation is to use and implement OAuth 1.0a or OAuth 2.0 since the very first version (OAuth1.0) has been found to be vulnerable to session fixation.</p>
  </blockquote>
  <blockquote>
  <p>OAuth 2.0 relies on HTTPS for security and is currently used and implemented by APIs from companies such as Facebook, Google, Twitter, and Microsoft. OAuth1.0a is harder to use because it requires the use of cryptographic libraries for digital signatures. However, since OAuth1.0a does not rely on HTTPS for security, it can be more suited for higher risk transactions.</p>
  </blockquote>
  <p><strong>Links</strong></p>
  <ul><li><a href="http://stackoverflow.com/a/32534239">A Fun explanation of OAuth involving Donuts</a></li>
  </ul><p>OpenId is another authentication protocol that (like OAuth) does not require a password. The OpenId <a href="http://openid.net/get-an-openid/what-is-openid/">website</a> has a very succinct and clear description, in my opinion:</p>
  <blockquote>
  <p>OpenID allows you to use an existing account to sign in to multiple websites, without needing to create new passwords.</p>
  </blockquote>
  <blockquote>
  <p>You may choose to associate information with your OpenID that can be shared with the websites you visit, such as a name or email address. With OpenID, you control how much of that information is shared with the websites you visit.</p>
  </blockquote>
  <blockquote>
  <p>With OpenID, your password is only given to your identity provider, and that provider then confirms your identity to the websites you visit.  Other than your provider, no website ever sees your password, so you don’t need to worry about an unscrupulous or insecure website compromising your identity.</p>
  </blockquote>
  <p>Although started in 2005, OpenId published <code>OpenId Connect</code> in 2014 which is an "interoperable authentication protocol based on the OAuth 2.0 family of specifications" (<a href="http://openid.net/connect/faq/">source</a>)</p>
  <p><strong>What's the Difference between OpenId and OAuth?</strong></p>
  <p>OpenId is similar to OAuth, but there are some differences. Similarly, OpenId relies on an <code>Identity Provider</code> that interacts with third parties -- <code>relying parties</code> (the site you are logging into) to provide authentication credentials.</p>
  <p>Dissimilarly, you might use OAuth to allow the site you are logging into to have access to your data from the Provider. That might sound scary and confusing but here's a simple example:</p>
  <ul><li>Beorn signs up for Twitter. He is going to tweet pictures of the sweet hat he's knitting.</li>
  <li>Beorn doesn't know whom to follow, and nobody is following him. Beorn is sad and feels unimportant.</li>
  <li>Twitter prompts Beorn to use OAuth to connect his Google account so that he can import his contacts that also have Twitter.</li>
  <li>Beorn follows a bunch of people, including old friends from high school he hasn't seen in many years.</li>
  <li>Beorn does this, and now he is tweeting non-stop.</li>
  </ul><p><strong>Links</strong></p>
  <ul><li><a href="http://openid.net/get-an-openid/what-is-openid/">What is OpenId?</a></li>
  <li><a href="http://openid.net/connect/faq/">OpenId Connect FAQ</a></li>
  <li><a href="https://www.youtube.com/watch?v=Kb56GzQ2pSk">OpenId Connect Video</a></li>
  <li><a href="http://stackoverflow.com/questions/3376141/openid-vs-oauth?rq=1">What's the differene between OpenId vs OAuth?</a></li>
  <li><a href="http://stackoverflow.com/questions/1087031/whats-the-difference-between-openid-and-oauth">What's the differene between OpenId vs OAuth? (different thread)</a></li>
  <li><a href="https://www.youtube.com/watch?v=xcmY8Pk-qEk">OpenId according to Dave -- I like this one, albeit dated</a></li>
  </ul><hr /><p>Here's an image of Stack Overflow's login page, which offers many different authentication methods:</p>
  <p><a href="https://github.com/teesloane/Auth-Boss/blob/master/images/SO_login.png" target="_blank"><img src="https://github.com/teesloane/Auth-Boss/raw/master/images/SO_login.png" alt="" /></a></p>
  <p><a href="https://pdos.csail.mit.edu/papers/webauth:sec10.pdf">1 - Dos and Don’ts of Client Authentication on the Web</a>. Page 2.</p>
  <p><a href="https://pdos.csail.mit.edu/papers/webauth:sec10.pdf">2 - Dos and Don’ts of Client Authentication on the Web</a>. Page 1.</p>
  <p><a href="http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication">http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication</a></p>
  <p><a href="https://blog.codinghorror.com/youre-probably-storing-passwords-incorrectly/">https://blog.codinghorror.com/youre-probably-storing-passwords-incorrectly/</a></p>
  <p><a href="https://pdos.csail.mit.edu/papers/webauth:sec10.pdf">https://pdos.csail.mit.edu/papers/webauth:sec10.pdf</a></p>
  <p><a href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet">OWASP Authentication Cheat Sheet
  </a></p>
  <p>Thank you to the kind people who put up with my million++ questions.</p>


title: Comment je vais tenter de gagner ma vie avec un projet opensource
created_at: 2017-08-10 23:21:26
updated_at: 2017-08-10 23:21:26
mimetype: text/html
language: fr
domain_name: nicolas.loeuillet.org
http_status: 200
url:
  https://nicolas.loeuillet.org/billets/comment-je-vais-tenter-de-gagner-ma-vie-avec-un-projet-opensource

content:
  <p>Suite du billet <a href="https://nicolas.loeuillet.org/billets/service-wallabag-it">"Comment je vais tenter de gagner un peu d'argent avec un projet opensource"</a>. </p>
  <p>Début décembre, j'ai donc lancé <a href="https://wallabag.it/fr" target="_self" rel="nofollow" class="external-link no-image">wallabag.it</a>. C'est pas le carton du siècle, bien évidemment, mais sans faire de publicité (à part sur twitter au sein d'un public geek / libriste déjà plus ou moins convaincu par le projet), je m'en sors pas mal. Je dis ça aussi parce que je n'ai pas besoin d'un gros succès pour vivre, j'ai un CDI à côté. </p>
  <h2>Quelques chiffres</h2>
  <p>Dans quelques jours, ça fera <a href="http://i.giphy.com/YkfsOvmvh5uTK.gif" target="_self" rel="nofollow" class="external-link no-image">trois mois</a> que le service est lancé.<br />Sans rentrer dans les détails (qui feraient pleurer de jalousie les concurrents), on a donc :</p>
  <ul><li>autour de 250 clients</li>
  <li>plus de 750.000 articles sauvegardés</li>
  <li>que des excellents retours, que ça soit sur twitter ou par mail</li>
  <li>quelques couacs liés au fait que je ne pensais que, petits fous, vous importeriez régulièrement 20 à 30.000 articles d'un coup. </li>
  </ul><p>Mais dans l'ensemble donc, tout va très bien ... pour un petit projet où personne ne cherche à se dégager de salaire et où je ne cherche pas forcément à être rentable (pour info, je le suis). </p>
  <h2>La suite</h2>
  <p>L’appétit vient en mangeant. J’ai donc envie de grossir encore un peu plus et pourquoi pas, <strong>vivre exclusivement de mon projet</strong>. </p>
  <p>Pour faire grossir le projet, j’ai besoin de plus de temps.<br />Pour avoir du temps, j’aurais besoin de ne plus avoir mon emploi à côté de wallabag.<br />Mais mon CDI me permet de faire tourner la maison. </p>
  <p>Cercle vicieux. </p>
  <p>Je suis en train d’étudier toutes les possibilités qui existent pour pouvoir être prochainement à temps plein sur wallabag. </p>
  <h2>Marketing et cie</h2>
  <p>Dans les prochains jours, je vais bosser un peu la partie Marketing du projet, c'est clairement pas mon truc à la base, mais je crois que c'est nécessaire. J'ai deux bouquins à avaler, des tableaux à remplir, un Lean Canvas à compléter, etc. <strong>Joie</strong>. </p>
  <p><img alt="" src="https://nicolas.loeuillet.org/images/c/5/f/5/e/c5f5e9bd064bf312bb69edd200e6fed94a595366-livres.jpeg" /></p>
  <p>Je vous tiendrai informé de l'avancée des événements ici ou sur <a href="https://twitter.com/nicosomb" target="_self" rel="nofollow" class="external-link no-image">twitter</a>. </p>


title: Building a scalable Node.js Express app – Gerard Rovira – Medium
url: https://medium.com/@zurfyx/building-a-scalable-node-js-express-app-1be1a7134cfd
created_at: 2017-08-10 23:21:28
updated_at: 2017-08-10 23:21:28
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/1*WHMoBw40Ed3zp2yNDksoyw.png
http_status: 200
content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Building a scalable Node.js Express app</h1></div><div class="section-inner sectionLayout--outsetColumn"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/2000/1*WHMoBw40Ed3zp2yNDksoyw.png" alt="image" /></div></div><div class="section-inner sectionLayout--insetColumn"><p class="graf graf--p graf-after--figure">This publication was initially a <a href="http://stackoverflow.com/a/42164174/2013580" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">response</a> to <a href="http://stackoverflow.com/questions/41875617/building-enterprise-app-with-node-express/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">how to properly isolate a controller using Node.js Express</a> application. Since the community response was so positive I thought I might as well adapt my answer to make it my first publication on Medium. :-)</p><p class="graf graf--p graf-after--p">It is assumed that you have already worked with <a href="https://expressjs.com/en/4x/api.html" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Express 4</a> and <a href="http://mongoosejs.com/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Mongoose</a>, and have general knowledge about JavaScript and Node.js.</p><p class="graf graf--p graf-after--p">Neither folder structure nor Express setup are included. But I will consider writing about my whole Node.js setup if you enjoyed this article! <em class="markup--em markup--p-em">let me know in the comments below</em></p><h3 class="graf graf--h3 graf-after--p">The real problem behind starter Node.js tutorials</h3><p id="fac5" class="graf graf--p graf-after--h3">Most Node.js <a href="https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">t</a><a href="https://www.tutorialspoint.com/nodejs/nodejs_restful_api.htm" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">u</a><a href="http://adrianmejia.com/blog/2014/10/01/creating-a-restful-api-tutorial-with-nodejs-and-mongodb/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">t</a><a href="https://stormpath.com/blog/tutorial-build-rest-api-mobile-apps-using-node-js" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">o</a><a href="https://devcenter.heroku.com/articles/mean-apps-restful-api" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">r</a><a href="http://cwbuecheler.com/web/tutorials/2014/restful-web-app-node-express-mongodb/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">i</a><a href="http://mherman.org/blog/2016/03/13/designing-a-restful-api-with-node-and-postgres/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">a</a><a href="https://codeforgeek.com/2015/08/restful-api-node-mongodb/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">l</a><a href="https://pixelhandler.com/posts/develop-a-restful-api-using-nodejs-with-express-and-mongoose" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">s</a>, which <strong class="markup--strong markup--p-strong">none of them are to blame for</strong>, focus on the content: getting certain libraries / frameworks working. To make it easier for the readers who are new to them they are often presented the most simple solutions.</p><p class="graf graf--p graf-after--p">Whilst these solutions suit most of the times for small to medium projects, large applications tend to require far more abstraction, which is what we’ll be analyzing next.</p><p class="graf graf--p graf-after--p">Let’s start with a small hypothetical case:</p><ul class="postList"><li id="ff41" class="graf graf--li graf-after--p">I want to have an API that serves an user search through AJAX.</li><li class="graf graf--li graf-after--li">I want to have an API that also serves the same user search through Socket.io.</li></ul><p class="graf graf--p graf-after--li">Let’s start with Express. That’s easy peasy, isn’t it?</p><p class="graf graf--p graf-after--p">routes.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import * as userControllers from 'controllers/users';<br />router.get('/users/:username', userControllers.getUser);</code></pre><p class="graf graf--p graf-after--pre">controllers/user.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import User from '../models/User';<br />function getUser(req, res, next) {<br />  const username = req.params.username;<br />  if (username === '') {<br />    return res.status(500).json({ error: 'Username can\'t be blank' });<br />  }<br />  try {<br />    const user = await User.find({ username }).exec();<br />    return res.status(200).json(user);<br />  } catch (error) {<br />    return res.status(500).json(error);<br />  }<br />}</code></pre><p id="bb6d" class="graf graf--p graf-after--pre">Now let’s do the Socket.io part:</p><p id="a1b0" class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">Since we’re not here to talk about </em><a href="http://socket.io" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">socket.io</em></a><em class="markup--em markup--p-em">, I’ll skip the boilerplate.</em></p><pre id="eef6" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import User from '../models/User';<br />socket.on('RequestUser', (data, ack) =&gt; {<br />  const username = data.username;<br />  if (username === '') {<br />    ack ({ error: 'Username can\'t be blank' });<br />  }<br />  try {<br />    const user = User.find({ username }).exec();<br />    return ack(user);<br />  } catch (error) {<br />    return ack(error);<br />  }<br />});</code></pre><p id="d888" class="graf graf--p graf-after--pre">We’re done! However, something smells here…</p><ul class="postList"><li class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">if (username === '')</code>. We had to write the controller validator twice. What if there were <code class="markup--code markup--li-code">n</code>controller validators? Would we have to keep two (or more) copies of each up to date?</li><li class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">User.find({ username })</code> is repeated twice. That could possibly be a service.</li></ul><p class="graf graf--p graf-after--li">We have just written two controllers that are attached to the exact definitions of Express and Socket.io respectively. They will most likely never break during their lifetime because both Express and Socket.io tend to have backwards compatibility. <strong class="markup--strong markup--p-strong">BUT</strong>, they are not reusable. Changing Express for <a href="https://www.npmjs.com/package/hapi" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">Hapi</a>? You will have to redo all your controllers.</p><p id="b040" class="graf graf--p graf-after--p">Another bad smell that might not be so obvious…</p><p class="graf graf--p graf-after--p">The controller response is handcrafted. <code class="markup--code markup--p-code">.json({ error: whatever })</code></p><p class="graf graf--p graf-after--p">APIs in RL are constantly changing. In the future you might want your response to be <code class="markup--code markup--p-code">{ err: whatever }</code> or maybe something more complex (and useful) like: <code class="markup--code markup--p-code">{ error: whatever, status: 500 }</code></p><h3 class="graf graf--h3 graf-after--p">Let’s get started (a possible solution)</h3><p class="graf graf--p graf-after--h3">I can’t call it <em class="markup--em markup--p-em">the</em> solution because there is an endless amount of solutions out there. It is up to your creativity, and your needs. The following is a decent solution; I’m using it in a relatively large project and it seems to be working well, and it fixes everything I pointed out before.</p><p class="graf graf--p graf-after--p">I’ll go Model -&gt; Service -&gt; Controller -&gt; Router, to keep it interesting until the end.</p><h4 class="graf graf--h4 graf-after--p">Model</h4><p class="graf graf--p graf-after--h4">Although I won’t go into details about the Model, you should be having a similar <a href="http://mongoosejs.com/docs/models.html" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Mongoose Model</a> structure.</p><p class="graf graf--p graf-after--p">models/User/validate.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">export function validateUsername(username) {<br />  return true;<br />}</code></pre><p class="graf graf--p graf-after--pre">You can read more about the appropriate structure for mongoose 4.x validators <a href="http://stackoverflow.com/a/42116795" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">here</a>.</p><p class="graf graf--p graf-after--p">models/User/index.js</p><pre id="af70" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import { validateUsername } from './validate';</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const userSchema = new Schema({<br />  username: { <br />    type: String, <br />    unique: true,<br />    validate: [{ validator: validateUsername, msg: 'Invalid username' }],<br />  },<br />}, { timestamps: true });</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const User = mongoose.model('User', userSchema);</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">export default User;</code></pre><p class="graf graf--p graf-after--pre">This is just a basic User Schema with an username field and <code class="markup--code markup--p-code">created</code> <code class="markup--code markup--p-code">updated</code> mongoose-controlled fields.</p><p id="e253" class="graf graf--p graf-after--p">The reason why I included the <code class="markup--code markup--p-code">validate</code> field here is for you to notice that you should be doing most model validation in here, not in the controller.</p><p id="f08f" class="graf graf--p graf-after--p">Mongoose Schema is the last step before reaching the database, unless someone queries MongoDB directly you will always rest assured that everyone goes through your model validations, which gives you more security than placing them on your controller. Not to say that unit testing validators as they are in the previous example is trivial.</p><p class="graf graf--p graf-after--p">Read more about this <a href="http://stackoverflow.com/questions/20465414/best-place-to-handle-data-validation-with-mongoose-and-express" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">here</a> and <a href="https://thecodebarbarian.wordpress.com/2013/06/06/61/" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer noopener nofollow noopener" target="_blank">here</a>.</p><h3 class="graf graf--h3 graf-after--p">Service</h3><p id="f51e" class="graf graf--p graf-after--h3">The service will act as the processor. Given acceptable parameters, it’ll process them and return a value.</p><p id="b258" class="graf graf--p graf-after--p">Most of the times (including this one), it’ll make use of <a href="http://mongoosejs.com/docs/models.html" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">Mongoose Models</a> and return a <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">Promise</a> (or a callback; but <a href="http://callbackhell.com/" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">I would definitely</a> use ES6 with Promises if you are not doing so already).</p><p id="c6e5" class="graf graf--p graf-after--p">services/user.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">function getUser(username) {<br />  return User.find({ username}).exec(); // Just as a mongoose <br />                                        // reminder, .exec() on find<br />                                        // returns a Promise instead<br />                                        // of the default callback.<br />}</code></pre><p class="graf graf--p graf-after--pre">At this point you might be wondering, no <code class="markup--code markup--p-code">catch</code> block? Nope, because we're going to do a <em class="markup--em markup--p-em">cool trick</em> later and we don't need a custom one for this case.</p><p class="graf graf--p graf-after--p">Other times, a trivial sync service will suffice. Make sure your sync service never includes I/O, otherwise you will be blocking <a href="http://stackoverflow.com/questions/17959663/why-is-node-js-single-threaded" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">the whole Node.js thread</a>.</p><p class="graf graf--p graf-after--p">services/user.js</p><pre id="faa1" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">function isChucknorris(username) {<br />  return username === 'Chuck Norris';<br />}</code></pre><h3 id="bdd7" class="graf graf--h3 graf-after--pre">Controller</h3><p class="graf graf--p graf-after--h3">We want to avoid duplicated controllers, so we’ll only have <strong class="markup--strong markup--p-strong">a</strong> controller for each action.</p><p class="graf graf--p graf-after--p">controllers/user.js</p><pre id="b1ce" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">export function getUser(username) {<br />}</code></pre><p id="fa84" class="graf graf--p graf-after--pre">How does this signature look like now? Pretty, right? Because we’re only interested in the username parameter, we don’t need to take useless stuff such as <code class="markup--code markup--p-code">req, res, next</code>.</p><p class="graf graf--p graf-after--p">Let’s add in the missing validators and service:</p><p id="b473" class="graf graf--p graf-after--p">controllers/user.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import { getUser as getUserService } from '../services/user.js'</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">function getUser(username) {<br />  if (username === '') {<br />    throw new Error('Username can\'t be blank');<br />  }<br />  return getUserService(username);<br />}</code></pre><p id="aa1b" class="graf graf--p graf-after--pre">Still looks neat, but… what about the <code class="markup--code markup--p-code">throw new Error</code>, won't that make my application crash? - Shh, wait. We're not done yet.</p><p class="graf graf--p graf-after--p">So at this point, our controller documentation would look sort of:</p><pre id="ea0c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">/**<br /> * Get a user by username.<br /> * @param username a string value that represents user's username.<br /> * @returns A Promise, an exception or a value.<br /> */</code></pre><p class="graf graf--p graf-after--pre"><em class="markup--em markup--p-em">What’s the “value” stated in the </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">returns</em></code><em class="markup--em markup--p-em">? Remember that earlier we said that our services can be both sync or async (using </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">Promise</em></code><em class="markup--em markup--p-em">)? </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">getUserService</em></code><em class="markup--em markup--p-em"> is async in this case, but </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">isChucknorris</em></code><em class="markup--em markup--p-em"> service wouldn't, so it would simply return a value instead of a Promise.</em></p><p id="b19b" class="graf graf--p graf-after--p">Hopefully everyone will read the docs. Because they will need to treat some controllers different than others, and some of them will require a <code class="markup--code markup--p-code">try-catch</code> block.</p><p class="graf graf--p graf-after--p">Since we can’t trust developers (this includes me) reading the docs before trying first, at this point we have to make a decision:</p><ul class="postList"><li id="cabe" class="graf graf--li graf-after--p">Controllers to force a <code class="markup--code markup--li-code">Promise</code> return</li><li id="f274" class="graf graf--li graf-after--li">Service to always return a Promise</li></ul><p class="graf graf--p graf-after--li"><em class="markup--em markup--p-em">⬑ This will solve the inconsistent controller return (not the fact that we can omit our try-catch block).</em></p><p class="graf graf--p graf-after--p">IMO, I prefer the first option. Because controllers are the ones which will chain the most Promises most of the times.</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">return findUserByUsername<br />         .then((user) =&gt; getChat(user))<br />         .then((chat) =&gt; doSomethingElse(chat))</code></pre><p class="graf graf--p graf-after--pre">If we are using ES6 Promise we can make use of a nice property of <code class="markup--code markup--p-code">Promise</code> to do so: <code class="markup--code markup--p-code">Promise</code>can handle non-promises during their lifespan and still keep returning a <code class="markup--code markup--p-code">Promise</code>:</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">return promise<br />         .then(() =&gt; nonPromise)<br />         .then(() =&gt; // I can keep on with a Promise.</code></pre><p class="graf graf--p graf-after--pre">If the only service we call doesn’t use <code class="markup--code markup--p-code">Promise</code>, we can make one ourselves.</p><pre id="bfec" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">return Promise.resolve() // Initialize Promise for the first time.<br />  .then(() =&gt; isChucknorris('someone'));</code></pre><p class="graf graf--p graf-after--pre">Going back to our example it would result in:</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">...<br />return Promise.resolve()<br />  .then(() =&gt; getUserService(username));</code></pre><p class="graf graf--p graf-after--pre">We don’t actually need <code class="markup--code markup--p-code">Promise.resolve()</code> in this case as <code class="markup--code markup--p-code">getUserService</code> already returns a Promise, but we want to be consistent.</p><p id="ce5e" class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">If you are wondering about the </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">catch</em></code><em class="markup--em markup--p-em"> block: we don't want to use it in our controller unless we want to do it a custom treatment. This way we can make use of the two already built-in communication channels (the exception for errors and return for success messages) to deliver our messages through individual channels.</em></p><p id="c98f" class="graf graf--p graf-after--p">Instead of ES6 Promise <code class="markup--code markup--p-code">.then</code>, we can alternatively make use of the newer ES2017 <code class="markup--code markup--p-code">async / await</code> (<a href="http://www.2ality.com/2016/02/ecmascript-2017.html" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">now official</a>) in our controllers:</p><pre id="f4df" class="graf graf--pre graf-after--p">async function myController() { <br />  const user = await findUserByUsername(); <br />  const chat = await getChat(user);<br />  const somethingElse = doSomethingElse(chat); <br />  return somethingElse; <br />}</pre><p id="b49a" class="graf graf--p graf-after--pre"><em class="markup--em markup--p-em">Notice </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">async</em></code><em class="markup--em markup--p-em"> in front of the </em><code class="markup--code markup--p-code"><em class="markup--em markup--p-em">function</em></code><em class="markup--em markup--p-em">.</em></p><h3 class="graf graf--h3 graf-after--p">Router</h3><p class="graf graf--p graf-after--h3">Finally the router, yay!</p><p class="graf graf--p graf-after--p">So we haven’t responded anything to the user yet, all we have is a controller that we know that it ALWAYS returns a <code class="markup--code markup--p-code">Promise</code> (hopefully with data). Oh!, and that can possibly throw an exception if <code class="markup--code markup--p-code">throw new Error is called</code> or some service <code class="markup--code markup--p-code">Promise</code> breaks.</p><p class="graf graf--p graf-after--p">The router will be the one that will, in an uniform way, control petitions and return data to clients, be it some existing data, <code class="markup--code markup--p-code">null</code> or <code class="markup--code markup--p-code">undefined</code> <code class="markup--code markup--p-code">data</code> or an error.</p><p class="graf graf--p graf-after--p">Router will be the ONLY one that will have multiple definitions. The number of which will depend on our interceptors. In the hypothetical case these were API (with Express) and Socket (with Socket.io).</p><p class="graf graf--p graf-after--p">Let’s review what we have to do:</p><p id="d576" class="graf graf--p graf-after--p">We want our router to convert <code class="markup--code markup--p-code">(req, res, next)</code> into <code class="markup--code markup--p-code">(username)</code>. A naive version would be something like this:</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">router.get('users/:username', (req, res, next) =&gt; {<br />  try {<br />    const result = await getUser(req.params.username); // Remember: getUser is the controller.<br />    return res.status(200).json(result);<br />  } catch (error) {<br />    return res.status(500).json(error);<br />  }<br />});</code></pre><p class="graf graf--p graf-after--pre">Although it would work well, that would result in a huge amount of code duplication if we copy-pasted this snippet in all our routes. So we have to make a better abstraction.</p><p class="graf graf--p graf-after--p">In this case, we can create a sort of fake router client that takes a promise and <code class="markup--code markup--p-code">n</code> parameters and does its routing and <code class="markup--code markup--p-code">return</code> tasks, just like it would do in each of the routes.</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">/**<br /> * Handles controller execution and responds to user (API Express version).<br /> * Web socket has a similar handler implementation.<br /> * @param promise Controller Promise. I.e. getUser.<br /> * @param params A function (req, res, next), all of which are optional<br /> * that maps our desired controller parameters. I.e. (req) =&gt; [req.params.username, ...].<br /> */<br />const controllerHandler = (promise, params) =&gt; async (req, res, next) =&gt; {<br />  const boundParams = params ? params(req, res, next) : [];<br />  try {<br />    const result = await promise(...boundParams);<br />    return res.json(result || { message: 'OK' });<br />  } catch (error) {<br />    return res.status(500).json(error);<br />  }<br />};<br />const c = controllerHandler; // Just a name shortener.</code></pre><p id="dd33" class="graf graf--p graf-after--pre">If you are interested in knowing more about this <em class="markup--em markup--p-em">trick</em>, you can read about the full version of this in my other reply in <a href="http://stackoverflow.com/questions/37876889/react-redux-and-websockets-with-socket-io/41309189#41309189" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">React-Redux and Websockets with socket.io</a> (“SocketClient.js” section).</p><p class="graf graf--p graf-after--p">How would your route look like with the <code class="markup--code markup--p-code">controllerHandler</code>?</p><pre id="f8ce" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">router.get('users/:username', c(getUser, (req, res, next) =&gt; [req.params.username]));</code></pre><p class="graf graf--p graf-after--pre">A clean one line, just like in the beginning.</p><h3 class="graf graf--h3 graf-after--p">Further optional steps</h3><h4 class="graf graf--h4 graf-after--h3">Controller Promises</h4><p class="graf graf--p graf-after--h4">It only applies to those who use ES6 Promises. ES2017 <code class="markup--code markup--p-code">async / await</code> version already looks good to me.</p><p class="graf graf--p graf-after--p">For some reason, I dislike having to use <code class="markup--code markup--p-code">Promise.resolve()</code> name to build the initialize Promise. It's just not a clear what's going on there.</p><p class="graf graf--p graf-after--p">I’d rather replace them for something more understandable:</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const chain = Promise.resolve(); // Write this as an external imported variable or a global.</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">chain<br />  .then(() =&gt; ...)<br />  .then(() =&gt; ...)</code></pre><p id="f7a0" class="graf graf--p graf-after--pre">Now you know that <code class="markup--code markup--p-code">chain</code> marks the start of a chain of Promises. So does everyone who reads your code, or if not, they at least assume it's a chain a service functions.</p><h4 class="graf graf--h4 graf-after--p">Express error handler</h4><p id="a1d0" class="graf graf--p graf-after--h4">Express does have a default error handler which you should be using to capture at least the most unexpected errors.</p><pre id="a200" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">router.use((err, req, res, next) =&gt; {<br />  // Expected errors always throw Error.<br />  // Unexpected errors will either throw unexpected stuff or crash the application.<br />  if (Object.prototype.isPrototypeOf.call(Error.prototype, err)) {<br />    return res.status(err.status || 500).json({ error: err.message });<br />  }</code></pre><pre id="e73e" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">  console.error('~~~ Unexpected error exception start ~~~');<br />  console.error(req);<br />  console.error(err);<br />  console.error('~~~ Unexpected error exception end ~~~');</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">  return res.status(500).json({ error: '⁽ƈ ͡ (ुŏ̥̥̥̥םŏ̥̥̥̥) ु' });<br />});</code></pre><p id="e14f" class="graf graf--p graf-after--pre">What’s more, you should probably be using something like <a href="https://www.npmjs.com/package/debug" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">debug</a> or <a href="https://www.npmjs.com/package/winston" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">winston</a> instead of <code class="markup--code markup--p-code">console.error</code>, which are more professional ways to handle logs.</p><p id="d2ca" class="graf graf--p graf-after--p">And that’s is how we plug this into the <code class="markup--code markup--p-code">controllerHandler</code>:</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">...<br />  } catch (error) {<br />    return res.status(500) &amp;&amp; next(error);<br />  }</code></pre><p class="graf graf--p graf-after--pre">We are simply redirecting any captured error to Express’ error handler.</p><h4 id="d912" class="graf graf--h4 graf-after--p">Error as ApiError</h4><p id="a6a0" class="graf graf--p graf-after--h4"><code class="markup--code markup--p-code">Error</code> is considered the default class to encapsulate errors in when throwing an exception in Javascript. If you really only want to track your own controlled errors, I'd probably change the <code class="markup--code markup--p-code">throw Error</code> and the Express error handler from <code class="markup--code markup--p-code">Error</code> to <code class="markup--code markup--p-code">ApiError</code>, and you can even make it fit your needs better by adding it the status field.</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">export class ApiError {<br />  constructor(message, status = 500) {<br />    this.message = message;<br />    this.status = status;<br />  }<br />}</code></pre><h3 class="graf graf--h3 graf-after--pre">Additional information</h3><h4 class="graf graf--h4 graf-after--h3">Custom exceptions</h4><p id="e318" class="graf graf--p graf-after--h4">You can throw any custom exception at any point by <code class="markup--code markup--p-code">throw new Error('whatever')</code> or by using <code class="markup--code markup--p-code">new Promise((resolve, reject) =&gt; reject('whatever'))</code>. You just have to play with <code class="markup--code markup--p-code"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">Promise</a></code>.</p><h4 id="d7a8" class="graf graf--h4 graf-after--p">ES6 ES2017</h4><p class="graf graf--p graf-after--h4">That’s very opinionated point. IMO <a href="http://es6-features.org/" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">ES6</a> (or even <a href="http://www.2ality.com/2016/02/ecmascript-2017.html" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">ES2017</a>, now having an official set of features) is the appropriate way to work on big projects based on Node.</p><p class="graf graf--p graf-after--p">If you aren’t using it already, try looking at <a href="http://es6-features.org/" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">ES6</a> features and <a href="http://www.2ality.com/2016/02/ecmascript-2017.html" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">ES2017</a> and <a href="https://babeljs.io/" class="markup--anchor markup--p-anchor" rel="nofollow noreferrer nofollow noopener" target="_blank">Babel</a> transpiler.</p><h3 class="graf graf--h3 graf-after--p">Result</h3><p class="graf graf--p graf-after--h3">The complete code (shown before step-by-step), with no comments or annotations. You can check everything regarding this code by scrolling up to the appropriate section.</p><p class="graf graf--p graf-after--p">router.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const controllerHandler = (promise, params) =&gt; async (req, res, next) =&gt; {<br />  const boundParams = params ? params(req, res, next) : [];<br />  try {<br />    const result = await promise(...boundParams);<br />    return res.json(result || { message: 'OK' });<br />  } catch (error) {<br />    return res.status(500) &amp;&amp; next(error);<br />  }<br />};<br />const c = controllerHandler;</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">router.get('/users/:username', c(getUser, (req, res, next) =&gt; [req.params.username]));</code></pre><p class="graf graf--p graf-after--pre">controllers/user.js</p><pre id="e1c0" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import { serviceFunction } from service/user.js<br />export async function getUser(username) {<br />  const user = await findUserByUsername();<br />  const chat = await getChat(user);<br />  const somethingElse = doSomethingElse(chat);<br />  return somethingElse;<br />}</code></pre><p class="graf graf--p graf-after--pre">services/user.js</p><pre class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import User from '../models/User';<br />export function getUser(username) {<br />  return User.find({}).exec();<br />}</code></pre><p class="graf graf--p graf-after--pre">models/User/index.js</p><pre id="f73c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">import { validateUsername } from './validate';</code></pre><pre class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const userSchema = new Schema({<br />  username: { <br />    type: String, <br />    unique: true,<br />    validate: [{ validator: validateUsername, msg: 'Invalid username' }],<br />  },<br />}, { timestamps: true });</code></pre><pre id="d000" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const User = mongoose.model('User', userSchema);</code></pre><pre id="b87d" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">export default User;</code></pre><p id="c5ff" class="graf graf--p graf-after--pre">models/User/validate.js</p><pre class="graf graf--pre graf-after--p graf--trailing"><code class="markup--code markup--pre-code">export function validateUsername(username) {<br />  return true;<br />}</code></pre></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><p class="graf graf--p graf--leading"><em class="markup--em markup--p-em">Have any questions? Please, let me know in the comments.</em></p><p id="f6a0" class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">You can also get in touch with me via </em><a href="https://twitter.com/_zurfyx" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Twitter</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.linkedin.com/in/gerard-rovira" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">LinkedIn</em></a><em class="markup--em markup--p-em">, </em><a href="https://github.com/zurfyx" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">GitHub</em></a><em class="markup--em markup--p-em">, </em><a href="http://stackoverflow.com/users/2013580/zurfyx" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">StackOverflow</em></a><em class="markup--em markup--p-em"> or Mail.</em></p><p class="graf graf--p graf-after--p graf--trailing"><em class="markup--em markup--p-em">Mail: bWFpbHRvOnp1cmZ5eEBnbWFpbC5jb20=</em></p></div></div></div>


title: Comment GraphQL pourrait nous aider à améliorer l’espace client OVH
created_at: 2017-08-10 23:21:29
updated_at: 2017-08-10 23:21:29
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/1*eFKbTVPZ6NyqaLSzQSE0dg.png
http_status: 200
url:
  https://medium.com/@OVHUXLabs/comment-graphql-pourrait-nous-aider-à-améliorer-lespace-client-ovh-e9e4154c3422

content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Comment GraphQL pourrait nous aider à améliorer l’espace client OVH</h1><h2 class="graf graf--h4 graf-after--h3 graf--trailing graf--subtitle">Les premiers pas des développeurs UX OVH avec GraphQL, la spécification initiée par Facebook pour construire des back-ends adaptés aux applications front-ends actuelles.</h2></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><p id="f585" class="graf graf--p graf--leading">Chez OVH, l’équipe développeurs UX est chargée de développer l’ensemble des interfaces client, depuis le tunnel de commande sur le site <a href="http://ovh.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">ovh.com</a> jusqu’à l’espace client (<a href="https://fr.wikipedia.org/wiki/Frontal_%28serveur%29" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">front-end</a> et <a href="https://fr.wikipedia.org/wiki/Backend" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">back-end</a> associé).</p><p class="graf graf--p graf-after--p">Notre équipe est le premier client des APIs fournies par OVH, que nous consommons pour accéder aux informations au même titre que nos clients. Autrement dit, toutes les informations que nous affichons au sein de l’espace client OVH sont aussi disponibles à travers l’<a href="http://api.ovh.com" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">API publique OVH</a>. Cette API est développée selon la spécification <a href="https://fr.wikipedia.org/wiki/Representational_state_transfer" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank"><em class="markup--em markup--p-em">REST</em></a> qui est rapidement devenue un standard pour bon nombre d’API publiques.</p><p class="graf graf--p graf-after--p">Si vous avez déjà eu l’occasion de développer un outil front-end, dans ce cas un espace client avec beaucoup de données à récupérer, vous le savez : une API <em class="markup--em markup--p-em">REST</em> peut rapidement poser des problèmes de performance. L’architecture REST est conçue pour isoler chaque ressource dans un endpoint différent. Dès lors que l’on doit afficher plusieurs ressources, le nombre de requêtes augmente drastiquement. Or les navigateurs limitent le nombre de requêtes à effectuer en parallèle. Et, une fois les limites atteintes, les requêtes excédentaires sont mises en attente par le navigateur.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*an7EnQLmhuthN48wH_ReJQ.png" alt="image" /></div>Inspection des requêtes pour afficher la page informations d’un hébergement web</div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><p class="graf graf--p graf--leading">Vous l’aurez compris, chez OVH pour pouvoir afficher les données du manager dans un temps relativement court, nous avons mis en place ce qu’on appelle un <a href="http://samnewman.io/patterns/architectural/bff/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">back-end for front-end</a> (BFF). Il nous permet de limiter le nombre de requêtes effectuées en front et évite ainsi que ne se constitue une longue file d’attente de requêtes <a href="https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">HTTP</a>. Actuellement ce <a href="https://www.thoughtworks.com/insights/blog/bff-soundcloud" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">BFF</em></a><em class="markup--em markup--p-em"> </em>est une API en microservices Node.js grâce à laquelle nous réalisons de l’agrégation de données (via api.ovh.com) et dans certains cas du calcul, pour déporter la charge de travail côté serveur. Ce back-end résout en partie notre souci de saturation côté navigateur mais il présente cependant quelques inconvénients.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*kf4VTipDjeT_mnmqNZJoaw.png" alt="image" /></div>Schéma exemple d’un back-end for front-end<p class="graf graf--p graf-after--figure graf--trailing">Par exemple, pour afficher certaines pages ou certaines sections de l’espace client, nous réutilisons le même microservice afin de ne pas les multiplier inutilement. De ce fait, nous allons parfois requêter des informations sur l’API dont nous n’avons pas forcément besoin, ce qui induit un temps de réponse plus long. Autre exemple : dans certaines situations, nous devons redéployer le microservice et le front pour une modification. L’équipe UX d’OVH étant très agile, la possibilité de redéployer uniquement le front entraînera un gain de temps afin de mettre en production notre application plus rapidement.</p></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 class="graf graf--h3 graf--leading">Introduction à GraphQL et exemples d’utilisation</h3><p id="eeef" class="graf graf--p graf-after--h3">Suite à un <a href="http://chtijug.org/session-graphql-the-new-age-of-api/" class="markup--anchor markup--p-anchor" rel="noopener nofollow" target="_blank">Meetup</a> auquel j’ai assisté traitant de <a href="http://graphql.org" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">GraphQL</a>, j‘ai rapidement trouvé des cas d’utilisation de cette spécification au sein de l’équipe UX. Pour ceux qui ignorent tout de GraphQL, laissez-moi vous présenter brièvement cette spécification et vous fournir quelques liens utiles. Après cette présentation succincte, vous comprendrez rapidement pourquoi nous étudions la possibilité d’utiliser cette spécification pour le back-end de notre espace client.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*eFKbTVPZ6NyqaLSzQSE0dg.png" alt="image" /></div>Logo GraphQL<p class="graf graf--p graf-after--figure"><strong class="markup--strong markup--p-strong">GraphQL est une spécification</strong> concernant un langage de requête qui a été initié par les ingénieurs de Facebook en 2012. L’idée n’est donc pas tout à fait nouvelle, mais les choses se sont accélérées depuis que Facebook a décrit cette spécification afin d’en faire un standard. Attention à ne pas confondre : GraphQL n’est pas un langage de requête pour bases de données, mais une spécification pour ce langage. De plus, GraphQL est souvent utilisé pour une API en HTTP, mais ce n’est pas le seul cas d’utilisation possible : le standard est agnostique de la couche de transport utilisée.</p><p class="graf graf--p graf-after--p">Avec GraphQL il faut complètement mettre de côté les spécificités de <em class="markup--em markup--p-em">REST. </em>Une première grande différence réside dans le fait qu’il n’y a plus qu’un seul endpoint qui va nous permettre d’accéder aux différentes ressources. Cet endpoint est un POST qui va prendre dans son body la requête GraphQL. Pour faire simple, voici un exemple de requête en GraphQL :</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1200/1*-hzKovFpSEf9VF4zbIhkUg.png" alt="image" /></div>Exemple de requête GraphQL<p class="graf graf--p graf-after--figure">Ce n’est pas un JSON valide c’est un format propre à GraphQL. Dans cette requête, nous demandons d’avoir la ressource “<em class="markup--em markup--p-em">posts” </em>avec comme détails son <em class="markup--em markup--p-em">“title”</em> et la ressource <em class="markup--em markup--p-em">“author”</em>.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*FUf5AtOm49MpflRwrkGuSA.png" alt="image" /></div>Exemple d’erreur quand on demande le champ “age” sur “author” qui n’existe pas<p class="graf graf--p graf-after--figure">Avec cette simple requête, on peut déjà s’apercevoir de différents avantages : le résultat sera sous le même format (JSON cette fois-ci) avec les données, plus du tout de surprises concernant le retour de l’API. L’avantage est aussi que l’implémentation GraphQL s’occupe de la validation des données. Si on requête une ressource qu’il ne connait pas, il va directement renvoyer l’erreur appropriée, puisqu’en réalité dans le code nous lui déclarons un schéma de données ainsi que le type associé.</p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">GraphQL gère notamment les cas d’erreurs</strong> partielles. Imaginons qu’une ressource est indisponible pour le moment mais que tout le reste fonctionne correctement. Dans cette situation GraphQL va nous renvoyer tout ce qu’il sait récupérer et indiquer les champs qu’il n’a pas pu récupérer. Dans notre application front-end nous pourrons afficher certaines informations, plutôt que de ne rien afficher du tout.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*ewwo6gDyBAay5fsd2SH8PQ.png" alt="image" /></div><p class="graf graf--p graf-after--figure">En contrepartie, GraphQL requête en parallèle tout ce qu’il peut. Par conséquent, si vous utilisez GraphQL dans un langage qui ne gère pas l’asynchrone, les performances risquent d’être catastrophiques. Un des principaux atouts de cette spécification est aussi le fait d’aller chercher uniquement la ressource demandée. De cette façon si “authors” n’est pas renseigné dans la query GraphQL, alors celle-ci n’ira pas chercher l’information et nous profiterons d’un temps de réponse plus court.</p><p id="f313" class="graf graf--p graf-after--p">Autre cas pratique : le filtrage des données. Par exemple, si je veux filtrer et n’afficher que les publications dont l’auteur est “OVH”, voici la requête :</p><pre id="e210" class="graf graf--pre graf-after--p">{<br />  posts {<br />    title,<br />    author(name: "OVH") {<br />      name<br />      twitterHandle<br />    }<br />  }<br />}</pre><p class="graf graf--p graf-after--pre">Pour un endpoint de ce type, on peut disposer d’une documentation basique assez rapidement grâce à l’introspection. En effet, puisque l’on déclare les schémas et les types que l’on peut requêter, il existe un outil qui s’appelle “<a href="https://github.com/graphql/graphiql" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">GraphiQL</a>”, qui permet d’avoir de l’auto-complétion de la requête GraphQL dans le navigateur.</p></div><div class="section-inner sectionLayout--outsetColumn"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/2000/1*-KpieQSCI_2gqandWIG7ug.gif" alt="image" /></div>Gif de GraphiQL avec démo de l’introspection</div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 id="a40d" class="graf graf--h3 graf--leading">Implémentation GraphQL en Node.Js</h3><p id="aeef" class="graf graf--p graf-after--h3">Il existe plusieurs <a href="http://graphql.org/code/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">implémentations dans différents langages</a>, celle qui semble être la plus maintenue et documentée est <a href="https://github.com/graphql/graphql-js" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">graphql-js</a> en Node.js. C’est celle-ci que nous avons utilisée pour réaliser un <a href="https://fr.wikipedia.org/wiki/Preuve_de_concept" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">POC</a> et c’est avec cette librairie qu’ont été construits les exemples qui vont suivre.</p><p id="e2d8" class="graf graf--p graf-after--p">Pour bénéficier de la validation ainsi que de l’introspection GraphQL, nous avons besoin de déclarer notre schéma avec ses différents types. Voici à quoi cela ressemble :</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><div class="iframeContainer"><iframe width="700" height="250" src="https://medium.com/media/62b6af7928d1aa99b822961e8ec86604?postId=e9e4154c3422" allowfullscreen="allowfullscreen" frameborder="0">[embedded content]</iframe></div></div>Exemple de schéma GraphQL<p class="graf graf--p graf-after--figure">Dans l’exemple ci-dessus, nous avons plusieurs parties très intéressantes à analyser. Les types comme par exemple “GraphQLString” viennent de la librairie <a href="https://github.com/graphql/graphql-js" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">graphql</a>-js disponible sur <a href="http://npmjs.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">NPM</a>. Si vous souhaitez plus d’informations concernant ces types, n’hésitez pas à <a href="http://graphql.org/graphql-js/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">consulter la documentation.</a> Nous avons aussi utilisé la librairie NPM <a href="https://github.com/graphql/express-graphql" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">express-graphql</a> qui nous permet de faire le lien entre <a href="http://expressjs.com/fr/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">expressjs</a> et GraphQL.</p><p id="e972" class="graf graf--p graf-after--p">Dans le champ “<em class="markup--em markup--p-em">domains”,</em> il y a la partie “<em class="markup--em markup--p-em">args</em>” qui représente le paramètre à partir duquel on voudrait filtrer, dans notre exemple, je lui indique un paramètre nommé “<em class="markup--em markup--p-em">length”.</em> Donc pour l’utiliser dans ma requête, j’écris simplement “<em class="markup--em markup--p-em">domains(length: 2)”</em> ce qui limitera les domaines à afficher à 2 maximum.</p><p class="graf graf--p graf-after--p">Ce paramètre, nous le récupérons justement dans la fonction “resolve”, qui comme son nom l’indique résout une <a href="https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">promise</a> ou une valeur pour trouver la donnée. Le paramètre “parentValue” représente les valeurs de l’élément parent, car le type “SSL” est un sous-type de Hosting, donc “parentValue” aura les valeurs de “hosting”. Et dans “request” nous retrouvons le contexte de la requête effectuée.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><div class="iframeContainer"><iframe width="700" height="250" src="https://medium.com/media/e04dbfff1f0132ee8f30c4c541ee4e00?postId=e9e4154c3422" allowfullscreen="allowfullscreen" frameborder="0">[embedded content]</iframe></div></div>Type Hosting en GraphQL<p class="graf graf--p graf-after--figure">Vous l’aurez compris : pour chaque donnée, vous pouvez spécifier un resolver pour aller la chercher où vous le souhaitez. De cette façon, cela fait une certaine abstraction et si dans le futur, notre donnée se trouve à un endroit différent ou si l’on recourt à une technologie différente, nous devrons juste changer le resolver lié à celle-ci. Cela constitue un atout indéniable lorsqu’on migre sur de nouvelles infrastructures par exemple.</p><h3 id="e117" class="graf graf--h3 graf-after--p">Conclusion</h3><p class="graf graf--p graf-after--h3">GraphQL permet donc de résoudre les problèmes évoqués au début d’article, entre autre liés à l’utilisation d’une API Rest en front. De plus, grâce à cette spécification, nous pouvons facilement migrer vers une architecture différente avec un effort raisonnable. Si vous souhaitez en apprendre d’avantage sur ce sujet, n’hésitez pas à visiter les liens situés en bas de ce post. J’en profite également pour vous signaler que nous avons créé un <a href="https://gitter.im/ovh/ux" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Gitter</a> afin de discuter de sujets techniques. Venez y discuter avec nous et partager votre expérience si vous avez déjà utilisé GraphQL !</p><p id="bc04" class="graf graf--p graf-after--p"><a href="https://medium.com/@bnjjj" class="markup--user markup--p-user" target="_blank">Benjamin Coenen</a>, <em class="markup--em markup--p-em">développeur </em><a href="https://www.ovh.com/fr/blog/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Team </em>OVH UX Labs R&amp;D</a></p><h3 id="a0fc" class="graf graf--h3 graf-after--p">Sources</h3><ul class="postList"><li class="graf graf--li graf-after--h3"><a href="https://dev-blog.apollodata.com/the-basics-of-graphql-in-5-links-9e1dc4cac055#.6hzoicg9r" class="markup--anchor markup--li-anchor" rel="nofollow noopener" target="_blank">Intro to GraphQL</a> by <a href="https://medium.com/@helfer" class="markup--user markup--li-user" target="_blank">Jonas Helfer</a></li><li class="graf graf--li graf-after--li"><a href="https://medium.com/@raxwunter/moving-existing-api-from-rest-to-graphql-205bab22c184#.mc1r0uojq" class="markup--anchor markup--li-anchor" target="_blank">Move existing API from REST to GraphQL</a> by <a href="https://medium.com/@raxwunter" class="markup--user markup--li-user" target="_blank">Roman Krivtsov</a></li><li class="graf graf--li graf-after--li"><a href="https://learngraphql.com/basics/introduction" class="markup--anchor markup--li-anchor" rel="noopener nofollow" target="_blank">Learn GraphQL</a></li><li class="graf graf--li graf-after--li graf--trailing"><a href="http://graphql.org/learn/" class="markup--anchor markup--li-anchor" rel="nofollow noopener" target="_blank">GraphQL Website</a></li></ul></div></div></div></div></div></div></div></div></div></div></div>


title: The Cracking Monolith: The Forces That Call for Microservices
url: https://semaphoreci.com/blog/2017/03/21/cracking-monolith-forces-that-call-for-microservices.html
created_at: 2017-08-10 23:21:31
updated_at: 2017-08-10 23:21:31
mimetype: text/html
language: en
domain_name: semaphoreci.com
http_status: 200
content:
  <p class="f5 mt2 mb3 black-50 truncate"> ·  21 Mar 2017 ·
        <a class="link-reset black-50 underline-hover" href="https://semaphoreci.com/blog/tags/engineering.html">Semaphore Engineering Blog</a>
    
    </p><p class="figure">
    <img src="https://semaphoreci.com/blog/assets/images/2017-03-21/monolith-call-for-microservices-5e6bc502.jpg" alt="image" /></p>
  <p>The microservice architecture has recently been gaining traction, with many
  companies sharing their positive experiences with applying it. The early
  adopters have been tech behemoths such as Amazon and Netflix, or companies with
  huge user bases like SoundCloud. Based on the profiles of these companies and
  the assumption that there's more complexity to running and deploying many things
  than to deploying a single application, many people understand microservices as
  an interesting idea that does not apply to them. It's something
  that mere mortals could qualify for in the far distant future, if ever.</p>
  <p>However, obsessing about "being ready" is rarely a good strategy in life. I
  think that it's far more useful to first learn how to detect when
  the opposite approach — a monolithic application — is no longer optimal. The
  knowledge that helps us to recognize the need enables us to start taking action
  when the time comes for us to make the change.
  This and future posts on our blog will be based on our experience of scaling up Semaphore
  to manage tens of thousands of private CI jobs on a daily basis.</p>
  <p>Overweight monoliths exhibit two classes of problems: degrading system
  performance and stability, and slow development cycles. So, whatever we do comes
  from the desire to escape these technical and consequently social challenges.</p>
  <h3 class="f4 lh-title">The single point of fragility</h3>
  <p>Today's typical large monolithic systems started off as web applications written
  in an MVC framework, such as Ruby on Rails. These systems are characterized by
  either being a single point of failure, or having severe bottlenecks under
  pressure.</p>
  <p>Of course, having <em>potential</em> bottlenecks, or having an entire system that is a single
  point of failure is not inherently a problem. When you’re in month 3 of your
  MVP, this is fine. When you’re working in a team of a few developers on a client
  project which serves 100 customers, this is fine. When most of your app's
  functionality are well-designed CRUD operations based on human input with a linear
  increase of load, things are probably going to be fine for a long time.</p>
  <p>Also, there's nothing inherently wrong about big apps. If you have
  one and you're not experiencing any of these issues, there's absolutely no reason
  to change your approach. You shouldn't build microservices solely in the service
  of making the app smaller — it makes no sense to replace the parts
  that are doing their job well.</p>
  <p>Problems begin to arise after your single point of failure has actually started
  failing under heavy load.</p>
  <p>At that point, having a large attack surface can start keeping the team in a
  perpetual state of emergency. For example:</p>
  <ul><li>An outage in non-critical data processing brings down your entire website.
  With Semaphore, we had events where the monolith was handling callbacks
  from many CI servers, and when that part of the system failed, it brought the
  entire service down.</li>
  <li>You moved all time-intensive tasks to one huge group of background workers,
  and keeping them stable gradually becomes a full-time job for a small
  team.</li>
  <li>Changing one part of the system unexpectedly affects some other parts even
  though they’re logically unrelated, which leads to some nasty surprises.</li>
  </ul><p>As a consequence, your team spends more time solving technical issues than
  building cool and useful stuff for your users.</p>
  <h3 class="f4 lh-title">Slow development cycles</h3>
  <p>The second big problem is when making any change happen begins to take too
  much time.</p>
  <p>There are some technical factors that are not difficult to measure. A good question
  to consider is how much time it takes your team to ship a hotfix to production.
  Not having a fast delivery pipeline is painfully obvious to your users in
  the case of an outage.</p>
  <p>What’s less obvious is how much the slow development cycles are affecting
  your company over a longer period of time. How long does it take your team to
  get from an idea to something that customers can use in production? If the
  answer is weeks or months, then your company is vulnerable to being
  outplayed by competition.</p>
  <p>Nobody wants that, but that's where the compound effects of monolithic,
  complex code bases lead to.</p>
  <p><strong>Slow CI builds</strong>: anything longer than a few minutes leads to too much
  unproductive time and task switching. As a standard for web apps <a href="https://semaphoreci.com/blog/2017/03/02/what-is-proper-continuous-integration.html">we
  recommend setting the bar at 10
  minutes</a>
  and <a href="https://semaphoreci.com/blog/2017/03/16/measure-and-improve-your-ci-speed.html">we actually draw the line for you</a>.
  Slow CI builds are one of the first symptoms of an overweight monolith, but the good news is that a good CI tool can
  help you fix it. For example, on Semaphore you can <a href="https://semaphoreci.com/docs/running-tests-in-parallel.html">split your test suite into parallel jobs</a>, or <a href="https://semaphoreci.com/product/test-boosters">let Semaphore do
  the work for you automatically</a>, regardless of the
  sequential runtime of your build.</p>
  <p><strong>Slow deployment</strong>: this issue is typical for monoliths that have accumulated many
  dependencies and assets. There are often multiple app instances, and we
  need to replace each one without having downtime. Moving to container-based
  deployment can make things even worse, by adding the time needed to build and copy
  the container image.</p>
  <p><strong>High bus factor on the old guard, long onboarding for the newcomers</strong>: it takes
  months for someone new to become comfortable with making a non-trivial
  contribution in a large code base. And yet, all new code is just a small
  percentile of the code that has already been written. The idiosyncrasies of old
  code affect and constrain all new code that is layered on top of the old one. This
  leaves those who have watched the app grow with an ever-expanding
  responsibility. For example, having 5 developers that are waiting for a single
  person to review their pull requests is an indicator of this.</p>
  <p><strong>Emergency-driven context switching</strong>: we may have begun working on a new
  feature, but an outage has just exposed a vulnerability in our system. So,
  healing it becomes a top priority, and the team needs to react and switch
  to solving that issue. By the time they return to the initial project, internal
  or external circumstances can change and reduce its impact, perhaps
  even make it obsolete. A badly designed distributed system can make this even
  worse — hence one of the requirements for making one is having solid design
  skills. However, if all code is part of a single runtime hitting one database,
  our options for avoiding contention and downtime are very limited.</p>
  <p><strong>Change of technology is difficult</strong>: our current framework and tooling
  might not be the best match for the new use cases and the problems we
  face. It's also common for monoliths to depend on outdated software. For
  example, GitHub upgraded to Rails 3 four years after it was
  released. Such latency can either limit our design choices, or generate
  additional maintenance work. For example, when the library version
  that you're using is no longer receiving security updates, you need to
  find a way to patch it yourself.</p>
  <h3 class="f4 lh-title">Decomposition for fun and profit</h3>
  <p>While product success certainly helps, a development team that's
  experiencing all of these issues won't have the highest morale. Nor will its
  people be able to develop their true potential.</p>
  <p>All this can happen regardless of code quality. <a href="https://semaphoreci.com/community/tutorials/behavior-driven-development">Practicing
  behavior-driven
  development</a>
  is not a vaccine against scaling issues.</p>
  <p>The root cause is simple. A monolithic application grows multiple applications
  within itself, and it meets high traffic and large volumes of data.</p>
  <p>Big problems are best solved by breaking them up into many smaller ones that are easier to handle.
  This basic engineering idea is what leads teams to start decomposing large
  monoliths into smaller services, and eventually into microservices. The ultimate goal is
  to go back to being creative and successful by enabling the team to develop useful products as
  quickly as possible.</p>


title: Game Development with ReactJS and PHP: How Compatible Are They? — SitePoint
url: https://www.sitepoint.com/game-development-with-reactjs-and-php-how-compatible-are-they/
created_at: 2017-08-10 23:21:34
updated_at: 2017-08-10 23:21:34
mimetype: text/html
language: en
domain_name: www.sitepoint.com
preview_picture: https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2017/03/1490513985stardew.png
http_status: 200
content:
  <div class="article_series-box"><h4><a href="https://www.sitepoint.com/series/game-development-with-php-and-reactjs/" class="series-11195" title="Game Development with PHP and ReactJS">Game Development with PHP and ReactJS</a></h4></div><p class="wp-special"><em>This article was peer reviewed by <a href="https://github.com/kelunik">Niklas Keller</a>. Thanks to all of SitePoint’s peer reviewers for making SitePoint content the best it can be!</em></p>
  <hr /><p><em>“I’d like to make a multiplayer, economy-based game. Something like <a href="http://store.steampowered.com/app/413150">Stardew Valley</a>, but with none of the befriending aspects and a player-based economy.”</em></p>
  <p><img src="https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2017/03/1490513985stardew.png" alt="Stardew valley" /></p>
  <p>I started thinking about this the moment I decided to try and build a game using PHP and ReactJS. The trouble is that I knew nothing about the dynamics of multiplayer games, or how to think about and implement player-based economies.</p>
  <p>I wasn’t even sure that I knew enough about ReactJS to justify using it. I mean, the initial interface – where I focus heavily on the server and economic aspects of the game – is perfectly suited for ReactJS. But what about when I start to make the farming /interaction aspects? I love the idea of building an isometric interface around the economic system.</p>
  <p>I once watched a talk, by <a href="https://twitter.com/dead_lugosi">dead_lugosi</a>, where she described building a medieval game in PHP. Margaret inspired me, and that talk was one of the things that lead to me writing <a href="https://www.amazon.com/dp/1484224922">a book about JS game development</a>. I became determined to write about my experience. Perhaps others could learn from my mistakes in this case, too.</p>
  <blockquote>
  <p>The code for this part can be found at: <a href="https://github.com/assertchris-tutorials/sitepoint-making-games/tree/part-1">github.com/assertchris-tutorials/sitepoint-making-games/tree/part-1</a>. I’ve tested it with PHP <code>7.1</code> and in a recent version of Google Chrome.</p>
  </blockquote>
  <h2 id="settingupthebackend">Setting Up The Back-end</h2>
  <p>The first thing I searched for was guidance on building multiplayer economies. I found <a href="http://gamedev.stackexchange.com/questions/11697/guidance-for-building-a-proper-in-game-economy">an excellent StackOverflow thread</a> in which folks explained various things to think about. I got about half-way through it before realizing I may be starting from the wrong place.</p>
  <p><em>“First things first; I need a PHP server. I’m going to have a bunch of ReactJS clients, so I want something capable of high-concurrency (perhaps even Web Sockets). And it needs to be persistent: things must happen even when players aren’t around.”</em></p>
  <p>I went to work setting up an async PHP server – to handle high concurrency and support web sockets. I added <a href="https://www.sitepoint.com/how-to-make-modern-php-more-modern-with-preprocessing">my recent work with PHP preprocessors</a> to make things cleaner, and made the first couple of endpoints:</p>
  <pre class="php language-php">$host = new Aerys\Host();&#13;
  $host-&gt;expose("*", 8080);&#13;
  &#13;
  $host-&gt;use($router = Aerys\router());&#13;
  $host-&gt;use($root = Aerys\root(.."/public"));&#13;
  &#13;
  $web = process .."/routes/web.pre";&#13;
  $web($router);&#13;
  &#13;
  $api = process .."/routes/api.pre";&#13;
  $api($router);&#13;
  </pre>
  <blockquote>
  <p>This is from <code>config.pre</code></p>
  </blockquote>
  <p>I decided to use <a href="https://github.com/amphp/aerys">Aerys</a> for the HTTP and Web Socket portions of the application. This code looked very different compared to the Aerys docs, but that’s because I had a good idea about what I needed.</p>
  <p>The usual process for running an Aerys app was to use a command like:</p>
  <pre class="bash language-bash">vendor/bin/aerys -d -c config.php&#13;
  </pre>
  <p>That’s a lot of code to keep repeating, and didn’t handle the fact that I wanted to use PHP preprocessing. I created a loader file:</p>
  <pre class="php language-php">return Pre\processAndRequire(__DIR__ . "/config.pre");&#13;
  </pre>
  <blockquote>
  <p>This is from <code>loader.php</code></p>
  </blockquote>
  <p>…and installed my dependencies:</p>
  <pre class="javascript language-javascript">"require": {&#13;
      "amphp/aerys": "dev-amp_v2",&#13;
      "amphp/parallel": "dev-master",&#13;
      "league/container": "^2.2",&#13;
      "league/plates": "^3.3",&#13;
      "pre/short-closures": "^0.4.0"&#13;
  },&#13;
  "require-dev": {&#13;
      "phpunit/phpunit": "^6.0"&#13;
  },&#13;
  </pre>
  <blockquote>
  <p>This is from <code>composer.json</code></p>
  </blockquote>
  <p>I wanted to use <code>amphp/parallel</code>, to move blocking code out of the async server, but it wouldn’t install with a stable tag of <code>amphp/aerys</code>. That’s why I went with the <code>dev-amp_v2</code> branch.</p>
  <p>I thought it would be a good idea to include some sort of template engine and service locator. I opted for PHP League versions of each. Finally I added <code>pre/short-closures</code>, both to handle the custom syntax in <code>config.pre</code> and the short closures I planned on using after…</p>
  <p>Then I set about creating routes files:</p>
  <pre class="php language-php">use Aerys\Router;&#13;
  use App\Action\HomeAction;&#13;
  &#13;
  return (Router $router) =&gt; {&#13;
      $router-&gt;route(&#13;
          "GET", "/", new HomeAction&#13;
      );&#13;
  };&#13;
  </pre>
  <blockquote>
  <p>This is from <code>routes/web.pre</code></p>
  </blockquote>
  <p>…and:</p>
  <pre class="php language-php">use Aerys\Router;&#13;
  use App\Action\Api\HomeAction;&#13;
  &#13;
  return (Router $router) =&gt; {&#13;
      $router-&gt;route(&#13;
          "GET", "/api", new HomeAction&#13;
      );&#13;
  };&#13;
  </pre>
  <blockquote>
  <p>This is from <code>routes/api.pre</code></p>
  </blockquote>
  <p>Though simple routes, these helped me to test the code in <code>config.pre</code>. I decided to make these routes files return closures, so I could pass them a typed <code>$router</code>, to which they could add their own routes. Finally, I created two (similar) actions:</p>
  <pre class="php language-php">namespace App\Action;&#13;
  &#13;
  use Aerys\Request;&#13;
  use Aerys\Response;&#13;
  &#13;
  class HomeAction&#13;
  {&#13;
      public function __invoke(Request $request,&#13;
          Response $response)&#13;
      {&#13;
          $response-&gt;end("hello world");&#13;
      }&#13;
  }&#13;
  </pre>
  <blockquote>
  <p>This is from <code>app/Actions/HomeAction.pre</code></p>
  </blockquote>
  <p>One final touch was to add shortcut scripts, to launch dev and prod versions of the Aerys server:</p>
  <pre class="javascript language-javascript">"scripts": {&#13;
      "dev": "vendor/bin/aerys -d -c loader.php",&#13;
      "prod": "vendor/bin/aerys -c loader.php"&#13;
  },&#13;
  "config": {&#13;
      "process-timeout": 0&#13;
  },&#13;
  </pre>
  <blockquote>
  <p>This is from <code>composer.json</code></p>
  </blockquote>
  <p>With all of this done, I could spin up a new server, and visit <code>http://127.0.0.1:8080</code> just by typing:</p>
  <pre class="bash language-bash">composer dev&#13;
  </pre>
  <h2 id="settingupthefrontend">Setting Up The Front-end</h2>
  <p><em>“Ok, now that I’ve got the PHP side of things relatively stable; how am I going to build the ReactJS files? Perhaps I can use <a href="https://laravel.com/docs/5.4/mix">Laravel Mix</a>…?”</em></p>
  <p>I wasn’t keen on creating a whole new build chain, and Mix had been rebuilt to work well on non-Laravel projects too. Although it was relatively easy to configure and extend, it favored VueJS by default.</p>
  <p>The first thing I had to do was install a few NPM dependencies:</p>
  <pre class="javascript language-javascript">"devDependencies": {&#13;
      "babel-preset-react": "^6.23.0",&#13;
      "bootstrap-sass": "^3.3.7",&#13;
      "jquery": "^3.1.1",&#13;
      "laravel-mix": "^0.7.5",&#13;
      "react": "^15.4.2",&#13;
      "react-dom": "^15.4.2",&#13;
      "webpack": "^2.2.1"&#13;
  },&#13;
  </pre>
  <blockquote>
  <p>This is from <code>package.json</code></p>
  </blockquote>
  <p>Mix used <a href="https://www.sitepoint.com/beginners-guide-to-webpack-2-and-module-bundling/">Webpack</a> to preprocess and bundle JS and CSS files. I also needed to install the <a href="https://facebook.github.io/react">ReactJS</a> (and related <a href="http://babeljs.io">Babel</a>) libraries, to build <code>jsx</code> files. Finally, I added the <a href="http://getbootstrap.com">Bootstrap</a> files, for a bit of default styling.</p>
  <p>Mix automatically loaded a custom configuration file, so I added:</p>
  <pre class="javascript language-javascript">let mix = require("laravel-mix")&#13;
  &#13;
  // load babel presets for jsx files&#13;
  &#13;
  mix.webpackConfig({&#13;
      "module": {&#13;
          "rules": [&#13;
              {&#13;
                  "test": /jsx$/,&#13;
                  "exclude": /(node_modules)/,&#13;
                  "loader": "babel-loader" + mix.config.babelConfig(),&#13;
                  "query": {&#13;
                      "presets": [&#13;
                          "react",&#13;
                          "es2015",&#13;
                      ],&#13;
                  },&#13;
              },&#13;
          ],&#13;
      },&#13;
  })&#13;
  &#13;
  // set up front-end assets&#13;
  &#13;
  mix.setPublicPath("public")&#13;
  &#13;
  mix.js("assets/js/app.jsx", "public/js/app.js")&#13;
  mix.sass("assets/scss/app.scss", "public/css/app.css")&#13;
  mix.version()&#13;
  </pre>
  <blockquote>
  <p>This is from <code>webpack.mix.js</code></p>
  </blockquote>
  <p>I needed to tell Mix what to do with <code>jsx</code> files, so I added the same kind of configuration one might normally put in <code>.babelrc</code>. I planned to have single JS and CSS entry-points into the application’s various bits and bobs.</p>
  <p><em>Note: Future versions of Mix will ship with built-in support for building ReactJS assets. When that happens, the <code>mix.webpackConfig</code> code can be removed.</em></p>
  <p>Once again I created a few shortcut scripts, to save on serious typing:</p>
  <pre class="javascript language-javascript">"scripts": {&#13;
      "dev": "$npm_package_config_webpack",&#13;
      "watch": "$npm_package_config_webpack -w",&#13;
      "prod": "$npm_package_config_webpack -p"&#13;
  },&#13;
  "config": {&#13;
      "webpack": "webpack --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"&#13;
  },&#13;
  </pre>
  <blockquote>
  <p>This is from <code>package.json</code></p>
  </blockquote>
  <p>All three scripts used the Webpack variable command, but they differed in what they did beyond that. <code>dev</code> built a debug version of the JS and CSS files. The <code>-w</code> switch started the Webpack watcher (so that bundles could be partially rebuilt). The <code>-p</code> switch enabled a lean production version of the bundles.</p>
  <p>Since I was using bundle versioning, I needed a way to reference files like <code>/js/app.60795d5b3951178abba1.js</code> without knowing the hash. I noticed Mix liked to create a manifest file, so I made a helper function to query it:</p>
  <pre class="php language-php">use Amp\Coroutine;&#13;
  &#13;
  function mix($path) {&#13;
      $generator = () =&gt; {&#13;
          $manifest = yield Amp\File\get(.."/public/mix-manifest.json");&#13;
          $manifest = json_decode($manifest, true);&#13;
  &#13;
          if (isset($manifest[$path])) {&#13;
              return $manifest[$path];&#13;
          }&#13;
  &#13;
          throw new Exception("{$path} not found");&#13;
      };&#13;
  &#13;
      return new Coroutine($generator());&#13;
  }&#13;
  </pre>
  <blockquote>
  <p>This is from <code>helpers.pre</code></p>
  </blockquote>
  <p>Aerys knew how to handle promises when they came in the form of <code>$val = yield $promise</code>, so I used Amp’s Promise implementation. When the file was read and decoded, I could look for the matching file path. I adjusted <code>HomeAction</code>:</p>
  <pre class="php language-php">public function __invoke(Request $request,&#13;
      Response $response)&#13;
  {&#13;
      $path = yield mix("/js/app.js");&#13;
  &#13;
      $response-&gt;end("&#13;
          &lt;div class='app'&gt;&lt;/div&gt;&#13;
          &lt;script src='{$path}'&gt;&lt;/script&gt;&#13;
      ");&#13;
  }&#13;
  </pre>
  <blockquote>
  <p>This is from <code>app/Actions/HomeAction.pre</code></p>
  </blockquote>
  <p>I realised I could keep creating functions that returned promises, and use them in this way to keep my code asynchronous. My JS code looked like this:</p>
  <pre class="javascript language-javascript">import React from "react"&#13;
  &#13;
  class Component extends React.Component&#13;
  {&#13;
      render() {&#13;
          return &lt;div&gt;hello world&lt;/div&gt;&#13;
      }&#13;
  }&#13;
  &#13;
  export default Component&#13;
  </pre>
  <blockquote>
  <p>This is from <code>assets/js/component.jsx</code></p>
  </blockquote>
  <p>… and:</p>
  <pre class="javascript language-javascript">import React from "react"&#13;
  import ReactDOM from "react-dom"&#13;
  import Component from "./component"&#13;
  &#13;
  ReactDOM.render(&#13;
      &lt;Component /&gt;,&#13;
      document.querySelector(".app")&#13;
  )&#13;
  </pre>
  <blockquote>
  <p>This is from <code>assets/js/app.jsx</code></p>
  </blockquote>
  <p>After all, I just wanted to see whether Mix would compile my <code>jsx</code> files, and if I could find them again using the async <code>mix</code> function. Turns out it worked!</p>
  <p><em>Note: Using the <code>mix</code> function every time is expensive, especially if we’re loading the same files. Instead, we could load all the templates in the server bootstrapping phase, and reference them from inside our actions when needed. The configuration file we start Aerys with can return a promise (like the kind <a href="http://amphp.org/docs/amp/managing-concurrency.html#all"><code>Amp\all</code></a> gives us), so we could resolve all the templates before the server starts up.</em></p>
  <div class="widget maestro maestro-content-type-html hide-for-tablet-SP hide-for-mobile-SP" id="maestro-636"><p>--ADVERTISEMENT--</p>
  </div><h2 id="connectingwithwebsockets">Connecting With Web Sockets</h2>
  <p>I was almost set up. The last thing to do was to connect the back-end and the front-end, via Web Sockets. I found this relatively straightforward, with a new class:</p>
  <pre class="php language-php">namespace App\Socket;&#13;
  &#13;
  use Aerys\Request;&#13;
  use Aerys\Response;&#13;
  use Aerys\Websocket;&#13;
  use Aerys\Websocket\Endpoint;&#13;
  use Aerys\Websocket\Message;&#13;
  &#13;
  class GameSocket implements Websocket&#13;
  {&#13;
      private $endpoint;&#13;
      private $connections = [];&#13;
  &#13;
      public function onStart(Endpoint $endpoint)&#13;
      {&#13;
          $this-&gt;endpoint = $endpoint;&#13;
      }&#13;
  &#13;
      public function onHandshake(Request $request,&#13;
          Response $response)&#13;
      {&#13;
          $origin = $request-&gt;getHeader("origin");&#13;
  &#13;
          if ($origin !== "http://127.0.0.1:8080") {&#13;
              $response-&gt;setStatus(403);&#13;
              $response-&gt;end("&lt;h1&gt;origin not allowed&lt;/h1&gt;");&#13;
              return null;&#13;
          }&#13;
  &#13;
          $info = $request-&gt;getConnectionInfo();&#13;
  &#13;
          return $info["client_addr"];&#13;
      }&#13;
  &#13;
      public function onOpen(int $clientId, $address)&#13;
      {&#13;
          $this-&gt;connections[$clientId] = $address;&#13;
      }&#13;
  &#13;
      public function onData(int $clientId,&#13;
          Message $message)&#13;
      {&#13;
          $body = yield $message;&#13;
  &#13;
          yield $this-&gt;endpoint-&gt;broadcast($body);&#13;
      }&#13;
  &#13;
      public function onClose(int $clientId,&#13;
          int $code, string $reason)&#13;
      {&#13;
          unset($this-&gt;connections[$clientId]);&#13;
      }&#13;
  &#13;
      public function onStop()&#13;
      {&#13;
          // nothing to see here...&#13;
      }&#13;
  }&#13;
  </pre>
  <blockquote>
  <p>This is from <code>app/Socket/GameSocket.pre</code></p>
  </blockquote>
  <p>…and a slight modification to the web routes:</p>
  <pre class="php language-php">use Aerys\Router;&#13;
  use App\Action\HomeAction;&#13;
  use App\Socket\GameSocket;&#13;
  &#13;
  return (Router $router) =&gt; {&#13;
      $router-&gt;route(&#13;
          "GET", "/", new HomeAction&#13;
      );&#13;
  &#13;
      $router-&gt;route(&#13;
          "GET", "/ws", Aerys\websocket(new GameSocket)&#13;
      );&#13;
  };&#13;
  </pre>
  <blockquote>
  <p>This is from <code>routes/web.pre</code></p>
  </blockquote>
  <p>Now, I could alter the JS to connect to this web socket, and send a message to everyone connected to it:</p>
  <pre class="javascript language-javascript">import React from "react"&#13;
  &#13;
  class Component extends React.Component&#13;
  {&#13;
      constructor()&#13;
      {&#13;
          super()&#13;
          this.onMessage = this.onMessage.bind(this)&#13;
      }&#13;
  &#13;
      componentWillMount()&#13;
      {&#13;
          this.socket = new WebSocket(&#13;
              "ws://127.0.0.1:8080/ws"&#13;
          )&#13;
  &#13;
          this.socket.addEventListener(&#13;
              "message", this.onMessage&#13;
          )&#13;
  &#13;
          // DEBUG&#13;
  &#13;
          this.socket.addEventListener("open", () =&gt; {&#13;
              this.socket.send("hello world")&#13;
          })&#13;
      }&#13;
  &#13;
      onMessage(e)&#13;
      {&#13;
          console.log("message: " + e.data)&#13;
      }&#13;
  &#13;
      componentWillUnmount()&#13;
      {&#13;
          this.socket.removeEventListener(this.onMessage)&#13;
          this.socket = null&#13;
      }&#13;
  &#13;
      render() {&#13;
          return &lt;div&gt;hello world&lt;/div&gt;&#13;
      }&#13;
  }&#13;
  &#13;
  export default Component&#13;
  </pre>
  <blockquote>
  <p>This is from <code>assets/js/component.jsx</code></p>
  </blockquote>
  <p>When I created a new <code>Component</code> object, it would connect to the web socket server, and add an event listener for new messages. I added a bit of debugging code – to make sure it was connecting properly, and sending new messages back.</p>
  <p>We’ll get to the nitty-gritty of <a href="https://www.sitepoint.com/building-live-score-widget-using-php-web-sockets/">PHP and web sockets</a> later, don’t worry.</p>
  <h2 id="summary">Summary</h2>
  <p>In this part, we looked at how to set up a simple async PHP web server, how to use Laravel Mix in a non-Laravel project, and even how to connect the back-end and front-end together with Web Sockets.</p>
  <p>Phew! That’s a lot of ground covered, and we haven’t written a single line of game code. Join me in part two, when we start to build game logic and a ReactJS interface.</p>


title: No title found
created_at: 2017-08-10 23:21:35
updated_at: 2017-08-10 23:21:35
mimetype: text/html
domain_name: www.linkedin.com
http_status: 999
url:
  https://www.linkedin.com/pulse/r%C3%A9flexions-sur-une-ann%C3%A9e-charni%C3%A8re-pour-blablacar-nicolas-brusson

content:
[cell repeats an earlier one in this file: 191 characters]


title: A Comprehensive Guide To HTTP/2 Server Push – Smashing Magazine
url: https://www.smashingmagazine.com/2017/04/guide-http2-server-push/
created_at: 2017-08-10 23:21:37
updated_at: 2017-08-10 23:21:37
mimetype: text/html
language: en-US
domain_name: www.smashingmagazine.com
http_status: 200
content:
  <ul class="pmd clearfix"><li class="a">By </li>
  				<li class="rd">April 10th, 2017</li>
  				
  		
  		</ul><p>The landscape for the performance-minded developer has changed significantly in the last year or so, with the emergence of HTTP/2 being perhaps the most significant of all. No longer is HTTP/2 a feature we pine for. It has arrived, and with it comes server push!</p>
  <p>Aside from solving common HTTP/1 performance problems (e.g., head of line blocking and uncompressed headers), HTTP/2 also gives us server push! Server push allows you to send site assets to the user before they’ve even asked for them. It’s an elegant way to achieve the performance benefits of HTTP/1 optimization practices such as inlining, but without the drawbacks that come with that practice.</p>
  <p>In this article, you’ll learn all about server push, from how it works to the problems it solves. You’ll also learn how to use it, how to tell if it’s working, and its impact on performance. Let’s begin!</p>
  <h4 id="further-reading-on-smashingmag">Further Reading on SmashingMag: <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#further-reading-on-smashingmag" class="sr hsl">Link</a></h4>
  <h3 id="what-is-server-push-exactly">What Is Server Push, Exactly? <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#what-is-server-push-exactly" class="sr hsl">Link</a></h3>
  <p>Accessing websites has always followed a request and response pattern. The user sends a request to a remote server, and with some delay, the server responds with the requested content.</p>
  <p>The initial request to a web server is commonly for an HTML document. In this scenario, the server replies with the requested HTML resource. The HTML is then parsed by the browser, where references to other assets are discovered, such as style sheets, scripts and images. Upon their discovery, the browser makes separate requests for those assets, which are then responded to in kind.</p>
  <a href="http://provide.smashingmagazine.com/normal-server-response.svg"><img title="Typical web server communication" src="https://www.smashingmagazine.com/wp-content/uploads/2017/04/normal-server-response.png" alt="Typical Web Server Communication." /></a><sup class="po" id="note-5"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#5">5</a></sup><br />Typical web server communication (<a href="http://provide.smashingmagazine.com/normal-server-response.svg">Large preview</a><sup class="po" id="note-6"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#6">6</a></sup>)<p>The problem with this mechanism is that it forces the user to wait for the browser to discover and retrieve critical assets until <em>after</em> an HTML document has been downloaded. This delays rendering and increases load times.</p>
  <p>With server push, we have a solution to this problem. Server push lets the server preemptively “push” website assets to the client without the user having explicitly asked for them. When used with care, we can send what we <em>know</em> the user is going to need for the page they’re requesting.</p>
  <p>Let’s say you have a website where all pages rely on styles defined in an external style sheet named <code>styles.css</code>. When the user requests <code>index.html</code> from the server, we can push <code>styles.css</code> to the user just after we begin sending the response for <code>index.html</code>.</p>
  <a href="http://provide.smashingmagazine.com/server-push-response.svg"><img title="Web server communication with HTTP/2 server push." src="https://www.smashingmagazine.com/wp-content/uploads/2017/04/server-push-response.png" alt="Web Server Communication with HTTP/2 server push." /></a><sup class="po" id="note-7"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#7">7</a></sup><br />Web server communication with HTTP/2 server push. (<a href="http://provide.smashingmagazine.com/server-push-response.svg">Large preview</a><sup class="po" id="note-8"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#8">8</a></sup>)<p>Rather than waiting for the server to send <code>index.html</code> and <em>then</em> waiting for the browser to request and receive <code>styles.css</code>, the user only has to wait for the server to respond with <em>both</em> <code>index.html</code> and <code>styles.css</code> on the initial request. This means that the browser can begin rendering the page faster than if it had to wait.</p>
  <p>As you can imagine, this can decrease the rendering time of a page. It also solves some other problems, particularly in front-end development workflows.</p>
  <h3 id="what-problems-does-server-push-solve">What Problems Does Server Push Solve? <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#what-problems-does-server-push-solve" class="sr hsl">Link</a></h3>
  <p>While reducing round trips to the server for critical content is one of the problems that server push solves, it’s not the only one. Server push acts as a suitable alternative for a number of HTTP/1-specific optimization anti-patterns, such as inlining CSS and JavaScript directly into HTML, as well as using the <a href="https://en.wikipedia.org/wiki/Data_URI_scheme">data URI scheme</a><sup class="po" id="note-9"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#9">9</a></sup> to embed binary data into CSS and HTML.</p>
  <p>These techniques found purchase in HTTP/1 optimization workflows because they decrease what we call the “perceived rendering time” of a page, meaning that while the overall loading time of a page might not be reduced, the page will appear to load faster for the user. It makes sense, after all. If you inline CSS into an HTML document within <code>&lt;style&gt;</code> tags, the browser can begin applying styles immediately to the HTML without waiting to fetch them from an external source. This concept holds true with inlining scripts and inlining binary data with the data URI scheme.</p>
  <a><img title="Web server communication with inlined content" src="https://www.smashingmagazine.com/wp-content/uploads/2017/04/inlined-content-unopt.png" alt="Web Server Communication with Inlined Content." /></a><br />Web server communication with inlined content (<a href="http://provide.smashingmagazine.com/inlined-content-unopt.svg">Large preview</a><sup class="po" id="note-10"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#10">10</a></sup>)<p>Seems like a good way to tackle the problem, right? Sure — for HTTP/1 workflows, where you have no other choice. The poison pill we swallow when we do this, however, is that the inlined content can’t be efficiently cached. When an asset like a style sheet or JavaScript file remains external and modular, it can be cached much more efficiently. When the user navigates to a subsequent page that requires that asset, it can be pulled from the cache, eliminating the need for additional requests to the server.</p>
  <a href="http://provide.smashingmagazine.com/caching-unopt.svg"><img src="https://www.smashingmagazine.com/wp-content/uploads/2017/04/caching-unopt.png" alt="Optimal caching behavior." /></a><sup class="po" id="note-11"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#11">11</a></sup><br />Optimal caching behavior. (<a href="http://provide.smashingmagazine.com/caching-unopt.svg">Large preview</a><sup class="po" id="note-12"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#12">12</a></sup>)<p>When we inline content, however, that content doesn’t have its own caching context. Its caching context is the same as the resource it’s inlined into. Take an HTML document with inlined CSS, for instance. If the caching policy of the HTML document is to always grab a fresh copy of the markup from the server, then the inlined CSS will <em>never</em> be cached on its own. Sure, the document that it’s a part of may be cached, but subsequent pages containing this duplicated CSS will be downloaded repeatedly. Even if the caching policy is more lax, HTML documents typically have limited shelf life. This is a trade-off that we’re willing to make in HTTP/1 optimization workflows, though. It does work, and it’s quite effective for first-time visitors. First impressions are often the most important.</p>
  <p>These are the problems that server push addresses. When you push assets, you get the practical benefits that come with inlining, but you also get to keep your assets in external files that retain their own caching policy. There is a caveat to this point, though, and it’s covered toward the end of this article. For now, let’s continue.</p>
  <p>I’ve talked enough about <em>why</em> you should consider using server push, as well as the problems that it fixes for both the user and the developer. Now let’s talk about <em>how</em> it’s used.</p>
  <h3 id="how-to-use-server-push">How To Use Server Push <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#how-to-use-server-push" class="sr hsl">Link</a></h3>
  <p>Using server push <em>usually</em> involves using the <code>Link</code> HTTP header, which takes on this format:</p>
  <pre class="language-markup">Link: &lt;/css/styles.css&gt;; rel=preload; as=style&#13;
  </pre>
  <p>Note that I said <em>usually</em>. What you see above is actually the <a href="https://w3c.github.io/preload"><code>preload</code> resource hint</a><sup class="po" id="note-13"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#13">13</a></sup> in action. This is a separate and distinct optimization from server push, but most (not all) HTTP/2 implementations will push an asset specified in a <code>Link</code> header containing a <code>preload</code> resource hint. If either the server or the client opts out of accepting the pushed resource, the client can still initiate an early fetch for the resource indicated.</p>
  <p>The <code>as=style</code> portion of the header is not optional. It informs the browser of the pushed asset’s content type. In this case, we use a value of <code>style</code> to indicate that the pushed asset is a style sheet. You can specify <a href="https://w3c.github.io/preload/#link-element-interface-extensions">other content types</a><sup class="po" id="note-14"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#14">14</a></sup>. It’s important to note that omitting the <code>as</code> value can result in the browser downloading the pushed resource <em>twice</em>. So don’t forget it!</p>
  <p>Now that you know how a push event is triggered, how do we set the <code>Link</code> header? You can do so through two routes:</p>
  <ul><li>your web server configuration (for example, Apache <code>httpd.conf</code> or <code>.htaccess</code>);</li>
  <li>a back-end language function (for example, PHP’s <code>header</code> function).</li>
  </ul><p>Here’s an example of configuring Apache (via <code>httpd.conf</code> or <code>.htaccess</code>) to push a style sheet whenever an HTML file is requested:</p>
  <pre class="language-markup">&lt;FilesMatch "\.html$"&gt;&#13;
      Header set Link "&lt;/css/styles.css&gt;; rel=preload; as=style"&#13;
  &lt;FilesMatch&gt;&#13;
  </pre>
  <p>Here, we use the <code>FilesMatch</code> directive to match requests for files ending in <code>.html</code>. When a request comes along that matches this criteria, we add a <code>Link</code> header to the response that tells the server to push the resource at <code>/css/styles.css</code>.</p>
  <p><em>Side note:</em> Apache’s HTTP/2 module can also initiate a push of resources using the <code>H2PushResource</code> directive. <a>The documentation for this directive</a> states that this method can initiate pushes earlier than if the <code>Link</code> header method is used. Depending on your specific setup, you may not have access to this feature. The performance tests shown later in this article use the <code>Link</code> header method.</p>
  <p>As of now, Nginx doesn’t support HTTP/2 server push, and nothing so far in the <a href="https://nginx.org/en/CHANGES">software’s changelog</a><sup class="po" id="note-15"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#15">15</a></sup> has indicated that support for it has been added. This may change as Nginx’s HTTP/2 implementation matures.</p>
  <p>Another way to set a <code>Link</code> header is through a server-side language. This is useful when you aren’t able to change or override the web server’s configuration. Here’s an example of how to use PHP’s <code>header</code> function to set the <code>Link</code> header:</p>
  <p><code class="language php">header("Link: &lt;/css/styles.css&gt;; rel=preload; as=style");</code></p>
  <p>If your application resides in a shared hosting environment where modifying the server’s configuration isn’t an option, then this method might be all you’ve got to go on. You should be able to set this header in any server-side language. Just be sure to do so before you begin sending the response body, to avoid potential runtime errors.</p>
  <h4 id="pushing-multiple-assets">Pushing Multiple Assets <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#pushing-multiple-assets" class="sr hsl">Link</a></h4>
  <p>All of our examples so far only illustrate how to push one asset. What if you want to push more than one? Doing that would make sense, right? After all, the web is made up of more than just style sheets. Here’s how to push multiple assets:</p>
  <pre class="language-markup">Link: &lt;/css/styles.css&gt;; rel=preload; as=style, &lt;/js/scripts.js&gt;; rel=preload; as=script, &lt;/img/logo.png&gt;; rel=preload; as=image&#13;
  </pre>
  <p>When you want to push multiple resources, just separate each push directive with a comma. Because resource hints are added via the <code>Link</code> tag, this syntax is how you can mix in other resource hints with your push directives. Here’s an example of mixing a push directive with a <code>preconnect</code> resource hint:</p>
  <pre class="language-markup">Link: &lt;/css/styles.css&gt;; rel=preload; as=style, &lt;https://fonts.gstatic.com&gt;; rel=preconnect&#13;
  </pre>
  <p>Multiple <code>Link</code> headers are also valid. Here’s how you can configure Apache to set multiple <code>Link</code> headers for requests to HTML documents:</p>
  <pre class="language-markup">&lt;FilesMatch "\.html$"&gt;&#13;
      Header add Link "&lt;/css/styles.css&gt;; rel=preload; as=style"&#13;
      Header add Link "&lt;/js/scripts.js&gt;; rel=preload; as=script"&#13;
  &lt;/FilesMatch&gt;&#13;
  </pre>
  <p>This syntax is more convenient than stringing together a bunch of comma-separated values, and it works just the same. The only downside is that it’s not quite as compact, but the convenience is worth the few extra bytes sent over the wire.</p>
  <p>Now that you know how to push assets, let’s see how to tell whether it’s working.</p>
  <h3 id="how-to-tell-whether-server-push-is-working">How To Tell Whether Server Push Is Working <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#how-to-tell-whether-server-push-is-working" class="sr hsl">Link</a></h3>
  <p>So, you’ve added the <code>Link</code> header to tell the server to push some stuff. The question that remains is, how do you know if it’s even working?</p>
  <p>This varies by browser. Recent versions of Chrome will reveal a pushed asset in the initiator column of the network utility in the developer tools.</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/chrome-push-indicator-large-opt.png"><img title="Chrome indicating that an asset has been pushed by the server" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/chrome-push-indicator-800w-opt.png" alt="Chrome indicating that an asset has been pushed by the server" width="800" height="59" /></a><sup class="po" id="note-16"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#16">16</a></sup><br />Chrome indicating that an asset has been pushed by the server (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/chrome-push-indicator-large-opt.png">Large preview</a><sup class="po" id="note-17"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#17">17</a></sup>)<p>Furthermore, if we hover over the asset in the network request waterfall, we’ll get detailed timing information on the asset’s push:</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/push-timing-large-opt.png"><img title="Chrome showing detailed timing information of the pushed asset" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/push-timing-800w-opt.png" alt="Chrome showing detailed timing information of the pushed asset" width="800" height="409" /></a><sup class="po" id="note-18"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#18">18</a></sup><br />Chrome showing detailed timing information of the pushed asset (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/push-timing-large-opt.png">Large preview</a><sup class="po" id="note-19"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#19">19</a></sup>)<p>Firefox is less obvious in identifying pushed assets. If an asset has been pushed, its status in the browser’s network utility in the developer tools will show up with a gray dot.</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/firefox-push-indicator-large-opt.png"><img title="Firefox indicating that an asset has been pushed by the server" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/firefox-push-indicator-800w-opt.png" alt="Firefox indicating that an asset has been pushed by the server" width="800" height="41" /></a><sup class="po" id="note-20"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#20">20</a></sup><br />Firefox indicating that an asset has been pushed by the server (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/firefox-push-indicator-800w-opt.png">Large preview</a><sup class="po" id="note-21"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#21">21</a></sup>)<p>If you’re looking for a definitive way to tell whether an asset has been pushed by the server, you can use the <a href="https://nghttp2.org"><code>nghttp</code> command-line client</a><sup class="po" id="note-22"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#22">22</a></sup> to examine a response from an HTTP/2 server, like so:</p>
  <p><code>nghttp -ans https://jeremywagner.me</code></p>
  <p>This command will show a summary of the assets involved in the transaction. Pushed assets will have an asterisk next to them in the program output, like so:</p>
  <pre class="language-markup">id  responseEnd requestStart  process code size request path&#13;
   13     +50.28ms      +1.07ms  49.21ms  200   3K /&#13;
    2     +50.47ms *   +42.10ms   8.37ms  200   2K /css/global.css&#13;
    4     +50.56ms *   +42.15ms   8.41ms  200  157 /css/fonts-loaded.css&#13;
    6     +50.59ms *   +42.16ms   8.43ms  200  279 /js/ga.js&#13;
    8     +50.62ms *   +42.17ms   8.44ms  200  243 /js/load-fonts.js&#13;
   10     +74.29ms *   +42.18ms  32.11ms  200   5K /img/global/jeremy.png&#13;
   17     +87.17ms     +50.65ms  36.51ms  200  668 /js/lazyload.js&#13;
   15     +87.21ms     +50.65ms  36.56ms  200   2K /img/global/book-1x.png&#13;
   19     +87.23ms     +50.65ms  36.58ms  200  138 /js/debounce.js&#13;
   21     +87.25ms     +50.65ms  36.60ms  200  240 /js/nav.js&#13;
   23     +87.27ms     +50.65ms  36.62ms  200  302 /js/attach-nav.js&#13;
  </pre>
  <p>Here, I’ve used <code>nghttp</code> on <a href="https://jeremywagner.me">my own website</a><sup class="po" id="note-23"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#23">23</a></sup>, which (at least at the time of writing) pushes five assets. The pushed assets are marked with an asterisk on the left side of the <code>requestStart</code> column.</p>
  <p>Now that we can identify when assets are pushed, let’s see how server push actually affects the performance of a real website.</p>
  <h3 id="measuring-server-push-performance">Measuring Server Push Performance <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#measuring-server-push-performance" class="sr hsl">Link</a></h3>
  <p>Measuring the effect of any performance enhancement requires a good testing tool. <a href="https://www.sitespeed.io">Sitespeed.io</a><sup class="po" id="note-24"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#24">24</a></sup> is an excellent tool available via <a href="https://www.npmjs.com">npm</a><sup class="po" id="note-25"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#25">25</a></sup>; it automates page testing and gathers valuable performance metrics. With the appropriate tool chosen, let’s quickly go over the testing methodology.</p>
  <h4 id="testing-methodology">Testing Methodology <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#testing-methodology" class="sr hsl">Link</a></h4>
  <p>I wanted measure the impact of server push on website performance in a meaningful way. In order for the results to be meaningful, I needed to establish points of comparison across six separate scenarios. These scenarios are split across two facets: whether HTTP/2 or HTTP/1 is used. On HTTP/2 servers, we want to measure the effect of server push on a number of metrics. On HTTP/1 servers, we want to see how asset inlining affects performance in the same metrics, because inlining is supposed to be roughly analogous to the benefits that server push provides. Specifically, these scenarios are the following:</p>
  <ul><li><strong>HTTP/2 without server push</strong><br />In this state, the website runs on the HTTP/2 protocol, but nothing whatsoever is pushed. The website runs “stock,” so to speak.</li>
  <li><strong>HTTP/2 pushing only CSS</strong><br />Server push is used, but only for the website’s CSS. The CSS for the website is quite small, weighing in at a little over 2 KB with <a href="https://www.smashingmagazine.com/2016/10/next-generation-server-compression-with-brotli">Brotli compression</a><sup class="po" id="note-26"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#26">26</a></sup> applied.</li>
  <li><strong>Pushing the kitchen sink</strong><br />All assets in use on all pages across the website are pushed. This includes the CSS, as well as 1.4 KB of JavaScript spread across six assets, and 5.9 KB of SVG images spread across five assets. All quoted file sizes are, again, after Brotli compression has been applied.</li>
  <li><strong>HTTP/1 with no assets inlined</strong><br />The website runs on HTTP/1, and no assets are inlined to reduce the number of requests or increase rendering speed.</li>
  <li><strong>Inlining only CSS</strong><br />Only the website’s CSS is inlined.</li>
  <li><strong>Inlining the kitchen sink</strong><br />All assets in use on all pages across the website are inlined. CSS and scripts are inlined, but SVG images are base64-encoded and embedded directly into the markup. It should be noted that base64-encoded data is roughly <a href="https://en.wikipedia.org/wiki/Base64#MIME">1.37 times larger</a><sup class="po" id="note-27"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#27">27</a></sup> than its unencoded equivalent.</li>
  </ul><p>In each scenario, I initiated testing with the following command:</p>
  <p><code>sitespeed.io -d 1 -m 1 -n 25 -c cable -b chrome -v https://jeremywagner.me</code></p>
  <p>If you want to know the ins and outs of what this command does, you can <a href="https://www.sitespeed.io/documentation/sitespeed.io/configuration">check out the documentation</a><sup class="po" id="note-28"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#28">28</a></sup>. The short of it is that this command tests my website’s home page at <a href="https://jeremywagner.me">https://jeremywagner.me</a><sup class="po" id="note-29"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#29">29</a></sup> with the following conditions:</p>
  <ul><li>The links in the page are not crawled. Only the specified page is tested.</li>
  <li>The page is tested 25 times.</li>
  <li>A “cable-like” network throttling profile is used. This translates to a round trip time of 28 milliseconds, a downstream speed of 5,000 kilobits per second and an upstream speed of 1,000 kilobits per second.</li>
  <li>The test is run using Google Chrome.</li>
  </ul><p>Three metrics were collected and graphed from each test:</p>
  <ul><li><strong>first paint time</strong><br />This is the point in time at which the page can first be seen in the browser. When we strive to make a page “feel” as though it is loading quickly, this is the metric we want to reduce as much as possible.</li>
  <li><strong>DOMContentLoaded time</strong><br />This is the time at which the HTML document has completely loaded and has been parsed. Synchronous JavaScript code will block the parser and cause this figure to increase. Using the <code>async</code> attribute on <code>&lt;script&gt;</code> tags can help to prevent parser blocking.</li>
  <li><strong>page-loading time</strong><br />This is the time it takes for the page and its assets to fully load.</li>
  </ul><p>With the parameters of the test determined, let’s see the results!</p>
  <h4 id="test-outcomes">Test Outcomes <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#test-outcomes" class="sr hsl">Link</a></h4>
  <p>Tests were run across the six scenarios specified earlier, with the results graphed. Let’s start by looking at how first paint time is affected in each scenario:</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-first-paint-800w-opt.png"><img title="First paint time" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-first-paint-800w-opt.png" alt="First paint time" width="800" height="480" /></a><sup class="po" id="note-30"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#30">30</a></sup><br />First paint time (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-first-paint-800w-opt.png">Large preview</a><sup class="po" id="note-31"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#31">31</a></sup>)<p>Let’s first talk a bit about how the graph is set up. The portion of the graph in blue represents the average first paint time. The orange portion is the 90th percentile. The grey portion represents the maximum first paint time.</p>
  <p>Now let’s talk about what we see. The slowest scenarios are both the HTTP/2- and HTTP/1-driven websites with no enhancements at all. We do see that using server push for CSS helps to render the page about 8% faster on average than if server push is not used at all, and even about 5% faster than inlining CSS on an HTTP/1 server.</p>
  <p>When we push all assets that we possibly can, however, the picture changes somewhat. First paint times increase slightly. In HTTP/1 workflows where we inline everything we possibly can, we achieve performance similar to when we push assets, albeit slightly less so.</p>
  <p>The verdict here is clear: With server push, we can achieve results that are slightly better than what we can achieve on HTTP/1 with inlining. When we push or inline many assets, however, we observe diminishing returns.</p>
  <p>It’s worth noting that either using server push or inlining is better than no enhancement at all for first-time visitors. It’s also worth noting that these tests and experiments are being run on a website with small assets, so this test case may not reflect what’s achievable for your website.</p>
  <p>Let’s examine the performance impacts of each scenario on DOMContentLoaded time:</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-domcontentloaded-large-opt.png"><img title="DOMContentLoaded time" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-domcontentloaded-800w-opt.png" alt="DOMContentLoaded time" width="800" height="480" /></a><sup class="po" id="note-32"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#32">32</a></sup><br />DOMContentLoaded time (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-domcontentloaded-large-opt.png">Large preview</a><sup class="po" id="note-33"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#33">33</a></sup>)<p>The trends here aren’t much different than what we saw in the previous graph, except for one notable departure: The instance in which we inline as many assets as practical on a HTTP/1 connection yields a very low DOMContentLoaded time. This is presumably because inlining reduces the number of assets needed to be downloaded, which allows the parser to go about its business without interruption.</p>
  <p>Now, let’s look at how page-loading times are affected in each scenario:</p>
  <a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-page-load-large-opt.png"><img title="Page-loading time" src="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-page-load-800w-opt.png" alt="Page-loading time" width="800" height="478" /></a><sup class="po" id="note-34"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#34">34</a></sup><br />Page-loading time (<a href="https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-page-load-800w-opt.png">Large preview</a><sup class="po" id="note-35"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#35">35</a></sup>)<p>The established trends from earlier measurements generally persist here as well. I found that pushing only the CSS realized the greatest benefit to loading time. Pushing too many assets could, on some occasions, make the web server a bit sluggish, but it was still better than not pushing anything at all. Compared to inlining, server push yielded better overall loading times than inlining did.</p>
  <p>Before we conclude this article, let’s talk about a few caveats you should be aware of when it comes to server push.</p>
  <h3 id="caveats-on-using-server-push">Caveats On Using Server Push <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#caveats-on-using-server-push" class="sr hsl">Link</a></h3>
  <p>Server push isn’t a panacea for your website’s performance maladies. It has a few drawbacks that you need to be cognizant of.</p>
  <h4 id="you-can-push-too-much-stuff">You Can Push Too Much Stuff <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#you-can-push-too-much-stuff" class="sr hsl">Link</a></h4>
  <p>In one of the scenarios above, I am pushing a lot of assets, but all of them altogether represent a small portion of the overall data. Pushing a lot of very large assets at once could actually delay your page from painting or being interactive sooner, because the browser needs to download not only the HTML, but all of the other assets that are being pushed alongside of it. Your best bet is to be selective in what you push. Style sheets are a good place to start (so long as they aren’t massive). Then evaluate what else makes sense to push.</p>
  <h4 id="you-can-push-something-thats-not-on-the-page">You Can Push Something That’s Not on the Page <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#you-can-push-something-thats-not-on-the-page" class="sr hsl">Link</a></h4>
  <p>This is not necessarily a bad thing if you have visitor analytics to back up this strategy. A good example of this may be a multi-page registration form, where you push assets for the next page in the sign-up process. Let’s be crystal clear, though: If you don’t know whether you should force the user to preemptively load assets for a page they haven’t seen yet, then <strong>don’t do it</strong>. Some users might be on restricted data plans, and you could be costing them real money.</p>
  <h4 id="configure-your-http2-server-properly">Configure Your HTTP/2 Server Properly <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#configure-your-http2-server-properly" class="sr hsl">Link</a></h4>
  <p>Some servers give you a lot of server push-related configuration options. Apache’s <code>mod_http2</code> has some options for configuring how assets are pushed. <a href="https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2pushpriority">The <code>H2PushPriority</code> setting</a><sup class="po" id="note-36"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#36">36</a></sup> should be of particular interest, although in the case of my server, I left it at the default setting. Some experimentation could yield additional performance benefits. Every web server has a whole different set of switches and dials for you to experiment with, so read the manual for yours and find out what’s available!</p>
  <h4 id="pushes-may-not-be-cached">Pushes May Not Be Cached <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#pushes-may-not-be-cached" class="sr hsl">Link</a></h4>
  <p>There has been some gnashing of teeth over whether server push could hurt performance in that returning visitors may have assets needlessly pushed to them again. Some servers do their best to mitigate this. Apache’s <code>mod_http2</code> uses the <a href="https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2pushdiarysize"><code>H2PushDiarySize</code> setting</a><sup class="po" id="note-37"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#37">37</a></sup> to optimize this somewhat. H2O Server has a feature called <a href="https://h2o.examp1e.net/configure/http2_directives.html">Cache Aware server push</a><sup class="po" id="note-38"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#38">38</a></sup> that uses a cookie mechanism to remember pushed assets.</p>
  <p>If you don’t use H2O Server, you can achieve the same thing on your web server or in server-side code by only pushing assets in the absence of a cookie. If you’re interested in learning how to do this, then check out a <a href="https://css-tricks.com/cache-aware-server-push">post I wrote about it on CSS-Tricks</a><sup class="po" id="note-39"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#39">39</a></sup>. It’s also worth mentioning that browsers can send an <code>RST_STREAM</code> frame to signal to a server that a pushed asset is not needed. As time goes on, this scenario will be handled much more gracefully.</p>
  <p>As sad it may seem, we’re nearing the end of our time together. Let’s wrap things up and talk a bit about what we’ve learned.</p>
  <h3 id="final-thoughts">Final Thoughts <a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#final-thoughts" class="sr hsl">Link</a></h3>
  <p>If you’ve already migrated your website to HTTP/2, you have little reason <em>not</em> to use server push. If you have a highly complex website with many assets, start small. A good rule of thumb is to consider pushing anything that you were once comfortable inlining. A good starting point is to push your site’s CSS. If you’re feeling more adventurous after that, <em>then</em> consider pushing other stuff. Always test changes to see how they affect performance. You’ll likely realize some benefit from this feature if you tinker with it enough.</p>
  <p>If you’re not using a cache-aware server push mechanism like H2O Server’s, consider tracking your users with a cookie and only pushing assets to them in the absence of that cookie. This will minimize unnecessary pushes to known users, while improving performance for unknown users. This not only is good for performance, but also shows respect to your users with restricted data plans.</p>
  <p>All that’s left for you now is to try out server push for yourself. So get out there and see what this feature can do for you and your users! If you want to know more about server push, check out the following resources:</p>
  <ul><li>“<a href="https://tools.ietf.org/html/rfc7540#section-8.2">Server Push</a><sup class="po" id="note-40"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#40">40</a></sup>,” “Hypertext Transfer Protocol Version 2 (HTTP/2),” Internet Engineering Task Force</li>
  <li>“<a href="https://www.filamentgroup.com/lab/modernizing-delivery.html">Modernizing Our Progressive Enhancement Delivery</a><sup class="po" id="note-41"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#41">41</a></sup>,” Scott Jehl, Filament Group</li>
  <li>“<a href="https://www.igvita.com/2013/06/12/innovating-with-http-2.0-server-push/">Innovating with HTTP 2.0 Server Push</a><sup class="po" id="note-42"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#42">42</a></sup>,” Ilya Grigorik</li>
  </ul><p><em>Thanks to <a href="https://blog.yoav.ws.">Yoav Weiss</a><sup class="po" id="note-43"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#43">43</a></sup> for clarifying that the <code>as</code> attribute is required (and not optional as the original article stated), as well as a couple of other minor technical issues. Additional thanks goes to <a href="https://jakearchibald.com">Jake Archibald</a><sup class="po" id="note-44"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#44">44</a></sup> for pointing out that the <code>preload</code> resource hint is an optimization distinct from server push.</em></p>
  <p><em>This article is about an HTTP/2 feature named server push. This and many other topics are covered in Jeremy’s book <a href="https://manning.com/books/web-performance-in-action?a_aid=webopt&amp;a_bid=63c31090"><em>Web Performance in Action</em></a><sup class="po" id="note-45"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#45">45</a></sup>. You can get it or any other <a href="https://manning.com">Manning Publications</a><sup class="po" id="note-46"><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#46">46</a></sup> book for 42% off with the coupon code <code>sswagner</code>!</em></p>
  <p><em>(rb, vf, al, il)</em></p>
  <ol class="po"><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-1">1 https://www.smashingmagazine.com/2016/02/breaking-it-down-to-the-bits-how-the-internet-dns-and-https-work/</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-2">2 https://www.smashingmagazine.com/2017/04/secure-web-app-http-headers/</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-3">3 https://www.smashingmagazine.com/2016/10/next-generation-server-compression-with-brotli/</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-4">4 https://www.smashingmagazine.com/2016/05/modern-wordpress-server-stack/</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-5">5 http://provide.smashingmagazine.com/normal-server-response.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-6">6 http://provide.smashingmagazine.com/normal-server-response.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-7">7 http://provide.smashingmagazine.com/server-push-response.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-8">8 http://provide.smashingmagazine.com/server-push-response.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-9">9 https://en.wikipedia.org/wiki/Data_URI_scheme</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-10">10 http://provide.smashingmagazine.com/inlined-content-unopt.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-11">11 http://provide.smashingmagazine.com/caching-unopt.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-12">12 http://provide.smashingmagazine.com/caching-unopt.svg</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-13">13 https://w3c.github.io/preload</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-14">14 https://w3c.github.io/preload/#link-element-interface-extensions</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-15">15 https://nginx.org/en/CHANGES</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-16">16 https://www.smashingmagazine.com/wp-content/uploads/2017/02/chrome-push-indicator-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-17">17 https://www.smashingmagazine.com/wp-content/uploads/2017/02/chrome-push-indicator-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-18">18 https://www.smashingmagazine.com/wp-content/uploads/2017/02/push-timing-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-19">19 https://www.smashingmagazine.com/wp-content/uploads/2017/02/push-timing-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-20">20 https://www.smashingmagazine.com/wp-content/uploads/2017/02/firefox-push-indicator-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-21">21 https://www.smashingmagazine.com/wp-content/uploads/2017/02/firefox-push-indicator-800w-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-22">22 https://nghttp2.org</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-23">23 https://jeremywagner.me</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-24">24 https://www.sitespeed.io</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-25">25 https://www.npmjs.com</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-26">26 https://www.smashingmagazine.com/2016/10/next-generation-server-compression-with-brotli</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-27">27 https://en.wikipedia.org/wiki/Base64#MIME</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-28">28 https://www.sitespeed.io/documentation/sitespeed.io/configuration</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-29">29 https://jeremywagner.me</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-30">30 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-first-paint-800w-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-31">31 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-first-paint-800w-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-32">32 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-domcontentloaded-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-33">33 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-domcontentloaded-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-34">34 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-page-load-large-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-35">35 https://www.smashingmagazine.com/wp-content/uploads/2017/02/graph-page-load-800w-opt.png</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-36">36 https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2pushpriority</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-37">37 https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2pushdiarysize</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-38">38 https://h2o.examp1e.net/configure/http2_directives.html</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-39">39 https://css-tricks.com/cache-aware-server-push</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-40">40 https://tools.ietf.org/html/rfc7540#section-8.2</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-41">41 https://www.filamentgroup.com/lab/modernizing-delivery.html</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-42">42 https://www.igvita.com/2013/06/12/innovating-with-http-2.0-server-push/</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-43">43 https://blog.yoav.ws.</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-44">44 https://jakearchibald.com</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-45">45 https://manning.com/books/web-performance-in-action?a_aid=webopt&amp;a_bid=63c31090</a></li><li><a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#note-46">46 https://manning.com</a></li></ol><p><a href="https://www.smashingmagazine.com/tag/css/">CSS</a><a href="https://www.smashingmagazine.com/tag/https/">HTTPS</a><a href="https://www.smashingmagazine.com/tag/javascript/">JavaScript</a></p>
  <p>
  	<a href="https://www.smashingmagazine.com/2017/04/guide-http2-server-push/#top" class="top">↑ Back to top</a>
  	<a class="sot single" href="https://twitter.com/intent/tweet?original_referer=https://www.smashingmagazine.com/2017/04/guide-http2-server-push/&amp;source=tweetbutton&amp;text=A%20Comprehensive%20Guide%20To%20HTTP%2F2%20Server%20Push&amp;url=https://www.smashingmagazine.com/2017/04/guide-http2-server-push/&amp;via=smashingmag">Tweet it</a><a class="sot single" href="http://www.facebook.com/sharer/sharer.php?u=https://www.smashingmagazine.com/2017/04/guide-http2-server-push/">Share on Facebook</a></p>


title: Projet scolaire : Développer une application mobile en deux mois.
created_at: 2017-08-10 23:21:40
updated_at: 2017-08-10 23:21:40
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/1*2GV7CLFI5rql0mJrzxB9Bw.gif
http_status: 200
url:
  https://medium.com/@ThomasAlbrt/projet-scolaire-développer-une-application-mobile-en-deux-mois-cf5792899bbc

content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Projet scolaire : Développer une application mobile en deux mois.</h1><p class="graf graf--p graf-after--h3">Je n’ai pas l’intention de donner ici une recette pour garantir la réussite de la conduite de projets. D’abord parce que je ne prétends pas détenir d’expertise en la matière et ensuite parce que ce n’est pas ce que j’ai envie de raconter. J’aimerais simplement retracer le déroulement d’un exercice pas comme les autres et au cours duquel j’ai pris beaucoup de plaisir ;)</p><p class="graf graf--p graf-after--p">Il s’agissait ici, pour plusieurs groupes de l’IAE Caen, de développer une application mobile en coopération avec des étudiants de Licence Informatique. Ce qui ressemblait à un simple projet technique s’est révélé être une véritable simulation de startup.</p><p id="a184" class="graf graf--p graf-after--p">Les projets étaient le fruit de propositions des étudiants. Et s’il y a bien une chose que j’ai apprise en m’intéressant à l’écosystème des startups, c’est qu’un business n’est pas créé sur la base d’une idée mais sur celle d’un problème. Or ça tombe bien, un étudiant a plein de problèmes.</p><p class="graf graf--p graf-after--p">Dans mon cas, le problème s’est révélé après avoir décroché un job d’été chez Decathlon. Les locaux sont loin de chez moi, je n’ai pas de voiture et les transports en commun sont à peu près aussi efficaces qu’une dinde essayant de résoudre une équation à deux inconnues, bref … je vais en chier pour rejoindre leurs locaux !</p><p class="graf graf--p graf-after--p">Et si on développait une application permettant aux salariés d’une même entreprise de covoiturer ensemble ? Let’s do this !</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*2GV7CLFI5rql0mJrzxB9Bw.gif" alt="image" /></div><h4 id="ca65" class="graf graf--h4 graf-after--figure"><strong class="markup--strong markup--h4-strong">Le lean startup :</strong></h4><p class="graf graf--p graf-after--h4">L’objectif est simple, développer un <strong class="markup--strong markup--p-strong">MVP</strong> (minimum viable product) en moins de deux mois et le mettre le plus vite possible entre les mains de ses clients / utilisateurs afin de tester et valider un certain nombre d’hypothèses.</p><p class="graf graf--p graf-after--p">Le tout figure ainsi un <strong class="markup--strong markup--p-strong">cycle itératif</strong> favorisant la satisfaction des clients et la réactivité de l’équipe chargée de développer le produit dans le but d’atteindre un product market fit. Plus grossièrement, on n’attend pas d’avoir un produit parfait. On lance au contraire quelque chose d’assez simple que l’on fera évoluer au fur et à mesure que l’on récolte du feedback.</p><p id="b0fd" class="graf graf--p graf-after--p">Si nécessaire, le retour d’informations de la part des clients doit amener la startup à pivoter, à réévaluer sa proposition de valeur dans le cas où elle réaliserait que son produit ne répond à aucun besoin.</p><p class="graf graf--p graf-after--p">Le premier outil issu du lean startup est le <strong class="markup--strong markup--p-strong">business model canvas</strong>. Il s’agit d’une matrice composée de neufs cases permettant une représentation visuelle de la manière dont l’entreprise entend créer et capter de la valeur (proposition de valeur, clients, coûts, revenus …).</p><p class="graf graf--p graf-after--p">Chacun des membres de l’équipe participe dans l’élaboration du business model en dessinant / collant des post-it dans les cases. Une vision globale se dégage alors de l’implication de chacun et l’équipe s’anime autour de cette vision.</p><h4 id="ee6a" class="graf graf--h4 graf--startsWithDoubleQuote graf-after--p"><strong class="markup--strong markup--h4-strong">“Fake it ’til you make it” :</strong></h4><p id="d05a" class="graf graf--p graf-after--h4">En attendant que notre MVP soit au point, nous voulions rencontrer nos clients le plus vite possible afin de les convaincre de l’intérêt de notre solution. Et dans ce cas, la meilleure façon de convaincre c’est de mettre directement entre les mains des gens un produit fini … ou en tout cas leur en donner l’illusion.</p><p class="graf graf--p graf-after--p">Or il existe aujourd’hui un certain nombre de solutions qui ne requièrent pas de connaissances en code et permettent de simuler l’existence du produit quand il s’agit en réalité de simples visuels interactifs, on parle de <strong class="markup--strong markup--p-strong">mockups</strong>.</p><p class="graf graf--p graf-after--p">Dans un premier temps, toute l’équipe s’est mise d’accord sur les principales features que nous voulions dans notre appli. Puis nous avons dressé grossièrement un schéma de notre interface utilisateur sur une maquette papier (<strong class="markup--strong markup--p-strong">wireframe</strong>).</p><p class="graf graf--p graf-after--p">Il existe ensuite un grand nombre de logiciels permettant de pousser la maquette plus loin au point de la faire ressembler à un produit fini et déployable.</p><p id="b6b7" class="graf graf--p graf-after--p">J’ai personnellement utilisé <strong class="markup--strong markup--p-strong">Sketch</strong>, un logiciel de design d’interface mobile sur Mac, une véritable tuerie. Je recommande vivement leur site (<a href="https://www.sketchappsources.com" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">https://www.sketchappsources.com</a>), une collection d’éléments d’UI, d’icônes etc. pour vous aider à prototyper le plus rapidement possible.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*y734_q4OcFkNgWn5gCt5Yw.png" alt="image" /></div>Ce qu’il est possible de faire avec Sketch<p class="graf graf--p graf-after--figure">Reste à insuffler un peu d’âme dans tout ça en y mettant des animations. Un peu comme si l’application fonctionnait pour de vrai … sauf que non.</p><p id="bfda" class="graf graf--p graf-after--p">C’est là qu’il est temps de switcher sur un outil à partir duquel vous allez importer vos mockups statiques pour les mettre en lien les uns avec les autres pour simuler une interface utilisateur. Pour ça, vous n’aurez que l’embarras du choix car il existe un paquet d’alternatives (<strong class="markup--strong markup--p-strong">Invision</strong>, <strong class="markup--strong markup--p-strong">Marvel</strong>, <strong class="markup--strong markup--p-strong">Proto.io</strong> …).</p><p id="d0d1" class="graf graf--p graf-after--p">Et puisque mon pote Confucius dirait : “une image vaut mille mots”, vous pouvez vous rendre ici pour mieux comprendre : <a href="https://invis.io/YBAF2OTA2" class="markup--anchor markup--p-anchor" rel="nofollow noopener nofollow noopener" target="_blank">https://invis.io/YBAF2OTA2</a></p><h4 class="graf graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">La landing page :</strong></h4><p class="graf graf--p graf-after--h4">Nous nous sommes ensuite lancés sur la création d’une landing page afin de récupérer des mails et générer des leads. Pour faire court, une landing page est une page web qui se diffère d’une home page en ce qu’elle sert à convaincre une cible précise, démarchée dans le cadre d’une campagne ciblée.</p><p class="graf graf--p graf-after--p">Une landing page doit aller à l’essentiel et sa composition s’en ressent. On y trouve la proposition de valeur qui doit tenir en une phrase, un discours ou plusieurs points pour étayer la proposition de valeur (optionnel) et un call to action. Ce dernier prend généralement la forme d’un bouton et est destiné à inciter l’utilisateur à effectuer une action comme s’inscrire à une newsletter, entrer ses coordonnées, télécharger une appli …</p><p class="graf graf--p graf-after--p">Tout doit mener à ce call to action, l’objectif d’une landing page est de convertir, c’est tout.</p><p class="graf graf--p graf-after--p">Il existe là aussi plusieurs outils pour réaliser une landing page, dont la plupart ne nécessitent pas de savoir coder (<strong class="markup--strong markup--p-strong">Strikingly</strong>, <strong class="markup--strong markup--p-strong">Squarespace</strong> …)</p><p id="afe4" class="graf graf--p graf-after--p">Vous trouverez notre landing page ici ;) : <a href="http://coboite.fr" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">http://coboite.fr</a></p><h4 id="a325" class="graf graf--h4 graf-after--p"><strong class="markup--strong markup--h4-strong">Résultat :</strong></h4><p class="graf graf--p graf-after--h4">En deux mois nous avons convaincu 3 entreprises pour faire tourner une bêta chez eux. Au total, elles rassemblent plus de <strong class="markup--strong markup--p-strong">900 salariés </strong>qui sont autant d’utilisateurs potentiels. Fun fact : l’un des directeurs d’une de ces entreprises a été tellement emballé qu’il veut s’associer avec nous !</p><p class="graf graf--p graf-after--p">L’exercice s’est clos par un pitch devant un jury composé, de représentants d’incubateurs, chefs d’entreprise, investisseurs puis une simulation d’un salon de crowdfunding. Et nous avons remporté les deux !</p><p class="graf graf--p graf-after--p">Ce fut l’occasion de vivre un projet passionant et exaltant. Je pense que si la plupart des projets scolaires laissent les étudiants de marbre c’est parce qu’ils se ressemblent plus ou moins et sont presque standardisés. Ici, le sujet était singulier et développait des thématiques pour la plupart inconnues. Les enseignements tirés sont tangibles et franchement … c’est de la bombe.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*rvWEsJ89FSHuaQiI8A7ynA.gif" alt="image" /></div><h4 id="ac54" class="graf graf--h4 graf-after--figure"><strong class="markup--strong markup--h4-strong">Team :</strong></h4><p class="graf graf--p graf-after--h4 graf--trailing">Juste un dernier mot pour dire qu’au-delà de tout ça nous étions une équipe de dingue. Tout le monde s’est défoncé sur ce projet et la confiance régnait au sein du groupe ! Alors encore un grand merci à vous les gars pour tout ce que vous avez fait, vous avez été GR-AN-DI-OS-ES ;) !</p></div></div></div></div></div>


title: Devenir freelance, quel statut choisir ? – Quentin Debavelaere – Medium
url: https://medium.com/@q.debavelaere/devenir-freelance-quel-statut-choisir-58d421292cd7
created_at: 2017-08-10 23:21:43
updated_at: 2017-08-10 23:21:43
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/0*OLfa2-oEnIKi6ZYT.gif
http_status: 200
content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Devenir freelance, quel statut choisir ?</h1><p class="graf graf--p graf-after--h3"><em class="markup--em markup--p-em">En tant que COO de </em><a href="http://www.hopwork.fr" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Hopwork</em></a><em class="markup--em markup--p-em">, j’ai pu échanger avec de nombreux indépendants et je commence à connaître quelques tuyaux pour se lancer ;) Pour ceux qui ne connaissent pas, Hopwork est la plateforme de référence en France pour les freelances du digital. Elle permet aux entreprises et aux freelances de se rencontrer et de travailler ensemble en toute sécurité, sans se soucier des paiements et de l’administratif.</em></p><p class="graf graf--p graf-after--p">Chez Hopwork nous rencontrons tous les jours des freelances (développeurs, graphistes, consultants marketing &amp; communication…), et nous essayons répondre à toutes leurs questions, notamment sur le choix de leur statut juridique. En effet en France (95% des freelances inscrits sur Hopwork.fr sont en France) il est obligatoire d’avoir un statut pour facturer des prestations, et entre EURL, SASU, EIRL, EI, Auto entrepreneur (maintenant micro entrepreneur), on s’y perd un peu.</p><p class="graf graf--p graf-after--p">Je me suis donc mis à la place d’un aspirant freelance, me plongeant dans les méandres de l’administration française pour mieux comprendre les spécificités de chaque statut. Ne souffrant pas de phobie administrative je pensais faire le tour de la question assez rapidement…</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/0*OLfa2-oEnIKi6ZYT.gif" alt="image" /></div>Après avoir consulté quelques sites …<p class="graf graf--p graf-after--figure">J’ai eu peur :) Impossible d’avoir les mêmes chiffres d’une source à l’autre, avalanche de termes obscurs (IR/IS, responsabilité limitée, RSI, cotisations sociales, régime micro fiscal, CRG / CRDS). Donc avec <a href="https://www.hopwork.fr/profile/luciebecquart" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Lucie</a> ma brillante stagiaire nous avons décidé de faire une petite synthèse des différentes options qui s’offrent aux freelances. Il y a quelques exemples chiffrés en fin d’article, et nous mettrons prochainement en ligne sur Hopwork une calculatrice de revenu.</p><p class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">/!\ Attention ces conseils s’adressent aux </em><strong class="markup--strong markup--p-strong"><em class="markup--em markup--p-em">freelances prestataires de service</em></strong><em class="markup--em markup--p-em"> dont l’activité professionnelle principale est une activité de conseil / service qu’ils exercent seuls. Ces informations et taux de cotisations ne seront donc pas valables pour les commerçants, les professions libérales, ou les groupements et coopératives de freelances.</em></p><h3 class="graf graf--h3 graf-after--p">Au delà de 33K de CA il n’y a pas de choix évident, tout est une question de priorités personnelles :</h3><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*MHFQ0FPyLzLgCSa7MBjCOQ.png" alt="image" /></div>L’arbre de décision de l’équipe Hopwork<p class="graf graf--p graf-after--figure">Pour faire simple, si vous faites moins de 33 100€ de CA par an nous vous conseillons de rester micro entrepreneur (c’est simple et les avantages fiscaux sont imbattables, le plafond vient d’être remonté de 32 900€ à 33 100€). Ensuite, si votre activité se développe, nous vous conseillons de choisir entre la SASU (Société par Actions Simplifiée) ou l’EURL (Société Anonyme a Responsabilité Limitée) en fonction de vos priorités : <strong class="markup--strong markup--p-strong">rester au régime général de la sécurité sociale </strong>(c’est notamment le cas des personnes qui ont toujours été inscrites à ce régime et qui prendront leur retraite dans une dizaine d’années) <strong class="markup--strong markup--p-strong">ou bien gagner plus . </strong>En effet en tant que dirigeant d’une SASU vous êtes comme un salarié, ce qui signifie que vous n’êtes pas affilié au régime des indépendants (RSI). La contrepartie à cela est un taux de cotisation sociale sur votre salaire plus élevé qu’en EURL <strong class="markup--strong markup--p-strong">comme vous le verrez dans les simulations en fin d’article.</strong></p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/0*pu9uLBH0uJU3yioQ.jpg" alt="image" /></div>Tout est une question de choix : plus de revenus ou plus de sécurité<h4 class="graf graf--h4 graf-after--figure">Et pourquoi pas l’entreprise individuelle classique (EI) ?</h4><p class="graf graf--p graf-after--h4">Il est vrai que l’entreprise individuelle classique nécessite peu de formalités de gestion, pas de publication des résultats et surtout des coûts de création faibles voire inexistants. Cependant le taux de cotisation sociale est plus élevé qu’en EURL (entre 40% et 45% vs 32% à 38% pour l’EURL). De plus en EI il n’est pas possible de séparer sa rémunération des bénéfices de la société, donc</p><ul class="postList"><li class="graf graf--li graf-after--p">vous ne pouvez pas optimiser votre fiscalité en vous versant un salaire qui vous permette de rester dans les tranches “basses” de l’impôt sur le revenu</li><li class="graf graf--li graf-after--li">vous ne pouvez pas mettre du bénéfice en reserve en cas de baisse d’activité ou si vous souhaitez faire un break</li><li class="graf graf--li graf-after--li">votre patrimoine personnel est confondu avec le patrimoine de votre société, donc si vous contractez des dettes importantes on pourrait saisir vos biens personnels (sauf votre résidence principale) mais il n’y a pas de raison d’avoir des investissements lourds pour un consultant…</li></ul><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*qrz4-j6nkhYlWm-UBU8UvQ.png" alt="image" /></div>Avec une société mettez du revenu de côté pour faire un break<blockquote class="graf graf--pullquote graf-after--figure"><div>l’EI est donc recommandée dans trois cas (i) si vous ne savez pas combien de temps vous allez rester freelance (pas de frais de création et de fermeture) ou (ii) si votre situation fiscale est avantageuse (marié ou enfants pour ne pas atteindre les tranches les plus élevées de l’impôt) ou (iii) si vous ne facturez que de la production artistique.</div></blockquote><p class="graf graf--p graf-after--pullquote"><em class="markup--em markup--p-em">[EDIT : plusieurs remarques et questions intéressantes ont été posées concernant l’EIRL et les cas particuliers des artistes (Maison des Artistes, AGESSA).</em></p><p class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">En tant que freelance comme je le mentionne plus haut les investissements sont peu élevés, il y a dont peu de risque de contracter des dettes importantes, donc finalement la différence entre EI et EIRL est nulle. Ce qui va donc distinguer l’EIRL de l’EURL in fine sera un taux de cotisation plus élevé en EIRL, mais des frais de création moins important. Donc si vous comptez rester freelance un moment, préférez l’EURL, vous pourrez en plus optimiser votre fiscalité d’une année sur l’autre. Si c’est temporaire ou “pour tester”, préférez l’EIRL.</em></p><p id="bc77" class="graf graf--p graf-after--p"><em class="markup--em markup--p-em">Concernant la MDA et l’AGESSA, ce ne sont pas des statuts juridiques, ce sont des régimes sociaux, si vous êtes MDA ou AGESSA (et même profession libérale), votre structure est… une Entreprise Individuelle ! En revanche qui dit régime social particulier dit cotisation sociales particulières. C’est environ 15% à 20% de vos bénéfices pour la MDA, ce qui est donc moins élevé que les 32% à 38% de l’EURL. C’est donc moins cher, mais vous ne pourrez pas facturer autre chose que de la production artistique (pas de conseil donc) et vous devrez fonctionner avec le pré compte la première année, un casse tête pour vos clients. Nous écrirons un autre article dédiés aux artistes, c’est un vrai sujet, en attendant vous trouverez </em><a href="http://www.profession-graphiste-independant.com/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">des réponses par ici</em></a><em class="markup--em markup--p-em">]</em></p><h3 id="e08d" class="graf graf--h3 graf-after--p">Le match SASU vs EURL</h3><p class="graf graf--p graf-after--h3">Votre activité se développe ? Votre chiffre d’affaires dépasse le seuil des 33 100€ ? Vous voulez avoir l’opportunité d’élargir votre activité à d’autres collaborateurs ? Il s’agit de choisir entre la SASU et l’EURL.</p><p id="e6bf" class="graf graf--p graf-after--p">Dans les deux cas vous allez constituer une société, votre Chiffre d’Affaires devra être divisé entre <strong class="markup--strong markup--p-strong">« le coût de votre rémunération » (salaire net + cotisations sociales)</strong> et ce que vous allez conserver comme <strong class="markup--strong markup--p-strong">« bénéfices »</strong> (et vous verser peut-être en dividendes). L’un et l’autre ne sont pas soumis aux mêmes impôts et cotisations sociales pour chaque statut, <strong class="markup--strong markup--p-strong">il en résulte donc des « stratégies » différentes d’allocation de vos revenus.</strong></p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*tO5NuWO1Sq8SvJbL1t-FEQ.png" alt="image" /></div><p class="graf graf--p graf-after--figure">Par ailleurs<strong class="markup--strong markup--p-strong"> </strong>les taxes sur les bénéfices en EURL sont plus élevées que les cotisations sur la rémunération en SASU, elles même plus élevées que les cotisations en EURL, elle même plus élevées que les taxes sur les bénéfices en SASU. Dans l’ordre du moins taxé (1) au plus taxé (4) :</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*m6nMogYXLHwmeTKmvJCARA.png" alt="image" /></div>Les taxes sur les bénéfices et dividendes en SASU sont peu élevées<p class="graf graf--p graf-after--figure">Donc<strong class="markup--strong markup--p-strong"> si vous voulez maximiser votre revenu</strong>, le mieux est de ne pas se verser de salaire et d’être <strong class="markup--strong markup--p-strong">entièrement imposé sur les bénéfices et les dividendes en tant que SASU</strong>. Mais cela implique de ne toucher ses revenus qu’au moment de verser des dividendes,<strong class="markup--strong markup--p-strong"> soit une fois par an… </strong>Ce qui n’est évidemment pas possible si le freelancing est votre activité principale et que vous devez avoir des revenus chaque mois.</p><h4 id="fa04" class="graf graf--h4 graf-after--p">Vous cherchez à maximiser vos revenus : choisissez l’EURL !</h4><p class="graf graf--p graf-after--h4">En EURL, vous êtes au RSI, les cotisations sociales sur la rémunération du dirigeant sont moins importantes qu’en SASU. Ainsi, pour maximiser vos revenus mensuels, l’EURL peut être plus intéressante.</p><p class="graf graf--p graf-after--p">Et comme <strong class="markup--strong markup--p-strong">TD</strong> + <strong class="markup--strong markup--p-strong">IS</strong> &gt; <strong class="markup--strong markup--p-strong">CS </strong>(les cotisations sociales sont inférieures à l’impôt sur les sociétés et les taxes sur les dividendes) :</p><blockquote class="graf graf--pullquote graf-after--p"><div><strong class="markup--strong markup--pullquote-strong">en EURL il vaut mieux vous verser un salaire maximum et garder une réserve de bénéfices minimum</strong></div></blockquote><p class="graf graf--p graf-after--pullquote">La réserve de bénéfice ne doit pas être nulle, elle pourrait servir par exemple pour éviter de passer une tranche supérieure d’imposition sur le revenu, en cas de coup dur, ou tout simplement pour faire un break de quelques mois.</p><h4 id="a08b" class="graf graf--h4 graf-after--p">Vous souhaitez être assimilé salarié : le choix de la SASU s’impose !</h4><p class="graf graf--p graf-after--h4">Si vous avez été salarié avant d’être indépendant, la SASU vous permet de rester au régime général de la sécurité sociale et de continuer à cotiser normalement comme un salarié pour votre retraite. En conséquence les cotisations sociales sur votre rémunération de dirigeant seront plus élevées qu’en EURL. Pour la SASU, la relation est inversée <strong class="markup--strong markup--p-strong">CS</strong> &gt; <strong class="markup--strong markup--p-strong">TD</strong> + <strong class="markup--strong markup--p-strong">IS. </strong>Les cotisations sociales sur votre salaire seront toujours supérieures à l’impôt sur les sociétés (en SASU, il n’y a pas de cotisations sociales sur les dividendes !)</p><blockquote class="graf graf--pullquote graf-after--p"><div><strong class="markup--strong markup--pullquote-strong">en SASU vous gagnerez à vous verser un salaire minimum et des dividendes maximum</strong></div></blockquote><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*D87vxWjHjTJAF2bK5c1P3w.png" alt="image" /></div>Les relations entre les freelances et le RSI ne sont pas toujours au beau fixe<h3 class="graf graf--h3 graf-after--figure">Quelques exemples concrets</h3><p id="f6de" class="graf graf--p graf-after--h3">Avec Lucie nous avons créé des simulateurs de revenus pour les deux statuts, ils seront bientôt en ligne sur Hopwork ;) Ces simulations sont basiques et nous <strong class="markup--strong markup--p-strong">ne sommes pas un cabinet d’experts comptables</strong>. Si vous souhaitez avoir des simulations sur mesure et propres à votre situation, nous travaillons avec le net expert comptable que <a href="https://www.tiime.fr/hopwork/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">vous pouvez contacter directement ici</a>.</p><p class="graf graf--p graf-after--p">Pour notre exemple nous avons pris un développeur qui facture 400€ par jour et qui travaille 18 jours par mois en moyenne <em class="markup--em markup--p-em">(20 jours de congés, 3 jours de maladie, 12 jours d’inter contrat par an) </em>cela fait <strong class="markup--strong markup--p-strong">86 400€ facturés dans l’année. </strong>Considérons également qu’il y aura environ<strong class="markup--strong markup--p-strong"> 6 000€ de frais</strong> annuels <em class="markup--em markup--p-em">(moyenne observée auprès des freelances avec qui nous échangeons au quotidien)</em></p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">En SASU </strong>on visera un salaire “minimal” de 2 500€ par mois soit <strong class="markup--strong markup--p-strong">30 000€ annuel de salaire net.</strong> Le taux de cotisation sociale étant de 73% avec ce niveau de revenu, cela fait 22 000€ de cotisations sociales. Le coût du salaire sera donc 52 000€. Avec les 6 000€ de frais il restera donc 28 400€ de bénéfices, qui deviendront <strong class="markup--strong markup--p-strong">20 400€ de revenus net </strong>après impôts sur les sociétés et taxes sur les dividendes.</p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Un total donc de 50 400€ de revenus annuels nets, soit 58% du chiffre d’affaires facturé</strong></p><p id="b039" class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">En EURL </strong>on visera un salaire “maximum” de 4 800€ par mois soit <strong class="markup--strong markup--p-strong">57 600€ annuel de salaire.</strong> Le taux de cotisation sociale étant de 36% cela fait 20 500€. Le coût du salaire sera donc 78 100€. Avec les 6 000€ de frais il restera donc 2 200€ de bénéfices, qui deviendront <strong class="markup--strong markup--p-strong">1 200€ de revenu des dividendes </strong>après impôts sur les sociétés et taxes sur les dividendes.</p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Un total donc de 58 800€ de revenus annuels, soit 68% du chiffre d’affaires facturé</strong></p><blockquote class="graf graf--pullquote graf-after--p"><div><strong class="markup--strong markup--pullquote-strong">C’est donc financièrement plus avantageux de rester en EURL, vous gagnez environ 17% de plus (avant impôts sur le revenu).</strong></div></blockquote><h3 id="cab3" class="graf graf--h3 graf-after--pullquote">Notre synthèse</h3><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*8jkPcDIqp9AwJ697JySK7g.png" alt="image" /></div><a href="https://twitter.com/intent/tweet?text=D%C3%A9couvrez%20le%20comparatif%20des%20statuts%20de%20freelance%20par%20@Hopwork&amp;url=http%3A%2F%2Fbit.ly%2F2jK2F0j" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank">Partagez ce tableau de synthèse avec vos amis futurs freelances !</a><h3 class="graf graf--h3 graf-after--figure">Et le portage salarial dans tout ça ?</h3><p class="graf graf--p graf-after--h3">Le portage salarial est une option qui peut apporter un peu plus de sécurité mais qui coûte également plus cher. De plus en portage vous êtes comme un salarié, donc il n’est pas possible de mettre certaines dépenses en frais (une partie de votre loyer, un ordinateur de compétition etc.)</p><p class="graf graf--p graf-after--p">Nous avons fait des simulations. la commission typique d’une société de portage est d’environ 5%, et il faut aussi compter environ 43% de charges patronales et salariales. Cela signifie qu’avec 86 400€ facturés vous touchez 44 600€ en salaire net. A cela vous déduisez environ 3000€ de frais (nous comptons moins de frais ici qu’en EURL ou SASU car vous n’avez par exemple pas besoin d’assurance RC pro ou de comptable…)</p><p class="graf graf--p graf-after--p">Au final cela fait <strong class="markup--strong markup--p-strong">41 600€ dans votre poche, soit 48% du chiffre d’affaires facturé.</strong></p><blockquote class="graf graf--pullquote graf-after--p"><div><strong class="markup--strong markup--pullquote-strong">Vous gagnez donc 41% de plus en EURL qu’en portage salarial (58 800€ vs 41 600€)</strong></div></blockquote><p class="graf graf--p graf-after--pullquote">C’est beaucoup, mais la protection n’est pas la même, en portage salarial, vous cotisez au chômage ! Vous pouvez donc rompre votre contrat avec votre société de portage en cas de perte prolongée d’activité pour être indemnisé par l’assurance chômage.</p><h3 class="graf graf--h3 graf-after--p">Pour aller plus loin</h3><p class="graf graf--p graf-after--h3">On espère que cet article à pu éclaircir certains concepts et vous a aidé dans votre choix de statut. Se lancer en freelance est une aventure passionnante alors bravo et bonne chance ;) Si vous avez décidé de sauter le pas c’est <a href="https://www.hopwork.fr/profile" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">par ici pour créer un profil sur Hopwork</a>.</p><p class="graf graf--p graf-after--p">N’hésitez pas à partager cet article et à contacter notre équipe (community@hopwork.com) si vous avez des questions ou des suggestions pour l’améliorer. Vous pouvez aussi consulter la <a href="https://www.hopwork.fr/hopdrinks" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">liste de nos événements</a> pour retrouver les dates des ateliers compta, juridique, et bien sûr les dates des prochains hopdrinks dans toutes les villes de France.</p><p class="graf graf--p graf-after--p graf--trailing"><em class="markup--em markup--p-em">Merci à toutes les personnes qui m’ont aidées dans la rédaction de l’article </em><a href="https://www.hopwork.fr/profile/luciebecquart" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Lucie</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.hopwork.fr/profile/jblemee" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Jean-Baptiste</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.hopwork.fr/profile/loicguay" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Loic</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.linkedin.com/in/jean-baptiste-jacob-6908491b/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Jean Baptiste Jacob</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.hopwork.fr/profile/pierrelasvigne" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Pierre</em></a><em class="markup--em markup--p-em">, </em><a href="https://www.hopwork.fr/profile/olivierguillaume" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Olivier</em></a><em class="markup--em markup--p-em"> et </em><a href="https://www.hopwork.fr/profile/johan" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--p-em">Johan</em></a></p></div></div></div></div></div></div></div></div></div></div>


title: Facebook n’est pas un réseau social, c’est un scanner qui nous numérise
url: https://framablog.org/2017/02/20/facebook-scanner-qui-nous-numerise/
created_at: 2017-08-10 23:21:46
updated_at: 2017-08-10 23:21:46
mimetype: text/html
language: fr-FR
domain_name: framablog.org
preview_picture: https://framablog.org/wp-content/uploads/2017/02/cyborg-rights.png
http_status: 200
content:
  <div class="pdfprnt-buttons pdfprnt-buttons-post pdfprnt-top-right"><a href="https://framablog.org/2017/02/20/facebook-scanner-qui-nous-numerise/?print=pdf" class="pdfprnt-button pdfprnt-button-pdf" target="_blank"><img src="https://framablog.org/wp-content/plugins/pdf-print/images/pdf.png" alt="image_pdf" title="View PDF" /></a><a href="https://framablog.org/2017/02/20/facebook-scanner-qui-nous-numerise/?print=print" class="pdfprnt-button pdfprnt-button-print" target="_blank"><img src="https://framablog.org/wp-content/plugins/pdf-print/images/print.png" alt="image_print" title="Print Content" /></a></div><p><em>Aral Balkan est dans le monde de l’informatique une voix singulière, peut-être signe d’un changement de mentalités au sein de cette nébuleuse généralement plus préoccupée de technologie que de la marche du monde.</em></p>
  <p>
  </p><p><em> C’est en effet sur le terrain politique et même idéologique (ça y est, en deux mots on a déjà perdu les </em>startupers<em> !) qu’il place son travail, dans une perspective militante. </em></p>
  <p><em>Contempteur sans concession du « capitalisme de surveillance » ( voir <a href="https://framablog.org/?s=capitalisme+de+surveillance">ce que nous avons publié</a> sur cette question), il se place ici en rupture totale avec le discours à visée hégémonique que vient de tenir Mark Zuckerberg. </em></p>
  <p><em>Pour Aral Balkan, tous les objets numériques qui nous prolongent sont autant d’émanations fragmentaires de notre personnalité, nous devrions donc en reconquérir la souveraineté et en défendre les droits battus en brèche par les Léviathans qui les captent et les monétisent.</em></p>
  <p><em>il nous faut selon lui travailler à créer un autre monde (eh oui, carrément) où nous aurions retrouvé la maîtrise de toutes les facettes de nos personnalités numériques, il indique même quelques pistes dont certaines sont « déjà là » : les biens communs, les licences libres, le pair à pair…</em></p>
  <p><em>Certains ne manqueront pas de traiter sa vision d’utopie avec un haussement d’épaules, avant de se résigner à un statu quo qui mutile notre humanité. </em></p>
  <p><em>Découvrez plutôt sans préjugés un discours disruptif qui peut-être porte en germe une flexion décisive dans notre rapport au numérique.</em></p>
  <p><em>Article original d’Aral Balkan sur son blog : <a href="https://ar.al/notes/encouraging-individual-sovereignty-and-a-healthy-commons/">Encouraging individual sovereignty and a healthy commons</a></em></p>
  <p><em>Traduction Framalang : mo, panique, jaaf, valvin, goofy, jeromecc</em></p>
  <h2>Encourager la maîtrise de chacun et la bonne santé des biens communs</h2>
  <p><img class="size-full wp-image-8814 alignleft" src="https://framablog.org/wp-content/uploads/2017/02/ND7M3yJx_400x400.jpg" alt="" width="148" height="148" />Dans son manifeste récent Mark Zuckerberg mettait en valeur sa vision d’une colonie mondiale centralisée dont les règles seraient dictées par l’oligarchie de la Silicon Valley.</p>
  <p>J’affirme que nous devons faire exactement l’inverse et œuvrer à un monde fondé sur la souveraineté individuelle et un patrimoine commun sain.</p>
  <img class="wp-image-8810 size-full" src="https://framablog.org/wp-content/uploads/2017/02/cyborg-rights.png" width="1440" height="810" alt="image" />Nous sommes des êtres fragmentés. Construisons un monde où nous détenons et contrôlons toutes les facettes de notre personnalité.
  <p>Mark Zuckerberg a publié un manifeste intitulé « <a href="https://www.facebook.com/notes/mark-zuckerberg/building-global-community/10154544292806634">Construisons une communauté mondiale</a> » dans lequel il détaille comment lui, un des <a href="http://www.directmatin.fr/economie/2017-01-16/les-8-hommes-les-plus-riches-du-monde-possedent-autant-que-50-de-lhumanite">8 plus riches milliardaires</a> au monde) et son empire entrepreneurial américain/multinational, Facebook Inc., vont résoudre tous les maux du monde.</p>
  <p>Dans sa vision grandiose pour l’humanité, Mark revient sur la façon dont fondamentalement, Facebook « nous rapproche » en « connectant nos amis et nos familles ». Ce que Mark oublie de dire c’est que Facebook ne connecte pas les gens entre eux ; Facebook connecte les gens à Facebook Inc.</p>
  <p><img class="aligncenter size-full wp-image-8808" src="https://framablog.org/wp-content/uploads/2017/02/facebook-the-myth.jpg" alt="" width="1208" height="463" /></p>
  <p>Facebook : Le mythe. Mark souhaite que vous pensiez que Facebook vous connecte les uns aux autres.</p>
  <p><img class="aligncenter size-full wp-image-8807" src="https://framablog.org/wp-content/uploads/2017/02/facebook-the-reality.jpg" alt="" width="1208" height="461" /></p>
  <p>Facebook : la réalité. Facebook vous connecte à Facebook Inc.</p>
  <p>Le modèle économique de Facebook c’est d’être « <a href="https://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu">l’homme du milieu</a> » : il consiste à pister tous vos comportements, votre famille, vos amis, à stocker indéfiniment des informations et les analyser en permanence pour vous connaître, vous exploiter en vous manipulant afin d’en tirer un bénéfice financier ou politique.</p>
  <p>Facebook n’est pas un réseau social, c’est un scanner qui numérise les êtres humains. C’est, pour ainsi dire, une caméra qui capte votre âme.<br />
  Le business de Facebook consiste à créer un double de vous-même, à s’emparer de ce double et à le contrôler, pour vous posséder et vous contrôler.</p>
  <p><strong>Quand Mark vous demande de lui faire confiance pour être un roi bienveillant, je réponds que nous bâtirons un monde sans roi.</strong></p>
  <p>Le modèle économique de Facebook, Google et de la cohorte des <em>startups</em> financées par le capital-risque de la Silicon Valley, j’appelle ça de l’élevage d’être humains. Facebook est une ferme industrielle pour les êtres humains. Et le manifeste de Mark n’est rien d’autre que la dernière tentative d’un milliardaire paniqué pour enjoliver un modèle d’affaires répugnant fondé sur la violation des droits humains avec l’objectif faussement moral de se débarrasser de la réglementation et de justifier un désir décomplexé de créer une seigneurie à l’échelle planétaire, en connectant chacun d’entre nous à Facebook, Inc.</p>
  <h3>Refusons une colonie globale</h3>
  <p>Le manifeste de Mark ne vise pas à construire une communauté globale, il vise à construire une colonie globale – dont il serait le roi et dont son entreprise et l’oligarchie de la Silicon Valley seraient la cour.</p>
  <p><strong>Facebook veut nous faire croire qu’il s’agit d’un parc de loisirs alors qu’il s’agit d’un centre commercial.</strong></p>
  <p>Ce n’est pas le rôle d’une entreprise de « développer l’infrastructure sociale d’une communauté » comme Mark veut le faire. L’infrastructure sociale doit faire partie des biens communs, et non pas appartenir aux entreprises monopolistiques géantes comme Facebook. La raison pour laquelle nous nous retrouvons dans un tel bazar avec une surveillance omniprésente, des bulles de filtres et des informations mensongères (de la propagande) c’est que, précisément, la sphère publique a été totalement détruite par un <a href="https://fr.wikipedia.org/wiki/Oligopole">oligopole</a> d’infrastructures privées qui se présente comme un espace public.</p>
  <p>Facebook veut nous faire croire qu’il s’agit d’un parc alors qu’il s’agit d’un centre commercial. La dernière chose dont nous ayons besoin c’est d’une infrastructure numérique encore plus centralisée et détenue par des intérêts privés pour résoudre les problèmes créés par une concentration sans précédent de puissance, de richesse et de contrôle entre les mains de quelques-uns. Il est grand temps que nous commencions à financer et à construire l’équivalent numérique de parcs à l’ère du numérique au lieu de construire des centres commerciaux de plus en plus grands.</p>
  <p>D’autres ont <a href="http://www.theregister.co.uk/2017/02/17/zuckerberg_publishes_worldsaving_manifesto/">critiqué</a> en détail le manifeste de Mark. Je ne vais pas répéter ici ce qu’ils ont dit. Je voudrais plutôt me concentrer sur la manière dont nous pouvons construire un univers radicalement différent de celui de la vision de Mark. Un monde dans lequel, nous, individus, au lieu des entreprises, aurons la maîtrise et le contrôle de notre être. En d’autres termes, un monde dans lequel nous aurons la souveraineté individuelle.</p>
  <p>Là où Mark vous demande de lui faire confiance en tant que roi bienveillant, je réponds : construisons un monde sans roi. Là où la vision de Mark s’enracine dans le colonialisme et la perpétuation d’un pouvoir et d’un contrôle centralisés, la mienne est fondée sur la souveraineté individuelle et avec des biens communs en bonne santé et distribués.</p>
  <h3>La souveraineté individuelle et le moi cybernétique.</h3>
  <p>Nous ne pouvons plus nous offrir le luxe de ne pas comprendre la nature du « moi » à l’âge numérique. L’existence même de nos libertés et de la démocratie en dépend.<br />
  Nous sommes (et nous le sommes depuis un moment maintenant) des organismes cybernétiques.<br />
  Nous devons résister de toutes nos forces à toute tentative de réduire les personnes à des <em>propriétés</em>.</p>
  <p>En cela, je ne veux pas faire référence à la représentation stéréotypée des cyborgs qui prévaut en science-fiction et dans laquelle la technologie se mélange aux tissus humains. Je propose plutôt une définition plus générale dans laquelle le terme s’applique à toute extension de notre esprit et de notre moi biologique par la technologie. Bien que les implants technologiques soient certainement réalisables, possibles et avérés, le principal moyen par lequel nous amplifions aujourd’hui notre moi avec la technologie, ce n’est pas par des implants mais par des <em>explants</em>.</p>
  <p>Nous sommes des êtres fragmentés ; la somme de nos différents aspects tels que contenus dans nos êtres biologiques aussi bien que dans la myriade de technologies que nous utilisons pour étendre nos capacités biologiques.</p>
  <img class="wp-image-8809 size-full" src="https://framablog.org/wp-content/uploads/2017/02/extending-the-boundaries-of-the-self.png" width="2880" height="1622" alt="image" />Nous devons protéger par voie constitutionnelle la dignité et le caractère sacro-saint du moi étendu.
  <p>Une fois que nous avons compris cela, il s’ensuit que nous devons étendre les protections du moi au-delà de nos limites biologiques pour y inclure toutes ces technologies qui servent à nous prolonger. Par conséquent, toute tentative par des tierces parties de posséder, contrôler et utiliser ces technologies comme une marchandise est une tentative de posséder, contrôler et monétiser les éléments constitutionnels des individus comme des marchandises. Pour faire court, c’est une tentative de posséder, contrôler et utiliser les êtres humains comme des marchandises.</p>
  <p>Inutile de dire que nous devons résister avec la plus grande vigueur à toute tentative de réduire les êtres humains à de la marchandise. Car ne pas le faire, c’est donner notre consentement tacite à une nouvelle servitude : une servitude qui ne fait pas commerce des aspects biologiques des êtres humains mais de leurs paramètres numériques. Les deux, bien sûr, n’existent pas séparément et ne sont pas réellement séparables lorsque la manipulation de l’un affecte nécessairement l’autre.</p>
  <h3>Au-delà du capitalisme de surveillance</h3>
  <p>À partir du moment où nous comprenons que notre relation à la technologie n’est pas une relation maître/esclave mais une relation organisme cybernétique/organe ; à partir du moment où nous comprenons que nous étendons notre moi par la technologie et que notre technologie et nos données font partie des limites de notre moi, alors nous devons nous battre pour que légalement les protections constitutionnelles du moi que nous avons gravées dans la Déclaration universelle des droits de l’homme et mises en application dans la myriade des législations nationales soient étendues à la protection du moi en tant qu’être cybernétique.</p>
  <p>Il s’ensuit également que toute tentative de violation des limites de ce moi doit être considérée comme une attaque du moi cybernétique. C’est précisément cette violation qui constitue aujourd’hui le modèle économique quotidien de Facebook, Google et des majors de la technologie de la Sillicon Valley. Dans ce modèle, que <a href="http://www.faz.net/aktuell/feuilleton/debatten/the-digital-debate/shoshana-zuboff-secrets-of-surveillance-capitalism-14103616.html">Shoshana Zuboff</a> appelle <a href="https://framablog.org/?s=capitalisme+de+surveillance">le capitalisme de surveillance</a>, ce que nous avons perdu, c’est notre souveraineté individuelle. Les personnes sont à nouveau redevenues des possessions, bien que sous forme numérique et non biologique.</p>
  <p>Pour contrer cela, nous devons construire une nouvelle infrastructure pour permettre aux personnes de regagner cette souveraineté individuelle. Ces aspects de l’infrastructure qui concernent le monde qui nous entoure doivent appartenir aux biens communs et les aspects qui concernent les gens – qui constituent les organes de notre être cybernétique – doivent être détenus et contrôlés par les individus eux-mêmes.</p>
  <p>Ainsi, par exemple, l’architecture d’une ville <em>intelligente</em> et les données sur le monde qui nous entoure (les données sur notre environnement) doivent appartenir aux biens communs, tandis que votre voiture <em>intelligente</em>, votre <em>smartphone</em>, votre montre <em>connectée</em>, votre peluche <em>intelligente</em>, etc. et les données qu’ils collectent (les données sur les individus) doivent rester votre propriété.</p>
  <h3>Pour un Internet des individus</h3>
  <p>Imaginez un monde où chacun possède son propre espace sur Internet, fondé sur les biens communs. Cela représente un espace privé (un organe de notre être cybernétique) auquel nos appareils dits <em>intelligents</em> (qui sont aussi des organes), peuvent se connecter.</p>
  <p>Au lieu d’envisager cet espace comme un nuage personnel, nous devons le considérer comme un nœud particulier, permanent, dans une infrastructure de pair à pair dans laquelle nos appareils divers (nos organes) se connectent les uns aux autres. En pratique, ce nœud permanent est utilisé pour garantir la possibilité de trouver la localisation (à l’origine en utilisant des noms de domaine) et la disponibilité (car il est hébergé/toujours en service) tandis que nous passerons de l’architecture client/serveur du Web actuel à l’architecture de pair à pair de la prochaine génération d’Internet.</p>
  <img class="wp-image-8806 size-full" src="https://framablog.org/wp-content/uploads/2017/02/indienet-1.png" width="1440" height="810" alt="image" />Chacun a son propre espace sur Internet, auquel tous ses objets se connectent.<p>Un Internet des individus</p>
  <p>L’infrastructure que nous construirons doit être fondée sur les biens communs, appartenir aux biens communs et être interopérable. Les services eux-mêmes doivent être construits et hébergés par une pléthore d’organisations individuelles, non par des gouvernements ou par des entreprises gigantesques, travaillant avec des protocoles interopérables et en concurrence pour apporter à ceux qu’elles servent le meilleur service possible. Ce n’est pas un hasard : ce champ sévèrement limité du pouvoir des entreprises résume l’intégralité de leur rôle dans une démocratie telle que je la conçois.</p>
  <p>L’unique but d’une entreprise devrait être de rivaliser avec d’autres organisations pour fournir aux personnes qu’elles servent le meilleur service possible. Cela contraste radicalement avec les énormes dispositifs que les entreprises utilisent aujourd’hui pour attirer les individus (qu’ils appellent des « utilisateurs ») sous de faux prétextes (des services gratuits à l’intérieur desquels ils deviennent les produits destinés à la vente) dans le seul but de les rendre dépendants, de les piéger et de les enfermer dans des technologies propriétaires, en faire l’élevage, manipuler leur comportement et les exploiter pour en tirer un bénéfice financier et politique.</p>
  <p>Dans l’<em>entreprenocratie</em> d’aujourd’hui, nous – les individus – sommes au service des entreprises. Dans la démocratie de demain, les entreprises devront être à notre service.</p>
  <p>Les fournisseurs de services doivent, naturellement, être libres d’étendre les fonctionnalités du système tant qu’ils partagent les améliorations en les remettant dans les biens communs (« partage à l’identique »), évitant ainsi le verrouillage. Afin de fournir des services au-dessus et au-delà des services de base fondés sur les biens communs, les organisations individuelles doivent leur attribuer un prix et faire payer les services selon leur valeur ajoutée. De cette manière, nous pouvons construire une économie saine basée sur la compétition reposant sur un socle éthiquement sain à la place du système de monopoles que nous rencontrons aujourd’hui reposant sur une base éthiquement pourrie. Nous devons le faire sans compliquer le système tout entier dans une bureaucratie gouvernementale compliquée qui étoufferait l’expérimentation, la compétition et l’évolution décentralisée et organique du système.</p>
  <img class="wp-image-8805 size-full" src="https://framablog.org/wp-content/uploads/2017/02/indienet-2.png" width="1440" height="810" alt="image" />Une économie saine fondée sur un base éthique
  <p>Interopérabilité, technologies libres avec des licences « partage à l’identique », architecture de pair à pair (par opposition à une architecture client/serveur), et un cœur fondé sur les biens communs : tels sont les garde-fous fondamentaux pour empêcher le nouveau système de se dégrader en une nouvelle version du Web de surveillance monopolistique, tel que nous connaissons aujourd’hui. C’est notre manière d’éviter les économies d’échelle et de rompre <a href="https://fr.wikipedia.org/wiki/R%C3%A9troaction">la boucle de rétroaction</a> entre l’accumulation d’informations et la richesse qui est le moteur principal du capitalisme de la surveillance.</p>
  <p>Pour être tout à fait clair, nous ne parlons pas d’un système qui peut s’épanouir sous le diktat du dernier round d’un capitalisme de surveillance. C’est un système néanmoins, qui peut être construit dans les conditions actuelles pour agir comme un pont entre le statu quo et un monde post-capitaliste durable.</p>
  <h3>Construire le monde dans lequel vous voulez vivre</h3>
  <p>Dans un discours que j’ai tenu récemment lors d’un événement de la Commission européenne à Rome, je disais aux auditeurs que nous devions « construire le monde dans lequel nous voulons vivre ». Pour moi, ce n’est pas un monde détenu et contrôlé par une poignée d’oligarques de la Silicon Valley. C’est un monde avec des biens communs sains, dans lequel – en tant que communauté – nous possédons et contrôlons collectivement ces aspects de notre existence qui nous appartiennent à tous, et dans lequel aussi — en tant qu’individus — nous sommes maîtres et avons le contrôle des aspects de notre existence qui n’appartiennent qu’à nous.</p>
  <p>Imaginez un monde où vous et ceux que vous aimez disposeraient d’une capacité d’action démocratique ; un monde où nous bénéficierions tous d’un bien-être de base, de droits et de libertés favorables à notre dignité d’êtres cybernétiques. Imaginez un monde durable libéré de l’avidité destructrice et à court terme du capitalisme et dans lequel nous ne récompenserions plus les sociopathes lorsqu’ils trouvent des moyens encore plus impitoyables et destructeurs d’accumuler les richesses et la puissance aux dépens des autres. Imaginez un monde libre, soustrait (non plus soumis) à la boucle de rétroaction de la peur fabriquée et de la surveillance omniprésente qui nous entraîne de plus en plus profondément dans un nouveau vortex du fascisme. Imaginez un monde dans lequel nous nous octroierions la grâce d’une existence intellectuellement riche où nous serions libres d’explorer le potentiel de notre espèce parmi les étoiles.<br />
  Tel est le monde pour lequel je me lève chaque jour afin d’y travailler. Non par charité. Non pas parce que je suis un philanthrope. En fait sans aucune autre raison que celle-ci : c’est le monde dans lequel je veux vivre.</p>
  <p> – – –</p>
  <p>Aral Balkan est un militant, concepteur et développeur. Il détient <a href="https://ind.ie/about/team/">1/3</a> de <a href="https://ind.ie/about/">Ind.ie</a>, une petite entreprise sociale qui travaille pour la justice sociale à l’ère du numérique.</p>
  <div title="Diaspora*" id="diaspora-button-container"><a href="denied:javascript:(function(){var url = 'https://framablog.org/2017/02/20/facebook-scanner-qui-nous-numerise/' ;var title = 'Facebook n’est pas un réseau social, c’est un scanner qui nous numérise';   window.open('https://framablog.org/wp-content/plugins/share-on-diaspora/new_window.php?url='+encodeURIComponent(url)+'&amp;title='+encodeURIComponent(title),'post','location=no,links=no,scrollbars=no,toolbar=no,width=620,height=400')})()"><img id="diaspora-button-ownimage-img" src="https://framablog.org/wp-content/uploads/2015/01/diaspora.jpg" alt="" /></a></div><div class="twoclick_social_bookmarks_post_8812 social_share_privacy clearfix 1.6.4 locale-fr_FR sprite-en_GB"><div class="twoclick-js"><div id="author-bio-box"><h3><img alt="" src="https://framablog.org/wp-content/plugins/fv-gravatar-cache/images/cd51d90409f606113b4fe8618dcf6870" class="avatar pull-left media-object avatar-90 photo" height="90" width="90" /></h3></div><a target="_blank" href="https://participer.framasoft.org/traduction-rejoignez-framalang/" class="bio-icon bio-icon-website"></a><a target="_blank" href="https://framasphere.org/u/framasoft" class="bio-icon bio-icon-facebook"></a><a target="_blank" href="https://twitter.com/framasoft" class="bio-icon bio-icon-twitter"></a><a target="_blank" href="https://plus.google.com/113481533567002271362/posts" class="bio-icon bio-icon-googleplus">Framalang est le groupe de traduction bénévole et communautaire de Framasoft. Les membres traduisent des articles du monde du Libre à l'intention du public francophone. Pour participer à cette aventure, </a><a href="https://participer.framasoft.org/traduction-rejoignez-framalang/">rejoignez notre liste de diffusion</a> !</div></div>


title: Symfony : ouvrons le capot – Arnaud LEMAIRE – Medium
url: https://medium.com/@Lilobase/symfony-ouvrons-le-capot-67103236c9fe
created_at: 2017-08-10 23:21:48
updated_at: 2017-08-10 23:21:48
mimetype: text/html
domain_name: medium.com
preview_picture: https://cdn-images-1.medium.com/max/1200/1*z--WRcpjy1Q_pnxEi8Q3PQ.jpeg
http_status: 200
content:
  <div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 class="graf graf--h3 graf--leading graf--title">Symfony : ouvrons le capot</h1><p class="graf graf--p graf-after--h3">Dans cet article, je me propose de parcourir avec vous, un endroit souvent méconnu et pourtant indispensable : <strong class="markup--strong markup--p-strong">les mécanismes de démarrage et de traitement d’une requête HTTP par le framework.</strong></p></div><div class="section-inner sectionLayout--outsetColumn"><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/2000/1*z--WRcpjy1Q_pnxEi8Q3PQ.jpeg" alt="image" /></div></div><div class="section-inner sectionLayout--insetColumn"><blockquote id="c941" class="graf graf--blockquote graf-after--figure graf--trailing"><div><strong class="markup--strong markup--blockquote-strong">Note : </strong>cet article est tiré d’une formation interne, donnée il y a plus de deux ans.<strong class="markup--strong markup--blockquote-strong"> La grande majorité des informations contenues dans cet article est restée d’actualités</strong>, il est cependant possible que certains mécanismes aient légèrement changés de forme. J’ai choisi de le publier ici, sous sa forme originale, afin de faire profiter le lecteur d’un travail sur les mécanismes internes de résolution d’une requête.</div></blockquote></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 id="d2b1" class="graf graf--h3 graf--leading">Composants centraux de Symfony</h3><h4 class="graf graf--h4 graf-after--h3">Les dépendances et l’autoloading</h4><p class="graf graf--p graf-after--h4">Les dépendances au sein d’un projet Symfony sont gérées par <strong class="markup--strong markup--p-strong">composer</strong>. Elles peuvent être explicites (déclarées dans le fichier composer.json) ou induites (requises par des composants nécessaires au projet). La résolution des dépendances induites est automatique sauf dans le cas ou vous spécifiez des dépendances personnelles (déclarée à l’aide d’une URI vers un dépôt de source et non via packagist) dans ce cas précis vous devez expliciter manuellement toutes les dépendances.</p><p id="d8d9" class="graf graf--p graf-after--p">Notez que composer dispose d’une option trop peu connue pour accélérer la phase d’autoloading en production, il s’agit de la commande : <br /><code class="markup--code markup--p-code">composer dump-autoload --optimize</code>.</p><p class="graf graf--p graf-after--p">Cette fonction va créer un fichier de mapping des classes présentes au sein de votre projet évitant ainsi le très coûteux appel à <code class="markup--code markup--p-code">file_exists</code>.</p><p class="graf graf--p graf-after--p">De plus si vous souhaitez installer un projet en production vous n’avez pas besoin des dépendances listées dans la section <code class="markup--code markup--p-code">require-dev</code> du fichier <code class="markup--code markup--p-code">composer.json</code>. Pour évitez que ces dépendances ne soient aussi installées vous pouvez utiliser l’option <code class="markup--code markup--p-code">--no-dev</code> lors de l’appel à la commande <code class="markup--code markup--p-code">composer install</code> ou <code class="markup--code markup--p-code">composer update</code> .</p><p class="graf graf--p graf-after--p">Une note sur la façon dont sont gérées les dépendances, beaucoup de projets utilisent la notion de <code class="markup--code markup--p-code">bridge</code> pour leurs Bundle Symfony. Le bridge permet d’exposer l’API d’une bibliothèque PHP au sein de Symfony. Plus spécifiquement, le bridge fait descendre la configuration définie au sein de Symfony dans la bibliothèque et expose au framework l’API de la bibliothèque à travers des services SF. Ainsi, si vous cherchez le code lié à une bibliothèque faites attention à bien avoir cette distinction en tête.</p><p class="graf graf--p graf-after--p graf--trailing">Enfin, Composer supporte les normes : PSR-0 et PSR-4 concernant l’autoloading, la norme PSR-4 permet d’éviter d’avoir une arborescence trop profonde lors du chargement des vendors.</p></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 class="graf graf--h3 graf--leading">Configuration</h3><h4 id="dd76" class="graf graf--h4 graf-after--h3">Composant Config</h4><p class="graf graf--p graf-after--h4">La configuration au sein du framework est gérée par le composant <code class="markup--code markup--p-code">Config</code>. Ce composant est chargé de trouver des fichiers de configuration les parser et les fournir à l’environnement Symfony. Il est capable de parser les formats Yaml, XML, INI ou de récupérer les valeurs de configuration au sein d’une base de données.</p><p class="graf graf--p graf-after--p">Le service de configuration utilise un <code class="markup--code markup--p-code">FileLocator</code> si le fichier de configuration se trouve au sein du filesystème. Il reçoit une collection de chemins à explorer pour chercher un nom de fichier fourni en paramètre. Il peut retourner soit le premier fichier trouvé, soit l’ensemble des fichiers correspondant au nom de fichier fourni.</p><p id="c149" class="graf graf--p graf-after--p">En fonction du type de document (yml, ini, xml, …), un <code class="markup--code markup--p-code">FileLoader</code> spécifique est utilisé. Il est chargé de transformer le fichier en une représentation PHP objet.</p><p id="fde2" class="graf graf--p graf-after--p">Enfin un système de cache (<code class="markup--code markup--p-code">ConfigCache</code>) peut être activé pour stocker la configuration au sein du cache et éviter les phases de localisation et de chargement qui sont très coûteuses en temps. En mode debug un fichier <code class="markup--code markup--p-code">.meta</code> est créé à côté du fichier de cache, qui permet d’invalider le cache en cas de modification des valeurs cachées. En production, le cache n’est jamais invalidé sauf ordre explicite via la commande <code class="markup--code markup--p-code">cache:clear</code>.</p><p class="graf graf--p graf-after--p">Le système de cache dispose d’un système de validation des données de configuration : le <code class="markup--code markup--p-code">TreeBuilder</code> permet de définir une hiérarchie, expliciter les types, définir les valeurs par défauts, poser des contraintes, etc. sur les valeurs de configuration à charger.</p><h4 class="graf graf--h4 graf-after--p">La notion d’environnement au sein de Symfony</h4><p class="graf graf--p graf-after--h4">La configuration générale d’une application symfony dépend des <strong class="markup--strong markup--p-strong">environnements</strong> chaque environnement définit l’exécution de la même base de code, mais avec une configuration différente (et uniquement une configuration différente). Par défaut les environnements sont au nombre de trois (<strong class="markup--strong markup--p-strong">dev</strong>, <strong class="markup--strong markup--p-strong">test</strong>, <strong class="markup--strong markup--p-strong">prod</strong>), mais il est possible d’en définir de nouveau (par exemple par client, ce que nous utilisons pour faire du multitenant).</p><p id="df6b" class="graf graf--p graf-after--p">Par défaut les fichiers de configurations se trouvent dans le répertoire <code class="markup--code markup--p-code">app/config</code> il est possible de modifier la classe <code class="markup--code markup--p-code">AppKernel</code> pour changer la localisation de la configuration : il suffit de redéfinir la méthode <code class="markup--code markup--p-code">registerContainerConfiguration</code> :</p><pre id="bda2" class="graf graf--pre graf-after--p">public function registerContainerConfiguration(<br />    LoaderInterface $loader<br />)<br />{<br />     $loader-&gt;load(<br />         __DIR__.’/config/config_’.$this-&gt;getEnvironment().’.yml’<br />    );<br />}</pre><p class="graf graf--p graf-after--pre">Les environnements sont déclarés explicitement dans les fichiers <code class="markup--code markup--p-code">web/app.php</code> et <code class="markup--code markup--p-code">web/app_dev.php</code> lors de l’instanciation de <code class="markup--code markup--p-code">AppKernel</code>.</p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Attention</strong> la notion de mode debug est distincte de la notion d’environnement, elle est définie lors de l’instanciation de <code class="markup--code markup--p-code">AppKernel</code> comme deuxième argument du constructeur :</p><pre id="a55f" class="graf graf--pre graf-after--p">//active debug mode in prod environment<br />$kernel = new AppCache(new AppKernel(‘prod’, true));</pre><p id="f762" class="graf graf--p graf-after--pre">Les environnements modifient aussi l’emplacement des caches, par défaut un répertoire de cache est créé par environnement au sein du répertoire : <code class="markup--code markup--p-code">app/cache/{environment}</code>. Vous pouvez modifier ce comportement en surchargeant la méthode <code class="markup--code markup--p-code">getCacheDir</code> du <code class="markup--code markup--p-code">AppKernel</code> (le fonctionnement est similaire pour les fichiers de logs) :</p><pre class="graf graf--pre graf-after--p">public function getCacheDir()<br />{<br />    return $this-&gt;rootDir.’/’.$this-&gt;environment.’/cache/’;<br />}</pre><pre class="graf graf--pre graf-after--pre">public function getLogDir()<br />{<br />    return $this-&gt;rootDir.’/’.$this-&gt;environment.’/logs/’;<br />}</pre><p class="graf graf--p graf-after--pre"><strong class="markup--strong markup--p-strong">Note</strong> : concernant les caches, il est possible de les supprimer à la main à l’aide d’une simple suppression du contenu des répertoires correspondants. Vous êtes cependant invités à utiliser la commande :<br /><code class="markup--code markup--p-code">cache:clear --env={environment}</code>. <br />En effet, lors du premier appel si les caches sont vides, la ressource demandée (page) peut mettre un certain temps à apparaître : l’application doit régénérer l’ensemble de sa configuration (config + routes + traduction + entité + services + …) ce qui prend un certain temps. <br />Lors de l’appel à la commande <code class="markup--code markup--p-code">cache:clear</code>, Symfony déclenche un mécanisme appelé warmup, qui consiste à régénérer une grande partie des caches, pour éviter de faire subir cette latence à un visiteur de votre site. Vous pouvez déclencher cette opération manuellement en appelant la commande <code class="markup--code markup--p-code">cache:warmup</code>.</p><h4 class="graf graf--h4 graf-after--p">Le chargement des valeurs de configuration</h4><p class="graf graf--p graf-after--h4">Comme nous venons de le voir, les valeurs de configurations sont spécifiques à un environnement. Cependant une partie de cette configuration est commune aux différents environnements : elle est stockée au sein du fichier <code class="markup--code markup--p-code">app/config/config.yml</code>.</p><p class="graf graf--p graf-after--p">Le fichier <code class="markup--code markup--p-code">config.yml</code> contenant la configuration commune aux environnements n’est pas directement appelé par le framework, mais importé par les différents fichiers de configuration à l’aide de la notation :</p><pre class="graf graf--pre graf-after--p">imports:<br /> — { resource: config.yml }</pre><p class="graf graf--p graf-after--pre">Ce mécanisme est aussi utilisé pour le fichier <code class="markup--code markup--p-code">parameters.ini</code> que l’on trouve dans la distribution standard, il est simplement importé. Il faut savoir que toute variable de configuration devient disponible sous la forme <code class="markup--code markup--p-code">%node.key%</code> au sein d’un fichier de configuration.</p><p id="e4cc" class="graf graf--p graf-after--p">Vous pouvez aussi définir des valeurs de configuration externe à votre projet en utilisant les variables d’environnements. En effet toute variable d’environnement préfixée par <code class="markup--code markup--p-code">SYMFONY__</code> est automatiquement convertie en paramètre disponible par le conteneur de service.</p><p id="e69c" class="graf graf--p graf-after--p">Par exemple, les variables d’environnements peuvent être définir au sein de la configuration virtualHost d’apache :</p><pre class="graf graf--pre graf-after--p">&lt;VirtualHost *:80&gt;<br /> DocumentRoot “/path/to/symfony_2_app/web”<br /> SetEnv SYMFONY__DATABASE__USER user<br /> #…</pre><p id="e2a7" class="graf graf--p graf-after--pre">N’oubliez pas que si votre système utilise les variables d’environnements vous devez aussi les déclarer au sein de votre shell pour utiliser la console symfony.</p><p id="bf50" class="graf graf--p graf-after--p graf--trailing">Vous pouvez alors les utiliser au sein de vos fichiers de configuration : <code class="markup--code markup--p-code">user: “%database.user%"</code>.</p></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 class="graf graf--h3 graf--leading">Routage</h3><h4 class="graf graf--h4 graf-after--h3">Le routeur</h4><p class="graf graf--p graf-after--h4">Le routage est géré au sein de Symfony par le composant <code class="markup--code markup--p-code">Routing</code>. Le routage est séparé en trois parties :</p><ul class="postList"><li id="a478" class="graf graf--li graf-after--p">Une <code class="markup--code markup--li-code">RouteCollection</code> qui contient l’ensemble des routes</li><li class="graf graf--li graf-after--li">Un <code class="markup--code markup--li-code">RequestContext</code> contenant le contexte de la requête</li><li class="graf graf--li graf-after--li">Un <code class="markup--code markup--li-code">UrlMatcher</code> qui fait correspondre la requête à une route (et non à un contrôleur)</li></ul><p class="graf graf--p graf-after--li">Une route dans Symfony contient 7 parties (dont certaines optionnelles) :</p><ul class="postList"><li id="a39b" class="graf graf--li graf-after--p">Un pattern d’URL (pouvant contenir des zones variables)</li><li class="graf graf--li graf-after--li">Un tableau de valeur par défaut envoyée avec la requête si la route est atteinte</li><li class="graf graf--li graf-after--li">Un tableau de contraintes sur les valeurs variables de l’URL</li><li id="f55e" class="graf graf--li graf-after--li">Un tableau d’options peut contenir des paramètres internes pour la route</li><li class="graf graf--li graf-after--li">Un hôte permet d’atteindre une route en fonction de l’hôte d’appel</li><li id="e7b7" class="graf graf--li graf-after--li">Un tableau de schéma HTTP (http, https)</li><li id="bc6c" class="graf graf--li graf-after--li">Un tableau de méthode HTTP (get, post, head, put, …)</li></ul><p class="graf graf--p graf-after--li">Vous pouvez attacher une collection de routes à une autre route de façon récursive en spécifiant un préfixe. De cette façon si le préfixe est atteint, la résolution de la route se fait dans la collection liée.</p><p class="graf graf--p graf-after--p">Le chargement des routes depuis un fichier est effectué par le composant de configuration et supporte donc l’ensemble des formats acceptés par celui-ci. En plus de la définition de routes au sein d’un fichier, vous pouvez également les définir à l’aide d’annotation placée au sein de vos contrôleurs.</p><h4 class="graf graf--h4 graf-after--p">La définition des routes au sein de Symfony2</h4><p class="graf graf--p graf-after--h4">Contrairement à ce que l’on pourrait penser, le système de routing n’importe pas automatiquement de nouvelle collection de routes (par exemple venant d’un Bundle) tout est explicitement importé depuis le fichier utilisé par défaut : <code class="markup--code markup--p-code">app/config.yml</code> (dans le cas de la distribution standard).</p><p class="graf graf--p graf-after--p">Les routes sont résolues dans l’ordre cela signifie que la première route qui correspond au pattern de l’URL est utilisée. Faites donc très attention à l’ordre dans lequel les routes sont chargées (et importées).</p><p class="graf graf--p graf-after--p">Pour des raisons de performances, il est possible de confier le routing à apache à l’aide du <code class="markup--code markup--p-code">mod_rewrite</code>. Pour cela appelez la commande <code class="markup--code markup--p-code">router:dump-apache -e=prod --no-debug</code> et placez le résultat au sein de votre fichier <code class="markup--code markup--p-code">.htaccess</code>.</p><p class="graf graf--p graf-after--p">Si vous laissez apache se charger du routage, vous pouvez encore accélérer la phase d’analyse de la requête en modifiant le fichier <code class="markup--code markup--p-code">web/app.php</code> pour lui faire utiliser les <code class="markup--code markup--p-code">ApacheRequest</code> au lieu de <code class="markup--code markup--p-code">Request</code> :</p><pre class="graf graf--pre graf-after--p">//…<br />use Symfony\Component\HttpFoundation\ApacheRequest;<br />$kernel = new AppKernel(‘prod’, false);<br />//…<br />$kernel-&gt;handle(ApacheRequest::createFromGlobals())-&gt;send();</pre><h4 id="eb86" class="graf graf--h4 graf-after--pre">Contrôleur</h4><p class="graf graf--p graf-after--h4">La résolution du contrôleur est effectuée par le composant <code class="markup--code markup--p-code">ControllerResolver</code> lui-même appelé par le <code class="markup--code markup--p-code">HTTPKernel</code> (qui est chargé de gérer les I/O avec le client HTTP). <br />Le <code class="markup--code markup--p-code">ControllerResolver</code> va rechercher la clef <code class="markup--code markup--p-code">_controller</code> au sein de la propriété <code class="markup--code markup--p-code">attributes</code> de l’objet <code class="markup--code markup--p-code">Request</code>.<br />La clef <code class="markup--code markup--p-code">_controller</code> est placée au sein de l’objet <code class="markup--code markup--p-code">Request</code> par le <code class="markup--code markup--p-code">RouterListener</code>.</p><p id="f246" class="graf graf--p graf-after--p">La chaîne de caractère contenu dans la clef <code class="markup--code markup--p-code">_controller</code> est convertie selon les conventions de nommages de Symfony : <code class="markup--code markup--p-code">AcmeDemoBundle:Default:index </code>devenant : <code class="markup--code markup--p-code">Acme\DemoBundle\Controller\DefaultController::indexAction</code>.</p><p class="graf graf--p graf-after--p">Enfin si le contrôleur implémente l’interface <code class="markup--code markup--p-code">ContainerAwareInteface</code>, sa méthode <code class="markup--code markup--p-code">SetContainer</code> est appelée avec le conteneur de service en argument.</p><h4 id="f9fc" class="graf graf--h4 graf-after--p">Arguments de requêtes</h4><p id="fb26" class="graf graf--p graf-after--h4">Lors de l’appel de la méthode <strong class="markup--strong markup--p-strong">action</strong> correspondante à la ressource demandée, une introspection par <strong class="markup--strong markup--p-strong">réflexion</strong> est effectuée sur ses paramètres :<br />Si un paramètre a le même nom qu’une clef du conteneur d’attributs de l’objet <code class="markup--code markup--p-code">Request</code> (<strong class="markup--strong markup--p-strong">Attributes bag</strong>) il est passé comme argument à la méthode. Vous noterez que le conteneur d’attribut contient les attributs de la requête HTTP, mais contient aussi des informations complémentaires ajoutées par les systèmes de résolution précédents.</p><p class="graf graf--p graf-after--p">Si la méthode attend un objet de type <code class="markup--code markup--p-code">Request</code> alors l’objet <code class="markup--code markup--p-code">Request</code> lui est passé en direct.</p><pre id="bc60" class="graf graf--pre graf-after--p">Exemple :<br />//the current Request objet is given to the function <br />public function indexAction(Request $request) {}</pre><pre class="graf graf--pre graf-after--pre">//if a name attribute exist in the Request’s parameters bag his value is given to the method<br />public function indexAction($name)</pre><h4 id="f734" class="graf graf--h4 graf-after--pre">Views</h4><p class="graf graf--p graf-after--h4">Les vues peuvent être construites par l’action du contrôleur ou, si l’action ne retourne pas d’objet <code class="markup--code markup--p-code">Response</code>, lors de l’appel à l’événement <code class="markup--code markup--p-code">kernel.view</code> (par exemple le <code class="markup--code markup--p-code">SensioFrameworkExtraBundle</code> ajoute un écouteur sur cet événement afin de résoudre une vue déclarée en annotation.<br />Le <code class="markup--code markup--p-code">FosRestBundle</code> est aussi branché dessus pour construire les différents types de réponses : html, json, xml, … ).</p><h4 class="graf graf--h4 graf-after--p">Exceptions</h4><p class="graf graf--p graf-after--h4">En plus de la gestion classique de la résolution des <code class="markup--code markup--p-code">Exception</code>s Symfony intègre une stack de résolution complémentaire :</p><p class="graf graf--p graf-after--p">Toute exception non capturée pendant la phase de traitement au sein du contrôleur (<code class="markup--code markup--p-code">HttpKernel::handle</code>) est capturée par le <code class="markup--code markup--p-code">HttpKernel</code>qui va alors déclencher un événement <code class="markup--code markup--p-code">kernel.exception</code>.</p><p class="graf graf--p graf-after--p">Au sein de Symfony deux principaux systèmes écoutent les exceptions :</p><ul class="postList"><li id="a713" class="graf graf--li graf-after--p">Le <code class="markup--code markup--li-code">HttpKernel\EventListener\ExceptionListener</code> il se charge de transformer l’exception en un retour lisible par le client (par la création d’un objet <code class="markup--code markup--li-code">FlattenException</code>). Si l’exception implémente la <code class="markup--code markup--li-code">HttpExceptionInterface</code> alors l’exception sert à construire un retour avec un code d’erreur Http spécifique (récupéré à l’aide de la méthode <code class="markup--code markup--li-code">getStatusCode</code> de l’exception).</li><li class="graf graf--li graf-after--li graf--trailing">Le <code class="markup--code markup--li-code">Symfony\Component\Security\Http\Firewall\ExceptionListener</code> est chargé de gérer les exceptions de sécurité (tentative d’accès à des zones non autorisés). C’est lui aussi qui se charge de rediriger l’utilisateur vers la page de login si nécessaire.</li></ul></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h3 class="graf graf--h3 graf--leading">Traduction</h3><p class="graf graf--p graf-after--h3">Le composant de traduction est chargé d’adapter la langue affichée à l’utilisateur en fonction d’une variable de localisation.</p><p class="graf graf--p graf-after--p"><strong class="markup--strong markup--p-strong">Attention</strong> : Il ne faut pas confondre le système de traduction avec le système de localisation bien que ces deux systèmes fonctionnent de concert. En effet le système de traduction propose la même interface en plusieurs langues quand le système de localisation adapte les affichages en fonction des coutumes comme le format de date, la monnaie, l’affichage des chiffres, etc.</p><p id="a0cb" class="graf graf--p graf-after--p">La locale (la langue) est définie au sein de l’objet <code class="markup--code markup--p-code">Request</code> défini par l’attribut <code class="markup--code markup--p-code">_locale</code>, il vous est possible de la définir au sein du système de routing.</p><p class="graf graf--p graf-after--p">La résolution des traductions se fait à partir de la locale de l’utilisateur (<strong class="markup--strong markup--p-strong">fr\_FR</strong> si vous êtes français, <strong class="markup--strong markup--p-strong">fr\_BE</strong> si vous êtes belge…) si celle-ci n’a pas de fichier de traduction correspondant le système tente de trouver une traduction dans la langue correspondante (les valeurs <strong class="markup--strong markup--p-strong">fr\_FR</strong> et <strong class="markup--strong markup--p-strong">fr\_BE</strong> deviennent <strong class="markup--strong markup--p-strong">fr</strong>). Enfin si la langue n’est pas trouvée, le système passe sur la locale par défaut stocké au sein du paramètre <code class="markup--code markup--p-code">translator: {fallback: en}</code> du fichier <code class="markup--code markup--p-code">config.yml</code>.</p><p class="graf graf--p graf-after--p">Les fichiers de traductions doivent avoir la forme <code class="markup--code markup--p-code">messages.{langue}.yml</code> (ex: <code class="markup--code markup--p-code">messages.fr.yml</code>). Le terme de messages peut être modifié, mais il ne s’agit pas du sujet de cette présentation. Ils peuvent être placés aux emplacements :</p><ul class="postList"><li class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">Resources/translations</code></li><li id="a398" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">Resources/{BundleName}/translations</code></li><li class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">Resources/translations</code> au sein d’un Bundle spécifique</li></ul><p class="graf graf--p graf-after--li">Ces fichiers sont bien évidemment fusionnés dans cet ordre, ainsi une clé de traduction placée dans <code class="markup--code markup--p-code">Resources/translations</code> écrasera la même clé si elle existe dans <code class="markup--code markup--p-code">Resources/{BundleName}/translation</code> et ainsi de suite.</p><p id="c23a" class="graf graf--p graf-after--p">Encore une fois le système de traduction se base sur le système de gestion de configuration de Symfony et notamment la <code class="markup--code markup--p-code">LoaderInterface</code> ainsi vous pouvez définit vos traductions en XML, Yml ou PHP.</p><div class="aspectRatioPlaceholder is-locked"><div class="aspectRatioPlaceholder-fill"><img class="graf-image" src="https://cdn-images-1.medium.com/max/1600/1*pDaPTyCOGJUEakzq0PfHFw.png" alt="image" /></div>Diagramme de résolution d’une requête HTTP au sein du framework Symfony, licence <a href="http://creativecommons.org/licenses/by-sa/3.0/" class="markup--anchor markup--figure-anchor" rel="license nofollow noopener" target="_blank"><em class="markup--em markup--figure-em">Creative Commons BY-SA 3.0</em></a><em class="markup--em markup--figure-em"> publié initialement sur le</em><a href="http://symfony.com/doc/current/components/http_kernel.html" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank"><em class="markup--em markup--figure-em"> site de Symfony</em></a><em class="markup--em markup--figure-em"> par SensioLabs.</em></div></div><div class="section-divider"><hr class="section-divider" /></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><p class="graf graf--p graf--leading"><em class="markup--em markup--p-em">J’espère que cet article vous permettra d’éclaircir certains points de la résolution d’une requête HTTP par Symfony.<br />Si vous l’avez apprécié, n’hésitez pas à le partager !</em></p><p id="c567" class="graf graf--p graf-after--p graf--trailing"><a href="https://twitter.com/Lilobase" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Vous pouvez me retrouver sur Twitter</a>.</p></div></div></div></div>


title: API : de l'artisanat à l'industrialisation (2/2) - D2SI Blog
url: http://blog.d2-si.fr/2017/02/07/api-microservices/
created_at: 2017-08-10 23:21:49
updated_at: 2017-08-10 23:21:49
mimetype: text/html
domain_name: blog.d2-si.fr
preview_picture: http://blog.d2-si.fr/wp-content/uploads/2017/02/D2SI_Blog_Image_API_Interview_MehdiM_2.jpg
http_status: 200
content:
  <h4>Twitter, Facebook, Uber… tous les jours vous utilisez des APIs, peut-être sans le savoir : <a href="https://www.programmableweb.com/" target="_blank">Programmable Web </a>en recense plus de 16 000. Pour faire le point sur les APIs et leur rôle dans la transformation digitale de l’économie, nous avons rencontré <a href="https://about.me/m.medjaoui" target="_blank">Mehdi Medjaoui</a> fondateur d’<a href="http://www.apidays.io/" target="_blank">API Days</a> (voir notre compte-rendu sur <a href="http://blog.d2-si.fr/2017/01/05/api-days-paris/" target="_blank">API Days Paris</a>) et co-fondateur de <a href="https://oauth.io/" target="_blank">OAuth.io</a>.</h4>
  <h4>Dans <strong><a href="http://blog.d2-si.fr/2017/02/02/industrialisation-api/" target="_blank">la première partie cette interview</a></strong>, nous avons abordé le rôle des des API et le changement culturel que représente leur ouverture. Nous discutons aujourd’hui de la généralisation du protocole REST, de la tendance des microservices, et du nécessaire équilibre entre automatisation et désautomatisation dans la conception des API.</h4>
  <p><strong>Quelle est la tendance actuelle sur la façon de faire les API ? Est-ce qu’il y a une normalisation ?</strong></p>
  <p>« <em>The next big thing is small</em> » :</p>
  <p>Depuis 10 ans environ la tendance est d’aller vers le plus petit, le plus léger, et notamment le protocole REST, qui fonctionne sur la bases de ressources. On part du principe que tout est une ressource sur le web, et on navigue à travers les URL pour trouver chaque ressource, qui est liée aux autres par des liens URL. Il y aussi JSON depuis 2008, un langage d’écriture de données issu de Javascript, mais plus léger, qui à la particularité d’être lisible facilement par les humains et les machines, et qui s’inscrit dans cette tendance. Plus petit, plus léger : les microservices répondent complètement à ces impératifs. L’idée est qu’au lieu de concevoir de grosses plateformes APIs, qui font plein de choses, il s’agit de se focaliser sur des APIs plus spécialisées, qui ne remplissent qu’une seule fonction. Les API sont ainsi découpées en une multitude de petits services découplés les uns des autres.</p>
  <p><strong>Quels sont les avantages de l’approche microservices ?</strong></p>
  <p>Il est plus simple de comprendre ce que fait chaque API, il y a donc moins de risque de se tromper. Et chaque brique être interchangeable quand c’est nécessaire. Dans “<strong><a href="https://en.wikipedia.org/wiki/The_Design_of_Everyday_Things" target="_blank">The design of everyday things</a></strong>”, Donald Norman explique que dans un cockpit d’avion, chaque bouton a une seule fonction car il est important dans un contexte de production de comprendre ce qui se passe derrière chaque mécanisme. C’est la même chose avec les APIs dans le cadre des microservices : une API, une fonction. En transformant des monolithes en micro services, on facilite le refactoring. Mais cela suppose une gestion de l’automatisation très différente : il faut gérer des dizaines ou des centaines de services qui doivent tous être documentés, mis à jour, maintenus et fonctionnels. Il y a donc un juste milieu à trouver pour chaque entreprise entre l’inertie des APIs monolithiques et la gouvernance des microservices.</p>
  <div id="attachment_9462" class="wp-caption aligncenter"><img src="http://blog.d2-si.fr/wp-content/uploads/2017/02/D2SI_Blog_Image_Mehdi_APIDays-2-1024x683.jpg" alt="" width="755" height="504" class="wp-image-9462" /><p class="wp-caption-text">Mehdi Medjaoui lors des API Days</p></div>
  <p><strong>Quelles technologies dominent sur le marché ?</strong></p>
  <p>REST et JSON représentent la très grosse majorité des nouveaux services, mais cela dépend aussi du secteur. Dans la finance, on a plutôt du SOAP XML pour tout ce qui est legacy, idem dans le transport aérien…par contre, sur tous les nouveaux business, les startups on est souvent sur du REST et JSON. Et puis il y a GraphQL (créé par Facebook en 2015) qui émerge : en France, <a href="http://graphql.org/users/" target="_blank"><strong>Allociné, le ClubMed et 20 minutes</strong></a> l’utilisent déjà. Le souci de REST, c’est que quand il faut requêter beaucoup de ressources à la fois, on multiplie les appels au serveur, et potentiellement on le surcharge. GraphQL fonctionne suivant une logique différente, qui permet de requêter beaucoup de données en une seule fois, avec une seule requête sur un seul endpoint. Cela a permis par exemple d’économiser jusqu’à 60% de ressources serveurs dans à Github, première API publique en GraphQL. Cependant les développeurs sont tellement habitués aux interface REST qu’ils ont beau utiliser GraphQL en interne, ils ont gardé API REST par dessus. C’est ce qu’on appelle une “API facade”..</p>
  <p><strong>Quelles sont les activités nécessaires lorsqu’on met en place une API ?</strong></p>
  <p>Kin Lane, qui tient le blog <a href="https://apievangelist.com/blog/" target="_blank"><strong>API evangelist</strong></a>, a dressé une liste permettant de mesurer la maturité de son API. Ce sont les “<a href="https://kin-lane.github.io/buildingblock/" target="_blank"><strong>building blocks</strong></a>” d’une API. Prenons l’exemple de la documentation : avez-vous un quick start? Avez-vous des exemples? Avez-vous des morceaux de code qui peuvent être copiés collés? Est-ce que vous avez un support ? Un compte twitter? Comment faites vous vos tests? Kin Lane a ainsi identifié 80 étapes : savez vous qui utilise l’API ? Combien d’appels sont faits? Quelles sont vos APIs critiques ? Comment monitorez vous votre performance? Cela montre bien que la réflexion est une étape indispensable à l’automatisation (voir également <a href="http://apidocswriter.com/" target="_blank"><strong>le livre blanc de la documentation des API</strong></a>).</p>
  <p><img src="http://blog.d2-si.fr/wp-content/uploads/2017/02/D2SI_Blog_Image_API_MehdiMedjaoui_API_evangelist-821x1024.jpg" alt="" width="378" height="471" class="aligncenter wp-image-9487" /></p>
  <p><strong>Entre automatisation et désautomatisation, il y a un équilibre à trouver ?</strong></p>
  <p>La désautomatisation est encore un sujet très nouveau : pour beaucoup de développeurs ou de managers, le seul mandat c’est d’automatiser. Comme <strong><a href="https://github.com/mamund" target="_blank">Mike Amundsen</a></strong> , Directeur de l’Architecture de l’API Academy (CA Technologies) , le souligne, quand certaines sociétés se targuent de mettre du code en production 300 fois/jour, cela montre une certaine dérive. Il n’y a plus de vision, on pilote à vue. Il faut trouver un équilibre entre une mise en production tous les 3 mois et 300/jour. Mike Amundsen préconise 3 couches : une couche logicielle conçue pour le long terme, une couche API à moyen terme (qui ne bouge pas pendant 1 à 3 ans), et les microservices (2 semaines à 6 mois). On ne peut pas tout piloter en microservices, ni en mainframe ! L’API doit aussi durer un certain temps, parce que c’est un contrat entre un fournisseur de données/services et celui qui les consomme. Chacun doit pouvoir connaître la durée de vie de ce contrat. La grande question que pose l’automatisation, c’est de déterminer comment on équilibre court terme, moyen et long terme. Désautomatiser, c’est concevoir une stratégie, s’y tenir, tout en ayant une partie d’infrastructure prête à changer rapidement pour suivre l’évolution du marché. Ce n’est pas simple, mais c’est à ça que servent les conférences comme TIAD et API Days.</p>
  <p><strong>Est-ce qu’il y a un outillage particulier pour les API ?</strong></p>
  <p>Nous avons publié API landscape, qui recense plus de 100 compagnies qui fournissent des outils pour <a href="http://apilandscape.pagedemo.co/" target="_blank"><strong>concevoir, designer, documenter, manager ou intégrer les API</strong></a>, mais il y a aussi beaucoup d’open source. Parmi les tendances du moment, une stack se dégage : Swagger, qui s’appelle maintenant Open API Initiative, est un framework de description d’API. C’est lisible par les machines, et facile à écrire pour les humains! Une fois qu’on décrit son API dans format OAI, on peut générer des outils automatiques : de la documentation, des portails développeurs, des process de CI/CD, des tests, des SDK dans une dizaine de langages. De nombreuses autres plateformes existent. Mais aujourd’hui le coeur du mouvement, c’est la définition d’API, et OAI en particulier. Il en existe aussi d’autres comme API Blueprint et RAML.</p>
  <div id="attachment_9481" class="wp-caption aligncenter"><img src="http://blog.d2-si.fr/wp-content/uploads/2017/02/D2SI_Blog_Image_API_MehdiMedjaoui_API_land-1024x556.jpg" width="847" height="460" class="wp-image-9481" alt="image" /><p class="wp-caption-text">API Landscape – Voir lien plus haut pour le fichier haute résolution</p></div>
  <p><strong>Pour terminer, quels sont les prochains défis à relever ?</strong></p>
  <p>Aujourd’hui nous allons vers l’IoT, et les API sont appelées à communiquer avec des objets multiples. Cela suppose d’avoir une logique multi-channels pour pouvoir adresser tous les objets, plusieurs marchés, avec une seule plateforme. Il y a de forts enjeux derrière tout cela : une voiture connectée, c’est un smartphone d’une tonne qui roule à 120 km/h ! D’où l’importance de la désautomatisation lors des phases de design et de conception. Et puis il faut réfléchir à la place de la donnée dans notre monde. En 2008, Chris Andersen écrivait sur <a href="https://www.wired.com/2008/06/pb-theory/" target="_blank"><strong>la fin de la théorie</strong></a>, ou quand les nouveaux outils (Google, Twitter) permettent d’extraire des données en temps réel et mieux prévoir l’avenir (une épidémie de grippe, par exemple) que des modèles scientifiques. Quand la donnée amène plus de savoir que la science, il est indispensable de confier cette donnée à des gens qui réfléchissent à ce qu’ils en font. Parfois, pour pouvoir comprendre la mécanique à automatiser, il faut plonger les mains dans le cambouis et refaire la tâche manuellement, pour l’automatiser de la bonne manière. On ne doit pas en arriver à la <a href="http://www.liberation.fr/debats/2016/10/19/gare-a-la-datacratie-galopante_1523022" target="_blank"><strong>Datacratie</strong></a>, au point où c’est la donnée qui gouverne. La donnée est censée appuyer, aider, confirmer l’intelligence humaine, pas l’inverse. Comme l’a écrit Sénèque :</p>
  <blockquote>
  <p>Il n’est pas de vent favorable pour celui qui ne sait où il va</p>
  </blockquote>
  <h4><em>Pour rester informé de l’actualité des API et de l’automatisation, inscrivez-vous à la newsletter du <a href="http://tiad.io" target="_blank">TIAD</a> :</em></h4>
                  


title: API Platform 2 : un cadriciel pour créer des API Web hypermédia en quelques minutes
created_at: 2017-08-10 23:21:50
updated_at: 2017-08-10 23:21:50
mimetype: text/html
language: fr
domain_name: linuxfr.org
http_status: 200
url:
  https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes

content:
  <p>Après une année de développements et plus de 700 <em>commits</em> réalisés par plus d’une centaine de contributeurs à travers le monde, la nouvelle version d’API Platform vient d’être publiée. API Platform v2 est une réécriture profonde du cadriciel (<em>framework</em>) incluant une refonte complète de la conception, des ajouts de nouvelles fonctionnalités et des corrections de bogues.</p><p>API Platform est un <em>framework</em> libre (licence MIT) écrit en PHP 7 et basé sur <a href="https://fr.wikipedia.org/wiki/Symfony">Symfony</a> destiné à la création d’API Web modernes, puissantes et sécurisées. Cet outil est particulièrement adapté à la construction de systèmes d’informations « <em>API-centric</em> » basés sur l’<a href="https://en.wikipedia.org/wiki/HATEOAS">hypermédia</a> et le <a href="https://fr.wikipedia.org/wiki/Web_des_donn%C3%A9es">Web des données</a> (<em>linked data</em>). Il permet de réaliser facilement des applications d’une seule page (<a href="https://en.wikipedia.org/wiki/Single-page_application"><em>single‐page applications</em></a>) ou dédiées aux mobiles en utilisant des bibliothèques JavaScript telles que <a href="https://fr.wikipedia.org/wiki/React_%28JavaScript%29=">React</a> ou <a href="https://fr.wikipedia.org/wiki/AngularJS">AngularJS</a>.</p>
  <p>Le sponsor principal d’API Platform est la société coopérative lilloise <a href="https://les-tilleuls.coop">Les-Tilleuls.coop</a>. Il s’agit d’une <a href="https://fr.wikipedia.org/wiki/Soci%C3%A9t%C3%A9_coop%C3%A9rative_et_participative">SCOP</a> spécialisée dans la conception et la réalisation de logiciels comptant une vingtaine de salariés qui pratiquent l’autogestion et se partagent les bénéfices engrangés de manière égalitaire.</p>
  <p><img src="https://img.linuxfr.org/img/68747470733a2f2f64756e676c61732e66722f77702d636f6e74656e742f75706c6f6164732f323031362f31312f4150492d506c6174666f726d2d64656d6f2e706e67/API-Platform-demo.png" alt="Capture d'écran" title="Source : https://dunglas.fr/wp-content/uploads/2016/11/API-Platform-demo.png" /></p>
  <p>En seconde partie de la dépêche, vous trouverez une traduction en français de l’annonce de sortie de cette version deux, qui revient sur les fonctionnalités principales du cadriciel.</p>
  <ul class="toc"><li><ul><li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#exposer-une-api-en-quelques-secondes-grâce-au-nouveau-système-des-configuration-et-de-métadonnées">Exposer une API en quelques secondes grâce au nouveau système des configuration et de métadonnées</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#intégration-de-docker">Intégration de Docker</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#un-générateur-de-modèle-de-données-amélioré">Un générateur de modèle de données amélioré</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#la-négociation-de-contenu-et-le-support-intégré-pour-json-ld-hydra-hal-yaml-csv-et-xml">La négociation de contenu et le support intégré pour JSON-LD, Hydra, HAL, YAML, CSV et XML</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#une-interface-utilisateur-pratique-et-une-documentation-swagger2-automatique">Une interface utilisateur pratique et une documentation Swagger 2 automatique</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#de-nouveaux-filtres">De nouveaux filtres</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#sécurisé-par-défaut-respectant-les-recommandations-de-lowasp">Sécurisé par défaut, respectant les recommandations de l’OWASP</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#amélioration-des-performances">Amélioration des performances</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#mise-à-disposition-en-tant-que-composants-autonomes-dissociés-de-symfony-et-doctrine">Mise à disposition en tant que composants autonomes, dissociés de Symfony et Doctrine</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#qualité-du-code-et-tests-automatisés">Qualité du code et tests automatisés</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#réécriture-de-la-documentation-et-nouveau-site-web">Réécriture de la documentation et nouveau site Web</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#une-communauté-en-plein-essor">Une communauté en plein essor</a></li>
  <li><a href="https://linuxfr.org/news/api-platform-2-un-cadriciel-pour-creer-des-api-web-hypermedia-en-quelques-minutes#les-prochaines-étapes">Les prochaines étapes</a></li>
  </ul></li>
  </ul><p>API Platform repose sur trois principes fondateurs :</p>
  <ol><li>créer une API facilement et rapidement : n’importe quel développeur Web doit pouvoir créer une API REST et obtenir le support du <a href="https://fr.wikipedia.org/wiki/CRUD">CRUD</a>, une documentation auto‐générée, l’authentification via JSON Web Token ou <a href="https://fr.wikipedia.org/wiki/OAuth" title="Définition Wikipédia">OAuth</a>, la gestion des en‐têtes <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing" title="Cross‐origin resource sharing">CORS</a>, la validation des données, les tris et les filtres, le cache, etc. ;</li>
  <li>les formats ouverts modernes sont gérés nativement, sans demander de travail supplémentaire pour le développeur : Swagger/OpenAPI, JSON-LD, Hydra, HAL, API Problem (RFC 7807), Schema.org sont pris en charge par défaut et la couche d’abstraction fournie par le cadriciel permet d’ajouter facilement le prise en charge d’autres nouveaux formats d’API (JSON API et GraphQL sont actuellement en cours de développement) ;</li>
  <li>chaque fonctionnalité du cadriciel doit être extensible, modulaire et débrayable.</li>
  </ol><h3>Exposer une API en quelques secondes grâce au nouveau système des configuration et de métadonnées</h3>
  <p>Grâce au nouveau système de configuration et au composant de métadonnées (la couche d’abstraction entre les différents formats pris en charge), vous pouvez créer de manière très simple une API hypermédia de qualité en modélisant vos données sous forme de classes PHP et en ajoutant quelques annotations.</p>
  <p>Exemple :</p>
  <pre class="php">&lt;?php
  // src/AppBundle/Entity/Book.php
  namespace AppBundle\Entity;
  use ApiPlatform\Core\Annotation\ApiResource;
  use Doctrine\ORM\Mapping as ORM;
  use Symfony\Component\Validator\Constraints as Assert;
  /**
   * A book.
   *
   * @ApiResource
   * @ORM\Entity
   */
  class Book
  {
      /**
       * @var int The id of this book.
       *
       * @ORM\Id
       * @ORM\GeneratedValue
       * @ORM\Column(type="integer")
       */
      public $id;
      /**
       * @var string|null The ISBN number of this book (or null if it doesn't have one).
       *
       * @ORM\Column(nullable=true)
       * @Assert\Isbn
       */
      public $isbn;
      /**
       * @var string The title of this book.
       *
       * @ORM\Column
       * @Assert\NotBlank
       */
      public $title;
      // Prefer private properties, accessors and mutators in real applications
  }</pre>
  <p>Cette classe est suffisante pour obtenir une API fonctionnelle, supportant les fonctionnalités suivantes :</p>
  <ul><li>des <a href="https://api-platform.com/docs/core/operations">opérations CRUD</a> ;</li>
  <li>la <a href="https://api-platform.com/docs/core/validation">validation des données</a> et la sérialisation des erreurs aux formats JSON-LD, Swagger et Hydra ;</li>
  <li>la <a href="https://api-platform.com/docs/core/pagination">pagination</a> ;</li>
  <li>une interface utilisateur agréable et une documentation autogénérée utilisant les données de la PHPDoc.</li>
  </ul><p>Consultez la <a href="https://demo.api-platform.com/">démo</a> pour tester un exemple plus avancé (<a href="https://github.com/api-platform/demo/">code source</a> de seulement deux classes) !</p>
  <p>Les relations hypermédias entre les différentes ressources exposées par l’API sont gérées nativement. Utiliser n’importe quelle autre fonctionnalité d’API Platform consiste juste à ajouter quelques lignes de configuration. Découvrez ça dans le <a href="https://api-platform.com/docs/distribution/">guide de démarrage</a>.</p>
  <p>Si vous n’aimez pas les annotations, vous pouvez utiliser les fichiers de configuration au format XML ou YAML à la place. Si vous n’aimez pas la correspondance objet‐base de données (<a href="https://fr.wikipedia.org/wiki/Mapping_objet-relationnel" title="Object‐Relational Mapping">ORM</a>) de <a href="https://fr.wikipedia.org/wiki/Doctrine_%28ORM%29">Doctrine</a> ou si vous ne souhaitez pas utiliser le validateur de <a href="https://fr.wikipedia.org/wiki/Symfony">Symfony</a>, vous pouvez créer des adaptateurs pour brancher votre code personnalisé et utiliser vos bibliothèques préférées. En somme, API Platform a été conçu pour être complètement extensible.</p>
  <h3>Intégration de Docker</h3>
  <p>La distribution officielle d’API Platform est fournie avec une configuration Docker adaptée au développement d’API. Cela inclut Apache et PHP 7 et une image de MySQL. Pour faire fonctionner une application API Platform de manière optimisée sur votre machine, tapez les commandes suivantes dans son répertoire racine :</p>
  <pre class="bash">$ docker-compose up -d # Télécharge, construit et exécute les images Docker
  $ docker-compose exec web bin/console doctrine:schema:create # Crée le schéma MySQL, nécessaire une seule fois</pre>
  <p>Une fois que l’application est démarrée, rendez vous sur <a href="http://localhost/">http://localhost/</a> pour commencer à jouer avec votre API.</p>
  <p>Les images d’API Platform peuvent également être déployées en production facilement en utilisant Docker Swarm (Amazon Web Services, Azure…) ou Google Container Engine (avec Kubernetes).</p>
  <h3>Un générateur de modèle de données amélioré</h3>
  <p>Au lieu de créer votre propre modèle de données, pourquoi ne pas réutiliser des vocabulaires ouverts comme le très populaire Schema.org et ainsi profiter de la puissance du Web des données et du Web sémantique ? Exactement comme le fait Google, mais grâce à un cadriciel 100 % libre.</p>
  <p>Depuis sa première sortie, API Platform est fourni avec un générateur de code permettant de créer un modèle de données en PHP incluant les classes, les propriétés, les accesseurs et mutateurs (<em>getters</em> et <em>setters</em>), une PHPDoc complète, les correspondances avec l’ORM Doctrine, les annotations de validation et la correspondance avec le vocabulaire externe pris en charge par API Platform. Ce générateur a été mis à jour afin d’être compatible avec la nouvelle configuration d’API Platform 2. Grâce à ce générateur couplé au système de création d’API d’API Platform, vous pouvez réaliser une API fonctionnelle sans écrire une seule ligne de PHP :</p>
  <pre class="yaml">types:
      Book:
          parent: false # Generate only one class, not the full hierarchy from Schema.org
          properties:
              isbn: ~
              name: ~
              description: ~
              author: { range: Text }
              dateCreated: ~
      Review:
          parent: false
          properties:
              reviewBody: ~
              rating: { range: Integer, nullable: false } # This is a custom field that doesn't exist in the vocab
              itemReviewed: { range: Book, nullable: false, cardinality: '(*..1)' }</pre>
  <p>Découvrez‐en plus au sujet du générateur dans la <a href="https://api-platform.com/docs/schema-generator/getting-started">documentation</a> et la <a href="https://github.com/api-platform/demo/pull/3">démo</a>.</p>
  <h3>La négociation de contenu et le support intégré pour JSON-LD, Hydra, HAL, YAML, CSV et XML</h3>
  <pre class="yaml"># app/config/config.yml
  api_platform:
      formats:
          jsonld:  ['application/ld+json']
          jsonhal: ['application/hal+json']
          xml:     ['application/xml', 'text/xml']
          json:    ['application/json']
          yaml:    ['application/x-yaml']
          csv:     ['text/csv']
          html:    ['text/html'] # This is the API Platform UI</pre>
  <p>Cette configuration donne accès à l’ensemble des formats disponibles (Symfony 3.2 — actuellement en version candidate — est requis pour la prise en charge du <a href="https://fr.wikipedia.org/wiki/YAML" title="YAML Ain’t a Markup Language — YAML n’est pas un langage de balisage">YAML</a> et du <a href="https://fr.wikipedia.org/wiki/Comma-separated_values" title="Comma‐separated_values — Valeurs séparées par des virgules">CSV</a>). Dès lors, vous pouvez préciser le format souhaité à travers l’interface utilisateur ; en utilisant les en‐têtes HTTP adéquats, ou en ajoutant le nom du format en extension de n’importe quelle adresse URL de l’API (exemple : <a href="https://demo.api-platform.com/books.jsonld">https://demo.api-platform.com/books.jsonld</a>). L’ajout et l’utilisation de formats non pris en charge par défaut peuvent être réalisés en écrivant des adaptateurs personnalisés.</p>
  <p><a href="https://api-platform.com/docs/core/content-negotiation">Découvrez plus de détails au sujet de la négociation de contenu dans API Platform</a>.</p>
  <h3 id="une-interface-utilisateur-pratique-et-une-documentation-swagger2-automatique">Une interface utilisateur pratique et une documentation Swagger 2 automatique</h3>
  <p>API Platform 2 génère une documentation extensive au format <a href="http://swagger.io/getting-started/">Swagger 2</a> / <a href="https://en.wikipedia.org/wiki/OpenAPI_Specification">OpenAPI</a>. Toutes les adresses URL et types sont automatiquement décrits grâce à notre système d’extraction des méta‐données.</p>
  <p>Une interface Web construite à partir de Swagger UI est aussi automatiquement mise à disposition. Faites appel à n’importe quelle adresse URL de l’API en utilisant un navigateur Web et (grâce à l’en‐tête HTTP <code>Accept</code> envoyé par le navigateur) API Platform va afficher la requête envoyée à l’API, ainsi que la réponse reçue dans une interface Web agréable. Une documentation humainement compréhensible de l’opération en cours sera également affichée.</p>
  <p><img src="https://img.linuxfr.org/img/68747470733a2f2f64756e676c61732e66722f77702d636f6e74656e742f75706c6f6164732f323031362f31312f4150492d506c6174666f726d2d55492e706e67/API-Platform-UI.png" alt="Doc" title="Source : https://dunglas.fr/wp-content/uploads/2016/11/API-Platform-UI.png" /></p>
  <p>Explorez la page d’accueil de votre API pour découvrir la documentation de toutes les opérations disponibles, incluant la description de toutes les ressources et propriétés extraites des méta‐données PHP. Utilisez le bac à sable pour jouer avec votre API.</p>
  <h3 id="de-nouveaux-filtres">De nouveaux filtres</h3>
  <p>Quelques nouveaux filtres ont été ajoutés en complément des filtres existants de recherche, d’ordre, de tri ou de date :</p>
  <ul><li>le filtre <a href="https://api-platform.com/docs/core/filters#boolean-filter">booléen</a> permettant de filtrer les propriétés booléennes ;</li>
  <li>le filtre <a href="https://api-platform.com/docs/core/filters#numeric-filter">numérique</a> permettant de filtrer les champs numériques.</li>
  </ul><p>Ces filtres sont désormais disponibles depuis l’interface utilisateur et documentés dans les formats Hydra et Swagger. <a href="https://api-platform.com/docs/core/filters">Découvrez comment ajouter des filtres dans votre collection d’API</a>.</p>
  <p>Les filtres sont désormais implémentés grâce à l’utilisation du tout nouveau système d’extension. Ce système permet de se brancher aux processus de génération des requêtes base de données afin de les modifier. Il est particulièrement utile pour implémenter des fonctionnalités de sécurité. <a href="https://api-platform.com/docs/core/extensions">Découvrez comment exploiter le mécanisme d’extension pour filtrer le résultat d’un point d’entrée en fonction du rôle de l’utilisateur connecté</a>.</p>
  <h3>Sécurisé par défaut, respectant les recommandations de l’OWASP</h3>
  <p>Toutes les fonctionnalités d’API Platform 2 suivent les recommandations de sécurité édictée par l’<a href="https://www.owasp.org">OWASP</a>. Nous avons créé une suite de tests pour nous assurer que toutes ces recommandations soient respectées et documentées. <a href="https://github.com/api-platform/core/tree/master/features/security">Découvrez comment API Platform 2 sécurise votre API</a>.</p>
  <h3>Amélioration des performances</h3>
  <p>Nous sommes continuellement en train d’améliorer les performances d’API Platform et des composants Symfony que le cadriciel utilise (comme le sérialiseur ou le composant PropertyAccess). Cette nouvelle version est plus rapide que la version 1 et optimise automatiquement les requêtes SQL en fonction des groupes de sérialisation. API Platform 2 est également compatible avec PHP PM. En l’utilisant, les temps de réponse de l’API sont divisés par dix.</p>
  <h3>Mise à disposition en tant que composants autonomes, dissociés de Symfony et Doctrine</h3>
  <p>API Platform est conçu comme un ensemble de composants PHP indépendants : son système de méta‐données, les sérialiseurs JSON-LD, Hydra, Swagger et HAL, les ponts vers Doctrine et Symfony, etc. Tous ces composants peuvent être utilisés séparément pour créer votre propre API. Pour le moment, la bibliothèque Core doit être téléchargée, mais une sous‐division du dépôt principal (<em>subtree split</em>) sera disponible pour la version 2.1. Elle permettra l’installation spécifique d’un composant. Les classes spécifiques peuvent déjà être utilisées séparément de la distribution standard et sans Symfony.</p>
  <p>Nous avons également déplacé le code suffisamment générique d’API Platform vers Symfony. Par exemple, le nouveau composant Symfony PropertyInfo a été extrait d’API Platform. Quelques corrections de bogues et des nouvelles fonctionnalités, telle que la prise en charge des profondeurs maximales de sérialisation ou encore des formats YAML et CSV au sein du Serializer de Symfony ont été réalisées durant le développement d’API Platform.</p>
  <p>L’<a href="https://en.wikipedia.org/wiki/Object-relational_mapping" title="Object‐relational mapping — Correspondance objet‐base de données">ORM</a> Doctrine n’a jamais été obligatoire pour utiliser API Platform, mais l’ensemble des interfaces permettant d’implémenter une infrastructure de persistance différente a été repensé et est désormais documenté.</p>
  <h3>Qualité du code et tests automatisés</h3>
  <p>Nous avons considérablement amélioré la qualité de code d’API Platform pour sa version deux. API Platform v1 était déjà testé via Behat. Dans la version deux, nous avons ajouté des tests unitaires supplémentaires, afin de prévenir les bogues et de démontrer que chaque classe respecte les principes <a href="https://fr.wikipedia.org/wiki/SOLID_%28informatique%29">SOLID</a>. La couverture du code est désormais de 96 %. Notre suite de tests est automatiquement lancée sous GNU/Linux (en utilisant Travis) et sous Windows (en utilisant AppVeyor).</p>
  <p>Nous avons également utilisé Scrutinizr et SensioLabs Insight afin de détecter les mauvaises pratiques et améliorer la qualité globale du code. API Platform est désormais noté 8,7/10 sur Scrutinizr et a reçu la médaille Platinum (meilleure évaluation, donc) sur Insight.</p>
  <h3>Réécriture de la documentation et nouveau site Web</h3>
  <p>La documentation a été améliorée et toutes les nouvelles fonctionnalités sont désormais documentées. Le guide de démarrage a été complètement réécrit. Un nouveau site Web construit avec React et Redux a également été développé. Il est notamment doté d’un puissant moteur de recherche fourni par Algolia.</p>
  <p><img src="https://img.linuxfr.org/img/68747470733a2f2f636f6d6d756e6974792e616c676f6c69612e636f6d2f646f637365617263682f696d672f73686f77636173652f6578616d706c652d617069706c6174666f726d2e676966/example-apiplatform.gif" alt="Doc" title="Source : https://community.algolia.com/docsearch/img/showcase/example-apiplatform.gif" /></p>
  <h3>Une communauté en plein essor</h3>
  <p>API Platform, c’est plus de cent contributeurs à travers le monde, une équipe principale composée de Hamza Amrouche , Antoine Bluchet, Samuel Roze, Teoh Han Hui, Théo Fidry, Vincent Chalamon et Kévin Dunglas), des ateliers et des conférences données à travers le monde (d’ailleurs, ne loupez pas l’atelier API Platform de demain lors de la <em>Symfony Con</em> de Berlin).</p>
  <p>API Platform est régulièrement classé dans les dépôts PHP les plus populaires de GitHub auprès de grands projets tels que Laravel, Symfony et Wordpress. Nous avons d’ailleurs dépassé le millier d’étoiles sur GitHub début novembre ! Des formations, des prestations de développements, un support commercial, ainsi que les ateliers sont dispensés dans toute l’Europe par <em>Les-Tilleuls.coop</em>, principal sponsor du cadriciel.</p>
  <p>Merci à toutes les personnes qui ont travaillé sur ces développements, à celles qui ont contribué à la documentation ou qui ont participé à populariser API Platform ! Ce projet ne serait rien sans vous !</p>
  <h3>Les prochaines étapes</h3>
  <p>La sortie de la version 2 d’API Platform n’est que la première étape ! Nous travaillons déjà sur de nouvelles fonctionnalités et certaines sont déjà sur le point d’être intégrées à la branche 2.1 :</p>
  <ul><li>le prise en charge native de MongoDB et de JSON API ;</li>
  <li>une auto‐génération de l’administration via l’utilisation de React et <em>Admin on Rest</em>.</li>
  </ul><p>Restez à l’écoute des prochaines mises à jour ! Si vous ne l’avez pas encore fait, c’est l’occasion ou jamais de <a href="https://api-platform.com/docs/distribution/">tester API Platform</a> !</p>
  <p>Si vous aimez le projet, vous pouvez nous aider en nous donnant une étoile sur GitHub !</p>


title: Comment la NSA peut déchiffrer les communications sur Internet
created_at: 2017-08-10 23:21:52
updated_at: 2017-08-10 23:21:52
mimetype: text/html
language: fr
domain_name: www.01net.com
preview_picture: http://www.01net.com/i/0/0/ea9/fbd0de036e83fbfb2d1fe0f13ba19.jpg
http_status: 200
url:
  http://www.01net.com/actualites/comment-la-nsa-peut-dechiffrer-les-communications-sur-internet-1049059.html

content:
  <p>Depuis presque deux ans, on sait que la NSA était capable – et l'est peut-être toujours – de déchiffrer une grande partie du trafic Internet. En décembre 2014, le magazine Spiegel avait publié toute une <a href="http://www.01net.com/actualites/ce-que-la-nsa-peut-dechiffrer-et-ce-qui-lui-reste-inaccessible-638769.html" target="_blank">série de documents d'Edward Snowden</a> montrant que l'agence américaine parvenait à lire les flux TLS/SSL, IPSec et VPN sans grande difficulté. Mais comment fait-elle? Quatre cryptographes de l'université de Pennsylvanie, du CNRS, de l'INRIA et de l'université de Lorraine viennent peut-être de trouver une partie de la réponse. Dans une <a href="https://eprint.iacr.org/2016/961.pdf" target="_blank">étude</a>, ils montrent qu'il est possible d'introduire dans certaines techniques cryptographiques des portes dérobées qui facilitent considérablement le calcul de déchiffrage sans que personne ne puisse jamais s'en rendre compte.</p>
  <h3>La faille des nombres premiers</h3>
  <p>En l'occurrence, ces chercheurs se sont penchés sur les algorithmes DSA (Digital Signature Algorithm) et – surtout – Diffie-Hellman. De nature asymétrique, celui-ci est utilisé dans un grand nombre de protocoles Internet pour échanger des clés de chiffrement, dont TLS/SSL, SSH et IPSec. Sa sécurité réside dans le fait qu'il est mathématiquement difficile d'inverser l'exponentiation d'un nombre (c'est-à-dire de calculer son logarithme discret). Cet algorithme s'appuie sur des nombres premiers de grande taille.</p>
  <p>Certes, il existe un procédé pour casser un tel chiffrement, appelé « crible algébrique » (« Number Field Sieve » en anglais). Mais il n’est réellement efficace que pour des clés de faible taille. Ainsi, pour casser une clé de 1024 bits, il faut théoriquement une puissance de calcul de 45 millions de cœur-années, c’est-à-dire faire tourner 45 millions de cœurs de calcul pendant un an. Or, ces quatre chercheurs viennent de montrer qu’il était possible de casser une telle clé avec seulement 400 cœurs-années, soit environ deux mois, avec l’infrastructure universitaire qui était à leur disposition.</p>
  <p>L’astuce consiste à prendre des nombres premiers ayant des caractéristiques mathématiques très particulières, de telle sorte que le crible algébrique se déroule beaucoup plus vite. Les chercheurs montrent non seulement qu’il est assez facile de construire de tels nombres premiers, mais en plus qu’ils ne sont pas aisément détectables.</p>
  <h3>Peu de variété dans les implémentations</h3>
  <p>Or, il faut savoir que les implémentations cryptographiques actuelles utilisent tous plus ou moins les mêmes nombres premiers. Certains sont carrément codés en dur dans les codes source des logiciels. Et en plus la création de ces nombres premiers est rarement documentée ! Un acteur gouvernemental pourrait donc utiliser son influence pour incorporer dans un logiciel largement distribué un nombre premier au rabais sans que personne ne puisse s’en apercevoir. Le conseil que donnent les chercheurs est donc le suivant : utiliser des clés 2048 bits qui restent encore hors de portée quoi qu’il arrive.</p>
  <p>Ce n’est pas la première fois que des cryptographes se penchent sur les faiblesses de l’algorithme Diffie-Hellmann. En octobre 2015, <a href="https://weakdh.org/" target="_blank">une dizaine de chercheurs</a> avaient déjà estimé qu’un acteur gouvernemental pouvait casser une grande partie des clés 1024 bits s’il dispose d’une capacité de calcul suffisante. En effet, une grande partie du crible algébrique ne dépend que du nombre premier choisi. Ce calcul pouvant être fait à l’avance, il suffirait ensuite d’une trentaine de cœurs-années pour casser une clé 1024 bits. Ce qui n'est pas grand-chose.</p>


title: Antarctique : l’un des plus grands icebergs jamais vu vient de se détacher
created_at: 2017-08-10 23:21:54
updated_at: 2017-08-10 23:21:54
mimetype: text/html
language: fr
domain_name: www.futura-sciences.com
http_status: 200
url:
  http://www.futura-sciences.com/planete/actualites/climatologie-antarctique-plus-grands-icebergs-jamais-vu-vient-detacher-65488/

content:
  <div class="chapo delta mt1 mb1"><p class="delta py0p5">C'est fait. La fissure qui galopait ces sept derniers mois le long de la plateforme de glace Larsen C vient de rejoindre la mer. Un des plus grands icebergs jamais vu vient de naître. Aux premières loges pour l'observer, y compris durant la nuit australe et par mauvais temps : le satellite Sentinel-1. Que va-t-il se passer maintenant que cet iceberg géant s'est décroché ?</p></div><p>Ce qu'il faut retenir</p><ul class="toretain-list"><li class="toretain-item zeta">Le 12 juillet, la fissure dans la barrière de glace Larsen C, en Antarctique, apparue il y a plusieurs années, a atteint l’océan. Sa progression fut très rapide ces sept derniers mois.</li><li class="toretain-item zeta">Un iceberg géant, 50 fois plus grand que Paris et contenant autant d’eau que le lac Ontario, vient de naître.</li><li class="toretain-item zeta">Les scientifiques vont le surveiller de près. S’il se disloque, il pourrait dériver dans l’océan. Autrement, il pourrait se maintenir dans la même zone. Le reste de Larsen C devrait se fragmenter.</li></ul><p class="zeta py0p5">Le suspense dure depuis plusieurs mois mais l'heure du dénouement est arrivée : la longue fissure dans la plateforme de glace de Larsen C, au nord de l'<a href="http://www.futura-sciences.com/planete/actualites/climatologie-antarctique-plus-vert-jamais-39497/" title="L’Antarctique plus vert que jamais">Antarctique</a>, vient de rejoindre l'océan. C'est donc un des <a href="http://www.futura-sciences.com/planete/actualites/terre-b15a-plus-grand-iceberg-monde-brise-vagues-mysterieuses-9749/" title="B15A : le plus grand iceberg du monde brisé par des vagues mystérieuses...">plus grands icebergs</a> jamais observés (de mémoire d'Homme) qui vient de naître ce 12 juillet, sous les yeux des scientifiques. Alors que la nuit et l'hiver austral règnent sur la région, les images radar du satellite Copernic <a href="http://www.futura-sciences.com/sciences/actualites/astronautique-satellite-sentinel-1-son-radar-continuite-envisat-51349/" title="Le satellite Sentinel 1 et son radar dans la continuité d'Envisat">Sentinel-1</a> (ESA), indispensables dans ces conditions, témoignent du <a href="http://www.futura-sciences.com/planete/definitions/zoologie-velage-13293/" class="tooltip-link">vêlage</a> d'une pièce de glace grande comme deux fois le Luxembourg.</p><p class="zeta py0p5"><em>« Cet évènement est un épisode spectaculaire dans l'histoire récente des barrières de glace de l'<a href="http://www.futura-sciences.com/planete/definitions/geographie-antarctique-9777/" class="tooltip-link">Antarctique</a>, qui implique des forces au-delà de l'échelle humaine, dans un endroit où peu d'entre nous sont allés, et qui changera fondamentalement la géographie de cette région »</em> écrit dans <em><a href="https://theconversation.com/ive-studied-larsen-c-and-its-giant-iceberg-for-years-its-not-a-simple-story-of-climate-change-80529" title="I’ve studied Larsen C and its giant iceberg for years – it’s not a simple story of climate change" target="_blank">The Conversation</a></em> Adrian Luckman, glaciologue à l'université de Swansea, Royaume-Uni, et membre de l'équipe scientifique du projet Midas qui étudie de près la progression de cette fissure. Apparue il y a plusieurs années, elle a beaucoup attiré l'attention des médias et du public depuis début 2017. Son avancée rapide impressionne et, enfin, début juillet, les chercheurs savaient que son destin était scellé. <em>« Nous nous attendions à cela depuis des mois mais la rapidité de la rupture finale a été un peu une surprise</em>, déclare le chercheur à l'ESA. <em>Nous allons continuer à surveiller à la fois l'impact de ce vêlage sur la plateforme de glace Larsen C et le sort de cet <a href="http://www.futura-sciences.com/planete/actualites/climatologie-climatologie-icebergs-geants-capturent-co2-efficacement-61213/" title="Climatologie : les icebergs géants capturent le CO2 efficacement">énorme iceberg</a>. »</em></p><div class="sponsored-content-wrapper py2 px2 didyouknow clear"><h3 class="module-title first-capitalize t-alpha text-left">Le saviez-vous ?</h3><div class="sponsored-content-wrapper-inner border-color-light-green py1 px2 bg-gray-gallery"><p class="zeta py0p5">Le nom de Larsen donné aux plateformes de glace de la péninsule Antarctique fait référence à l’explorateur norvégien Carl Anton Larsen qui, dans les années 1890, fit leur découverte.</p></div></div><p class="zeta py0p5">La superficie du nouvel iceberg est de 6.000 km<sup>2</sup>, ce qui, en comparaison, équivaut à 50 fois la taille de Paris, ou un département français comme le Gard ou la Savoie. Quant à son poids, les chercheurs l'estiment à plus d'un million de millions de tonnes. Il contiendrait autant d'eau que le lac Ontario, situé à la frontière américano-canadienne. Va-t-il fondre tout de suite et se déverser dans l'océan ? Son avenir est encore difficile à prédire, répondent les chercheurs. Il ne devrait pas partir à la dérive mais plutôt se maintenir dans la région durant plusieurs décennies. Sauf s'il se désintègre..., livrant alors une mosaïque de petits morceaux à la dérive vers les eaux plus chaudes. Ce sont des questions auxquelles les scientifiques cherchent des réponses, surtout dans notre monde qui se réchauffe.</p><p class="zeta py0p5">Son influence restera toutefois imperceptible. Il ne représente que 10 % de Larsen C. Mais cette barrière qui cède morceau par morceau menace la stabilité des glaciers alentour. En tout cas, <em>« il n'y aura certainement pas d'effondrement imminent, sans aucun effet direct sur le niveau de la mer, car l'<a href="http://www.futura-sciences.com/sciences/questions-reponses/physique-icebergs-flottent-ils-7624/" title="Pourquoi les icebergs flottent-ils ?">iceberg est déjà à flot</a> et déplace son propre poids dans l'eau de mer »</em> explique le professeur Luckman. Du moins pas tout de suite. À terme, <em>« compte tenu uniquement des bassins versants de glaciers qui s'écoulent dans Larsen C, le total, même après des décennies, sera probablement inférieur à un centimètre ».</em></p><p class="zeta py0p5">Une partie des scientifiques, dont Luckman, pensent qu'à moyen terme, le reste de Larsen C, la quatrième plus grande plateforme de glace de l'Antarctique, aura le même sort que celui qu'ont connu Larsen A et B (en 1995 et en 2002), lesquels s'étaient désintégrés assez soudainement. Les satellites sont aux aguets.</p><div class="fs-media text-center py2"><div class="fluidiframe-wrapper"><iframe src="https://www.youtube.com/embed/806Uu6jHkrg?rel=0&amp;wmode=transparent" frameborder="0" allowfullscreen="allowfullscreen" class="fluidiframe"> </iframe></div><p class="mt1 bold">Progression de la faille dans Larsen C depuis un an. Animation créée à partir des images radar de Copernic Sentinel. © Copernicus Sentinel data (2016–17), Swansea University</p></div><p>Voir aussi :<a href="http://www.futura-sciences.com/planete/actualites/oceanographie-titanic-iceberg-ne-serait-pas-seule-cause-naufrage-37319/" title="Titanic : l'iceberg ne serait pas la seule cause du naufrage" class="color-hover-light-green">Titanic : l'iceberg ne serait pas la seule cause du naufrage</a></p><div class="readmore-wrapper pt2 pb2 row color-light-green relative"><p>Pour en savoir plus</p></div><p class="zeta py0p5"><em>Article de Nathalie Mayer publié le 6 juin 2017</em></p><p class="zeta py0p5"><strong>Une étendue de glace de près de 50 fois la superficie de Paris est sur le point de se détacher de l'Antarctique. L'un des plus grands icebergs jamais enregistrés pourrait alors se retrouver à voguer sur les flots. De quoi rendre plus vulnérable que jamais la <a href="http://www.futura-sciences.com/planete/definitions/climatologie-plate-forme-glaciaire-5944/" class="tooltip-link">barrière de glace</a> de Larsen C.</strong></p><p class="zeta py0p5">Jeudi 1<sup>er</sup> juin2017, par une ironie du sort, alors que Donald Trump annonce le retrait des États-Unis de l'<a href="http://www.futura-sciences.com/planete/actualites/rechauffement-climatique-cop-21-accord-non-contraignant-mais-accord-tout-meme-60866/" title="COP 21 : un accord non contraignant... mais un accord tout de même" target="_blank">accord de Paris</a>, des chercheurs britanniques de l'<a href="http://www.projectmidas.org/blog/another-step-closer/" title="Larsen C takes another step towards calving" target="_blank">université de Swansea</a> révèlent des données satellites montrant un phénomène exceptionnel. La <a href="http://www.futura-sciences.com/planete/definitions/structure-terre-faille-1065/" class="tooltip-link">faille</a> gigantesque qui fissure la barrière de glace de Larsen C, à l'ouest de l'<a href="http://www.futura-sciences.com/planete/actualites/climatologie-antarctique-plus-vert-jamais-39497/" title="L’Antarctique plus vert que jamais" target="_blank">Antarctique</a>, s'est allongée de pas moins de 17 kilomètres en seulement 6 jours. Et elle menace désormais de libérer dans l'océan un <a href="http://www.futura-sciences.com/planete/actualites/climatologie-climatologie-icebergs-geants-capturent-co2-efficacement-61213/" title="Climatologie : les icebergs géants capturent le CO2 efficacement" target="_blank">iceberg géant</a>.</p><p class="zeta py0p5">Le pan de glace en effet n'est plus relié au continent que sur 13 petits kilomètres. Si la crevasse continue à progresser à ce rythme, d'un jour à l'autre, c'est un iceberg de plus de 5.000 km<sup>2</sup> de superficie — et pas moins de 350 m d'épaisseur — qui se détachera, assurent les scientifiques.</p><p class="zeta py0p5">Rappelons qu'une barrière de glace — encore appelée plateforme glaciaire — comme celle de Larsen C est une épaisse étendue de glace flottant sur l'eau. Elle se forme lorsqu'un <a href="http://www.futura-sciences.com/planete/definitions/neige-glacier-15418/" class="tooltip-link">glacier</a> rejoint la côte et poursuit son extension sur la mer. Et celle de larsen C est la plus septentrionale de l'Antarctique. Émettre un iceberg de cette taille, reviendrait à lui faire perdre un dixième de sa superficie totale.</p><p class="zeta py0p5">En soi, toutefois, pas de quoi menacer le niveau des eaux. Car la glace en question reste accrochée, pour l'instant, au continent. Mais l'énorme barrière de glace de Larsen C retient, quelque sorte, les <a href="http://www.futura-sciences.com/planete/actualites/climatologie-rechauffement-climatique-glaciers-peninsule-antarctique-fondent-moins-vite-prevu-67226/" title="Réchauffement climatique : les glaciers de la péninsule Antarctique fondent moins vite que prévu" target="_blank">glaciers du nord de l’Antarctique</a>. Sans elle, et après la désintégration des plaques Larsen A et B, expliquent les chercheurs, la couverture de glace sera moins stable. Si elle venait à disparaître, ces glaciers se retrouveraient exposés à l'océan. Et le monde risquerait alors une montée des eaux de pas moins de 10 centimètres !</p><p class="zeta py0p5"><em>Article de <a href="http://www.futura-sciences.com/sciences/personnalites/sciences-laurent-sacco-1354/" class="tooltip-link">Laurent Sacco</a> republié le 06/05/2017</em></p><p class="zeta py0p5"><strong>Les plateformes glaciaires se forment et se brisent régulièrement en Antarctique en créant de grands icebergs tabulaires. Celles issues de la « famille Larsen » sont particulièrement instables en raison du <a href="http://www.futura-sciences.com/planete/definitions/climatologie-rechauffement-climatique-13827/" class="tooltip-link">réchauffement climatique</a>. Récemment, des chercheurs ont repéré sur l'une d'elles une nouvelle fracture longue d'une quinzaine de kilomètres. Mais fin 2016, ils avaient déjà découvert une faille profonde et longue de plus de 110 km. Aujourd'hui, elle n'en mesurerait déjà pas moins de 180 et pourrait donner naissance au plus grand iceberg du monde...</strong></p><p class="zeta py0p5"><em>Article paru le 08/12/2016</em></p><p class="zeta py0p5">Il y a quelques années, la désintégration de la <a href="http://www.futura-sciences.com/planete/actualites/climatologie-antarctique-plateforme-glaciaire-perd-85-surface-17-ans-38010/" title="Antarctique : une plateforme glaciaire perd 85 % de sa surface en 17 ans" target="_blank">plateforme glaciaire Larsen B</a> en Antarctique avait déjà fait parler d'elle car elle représentait une illustration frappante de l'effet du réchauffement climatique. Rappelons qu'une plateforme glaciaire, encore appelée barrière de glace, est très généralement une portion d'<a href="http://www.futura-sciences.com/planete/definitions/climatologie-inlandsis-5313/" class="tooltip-link">inlandsis</a> qui s'écoule et s'étend sur l'océan en bordure de l'Antarctique, du Groenland et dans l'archipel <a href="http://www.futura-sciences.com/planete/definitions/geographie-arctique-9779/" class="tooltip-link">arctique</a> canadien. </p><p class="zeta py0p5">Parfois, il peut s'agir aussi d'une portion de <a href="http://www.futura-sciences.com/planete/definitions/geologie-banquise-1352/" class="tooltip-link">banquise</a>, donc d'eau de mer gelée, recouverte d'une couche de neige compactée. Les plateformes glaciaires sont destinées à subir le vêlage et des icebergs tabulaires s'en détachent donc périodiquement au bout de quelques années ou décennies.</p><div class="fs-media text-center py2"><div class="fluidiframe-wrapper"><iframe frameborder="0" src="https://www.youtube.com/embed/H2a3Oemo1e4?wmode=transparent" class="fluidiframe"> </iframe></div><p class="mt1 bold">La dislocation de la barrière glaciaire Larsen B. Pour obtenir une traduction en français assez fidèle, cliquez sur le rectangle blanc en bas à droite. Les sous-titres en anglais devraient alors apparaître. Cliquez ensuite sur l'écrou à droite du rectangle, puis sur « Sous-titres » et enfin sur « Traduire automatiquement ». Choisissez « Français ». © Nasa, JPL</p></div><p class="zeta py0p5">Certaines barrières glaciaires peuvent rester stables durant plusieurs milliers d'années, mais cette persistance est rare. En contact à la fois avec l'océan et l'<a href="http://www.futura-sciences.com/planete/definitions/climatologie-atmosphere-850/" class="tooltip-link">atmosphère</a>, elles sont particulièrement sensibles aux variations d'un <a href="http://www.futura-sciences.com/planete/dossiers/climatologie-rechauffement-problemes-climatiques-36/" title="Réchauffement et problèmes climatiques" target="_blank">changement climatique</a> auxquelles elles répondent en général assez vite. C'est le cas, depuis une vingtaine d'années, des plateformes glaciaires disparues Larsen A et B. Elles constituent deux des trois segments de la barrière de Larsen associés à trois baies distinctes s'étendant le long de la côte orientale de la <a href="http://www.futura-sciences.com/planete/definitions/geologie-peninsule-11920/" class="tooltip-link">péninsule</a> Antarctique.</p><p class="zeta py0p5">La Nasa observe les barrières glaciaires dans le cadre de la <a href="http://www.futura-sciences.com/planete/actualites/climatologie-bref-icebridge-mission-etudier-glaces-polaires-45494/" title="En bref : IceBridge, une mission pour étudier les glaces polaires" target="_blank">mission IceBridge</a> débutée en 2009. Le 10 novembre 2016, ce suivi a permis de détecter une faille spectaculaire de plus de 110 km de long, 530 m de profondeur et 90 m de large entaillant la plateforme glaciaire Larsen C. À l'échelle du continent Antarctique, dont la taille est d'environ 5.500 km et qui est donc 50 fois plus étendu, ce n'est nullement préoccupant, même si cela traduit une fois de plus la menace que fait peser sur l'Antarctique le réchauffement climatique en cours.</p><p class="zeta py0p5">On doit en tout cas s'attendre dans un futur proche, mais encore indéterminé, à ce qu'un iceberg de la taille d'un département, de l'ordre de celui de la Drôme, se détache de la plateforme Larsen C.</p><div class="row"><div class="col-xs-12"><p><i class="icon-external">Liens externes</i></p></div></div>

preview_picture:
  http://fr.cdn.v5.futura-sciences.com/buildsv6/images/wide1920/9/4/e/94eb6a7dae_99592_icebridge-2016-pine-island-glacier-pig-rift.jpg


title: Travailler seul : quelques trucs pratiques
url: http://www.geek-directeur-technique.com/2017/05/15/travailler-seul-quelques-trucs-pratiques
created_at: 2017-08-10 23:21:57
updated_at: 2017-08-10 23:21:57
mimetype: text/html
language: fr-FR
domain_name: www.geek-directeur-technique.com
http_status: 200
content:
  <p>Je suis actuellement dans une phase de création de startup, et j’ai été amené à me poser quelques questions d’ordre pratique. Très concrètement, comment faire pour travailler dans des conditions propres à garantir une certaine efficacité, alors qu’on n’a pas beaucoup de budget ?</p>
  <h3>Ordinateur</h3>
  <p>La première chose à faire, c’est d’avoir un ordinateur suffisamment performant pour ne pas avoir l’impression de perdre du temps à cause de lui. Ça paraît évident, mais j’ai longtemps eu des ordinateurs “juste suffisants“ ; je suis maintenant bien content d’avoir une machine assez puissante pour que le sujet de me vienne même plus à l’esprit (plus d’info à ce sujet dans <a href="http://www.geek-directeur-technique.com/2016/08/25/a-la-recherche-de-lordinateur-portable-ideal-la-suite">l’article que j’avais écrit</a>).</p>
  <p>Prévoyez un ordinateur portable que vous pourrez emmener facilement partout où vous aurez besoin de vous déplacer, tout en vous offrant un bon confort de travail. Pensez que la plupart du temps vous devrez vous contenter de l’écran, du clavier et du trackpad de votre ordinateur, sans possibilité de le brancher à un écran, clavier ou souris externe.</p>
  <p>Prenez aussi un ordinateur avec un système d’exploitation que vous maîtrisez ; ne perdez pas de temps à vouloir apprendre un nouveau système, votre productivité serait catastrophique pendant trop longtemps.</p>
  <blockquote><p>J’utilise actuellement un <a href="https://www.cnet.com/products/lenovo-ideapad-yoga-2-pro/review/" target="_blank" rel="noopener noreferrer">Lenovo Yoga 2 Pro</a> âgé de 2 ans (qui n’est plus au catalogue, remplacé par les <a href="http://www3.lenovo.com/fr/fr/laptops/yoga/700-series/c/yoga-700" target="_blank" rel="noopener noreferrer">Yoga 700</a> et <a href="http://www3.lenovo.com/fr/fr/laptops/yoga/900-series/c/yoga-900-series" target="_blank" rel="noopener noreferrer">Yoga 900</a>) équipé d’un processeur Core i7, 8 GO de RAM, 512 GO de SSD, et un écran 13,3 pouces 3200×1800 tactile, pour 1,4 kg ; le tout sous <a href="https://www.ubuntu.com/desktop" target="_blank" rel="noopener noreferrer">Ubuntu Linux</a>.</p></blockquote>
  <h3>Téléphone portable</h3>
  <p>Là encore ça paraît évident, mais ça va mieux en le disant. Parce qu’il faut être réactif, il faut pouvoir être alerté lorsqu’on reçoit un message, même si on n’est pas devant son ordinateur. Et il faut pouvoir envoyer des emails, gérer son calendrier, surfer sur Internet, etc. sans avoir besoin d’ouvrir son ordinateur à chaque fois.</p>
  <p>Donc il est important d’avoir un téléphone portable de bonne qualité. Cela veut dire avec un écran assez grand, non seulement pour pouvoir surfer dans de bonnes conditions, mais surtout pour pouvoir utiliser le clavier virtuel sans appuyer sur plusieurs touches à la fois. Cela veut dire aussi avec un processeur assez puissant et une mémoire assez large pour pouvoir passer d’une application à l’autre sans attendre pendant des heures à chaque fois.</p>
  <p>Comme pour l’ordinateur portable, vous serez plus efficace avec un système d’exploitation mobile que vous connaissez. Ce n’est pas le moment de switcher entre iOS, Android, Windows Mobile, ou un autre système plus exotique que vous souhaiteriez tester…</p>
  <blockquote><p>J’utilise un <a href="http://www.lesnumeriques.com/telephone-portable/google-nexus-5x-p28149/test.html" target="_blank" rel="noopener noreferrer">Google Nexus 5X</a> sous Android (évidemment). J’aimerais parfois bénéficier d’un écran plus grand, mais je pense que c’est un bon compromis avant de tomber dans la phablet.</p></blockquote>
  <h3>Batterie externe</h3>
  <p>Ça n’a l’air de rien, mais l’autonomie des smartphones est globalement très mauvaise. Impossible de pouvoir compter dessus pendant une journée entière de travail (à surfer, envoyer et recevoir des messages, téléphoner, utiliser le GPS et écouter de la musique). La mauvaise surprise guette toujours à partir de la fin de l’après-midi.<br />
  Pour ma part, j’ai toujours deux petites batteries externes dans mon sac, au cas où. Et pensez bien à les recharger régulièrement…</p>
  <p>Mais pour aller plus loin, j’ai aussi une batterie externe plus grosse, qui peut alimenter un ordinateur portable. C’est très pratique lorsqu’on doit se retrouver loin d’une prise électrique pendant un bon moment : dans le train ou l’avion, mais aussi lorsque vous allez travailler dans un bar qui ne propose pas de prise − ce qui m’est arrivé un bon nombre de fois l’air de rien…</p>
  <blockquote><p>J’utilise une <a href="http://amzn.to/2qemvEc" target="_blank" rel="noopener noreferrer">Maxoak 50000 mAh</a> achetée l’été dernier, et qui semble être toujours au top. Elle peut recharger téléphones, tablettes et ordinateurs portables (prises compatibles avec plusieurs fabriquants de PC mais pas pour Apple) et pèse juste 1,3 kg.</p></blockquote>
  <h3>Forfait mobile</h3>
  <p>Un accès à Internet est quelque chose de fondamental de nos jours. Difficile de travailler sans cela. Même quand on code en local, il faut vraiment être dans un avion ou dans un train pour supporter la sensation d’être coupé du monde. Même s’il devient de plus en plus facile de trouver un réseau wifi, je ne compte plus les fois où j’ai été sauvé par mon abonnement mobile 3G/4G, en utilisant mon téléphone comme passerelle.</p>
  <p>Tant qu’à faire, un forfait qui permette de surfer en 3G partout dans le monde (ou en tout cas dans les pays ou vous êtes susceptibles de vous rendre) est une bonne idée.</p>
  <p>Je ne parle même pas du fait d’avoir un forfait illimité, nous sommes maintenant habitués en France à ne plus avoir besoin de faire attention à notre consommation téléphonique. Pour un usage professionnel, c’est absolument nécessaire.</p>
  <blockquote><p>J’utilise le forfait mobile de <a href="http://mobile.free.fr/" target="_blank" rel="noopener noreferrer">Free</a> depuis bien longtemps, car c’était l’un des premiers à permettre l’usage en tant que modem pour un prix raisonnable, ainsi qu’à offrir l’illimité dans des pays étrangers où je vais régulièrement.</p></blockquote>
  <p>Si vous avez besoin de plusieurs numéros de lignes différents sur le même téléphone, vous pouvez essayer les applications OnOff ou <a href="http://grasshopper.com/" target="_blank" rel="noopener noreferrer">Grasshopper</a>.</p>
  <h3>Des outils numériques de base</h3>
  <p>La base, ce sont des emails, un calendrier, un carnet d’adresse et un stockage de fichiers en ligne. Il existe plusieurs solutions ; si vous voulez échapper aux très connues <a href="https://goo.gl/QYnpKS" target="_blank" rel="noopener noreferrer">Google Gsuite</a> ou <a href="https://products.office.com/fr" target="_blank" rel="noopener noreferrer">Microsoft Office 365</a>, vous pouvez essayer <a href="https://www.zoho.com/" target="_blank" rel="noopener noreferrer">Zoho</a>.</p>
  <p>Pour l’organisation du travail avec d’autres personnes, la combo gratuite à la mode est actuellement <a href="http://www.geek-directeur-technique.com/2011/09/16/trello-todo-list-checklist-organisation-didees-outil-de-collaboration">Trello</a> (kanban-board) + <a href="https://slack.com/" target="_blank" rel="noopener noreferrer">Slack</a> (communication temps-réel).</p>
  <blockquote><p>Personnellement, j’utilise <a href="https://goo.gl/QYnpKS" target="_blank" rel="noopener noreferrer">Google Gsuite</a> qui s’intègre particulièrement bien avec Chrome et Android, et auquel j’étais déjà habitué à titre personnel. J’ai aussi utilisé Trello et Slack quand le besoin s’en faisait sentir, ils sont efficaces.</p></blockquote>
  <h3>Un lieu pour travailler</h3>
  <p>Certaines personnes sont capables de travailler chez elles. Personnellement ce n’est pas trop mon cas. Je l’ai déjà fait et je continue à le faire régulièrement, mais je sais que ce n’est pas l’endroit où je suis le plus efficace.<br />
  Du coup, j’ai testé plusieurs choses : Travailler dans des cafés, dans des restaurants « worker-friendly », dans des espaces de coworking, dans des bibliothèques municipales, dans des bibliothèques universitaires, chez des co-homers, …</p>
  <p>Avec le temps, j’ai pris l’habitude de pouvoir travailler à peu près n’importe où. Mais il n’empêche que les cafés et les restaurants sont souvent très bruyants. Les bibliothèques municipales ont des horaires peu compatibles (pas ouvertes tous les jours, ou juste par demi-journées). Les bibliothèques universitaires ont des règles très variables ; en France, elles sont souvent réservées aux étudiants et aux professeurs, ce qui en limite l’usage (alors que j’ai apprécié travailler à la bibliothèque de l’Université de Montréal, qui est ouverte à tous).</p>
  <p>Les espaces de coworking ne sont pas tous sur le même modèle. Certains se rapprochent d’un bar/resto et peuvent alors être assez bruyants. Certains se payent à l’heure, d’autres ne proposent qu’un abonnement mensuel, d’autres font les deux.<br />
  Sans abonnement, le prix se situe souvent autour de 4 €/heure, ce qui fait un coût élevé si vous comptez y travailler 8 heures par jour, 5 jours par semaine. Les abonnements mensuels en placement libre (sans un bureau dédié) vont habituellement de 250 à 400 € HT/mois.</p>
  <blockquote><p>Sur Paris, il faut remarquer la création récente de <a href="http://la-permanence.com/" target="_blank" rel="noopener noreferrer">La Permanence</a> dans le 5ème arrondissement ; ouverte 24/7, avec des prix extrêmement compétitifs : 1 € à 1,5 € de l’heure, ou 80 € par mois.</p></blockquote>
  <p>Le <a href="https://www.cohome.in/" target="_blank" rel="noopener noreferrer">co-homing</a> consiste pour sa part à aller travailler chez des gens qui mettent leur habitation à disposition. Pour un prix défiant toute concurrence (de 1 à 11 € par jour), ces offres sont souvent proposées par des gens qui travaillent de chez eux et qui préfèrent être entourés d’autres personnes travaillant elles aussi.<br />
  Les avantages sont évidents (prix très bas, meilleure concentration qu’en travaillant seul chez soi, rencontres professionnelles), mais il y a aussi des inconvénients : Tout le monde n’aime pas travailler à quatre dans un petit studio ; les disponibilités sont variables suivant la personne chez qui on va travailler, et on peut se retrouver à devoir jongler entre plusieurs co-homers et des espaces de coworking.</p>
  <h3>Une salle de réunion</h3>
  <p>Parfois on a besoin de se réunir, que ce soit pour travailler avec un client, avec un fournisseur ou encore un investisseur. Difficile à faire dans un bar ou même dans un espace de coworking, mais heureusement il existe des salles faciles à trouver sur des sites comme <a href="https://www.bird-office.com" target="_blank" rel="noopener noreferrer">BirdOffice</a>. Les prix sont extrêmement variables, mais il est possible de trouver des salles à partir de 20 € de l’heure, moins de 100 € la demi-journée et moins de 200 € la journée.</p>
  <h3>Un abonnement musical</h3>
  <p>Bon, ça c’est un peu anecdotique. Mais si vous êtes comme moi et comme beaucoup de gens, vous travaillez souvent avec de la musique dans les oreilles. Il existe un certain nombre de services qui permettent d’accéder à des catalogues impressionnants (Spotify, Deezer, Google Play Music, Apple Music, …) pour un prix assez général de 9,99€/mois.</p>
  <p>Pour votre confort et celui des gens qui travaillent autour de vous, pensez à acheter de bons écouteurs ou un bon casque, ce qui non seulement vous isolera bien des bruits extérieurs (ainsi vous aurez moins besoin de monter le volume, vos tympans vous remercieront) mais en plus limitera le risque de gêner les autres.<br />
  Chose indispensable de nos jour : Pensez bien à prendre des écouteur ou un casque avec un micro, ça vous évitera de jongler lorsque vous aurez à prendre une communication audio ou vidéo.</p>
  <blockquote><p>Pour ma part, je me suis abonné à Deezer, après avoir testé Spotify (dont la version web consommait une quantité de ressources mémoire et processeur incompréhensible pour un tel service). J’y trouve la quasi-totalité des groupes que je veux écouter − même les groupes de death-metal mélodique suédois… Et l’application Android fonctionne très bien, donc tout va bien.<br />
  Au bureau j’utilisais avant un gros casque <a href="http://amzn.to/2qilywf" target="_blank" rel="noopener noreferrer">Sennheiser Momentum</a> qui offrait un très bon confort d’écoute. En situation nomade, je me contente maintenant des écouteur intra-auriculaires livrés avec le Nexus 5X.</p></blockquote>
  	&#13;
  &#13;
                      <div class="clearfix">&#13;
  &#13;</div>


title: Silence, on tue les libertés !
url: https://laplumedaliocha.wordpress.com/2016/02/18/silence-on-tue-les-libertes/
created_at: 2017-08-10 23:21:58
updated_at: 2017-08-10 23:21:58
mimetype: text/html
language: fr-FR
domain_name: laplumedaliocha.wordpress.com
preview_picture: https://s0.wp.com/i/blank.jpg
http_status: 200
content:
  <h2>18/02/2016</h2>
  <div class="post-10757 post type-post status-publish format-standard hentry category-droits-et-libertes category-questions-davenir category-reflexions-libres" id="post-10757">
  	 <h3 class="storytitle">
  			Silence, on tue les libertés !		 </h3>
  	<div class="meta">Filed under:  <a href="https://laplumedaliocha.wordpress.com/category/droits-et-libertes/" rel="category tag">Droits et libertés</a>,<a href="https://laplumedaliocha.wordpress.com/category/questions-davenir/" rel="category tag">questions d'avenir</a>,<a href="https://laplumedaliocha.wordpress.com/category/reflexions-libres/" rel="category tag">Réflexions libres</a> — laplumedaliocha @ 22:06 <br /></div>

  	<div class="storycontent">
  		<p>En fin de journée, j’ai interviewé un bâtonnier. Peu importe lequel, en ce moment, sur fond d’état d’urgence et face aux libertés en péril, ils pensent tous pareil. Et pas seulement eux, tous les avocats, et puis tous les juges, et sans doute tout ce que la France compte de juristes, et pas seulement….C’était une interview difficile car il y avait trop de sujets à aborder et pas assez de temps. La situation du tribunal de Bobigny, catastrophique. Celle des autres tribunaux de France, pas meilleure. La réforme constitutionnelle et l’état d’urgence. Le statut des libertés publiques. L’inscription loupée du droit à l’avocat dans notre constitution. La réforme pénale qui banalise la possibilité pour tout un chacun, parce qu’il aura bavardé un jour avec un cafetier soupçonné sans qu’il le sache de frayer avec des terroristes, de se retrouver  en pleine nuit avec sa porte d’appartement défoncée par des types cagoulés, plaqué au sol et menotté devant ses enfants. Ce bâtonnier soudain m’a interpellée : <em>« vous êtes où les médias, quand on tue les libertés publiques, on ne vous entend pas ! Quand Christiane Taubira a quitté le ministère, on est resté 30 minutes sur son départ à bicyclette pour admirer son pédalier, mais personne n’a parlé de l’essentiel, au même moment le nouveau garde des sceaux Jean-Jacques Urvoas reconnaissait et c’était une première, la situation d’urgence de la justice. Or sans justice, il n’y a pas de démocratie. Comment ne pas être amer face à des médias qui ratent l’essentiel ? »,</em> a conclu mon interlocuteur.</p>
  <p>J’ai baissé la tête. En tant que journaliste spécialisée, ce n’est pas vers moi que se tournait sa colère, puisque j’étais là et que depuis novembre je ne cessais, comme d’autres journalistes spécialisés, de relayer les cris d’alerte des juristes. Il en voulait au Système qui mécaniquement est bien plus attiré par le vélo de Taubira  que par les paroles essentielles – mais si peu spectaculaires – de son successeur. Il avait raison. Rien de ce qu’il me disait ne me surprenait. J’ai répondu que sur Twitter tout le monde, en tout cas dans ma TL de juristes, était conscient de l’insupportable et bien inutile sacrifice de nos libertés. Réponse dérisoire et à côté de la plaque. Mon petit microcosme que j’ai confortablement taillé à la mesure de mes centres d’intérêt (et c’est bien le défaut d’Internet par rapport à un journal qui vous parle de tout, y compris de ce qui ne vous intéresse a priori pas), mon petit monde en effet est d’accord avec moi et me donne l’illusion que le « Grand » monde l’est aussi.</p>
  <p>Fumisterie.</p>
  <p>C’est le bâtonnier qui a raison.</p>
  <p>Alors voilà, je lance cette petite bouteille à la mer. Il y a beaucoup d’avocats, de juges, d’universitaires qui savent qu’on va dans le mur, c’est le moment, puissants confrères des grands médias, de leur donner la parole. Ouvrez-leur vos spectaculaires matinales radio, vos chaines d’information en continu, vos émissions de prime time ou de deuxième partie de soirée, ils parlent bien, ont des tas d’exemples concrets à donner.  Ils vous raconteront que les Etats-Unis suite aux attentats du 11 septembre ont commis la même erreur que nous et admettent aujourd’hui avoir sacrifié leurs libertés pour rien. Ils vous abreuveront d’anecdotes effrayantes et de formule choc. Ce sont d’excellents clients qui, en plus, défendent une excellente cause. Invitez-les. Il y a tant de valeurs communes entre le journalisme au sens noble du terme et l’avocat défenseur des libertés. Tout n’est peut-être pas perdu.</p>
  					<div class="wpcnt">
  			<div class="wpa wpmrec wpmrec2x">
  				Publicités
  				<div class="u">
  										
  				</div>
  						<div id="crt-1771674914"></div>
  				<div id="crt-813138527"></div>
  		
  			</div>
  		</div>	</div>

  	<div class="feedback">
                          <a href="https://laplumedaliocha.wordpress.com/2016/02/18/silence-on-tue-les-libertes/#comments">Comments (39)</a>	</div>

  </div>





  	<br /><p><a href="https://laplumedaliocha.wordpress.com/2016/02/18/silence-on-tue-les-libertes/feed/"><abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.</a>	<a href="https://laplumedaliocha.wordpress.com/2016/02/18/silence-on-tue-les-libertes/trackback/" rel="trackback">TrackBack <abbr title="Uniform Resource Identifier">URI</abbr></a>
  </p>

  	
  	<div></div>


title: [LE CRASH TEST] Agriconomie, l'agriculteur 3.0 - NUMA Paris
url: https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/
created_at: 2017-08-10 23:21:59
updated_at: 2017-08-10 23:21:59
mimetype: text/html
language: fr-FR
domain_name: paris.numa.co
preview_picture: https://paris.numa.co/wp-content/uploads/sites/2/2016/08/capture-decran-2016-07-29-a-17-32-03.png
http_status: 200
content:
  <div id="primary" class="content-area">
  		<div class="post-img-wrapper">
  	<div class="post-img">
  			</div>
  </div>

  <div class="single-content-wrapper" id="single-content-wrapper">
  	<div class="entry-meta" id="entry-meta">
  		<p>
  							Posted on <a href="https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/" rel="bookmark">août 1, 2016</a> by <a class="url fn n" href="https://paris.numa.co/blog/author/juliettehirtz/">Juliette Hirtz</a><br />
  				
  		Reading Time: 1 minutes
  		
  					</p>
  	</div><div class="article-wrapper">
  			<p>Chaque semaine, NUMA, <i>Le Figaro </i>et le cabinet de conseil Taddeo proposent <em>Le Crash Test, </em>une émission dans laquelle les jeunes entreprises du Web viennent défendre leur projet face à un intervenant venu les défier.</p>
  <p>Cette semaine, l’invité est Agriconomie est un site de e-commerce spécialisé dans la vente de matériel agricole. Cette start-up de la Saison 5 est challengée par Marc Rougier, co-fondateur de Scoop.it et VC chez Elaia Partners.</p>
  <p><img class="aligncenter wp-image-6206 size-large" src="https://paris.numa.co/wp-content/uploads/sites/2/2016/08/crash-texte-9-challenger-1024x576.jpg" alt="crash texte #9-challenger" width="640" height="360" /></p>
  <p>Comment Agriconomie se rémunère-t-elle ? Qu’apporte-t-elle précisément aux agriculteurs ? Pourquoi arrive-t-elle maintenant face à sa concurrence ?</p>
  <p>Regardez l’émission pour avoir la réponse :</p>
  <p><iframe width="500" height="281" src="https://www.youtube.com/embed/UIBXN0kwDAo?feature=oembed" frameborder="0" allowfullscreen="allowfullscreen">[embedded content]</iframe></p>
  <p>Vous aussi postulez au prochain <a href="https://paris.numa.co/startups/" target="_blank">programme d’Accélération NUMA</a> !</p>
  <p><a href="https://apply.numa.co/?utm_medium=button&amp;utm_source=blog&amp;utm_campaign=article-agriconomie&amp;utm_term=crashtest"><img class="aligncenter wp-image-5423 size-medium" src="https://paris.numa.co/wp-content/uploads/sites/2/2016/07/capture-decran-2016-07-05-a-14-45-10-300x56.png" alt="Capture d’écran 2016-07-05 à 14.45.10" width="300" height="56" /></a></p>

  <div class="wp_rp_wrap  wp_rp_vertical_m" id="wp_rp_first"><div class="wp_rp_content"></div>
  			<div class="post-share-bottom">
  				<p>Partagez :</p>
  				<p>				
  					<a target="_blank" href="https://twitter.com/intent/tweet?text=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;url=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/&amp;via=NUMA Paris" title="Share on Twitter">
  						
  					</a>
  					<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/" title="Share on Facebook">
  						
  					</a>
  					<a target="_blank" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/&amp;title=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;summary=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;source=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/" title="Share on Linkedin">
  						
  					</a>
  				</p>
  		
  			</div>

  			
  		</div>
  	<div class="post-share" id="post-share">
  		<p>Partagez :</p>
  		<p>				
  			<a target="_blank" href="https://twitter.com/intent/tweet?text=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;url=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/&amp;via=NUMA Paris" title="Share on Twitter">
  				
  			</a>
  			<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/" title="Share on Facebook">
  				
  			</a>
  			<a target="_blank" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/&amp;title=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;summary=[LE CRASH TEST] Agriconomie, l’agriculteur 3.0&amp;source=https://paris.numa.co/blog/le-crash-test-agriconomie-lagriculteur-3-0/" title="Share on Linkedin">
  				
  			</a>
  		</p>

  	</div>

  	<div class="entry-footer">
  	Posted in <a href="https://paris.numa.co/blog/category/startup/" rel="category tag">Startup</a><br />Tagged <a href="https://paris.numa.co/blog/tag/agriconomie/" rel="tag">Agriconomie</a>, <a href="https://paris.numa.co/blog/tag/alumni/" rel="tag">Alumni</a>, <a href="https://paris.numa.co/blog/tag/crash-test/" rel="tag">Crash Test</a></div>
  </div>

  	<div id="disqus_thread">
      </div>


  		</div>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        	


  	<div class="home-footer-link">
  			
  			<div class="town-footer-text">
  				<div class="menu-footer-menu-french-container"><ul id="menu-footer-menu-french-1" class="menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10722"><a href="https://paris.numa.co/blog/">Blog</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1365"><a href="https://paris.numa.co/contact/">Contact</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9497"><a href="https://paris.numa.co/qui-sommes-nous/">À propos</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4665"><a href="https://paris.numa.co/presse/">Presse</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1620"><a href="http://www.welcometothejungle.co/companies/numa/jobs">NUMA Recrute</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1622"><a href="https://lab.numa.co/jobs">La communauté recrute</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3575"><a href="https://paris.numa.co/louer-une-salle/">Louer une salle</a></li>
  <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6388"><a href="https://paris.numa.co/mentions-legales/">Mentions Légales</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4757"><a href="https://numa.co/">NUMA World</a></li>
  </ul></div>			</div>
  			
  			<div class="footer-vertical-line">
  			
  			<div class="town-footer-text">
  				<div class="menu-footer-bis-container"><ul id="menu-footer-bis" class="menu"><li id="menu-item-7349" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-7349"><a href="https://datacity.numa.co/">DataCity</a></li>
  <li id="menu-item-6401" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6401"><a href="http://intrapreneurship.numa.co/">Notre programme d’intrapreneuriat</a></li>
  <li id="menu-item-6402" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6402"><a href="http://network.numa.co">NUMA et ses partenaires dans le monde</a></li>
  <li id="menu-item-6403" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6403"><a href="https://alumni.numa.co">Nos Startups Alumni</a></li>
  <li id="menu-item-6405" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6405"><a href="https://paris.numa.co/startups">Notre Programme d’accélération de startups</a></li>
  <li id="menu-item-6404" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-6404"><a href="http://learn.numa.co">Nos Formations à l’innovation</a></li>
  </ul></div>			</div>
  			
  			<div class="footer-vertical-line">	
  			
  			<div class="town-footer-follow-social">
  				<div class="town-footer-follow-us-home">					
  					<form id="form-subscribe" method="post" target="_blank" action="https://siliconsentier.us1.list-manage.com/subscribe/post?u=f98c0eea1590f1afbc8245608&amp;id=74cf6bd456">
  						<div class="label-subscribe">
  							<label id="input-subscribe">INSCRIPTION NEWSLETTER :</label>
  						</div>
  						<div class="input-subscribe">
  							<input name="EMAIL" type="text" class="input-subscribe" /><input id="button-home-subscribe" type="submit" value="OK" /></div>
  					</form>					
  				</div>
  				
  				<div class="town-footer-social-home">
  					
  							
  												<a href="https://paris.numa.co/contact" target="_blank">
  								
  							</a>
  																		<a href="https://www.linkedin.com/company/numa-paris" target="_blank">
  								
  							</a>
  																		<a href="https://twitter.com/numaparis?lang=fr" target="_blank">
  								
  							</a>
  																		<a href="https://www.facebook.com/numaparis" target="_blank">
  								
  							</a>
  																		<a href="https://www.instagram.com/numa_paris/" target="_blank">
  								
  							</a>
  																		<a href="https://www.youtube.com/user/SiliconSentier" target="_blank">
  								
  							</a>
  																
  				</div>
  				<div>
  					<p><a target="_blank" href="https://el-tigre.net">Web Development : El Tigre</a></p>
  				</div>
  			</div>
  			
  		</div>	
  		
  	</div></div></div>


created_at: 2017-08-10 23:22:01
updated_at: 2017-08-10 23:22:01
mimetype: text/html
language: fr-FR
domain_name: www.frenchweb.fr
preview_picture: http://www.frenchweb.fr/wp-content/uploads/2017/05/deesse.jpg
http_status: 200
title:
  Start-up Game: où les petits malins ne font plus recette et l’on appelle une déesse romaine à la rescousse dans la guerre économique mondiale

url:
  http://www.frenchweb.fr/start-up-game-ou-les-petits-malins-ne-font-plus-recette-et-lon-appelle-une-deesse-romaine-a-la-rescousse-dans-la-guerre-economique-mondiale/290888

content:
  <div class="page-featured-image">
       <img width="648" height="398" src="http://www.frenchweb.fr/wp-content/uploads/2017/05/deesse.jpg" class="attachment-post-thumbnail wp-post-image" alt="deesse" /></div>
                                                
          <p>
  	La toute nouvelle hype de la start-up et de l’entrepreneuriat parcourt notre société comme une traînée de poudre: de l’entrepreneur à l’intrapreneur, tout le monde se sent l’âme d’un conquérant du capitalisme moderne. Un quelque chose de Steve Jobs (ok, souvent uniquement son sale caractère) ou un faux-air de Mark Zuckerberg (bon, ok, que le hoody). Cette nouvelle mode est abondamment relayée par nos <a href="https://start.lesechos.fr/entreprendre/actu-startup/index.php" rel="nofollow noopener" target="_blank">médias</a>, racontant ainsi un conte de fée moderne, qui substituent l’amorce d’«Il était une fois» par «Il a eu la bonne idée». Et de raconter ensuite comment la bonne idée devint une entreprise, naturellement pleine de succès.
  </p>
  <p id="e393">
  	Ce qu’il faut commencer par comprendre, c’est que l’idée ne fait pas l’entreprise, ne fait pas le succès et ne fait pas le travail. 
  </p>
  <p>
  	L’idée est, au mieux, un point de départ. En fait, on pourrait élargir ce raisonnement à toute analyse économique d’un marché, démontrant une possibilité de business, un «trou dans la raquette». Combien de fois ai-je vu un porteur de projet s’exciter seul sur son business model canvas, expliquant que son modèle économique allait rapporter des millions en N+1? 
  </p>
  <p>
  	Le <a href="https://strategyzer.com/" rel="nofollow noopener" target="_blank">business model canvas </a>(BMC pour les intimes) est un super outil pour modéliser une entreprise existante, ou pour projeter un modèle et visualiser sa potentialité, mais ne garantit en rien le succès. Il analyse à un état constant, il ne modélise pas sa construction.
  </p>
  <p>
  	En effet, pour créer une entreprise, il faut partir <a href="https://www.youtube.com/watch?v=HP99FI6APZU" rel="nofollow noopener" target="_blank">de rien pour aller à quelque chose</a>, ce qui n’inclut pas d’observer une start-up sphérique dans le vide et sans frottement (ah, mes cours de physique…) mais bien de créer un modèle de montée en charge, un modèle de croissance. La croissance est ce qui forme l’essentiel de la valorisation d’une start-up. Et c’est là qu’on trouve l’entreprise: il faut FAIRE.
  </p>
  <p id="c065">
  	C’est pourquoi l’équipe est un sujet si important au même titre que le marketing initial, le réseau premier des fondateurs pour déclencher les premières ventes, la capacité à réaliser et adapter son produit au plus vite, la culture d’entreprise. C’est bien tout cela qui fédère et donne une vision claire à l’équipe concernant la mission qui les concerne… En clair, il faut FAIRE. Ce qui compte n’est donc pas l’idée mais l’EXÉCUTION.
  </p>
  <p>
  	On exécute avec des erreurs, des changements de façon de faire, en réinternalisant avec un autre point de vue; en clair, en créant une culture d’entreprise, en apprenant. C’est précisément cette courbe d’apprentissage qui représente l’essentiel de la valeur et de l’investissement d’une start-up, c’est ce mix unique d’inspiration, d’erreurs, d’innovation et d’inconscience qui permet à certaines boîtes de créer des façons inédites de travailler et de créer, et génère de la valeur (faudra qu’on parle de sociodynamique).
  </p>
  <p id="c35f">
  	La pullulation des consultants en start-up de ces dernières années entraîne un phénomène de mimétisme, et place certains startupeurs dans cette position d’avoir une idée, une analyse du marché et un regard de leur environnement économique, mimant ainsi les consultants, sans se rendre compte qu’ils ne sont déjà plus des entrepreneurs, mais des observateurs. Ce phénomène est accentué par les multiples offres du type; «tranquillisez-vous, on va coder et designer votre MVP (Minimum Viable Product)», «je sais que tu n’as pas le temps, on va écrire ton business plan pour toi, en plus il y a des aides qui existent pour le financer», «gérer une entreprise te prend ton temps, externalise-la chez moi», «il faut que tu te focus sur le stratégique, on va s’occuper de ton développement commercial».<br />Mais que reste-t-il de valeur dans votre boîte?
  </p>
  <h4 id="d2f9">
  	Si toute la valeur est produite en extérieur, quelle est celle que vous produisez?<br /></h4>
  <p>
  	Étant à Nantes, ce type de comportement tourne parfois à la caricature: quand un ancien cadre intermédiaire de grande entreprise m’explique avoir quitté son job et Paris, pour se «recentrer sur ce qui compte et prendre le temps de s’occuper de ses enfants, travailler dans ce qui a du sens…» tout en achetant son MVP, son BP, sa DAF et en prenant des cours du soir pour «devenir un entrepreneur»…
  </p>
  <h3 id="e560">
  	<strong>Ma réponse est simple: NON, on ne crée pas une start-up pour avoir un «meilleur rythme de vie», il faut être fou!</strong><br /></h3>
  <p>
  	Une start-up correspond à créer beaucoup de valeur en peu de temps, ce qui implique BEAUCOUP de travail. Il ne faut pas se laisser leurrer par le bullshit des perks de la Silicon Valley, dans les boîtes qui ont trop d’argent et qui sont dans une vision sociale très différente (allez expliquer le principes des 5 semaines de congés payés aux USA pour rire).
  </p>
  <blockquote>
  <p>
  		NB: on peut parfaitement créer une entreprise qui ne soit pas une start-up, toute jeune entreprise n’est pas une start-up. Ce n’est pas plus mal.
  	</p>
  </blockquote>
  <p>
  	Et puis, le start-up market s’est mondialisé, c’est de facto un marché hyper libéral de lutte économique mondiale, et pour chaque idée, il y a 12 équipes dans le monde qui sont synchronisées dessus. Ce qui les départagera sera l’exécution, et ce que l’équipe s’imposera pour gagner. Donc on peut assurer que 4 ingénieurs de 17 ans au Pakistan, qui n’ont rien à perdre travailleront beaucoup plus, beaucoup beaucoup plus.
  </p>
  <p>
  	Le marché est à présent plus global, le nécessaire pour créer une start-up dans le secteur dit Internet, est devenu accessible pratiquement à tous, transformant durablement le terrain de jeu. Il n’est pas obligatoire de sortir de Stanford ou Harvard pour innover, et l’apprentissage gratuit en ligne a fait tomber bien des barrières. Aujourd’hui, il ne faut pas être un petit malin pour triompher, il faut être un guerrier prêt à travailler dur et avec détermination pour aller sur ce terrain. C’est pour ces raisons que l’on constate un rajeunissement des porteurs de projet.
  </p>
  <p>
  	En effet, ma thèse est qu’il est utile de n’avoir rien à perdre pour tout donner. Un étudiant est habitué à vivre de peu et travailler beaucoup, n’a pas ou peu d’engagement, pas d’exigence de confort, il est disponible pour sa passion et la radicalité de sa thèse entrepreneuriale. Il n’a rien à perdre: pas de carrière, pas de situation, pas de prêt à rembourser, pas d’enfant à charge, souvent pas d’engagement dans une relation…
  </p>
  <p>
  	Il est disponible pour se battre contre les autres qui n’ont rien à perdre. C’est comme ça que j’ai créé <a href="http://www.clever-cloud.com/" rel="nofollow noopener" target="_blank">Clever Cloud</a>, je n’ai jamais compris ceux qui me disaient que c’était courageux de monter une boîte jeune. Ça me semblait simplement plus rationnel que de la monter à 35 ans, en devant assumer des engagements financiers et des responsabilités envers une famille. Après, il y aurait beaucoup à dire sur la situation d’étudiant-entrepreneur, mais ce n’est pas le sujet de ce billet de blog.
  </p>
  <p id="d47a">
  	C’est en discutant de cette mutation du marché des start-up avec <a href="https://twitter.com/franckytrichet" rel="nofollow noopener" target="_blank">Francky Trichet (adjoint au numérique à Nantes)</a> que nous avons conçu la thèse de <a href="http://maiamater.camp/" rel="nofollow noopener" target="_blank">Maia Mater</a>: L’idée était d’aider ceux que personne n’aide, d’aider avant que ce soit «rentable», de construire un espace pour accueillir ceux qui n’ont rien à perdre et rien à donner, mais envie de travailler dur à leur futur et au futur des idées et projets qu’ils portent.
  </p>
  <p>
  	On veut simplement permettre aux étudiants (et les tout juste diplômés, pas de chichis) qui sont des DO-ERS (tech, design, ingénierie, sciences…) de créer leur entreprise.
  </p>
  <p>
  	Rapidement on en a parlé aux copains <a href="http://www.atlantic2.org/" rel="nofollow noopener" target="_blank">d’Atlantic 2.0 (La Cantine)</a>, de <a href="http://www.nantestech.com/" rel="nofollow noopener" target="_blank">la NantesTech</a>, de <a href="http://www.nantesmetropole.fr/" rel="nofollow noopener" target="_blank">Nantes (Nantes Métropole)</a> et de<a href="http://www.agglo-carene.fr/" rel="nofollow noopener" target="_blank"> Saint Nazaire (La Carene)</a>, et à <a href="https://twitter.com/martinarnout" rel="nofollow noopener" target="_blank">Martin Arnout </a>(qui lui est élu à Saint Nazaire), et tout le monde a décidé que c’était une priorité, ils nous ont rejoints dans cette mission. On a recruté <a href="https://twitter.com/terencedesclain?" rel="nofollow noopener" target="_blank">Terence</a>, et on a finalement mis en place le premier camp d’été pour primo-entrepreneurs: un programme de 3 ans; construit pour aider sincèrement à concrétiser sur notre territoire des projets venus de partout.
  </p>
  <p>
  	La première année dure 4 mois (de fin mai à fin septembre, du <a href="https://web2day.co/" rel="nofollow noopener" target="_blank">Web2day</a> à la <a href="http://www.nantesdigitalweek.com/" rel="nofollow noopener" target="_blank">Nantes Digital Week</a>) à Nantes, durant laquelle on fournit un lit, un bureau, du manger, où on invite des bad-ass entrepreneurs pour partager leur vision de l’aventure start-up et un cadre motivant pour qu’une équipe puisse se consacrer à son MVP.
  </p>
  <p>
  	La seconde année (qu’on ouvre dès la première année parce que c’est comme ça) dure 1 mois (juillet, on finit aux <a href="http://www.festival-les-escales.com/" rel="noopener nofollow" target="_blank">Escales</a>) à Saint Nazaire est un séminaire pour réfléchir à son projet, son pivot, la monétisation de sa traction et la construction de son momentum. 
  </p>
  <p>
  	On fournit aussi le lit, le manger, le bureau et le cadre motivant, les mentors aussi. Un moment clé pour se retrouver après une année où parfois l’équipe n’a pas pu se voir autant qu’elle le souhaitait.
  </p>
  <p>
  	La troisième année, les anciens reviennent aider les nouveaux, parce que le programme est fait pour former une grande famille, une assemblée de patriciens startupers.
  </p>
  <p>
  	Le meilleur là dedans: c’est <a href="http://maiamater.camp/" rel="nofollow noopener" target="_blank">GRATUIT ET SANS CONTREPARTIE.</a>
  </p>
  <p id="e130">
  	Vraiment aucune! Pas de frais, pas de part, pas de vesting, pas d’obligation, pas même une obligation d’implantation sur le territoire. Car cette action est BIENVEILLANTE, on veut fournir aux grands projets tech de demain, une aide franche. Et on a aussi pleins d’outils pour vous aider à faire passer la pilule à votre école (les stages, tout ça…).
  </p>
  <p>
  	A présent j’ai besoin de votre aide:
  </p>
  <p id="a72e">
  	– Si vous voulez monter votre start-up et que vous êtes un jeune doers, candidatez et/ou posez la moindre question <a href="http://maiamater.camp/" rel="nofollow noopener" target="_blank">ici</a>.
  </p>
  <p>
  	– Si vous êtes de l’écosystème Nantes-Saint-Nazaire, communiquez, et proposez votre aide à <a href="mailto:terence.desclain@maiamater.camp" target="_blank" rel="nofollow">Terence</a>. Ce projet est un projet ouvert, dans lequel on veut retrouver tout l’écosystème.
  </p>
  <p>
  	– Si vous voulez nous accompagner pour aider le futur de la tech française, dites le à <a href="mailto:terence.desclain@maiamater.camp" target="_blank" rel="nofollow">Terence</a>.
  </p>
  <p id="aa55">
  	– Si vous voulez offrir des perks ou sponsoriser notre initiative, dites le aussi à <a href="mailto:terence.desclain@maiamater.camp" target="_blank" rel="nofollow">Terence</a>, on propose de jolis packs de sponsors.
  </p>
  <p>
  	– Si vous voulez nous rendre visite cet été, dites le aussi à <a href="mailto:terence.desclain@maiamater.camp" target="_blank" rel="nofollow">Terence</a>.
  </p>
  <p>
  	Cette initiative est <strong>bienfaisante</strong>, et je remercie tous ceux qui la portent.
  </p>
  <h4>
  	et surtout <a href="http://maiamater.camp/" rel="nofollow noopener" target="_blank">partagez tous le site web de Maia Mater</a><br /></h4>
  <p>
  	Et puis, l’illustration, elle est cool, non?
  </p>
  <div class="st-tabs">
  <ul class="tab-title"><li>L’expert</li>
  </ul><div class="tab-content-wrapper">
  <div id="tab-0" class="tab-content">
  <div class="txt-content">
  <p>
  	<img alt="quenton-adam-clever-cloud" class="size-thumbnail wp-image-271595 alignleft" height="150" src="http://www.frenchweb.fr/wp-content/uploads/2016/12/quenton-adam-clever-cloud-150x150.jpg" title="" width="150" /></p>


  <p>
  	<strong>Quentin Adam</strong> est le CEO de Clever Cloud.
  </p>


  </div>
  </div>
  </div>
  </div>
  <p>
  	<strong>Lire aussi:</strong> <a href="http://www.frenchweb.fr/joue-la-comme-clever-cloud-comment-nous-avons-survecu-a-un-redressement-judiciaire/271589">Joue-la comme Clever Cloud: comment nous avons survécu à un redressement judiciaire</a></p>
  <div id="ts-fab-below-290888" class="ts-fab-wrapper ts-fab-icons-text"><ul class="ts-fab-list"><li class="ts-fab-bio-link"><a href="http://www.frenchweb.fr/start-up-game-ou-les-petits-malins-ne-font-plus-recette-et-lon-appelle-une-deesse-romaine-a-la-rescousse-dans-la-guerre-economique-mondiale/290888#ts-fab-bio-below-290888">
  									 
  									Bio
  								</a></li><li class="ts-fab-latest-posts-link"><a href="http://www.frenchweb.fr/start-up-game-ou-les-petits-malins-ne-font-plus-recette-et-lon-appelle-une-deesse-romaine-a-la-rescousse-dans-la-guerre-economique-mondiale/290888#ts-fab-latest-posts-below-290888">
  									
  									Latest Posts
  								</a></li></ul><div class="ts-fab-tabs">
  	<div class="ts-fab-tab" id="ts-fab-bio-below-290888">
  		<div class="ts-fab-avatar"><img alt="Les Experts" src="http://2.gravatar.com/avatar/e5a14e88bac0f584d27234b615e4cb0f?s=64&amp;d=mm&amp;r=g" class="avatar avatar-64 photo" height="64" width="64" /></div>
  		<div class="ts-fab-text">
  			<p></p><h4><a rel="nofollow" href="http://www.frenchweb.fr">Les Experts</a></h4><p>Les Experts sont des contributeurs indépendants de FrenchWeb.fr.</p>
  		</div>
  	</div>
  	<div class="ts-fab-tab" id="ts-fab-latest-posts-below-290888">
  		<div class="ts-fab-avatar"><img alt="Les Experts" src="http://2.gravatar.com/avatar/e5a14e88bac0f584d27234b615e4cb0f?s=64&amp;d=mm&amp;r=g" class="avatar avatar-64 photo" height="64" width="64" /></div>
  		<div class="ts-fab-text">
  			<p>
  				</p><h4>Latest posts by Les Experts (<a href="http://www.frenchweb.fr/author/expertsfrenchweb-fr">see all</a>)</h4>
  			
  			</div>
  	</div>
  		</div>
  	</div>


