blog.notmyidea.org/feeds/all.atom.xml

10636 lines
No EOL
1,009 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Alexis Métaireau</title><link href="https://blog.notmyidea.org/" rel="alternate"></link><link href="https://blog.notmyidea.org/feeds/all.atom.xml" rel="self"></link><id>https://blog.notmyidea.org/</id><updated>2021-05-08T00:00:00+02:00</updated><entry><title>Vaccination et risques</title><link href="https://blog.notmyidea.org/vaccination-et-risques.html" rel="alternate"></link><published>2021-05-08T00:00:00+02:00</published><updated>2021-05-08T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2021-05-08:/vaccination-et-risques.html</id><summary type="html">
&lt;p&gt;Je m'intéresse un peu tardivement a la question des différents vaccins, pour pouvoir mieux comprendre comment ceux cis fonctionnent et quels sont les risques liés.&lt;/p&gt;
&lt;p&gt;Cette réflexion n'est en aucun cas pro- ou anti- vaccin, mais cherche simplement à essayer de comprendre et faire un petit tour d'horizon des critiques …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je m'intéresse un peu tardivement a la question des différents vaccins, pour pouvoir mieux comprendre comment ceux cis fonctionnent et quels sont les risques liés.&lt;/p&gt;
&lt;p&gt;Cette réflexion n'est en aucun cas pro- ou anti- vaccin, mais cherche simplement à essayer de comprendre et faire un petit tour d'horizon des critiques formulées à leur égard par les scientifiques. Considérez cette page comme des notes que j'ai fait pour moi même et que je publie.&lt;/p&gt;
&lt;h2 id="les-differents-types-de-virus"&gt;Les différents types de virus&lt;/h2&gt;
&lt;p&gt;J'ai d'abord essayé de comprendre quels étaient les différents types de virus.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de virus&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Virus nus&lt;/td&gt;
&lt;td&gt;Une coque de protéine (capside), qui renferme le matériel génétique du virus.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virus enveloppés&lt;/td&gt;
&lt;td&gt;En plus de la capside, une enveloppe avec une protéine de surface (« Spike » dans le cas de SARS-COV2). Ici « spike » permet aux virus de pénétrer dans les cellules pour y libérer son matériel génétique.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Il existe différents types de matériel génétique : l'ADN et l'ARN. &lt;/p&gt;
&lt;p&gt;L'ADN contient des gènes, qui détiennent les « plans » pour la fabrication des protéines (qui permettent d'effectuer les processus biologiques de nos cellules) ; L'ADN doit d'abord être transcris en ARNm (transcription) puis ensuite il y a une conversion de l'ARN vers la protéine, appelée « traduction ». &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de matériel génétique&lt;/th&gt;
&lt;th&gt;Fonctionnement du virus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ADN&lt;/td&gt;
&lt;td&gt;Injecte directement son matériel génétique dans la cellule qu'il infecte. La cellule va ensuite transcrire l'ADN en ARN, puis fabriquer les protéines virales, qui vont s'assembler pour former de nouveaux virus et coloniser les autres cellules /individus en cascade.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARN&lt;/td&gt;
&lt;td&gt;C'est le cas du SARS-COV2. Le virus injecte directement l'ARN, comme au dessus.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="les-vaccins"&gt;Les vaccins&lt;/h2&gt;
&lt;p&gt;Les vaccins stimulent notre système immunitaire pour faire face au virus / bactéries le jour ou c'est utile. L'idée étant de neutraliser les agents infectieux avant qu'ils ne fassent des dégâts.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de vaccin&lt;/th&gt;
&lt;th&gt;Fonctionnement&lt;/th&gt;
&lt;th&gt;Inconvénients&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Injection du virus inactivé&lt;/td&gt;
&lt;td&gt;On injecte le virus inactivé (formaldheide ou traitement physique type irradiation aux UV). Le virus est toujours immunisant.&lt;/td&gt;
&lt;td&gt;- Souvent assez peu immunogènes. Il faut donc ajouter des adjuvants (sels d'aluminium, formaldhéide…). &lt;br /&gt;- Il faut aussi multiplier les doses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virus vivant&lt;/td&gt;
&lt;td&gt;Souvent, une souche thermosensible du virus, qui fait qu'il n'est plus capable de se multiplier à la température de notre corps. Plus immunogènes que les virus inactivés&lt;/td&gt;
&lt;td&gt;Plus grande prise de risque, notamment pour les personnes fragiles, immunodéprimées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vaccins à protéines recombinantes&lt;/td&gt;
&lt;td&gt;Plutôt que d'injecter le virus entier, on injecte une protéine du virus (par ex la protéine de surface), pour stimuler notre système immunitaire.&lt;br /&gt;&lt;br /&gt;On isole le gène qui permet de fabriquer la protéine en question, et on fait en sorte que le gène s'exprime, pour le multiplier en labo (bioreacteurs, fermenteurs) puis on lui adjoint des adjuvants et on l'injecte. (protéine vaccinante)&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="les-vaccins-genetiques-de-type-arnm"&gt;Les vaccins « génétiques » de type ARNm&lt;/h2&gt;
&lt;p&gt;Ils consistent à injecter dans les cellules de la personne à vacciner, une partie du matériel génétique du virus, qui détient les « plans » pour fabriquer la protéine de surface.&lt;/p&gt;
&lt;p&gt;On fait fabriquer ces protéines directement par les cellules des personnes à vacciner. Ça peut être de l'ARN ou de l'ADN. L'ADN ou l'ARN sont encapsulés dans un vecteur.&lt;/p&gt;
&lt;p&gt;Dans le cadre de l'ARN, il s'agit d'une nano-particule de graisse, qui vient se fixer directement sur les nos cellules (la membrane plasmique).&lt;/p&gt;
&lt;h2 id="les-vaccins-genetiques-de-type-adn"&gt;Les vaccins « génétiques » de type ADN&lt;/h2&gt;
&lt;p&gt;Il est aussi possible d'avoir des vaccins génétiques à ADN. On utilise dans ce cas un autre virus (un adénovirus, rendu inactif), comme vecteur pour pouvoir injecter l'ADN. Dans ce cas on vient éliminer une partie de l'ADN de l'adénovirus et on le remplace par de l'ADN qui code les protéines qu'on cherche à reproduire (celles de surface « Spike » dans le cas du SARS-COV2).&lt;/p&gt;
&lt;p&gt;On appelle ça un virus recombinant.&lt;/p&gt;
&lt;p&gt;l'ARN du virus SARS-COV2 à été converti en ADN par des enzymes virales (trouvées dans les rétrovirus) « transcriptases inverses » puis ensuite ajoutées dans l'adénovirus.&lt;/p&gt;
&lt;h3 id="risques"&gt;Risques&lt;/h3&gt;
&lt;p&gt;Selon Christian Vélot et le CRIIGEN (association anti-OGM), les risques sont les suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Risques d'intégration de l'ADN&lt;/strong&gt; vaccinant dans nos propres chromosomes. Il y a eu des tests dans le cas de thérapies géniques (ou on essaye de remplacer un gène muté par un gène « réparateur / normal »), le problème étant qu'on ne maitrise pas l'endroit ou il peut s'insérer. Dans certains cas, l'ADN réparateur est allé s'insérer dans des oncogènes, menant à des leucémies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Risque de réactions immunitaires inopportunes&lt;/strong&gt; (immuno-toxicité)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="risques-communs-aux-vaccins-arnm-et-adn"&gt;Risques communs aux vaccins ARNm et ADN&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Les virus ont une grande capacité à échanger des fragments de leur matériel génétique respectif dès lors que les génomes viraux concernés sont de même nature (soit ADN, soit ARN) et quils partagent des séquences (des gènes) qui se ressemblent. Le processus bien connu qui régit ces échanges sappelle la recombinaison (et lorsque cette recombinaison a lieu entre séquences dADN ou dARN qui se ressemblent, on parle de recombinaison homologue). Ce phénomène de recombinaison nest pas réservé à lADN ou lARN viral mais les séquences virales sont connues pour faire lobjet de nombreuses recombinaisons (on dit quelles sont très « recombinogènes »). Il résulte de &lt;strong&gt;ces recombinaisons, entre matériels génétiques viraux&lt;/strong&gt;, des virus dits « recombinants » dont le ou les gène(s) qui a (ont) été le site de ces échanges sont dits « mosaïques », cest-à-dire &lt;strong&gt;constitués en partie de séquences provenant du virus 1 et de séquences provenant du virus 2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;ce phénomène ne peut se produire que si du matériel génétique provenant dau moins deux virus se retrouve dans les mêmes cellules, ce qui est fort heureusement extrêmement rare dans la nature puisque cela implique que des mêmes cellules soient co-infectées par au moins deux virus. &lt;/p&gt;
&lt;p&gt;&lt;a href="https://criigen.org/wp-content/uploads/2020/12/2020-09_Note-dExpertise-Vaccins-GM_C.Ve%CC%81lot-06.pdf"&gt;Christian Vélot&lt;/a&gt;, CRIIGEN, Septembre 2020&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Selon Christian Vélot, il y a un risque de recombinaison virale : les virus de même nature (ARN entre eux, ADN entre eux) aiment échanger du matériel génétique entre eux. Et c'est d'autant plus fréquent entre virus de la même famille.&lt;/p&gt;
&lt;p&gt;Les virus recombinants peuvent être plus ou moins dangereux, et il est difficile de le savoir à l'avance. H1N1 étant par exemple un virus recombinant.&lt;/p&gt;
&lt;p&gt;Pour que ça arrive, il faut que la même cellule soit infectée par deux virus au même moment. &lt;strong&gt;Ce qui est extrêmement peu probable&lt;/strong&gt;. Dès lors qu'on introduit du matériel génétique viral dans une cellule, il suffit qu'un autre virus de même nature infecte la même cellule pour qu'il y ait un échange entre le matériel génétique vaccinant et contaminant.&lt;/p&gt;
&lt;p&gt;C'est très très peu probable, mais dans le cas ou ça arriverait, cela pourrait mener à émergence d'un nouveau virus. &lt;/p&gt;
&lt;p&gt;Suite à la lecture d'&lt;a href="https://www.mdpi.com/2076-393X/9/5/453"&gt;un papier sur les risques liés aux vaccins de type ARN&lt;/a&gt;, il semble qu'il faille deux choses :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As with other viral vectors, a potential hazard associated with adenoviral vector based vaccines is the reversion to replication competency following homologous recom-bination events.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Que le virus inactivé se réactive ;&lt;/li&gt;
&lt;li&gt;Qu'il y ait une recombinaison liée à la présence d'un autre virus dans la même cellule.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Nevertheless, the absence of replication competent adenoviruses (RCA) should be demonstrated by the manufacturers for each batch release of the adenoviral vectored vaccine candidate as part of the routine quality control &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est tout de même demandé aux fabriquant de vaccins de prouver que les vaccins/virus ne peuvent pas se reproduire.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Emergence of RCA might also occur after administration of the vaccine by homologous recombination events between the adenoviral vector based vaccine sequences and the parental wild-type virus or other related human adenovirus infecting the same host cell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est pour cette raison que les adenovirus qui sont utilisés sont des virus qu'on ne trouve pas chez l'homme.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the scenario that RCA and replication competent chimeric adenoviral vectors are shed by vaccinees, the general population and the environment might be exposed. Potential adverse effects on human health and the environment of replication competent chimeric viruses are unclear although a decreased replication capacity of adenovirus chime-ras from different species has been reported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est donc un risque réel qui est pris, mais qui a été étudié. &lt;/p&gt;
&lt;h2 id="les-types-de-vaccins-contre-sars-cov2"&gt;Les types de vaccins contre SARS-COV2&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nom&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sinofarm (chinois)&lt;/td&gt;
&lt;td&gt;Vaccin inactivé&lt;/td&gt;
&lt;td&gt;Releasé avant les essais cliniques de phase 3.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Novavax&lt;/td&gt;
&lt;td&gt;Protéines recombinantes&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medicago (Canada)&lt;/td&gt;
&lt;td&gt;Protéine recombinante&lt;/td&gt;
&lt;td&gt;Protéines de la capside, donc pas la protéine de surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sanofi-pasteur&lt;/td&gt;
&lt;td&gt;Protéine recombinante&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pfizer-BioNTech&lt;/td&gt;
&lt;td&gt;ARNm&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moderna&lt;/td&gt;
&lt;td&gt;ARNm&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Astrazeneca&lt;/td&gt;
&lt;td&gt;ADN et adénovirus recombinant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spoutnik&lt;/td&gt;
&lt;td&gt;ADN et adénovirus recombinant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="Réfléxions"></category></entry><entry><title>Facebook, compétition, éthique et marketing.</title><link href="https://blog.notmyidea.org/facebook-competition-ethique-et-marketing.html" rel="alternate"></link><published>2021-01-26T00:00:00+01:00</published><updated>2021-01-26T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2021-01-26:/facebook-competition-ethique-et-marketing.html</id><summary type="html">
&lt;p&gt;En créant la &lt;a href="https://www.vieuxsinge.com"&gt;brasserie du Vieux Singe&lt;/a&gt;, le fait de créer une &lt;em&gt;page facebook&lt;/em&gt; s'est posé comme une évidence. Il s'agit de l'outil &lt;em&gt;de facto&lt;/em&gt; pour communiquer avec son « audience ».&lt;/p&gt;
&lt;p&gt;J'ai donc créé une page pour notre nouvelle entreprise, et au fur et à mesure je me suis mis à …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;En créant la &lt;a href="https://www.vieuxsinge.com"&gt;brasserie du Vieux Singe&lt;/a&gt;, le fait de créer une &lt;em&gt;page facebook&lt;/em&gt; s'est posé comme une évidence. Il s'agit de l'outil &lt;em&gt;de facto&lt;/em&gt; pour communiquer avec son « audience ».&lt;/p&gt;
&lt;p&gt;J'ai donc créé une page pour notre nouvelle entreprise, et au fur et à mesure je me suis mis à utiliser ce compte pour « suivre » les pages des autres brasseries, question de se tenir informé.&lt;/p&gt;
&lt;p&gt;Et puis je me suis rendu compte qu'être surexposé aux nouvelles des autres brasseries à suscité chez moi un sentiment de faiblesse. Une sorte de « syndrome de la compétition ». Au début, je suis rentré un peu dans le jeu : toujours plus, toujours mieux.&lt;/p&gt;
&lt;p&gt;Il faut tenir les gens informés, avoir toujours des nouvelles fraîches. Sans me l'avouer, je crois que je cherchais quelque part à impressionner, à être &lt;em&gt;cool&lt;/em&gt;. Comme si la nouveauté était plus importante que le fait de « faire les choses bien », dans les règles de l'art, en portant mes valeurs.&lt;/p&gt;
&lt;p&gt;Je me retrouvais à créer un avatar, une marque que les gens doivent aimer. On en vient presque à oublier qu'on est faillibles, parfois fragiles. Surtout, il ne faut pas montrer ce côté là. Une sorte de vision viriliste de l'entreprenariat.&lt;/p&gt;
&lt;p&gt;Je crois maintenant que reconnaître cette fragilité est important, c'est ce qui me permet de voir les choses en face, de refuser une dissociation cognitive entre d'un côté ce que je veux être et de l'autre ce que je suis vraiment.&lt;/p&gt;
&lt;p&gt;Je ne peux m'empêcher de faire un parallèle avec Mozilla, chez qui cette dissociation — image lisse d'un côté, réalité de fonctionnement pyramidal de l'autre — m'a posé problème durant mon passage la bas.&lt;/p&gt;
&lt;p&gt;Les stratégies de communication demandent de maintenir tout le monde excité en permanence, amenant à une baisse de la nuance dans mon discours. Mais en suivant cette logique, que se passera-t-il ensuite ? Il devient de plus en plus compliqué d'être original…&lt;/p&gt;
&lt;h2 id="marketing-ethique"&gt;Marketing éthique&lt;/h2&gt;
&lt;p&gt;Nous avons décidé de garder notre page Facebook, parce que — qu'on le souhaite ou non — beaucoup de personnes utilisent ce média pour se tenir au courant, mais nous avons également décidé de de changer la manière dont nous l'utilisons :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Facebook n'est plus l'endroit où nous postons nos messages, il s'agit simplement d'un relai d'info. On envoie également des mails, et on publie les informations sur notre site web.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nous postons rarement, mais nous essayons de poster du contenu de qualité. Bien-sûr des informations sur nos sorties de bières, mais également des retours d'expérience, des projets, etc. L'idée étant de sortir de la course aux nouveautés.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Également, après un petit temps &lt;em&gt;dans la compétition&lt;/em&gt;, j'ai choisi d'en sortir en me désinscrivant de toutes les pages suivies sur Facebook. Si Facebook doit être un relai, très bien, mais j'ai d'autres sources d'informations — moins toxiques — de mon côté. Radical, mais efficace !&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cela fait maintenant un an et demi que je suis ces quelques règles, et je pense que les effets délétères du média social se tassent ;-)&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Routine</title><link href="https://blog.notmyidea.org/routine.html" rel="alternate"></link><published>2021-01-25T00:00:00+01:00</published><updated>2021-01-25T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2021-01-25:/routine.html</id><summary type="html">
&lt;blockquote&gt;
&lt;p&gt;Si vous pensez que l'aventure est dangereuse, je vous propose d'essayer la routine.... Elle est mortelle !&lt;/p&gt;
&lt;p&gt;— Paulo Coelho&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J'ai toujours attaché une connotation négative à la routine.&lt;/p&gt;
&lt;p&gt;La routine, c'est l'ennui ; c'est la peur de reproduire toujours la même chose ; de me retrouver bloqué dans un fonctionnement que je reproduis …&lt;/p&gt;</summary><content type="html">
&lt;blockquote&gt;
&lt;p&gt;Si vous pensez que l'aventure est dangereuse, je vous propose d'essayer la routine.... Elle est mortelle !&lt;/p&gt;
&lt;p&gt;— Paulo Coelho&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J'ai toujours attaché une connotation négative à la routine.&lt;/p&gt;
&lt;p&gt;La routine, c'est l'ennui ; c'est la peur de reproduire toujours la même chose ; de me retrouver bloqué dans un fonctionnement que je reproduis parce qu'il a fonctionné un jour. Dans mon imaginaire, la routine c'est se satisfaire du status-quo.&lt;/p&gt;
&lt;p&gt;Pourtant, à y regarder de plus près il semble que je manquais une partie de l'histoire.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Capacité, faculté acquise plutôt par une longue habitude, par une longue pratique, que par le secours de létude et des règles. &lt;/li&gt;
&lt;li&gt;Usage depuis longtemps consacré de faire une chose toujours de la même manière. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;— Définition de « routine » sur le &lt;a href="https://fr.wiktionary.org/wiki/routine"&gt;Wikitionnaire&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il me semble qu'il n'y a pas nécessairement de connotation négative derrière cette notion de routine. Je me demande si les routines ne seraient pas même un moyen pour « apprendre sans en avoir l'air » ?&lt;/p&gt;
&lt;p&gt;Il me semble également que les routines permettent d'obtenir une quiétude. Se questionner (une fois), décider, puis faire de manière routinière, sans se poser à nouveau la même question sans cesse.&lt;/p&gt;
&lt;p&gt;Ça vient me questionner à beaucoup d'endroits, de ma gestion quotidienne de mon temps à mon rapport à l'apprentissage. Ça me plait. &lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Reconnexion ?</title><link href="https://blog.notmyidea.org/reconnexion.html" rel="alternate"></link><published>2021-01-15T00:00:00+01:00</published><updated>2021-01-15T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2021-01-15:/reconnexion.html</id><summary type="html">
&lt;p&gt;Cela fait un an que &lt;a href="https://blog.notmyidea.org/break-technologique.html"&gt;j'ai décidé de me déconnecter&lt;/a&gt; pour laisser plus de place à d'autres projets.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Me détacher de la maintenance de ihatemoney ;
Supprimer la plupart des applications sur mes téléphones (pro et perso)
Éteindre mon serveur personnel ;
Ne plus ramener mon téléphone pro à la maison ;
Avoir …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;p&gt;Cela fait un an que &lt;a href="https://blog.notmyidea.org/break-technologique.html"&gt;j'ai décidé de me déconnecter&lt;/a&gt; pour laisser plus de place à d'autres projets.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Me détacher de la maintenance de ihatemoney ;
Supprimer la plupart des applications sur mes téléphones (pro et perso)
Éteindre mon serveur personnel ;
Ne plus ramener mon téléphone pro à la maison ;
Avoir un ordinateur fixe au travail, et l'y laisser ;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cette partie de la liste est entièrement validée, et cela m'apporte une quiétude. La frontière entre le travail et le perso est maintenant mieux définie. A la fois pour moi, pour mes collègues et pour mes ami·es. J'en retire beaucoup de repos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Limiter mon utilisation de l'ordinateur perso à 1h par jour, sauf exceptions ;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je passe dans l'ensemble beaucoup moins de temps sur l'ordinateur, même si le téléphone portable à pris une place plus importante, ce que je regrette.&lt;/p&gt;
&lt;p&gt;J'ai transitionné d'une utilisation de l'ordinateur pour écrire des logiciels à une utilisation pour fabriquer de la musique. J'y découvre un plaisir, en partie parce que l'outil est puissant, en partie parce que je découvre un moyen de réaliser des envies qui trottent dans ma tête depuis quelques temps.
Mais… je me retrouve encore derrière un écran.&lt;/p&gt;
&lt;p&gt;Je creuse petit à petit l'utilisation d'outils qui permettent de se passer de &lt;em&gt;Digital Audio Workstation&lt;/em&gt; (DAW) — et donc d'ordinateur — mais j'avoue ne pas trop y croire pour l'instant.&lt;/p&gt;
&lt;p&gt;Peut-être que ce qui me gène n'est pas tant l'écran en tant que tel, mais la posture dans laquelle celui-ci me plonge ?&lt;/p&gt;
&lt;p&gt;Plutôt que de chercher à passer &lt;strong&gt;très peu&lt;/strong&gt; de temps derrière un écran, je peux essayer de maximiser le temps ou j'y fais quelque chose qui m'intéresse, et pour lequel je suis dans un usage créatif ?&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Un féminisme décolonial</title><link href="https://blog.notmyidea.org/un-feminisme-decolonial.html" rel="alternate"></link><published>2021-01-01T00:00:00+01:00</published><updated>2021-01-01T00:00:00+01:00</updated><author><name>Françoise Vergès</name></author><id>tag:blog.notmyidea.org,2021-01-01:/un-feminisme-decolonial.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;J'ai aussi appris très tôt que si l'État veut écraser un mouvement ,il a recours à tous les moyens, à toutes les ressources qui sont à sa disposition d'une part pour réprimer, d'autre part pour diviser les opprimé·e·s. D'un main il frappe, de l'autre il cherche à assimiler …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;J'ai aussi appris très tôt que si l'État veut écraser un mouvement ,il a recours à tous les moyens, à toutes les ressources qui sont à sa disposition d'une part pour réprimer, d'autre part pour diviser les opprimé·e·s. D'un main il frappe, de l'autre il cherche à assimiler. La peur est une de ses armes favorites pour produire conformise et consentement.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="sexisme"></category><category term="racisme"></category></entry><entry><title>Forum ouvert, animation et posture</title><link href="https://blog.notmyidea.org/forum-ouvert-animation-et-posture.html" rel="alternate"></link><published>2020-03-06T00:00:00+01:00</published><updated>2020-03-06T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-03-06:/forum-ouvert-animation-et-posture.html</id><summary type="html">&lt;p&gt;Début Février j'ai participé à un Forum Ouvert. Il s'agit de la troisième fois, et cette fois ci j'étais particulièrement attentif aux procédés mis en place pour sa tenue, puisque je faisais partie de l'équipe d'organisation.&lt;/p&gt;
&lt;h2 id="un-forum-ouvert"&gt;Un forum ouvert ?&lt;/h2&gt;
&lt;p&gt;Les forums ouverts sont des outils qui permettent de se retrouver …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Début Février j'ai participé à un Forum Ouvert. Il s'agit de la troisième fois, et cette fois ci j'étais particulièrement attentif aux procédés mis en place pour sa tenue, puisque je faisais partie de l'équipe d'organisation.&lt;/p&gt;
&lt;h2 id="un-forum-ouvert"&gt;Un forum ouvert ?&lt;/h2&gt;
&lt;p&gt;Les forums ouverts sont des outils qui permettent de se retrouver avec un groupe de personnes et d'avoir des échanges. L'idée est de créer un cadre assez léger qui permette aux personnes d'échanger de manière assez horizontale.&lt;/p&gt;
&lt;p&gt;Les 4 principes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les personnes présentes sont les bonnes personnes ;&lt;/li&gt;
&lt;li&gt;quoi qu'il arrive, c'est la seule chose qui pouvait arriver ;&lt;/li&gt;
&lt;li&gt;ça commence quand ça commence ;&lt;/li&gt;
&lt;li&gt;quand cest fini, cest fini.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La loi de la mobilité ou loi des deux pieds : si à un moment vous vous rendez compte que vous n'être ni en train dapprendre, ni de contribuer, aller voir autre chose !&lt;/p&gt;
&lt;p&gt;Retours :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;J'étais hyper surpris de voir à quel point l'outil est fonctionnel en tant que tel : les discussions auxquelles j'ai pu participer étaient souvent assez « poussées » alors même que les personnes ne se connaissaient pas d'avant le forum.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Durant le forum ouvert, il y avait la possibilité de prendre des notes, et de les partager avec tout le monde dans un espace prévu pour ça. Je n'y croyais pas trop, mais ça à vraiment fonctionné ! On avait préparé des pads en ligne (un espace de prise de notes partagées) avant l'évènement ce qui à permis de faciliter la prise de notes ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoir un endroit pour afficher les notes prises durant les discussions est utile, et créé un sentiment de satisfaction collectif ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Répartition de la parole : à un moment, on propose aux participant⋅e⋅s de venir proposer des sujets, et on s'est rendu compte que c'était (comme bien trop souvent) en grande partie des hommes cis (assignés hommes à la naissance) qui prenaient la parole à ce moment là. Pour éviter que ce ne soit le cas, laisser un temps de réflexion à tou⋅te⋅s avant de prendre la parole peut être utile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inclusion des personnes trans et non-binaires : Faire un tour des pronoms peut permettre aux personnes trans et non-binaires d'être plus incluses, ou en tout cas de visibiliser leur présence. On ne l'avait pas fait lors du premier jour et ça à manqué ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sur un plan plus pragmatique, trouver une logistique pour faire à manger de manière collective / faire le ménage / installer les tables etc, pourrait permettre aux organisateur⋅ice⋅s de participer aux discussions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lors de la phase d'organisation, il est possible de fusionner les sujets, et ça à été le cas pour au moins deux sujets proposés, ce qui à créé une situations problématique. Dans son livre qui parle des forums ouverts, Owen indique que parfois il vaut mieux ne pas fusionner les sujets, et je pense qu'on aurait sûrement du ici. Les attentes des participant⋅e⋅s ne sont pas forcement les mêmes, et ça peut créer de la frustration si les choses ne sont pas forcément bien amenées. C'est sûrement quelque chose à souligner aux participant⋅e⋅s lors du temps d'accueil.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="animer-etou-participer"&gt;Animer et/ou participer ?&lt;/h2&gt;
&lt;p&gt;A titre personnel, j'ai été assez frustré par la posture un peu floue que j'avais durant le forum : je faisais partie de l'équipe d'organisation mais je ne m'occupais pas de l'animation, nourrissant l'espoir de participer aux discussions.&lt;/p&gt;
&lt;p&gt;J'ai pu participer à certaines discussions, mais jamais (sauf une exception) pour une session entière, et j'ai trouvé ça dommage. Après une discussion avec Thomas qui à déjà animé au moins un forum ouvert, il semble possible d'« ouvrir » et de « fermer » les temps d'organisation, pour permettre aux organisateur⋅ice⋅s d'animer et de participer.&lt;/p&gt;
&lt;p&gt;J'aime bien cette idée, parce que ça veut dire que tout le monde peut participer, et que la posture d'animation ne signifie pas un « sacrifice », mais peut-être que cette idée à aussi ses défauts : lors d'une discussion avec un⋅e des animateurs⋅rices iel m'a indiqué qu'iel préférait rester extérieur aux discussions, pour éviter les prises de pouvoir.&lt;/p&gt;
&lt;p&gt;Autrement dit, faire l'animation du forum ouvert conférerait un pouvoir qui pourrait être néfaste lors des discussions. Je ne sais pas trop quoi penser de cette idée, mais il me semble pertinent de pousser la réflexion. Dans une posture plus « classique » de facilitation, on s'efforce de rester extérieur aux discussions, pour ne pas avoir de conflit d'intérêt.&lt;/p&gt;
&lt;p&gt;Mais dans le cas du forum ouvert, je n'ai pas l'impression que faire l'animation confère un pouvoir sur le groupe, autre que celui d'être garant⋅e des règles du fonctionnement collectif (rappel de l'heure par exemple, rappel du cadre de bienveillance). Si vous avez des retours sur ce sujet je suis preneur !&lt;/p&gt;
&lt;p&gt;Voire, je me demande même quel rapports cela génère de — justement — rester extérieur et de ne pas participer, alors même qu'on est présent⋅e. Dit autrement, alors que tout le monde se rencontre à travers les discussions, se met en jeu, ce n'est pas le cas des animateur⋅ice⋅s, et je me demande si ça impacte l'ambiance générale ?&lt;/p&gt;
&lt;p&gt;En tout cas, j'aime bien l'idée qu'il soit possible d'à la fois animer les temps de forums et de participer. Dans ce cas là, existe-il des stratagèmes / artifices pour permettre de visibiliser ces prises de pouvoir pendant les discussions ?&lt;/p&gt;
&lt;p&gt;Je suis preneur de tout retour d'expérience sur le sujet !&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Artfevre 2020 - Défi artistique en février</title><link href="https://blog.notmyidea.org/artfevre-2020-defi-artistique-en-fevrier.html" rel="alternate"></link><published>2020-03-01T00:00:00+01:00</published><updated>2020-03-01T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-03-01:/artfevre-2020-defi-artistique-en-fevrier.html</id><summary type="html">&lt;p&gt;En Février, il y a 29 Jours, et avec un ami on s'est dit qu'on aimerait bien utiliser chacun d'entre eux pour créer — de manière intensive et sans jugement — hors de notre zone de confort, et avec des contraintes imposées.&lt;/p&gt;
&lt;p&gt;L'idée, c'est qu'à la fin du mois, chacun⋅e puisse …&lt;/p&gt;</summary><content type="html">&lt;p&gt;En Février, il y a 29 Jours, et avec un ami on s'est dit qu'on aimerait bien utiliser chacun d'entre eux pour créer — de manière intensive et sans jugement — hors de notre zone de confort, et avec des contraintes imposées.&lt;/p&gt;
&lt;p&gt;L'idée, c'est qu'à la fin du mois, chacun⋅e puisse se retourner (c'est une image hein) et se dire : « Ouah, jai fait tout ça !? »&lt;/p&gt;
&lt;p&gt;Cest donc une une liste de 29 thèmes (un par jour du mois) : chaque jour, on doit faire quelque chose dartistique à partir du thème proposé.&lt;/p&gt;
&lt;h2 id="quelques-retours"&gt;Quelques retours&lt;/h2&gt;
&lt;p&gt;Je n'ai pas réussi à faire des créations pour les 29 thèmes, mais dans l'ensemble je suis très content de ce que j'ai pu créer : j'ai pu expérimenter des choses que je n'avais pas imaginées. J'ai pu faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Du montage vidéo ;&lt;/li&gt;
&lt;li&gt;De la musique acoustique ;&lt;/li&gt;
&lt;li&gt;De la musique électronique ;&lt;/li&gt;
&lt;li&gt;Du montage audio ;&lt;/li&gt;
&lt;li&gt;De l'écriture de nouvelles ;&lt;/li&gt;
&lt;li&gt;Une comptine ;&lt;/li&gt;
&lt;li&gt;De la photo ;&lt;/li&gt;
&lt;li&gt;Du montage photo ;&lt;/li&gt;
&lt;li&gt;De l'Art Plastique ;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'était très sympa de voir les créations des unes et des uns arriver sur notre espace de partage de fichiers, certaines créations étaient vraiment géniales ! Et j'ai même carrément hâte de remettre ça l'an prochain :-)&lt;/p&gt;
&lt;h2 id="un-peu-plus-dinfos"&gt;Un peu plus d'infos&lt;/h2&gt;
&lt;p&gt;Voici des infos qu'on a envoyé aux participant⋅e⋅s, et que je consigne ici question de l'avoir quelque part&lt;/p&gt;
&lt;p&gt;Voici une liste d'idées de « trucs » à faire chaque jour : Faire un dessin, Composer (et enregistrer ?) une musique, Filmer quelque chose, Inventer une chorégraphie, Écrire un texte, Inventer une origami, Se faire un tatouage (en fonction du thème, pas conseillé), Inventer un exercice de théâtre, Créer un jeu, Faire une sculpture dargile, Créer une position de Yoga, Prendre une photo, inventer une recette de cuisine, Écrire un slam, etc, etc.&lt;/p&gt;
&lt;p&gt;Vous pouvez décider de ne choisir quune forme artistique (par exemple que la musique) pour vous forcer à explorer un médium en dehors de votre zone de confort (« je sais faire une musique rapidement, mais sais-je faire 29 fois une musique différente rapidement ? »), ou alors changer dexpression artistique tous les jours. Voyez ce qui vous amuse / anime le plus !&lt;/p&gt;
&lt;p&gt;On aimerait mettre en commun nos productions quelque part, pour voir comment les gens différents se sont approprié un même thème ! Bien sur c'est tout à fait optionnel : libre à vous de participer sans publier vos créations.&lt;/p&gt;
&lt;p&gt;Ça vous botte ? Envoyez nous un petit mail a artfevre@notmyidea.org et on vous tient au courant !
Techniquement ?&lt;/p&gt;
&lt;p&gt;Si vous voulez poster vos créations, on vous propose de le faire sur un espace en ligne. Plusieurs choses sur ce « cloud » :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On a préparé un dossier par jour, postez votre / vos création(s) dans le dossier qui va bien. Il y a également un dossier « Les thèmes &amp;amp; ressources » qui contient les photos, vidéos et musiques qui serviront de contraintes certains jours, ainsi qu'un rappel des thèmes ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On a aucun moyen de savoir qui poste quoi, si vous voulez être crédités, mettez votre pseudo / nom dans le nom du fichier (ex. « Sam-3-fevrier.jpg » ou « AlexCompo7Fevrier.mp3 »). Si vous préférez l'ombre à la lumière, vous pouvez laisser un titre poétique comme «W33.jpg » ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ne repostez pas les contenus d'autres participant⋅es (d'aucun diraient « d'autrui ») sans leur accord ;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour avoir l'adresse du cloud magique, envoyez nous un mail à artfevre@notmyidea.org.&lt;/p&gt;
&lt;h2 id="invitations"&gt;Invitations&lt;/h2&gt;
&lt;p&gt;Le défi commence le samedi 1er Février, mais il est possible de nous rejoindre en route : si vous voulez en parler à des ami⋅e⋅s, n'hésitez pas !&lt;/p&gt;
&lt;p&gt;Donnez leur l'adresse du site web : https://artfevre.notmyidea.org&lt;/p&gt;
&lt;h2 id="rappels"&gt;Rappels&lt;/h2&gt;
&lt;p&gt;Pas de pression : Amusons-nous, l'idée est de passer de bons moments&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je ne veux faire qu'une seule semaine ? Pas de soucis !&lt;/li&gt;
&lt;li&gt;J'ai pas envie de poser mes publications en public… No problem !&lt;/li&gt;
&lt;li&gt;J'ai loupé trois jours, c'est la merde ! Hakuna Matata !&lt;/li&gt;
&lt;li&gt;J'ai envie de faire un thème à plusieurs ! No problemo !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personne d'autre que vous ne juge ce que vous faites ! Et… à propos de ça, même vous d'ailleurs n'y êtes pas obligés.&lt;/p&gt;
&lt;h2 id="des-questions-des-reponses"&gt;Des questions ? Des réponses !&lt;/h2&gt;
&lt;h3 id="jai-envie-de-le-faire-mais-je-suis-trop-perfectionniste-pour-finir-un-truc-par-jour"&gt;Jai envie de le faire, mais je suis trop perfectionniste pour finir un truc par jour !&lt;/h3&gt;
&lt;p&gt;Cest tout le sens du projet ! Si je dois finir cette chanson/ce dessin/ce texte aujourdhui, ça ne sera peut-être pas le meilleur des dessins, mais au moins il aura le mérite dexister. Dans mon expérience personnelle, si jattends davoir produit le meilleur objet, je finis par ne rien finir, car rien nest parfait. Là, au moins, lobjet existe, et si vous le souhaitez, il peut servir de base plus tard à un re-travail pour viser quelque chose de plus « fignolé ».&lt;/p&gt;
&lt;h3 id="mais-si-je-rate-un-jour-si-jai-pas-le-temps"&gt;Mais si je rate un jour, si jai pas le temps ?&lt;/h3&gt;
&lt;p&gt;Chacun⋅e fait comme iel veut/peut et sastreint la discipline quiel a envie de tester ! Personne ne viendra surveiller ou juger le travail des autres. Si vous prenez 2 jours par thème et que vous continuez le truc jusquà fin mars pour finir, pas de soucis !&lt;/p&gt;
&lt;h3 id="jai-peur-de-pas-avoir-linspiration"&gt;Jai peur de pas avoir linspiration !&lt;/h3&gt;
&lt;p&gt;Pour nous, attendre linspiration est un prétexte qu'on se donne pour repousser le moment de se mettre au travail. Linspiration, ça se provoque, ça ne sattend pas. Et puis peut-être que je trouverai nulle ma création du jour, mais au moins jaurai fait quelque chose. 1 vaut mieux que 0. Et de ce truc que moi je trouve nul (cest pas pour ça que cest nul, à vrai dire), peut-être que j'en tirerai une note que jaime bien, une formulation qui me plaît, un mouvement que jadore, et que je ré-utiliserai après dans une autre création. Ou alors, peut-être que je ne retirerai que la satisfaction de lavoir fait, et cest déjà pas mal !&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Le piège du développement personnel</title><link href="https://blog.notmyidea.org/le-piege-du-developpement-personnel.html" rel="alternate"></link><published>2020-01-21T00:00:00+01:00</published><updated>2020-01-21T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-21:/le-piege-du-developpement-personnel.html</id><summary type="html">&lt;p&gt;Ces derniers temps, je me suis retrouvé à questionner mon rapport a la pratique du développement personnel. À quel point le celui ci, et la « psychologie positive » peuvent-elles jouer un rôle de « cache misère » vis à vis des différentes formes d'oppression et de domination à l'œuvre dans notre société ?&lt;/p&gt;
&lt;p&gt;Voire …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ces derniers temps, je me suis retrouvé à questionner mon rapport a la pratique du développement personnel. À quel point le celui ci, et la « psychologie positive » peuvent-elles jouer un rôle de « cache misère » vis à vis des différentes formes d'oppression et de domination à l'œuvre dans notre société ?&lt;/p&gt;
&lt;p&gt;Voire même : ce courant de pensée peut-il favoriser un certain conservatisme ? Se changer soi même équivaut-il à une adaptation au système en place, supprimant alors toute volonté de révolte et de changement sociétal ?&lt;/p&gt;
&lt;p&gt;Face à un constat considéré comme « négatif » sur notre société, plusieurs manières de prendre la chose (entre autres) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Le travail sur soi&lt;/strong&gt;, qui cherche à percevoir les choses sous le meilleur angle possible. Ici, « Toute expérience est bonne à prendre » ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La problématisation&lt;/strong&gt; : essayer de comprendre quelles sont les normes et les valeurs qui amènent au problème constaté.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="le-probleme"&gt;Le problème ?&lt;/h2&gt;
&lt;p&gt;« Travailler sur soi » est parfois mis en opposition avec le fait de déconstruire sociétalement notre monde.&lt;/p&gt;
&lt;p&gt;Il est (bien sur) souhaitable de mieux vivre la violence des systèmes oppressifs, mais il semble quelque part important d'en avoir d'abord conscience, pour que ce « travail sur soi » ne soit pas assimilé à une « technique de l'autruche ».&lt;/p&gt;
&lt;p&gt;Il semble aussi que nous ne sommes malheureusement pas tou⋅te⋅s égaux/égales face aux violences systémiques, et « mieux vivre » ces violences, bien que possible pour certain⋅e⋅s, reste impossible pour d'autres &lt;sup id="fnref:matrice-des-dominations"&gt;&lt;a class="footnote-ref" href="#fn:matrice-des-dominations"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Plutôt que d'accepter (implicitement) cette violence, il me semble utile de &lt;strong&gt;comprendre comment cette violence s'applique&lt;/strong&gt;, de manière à remonter aux racines du problème, pour pouvoir le résoudre.&lt;/p&gt;
&lt;h2 id="developpement-personnel-vs-sociologie"&gt;Développement personnel vs sociologie&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;N'acceptez pas les choses que vous ne pouvez changer, mais changez les choses que vous ne pouvez pas accepter. &lt;/p&gt;
&lt;p&gt;— Angela Davis&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le développement personnel, bien qu'une pratique avec des buts qui semblent nobles de prime abord, semble contenir son lot de problèmes.&lt;/p&gt;
&lt;p&gt;Parmi ceux-cis : une minimisation des problèmes ressentis, et comme le dit Aude Vidal dans son livre « Égologie », une culpabilisation de chacun⋅e : « Si tu en est là, c'est que tu choisis de voir les choses sous cet angle ».&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;« Se changer soi pour changer le monde », cette prescription […] semble au final un leurre, car travailler sur soi-même […] c'est avant tout accepter une vision du monde où chacun⋅e étant capable d'aller bien, chacun⋅e est responsable de son sort.
— Aude Vidal, Égologie&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Parfois, on en vient également à « psychologiser » des situations, c'est à dire essayer d'expliquer des situations sociétales comme on le ferait d'une personne, sans prendre en compte la société dans son ensemble et dans sa complexité, et cela vient se substituer à l'approche sociologique.&lt;/p&gt;
&lt;p&gt;On peut également voir ce déni de l'approche sociologique comme une naïveté à l'égard du monde, entretenue par les nombreux ouvrages qu'on trouve sur le sujet. On nous dira bientôt qu'il faut arrêter de se tenir au courant de ce qui se déroule dans le monde, les mauvaises nouvelles étant diablement mauvaises pour notre Karma.&lt;/p&gt;
&lt;p&gt;Penser le monde dans sa complexité me semble une condition nécessaire pour pouvoir le faire évoluer dans une direction intéressante. &lt;/p&gt;
&lt;h2 id="une-culture-de-la-passivite"&gt;Une culture de la passivité&lt;/h2&gt;
&lt;p&gt;Cette manière de penser le monde nous pousse à la passivité : si plutôt que de voir les choses en face, nous décidons de changer notre manière de percevoir les problèmes, alors nous nous dépolitisons.&lt;/p&gt;
&lt;p&gt;Elle laisse également penser que l'approche sociologique nous empêcherait d'agir, comme si réfléchir aux problèmes de société était un problème en soi, alors que monopole de la résolution de conflit n'est pas au développement personnel !&lt;/p&gt;
&lt;p&gt;L'approche sociologique permet quelque part de se déculpabiliser : on peut à partir du constat sociologique se dire « je suis oppréssé⋅e, c'est pas de ma faute, maintenant que je le sais je peux travailler dessus plus facilement ».&lt;/p&gt;
&lt;p&gt;Une prise de pouvoir, en quelque sorte.&lt;/p&gt;
&lt;h2 id="ressources-pour-aller-plus-loin"&gt;Ressources / pour aller plus loin&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.monde-diplomatique.fr/2018/08/MALET/58981"&gt;Le système Pierre Rahbi — Le monde diplomatique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.notmyidea.org/egologie.html"&gt;Égologie, par Aude Vidal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://labrique.net/index.php/thematiques/politicaille/954-cyril-dion-coli-briseur-de-l-ecologie-radicale"&gt;Cyril Dion, Coli-briseur de l'écologie radicale — La brique&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:matrice-des-dominations"&gt;
&lt;p&gt;Comme théorisé avec la &lt;a href="https://en.wikipedia.org/wiki/Matrix_of_domination"&gt;matrice des dominations&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:matrice-des-dominations" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Réfléxions"></category></entry><entry><title>Packager du python pour Debian</title><link href="https://blog.notmyidea.org/packager-du-python-pour-debian.html" rel="alternate"></link><published>2020-01-14T00:00:00+01:00</published><updated>2020-01-14T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-14:/packager-du-python-pour-debian.html</id><summary type="html">
&lt;p&gt;Aujourd'hui j'ai fais un peu de packaging pour la distribution Linux Debian, avec l'aide d'un ami. C'était assez agréable de pouvoir me faire aider dans cet objectif : j'avais déjà tenté l'expérience en solo par le passé, et m'étais cassé les dents sur le sujet.&lt;/p&gt;
&lt;p&gt;Voici quelques notes prises durant l'après-midi …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Aujourd'hui j'ai fais un peu de packaging pour la distribution Linux Debian, avec l'aide d'un ami. C'était assez agréable de pouvoir me faire aider dans cet objectif : j'avais déjà tenté l'expérience en solo par le passé, et m'étais cassé les dents sur le sujet.&lt;/p&gt;
&lt;p&gt;Voici quelques notes prises durant l'après-midi, qui pourront sans doute me servir pour la suite.&lt;/p&gt;
&lt;h2 id="quest-ce-quon-fait"&gt;Qu'est-ce qu'on fait ?&lt;/h2&gt;
&lt;p&gt;On essaye de créer un paquet Debian pour une application Web écrite en python. Il s'agit d'une application assez simple, qui communique avec une base de données d'un côté, et avec des utilisateurs de l'autre.&lt;/p&gt;
&lt;h2 id="y-aller-par-etapes"&gt;Y aller par étapes&lt;/h2&gt;
&lt;p&gt;On a essayé de faire en sorte d'avoir quelque chose de fonctionnel assez rapidement, même si pas entièrement fait dans les règles de l'art. Ça à l'avantage de garder la motivation :-)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Produire un paquet &lt;code&gt;.deb&lt;/code&gt; qui peut s'installer, et qui fait tourner l'application en question ;&lt;/li&gt;
&lt;li&gt;Avoir un paquet qui passe les règles de validation de Debian ;&lt;/li&gt;
&lt;li&gt;Intégrer le paquet avec &lt;code&gt;systemd&lt;/code&gt; ;&lt;/li&gt;
&lt;li&gt;Intégrer le paquet dans un système de contrôle de version type git ;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="packaging-simple-1ere-version-fonctionnelle"&gt;Packaging « simple » - 1ère version fonctionnelle&lt;/h2&gt;
&lt;p&gt;On commence par faire un paquet dit « natif ». C'est l'approche la plus simple.
Deux fichiers sont importants, pour commencer : &lt;code&gt;control&lt;/code&gt; et &lt;code&gt;changelog&lt;/code&gt;. Le fichier &lt;code&gt;control&lt;/code&gt; contient un bloc « source » et un ou plusieurs blocs « package », dans l'idée de pouvoir avoir potentiellement plusieurs paquets binaires générés à partir du même package source, ce qui est utile pour les gros paquets.&lt;/p&gt;
&lt;p&gt;Voici les étapes qu'on a suivi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Créer les fichiers &lt;code&gt;control&lt;/code&gt;, &lt;code&gt;changelog&lt;/code&gt; et &lt;code&gt;rules&lt;/code&gt; dans le répertoire &lt;code&gt;debian&lt;/code&gt;. Dans la pratique on peut les copier depuis un autre paquet qu'on prends comme modèle ;&lt;/li&gt;
&lt;li&gt;Installer les dépendances de build avec &lt;code&gt;sudo apt install devscripts &amp;amp;&amp;amp; mk-build-deps -i -r --root-cmd sudo&lt;/code&gt; ;&lt;/li&gt;
&lt;li&gt;Lancer &lt;code&gt;dpkg-buildpackage -rfakeroot&lt;/code&gt; qui va construire le paquet pour nous ;&lt;/li&gt;
&lt;li&gt;Regarder la sortie de la commande pour voir les dépendances qui ne sont pas déjà prêtes pour Debian ;&lt;/li&gt;
&lt;li&gt;Pour les quelques dépendances qui n'étaient pas déjà prêtes, on a répété les étapes précédentes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="questions-diverses-observations"&gt;Questions diverses &amp;amp; observations&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dh-helper&lt;/code&gt; est une manière de packager « officiellement recommandée », il s'agit d'un ensemble d'outils qui cherchent à se faciliter la tache de &lt;em&gt;packaging&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour les traductions : il n'est pas nécessaire de faire des paquets séparés pour la traduction, c'est acceptable de tout mettre dans le même paquet.&lt;/p&gt;
&lt;p&gt;La documentation peut elle aussi être intégrée dans le même paquet.&lt;/p&gt;
&lt;p&gt;Pour les numéros de version, si on a pas de tiret dans le numéro de version, alors il s'agit de la version &lt;em&gt;upstream&lt;/em&gt;. Si on a un tiret, ce qui est après le numéro de version est la version du &lt;em&gt;packaging&lt;/em&gt; pour Debian.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DEB_BUILD_OPTIONS=nocheck&lt;/code&gt; permet de ne pas avoir à lancer les tests à chaque fois qu'on construit le paquet.&lt;/p&gt;
&lt;h2 id="etapes-dapres"&gt;Étapes d'après&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Peut-être utiliser&lt;code&gt;debian/missing-sources&lt;/code&gt;, en tout cas régler le souci pour les bibliothèques JavaScript et le CSS dont les sources ne sont pas distribuées actuellement (parce que versions minifiées).&lt;/li&gt;
&lt;li&gt;Il est possible d'installer des dépendances et de spécifier des liens symboliques à créer lors de l'installation.&lt;/li&gt;
&lt;li&gt;Intégrer de la documentation sous forme de &lt;code&gt;manpage&lt;/code&gt;. Il semble que certains outils permettent de le faire de manière simple / automatique, comme « help2man »&lt;/li&gt;
&lt;li&gt;De la même manière qu'on le fait pour les ressources type JS et CSS, il faut intégrer les &lt;em&gt;fonts&lt;/em&gt;, en faisant référence aux fonts empaquetées pour Debian. &lt;/li&gt;
&lt;li&gt;Une fois que tout ça fonctionne, passer à un système de build qui comprends git&lt;/li&gt;
&lt;li&gt;Faire une intégration avec &lt;code&gt;systemd&lt;/code&gt; pour avoir un service qui se lance automatiquement. Ce qui veut aussi dire créer un utilisateur spécifique pour notre service.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>Prendre le temps</title><link href="https://blog.notmyidea.org/prendre-le-temps.html" rel="alternate"></link><published>2020-01-14T00:00:00+01:00</published><updated>2020-01-14T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-14:/prendre-le-temps.html</id><summary type="html">&lt;h2 id="prendre-le-temps"&gt;Prendre le temps&lt;/h2&gt;
&lt;p&gt;Jusqu'ici, j'ai souvent eu l'impression que le temps s'écoulait sans que je puisse avoir de prise dessus.&lt;/p&gt;
&lt;p&gt;Depuis peu, je me rends compte que j'ai l'opportunité de « visiter » ce flux, de — quelque part — « naviguer » en son sein, et que ce faisant, il se densifie, il prends plus …&lt;/p&gt;</summary><content type="html">&lt;h2 id="prendre-le-temps"&gt;Prendre le temps&lt;/h2&gt;
&lt;p&gt;Jusqu'ici, j'ai souvent eu l'impression que le temps s'écoulait sans que je puisse avoir de prise dessus.&lt;/p&gt;
&lt;p&gt;Depuis peu, je me rends compte que j'ai l'opportunité de « visiter » ce flux, de — quelque part — « naviguer » en son sein, et que ce faisant, il se densifie, il prends plus de place, il s'épaissit en quelque sorte.&lt;/p&gt;
&lt;p&gt;Je prends plus de temps pour ressentir ce que je fais, et les effets semblent également se sentir sur ma relation aux autres, et sur le soin que je veux porter à mes relations.&lt;/p&gt;
&lt;p&gt;Ça me donne l'impression d'avoir un contrôle sur le temps qui s'écoule (et ça c'est cool :-)).&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Limites horaires</title><link href="https://blog.notmyidea.org/limites-horaires.html" rel="alternate"></link><published>2020-01-04T00:00:00+01:00</published><updated>2020-01-04T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-04:/limites-horaires.html</id><summary type="html">
&lt;p&gt;Depuis que j'ai décidé de faire un break technologique, je ne m'en sors pas si mal. Parmi les mesures que j'avais envie de prendre, était le fait de limiter le temps d'utilisation de mon ordinateur personnel.&lt;/p&gt;
&lt;p&gt;J'utilise le logiciel &lt;a href="https://launchpad.net/timekpr-next"&gt;timekpr-next&lt;/a&gt; qui me permet de définir une limite d'utilisation par jour …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Depuis que j'ai décidé de faire un break technologique, je ne m'en sors pas si mal. Parmi les mesures que j'avais envie de prendre, était le fait de limiter le temps d'utilisation de mon ordinateur personnel.&lt;/p&gt;
&lt;p&gt;J'utilise le logiciel &lt;a href="https://launchpad.net/timekpr-next"&gt;timekpr-next&lt;/a&gt; qui me permet de définir une limite d'utilisation par jour. Le logiciel me notifie quand je dois m'arrêter, et même si je peux rajouter du temps si j'en ai besoin, ça semble plutôt marcher : ça me donne un moyen de percevoir le temps que je dépense derrière cet ordinateur.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Prendre soin</title><link href="https://blog.notmyidea.org/prendre-soin.html" rel="alternate"></link><published>2020-01-04T00:00:00+01:00</published><updated>2020-01-04T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-04:/prendre-soin.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;De moi, et de ma relation aux autres.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C'est peut-être l'effet des deux semaines de vacances : je me retrouve à prendre plus soin de mes relations aux autres humain⋅e⋅s, à avoir plus d'empathie, et j'ai l'impression de tisser des liens plus forts avec les personnes que je croise …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;De moi, et de ma relation aux autres.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C'est peut-être l'effet des deux semaines de vacances : je me retrouve à prendre plus soin de mes relations aux autres humain⋅e⋅s, à avoir plus d'empathie, et j'ai l'impression de tisser des liens plus forts avec les personnes que je croise.&lt;/p&gt;
&lt;p&gt;C'est agréable :-)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Remettre les choses à plus tard</title><link href="https://blog.notmyidea.org/remettre-les-choses-a-plus-tard.html" rel="alternate"></link><published>2020-01-04T00:00:00+01:00</published><updated>2020-01-04T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2020-01-04:/remettre-les-choses-a-plus-tard.html</id><summary type="html">
&lt;p&gt;Une autre astuce qui me permet de retrouver du temps, c'est de remettre certaines choses à plus tard. Certain⋅ne⋅s diraient que c'est de la procrastination, mais je demande par exemple aux personnes de passer par les canaux qui me permettent de mieux compartimenter les choses.&lt;/p&gt;
&lt;p&gt;Par exemple, si …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Une autre astuce qui me permet de retrouver du temps, c'est de remettre certaines choses à plus tard. Certain⋅ne⋅s diraient que c'est de la procrastination, mais je demande par exemple aux personnes de passer par les canaux qui me permettent de mieux compartimenter les choses.&lt;/p&gt;
&lt;p&gt;Par exemple, si je reçois un SMS qui me demande de faire quelque chose en rapport avec la technologie, je demande à la personne émettrice de m'envoyer un email.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Au delà de la pénétration</title><link href="https://blog.notmyidea.org/au-dela-de-la-penetration.html" rel="alternate"></link><published>2020-01-01T00:00:00+01:00</published><updated>2020-01-01T00:00:00+01:00</updated><author><name>Martin Page</name></author><id>tag:blog.notmyidea.org,2020-01-01:/au-dela-de-la-penetration.html</id><summary type="html">&lt;p&gt;Le livre est une ode aux plaisirs, une proposition de dépasser une sexualité étriquée, renfermée sur des pratiques traditionnelles qui ne sont pas forcement les meilleures en terme de plaisirs.&lt;/p&gt;
&lt;p&gt;C'est un tout petit livre de 150 pages, découpé en trois parties : une introduction, un recueil de témoignages et enfin …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Le livre est une ode aux plaisirs, une proposition de dépasser une sexualité étriquée, renfermée sur des pratiques traditionnelles qui ne sont pas forcement les meilleures en terme de plaisirs.&lt;/p&gt;
&lt;p&gt;C'est un tout petit livre de 150 pages, découpé en trois parties : une introduction, un recueil de témoignages et enfin quelques remerciements.&lt;/p&gt;
&lt;p&gt;L'auteur vient préciser qu'il existe différentes sexualités, qu'avant tout une sexualité &lt;em&gt;devrait&lt;/em&gt; être une rencontre, une écoute mutuelle, une recherche des plaisirs de chacun⋅e.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La question est: y a t-il des pratiques obligatoires ? Si dans un couple, la pénétration (ou toute autre pratique sexuelle) n'était pas (ou plus) possible (ou pas ou plus souhaitée) est-ce que "ce serait vraiment une tragédie" ? Si ma compagne ne veut plus être pénétrée, si mon compagnon ne bande plus, est-ce forcement la fin du désir et du plaisir ? Ou bien est-ce l'occasion d'être créatifs ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il précise que parfois (souvent ?) la pénétration n'est pas une pratique qui procure du plaisir aux femmes, et que, parce que c'est un tabou, la pratique n'est pas vraiment remise en question. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Et parfois, tout simplement, des femmes n'aiment pas particulièrement ça, elles ne ressentent pas le plaisir incroyable qu'on leur intime de ressentir lors de cet acte. Elles ne souffrent de rien, pas de blessures, pas de peur, tout simplement ce n'est pas le truc le plus intéressant pour elles en matière de sexualité. C'est juste sympa, voire sans intérêt.&lt;/p&gt;
&lt;p&gt;Une amie me racontant que le problème de la pénétration vaginale c'est qu'elle impliquait forcément contraception et que cela coûtait aux femmes. Une charge mentale de plus, une responsabilité, un truc auquel penser.&lt;/p&gt;
&lt;p&gt;Sans pénétration, tout le corps est hypersensible et délicieusement hyperactif. Faire l'amour devrait être la rencontre des corps et leur conversation.&lt;/p&gt;
&lt;p&gt;Finalement, la pénétration est un mode adapté au capitalisme, à nos journées volées par le travail, par les angoisses et la compétition. Comme il y a peu de temps pour penser l'amour, le pénis dans le vagin est pratique, on tient un certain temps, c'est calibré, il y a un début et une fin bien précise, on accomplit son devoir sans penser et sans imaginer. La société applaudit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ce passage fait echo pour moi, et à mon rapport au temps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Les hommes veulent entrer dans le corps de l'autre à tout prix, ils s'en servent comme d'un objet au service de leur jouissance et souvent le plaisir de leur partenaire est accessoire. Ils disent qu'ils font l'amour mais en fait ils se masturbent dans le corps des femmes
Le patriarcat règne. Souvent la pénétration reproduit la domination de l'homme sur la femme : l'homme tient la femme, son sexe est en elle, il décide et dirige.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Japprécie que l'analyse ne soit pas portée sur la question de la sexualité sans évoquer les problématiques féministes, qui en mon sens sont centrales.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En fait, l'homme préfère ne pas y penser. Plus exactement: il refuse de se penser comme un être pénétrable. Il est farouchement contre sa propre pénétration. Pourquoi ? Arès tout, si la pénétration peut apporter du plaisir aux femmes, elle peut plus sûrement encore en donner aux hommes. C'est un fait. L'anatomie masculine est dotée d'une prostate [...]. Cet organe est une zone puissamment érogène et une grande source de plaisir qui peut conduire à la jouissance et à l'éjaculation. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bien sur, le massage prostatique est tabou encore plus grand (que parler de pénétration vaginale), et ce plaisir n'est pas pratiqué par la grande majorité des hommes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le désir de leur propre pénétration est singulièrement absent chez les hommes hétérosexuels qui paraissent ainsi comme de ridicules et paradoxales victimes de leur domination. [...] Dans leurs majorité, les hommes hétérosexuels, pourtant aventureux déclarés quand il s'agit du corps de l'autre, se révèlent puritains concernant leur propre corps. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et, en parlant de l'utilisation de l'anus / de la prostate : &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Leur angoisse étant de ne pas être assez homme, de ne pas correspondre au cliché viril. C'est bien ça l'enjeu pour certains : ils pénètrent pour ne pas risquer de mettre au jour leur propre désir d'avoir un doigt ou un gode dans l'anus, pour ne pas devenir un être pénétrable, c'est-à-dire, dans leur stupide esprit macho : une femme ou un homosexuel. Donc un dominé, un faible. &lt;strong&gt;Être considéré comme une femme ou un gay reste la grande peur des hétérosexuels&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J'aime bien les « insultes » qui sont utilisées par Martin page : « Punaise de kalenbullar de plutonium », « punaise de tragédie », etc. C'est mignon et c'est bien comme ça !&lt;/p&gt;</content><category term="Lectures"></category><category term="sexualité"></category><category term="féminisme"></category></entry><entry><title>La conjuration des égos</title><link href="https://blog.notmyidea.org/la-conjuration-des-egos.html" rel="alternate"></link><published>2020-01-01T00:00:00+01:00</published><updated>2020-01-01T00:00:00+01:00</updated><author><name>Aude Vidal</name></author><id>tag:blog.notmyidea.org,2020-01-01:/la-conjuration-des-egos.html</id><summary type="html">&lt;h1 id="le-feminisme-entre-intime-et-politique"&gt;Le féminisme, entre intime et politique&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Privées de paroles, privées d'espace, les femmes sont aussi d'une certaine manière privées de leur corps. C'est ainsi qu'est décrit le rapport des petites filles à leur corps par des sportives qui notent la faible amplitude d'un geste, un bras qui ne va pas …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1 id="le-feminisme-entre-intime-et-politique"&gt;Le féminisme, entre intime et politique&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Privées de paroles, privées d'espace, les femmes sont aussi d'une certaine manière privées de leur corps. C'est ainsi qu'est décrit le rapport des petites filles à leur corps par des sportives qui notent la faible amplitude d'un geste, un bras qui ne va pas chercher loin derrière pour envoyer une balle.&lt;/p&gt;
&lt;p&gt;Les femmes sont les premières à se flageller, lorsqu'elle ne le sont pas, disponibles : « égoïste », « tu ne pense qu'à toi ». Conseils familiaux, amicaux et professionnels, émis indifféremment par des individues des deux sexes, castrent les femmes, les culpabilisent, s'attaquent à leurs exigences pour leur faire rejoindre le niveau acceptable.&lt;/p&gt;
&lt;p&gt;Le recours à la recherche en sciences humaines et sociales est ici vital pour débusquer les inégalités, tant dans le discours commun le moindre contre-exemple (« Oui, mais moi je connais des femmes qui ») démonte toute tentative de généralisation.&lt;/p&gt;
&lt;p&gt;La disproportion entre l'immensité de la tâche (détruire le patriarcat) et les luttes minuscules (le refus de l'expression « mademoiselle » par exemple) pour s'y atteler sans attendre le Grand Soir offre un objet de sarcasmes tout prêt à ceux qui ont intérêt à ce que rien ne change et à ce que les femmes restent ces petits être serviables et décoratifs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="penser-ensemble-lemancipation"&gt;Penser ensemble l'émancipation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;L'objectif de changer le sort de toutes les femmes semble s'être perdu en route quand le féminisme n'est plus décrit par certaines camarades que comme un outil pour être « à l'aise avec son identité de genre ». Ainsi une oppression ne serait problématique que parce qu'elle crée du malaise, pas quand elle est si bien intégrée qu'elle en paraît naturelle. Ce féminisme ne s'adresse plus à toutes les femmes mais à celles qui sauront s'en saisir dans leur parcours de vie. Le mouvement qui donnait une importance nouvelle au personnel pour changer le politique laisse apparaître parfois de manière marginale, parfois de manière plus prégnante, une entreprise émancipatrice individuelle ou à la dimension collective réduite, attentive aux parcours et identités des personnes qui l'investissent.&lt;/p&gt;
&lt;p&gt;Au lieu de lutter de front contre les assignations de genre, de tenter de les neutraliser — au moins le temps de l'enfance, comme le proposent les féministes pour les écoles suédoises — on va plutôt chercher à les adapter aux besoins individuels et à rendre confortable l'habitude (finalement plus problématique du tout !) de s'adresser à chacun⋅e en fonction de son identité de genre, pourvu qu'elle coïncide avec ses souhaits.&lt;/p&gt;
&lt;p&gt;Mais cette bienveillance qui n'a pour but qu'elle même est aussi stérile qu'un féminisme qui a vocation à permettre à des femmes de se construire des destins singuliers appréciables. Le féminisme nous aide à combattre les inégalités entre hommes et femmes, pas à construire des bulles de confort dans un monde qui va mal et qui fait mal&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="un-genre-a-soi"&gt;Un genre à soi&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Parallèlement à ces sommets de sexisme, alors que nous avons plus besoin de féminisme que jamais, dans les milieux radicaux s'impose l'idée que la catégorie « femme » est bien étriquée et qu'abolir le genre passe par la remise en cause des identités genrées au niveau individuel… de même qu'on sauve la planète du désastre écologique en fermant le robinet quand on se brosse les dents ? Adopter une identité non-binaire ou trans, ce serait refuser l'assignation à des rôles sociaux stéréotypés et donc les détruire, espère-t-on.&lt;/p&gt;
&lt;p&gt;Explorer les différentes manières de vivre en dehors d'assignations étriquées est une démarche intéressante… pour soi même. Rappelons que personne n'échappe à des assignations très binaires qui nous ont formé⋅es et dont il serait présomptueux de dire que nous les avons « déconstruites ». Mais surtout : à quoi bon exercer une grande liberté individuelle si ce n'est pour rappeler que cette liberté concerne toutes les femmes et n'est pas réservée à celles qui se définissent comme non-binaires ou trans ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J'ai un peu de mal avec ce passage, peut-être parce que je ne le comprends pas tout à fait. Je tente la paraphrase, « C'est bien de se remettre en question, mais il ne faudrait pas croire qu'on réussit à s'extraire de notre construction genrée. Et même si on avait réussi, à quoi cela servirait-il ? », ou alors « C'est bien de se défaire des constructions genrées, mais ce n'est pas un objectif en soi ».&lt;/p&gt;
&lt;p&gt;Je pense que ce qui me dérange c'est qu'on vient « taper » sur les trans ici, et que j'ai du mal à avoir une vision nuancée sur le sujet : c'est (plus ou moins) discuté dans la suite du bouquin, mais il ne faudrait pas que ces considérations puissent être utilisées pour venir accuser les personnes trans, alors même que celles-ci vivent déjà une oppression importante : pourquoi on vient les accuser, et de quoi ? Qu'est ce que cette accusation permet de développer en terme politique ? Quel est l'objectif, et qu'est-ce que cela fait vivre comme oppression, me semble aussi un point important.&lt;/p&gt;
&lt;p&gt;Je ne suis pas sur de lire les choses correctement, mais Aude Vidal ici semble mettre un peu trop de côté ces ressentis personnels, parce que — de son point de vue — ils obstruent la prise de recul et l'analyse sur le sujet : on vient mettre le &lt;em&gt;focus&lt;/em&gt; sur les relations interpersonnelles, et celles-ci prennent le pas sur l'objectif. Comme elle le formule :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le féminisme nous aide à combattre les inégalités entre hommes et femmes, pas à construire des bulles de confort dans un monde qui va mal et qui fait mal.&lt;/p&gt;
&lt;p&gt;Le succès grandissant des identités non-binaires peut morceler la classe des femmes jusqu'à les sommer daccueillir avec sororité des hommes non-binaires. [...] Ces espaces sont des lieux d'&lt;em&gt;empowerment&lt;/em&gt; individuel mais surtout collectif, &lt;strong&gt;ce qui requiert une approche en termes de classe qui n'existe ni dans la revendication d'une identité non-binaire, ni dans une critique complaisante de la masculinité&lt;/strong&gt; en tant que case trop étroite pour permettre l'épanouissement des personnes qui y sont assignées.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ce passage me fait penser aux groupes de paroles auxquels je participe, pour lesquels nous étions en non-mixité hommes à ses débuts, pour s'ouvrir a une mixité pour éviter les écueils dont il est question ici. Japprécie de trouver ici le concept de « classe » qui me semble être important.&lt;/p&gt;
&lt;h2 id="autodefinition-ou-sont-les-autres"&gt;Autodéfinition : où sont les autres ?&lt;/h2&gt;
&lt;p&gt;Mes notes ne sont pas terminées ici, mais clairement c'est un passage avec lequel je ne suis pas vraiment d'accord / qui me surprends.&lt;/p&gt;
&lt;p&gt;Le droit français :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Toute personne majeure ou mineure émancipée qui démontre par une réunion suffisante de faites que la mention relative à son sexe dans les actes de l'état civil ne correspond pas à celui dans lequel elle se présente et dans lequel elle est connue peut en obtenir la modification.&lt;/p&gt;
&lt;p&gt;Le texte, qui n'exige des personnes trans que de s'être présenté⋅es aux autres comme la femme ou l'homme qu'elles savent être, définit le genre comme une expérience sociale. « Le genre est un produit du patriarcat », nous rappelle la féministe Meghan Murphy et « les notions entourant la masculinité et la féminité existent pour naturaliser la domination masculine et la subordination féminine », pas pour être des identités individuelles inventées par chacun⋅e et donnant lieu à des genres pluriels. elle conclut donc :&lt;/p&gt;
&lt;p&gt;Les hommes ne peuvent pas s'exclure aussi facilement, par simple identification, de la classe des oppresseurs, tout comme les femmes ne peuvent simplement choisir de s'identifier hors d'une vulnérabilité à la violence masculine.&lt;/p&gt;
&lt;p&gt;l'approche des « milieux LGBT et nouveaux féministes radicaux », qui « tiennent à ce que chacun⋅e ait la liberté de se définir pour échapper à une définition venue de l'extérieur, un regard social perçu comme oppressant.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="féminisme"></category></entry><entry><title>Break technologique</title><link href="https://blog.notmyidea.org/break-technologique.html" rel="alternate"></link><published>2019-12-14T00:00:00+01:00</published><updated>2019-12-14T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-12-14:/break-technologique.html</id><summary type="html">&lt;p&gt;Comme je le soulignais il y a quelques jours dans ce journal de bord, je suis « drogué aux écrans ». Au point que je passe parfois ma journée entière sans en décrocher, en passant de l'un à l'autre.&lt;/p&gt;
&lt;h2 id="les-problemes"&gt;Les problèmes&lt;/h2&gt;
&lt;p&gt;En fait, en analysant un peu plus la situation, et en …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Comme je le soulignais il y a quelques jours dans ce journal de bord, je suis « drogué aux écrans ». Au point que je passe parfois ma journée entière sans en décrocher, en passant de l'un à l'autre.&lt;/p&gt;
&lt;h2 id="les-problemes"&gt;Les problèmes&lt;/h2&gt;
&lt;p&gt;En fait, en analysant un peu plus la situation, et en ciblant les &lt;em&gt;usages&lt;/em&gt; plutôt que les &lt;em&gt;objets&lt;/em&gt;, je me rends compte que je suis drogué à plusieurs choses :&lt;/p&gt;
&lt;h3 id="immediatete-des-communications"&gt;Immédiateté des communications&lt;/h3&gt;
&lt;p&gt;Que ce soit les emails, que je vais consulter plusieurs fois par jour (quand ce n'est pas en continu) ou les notifications instantanées (Signal, Whatsapp, Messenger etc), je me retrouve souvent derrière l'écran pour les lire.&lt;/p&gt;
&lt;p&gt;Avec un effet de bord assez étrange : parfois je souhaite simplement envoyer un mail à quelqu'un·e, et en ouvrant mon client mail je me retrouve à… tout simplement oublier, plongé dans le flux des mails reçus et à traiter.&lt;/p&gt;
&lt;h3 id="dependance-aux-notifications-web"&gt;Dépendance aux notifications Web&lt;/h3&gt;
&lt;p&gt;Que ce soit sur le réseau social « Mastodon », sur lequel je ne publie pas grand chose, mais que j'actualise parfois de manière frénétique pour « savoir ce qui s'y raconte », ou sur des site tels que Le bon coin, Github, ou Youtube, je me retrouve à « lire le flux », sans trop réussir à en sortir. Aspiré.&lt;/p&gt;
&lt;h3 id="le-sweet-spot-du-dev"&gt;Le « Sweet Spot » du dev&lt;/h3&gt;
&lt;p&gt;Parfois, je code, et quand ça m'arrive, je suis dans une sorte de transe assez incroyable, durant laquelle pendant plusieurs heures je ne fais rien d'autre, parfois même sans manger ni bouger du canapé : il faut que je termine !&lt;/p&gt;
&lt;p&gt;C'est à la fois quelque chose de « bien » parce que je progresse et les outils sur lesquels je bossent fonctionnent, mais c'est au détriment bien sur d'un équilibre de mon quotidien...&lt;/p&gt;
&lt;h2 id="pistes-pour-men-sortir"&gt;Pistes pour m'en sortir&lt;/h2&gt;
&lt;p&gt;J'ai l'impression que je peux trouver des pistes de solution à la fois techniques (technologiques) et à la fois liées à mon mode de vie.&lt;/p&gt;
&lt;h3 id="solutions-technologiques"&gt;Solutions technologiques&lt;/h3&gt;
&lt;p&gt;En écrivant tout ça, je me dis plusieurs choses :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je devrais me désinscrire des services de communication type Whatsapp et Signal.&lt;/li&gt;
&lt;li&gt;Je devrais limiter drastiquement les applications installées sur mon téléphone (plus de mails, youhou !)&lt;/li&gt;
&lt;li&gt;Existe-il un moyen (Thunderbird ?) d'écrire des mails sans voir sa liste de mails ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="solutions-liees-a-mon-mode-de-vie"&gt;Solutions liées à mon mode de vie&lt;/h3&gt;
&lt;p&gt;Mais… Il me semble que c'est surtout une question de volonté et « d'hygiène numérique » : si je me demande quelle place je veux laisser aux écrans dans ma vie, alors je doit questionner l'usage que j'en ait.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je peux limiter le nombre d'outils que j'utilise au quotidien.&lt;/li&gt;
&lt;li&gt;Est-ce que je peux me passer d'un smartphone ?&lt;/li&gt;
&lt;li&gt;Est-ce que je peux me passer d'une connexion internet ? Au travail ? Chez moi ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Est-ce que je ne devrais pas simplement « arrêter de faire de l'informatique », au moins pour un temps ? Ça aurait le mérite de me permettre de me désengager de certains projets qui ont des liens forts avec le numérique, et qui parfois pourrissent mon quotidien.&lt;/p&gt;
&lt;p&gt;Des solutions radicales, mais je me posais déjà des questions similaires dans &lt;a href="https://blog.notmyidea.org/focusing-on-what-matters.html"&gt;un article de 2016 (en anglais)&lt;/a&gt;, sans avoir vraiment réussi à m'y tenir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Check emails only once a day. Do not 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)&lt;/li&gt;
&lt;li&gt;Stay away from the Internet during the morning. I'll not connect if I don't need to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="extinction-des-feux"&gt;Extinction des feux&lt;/h2&gt;
&lt;p&gt;Voici une petite liste des choses qui semblent pouvoir réduire ma dépendance technologique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/issues/517"&gt;Me détacher de la maintenance de ihatemoney&lt;/a&gt; ; &lt;/li&gt;
&lt;li&gt;Supprimer la plupart des applications sur mes téléphones (pro et perso)&lt;/li&gt;
&lt;li&gt;Éteindre mon serveur personnel ;&lt;/li&gt;
&lt;li&gt;Ne plus ramener mon téléphone pro à la maison ;&lt;/li&gt;
&lt;li&gt;Avoir un ordinateur fixe au travail, et l'y laisser ;&lt;/li&gt;
&lt;li&gt;Limiter mon utilisation de l'ordinateur perso à 1h par jour, sauf exceptions ;&lt;/li&gt;
&lt;li&gt;Aller voir mes emails pro une fois par jour uniquement ;&lt;/li&gt;
&lt;li&gt;Répondre au téléphone une fois par jour uniquement (et faire en sorte que mes correspondants comprennent);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'avenir dira ce que j'en fais, mais je suis content d'écrire ça :-)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Assurance chômage</title><link href="https://blog.notmyidea.org/assurance-chomage.html" rel="alternate"></link><published>2019-12-13T00:00:00+01:00</published><updated>2019-12-13T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-12-13:/assurance-chomage.html</id><summary type="html">
&lt;p&gt;Depuis une génération, les durées et les montants d'indemnisation ont régulièrement diminué en France, par étapes successives, ce qui fait que bon nombre de salariés n'ont pas conscience qu'il ne seront indemnisés à 57 % de leur ex-salaire en cas de chômage, et pour seulement deux ans, alors que les personnes …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Depuis une génération, les durées et les montants d'indemnisation ont régulièrement diminué en France, par étapes successives, ce qui fait que bon nombre de salariés n'ont pas conscience qu'il ne seront indemnisés à 57 % de leur ex-salaire en cas de chômage, et pour seulement deux ans, alors que les personnes de la génération précédente l'on été pendant trois ans à 75 % ou 80 % de leur ex-salaire. &lt;/p&gt;
&lt;p&gt;Évolution des durées max d'indemnisations :
- 1979 : 36 mois
- 1984 : 30 mois
- 2001 : 23 mois&lt;/p&gt;
&lt;h2 id="dates-cles-et-evolution"&gt;Dates clés et évolution&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avant 1982&lt;/strong&gt; l'indemnisation générale est de &lt;strong&gt;90 % du salaire brut&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1982&lt;/strong&gt; il y a un déficit, lié à une forte hausse du chômage (après le second choc pétrolier de 1979)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1982&lt;/strong&gt;, hausse des cotisations, baisse des indemnisations et nouveau système les faisant dépendre de la durée de cotisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1984&lt;/strong&gt;, &lt;strong&gt;l'assistance de l'État suppléé l'Unédic&lt;/strong&gt; pour les chômeurs en fin de droit., via l'ASS (l'allocation spécifique de solidarité),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1988&lt;/strong&gt; : Instauration du RMI (revenu minimum d'insertion) sous Michel Rocard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1992&lt;/strong&gt; : Suite à une crise financière de l'Unédic, mesures d'économie :&lt;ul&gt;
&lt;li&gt;allongement de la durée de cotisation minimum (modifiée plusieurs fois)&lt;/li&gt;
&lt;li&gt;dégressivité des allocations&lt;/li&gt;
&lt;li&gt;contrôle renforcé de la recherche d'emploi.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2001&lt;/strong&gt; : Le MEDEF impose la création du PARE (Plan d'aide au retour à l'emploi), et une forte baisse des cotisations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2002&lt;/strong&gt; : Remontée du taux de chômage. La durée d'indemnisation passe de 30 à 23 mois et durcit les conditions d'accès au régime. Désormais, à peine la moitié des chômeurs sont indemnisés par l'Unédic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2006&lt;/strong&gt; : Nouvelle convention qui durcit de nouveau les conditions d'accès au régime d'indemnisation, tout en instaurant le principe du guichet unique et le suivi mensuel des chômeurs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2009&lt;/strong&gt; : Fusion Assedic + ANPE = Pôle emploi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2019&lt;/strong&gt; : Nouvelle réforme de l'assurance chômage (Gouvernement Macron)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le régime de l'Assurance chômage est en constant déficit depuis 2009. Pour cette raison, sa dette atteint près de 26 milliards d'euros fin 2015. &lt;/p&gt;
&lt;h2 id="evolution-du-taux-de-chomage"&gt;Évolution du taux de chômage&lt;/h2&gt;
&lt;p&gt;Deux graphiques, qui montrent l'évolution du taux de chômage. Durant les périodes représentées ici, les conditions pour être « ayants-droit » ont évoluées. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Personnes considérées en recherche d'emploi" src="/images/chomage/taux-chomage.png"&gt;&lt;/p&gt;
&lt;p&gt;Ce second graphique montre les personnes qui se considèrent en recherche d'emploi. On voir qu'il y a un écart important entre les deux graphiques.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Personnes qui se disent en recherche d'emploi" src="/images/chomage/halo-chomage.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.insee.fr/fr/statistiques/4201123#graphique-chomage-g1-fr"&gt;sources&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="budget-de-lassurance-chomage"&gt;Budget de l'assurance chômage&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Budget dette" src="/images/chomage/dette-chomage.png"&gt;&lt;/p&gt;
&lt;h2 id="financement-de-lassurance-chomage"&gt;Financement de l'assurance chômage&lt;/h2&gt;
&lt;p&gt;Les allocations chômage sont principalement financées par des cotisations prélevées sur les salaires. Les cotisations des employeurs représentent 4,05% des salaires bruts.&lt;/p&gt;
&lt;p&gt;L'État participe également au financement, via l'impôt : depuis janvier 2019, une fraction de la "CSG activité" est affectée à l'Assurance chômage, en lieu et place des cotisations salariales. &lt;/p&gt;
&lt;p&gt;https://www.unedic.org/a-propos/comprendre-le-financement-de-lassurance-chomage&lt;/p&gt;
&lt;h2 id="unedic"&gt;UNEDIC&lt;/h2&gt;
&lt;p&gt;L'UNEDIC est une association de délégation de service public, qui s'occupe de gérer l'assurance chômage, en coopération avec Pôle Emploi.&lt;/p&gt;
&lt;p&gt;L'Assurance chômage est financée par les cotisations des employeurs et par une partie de la CSG pour les salariés. Une cotisation a toutefois été maintenue pour les intermittents du spectacle.&lt;/p&gt;
&lt;p&gt;Elle vise à assurer un revenu de remplacement aux salariés involontairement privés d'emploi et à accélérer leur retour à lemploi par le financement daides et de prestations adaptées. &lt;/p&gt;
&lt;p&gt;Obligée, par ses statuts, d'équilibrer son budget, l'Unedic ne peut remplir sa mission, qui porte sur le paiement régulier des allocations de chômage, que si les dépenses sont globalement alignées sur les ressources.&lt;/p&gt;
&lt;p&gt;De ce fait, en 2002, une partie des partenaires sociaux de l'Unedic (MEDEF, CFDT, CFTC et CFE-CGC) a accepté de signer une convention réduisant la durée d'indemnisation de la majorité des chômeurs. Ce choix a été fait dans le souci de préserver le PARE, et de ne pas toucher au principe de non-dégressivité dans le calcul des indemnités. &lt;/p&gt;
&lt;h2 id="plan-daide-au-retour-a-lemploi-pare"&gt;Plan d'aide au retour à l'emploi (PARE)&lt;/h2&gt;
&lt;p&gt;Engagement signé entre le chômeur et le Pôle emploi de tout mettre en œuvre pour que celui-ci retrouve rapidement un emploi. Les Assedic ne se bornent plus à verser un revenu de remplacement au demandeur d'emploi; elles l'aident à revenir vers l'emploi dans le cadre d'un projet défini avec lui, de manière contractuelle.&lt;/p&gt;
&lt;p&gt;En 2000, dans un contexte d'excédent budgétaire (1,3 milliard d'euros), les partenaires sociaux adoptent le PARE. Prévoyant un surplus financier de 18 milliards d'euros sur les trois années suivantes selon les modalités de la convention précédente, &lt;strong&gt;les partenaires décident de redistribuer cette somme au travers d'une baisse des cotisations patronales&lt;/strong&gt; et d'un financement de certaines structures d'insertion. &lt;/p&gt;
&lt;p&gt;Imposé par le MEDEF ?&lt;/p&gt;
&lt;h2 id="reforme-chomage-de-2019"&gt;Reforme chômage de 2019&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Il faudra avoir travaillé 6 mois (contre 4 mois) sur les 24 derniers mois (contre 28 mois) pour percevoir une allocation de retour à lemploi ;&lt;/li&gt;
&lt;li&gt;Le rechargement des droits à lindemnisation chômage est repoussé à 6 mois (contre 1 mois avant la réforme) ;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>Prix libre et conscient &amp; culpabilisation</title><link href="https://blog.notmyidea.org/prix-libre-et-conscient.html" rel="alternate"></link><published>2019-12-11T00:00:00+01:00</published><updated>2019-12-11T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-12-11:/prix-libre-et-conscient.html</id><summary type="html">&lt;p&gt;J'avais envie de réagir suite à la lecture d'une &lt;a href="https://oncletom.io/2019/12/10/exemple-prix-libre-conscient/"&gt;note dans le journal de Thomas&lt;/a&gt; qui parle de « prix libre &lt;em&gt;et&lt;/em&gt; conscient ».&lt;/p&gt;
&lt;p&gt;Derrière le prix libre, je vois le fait que chacun⋅e paye ce qu'il ou elle veut, et ce qu'il ou elle peut. J'y vois également une sorte …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'avais envie de réagir suite à la lecture d'une &lt;a href="https://oncletom.io/2019/12/10/exemple-prix-libre-conscient/"&gt;note dans le journal de Thomas&lt;/a&gt; qui parle de « prix libre &lt;em&gt;et&lt;/em&gt; conscient ».&lt;/p&gt;
&lt;p&gt;Derrière le prix libre, je vois le fait que chacun⋅e paye ce qu'il ou elle veut, et ce qu'il ou elle peut. J'y vois également une sorte de solidarité entre les personnes qui peuvent donner plus et celles qui ne peuvent pas.&lt;/p&gt;
&lt;p&gt;Pour une tenue d'évènement, voici les critères qui me paraissent intéressants :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Chacun⋅e donne ce qu'iel peut;&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;solidarité entre les personnes qui le peuvent et celles qui le veulent&lt;/strong&gt; est effective;&lt;/li&gt;
&lt;li&gt;Les organisat⋅eurs⋅rices ne perdent pas d'argent;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les coûts sont assumés collectivement&lt;/strong&gt; par l'ensemble des personnes, et non pas individuellement.&lt;/li&gt;
&lt;li&gt;Les personnes qui donnent moins ne sont pas culpabilisées.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Un des effets du prix libre est de permettre à des personnes qui ne pourraient pas s'offrir tel ou tel évènement de venir et de participer, &lt;strong&gt;sans les faire culpabiliser&lt;/strong&gt; en fonction de la somme déposée dans la cagnotte, même si rien n'est donné.&lt;/p&gt;
&lt;p&gt;Je trouve dommage qu'une solution qui déculpabilisait les pauvres (d'être pauvres…) évolue vers une solution où ceux-cis sont maintenant &lt;em&gt;conscients&lt;/em&gt; du fait qu'ils ne peuvent plus participer, où alors que leur participation à un impact sur la tenue de l'évènement.&lt;/p&gt;
&lt;p&gt;En d'autres termes, j'ai l'impression que la solution du « prix libre &lt;em&gt;et&lt;/em&gt; conscient » vient contredire les points &lt;code&gt;1&lt;/code&gt; et &lt;code&gt;5&lt;/code&gt; de ma liste. &lt;/p&gt;
&lt;p&gt;Je me questionne donc quand aux limites du prix libre : qu'est-ce qui pousse les organisateurices à choisir un « prix libre est conscient » plutôt qu'un simple « prix libre » ?&lt;/p&gt;
&lt;p&gt;De mon expérience, les participan⋅te⋅s donnent parfois pas assez. Quelques idées en vrac qui devraient permettre d'avoir un système de prix qui corresponde aux critères énoncés plus haut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quand c'est possible, avoir une entrée libre avec une boîte à dons. Chacun⋅e y donne ce qu'il veut.&lt;/li&gt;
&lt;li&gt;Avoir une jauge qui indique à quel point l'évènement est déficitaire ou excédentaire (particulièrement pour les évènements qui se déroulent sur plusieurs jours), et afficher cette jauge à la fin de l'évènement.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Journal"></category></entry><entry><title>Écran et dépendances</title><link href="https://blog.notmyidea.org/ecran-et-dependances.html" rel="alternate"></link><published>2019-12-09T00:00:00+01:00</published><updated>2019-12-09T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-12-09:/ecran-et-dependances.html</id><summary type="html">
&lt;p&gt;Je réalise aujourd'hui à quel point ma vie est faite d'une multitude d'écrans, et à quel point le temps passe vite quand j'en &lt;em&gt;consomme&lt;/em&gt; (j'utilise volontairement ce terme de &lt;em&gt;consommer&lt;/em&gt;, tant j'ai le sentiment que c'est un bien de consommation).&lt;/p&gt;
&lt;p&gt;Il y a quelques mois, j'ai choisi de ne pas …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je réalise aujourd'hui à quel point ma vie est faite d'une multitude d'écrans, et à quel point le temps passe vite quand j'en &lt;em&gt;consomme&lt;/em&gt; (j'utilise volontairement ce terme de &lt;em&gt;consommer&lt;/em&gt;, tant j'ai le sentiment que c'est un bien de consommation).&lt;/p&gt;
&lt;p&gt;Il y a quelques mois, j'ai choisi de ne pas avoir d'ordinateur à la maison durant une semaine. Résultat ? Je me suis remis à lire ! Depuis, j'essaye de reproduire quelque chose de similaire, mais me retrouve face à un triste constat : je suis drogué.&lt;/p&gt;
&lt;p&gt;Les écrans sont trop présents. Comment faire sans eux ? Comment limiter leur pouvoir sur mon temps ? Que de questions :-)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Groupe de paroles hommes</title><link href="https://blog.notmyidea.org/groupe-de-paroles-hommes.html" rel="alternate"></link><published>2019-11-23T00:00:00+01:00</published><updated>2019-11-23T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-23:/groupe-de-paroles-hommes.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;Questionner la non-mixité hommes&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y a maintenant peut-être six mois, à l'appel d'un ami, je me suis mis à participer à un « groupe de parole » d'hommes. L'idée m'est d'abord apparue comme intéressante pour pouvoir discuter de certaines problématiques &lt;em&gt;entre hommes&lt;/em&gt; , entre autres des questions de rapport à l'autre dans …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;Questionner la non-mixité hommes&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y a maintenant peut-être six mois, à l'appel d'un ami, je me suis mis à participer à un « groupe de parole » d'hommes. L'idée m'est d'abord apparue comme intéressante pour pouvoir discuter de certaines problématiques &lt;em&gt;entre hommes&lt;/em&gt; , entre autres des questions de rapport à l'autre dans les relations intimes.&lt;/p&gt;
&lt;p&gt;Jappréciais alors l'idée de chercher à déconstruire les dominations masculines, et en parler entre hommes me paraissait un bon moyen de venir questionner certains comportements (oppressifs), sans avoir des personnes opprimées en face pour juger des situations. Quelque part, l'envie était donc de se questionner collectivement sur ce qu'on (les hommes) fait vivre comme société, en tant que groupe.&lt;/p&gt;
&lt;p&gt;Je cherchais à pouvoir discuter, dans un « cercle bienveillant », de mes questionnements par rapport aux relations intimes, mais aussi d'une manière générale par rapport à notre société. À avoir des regards extérieurs sur mes ressentis, à venir questionner certains de mes comportements, à trouver des interactions intimes, et peut-être de manière inconsciente à me réconforter sur une posture que j'adopte en tant qu'homme.&lt;/p&gt;
&lt;p&gt;La raison pour laquelle être « entre hommes » m'a paru intéressante de prime abord est de pouvoir discuter de notre « masculinité » de manière sensible, de venir questionner notre relation aux autres et de le faire sans être jugés par des personnes opprimées par mon comportement (que celui ci soit conscient ou non). Un moyen de libérer notre parole sur des sujets pas évidents, en quelques sorte.&lt;/p&gt;
&lt;h2 id="et-puis"&gt;Et puis…&lt;/h2&gt;
&lt;p&gt;Au fil des rencontres, les sujets abordés ont été vastes : on a parlé de violence VS non-violence, de rapport à nos mères, de rapport à nos dépendances, de métaphysique, de sexisme. Pour moi le moment ou on à commencé à parler de sexisme marque un tournant dans l'histoire du groupe.&lt;/p&gt;
&lt;p&gt;On s'est alors trouvés dans une situation où des désaccords se sont manifestés. Désaccords liés à la reconnaissance de nos privilèges en tant qu'hommes. Refaire le débat ne me semble pas vraiment instructif, mais j'ose croire que les discussions qui ont eu lieu ont permis à chacun de nous d'évoluer dans notre auto-critique personnelle. Je crois que ces discussions étaient utiles.&lt;/p&gt;
&lt;p&gt;Ces discussions ont également éveillé en moi l'envie de questionner la non-mixité de notre groupe. Pour quelle raison(s) se réunir en non-mixité ? Pourquoi exclure les femmes de nos rendez-vous ?&lt;/p&gt;
&lt;p&gt;Notez bien que je ne questionne pas ici la question de la non-mixité dans un groupe d'opprimé⋅e⋅s, mais bel et bien dans un groupe d'oppresseurs.&lt;/p&gt;
&lt;p&gt;Ne pas être confronté au regard des femmes nous permet de ne pas nous sentir coupables face à certains de nos comportements — sexistes . Cela nous permet donc d'accepter d'en parler, de rompre le tabou, alors même qu'on les estime, quelque part, &lt;em&gt;déviants&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;On cherche à créer une sorte de cocon (douillet et chaud) pour pouvoir exprimer nos doutes sur nos comportements, sans être remis en cause, et surtout sans être jugés.&lt;/p&gt;
&lt;p&gt;Potentiellement, le fait de se retrouver entre hommes, sans l'avis de &lt;em&gt;l'autre sexe&lt;/em&gt; signifie aussi qu'on peut se rassurer sur la déviance de ces comportements, pour — de manière consciente ou non — se sentir mieux, et donc asseoir notre domination masculine.&lt;/p&gt;
&lt;h2 id="questionner-la-non-mixite"&gt;Questionner la non-mixité&lt;/h2&gt;
&lt;p&gt;J'en viens donc a questionner le choix de la non-mixité pour ce groupe de parole, de manière personnelle d'abord, puis ensuite de manière ouverte, au reste du groupe.&lt;/p&gt;
&lt;p&gt;Ce qu'on fait lors de notre groupe de parole me semble nouveau : se parler entre personnes d'horizons différents, déconstruire nos comportements, se donner des astuces sur comment déjouer tel ou tel mécanisme chez nous me semble louable, voire même nécessaire.&lt;/p&gt;
&lt;p&gt;J'ai découvert avec ce groupe de parole un outil qui me semble utile.&lt;/p&gt;
&lt;p&gt;Mais quand je challenge l'idée de la non-mixité, je ne trouve pas de raison — autre que la peur d'être jugé — de refuser la mixité dans notre groupe. Je crois qu'ouvrir nos discussions nous permettrait d'affronter certains sujets de manière plus juste.&lt;/p&gt;
&lt;p&gt;Lors d'un de nos regroupements, nous décidons donc, après quelques discussions, d'ouvrir le groupe à d'autres personnes, peu importe leur sexe, tout en cherchant à conserver un groupe de petite taille, pour que la création d'une confiance mutuelle soit plus simple à obtenir.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Ignorance et vertu</title><link href="https://blog.notmyidea.org/ignorance-et-vertu.html" rel="alternate"></link><published>2019-11-23T00:00:00+01:00</published><updated>2019-11-23T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-23:/ignorance-et-vertu.html</id><summary type="html">
&lt;blockquote&gt;
&lt;p&gt;Rester dans une position de &lt;em&gt;sachant&lt;/em&gt; semble me pousser à des comportements de fermeture d'esprit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reconnaître mon ignorance me permet de découvrir de laisser mes interlocut⋅eurs⋅rices m'expliquer de manière claire ce que je ne connais pas encore, là où laisser penser que je connais ne m'apporte que du …&lt;/p&gt;</summary><content type="html">
&lt;blockquote&gt;
&lt;p&gt;Rester dans une position de &lt;em&gt;sachant&lt;/em&gt; semble me pousser à des comportements de fermeture d'esprit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reconnaître mon ignorance me permet de découvrir de laisser mes interlocut⋅eurs⋅rices m'expliquer de manière claire ce que je ne connais pas encore, là où laisser penser que je connais ne m'apporte que du flou et une posture éthiquement bancale.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Fatigue et compétition</title><link href="https://blog.notmyidea.org/fatigue-et-competition.html" rel="alternate"></link><published>2019-11-17T00:00:00+01:00</published><updated>2019-11-17T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-17:/fatigue-et-competition.html</id><summary type="html">
&lt;p&gt;Je me rends compte que la compétition est présente, dans plusieurs sphères de ma vie, et qu'il s'agit d'une des choses qui me fait me sentir parfois en déséquilibre, voire qui me fait réagir d'une manière qui me semble étrangère.&lt;/p&gt;
&lt;p&gt;Quand je rencontre ce mode de fonctionnement chez d'autres, il …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je me rends compte que la compétition est présente, dans plusieurs sphères de ma vie, et qu'il s'agit d'une des choses qui me fait me sentir parfois en déséquilibre, voire qui me fait réagir d'une manière qui me semble étrangère.&lt;/p&gt;
&lt;p&gt;Quand je rencontre ce mode de fonctionnement chez d'autres, il arrive qu'il suscite un retour de ma part, comme si je ne savais pas encore désamorcer ce fonctionnement en moi, et je rentre alors dans le « jeu ».&lt;/p&gt;
&lt;p&gt;J'ai quand même réussi à plusieurs reprises à le détecter, mais parfois un côté un peu « automatique » ressort, presque animal, et je rentre alors dans ce mode de discussion qui m'est proposé, sans même m'en rendre compte.&lt;/p&gt;
&lt;p&gt;Je n'y trouve pas grand intérêt, et je développe une forte envie de venir à bout de ces mécanismes ancrés en moi.&lt;/p&gt;
&lt;p&gt;Lorsque je décèle que je rentre en compétition, je cherche à changer ma posture : je demande des précisions à mon interlocut⋅eur⋅rice plutôt que d'y opposer une connaissance que je pense détenir (voire même que je créé parfois sur le moment ?).&lt;/p&gt;
&lt;p&gt;Ça me renvoie au fait qu'il me semble mieux de ne pas savoir, plutôt que d'affirmer quelque chose dont je ne suis pas pas certain (même avec aplomb).&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Francis Dupuis Déri, Démocratie.</title><link href="https://blog.notmyidea.org/francis-dupuis-deri-democratie.html" rel="alternate"></link><published>2019-11-15T00:00:00+01:00</published><updated>2019-11-15T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-15:/francis-dupuis-deri-democratie.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;Ces notes sont extraites de deux ressources : une discussion autour de la notion de « Démocratie », organisé par la Fédération Anarchiste de Rennes, avec comme invité Françis Dupuis-Déri, et &lt;a href="https://www.thinkerview.com/francis-dupuis-deri-democratie-marketing-politique-pour-les-pauvre"&gt;une vidéo sur Thinkerview&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le discours dominant indique que, à Athènes, les fonctions sont tirées au sort. Les fonctions ont peu de …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;Ces notes sont extraites de deux ressources : une discussion autour de la notion de « Démocratie », organisé par la Fédération Anarchiste de Rennes, avec comme invité Françis Dupuis-Déri, et &lt;a href="https://www.thinkerview.com/francis-dupuis-deri-democratie-marketing-politique-pour-les-pauvre"&gt;une vidéo sur Thinkerview&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le discours dominant indique que, à Athènes, les fonctions sont tirées au sort. Les fonctions ont peu de pouvoir. Principe de rotation des taches. Pour éviter de développer des privilèges. &lt;/p&gt;
&lt;p&gt;Il y a quelques situation de pouvoir avec les jurys (501 citoyens qui forment un jury), il n'y a pas de juge, pas d'avocat Les parties s'auto-représentent, le jury prends la décision.&lt;/p&gt;
&lt;p&gt;Puis par la suite en 1770, la démocratie à été refondée pour créer la — soit disant — démocratie moderne . Dans la civilisation moderne, la démocratie n'est plus dans une citée, il faut donc faire en fonction de la nation. Les gens sont trop nombreux pour s'assembler, et donc il faut la démocratie représentative. « C'est la même chose, mais différent ». &lt;/p&gt;
&lt;h2 id="ce-recit-est-en-fait-fallacieux"&gt;Ce récit est en fait fallacieux.&lt;/h2&gt;
&lt;p&gt;Il n'y a pas de lien entre Athènes et le parlement qu'on a maintenant (ou le congrès, etc).&lt;/p&gt;
&lt;p&gt;Les parlements sont une création du moyen age, vers le 12eme ou 13eme siècle (voire certaine formes de proto-parlement vers le 9eme siècle).&lt;/p&gt;
&lt;p&gt;Ce sont des moments ou le roi convoque les grands du royaume (de manière un peu arbitraire), et à ce moment il n'y a pas encore de parlement en tant que tel (bâtiment). Les lieux changent, ça peut être dans un monastère, dans un château, etc.&lt;/p&gt;
&lt;p&gt;Les grands du royaumes ont prêtés serment de protéger le roi, ET de le conseiller.&lt;/p&gt;
&lt;p&gt;Le roi à besoin d'aide pour prélever les taxes. Au moyen age, les rois ne connaissent pas leur population (pas de recensement, par ex. il y a des débats à l'époque sur le nombre de personnes dans une ville)&lt;/p&gt;
&lt;p&gt;L'origine du parlementarisme est en fait ces premières rencontres. Au fil des générations et des siècles, et des crises militaires etc. ces rencontres vont donner des occasions aux grands du royaume de négocier. Des crises éclatent par ex dans ce genre de rencontres (par ex. les états généraux).&lt;/p&gt;
&lt;p&gt;Grosso-modo, les rôles des citoyens sont les mêmes, et l'executif et les parlementaires détiennent le pouvoir d'une manière générale.&lt;/p&gt;
&lt;p&gt;Il faudrait en fait nommer ces systèmes « aristocraties électives ». C'est différent d'une aristocratie héréditaire, mais dans les deux cas il s'agit d'une logique aristocratique. &lt;/p&gt;
&lt;p&gt;C'est donc un tout petit groupe, qui :
- A la prétention d'être « les meilleurs » (en fonction de différents critères : remporter les élections, avoir le « sang bleu », etc).
- Représente les classes supérieures, très largement privilégiées. Impossible par exemple d'avoir des chômeurs au sein de ce groupe (puisqu'on est député contre un salaire); Il y a des chefs d'entreprises, des les classes sup, des hommes majoritairement, des blancs, donc une disproportion des classes privilégiées.&lt;/p&gt;
&lt;h2 id="origines-histoire-du-mot-democratie"&gt;Origines / histoire du mot démocratie&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Dupuis-Déri indique s'appuyer sur les travaux de Pierre Rozon Valon, qui a travaillé sur le mot en France.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lors des moments de rupture, on constate que les élites sont des parlementaires au sens large (par ex. Danton, Mauras, Robespierre, St just etc). Quand ils déclenchent leur rébellion (contre la couronne ou contre le parlement britannique par exemple), ils n'utilisaient pas le mot de démocratie.&lt;/p&gt;
&lt;p&gt;Démocrate à ce moment la faisait référence à Athènes, au pouvoir de la plèbe, considéré comme dangereux, sanguinaire et immoral. Il s'agit du « pouvoir des pauvres ». Ils avaient appris à se méfier d'Athènes. Le modèle dominant à l'époque était . Leur modèle était à l'époque Rome.&lt;/p&gt;
&lt;p&gt;2 générations plus tard (vers 1830 aux US, 1848 pour la France), le premier candidat à la présidence fait appel à ce concept de démocratie. Tout le monde se prétends alors démocrate, à des fins électorales. &lt;a href="https://fr.wikipedia.org/wiki/Auguste_Blanqui"&gt;Auguste Blanqui&lt;/a&gt; (révolutionnaire républicain socialiste français) dit alors :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tout le monde si dit démocrate, on a mème des monarchistes démocrates. Le mot démocratie est devenu caoutchouc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En 1828 aux USA il y a des campagnes électorales, les présidents se présentent comme des républicains. Andrew Jackson perd les élections, et pour pouvoir gagner, ils se représente à d'autres élections comme démocrate. En étant contre l'aristocratie financière, et en s'adressant directement au peuple, le peuple va penser que tu prends sa défense. Par la suite tous les candidats se sont dits démocrates. &lt;/p&gt;
&lt;p&gt;Dans le cas de la France, sous la monarchie restaurée, l'utilisation du mot « république » est considéré dangereux et condamné. En cherchant un mot de remplacement ils se disent démocrates.&lt;/p&gt;
&lt;p&gt;Cette stratégie de rhétorique, de propagande, crée de la confusion. Le peuple à donc été privé de ce mot de démocratie (vidé de son sens).&lt;/p&gt;
&lt;p&gt;On pense que la nation s'incarne dans l'assemblée nationale, par une sorte de pensée magique, de chamanisme. On peut voir les élections comme un rituel qui permet de fusionner ses voix avec les autres voix de la nation, etc.&lt;/p&gt;
&lt;h2 id="des-exemples-dauto-gestion"&gt;Des exemples d'auto-gestion&lt;/h2&gt;
&lt;p&gt;Malgré tout ça, l'élite politique narrive pas à empêcher des expressions de vraies démocraties aujourd'hui. L'humanité à expérimenté plein de situations, ou elles pratiquent ce qu'on devrait appeler la démocratie :&lt;/p&gt;
&lt;p&gt;Dans les communautés Mohawks (autochtones d'Amérique du nord) ou chez &lt;a href="https://fr.wikipedia.org/wiki/Inuits"&gt;inuits&lt;/a&gt;, ils y en avait plusieurs qui vivaient de manière non-hiérarchique, il n'y avait pas de propriété privée. Les chefs autochtones n'ont pas de pouvoir coercitif, pas de juge, pas de prison, pas de police, la seule chose que les chefs ont est un prestige lié à par ex leurs capacités de chasseurs. Mais ils n'ont pas de pouvoir réel. C'est pour cette raison que les autochtones étaient pris pour des peuples « pas fiables », le chef est un simple porte parole, mais ce n'est pas lui qui prends les décisions.&lt;/p&gt;
&lt;p&gt;D'autres par ex les capviles (?)&lt;/p&gt;
&lt;p&gt;Au moyen age il y avait des assemblées d'habitants. Ça ressemblait presque à de l'autogestion. Des communautés paysannes. Il y avait alors des communs (moulin, séchoir, puis, église) qui était gérés par la communauté d'habitants. Gérés par des assemblées d'habitants (10, 12, 14 assemblées par an), pour décider des choses à faire.&lt;/p&gt;
&lt;p&gt;Les guildes sont très importantes à l'époque, les guildes décident en assemblée de comment on travaille, selon quels critères, formation, promotion, ils peuvent avoir des milices et participer à la défense de leurs villes, et se poursuivre les uns les autres, sans aucune intervention du pouvoir central. C'est donc un mode de vie qui ne fonctionne pas selon les « règles du régime ».&lt;/p&gt;
&lt;h2 id="tradition-anti-parlementariste"&gt;Tradition anti parlementariste&lt;/h2&gt;
&lt;p&gt;Plutôt que de penser que c'est totalisant — il y a des ministères pour tout, une prétention de l'état à tout gérer —, il y a encore la possibilité de vivre quelque chose qui ressemble à la démocratie : dans nos quartiers, sur le ZAD, etc.&lt;/p&gt;
&lt;p&gt;Il y a une tradition anti-parlementariste, qui dit que le peuple à la capacité à s'autogérer, et que les décisions ne doivent pas êtres gérées par le parlement.&lt;/p&gt;
&lt;p&gt;Dans les grandes crises, c'est ce que le peuple fait (en argentine au début des années 2000, durant le printemps arabe, dans les crises sociales et politiques). Les gens s'assemblent, et ensuite décident ensemble d'éviter de nommer de nouveaux chefs. Cet esprit anti-parlementariste continue d'exister, et continue à faire peur. La peur est celle de l'émeute.&lt;/p&gt;
&lt;p&gt;il y a d'ailleurs plein de lois contre les attroupements illégaux. C'était déjà le cas à l'époque des esclaves : interdiction des regroupement. En 1789, les parlementaires ont décidé d'interdire aux femmes de se rassembler.&lt;/p&gt;
&lt;p&gt;Également, il y a eu énormément d'émeutes aux US à l'époque de Martin Luther King, et même MLK (qui était plutôt contre) disait alors qu'il y avait un sens derrière ces émeutes, et qu'il fallait condamner aussi ce qui à amené à cette situation. &lt;/p&gt;
&lt;p&gt;— 20h19&lt;/p&gt;
&lt;h1 id="questions-discussion"&gt;Questions / Discussion&lt;/h1&gt;
&lt;p&gt;Il y a eu pas mal de questions / réponses et discussions. Je n'ai pris des notes que sur une partie d'entre elles.&lt;/p&gt;
&lt;h3 id="on-est-contre-lassembleisme-quest-ce-que-ca-veut-dire"&gt;On est contre l'assembléisme » ? Qu'est-ce que ça veut dire ?&lt;/h3&gt;
&lt;p&gt;Il y a toujours ce débat: élection/pas élection. Il y a toujours des personnes qui veulent écrire une nouvelle constitution, un comité sur le sexisme, etc. Ce sont des choses qui se retrouvent dans la plupart des mouvements.&lt;/p&gt;
&lt;h3 id="inclusion-et-extinction-rebellion"&gt;Inclusion et extinction rébellion&lt;/h3&gt;
&lt;p&gt;Je n'ai pas noté la question, mais elle traitait sur le fait que xR se disait inclusif et qu'en fait iels ne l'étaient sûrement pas réellement.&lt;/p&gt;
&lt;p&gt;Il y a toujours — dans les groupes que je pratique — des principes, mais c'est pas ça qui fait que les gens se regroupent. Les mouvements sociaux existent déjà, ce sont des groupes qui existent déjà. Quand vous avez un groupe de 10-15 personnes avec des profils similaires aux vôtres, ça va pas faire venir d'autres personnes.&lt;/p&gt;
&lt;p&gt;xR c'est un collectif militant de personnes qui se connaissent au début. Un appel avec un format, un langage, qui parle à une certaine partie de la population.&lt;/p&gt;
&lt;p&gt;Un autre intervenant indique que « les groupes sont ce qu'ils sont. Qu'ils existent, qu'ils agissent, ça me dérange pas. Quand ça me dérange, c'est quand ils prétendent représenter d'autres personnes que ce qu'ils sont. »&lt;/p&gt;
&lt;h3 id="exemple-sde-systemes-democratiques"&gt;Exemple sde systèmes démocratiques&lt;/h3&gt;
&lt;p&gt;Est-ce que vous avez connaissance d'un pays qui à un système démocratique « normal » ?&lt;/p&gt;
&lt;p&gt;La démocratie, avec 65M de personnes c'est pas vraiment faisable. Ça nempêche pas d'avoir des instances de fédération. Exercheia à Athènes, au Rojava mais ce sont des endroits ou la liberté est précaire.&lt;/p&gt;
&lt;h3 id="que-penser-du-ric"&gt;Que penser du RIC ?&lt;/h3&gt;
&lt;p&gt;Ma compréhension c'est qu'en Suisse ou en Californie (où c'est possible), ces référendums, dans le cadre de nations, quand ils sont actés dans des sociétés inégalitaires — en terme de moyens financiers, de prise de parole dans les médias etc — donnent l'illusion que le camp du oui et du non sont à forces égales, alors qu'en fait ce sont des campagnes électorales très inégalitaires. Ce qui favorise certaines parce que les moyens ne sont pas égaux.&lt;/p&gt;
&lt;p&gt;De plus, les résultats sont reçus et gérés par les élus. Ma compréhension c'est que certaines décisions populaires ne sont pas adoptées.&lt;/p&gt;
&lt;h3 id="avancees-sociales-et-democratie-directe"&gt;Avancées sociales et démocratie directe&lt;/h3&gt;
&lt;p&gt;Si on avait une démocratie directe, aurait-on eu les avancées sociales actuelles ?&lt;/p&gt;
&lt;p&gt;Autrement dit, si on donnait le pouvoir au peuple, qu'est-ce que ça donnerait (dans les pays occidentaux) ?&lt;/p&gt;
&lt;p&gt;On peut remettre en question le fait qu'il y ait vraiment des avancées &lt;em&gt;partout&lt;/em&gt;. Par exemple, pour l'avortement, c'est l'état qui l'a interdit, au moyen age en premier lieu. Les femmes connaissaient les moyens de se faire avorter, alors qu'aujourd'hui les femmes ont très peu de compétences pour pouvoir pratiquer l'avortement elles mêmes.&lt;/p&gt;
&lt;p&gt;C'est difficile d'imaginer. Il y aurait une diversité de systèmes juridiques. La république est en fait plus réactionnaire que la monarchie qui la précède (entre autre sur le sexisme, le racisme). Ce sont les mobilisations qui font évoluer les situations, ce n'est pas vraiment l'état qui fait progresser. L'état n'est pas progressiste (ou conservateur d'ailleurs) par définition, il ne fait qu'appliquer le status-quo.&lt;/p&gt;
&lt;h3 id="avoir-de-meilleures-assemblees-representatives"&gt;Avoir de meilleures assemblées représentatives ?&lt;/h3&gt;
&lt;p&gt;A : Est-ce que chercher à constituer des assemblées plus représentatives, « meilleures », voir qui représentent plus les dominés peut être bénéfique ?&lt;/p&gt;
&lt;p&gt;B : Qu'est-ce qui nous dit qu'avec ces assemblées on va pas se retrouver dans la même situation qu'actuellement ? Ça reste de base des gens qui prennent des décisions pour d'autres. Le principe est fondamentalement glissant. risque de défendre ses propres intérêts plutôt que le reste de la population.&lt;/p&gt;
&lt;p&gt;A : Il y a la potentialité de ne pas opposer les deux modèles ? Ce sont des tentatives de bricolages, pour avoir plus de démocratie et de justice sociale dans le système.&lt;/p&gt;
&lt;p&gt;C (Isabelle Attard ?): Le pouvoir corrompt. On pense pouvoir lui mettre des gardes fous, pour pouvoir faire le mieux. Mon expérience c'est qu'au bout de 6 mois, le système intègre, absorbe, il est prévu pour ça. Imaginer que nous pourrions créer cette assemblée idéale, ne marche pas. Comme beaucoup d'autres personnes, j'y ai cru.&lt;/p&gt;
&lt;h3 id="ressources"&gt;Ressources&lt;/h3&gt;
&lt;p&gt;Quelques ressources citées par des personnes présentes ou par Dupuis-Déri&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;« De la horde à l'état », qui explique que seuls des petits groupes de petite taille peuvent fonctionner.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="autres-notes-prises-durant-via-la-video"&gt;Autres notes prises durant via la vidéo&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Les notes de cette partie sont plus en vrac ;-)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="pouvoir-et-systeme-electoral"&gt;Pouvoir et système électoral&lt;/h2&gt;
&lt;p&gt;Quand on créé un groupe anarchiste, il y a des pouvoirs informels et tout le monde n'est pas égal dans la réalité, mais ces groupes mettent en place des manières de réduire ces inégalités, ces jeux d'influence. Il rexiste des techniques pour réduire le pouvoir informel.&lt;/p&gt;
&lt;p&gt;A chaque fois qu'il y a des gens aux pouvoir, il y a une forme de démagogie. La démagogie fait croire qu peuple qu'on est là pour son bien, alors que l'objectif est d'asseoir le pouvoir. La démagogie est inscrite dans l'ADN du système électoral. Vous voulez vous faire élire. Et donc vous souhaitez que les gens votent pour vous. Ce système électoral encourage le mensonge.&lt;/p&gt;
&lt;h2 id="repression"&gt;Répression&lt;/h2&gt;
&lt;p&gt;L'état Français, Canadien, Americain, Britanique etc ont déjà tout un arsenal pour punir les casseurs (terme foncièrement péjoratif). Ils en re-créent pour consolider, densifier leur arsenal, et c'est également une opération politique. Ça donne quelques nouveaux outils à la police, mais la police à énormément de moyens déjà actuellement. Il s'agit principalement d'un moyen de montrer qu'il se passe quelque chose.&lt;/p&gt;
&lt;h2 id="vote-decisions-collectives"&gt;Vote / Décisions collectives&lt;/h2&gt;
&lt;p&gt;Un endroit ou on aurait vraiment la place et le temps, ce sont les écoles […]. Mais ils nous font élire des conseils d'élèves. On nous apprends à élire des personnes. L'agence para-gouvernementale explique que c'est pour former les enfants à voter. Quand on est adultes, on mets en scène l'acte exactement dans le même lieu (les écoles).&lt;/p&gt;
&lt;p&gt;Ce qui vient avec c'est que le pouvoir politique passe par le vote. C'est plus important de faire voter, que de faire élire. On essaye de convaincre les enfants que l'action politique est canalisée par le vote.&lt;/p&gt;
&lt;p&gt;Les gens qui déclarent la guerre ne la font pas (ni leurs enfants d'ailleurs)&lt;/p&gt;
&lt;p&gt;L'idée n'est pas de créer un n-ième parti d'opposition. J'ai beaucoup d'espoir dans les mouvement sociaux autonomes. C'est là ou il y a des choses intéressantes au niveau politique. C'est en échangeant, en discutant qu'on pratique de la politique.&lt;/p&gt;
&lt;p&gt;Vous pensez que la liberté, c'est le temps libre. On va penser que les assemblées sont un « perte de temps ». C'est dommage parce que c'est le seul moment ou on peut être libre politiquement. Alors qu'on pense qu'on perds du temps. Les assemblées sont là ou on peut vivre la politique concrètement. Nos activité politiques vont nous sembler inutiles parce que dans nos vies on ne contrôle pas grand chose. Les discussions sont intéressantes quand les enjeux sont au rendez-vous.&lt;/p&gt;
&lt;p&gt;Si on avait plus de communs à gérer entre nous, là on trouverait un temps et peut être même un plaisir à s'investir dans ces thèmes. Puisque rien ne nous appartiens, alors à quoi bon parler avec ses voisins ? On parlerait de quoi ?&lt;/p&gt;
&lt;h2 id="basculement"&gt;Basculement&lt;/h2&gt;
&lt;p&gt;Je ne sais pas la solution. J'ai des idées. Les vraies grandes transformations dans les sociétés se sont rarement passées parce que quelqu'un avec des amis à établi un plan de match. C'est pas comme ça que ça se passe. Le régime est déstabilisé à un moment donné, il y a une crise dans l'élite. Il faut que l'élite soit déstabilisée. Quand l'élite se tiens les coudes, les forces militaires tiennent, etc. Vous risquez simplement de vous faire écraser.&lt;/p&gt;
&lt;h2 id="crise-de-la-masculinite"&gt;Crise de la masculinité&lt;/h2&gt;
&lt;p&gt;Il y a ce discours de la crise de la masculinité. Il s'agit d'un discours, de rhétorique. A travers des études historiques, j'ai constaté qu'en occident depuis 500 ans, des hommes disent qu'il y a une crise de la masculinité […] en France, en Allemagne et ailleurs […]. Ce discours est tellement permanent, tellement universel, et donc il ne peut pas être autre chose que de la propagande, une sorte d'appel à l'aide envers les autres hommes, pour pouvoir contre-attaquer.&lt;/p&gt;
&lt;h2 id="violence-non-violence"&gt;Violence / Non violence&lt;/h2&gt;
&lt;p&gt;Les mouvement sociaux sont en permanence traversés par le débat violence / non violence. Aux états-unis, en Italie et ailleurs, des conflits éclatent, par exemple parce que certain⋅e⋅s militant⋅e⋅s voulaient amener des pinces, pour faire un trou dans un grillage.&lt;/p&gt;
&lt;p&gt;On parle donc d'une pince à ciseler un clôture d'un réacteur nucléaire. Il ne faut surtout pas casser les vitrines de banques parce que c'est de la violence. C'est incroyable. Dans les mouvement sociaux, des personnes sont tellement concernés par la violence que ça crée des débats. Le débat éthique violence / non-violence est traversé par des exemples qui sont mal compris. Par exemple Gandi et MLK.&lt;/p&gt;
&lt;p&gt;Mais c'est une illusion complète. Dans le mouvement d'indépendance de l'inde auquel participait gandi, dans le même mouvement des personnes attaquaient avec des bombes et des mitraillettes.&lt;/p&gt;</content><category term="Notes"></category></entry><entry><title>Musique, création et partage</title><link href="https://blog.notmyidea.org/musique-creation-et-partage.html" rel="alternate"></link><published>2019-11-14T00:00:00+01:00</published><updated>2019-11-14T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-14:/musique-creation-et-partage.html</id><summary type="html">
&lt;p&gt;J'arrive à trouver du temps libre pour faire de la musique. Après quasiment deux ans à jouer seul, je me remets à faire de la musique avec un ami, et j'y (re)trouve un grand plaisir.&lt;/p&gt;
&lt;p&gt;Composer, proposer, écouter, échanger, faire évoluer des sons et des idées se passe sans …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;J'arrive à trouver du temps libre pour faire de la musique. Après quasiment deux ans à jouer seul, je me remets à faire de la musique avec un ami, et j'y (re)trouve un grand plaisir.&lt;/p&gt;
&lt;p&gt;Composer, proposer, écouter, échanger, faire évoluer des sons et des idées se passe sans encombre, retrouver cette passion que j'avais mise de côté me plaît.&lt;/p&gt;
&lt;p&gt;Je sors de ma zone de confort : je joue sur un synthé analogique et j'apprends à faire un peu d'enregistrement sonore par la même occasion.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Élitisme et apprentissage</title><link href="https://blog.notmyidea.org/elitisme-et-apprentissage.html" rel="alternate"></link><published>2019-11-01T00:00:00+01:00</published><updated>2019-11-01T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-11-01:/elitisme-et-apprentissage.html</id><summary type="html">
&lt;p&gt;Au fur et à mesure de mes apprentissages, il y a quelque chose que j'ai du mal à déconstruire: le mythe du meilleur. Moi qui pense qu'ensemble on va plus loin, et que la compétition n'a pas de bons jours devant elle, je me retrouve parfois dans des situations où …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Au fur et à mesure de mes apprentissages, il y a quelque chose que j'ai du mal à déconstruire: le mythe du meilleur. Moi qui pense qu'ensemble on va plus loin, et que la compétition n'a pas de bons jours devant elle, je me retrouve parfois dans des situations où j'ai une &lt;em&gt;envie&lt;/em&gt; de montrer que je suis meilleur, que je sais mieux que mon voisin. Notamment lors de l'apprentissage via mes pairs.&lt;/p&gt;
&lt;p&gt;Dans les domaines dans lesquels je me spécialise (fabrication de bière, informatique et programmation) je me rends compte qu'une certaine forme délitisme existe parfois, contrairement aux apparences de surface. Avoir une position de &lt;em&gt;sage&lt;/em&gt; flatte mon égo.&lt;/p&gt;
&lt;h2 id="bonnes-pratiques-et-elitisme"&gt;Bonnes pratiques et élitisme&lt;/h2&gt;
&lt;p&gt;Il ne faut sûrement pas confondre les bonnes pratiques avec l'élitisme, mais parfois la frontière se fait ténue. En guise d'exemple, dans le domaine du brassage, on va critiquer les personnes qui ne contrôlent pas la température de leurs fermentations alors qu'il s'agit probablement de leur apprentissage personnel. Contrôler cette température est une bonne pratique, qui constitue deux groupes: ceux qui savent et ceux qui ne savent pas.&lt;/p&gt;
&lt;p&gt;Ceux qui savent vont alors &lt;em&gt;expliquer&lt;/em&gt; à ceux qui apprennent, et ceux qui apprennent vont être contents d'apprendre. Il est à mon avis important de garder une posture d'apprenant alors même qu'on a des choses à transmettre. Que faut-il alors faire ? Dois-je garder du recul sur mes avis, ou dois-je les formuler comme étant des avis personnels, a prendre avec des pincettes ?&lt;/p&gt;
&lt;h2 id="connaitre-mes-limites"&gt;Connaître mes limites&lt;/h2&gt;
&lt;p&gt;Rester dans une position de &lt;em&gt;sachant&lt;/em&gt; semble me pousser à des comportements de fermeture d'esprit. La « sagesse » serait-elle la faculté à se remettre en question ? Mais quid des « fausses vérités » et des &lt;em&gt;avis de surface&lt;/em&gt;, de ce que l'on croit connaître ?&lt;/p&gt;
&lt;p&gt;Peut-être que la solution est de connaître mes limites, ou en tout cas de les rechercher et de reconnaître mes zones de flou. &lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Travail, passion et limites.</title><link href="https://blog.notmyidea.org/travail-passion-et-limites.html" rel="alternate"></link><published>2019-10-25T00:00:00+02:00</published><updated>2019-10-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-10-25:/travail-passion-et-limites.html</id><summary type="html">
&lt;p&gt;Je discutais avec des ami⋅e⋅s brasseurs, cavistes et barmaid du rapport que chacun⋅e entretient avec le travail, et je me suis étonné de voir que notre rapport soit aussi différent.&lt;/p&gt;
&lt;p&gt;Notamment, ce que j'estime de prime abord comme un &lt;em&gt;travail acharné&lt;/em&gt; peut également être analysé sous l'angle …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je discutais avec des ami⋅e⋅s brasseurs, cavistes et barmaid du rapport que chacun⋅e entretient avec le travail, et je me suis étonné de voir que notre rapport soit aussi différent.&lt;/p&gt;
&lt;p&gt;Notamment, ce que j'estime de prime abord comme un &lt;em&gt;travail acharné&lt;/em&gt; peut également être analysé sous l'angle de la passion, voire même être un trait de personnalité « mono-maniaque » qui explique que certain⋅e⋅s mettent le travail avant tout le reste dans leur vie.&lt;/p&gt;
&lt;p&gt;J'ai tendance à analyser ça sous l'angle du « travaillisme » : trouver une certaine forme de fierté au fait de travailler beaucoup (voire trop, selon ma conception personnelle)&lt;/p&gt;
&lt;p&gt;Je me rends compte que, de mon côté, je n'ai pas qu'une seule passion, mais plusieurs, et me pose la question de l'incidence de ces multiples passions sur ma volonté de créer un emploi qui me laisse du temps libre pour pouvoir les vivre toutes.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>L'effondrement, parlons-en...</title><link href="https://blog.notmyidea.org/leffondrement-parlons-en.html" rel="alternate"></link><published>2019-10-01T00:00:00+02:00</published><updated>2019-10-01T00:00:00+02:00</updated><author><name>Jérémie Cravatte</name></author><id>tag:blog.notmyidea.org,2019-10-01:/leffondrement-parlons-en.html</id><summary type="html">&lt;h2 id="la-collapsologie-comme-science"&gt;La collapsologie comme science&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] Cela a pour effet de donner limpression à laudience quelle prend
connaissance dune réalité objectivée (et donc méthodologiquement vérifiable)
plutôt que dun discours. Cela implique, par exemple, que des raccourcis opérés
entre plusieurs phénomènes […] tiendraient de la méthode scientifique plutôt que …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h2 id="la-collapsologie-comme-science"&gt;La collapsologie comme science&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] Cela a pour effet de donner limpression à laudience quelle prend
connaissance dune réalité objectivée (et donc méthodologiquement vérifiable)
plutôt que dun discours. Cela implique, par exemple, que des raccourcis opérés
entre plusieurs phénomènes […] tiendraient de la méthode scientifique plutôt que de linterprétation. Comme le souligne Elisabeth Lagasse , le melting-pot opéré entre sciences naturelles et sciences sociales induit une naturalisation des rapports sociaux qui nest plus discutée. Assumer quil sagit dinterprétations à mettre en débat serait bien plus utile. En lieu et place de cela, les personnes qui critiquent ces interprétations sont régulièrement accusées dêtre dans le « déni ».&lt;/p&gt;
&lt;p&gt;Enfin, cette ambiguïté nourrit le sentiment que leffondrement généralisé est une
hypothèse, un modèle qui se vérifiera ou non, un événement qui aura lieu ou non.
On appelle dailleurs ces discours « théories de leffondrement ». Or, la question
nest pas là. La situation écologique et sociale nest pas une hypothèse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="raccourcis-confusionnisme"&gt;Raccourcis / Confusionnisme&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Les discours collapsos amalgament malheureusement sous ce mot valise deffondrement des changements irréversibles quon ne peut, en effet, que tenter de limiter et préparer (comme la destruction de la biodiversité et lemballement climatique) avec des changements totalement réversibles (comme la montée des fascismes, le transhumanisme ou la financiarisation du monde). &lt;/p&gt;
&lt;p&gt;« Si la finance seffondre, ça fait des effets de contagion qui font des effondrements économiques. Effondrement financier, cest quand il ny a plus rien dans les guichets automatiques, cest lArgentine en 2001. Si ça se propage à un effondrement économique par les chaînes dapprovisionnement, ben ça fait plus rien dans les magasins. Et là tu te poses des questions, est-ce quon souhaite ça ? Ça peut dégénérer, en chaos social, politique. Leffondrement politique cest lURSS en 1989, tas un retour des mafias etc. Si on va plus loin, leffondrement social cest la Lybie, cest Mad Max quoi, ya plus dÉtat, ya plus rien. Quest-ce quon souhaite, quest-ce quon souhaite pas ? [...] Le problème cest que tout est inter-connecté. Tu souhaites leffondrement du capitalisme ? Mais si il seffondre, il y aura dautres choses qui vont seffondrer parce que tout est lié. » (Pablo Servigne)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Passage qui montre qu'il y a une sorte de confusionnisme dans le discours de Servigne.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La confusion porte sur la notion de « civilisation thermo-industrielle » et sa prétendue fin. Les discours de leffondrement présentent une série de constats angoissants (à raison) puis expliquent (à tort) que cela correspond à « leffondrement de notre civilisation thermo-industrielle ». Cette manière de présenter les choses qui associe une mauvaise et une bonne nouvelle (la fin du monde et la fin de cette « civilisation » destructrice) provoque, au mieux, une confusion entre les deux, au pire, un désir de trouver un peu de répit pour cette « civilisation » à laquelle le public sidentifie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="depolitisation"&gt;Dépolitisation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Faire croire que « tout va seffondrer » dun bloc, comme un bâtiment, donner limpression aux personnes quelles nont aucune prise sur la situation présente et à venir, cest alimenter le sentiment dimpuissance, la croyance que nous sommes face à une impasse plutôt que face à une multitude de chemins.&lt;/p&gt;
&lt;p&gt;Lapproche fourre-tout de leffondrement dépolitise la question écologique appelant, dans un élan de prétendue « lucidité », à faire le deuil de choses inévitables et de choses évitables. Sagit-il de faire le deuil des services publics tout en continuant à payer des impôts, dun climat tempéré, de la majorité des espèces vivantes, de « nos » proches, de la moitié la plus pauvre ou la plus riche de lhumanité en premier lieu, du « confort » dun système de santé équitable ou à deux vitesses... ? […] il sagit un peu confusément de tout cela à la fois, sans précisions.&lt;/p&gt;
&lt;p&gt;Pour reprendre la fameuse métaphore de lincendie, si les Colibris nous appellent
à faire notre part individuellement plutôt que le nécessaire collectivement, les récits
collapsos nous appellent (individuellement et collectivement) à accepter lincendie et
à préparer la renaissance qui y ferait suite. Ce qui brûle dans cet incendie (et, surtout,
dans quel ordre), on nen parle pas trop.&lt;/p&gt;
&lt;p&gt;Nombre de collapsos parlent de « verrouillages » complexes de la société actuelle
(sociaux, techniques et politiques) pour justifier leur posture dacceptation. Cela pour-
rait signifier, par exemple, que lutter pour exproprier et socialiser les multinationales
de lénergie (afin de les démanteler ou de les reconvertir, selon les cas) constituerait
du « marchandage » (la troisième étape du processus de deuil), cest-à-dire une forme
de déni de laspect inextricable (verrouillé) de la situation. &lt;/p&gt;
&lt;p&gt;Même lorsquon est convaincu·e que les choses sont « verrouillées », il est intellec-
tuellement malhonnête en plus dêtre irresponsable dinvisibiliser les interactions,
conflits, solidarités, résistances existantes (et à venir) qui modifient la situation et les
manières dont les basculements écologiques sont et seront vécus.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="écologie"></category><category term="collapsologie"></category></entry><entry><title>Refuser d'être un homme</title><link href="https://blog.notmyidea.org/refuser-detre-un-homme.html" rel="alternate"></link><published>2019-10-01T00:00:00+02:00</published><updated>2019-10-01T00:00:00+02:00</updated><author><name>John Stolenberg</name></author><id>tag:blog.notmyidea.org,2019-10-01:/refuser-detre-un-homme.html</id><summary type="html">&lt;h2 id="mise-en-situation-historique-et-politique"&gt;Mise en situation historique et politique&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Contrairement à ce que prétendent ses opposants, le féminisme radical n'a pas jeté la pierre à une classe biologiquement déterminée, « les hommes », mais à un système de valeurs : une éthique de l'injustice à laquelle on avait conditionné tout l'érotisme, aussi bien celui des femmes …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h2 id="mise-en-situation-historique-et-politique"&gt;Mise en situation historique et politique&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Contrairement à ce que prétendent ses opposants, le féminisme radical n'a pas jeté la pierre à une classe biologiquement déterminée, « les hommes », mais à un système de valeurs : une éthique de l'injustice à laquelle on avait conditionné tout l'érotisme, aussi bien celui des femmes que des hommes.&lt;/p&gt;
&lt;p&gt;Personne n'étant blanc avant d'arriver en Amérique, Il a fallu des générations, et énormément de coercition, avant que ce pays ne devienne blanc. L'Amerique est devenue blanche […] par nécessité de nier la présence des Noir⋅es et de justifier leur assujettissement.&lt;/p&gt;
&lt;p&gt;[…] Le projet de différencier des « masculinités » est la plupart du temps une résistance à la critique féministe radicale du masculin en tant que tel. Car [l'exploration des masculinités] reste en deça du problème de base, faute d'une entière reconnaissance du mensonge sous-jacent au principe masculin — la domination politique structurelle sans laquelle le masculin n'a aucun sens social ou subjectif — le paradigme des « masculinités » ne sert, au plan théorique, qu'à induire en erreur une nouvelle génération de plus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Texte qui à été repris de « Race Traitor », 1994, 36-37, et adapté pour parler du sexisme, plutôt que du racisme. Le propos de Stolenberg est ici de dire que beaucoup est à reprendre de ce qui à été fait pour la lutte des Noir⋅es.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les règles du &lt;em&gt;boy's club&lt;/em&gt; ne nécessitent pas que tous ses membres soient des adeptes de la domination masculine, mais simplement qu'iels se plient aux préjugés des autres&lt;/strong&gt;. La nécessité de maintenir la solidarité de classe de sexe impose une conformité étouffante aux hommes sur tout question touchant de près ou de loin au sexe.
&lt;strong&gt;La façon d'abolir le principe masculin est de perturber cette conformité&lt;/strong&gt;. Si suffisamment de gens qui paraissent masculins dérogent aux règles du masculin, leur existence ne peut être passée sous silence. &lt;strong&gt;S'il devient impossible pour les tenants des règles du masculin de parler au nom de tous ceux qui paraissent masculins, la classe masculine de sexe cessera d'exister&lt;/strong&gt;. Combien faudra-il être ? Personne ne peut le dire à coup sur. C'est un peu comme le problème de l'argent : combien faut-il de fausses monnaies en circulation pour détruire la valeur de la monnaie officielle ? La réponse est bien moins que la majorité, juste assez pour miner la confiance du public dans la version officielle. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est le postulat même de ce bouquin dont il est question ici : si on refuse d'être un homme, alors on cesse de faire exister cette scission homme/femme, et pour pouvoir refuser cette classe homme, alors il faut sortir des rangs, perturber cette conformité.&lt;/p&gt;
&lt;h2 id="lethique-du-violeur"&gt;L'éthique du violeur&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans la logique tordue de l'éthique du violeur, &lt;strong&gt;c'est la victime qui est coupable au bout du compte&lt;/strong&gt;; la victime est responsable, &lt;strong&gt;c'est elle qui a commis la faute&lt;/strong&gt;. […] Les idées reçues liées à cette éthique prolifèrent : les femmes veulent être violées, les femmes méritent d'être violées, les femmes provoquent le viol […]. Le poids social de ces idées est tel que &lt;strong&gt;beaucoup de victimes de viol&lt;/strong&gt; craignent de révéler à quiconque ce qui leur est arrivé, &lt;strong&gt;s'imaginant en être elles-mêmes la cause&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il me semble que quelque part c'est un mécanisme de retournement de situation assez classique. Je me demande si ce n'est pas théorisé par le « Petit guide d'autodéfense intellectuel » ?&lt;/p&gt;</content><category term="Lectures"></category><category term="féminisme"></category><category term="masculinisme"></category></entry><entry><title>Antisexisme ou antiracisme ? Un faux dilemme</title><link href="https://blog.notmyidea.org/antisexisme-ou-antiracisme-un-faux-dilemme.html" rel="alternate"></link><published>2019-09-01T00:00:00+02:00</published><updated>2019-09-01T00:00:00+02:00</updated><author><name>Christine Delphy</name></author><id>tag:blog.notmyidea.org,2019-09-01:/antisexisme-ou-antiracisme-un-faux-dilemme.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;De toutes façon, la possibilité même de la discussion avec des femmes portant le foulard est exclue expressément car, quelque soit le sens qu'une femme portant le foulard donne à son acte, ce sens ne doit pas être pris en compte : le foulard est censé avoir une signification « universelle » que …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;De toutes façon, la possibilité même de la discussion avec des femmes portant le foulard est exclue expressément car, quelque soit le sens qu'une femme portant le foulard donne à son acte, ce sens ne doit pas être pris en compte : le foulard est censé avoir une signification « universelle » que seules les féministes occidentales peuvent déceler. Ce sera la position de collectif national des droits des femmes. Comme la commission Stasi, qui refuse par principe d'auditionner des jeunes filles « voilées ». [p7]&lt;/p&gt;
&lt;p&gt;« C'est aussi parce que les unes s'y soumettent (ou y adhèrent) [au port du foulard], que celles qui le refusent sont systématiquement harcelées, traitées de « putes » — ou violées ». Elle ne rejette pas le foulard seulement en tant que symbole de soumission : elle voit les femmes qui le portent comme les complices volontaires des violeurs, puisqu'elle prétend que sans elles, les violeurs ne sauraient pas exactement qui violer; pense-t-elle qu'il suffirait de supprimer les foulards pour supprimer le viol ? [p8]&lt;/p&gt;
&lt;p&gt;En somme, le foulard devient aussi le symbole de la violence sexiste. Pas de la violence sexiste en général : mais d'une violence sexiste propre aux quartiers et banlieues » et aux populations qui y vivent. Le foulard est présenté comme le signe de l'existence en France d'une culture « autre », caractérisée par un sexisme également autre que le sexisme « ordinaire » (français) dont certaines […] mettent l'existence en doute. [p9]&lt;/p&gt;
&lt;p&gt;En dépit de la documentation importante sur le sujet, &lt;strong&gt;l'excision, qui se pratique dans les régions d'Afrique chrétiennes, animistes et musulmanes&lt;/strong&gt;, mais est inconnue de la majorité des pays musulmans (Maghreb, Moyen-Orient, Arabie, Yémen, Indonésie, Malaise), &lt;strong&gt;est encore couramment attribuée à l'islam&lt;/strong&gt;. [p11]&lt;/p&gt;
&lt;p&gt;On s'aperçoit aussi que ces campagnes internationales concernent exclusivement les « pays du Sud ». Or, les femmes de Belgique et de Norvège auraient certainement besoin de notre soutien, comme nous avons besoin du leur. Ceci renvoie à un problème majeur dans l'appréhension du monde, qui n'est pas le fait des seules féministes, mais qui constitue un piège dans lequel nous tombons avec une régularité remarquable : le sort des femmes en Occident nous paraît incontestablement meilleur que partout ailleurs dans le monde. [p12]&lt;/p&gt;
&lt;p&gt;Le débat à laissé supposer que là où apparaît le foulard, apparaîtront un peu plus tard, de façon nécessaire et inévitable, l'enfermement des femmes, les mariages forcés, la lapidation, l'excision, l'amputation de la main des voleurs, etc. Le foulard des jeunes françaises a donc été dénoncé non pour ce qu'il est ici et maintenant, mais pour ce qu'il pourrait annoncer.&lt;/p&gt;
&lt;p&gt;La violence sexiste perpétrée dans les w quartiers et banlieues », par les Arabes et les Noirs qui y vivent, est systématiquement dissociée de la violence sexiste « ordinaire ». La première est mise en exergue comme extraordinaire : tellement plus grave qu'elle est considérée à part, et jamais comme un cas ou une instance de la violence ordinaire. Cette violence extraordinaire est ensuite dénationalisée 4 le « patriarcat le plus dur de la planète » ne peut venir que d'ailleurs que de l'hexagone; elle est africaine, elle est musulmane. Du même coup, ses auteurs, les Arabes et les Noirs, sont présentés comme extérieurs à la société française. [p13]&lt;/p&gt;
&lt;p&gt;On a vu que pour ces féministes « partagées », tout se passe comme si établir que la loi est raciste n'était pas une raison suffisante pour la refuse. C'est donc qu'elles acceptent l'idée que des lois pourraient être bonnes pour les femmes tout en étant racistes (« raciste peut-être, mais ne pas oublier les femmes »). Mais pourraient-elles accepter cette idée, que des lois visant une population, donc racistes, pourraient être néanmoins anti-sexistes, si elles ne partageaient pas avec les féministes pro-loi une prémisse fondamentale : le sexisme serait pire dans les « quartiers », et justiciable d'un traitement spécial ?&lt;/p&gt;
&lt;p&gt;[L]es buts du féminisme […] sont non seulement de traquer le sexisme partout où il est, mais aussi de &lt;strong&gt;refuser l'idée patriarcale qu'il serait miraculeusement absent de certains lieux, de certaines relations, bref, qu'il est localisé, et qu'on peut y échapper&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="sexisme"></category><category term="voile"></category><category term="racisme"></category></entry><entry><title>Égologie</title><link href="https://blog.notmyidea.org/egologie.html" rel="alternate"></link><published>2019-09-01T00:00:00+02:00</published><updated>2019-09-01T00:00:00+02:00</updated><author><name>Aude Vidal</name></author><id>tag:blog.notmyidea.org,2019-09-01:/egologie.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Le relatif dédain pour la politique va de pair avec l'espoir de voir les expérimentations alter-écolos se diffuser dans la société par la force de leur exemplarité, en étant reprises par d'autres initiatives « citoyennes » mais aussi en inspirant les politiques publiques […]. Un changement sans conflictualité, qui repose sur la conviction …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Le relatif dédain pour la politique va de pair avec l'espoir de voir les expérimentations alter-écolos se diffuser dans la société par la force de leur exemplarité, en étant reprises par d'autres initiatives « citoyennes » mais aussi en inspirant les politiques publiques […]. Un changement sans conflictualité, qui repose sur la conviction que ces « alternatives » sont désirables par tou⋅te.s. [alternatives, p32]&lt;/p&gt;
&lt;p&gt;La société civile expérimente, teste, invente, à la manière des secteurs les plus dynamiques de l'économie. Une fois les plâtres essuyés, des entrepreneurs monétisent un modèle déjà rodé. Agir sans attendre pour queles choses bougent, c'est provoquer des « révolutions » mais joyeuses, « douces », des « vélorutions x ludiques qui actent la disparition des révolutions politiques. De la Commune aux communs, en somme. [alternatives, p33]&lt;/p&gt;
&lt;p&gt;Même si les « alternatives » s'adressent à tou⋅te⋅s et ont pour objectif de changer le monde, elles peinent à dépasser la sphère individuelle, autour de laquelle elles tentent d'impulser le changement de l'ensemble de la société. Pire, les « petits gestes » qui ont été dan sun premier temps proposés aux « éco-citoyen⋅ne⋅s » par les acteurs associatifs, sont devenus, repris par les autorités politiques ou les grandes entreprises, un moteur d'intertie. Ils témoignent autant d'une volonté de chacun×e de rassurer à peu de frais ses angoisses écologiques que de celle des institutions qui les promeuvent de faire oublier la toxicité de leurs activités ou leur incapacité à menere des politiques environnementales dignes de ce nom. [petits-gestes, p34]&lt;/p&gt;
&lt;p&gt;« Se changer soi pour changer le monde », cette prescription […] semble au final un leurre, car travailler sur soi-même […] c'est avant tout accepter une vision du monde où chacun⋅e étant capable d'aller bien, chacun⋅e est responsable de son sort. [développement-personnel, p42]&lt;/p&gt;
&lt;p&gt;Les pensées de droite sont friandes de responsabilité personnelle, sous-estiment contrainte et rapports de pouvoir, surestiment la marge de manœuvre des personnes (ici des civils dans un pays en guerre, des femmes en régime patriarcal, des personnes surnuméraires dans un contexte de chômage massif et durable). C'est une manière de justifier un monde d'inégalités et de violence, où les logiques de solidarités sont abentes. [développement-personnel, p44]&lt;/p&gt;
&lt;p&gt;Ainsi, une écologie aux racines libertaires a pu, loin de ses ambitions de départ, suivre la marche du monde : une libéralisation des rapports sociaux qui entraîne consumérisme et individualisme. C'est le sort qu'ont connu d'autres aspirations issues de la contre-culture des années 60 : la révolution sexuelle ouvre le marché de l'industrie pornographique, la critique d'un capitalisme autoritaire entraîne sa métamorphose. [capitalisme, engagement, p51] &lt;/p&gt;
&lt;p&gt;Richard Sennet dans &lt;em&gt;La culture du nouveau capitalisme&lt;/em&gt; ou Ève Chiapelle et Luc Boltanski dans &lt;em&gt;Le Nouvel Esprit du capitalisme&lt;/em&gt; ont décrit l'évolution d'un régime autoritaire en un nouveau, plus libéral, où les hiérarchies et les contraintes, plus diffuses, voire insaisissables, sont d'autant plus difficiles à combattre. Sans autorité visible à contester, l'individu ne peut s'en prendre quà lui même. Son mal-être ou son échec sont les conséquences de ce qui est perçu comme une plus grande liberté, à vrai dire une coercition plus subtile. [capitalisme, p51]&lt;/p&gt;
&lt;p&gt;Les préoccupations politiques sont aussi absentes dans les cours de yoga offerts aux salarié⋅es de grandes entreprises que dans les annonces pour des pratiques de relaxation au magasin bio. [alternatives, p57]&lt;/p&gt;
&lt;p&gt;Il est acquis aujourd'hui qu'aucune attitude positive n'a de bénéfice physiologique pour les patientes, qu'un mode de vie sain ne peut pas prévenir le cancer du sein et que l'exposition à un environnement toxique fait l'essentiel du risque mais les discours normatifs culpabilisent les patientes qui vivent leur cancer autrement qu'avec une bonne volonté et un enthousiasme débordants. [cancer, positivisme, p61]&lt;/p&gt;
&lt;p&gt;Or, la vie commune est souvent défavorable aux femmes, elles sont plus heureuses seules qu'en couple. Le couple hétérosexuel permet en revanche aux homes de mieux vivre que s'ils étaient célibataires, par exemple en mangeant plus sainement. Ils travaillent plus et gagnent plus à mesure qu'ils s'installent en couple et ont des enfants, tandis que les femmes réduisent leur temps de travail et leur revenu pour les mêmes raisons. [féminisme, p70]&lt;/p&gt;
&lt;p&gt;Caricaturer le tavail comme une simple source de revenu et vouloir le fair edisparaître, c'est accepter sa dégradation en bête labeur, dont est coupable son organisation capitaliste. [travail, revenu-de-base, p97]&lt;/p&gt;
&lt;p&gt;Loin d'être une ambition universelle, le bonheur est une « idée neuve en Europe » à la fin du 18ème siècle. Elle semble aujourd'hui un but indépassable et pourtant d'autres sociétés adoptent des valeurs différentes, par exemple la justice ou l'harmonie avec le monde. [bonheur, p101]&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="écologie"></category><category term="développement-personnel"></category></entry><entry><title>Hommes Anarchistes face au féminisme</title><link href="https://blog.notmyidea.org/hommes-anarchistes-face-au-feminisme.html" rel="alternate"></link><published>2019-09-01T00:00:00+02:00</published><updated>2019-09-01T00:00:00+02:00</updated><author><name>Françis Dupuis-Déri</name></author><id>tag:blog.notmyidea.org,2019-09-01:/hommes-anarchistes-face-au-feminisme.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;La féministe Catharine A. MacKinnon précise de plus que a violence contre la femme à une valeur érotique dans notre société occidentale et que les femmes en viennent à vouloir être subordonnées dans la sexualité et l'amour, car elles ont intériorisé cette « valeur ». [violence, érotisme]&lt;/p&gt;
&lt;p&gt;Pour leur part, les hommes …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;La féministe Catharine A. MacKinnon précise de plus que a violence contre la femme à une valeur érotique dans notre société occidentale et que les femmes en viennent à vouloir être subordonnées dans la sexualité et l'amour, car elles ont intériorisé cette « valeur ». [violence, érotisme]&lt;/p&gt;
&lt;p&gt;Pour leur part, les hommes, anarchistes ou non, sont socialisés en tant qu'hommes à considérer les femmes comme des objets sexuels, et à associer la violence et la domination à la sexualité, au désirable [violence, érotisme]&lt;/p&gt;
&lt;p&gt;Par ailleurs, des hommes anarchistes prétendent être « victimes » du système patriarcal, considérant en conséquence que les féministes ne devraient pas cibler les hommes, mais lutter à leur côté. Contre qui ? Voilà qui n'est pas très clair, puisque cette perspective laisse entendre qu'il n'y a personne qui contrôle le système patriarcal, qui se tiendrait comme un nuage au-dessus des hommes et des femmes. [masculinismes]&lt;/p&gt;
&lt;p&gt;Il y a deux classes de sexe qui forment le patriarcat, […] ces deux classes ne sont pas égales et […] sont composées d'individus de chair et d'os, qui de par leur assignation à une classe n'entretiennent pas des rapports égalitaires avec les membres de l'autre classe. Les hommes anarchistes […] doivent reconnaitre le fait qu'ils appartiennent à la classe dominante, et que les femmes avec qui ils entrent en relation appartiennent à une classe dominée. [réalisation]&lt;/p&gt;
&lt;p&gt;Une variation sur le thème de la priorité stratégique peut consister à laisser entendre que la mobilisation féministe, surtout en non-mixité, représente non seulement une dissolution des forces anarchistes mais une véritable exclusion des hommes anarchistes qui se rouvent donc disciminés par ces femmes qui ne respectent plus les principes anarchistes universalites d'égalité et de solidarité. Ce discours, qui me semblait un écho de la rhétorique républicaine classique, à été maintes fois reprise au sujet de la trentaine de féministes réunies en non-mixité dans le campement « Point G » en marche du Village alternatif, anticapitaliste et antiguerre (VAAAG) […] contre le sommet du G8 à Évian en 2003. [non-mixité, hierarchisation]&lt;/p&gt;
&lt;p&gt;Placé en position de domination face aux femmes de par son appartenance à la classe des hommes, l'homme anarchiste même bien intentionné aurait tendance à dominer les femmes, car la structure de classes inégalitaire entre les gommes et les femmes favorise chez lui son instinct autoritaire, sa volonté de domination. Christine Delphy explique de plus, au sujet d'un homme hypothétique — il pourrait être anarchiste — qui voudrait entretenir une relation égalitaire avec un femme, « qu'il ne peut à lui tout seul supprimer, détruire ce qu'uil n'a pas fait », c'est à dire la structure inégalitaire patriarcale dans le cadre de laquelle ses relations avec les femmes prennent nécessairement place. [réalisation]&lt;/p&gt;
&lt;p&gt;Des féministes comme Christine Delphy et Peggy McIntosh rapellent que dans notre société, les hommes jouissent en général de nombreux avantages face aux femmes, même si ces hommes sont critiques de leurs privilèges et s'affichent proféministes et anarchistes. [privilèges]&lt;/p&gt;
&lt;p&gt;« Le privé est politique », c'est à dire (1) que les femmes vivent des relations de pouvoir dans leurs rapports interpersonnels avec les hommes; (2) que ce rapport de pouvoir ne relèvent pas de la psychologie individuelle et des traits de personnalité, mais d'une strucutre sociale constituée de deux classes de sexe; (3) que c'est dans le privé que les femmes sont le plus menacées par les hommes (inceste, viol, violence, meurtre). En somme, si les hommes anarchistes entrentn nécessairement en relation avec des femmes (anarchistes ou non) en tant que membre de la classe de sexe dominante, ces dernières sont nécessairement membres de la classe du sexe dominé. Cela aussi encourage chez l'homme anarchiste son instinct de domination. [privilèges]&lt;/p&gt;
&lt;p&gt;Les hommes anarchistes respecteront les femmes quand elles auront établi un rapport de force qui modifiera les structures inégalitaires. C4est d'ailleurs ce que des militantes anarchistes et féministes s'efforcent de réaliser, génération après génération, dans la société et dans le milieu militant, au gré de leurs décéptions, de leurs peines, de leurs blessures et de leurs colères. [rapport-de-force]&lt;/p&gt;
&lt;p&gt;Pour Claire Sydner, le défi est très grand, car il s'agit « de créer une égalité entre les genres alors que les femmes érotisent les relations inégalitaires et de domination, et jouissent d'être réifiées, et demandent le droit de servir sexuellement les hommes » [érotisme, réalisation]&lt;/p&gt;
&lt;p&gt;Les anarchistes sont d'autant moins enclins à s'ouvrir aux critiques féministes à leur endroit qu'ils tirent en général un sens de supériorité morale à s'identifier comme des victimes, des opprimés, ou des alliés des opprimés; les anarchistes sont donc particulièrement réfractaires à l'idée qu'ils seraient eux-même des privilégiés et des dominants. [réalisation]&lt;/p&gt;
&lt;p&gt;Les hommes anarchistes devraient se considérer avant tout comme des auxiliaires des femmes et des féministes, et ils devraient aligner leurs actions (ou leur inaction) selon les volontés, les besoins et les désirs des femmes et des féministes. [postures]&lt;/p&gt;
&lt;p&gt;"S'agit-il de constituer des groupes d'hommes antisexistes, pour discuter de la déconsntruction de nos scripts érotiques ? Malheureusement, de telles expériences dans les années 1970 et 1980 ont débouché sur des expressions anti-féministes; ces groupes luttant au final pour les « droits des gommes » contre les féministes et le « féminazisme ». Une telle évolution (ou régression) n'est pas surprenante : placer quelques membres 'une classe dominante ensemble, et il y a un risque réel qu'ils se solidarisent et se confortent les uns les autres dans leurs complaintes au sujet de « leurs » femmes qui contesteraient leurs privilèges et leur domination. Nous devrison plutôt entamer un processus de &lt;em&gt;disempowerment&lt;/em&gt; et pour l'ensemble des hommes." [non-mixité, groupes-hommes]&lt;/p&gt;
&lt;p&gt;Mais la théorie anarchiste prévoit que les dominants ne s'engagnent dans un processus de &lt;em&gt;disempowerment&lt;/em&gt; que si les opprimées se mobilisent et luttent pour leur émancipation, et contre les dominants; la théorie anarchiste permet donc de prévoir — paradoxalement — que les hommes anarchistes le lâcherons leur prise sur des femmes que lorsque des femmes auront constitué un rapport de force les forçant justement à lâcher prise, à s'engager dans un processus de &lt;em&gt;disempowerment&lt;/em&gt;. Si des hommes anarchistes trouvent cette conclusion irrecevable et cherchent les failles dans mon raisonnement, je crois que des femmes anarchistes la trouveront simplement banale. [rapport-de-force]&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="féminisme"></category><category term="anarchisme"></category></entry><entry><title>Les illusions libérales, individualisme et pouvoir social</title><link href="https://blog.notmyidea.org/les-illusions-liberales-individualisme-et-pouvoir-social.html" rel="alternate"></link><published>2019-09-01T00:00:00+02:00</published><updated>2019-09-01T00:00:00+02:00</updated><author><name>Jean-léon Beauvois</name></author><id>tag:blog.notmyidea.org,2019-09-01:/les-illusions-liberales-individualisme-et-pouvoir-social.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Reposant en effet sur la proposition selon laquelle il est des systèmes de gouvernement héréditairement malades, lesquels s'effondrent alors un jour ou l'autre sous le simple effet de l'évolution délétère de leur maladie, comme ce fut, dit-on, le cas du système communiste, […] implique que, puisque notre propre système perdure depuis …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Reposant en effet sur la proposition selon laquelle il est des systèmes de gouvernement héréditairement malades, lesquels s'effondrent alors un jour ou l'autre sous le simple effet de l'évolution délétère de leur maladie, comme ce fut, dit-on, le cas du système communiste, […] implique que, puisque notre propre système perdure depuis plus d'un siècle, puisque &lt;em&gt;nos démocraties&lt;/em&gt; […] perdurent depuis plus d'un siècle, c'est qu'elles ne sont atteintes d'aucune maladie constitutionnelle grave, voire qu'elles sont, bien au contraire, héréditairements saines et pures. [p20]&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="libéralisme"></category></entry><entry><title>Open space technology</title><link href="https://blog.notmyidea.org/open-space-technology.html" rel="alternate"></link><published>2019-09-01T00:00:00+02:00</published><updated>2019-09-01T00:00:00+02:00</updated><author><name>Harrison Owen</name></author><id>tag:blog.notmyidea.org,2019-09-01:/open-space-technology.html</id><summary type="html">&lt;h2 id="the-invitation"&gt;The invitation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A natural temptation […] is to try to explain everything that will happen during the event, including how and why it will work&lt;/strong&gt;. After all, we are used to sending out a full agenda in advance with a complete rationalization. Open Space makes that unnecessary. The group will prepare …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h2 id="the-invitation"&gt;The invitation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A natural temptation […] is to try to explain everything that will happen during the event, including how and why it will work&lt;/strong&gt;. After all, we are used to sending out a full agenda in advance with a complete rationalization. Open Space makes that unnecessary. The group will prepare the agenda upon arrival. Thus, providing the agenda is not only unnecessary, it is impossible. So what do you say in the invitation? As little as possible. &lt;strong&gt;The objective is to stimulate the imagination of potential guests to the point that they perceive the pertinence and attractiveness of the issue&lt;/strong&gt;. [p29]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A useful model might be the first paragraph of a really good story&lt;/strong&gt;. If you tell the whole tale at the outset, nobody would bother reading on. On the other hand, if you say nothing, or little that makes any sense, the reader will not be hooked. [p29]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When it comes to explaining Open Space, dont&lt;/strong&gt;. Simply say that although it may be new to this group, it has been used all over the world with predictable results. [p30]&lt;/p&gt;
&lt;p&gt;Promises :
1. Every issue of concern to anybody will have been raised, if they took responsibility for doing that.
2. All issues will have received full discussion, to the extent desired.
3. A full report of issues and discussions will be in the hands of all participants.
4. Priorities will be set and action plans will be made. [p30]&lt;/p&gt;
&lt;p&gt;Every invitation is unique, and it should be. &lt;strong&gt;The invitation should appeal to that unique group of people who might care about the issue at hand&lt;/strong&gt;. By definition, that will exclude a whole mess of other people who couldnt care less. [p30]&lt;/p&gt;
&lt;p&gt;I suggest four simple sections […]
1. The Theme (issue): Stated in ten words or less—preferably much less
2. Background/Rational: This should include highlights and most especially intriguing questions. But by no means should this be a full documentation of present status and desired future.
3. Logistics (Where, When, and How): Keep it simple […]
4. The Promises
[p31]&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="organisation"></category><category term="open-space"></category></entry><entry><title>Rupture anarchiste et trahison pro-féministe</title><link href="https://blog.notmyidea.org/rupture-anarchiste-et-trahison-pro-feministe.html" rel="alternate"></link><published>2019-08-01T00:00:00+02:00</published><updated>2019-08-01T00:00:00+02:00</updated><author><name>Léo Thiers-Vidal</name></author><id>tag:blog.notmyidea.org,2019-08-01:/rupture-anarchiste-et-trahison-pro-feministe.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Très rapidement des oppositions se sont en effet révélées : les hommes engagés ressortaient joyeux des ateliers non-mixtes masculins où ils avaient par exemple abordé les premières expériences sexuelles, les fantasmes, l'expression d'émotions, tandis que les féministes ressortaient graves d'ateliers où elles avaient abordé les violences sexuelles et leurs conséquences sur …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Très rapidement des oppositions se sont en effet révélées : les hommes engagés ressortaient joyeux des ateliers non-mixtes masculins où ils avaient par exemple abordé les premières expériences sexuelles, les fantasmes, l'expression d'émotions, tandis que les féministes ressortaient graves d'ateliers où elles avaient abordé les violences sexuelles et leurs conséquences sur leur sexualité et leur intégrité. [non-mixité, p107]&lt;/p&gt;
&lt;p&gt;Les hommes, s'ils veulent maintenir leur qualité de vie matérielle, psychologique, sexuelle et mentale, ont intérêt à se cacher à eux-mêmes le caractère oppressif de leur rapports avec les femmes. [réalisation, p110]&lt;/p&gt;
&lt;p&gt;C'est aussi en refusant d'empatiser avec les femmes que les hommes engagés demeurent liés au groupe social des hommes en général. Seul un travail théorique, politique et personnel sur cet aspect de la subjectivité masculine permettra de briser le lien avec le groupe social des hommes et d'élaborer une conscience anti-masculiniste. [réalisation, p111]&lt;/p&gt;
&lt;p&gt;J'entends par « masculinisme » l'idéologie politique gouvernante, structurant la société de telle façon que deux classes sociales sont produites : les hommes et le femmes. La classe sociale des hommes se fonde sur l'oppression des gemmes, source d'une qualité de vie améliorée. J'entends par « masculinité » un nombre de pratiques — produisant une façon d'être au monde et une vision du monde — structurées par le masculinisme, fondées sur et rendant possible l'oppression des femmes. J'entends par « hommes » les acteurs sociaux produits par le masculinisme, dont le trait commun est constitué par l'action oppressive envers les femmes. -- Michèle Le Dœuff [masculinisme, p126]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La pensée &lt;em&gt;queer&lt;/em&gt; [...] ne me renvoie pas vers une position privilégiée mais incite&lt;/strong&gt; par l'accent qu'elle met sur la performativité, la sexualité, le discursif, &lt;strong&gt;à se croire indépendant des structures sociales&lt;/strong&gt;. Comme si je pouvais aller là ou bon me semblait, et que quasi toute transgression de l'ordre symbolique hétéro-normatif était politiquement pertinente. Comme si nous étions tou⋅te⋅s des atomes libres survolant genre, hétérosexualité et oppression des femmes par les hommes. Ça ne risque pas trop de faire comprendre aux hommes que c'est plutôt une restriction de notre pouvoir et marge de manœuvre qui serait nécessaire... [queer, genre]&lt;/p&gt;
&lt;p&gt;Du côté des hommes, la prise de conscience de la position sociale oppressive aboutit souvent à revendiquer une &lt;em&gt;autre&lt;/em&gt; masculinité. Il me semble pourtant que nous avons (à l'opposé des groupes sociaux opprimés pour lesquels la revendication identitaire reste une question de survie) à faire un chemin vers le refus d'identité genrée, donc l'abolition de l'identité masculine. Cette abolition ne peut d'ailleurs que passer par la mise en place d'autres rapports sociaux abolissant progressivement le genre et créant de nouveaux ingrédients relationnels humains. L'utopie du non-genre me semble d'ailleurs bien plus radicale que la création de nouvelles recettes « post identitaires », à l'aider d'ingrédients entièrement marqués et structurés par l'oppression des femmes par les hommes. [masculinisme, queer]&lt;/p&gt;
&lt;p&gt;Si la pensée &lt;em&gt;queer&lt;/em&gt; nous interpelle dans sa remise en cause de l'hétéronormativité, elle nous dérange dans la mesure où :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elle déconnecte genre de sexe, mais néglige le fait que le genre est un système politique d'organisation des humains en oppresseurs et opprimées.&lt;/li&gt;
&lt;li&gt;Elle traite la dimension discursive de l'hétéronormativité comme fondamentale, et non ses structures sociales hiérarchiques.&lt;/li&gt;
&lt;li&gt;Elle sur-visibilise la dimension sexuelle au détriment d'autres dimensions comme la division genrée du travail, l'exploitation domestique, etc., ainsi que les autres axes d'oppression de race, de classe, de continent…&lt;/li&gt;
&lt;li&gt;Elle manque fondamentalement d'utopie radicale et accentue avant tout les modes d'actions individuels au détriment de modes d'action collectifs en vue de l'abolition du genre.
-- Sabine Masson &amp;amp; Léo Thiers-Vidal [queer]&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="féminisme"></category><category term="anarchisme"></category><category term="masculinismes"></category></entry><entry><title>Ours</title><link href="https://blog.notmyidea.org/ours.html" rel="alternate"></link><published>2019-07-03T00:00:00+02:00</published><updated>2019-07-03T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-07-03:/ours.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;De manière plus large, est-ce normal …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;p&gt;Suis-je en train de devenir un ours ?&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Vélo</title><link href="https://blog.notmyidea.org/velo.html" rel="alternate"></link><published>2019-06-27T00:00:00+02:00</published><updated>2019-06-27T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-06-27:/velo.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Un espace des communs Rennais ?</title><link href="https://blog.notmyidea.org/un-espace-des-communs-rennais.html" rel="alternate"></link><published>2019-06-26T00:00:00+02:00</published><updated>2019-06-26T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-06-26:/un-espace-des-communs-rennais.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Ce document se veut surtout être quelques notes, et donc revêt un caractère « fouilli » paaaarfaitement assumé. Dailleurs, ce n'est que ce que j'ai bien voulu retenir. Voilà.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Ce document se veut surtout être quelques notes, et donc revêt un caractère « fouilli » paaaarfaitement assumé. Dailleurs, ce n'est que ce que j'ai bien voulu retenir. Voilà.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;communs&lt;/em&gt;;
2. Monter une structure Rennaise pour proposer de lhébergement de services web.&lt;/p&gt;
&lt;p&gt;Élaborons un peu...&lt;/p&gt;
&lt;h2 id="1-un-espace-pour-federer"&gt;1. Un espace pour fédérer&lt;/h2&gt;
&lt;p&gt;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 &lt;em&gt;du libre&lt;/em&gt; à 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h3 id="frequence"&gt;Fréquence&lt;/h3&gt;
&lt;p&gt;Deux pistes ont été évoquées:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faire des rencontres suffisamment espacées les unes des autres&lt;/strong&gt;, 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 ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ou au contraire, &lt;strong&gt;avoir des rencontres avec une fréquence assez forte&lt;/strong&gt;, pour qu'en cas d'incapacité à participer il n'y ait pas trop longtemps à attendre ?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="charte-ethique"&gt;Charte éthique&lt;/h3&gt;
&lt;p&gt;Le fait d'avoir un &lt;em&gt;code de conduite&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;h3 id="gouvernance"&gt;Gouvernance&lt;/h3&gt;
&lt;p&gt;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é.&lt;/p&gt;
&lt;p&gt;Pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cela permet de ne pas reposer uniquement sur quelques personnes;&lt;/li&gt;
&lt;li&gt;Faire des fiches explicatives qui permettent à tou·te·s de s'impliquer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contre : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quand tout le monde est responsable, personne ne l'est.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peut-être que des solutions intermédiaires sont à trouver, en désignant d'une fois sur l'autre les personnes qui soccupent du prochain rendez-vous, par exemple.&lt;/p&gt;
&lt;h2 id="2-hebergement-de-services-web"&gt;2. Hébergement de services Web&lt;/h2&gt;
&lt;p&gt;On a discuté très rapidement de la possibilité de monter une structure pour faire de lhé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é.&lt;/p&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;h2 id="et-donc"&gt;Et donc ?&lt;/h2&gt;
&lt;p&gt;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 :-)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Comment la non-violence protège l'état</title><link href="https://blog.notmyidea.org/comment-la-non-violence-protege-letat.html" rel="alternate"></link><published>2019-06-01T00:00:00+02:00</published><updated>2019-06-01T00:00:00+02:00</updated><author><name>Peter Gelderloos</name></author><id>tag:blog.notmyidea.org,2019-06-01:/comment-la-non-violence-protege-letat.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;On peut discerner un schéma récurrent de manipulation historique et de blanchiment flagrant dans chacune des victoires revendiquées par les activistes non-violent-e-s. &lt;strong&gt;La position pacifiste requiert que le succès doit pouvoir être attribué aux tactiques pacifistes et à elles seules, alors que nous autres pensons que le changement provient de …&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;On peut discerner un schéma récurrent de manipulation historique et de blanchiment flagrant dans chacune des victoires revendiquées par les activistes non-violent-e-s. &lt;strong&gt;La position pacifiste requiert que le succès doit pouvoir être attribué aux tactiques pacifistes et à elles seules, alors que nous autres pensons que le changement provient de lensemble des tactiques utilisées dans toute situation révolutionnaire, pourvu quelles soient déployées de façon efficace&lt;/strong&gt;. Parce quaucun conflit social majeur ne présente une uniformité de tactiques et didéologies autrement dit on trouve dans tous les conflits de ce genre le recours à des tactiques pacifistes et à des tactiques résolument non-pacifistes , les pacifistes doivent effacer la part dhistoire qui est en désaccord avec leurs affirmations ou au contraire attribuer leurs échecs à la présence au sein du mouvement concerné dune forme de lutte violente.&lt;/p&gt;
&lt;p&gt;On nous raconte quen Inde, guidés par leur leader Gandhi, les gens construisirent au fil des décennies un mouvement non-violent de masse et sengagèrent dans la protestation, la non-coopération, les boycotts économiques, des grèves de la faim exemplaires et des actes de désobéissance pour bloquer la machinerie de limpérialisme britannique. Ils subirent des massacres et répliquèrent par une ou deux émeutes mais, dans lensemble, le mouvement fut non-violent et, après avoir persévéré pendant des décennies, le peuple indien gagna son indépendance, délivrant ainsi une victoire pacifiste certifiée. Lhistoire réelle est plus compliquée, puisque &lt;strong&gt;des poussées violentes ont également influencé la décision de retrait des Britanniques&lt;/strong&gt;. Ceux-ci avaient perdu la capacité de maintenir leur pouvoir colonial, après que des millions de leurs soldats meurent et qu'une grande quantité de ressources diverses soient anéanties au cours de deux guerres mondiales extrêmement violentes, dont la seconde dévasta tout spécialement la « mère patrie ». Les luttes armées des militant-e-s arabes et juifs en Palestine entre 1945 et 1948 continuèrent daffaiblir lempire britannique, et rendirent alors évidente la menace que les Indien-ne-s pourraient abandonner la désobéissance civile et prendre les armes en masse si l'on continuait de les ignorer encore longtemps ; tout ceci ne peut être exclu des facteurs qui déterminèrent la décision des Britanniques de renoncer à une administration coloniale directe.
On réalise que cette menace était encore plus directe lorsque lon comprend que &lt;strong&gt;lhistoire pacifiste du mouvement dindépendance indien brosse un tableau sélectif et incomplet&lt;/strong&gt; : la non-violence nétait pas universelle en Inde. La résistance à la colonisation britannique comprenait bien assez de lutte violente ou armée pour que lon considère de façon plus exacte que la méthode gandhienne était lune des différentes formes concurrentes de résistance populaire. Dans leur dérangeante démarche duniversalisation, &lt;strong&gt;les pacifistes effacent ces autres formes de résistance et contribuent à propager lhistoire fausse selon laquelle Gandhi et ses disciples étaient la seule boussole de la résistance indienne&lt;/strong&gt;. Sont ainsi passés sous silence dimportants dirigeants militants comme Chandrasekhar Azad 7 , qui combattit les armes à la main contre les colons britanniques, et &lt;strong&gt;des révolutionnaires comme Bhagat Singh, qui sattira un soutien massif en commettant des attentats à la bombe et des assassinats au profit dune lutte visant le renversement du capitalisme tant indien que britannique&lt;/strong&gt;.
Lhistoire pacifiste de la lutte indienne ne peut rendre compte du fait que Subhas Chandra Bose, le candidat favorable à l'usage de méthodes de luttes non exclusivement pacifiques, fut élu deux fois président du Congrès National Indien, en 1938 et 1939. Si Gandhi fut peut-être la figure la plus remarquablement influente et populaire dans la lutte pour lindépendance de lInde, la position dirigeante quil assuma ne lui valut pas toujours un soutien unanime des masses. Il perdit tellement de soutien des Indien-ne-s lorsquil appela au calme après lémeute de 1922 que « pas le moindre murmure de protestation ne se fit entendre en Inde quand les Britanniques larrêtèrent ensuite » .&lt;/p&gt;
&lt;p&gt;De façon significative, lhistoire se souvient de Gandhi plus que de tous les autres non pas parce quil représentait la voix unanime de lInde, mais de par lattention particulière que lui porta la presse britannique et la prééminence que lui valut le fait dêtre pris comme interlocuteur lors dimportantes négociations avec le gouvernement colonial britannique. Si lon se rappelle que lhistoire est écrite par les vainqueurs, une autre strate du mythe de lindépendance indienne seffrite.&lt;/p&gt;
&lt;p&gt;Mais &lt;strong&gt;laspect le plus désolant de l'affirmation des pacifistes&lt;/strong&gt; que lindépendance de lInde est une victoire pour la non-violence &lt;strong&gt;est quelle donne tête baissée dans la manipulation historique&lt;/strong&gt; élaborée dans lintérêt des États impérialistes et partisans de la suprématie blanche, qui ont colonisé les pays du Sud. Le mouvement de libération de lInde échoua. &lt;strong&gt;Les Britanniques ne furent pas ontraints à quitter lInde. Ils choisirent au lieu de ça de transférer le territoire d'une administration coloniale directe à une administration néocoloniale&lt;/strong&gt;. Quelle sorte de victoire autorise les perdants à dicter le calendrier et les modalités de lascension des vainqueurs ? Les Britanniques rédigèrent la nouvelle constitution et remirent le pouvoir entre les mains de successeurs quils choisirent. Ils attisèrent les flammes du séparatisme ethnique et religieux afin que lInde soit affaiblie par des divisions internes, empêchée de bénéficier de la paix et de la prospérité, et dépendante de laide militaire et autres formes de soutien de la part des États euro-américains.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LInde est toujours exploitée par des entreprises euro-américaines&lt;/strong&gt; (bien que plusieurs nouvelles entreprises indiennes, principalement des filiales, se soient jointes au pillage), et continue de fournir des ressources et des marchés aux États impérialistes. Par bien des façons, &lt;strong&gt;la pauvreté de son peuple sest aggravée et lexploitation est devenue plus efficace&lt;/strong&gt;. Lindépendance à légard du pouvoir colonial a donné à lInde plus dautonomie dans quelques zones, et a certainement permis à une poignée dIndiens de sasseoir dans les fauteuils du pouvoir, mais &lt;strong&gt;lexploitation et la marchandisation des ressources sest approfondie&lt;/strong&gt;. Qui plus est, lInde a perdu la nette opportunité que représentait une lutte démancipation riche de sens menée contre un oppresseur étranger aisément identifiable. Aujourdhui, un mouvement démancipation aurait a sopposer aux dynamiques déconcertantes du nationalisme et de la rivalité ethnique et religieuse pour abolir un capitalisme et un gouvernement domestiques bien plus développés que dans leurs formes dalors. Tout bien pesé, le mouvement dindépendance a donc bien échoué.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Lectures"></category><category term="non-violence"></category><category term="anarchisme"></category></entry><entry><title>Brasserie - petit bilan, après un an dexistence</title><link href="https://blog.notmyidea.org/un-an.html" rel="alternate"></link><published>2019-05-21T00:00:00+02:00</published><updated>2019-05-21T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2019-05-21:/un-an.html</id><summary type="html">&lt;h1 id="la-brasserie-du-vieux-singe-a-un-an"&gt;La brasserie du Vieux Singe a un an !&lt;/h1&gt;
&lt;p&gt;On a l'impression que c'était hier tellement le temps passe vite, mais ça fait un an que notre brasserie existe !&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;h1 id="la-brasserie-du-vieux-singe-a-un-an"&gt;La brasserie du Vieux Singe a un an !&lt;/h1&gt;
&lt;p&gt;On a l'impression que c'était hier tellement le temps passe vite, mais ça fait un an que notre brasserie existe !&lt;/p&gt;
&lt;p&gt;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 :-)&lt;/p&gt;
&lt;h2 id="quelques-dates-chiffres"&gt;Quelques dates &amp;amp; chiffres&lt;/h2&gt;
&lt;p&gt;Pour se donner un peu de perspective, voici quelques dates clés de cette première année :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Novembre 2017 : immatriculation de l'entreprise&lt;/li&gt;
&lt;li&gt;Décembre 2017 : on a les clés !&lt;/li&gt;
&lt;li&gt;Décembre 2017 à Mars 2018 : travaux, installation et divers bricolages&lt;/li&gt;
&lt;li&gt;Mars 2018 : premier brassin&lt;/li&gt;
&lt;li&gt;Mai 2018 : premières ventes !&lt;/li&gt;
&lt;li&gt;Août 2018 : vacances :-)&lt;/li&gt;
&lt;li&gt;Septembre 2018 : inauguration de la brasserie &amp;amp; premier brassin unique&lt;/li&gt;
&lt;li&gt;Décembre 2018 : second brassin unique&lt;/li&gt;
&lt;li&gt;Mars 2019 : on se rémunère !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 ;-)&lt;/p&gt;
&lt;p&gt;Petit retour en arrière…&lt;/p&gt;
&lt;h2 id="travaux-installation"&gt;Travaux &amp;amp; installation&lt;/h2&gt;
&lt;p&gt;En arrivant dans nos locaux, on a dabord dû réaliser quelques travaux daménagement : une grande partie de l'espace était utilisé en bureaux or on a surtout besoin de place dans la partie « prod ».&lt;/p&gt;
&lt;p&gt;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 deau).&lt;/p&gt;
&lt;p&gt;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 !&lt;/p&gt;
&lt;p&gt;&lt;img alt="Photo du bar" src="/images/un-an/bar.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Une fois les travaux daménagements terminés, on a reçu les cuves. Un moment très attendu (et un peu flippant, oui). On a dabord reçu les fermenteurs, debout, quon a pu décharger au chariot élévateur, puis les cuves de brassage, la ligne dembouteillage et enfin notre cuve de ressucrage et carbonatation. Cette dernière est arrivée couchée, on a donc du la relever à laide dune grue. Vous voyez les gouttes de sueur perler sur nos fronts ?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Photo du levage du fermenteur avec la grue" src="/images/un-an/dechargement.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Quasiment aucun problème pour décharger les fermenteurs, au final. Le plus difficile a été le déchargement de notre ligne dembouteillage, assez lourde, pour laquelle on a eu quelques déconvenues. On a la chance davoir sur la zone &lt;a href="https://www.jfblevage.fr/"&gt;une entreprise de levage très arrangeante&lt;/a&gt; qui nous a permis de décharger ça correctement, nous enlevant une belle épine du pied.&lt;/p&gt;
&lt;p&gt;A peine les fermenteurs installés, on réceptionnait les cuves de brassage. Les Anglais de &lt;a href="https://www.pbcbreweryinstallations.com/"&gt;PBC&lt;/a&gt; sont venus sur place pour terminer linstallation 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 &amp;amp; remplacer en cas de soucis (ce qu'on a pas tardé à vérifier !)&lt;/p&gt;
&lt;h2 id="premiers-brassins"&gt;Premiers brassins&lt;/h2&gt;
&lt;p&gt;Sur nos premiers brassins, on a décidé dutiliser 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.&lt;/p&gt;
&lt;p&gt;On est donc partis sur des brassins de 800 litres. Les premiers brassins se sont vraiment bien déroulés : 7 heures de brassage &amp;amp; nettoyage pour 800L de moût.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Et puis, au fur et à mesure de lanné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 &amp;amp; températures pour l'ajout du houblon lors du &lt;em&gt;dry hopping&lt;/em&gt;)&lt;/p&gt;
&lt;h2 id="preventes-puis-ventes"&gt;Préventes, puis ventes&lt;/h2&gt;
&lt;p&gt;En parallèle du brassage, on faisait nos premières ventes avec notre système de préventes en ligne.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Notre retour sur ces préventes est vraiment positif. &lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Et là, &lt;em&gt;le double effet kiss-cool&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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 dachats. On n'aurait vraiment pas rêvé mieux !&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;On s'est également mis à travailler avec un transporteur pour faire des envois.&lt;/p&gt;
&lt;h2 id="organisation-du-temps"&gt;Organisation du temps&lt;/h2&gt;
&lt;p&gt;Autant pour fabriquer de la bière on avait un peu dexpérience, autant pour faire tourner une entreprise on avait tout à découvrir ! &lt;/p&gt;
&lt;p&gt;On passe beaucoup de temps à faire les taches administratives (téléphone, ordinateur) quon n'avait pas imaginées à lorigine. Ça représente environ la moitié de notre temps de travail !&lt;/p&gt;
&lt;p&gt;Au final, on ne travaille tous les deux ensemble qu'assez rarement : on alterne sur la &lt;em&gt;production&lt;/em&gt; (brassage, mise en bouteilles, mise en fûts, et surtout nettoyage !) dune semaine sur lautre ; et quand on n'est pas « de prod », on sest réparti les tâches administratives : Fred soccupe de la partie comptabilité et des fournisseurs ; Alexis des ventes, de la communication et de la gestion du stock.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Le problème, cest quon reste un peu la tête dans le guidon. On essaie bien de prendre du recul, mais le boulot, lui, nattend pas !&lt;/p&gt;
&lt;p&gt;Et cest là que les vacances prennent tout leur sens. Une des forces dêtre à Rennes cest quau mois dAoût, il ne se passe absolument rien. Le pied ! Allez hop, en vacances !&lt;/p&gt;
&lt;h2 id="la-place-de-lexperimentation"&gt;La place de lexpérimentation&lt;/h2&gt;
&lt;p&gt;Pour nous, faire de la bière est aussi un moyen dexpé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 !)&lt;/p&gt;
&lt;p&gt;Et quand on passe des tests à léchelle, (de 20L à 1500L), on est moyennement rassurés !&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ah ça, cest pas les idées qui nous manquent :-) Et c'est une super manière d'expérimenter.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Étiquette de la Sobacha, une lager avec une infusion de sarrasin torréfié" src="/images/experimentations/sobacha.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Étiquette de Monstrueuse Normalité, une New England IPA" src="/images/experimentations/monstrueuse-normalite.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Étiquette de Chaînon Manquant, une Sour Pale Ale avec du Kiwi" src="/images/experimentations/chainon-manquant.png"&gt;&lt;/p&gt;
&lt;h2 id="ouverture-au-public-evenements-et-equilibre"&gt;Ouverture au public, évènements et équilibre&lt;/h2&gt;
&lt;p&gt;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 aujourdhui quelque chose de nouveau pour la plupart, et il faut satisfaire cette curiosité (il faut plus de brasseries !).&lt;/p&gt;
&lt;p&gt;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. &lt;strong&gt;On souhaite garder un équilibre entre notre vie personnelle et notre vie professionnelle&lt;/strong&gt;. 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 dun rythme aussi effréné.&lt;/p&gt;
&lt;p&gt;Notre choix, cest 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.&lt;/p&gt;
&lt;h2 id="bref"&gt;Bref…&lt;/h2&gt;
&lt;p&gt;…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 !&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>De Mozilla à la Brasserie du Vieux Singe</title><link href="https://blog.notmyidea.org/de-mozilla-a-la-brasserie-du-vieux-singe.html" rel="alternate"></link><published>2018-05-27T00:00:00+02:00</published><updated>2018-05-27T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2018-05-27:/de-mozilla-a-la-brasserie-du-vieux-singe.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Ce weekend avait lieu &lt;a href="https://sudweb.fr/2018/"&gt;SudWeb&lt;/a&gt; « 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.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Certaines parties de ce que je voulais transmettre sont passées à la trappe, alors que …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Ce weekend avait lieu &lt;a href="https://sudweb.fr/2018/"&gt;SudWeb&lt;/a&gt; « 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.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;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 &lt;em&gt;obligé&lt;/em&gt; de le faire, et je n'en tirais pas le même plaisir.&lt;/p&gt;
&lt;p&gt;Quand j'étais plus jeune au lycée j'écrivais des programmes en &lt;em&gt;Visual Basic&lt;/em&gt; que je partageais en ligne sur mon site en &lt;code&gt;.free.fr&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;Cette culture du partage — celle du logiciel libre — est celle qui m'anime.&lt;/p&gt;
&lt;p&gt;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 (&lt;a href="https://getpelican.com"&gt;pelican&lt;/a&gt;) 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.&lt;/p&gt;
&lt;p&gt;À 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.&lt;/p&gt;
&lt;p&gt;Je bosse sur du Logiciel Libre, en Python, en télétravail parfois, avec une bonne paie, sans parler du côté prestigieux. Grisant.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;possible&lt;/em&gt; de faire de la bière. On tente donc l'expérience, et nos premières expériences sont des journées bien &lt;em&gt;funky&lt;/em&gt;, à faire toutes les erreurs possibles.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Petit à petit, l'idée de monter ce qui est maintenant devenu &lt;a href="https://www.vieuxsinge.com"&gt;La Brasserie du Vieux Singe&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;À 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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. &lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Groupement d'achats &amp; partage d'expérience</title><link href="https://blog.notmyidea.org/groupement-dachats-partage-dexperience.html" rel="alternate"></link><published>2018-03-03T00:00:00+01:00</published><updated>2018-03-03T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2018-03-03:/groupement-dachats-partage-dexperience.html</id><summary type="html">&lt;p&gt;Il y a quelques années, on s'est motivé entre copains copines pour créer un groupement d'achat.&lt;/p&gt;
&lt;p&gt;L'idée est simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;commander en gros, pour faire baisser les prix&lt;/li&gt;
&lt;li&gt;se passer d'intermédiaires et favoriser les circuits courts&lt;/li&gt;
&lt;li&gt;aller à la rencontre des producteurs locaux et échanger&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre groupement dessert actuellement 18 foyers …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Il y a quelques années, on s'est motivé entre copains copines pour créer un groupement d'achat.&lt;/p&gt;
&lt;p&gt;L'idée est simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;commander en gros, pour faire baisser les prix&lt;/li&gt;
&lt;li&gt;se passer d'intermédiaires et favoriser les circuits courts&lt;/li&gt;
&lt;li&gt;aller à la rencontre des producteurs locaux et échanger&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre groupement dessert actuellement 18 foyers et une 60aine de personnes.&lt;/p&gt;
&lt;p&gt;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 :)&lt;/p&gt;
&lt;h1 id="organisation"&gt;Organisation&lt;/h1&gt;
&lt;p&gt;On organise environs trois ou quatre distributions par an. Le &lt;em&gt;modus operandi&lt;/em&gt; est le suivant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;chaque product·eur·rice à un·e référent·e, qui s'occupe de faire le lien;&lt;/li&gt;
&lt;li&gt;une personne est désignée pour coordonner la distribution;&lt;/li&gt;
&lt;li&gt;4 semaines avant la distribution, les référent·e·s mettent à jour les prix / produits dans le tableau de commandes;·e·&lt;/li&gt;
&lt;li&gt;3 semaines avant la distribution, les commandes sont ouvertes;&lt;/li&gt;
&lt;li&gt;2 semaines avant la distribution, les commandes sont closes;&lt;/li&gt;
&lt;li&gt;Les référent·e·s ont ensuite deux semaines pour récupérer les commandes pour la distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="quels-produits"&gt;Quels produits ?&lt;/h1&gt;
&lt;p&gt;On essaye d'avoir uniquement des produits qui se conservent (on a également quelques autres produits plus frais, mais avec d'autres modalités).&lt;/p&gt;
&lt;p&gt;Entre autres: bières, légumes secs, conserves, jus, miel, pâtes, semoule, café, vinaigres, pommes de terre, oignons, huiles, farines.&lt;/p&gt;
&lt;p&gt;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 !).&lt;/p&gt;
&lt;h1 id="paiements"&gt;Paiements&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h1 id="transports"&gt;Transports&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Pour les grosses commandes, les voitures se remplissent bien, mais ma petite Clio suffit, que ce soit dit !&lt;/p&gt;
&lt;h1 id="la-distribution"&gt;La distribution&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Le jour même, on se retrouve, on charge ses marchandises, on échange quelques chèques et on papote ! On en profite pour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;discuter de la date de la prochaine distribution;&lt;/li&gt;
&lt;li&gt;trouver une nouvelle personne pour la coordonner;&lt;/li&gt;
&lt;li&gt;discuter de nouveaux produits;&lt;/li&gt;
&lt;li&gt;refaire le monde;&lt;/li&gt;
&lt;li&gt;changer de référents pour les producteurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et c'est reparti pour un tour ;)&lt;/p&gt;
&lt;h1 id="nos-outils"&gt;Nos outils&lt;/h1&gt;
&lt;p&gt;On utilise un tableur en ligne pour partager les prix et prendre les commandes. On a essayé d'utiliser &lt;em&gt;ethercalc&lt;/em&gt; 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).&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Le système n'est pas parfait mais fonctionne quand même assez bien !&lt;/p&gt;
&lt;p&gt;Quelques ressources, donc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/almet/8c77fafc9e487c02ded852ec4a91ae16"&gt;le code pour faire la répartition des chèques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1bnPRSvf2Q2RDxKerWnEqUyJjuCFePnVMq6pWo8LeA_k/edit?usp=sharing"&gt;une version « à remplir » de notre tableau de commandes&lt;/a&gt; (le mieux est d'en faire une copie !).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bon groupement d'achat ;)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Webnotes</title><link href="https://blog.notmyidea.org/webnotes.html" rel="alternate"></link><published>2018-02-25T00:00:00+01:00</published><updated>2018-02-25T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2018-02-25:/webnotes.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;enregistrer une sélection de texte ainsi que son contexte: heure, site web.&lt;/li&gt;
&lt;li&gt;fonctionner sur Firefox;&lt;/li&gt;
&lt;li&gt;stocker mes notes à un endroit que je contrôle (ce sont mes données, après tout !)&lt;/li&gt;
&lt;li&gt;rester en dehors de mon chemin: je suis en train de lire, pas en train d'organiser mes notes.&lt;/li&gt;
&lt;li&gt;automatiquement partager les notes sur une page web.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai donc pris un peu de temps pour fabriquer mon outil de prises de notes, que j'ai baptisé « Webnotes ». C'est &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/wwebnotes/"&gt;une extension Firefox&lt;/a&gt;, qui se configure assez simplement, et qui stocke les données dans une instance de &lt;a href="http://kinto-storage.org/"&gt;Kinto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/almet/webnotes/blob/master/webnotes.gif?raw=true" /&gt;&lt;/p&gt;
&lt;p&gt;C'est aussi simple que sélectionner du texte, faire « clic droit » puis « save as webnote », entrer un tag et le tour est joué !&lt;/p&gt;
&lt;p&gt;Mes notes sont disponibles &lt;a href="https://notes.notmyidea.org"&gt;sur notes.notmyidea.org&lt;/a&gt;, et voici &lt;a href="https://github.com/almet/webnotes"&gt;le lien vers les sources&lt;/a&gt;, si ça vous intéresse de regarder comment ça fonctionne !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Faire moins</title><link href="https://blog.notmyidea.org/faire-moins.html" rel="alternate"></link><published>2018-02-19T00:00:00+01:00</published><updated>2018-02-19T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2018-02-19:/faire-moins.html</id><summary type="html">&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Et surtout, c'est se retrouver à contrôler son engagement.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>NEIPA #3</title><link href="https://blog.notmyidea.org/neipa-3.html" rel="alternate"></link><published>2017-12-29T00:00:00+01:00</published><updated>2017-12-29T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2017-12-29:/neipa-3.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Test autour d'une New England Pale Ale; Cette fois ci avec du Mosaic et du Citra, durant une collab' avec Heiko.&lt;/p&gt;
&lt;h1 id="objectifs"&gt;Objectifs:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Brasser une nouvelle NEIPA en appliquant les …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Test autour d'une New England Pale Ale; Cette fois ci avec du Mosaic et du Citra, durant une collab' avec Heiko.&lt;/p&gt;
&lt;h1 id="objectifs"&gt;Objectifs:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Brasser une nouvelle NEIPA en appliquant les trouvailles des deux premières versions;&lt;/li&gt;
&lt;li&gt;Hop stand de 40mn;&lt;/li&gt;
&lt;li&gt;Contrôle du pH à 5.2;&lt;/li&gt;
&lt;li&gt;Refroidissement dans l'évier;&lt;/li&gt;
&lt;li&gt;Ajouter plus d'avoine;&lt;/li&gt;
&lt;li&gt;Faire un mash out;&lt;/li&gt;
&lt;li&gt;Augmenter un peu la quantité de grain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="recette"&gt;Recette:&lt;/h1&gt;
&lt;p&gt;DI: 1055 (atteint)
pH: 5.2 (5.4 mesuré)&lt;/p&gt;
&lt;h2 id="grains"&gt;Grains:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;75% de Pale Ale&lt;/li&gt;
&lt;li&gt;12.5% de blé&lt;/li&gt;
&lt;li&gt;12.5% flocons d'avoine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="houblons"&gt;Houblons:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2g/L Mosaic (Hop Stand 40mn)&lt;/li&gt;
&lt;li&gt;2g/L Citra (Hop Stand 40mn)&lt;/li&gt;
&lt;li&gt;4g/L Citra à cru (en deux fois)&lt;/li&gt;
&lt;li&gt;4g/L Mosaic à cru (en deux fois)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eau"&gt;Eau:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Utilisation d'eau de source, pour pouvoir corriger les sulfates / chlorures.&lt;/li&gt;
&lt;li&gt;200 Chlorures pour 100 Sulfates.&lt;/li&gt;
&lt;li&gt;
&lt;h2 id="gypse-1g"&gt;Gypse: 1g&lt;/h2&gt;
&lt;dl&gt;
&lt;dd&gt;1.8g (=4.05ml)&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;Acide lactique: 0.4ml&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="profil-dempatage"&gt;Profil d'empatage:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;68°C durant 40mn;&lt;/li&gt;
&lt;li&gt;75°C durant 10mn (mash-out)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="levure"&gt;Levure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GigaYeast «Vermont Ale». Le nombre de cellules n'est pas indiqué sur le packaging, ni en ligne.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="deroule"&gt;Déroulé&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;12h50: empâtage à 68°C&lt;/li&gt;
&lt;li&gt;pH = 5.5. Ajout de 0.2 d'acide.&lt;/li&gt;
&lt;li&gt;Pas mal de mesures du pH:&lt;ul&gt;
&lt;li&gt;5.2@23°C (13h05)&lt;/li&gt;
&lt;li&gt;5.4@18°C (13h05)&lt;/li&gt;
&lt;li&gt;5.2@27°C (13h15)&lt;/li&gt;
&lt;li&gt;5.3@19°C (13h20)&lt;/li&gt;
&lt;li&gt;5.4@25°C (13h30)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;13h33: Mash-out à 78°C durant 10mn&lt;/li&gt;
&lt;li&gt;Test à l'iode: OK&lt;/li&gt;
&lt;li&gt;14h11: 1er rincage. Densité premier mout: 1070&lt;/li&gt;
&lt;li&gt;15h40: Hop Stand (15g Citra / 15g Mosaic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="fermentation"&gt;Fermentation&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;31/12/2017 - Fermentation à 20°C&lt;/li&gt;
&lt;li&gt;01/01/2018 - Ajout de 12g de Citra et 12g de Mosaic après deux jours.&lt;/li&gt;
&lt;li&gt;10/01/2018 - 1.040 SG = 1.008 corrigé&lt;/li&gt;
&lt;li&gt;15/01/2018 - Ajout de 12g de Citra et 12g de Mosaic&lt;/li&gt;
&lt;li&gt;15/01/2018 - Cold Crash&lt;/li&gt;
&lt;li&gt;21/01/2018 - Mise en bouteille. Resucrage à 7g/L.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="observations"&gt;Observations:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;BeerSmith semble proposer un outil pour calculer les modifications de pH, je devrais l'utiliser la prochaine fois.&lt;/li&gt;
&lt;li&gt;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é.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 ?&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>NEIPA #2</title><link href="https://blog.notmyidea.org/neipa-2.html" rel="alternate"></link><published>2017-12-18T00:00:00+01:00</published><updated>2017-12-18T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2017-12-18:/neipa-2.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="objectifs"&gt;Objectifs&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Corriger les erreurs du précédent brassin.&lt;/li&gt;
&lt;li&gt;Éviter les soucis de filtration&lt;/li&gt;
&lt;li&gt;Mieux corriger le pH&lt;/li&gt;
&lt;li&gt;Faire un whirlpool digne de ce nom / avoir moins de trub dans le …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Voici quelques prises durant un de mes brassins. L'idée est de pouvoir les relire et m'améliorer au fur et à mesure.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="objectifs"&gt;Objectifs&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Corriger les erreurs du précédent brassin.&lt;/li&gt;
&lt;li&gt;Éviter les soucis de filtration&lt;/li&gt;
&lt;li&gt;Mieux corriger le pH&lt;/li&gt;
&lt;li&gt;Faire un whirlpool digne de ce nom / avoir moins de trub dans le fermenteur&lt;/li&gt;
&lt;li&gt;Ne pas se laisser avoir par la baisse de température durant l'empâtage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="recette"&gt;Recette&lt;/h1&gt;
&lt;p&gt;DI: 1060 (1050 mesuré)
pH: 5.2 (atteint)&lt;/p&gt;
&lt;h2 id="grains"&gt;Grains&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;90% Pils&lt;/li&gt;
&lt;li&gt;10% Flocons d'avoine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="houblons"&gt;Houblons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2g/L Wakatu (au Whirlpool)&lt;/li&gt;
&lt;li&gt;2g/L Motueka (au Whirlpool)&lt;/li&gt;
&lt;li&gt;4.5g/L Wakatu à cru (en deux fois)&lt;/li&gt;
&lt;li&gt;2.5g/L Motueka à cru (en deux fois)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eau"&gt;Eau&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Utilisation d'eau de source, pour pouvoir corriger les sulfates / chlorures.&lt;/li&gt;
&lt;li&gt;200 Chlorures pour 100 Sulfates.&lt;/li&gt;
&lt;li&gt;Gypse: 0.9g&lt;/li&gt;
&lt;li&gt;CaCl2: 3.4g&lt;/li&gt;
&lt;li&gt;Acide lactique: Au batch précédent, j'avais mesuré 5.6, donc: ajout de +2ml d'acide (=2.4g).&lt;/li&gt;
&lt;li&gt;Utilisation d'Irish Moss (2g) pour coaguler les protéines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="profil-dempatage"&gt;Profil d'empatage&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;65°C durant 90mn (68°C au départ, 65 visé)&lt;/li&gt;
&lt;li&gt;78°C durant 10mn (mash-out)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="levure"&gt;Levure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;London Ale III.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="deroule"&gt;Déroulé&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;18h36 - empatage à 65°C&lt;/li&gt;
&lt;li&gt;19h16- pH = 5.2&lt;/li&gt;
&lt;li&gt;Densité 1er moût: 1070&lt;/li&gt;
&lt;li&gt;Ébullition importante pour atteindre 6,2L avec la bonne densité.&lt;/li&gt;
&lt;li&gt;Mash-out à 78°C durant 10mn&lt;/li&gt;
&lt;li&gt;Test à l'iode: NOK&lt;/li&gt;
&lt;li&gt;1er rincage. Densité premier mout: 1070&lt;/li&gt;
&lt;li&gt;15h40: Hop Stand (15g Citra / 15g Mosaic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="fermentation"&gt;Fermentation&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;18/12/2017 - Fermentation à 18°C&lt;/li&gt;
&lt;li&gt;21/12/2017 - Ajout de 13.5g de Wakatu et 7.5g de Motueka&lt;/li&gt;
&lt;li&gt;30/12/2017 - Ajout de 13.5g de Wakatu et 7.5g de Motueka&lt;/li&gt;
&lt;li&gt;30/12/2017 - Passage à 10°C.&lt;/li&gt;
&lt;li&gt;15/01/2018 - Cold Crash&lt;/li&gt;
&lt;li&gt;21/01/2018 - Mise en bouteille. Resucrage à 7g/L.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="observations"&gt;Observations:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Je change de technique, et mets l'acide lactique directement dans l'eau.&lt;/li&gt;
&lt;li&gt;Je concasse moins fin mais reteste quand même l'avoine. Aucun souci de filtration (mais l'avoine n'est pas concassé).&lt;/li&gt;
&lt;li&gt;1g de CaCl2 ~= 2.25ml en solution à 33%.&lt;/li&gt;
&lt;li&gt;Les deux thermomètres n'affichent pas la même température. Super :(.&lt;/li&gt;
&lt;li&gt;Au final, jempâte dans une casserole pour pouvoir faire un mash-out.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 çà !)&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Idée en vrac, à voir à la dégustation, mais ajouter un peu de cara pourrait être sympa.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Je trouve que l'efficacité de cette brasserie est vraiment pourrie.&lt;/li&gt;
&lt;li&gt;Un peu d'eau est venue diluer le moût (DI = 1050 au lieu de 1060 souhaité)&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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)&lt;/li&gt;
&lt;li&gt;Sur l'avoine toujours, il faut &lt;strong&gt;dépasser 18%&lt;/strong&gt; pour avoir un côté moelleux. Certains mettent jusqu'à 40% !&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>L'arrivée du trouble (ou comment faire des NEIPA ?)</title><link href="https://blog.notmyidea.org/larrivee-du-trouble-ou-comment-faire-des-neipa.html" rel="alternate"></link><published>2017-10-17T00:00:00+02:00</published><updated>2017-10-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2017-10-17:/larrivee-du-trouble-ou-comment-faire-des-neipa.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Ceci est une traduction d'un article paru dans le magazine « Brew Your Own » en Octobre 2016, écrit par Dave Green&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Ceci est une traduction d'un article paru dans le magazine « Brew Your Own » en Octobre 2016, écrit par Dave Green&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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».&lt;/p&gt;
&lt;h1 id="la-phase-de-demarrage"&gt;La phase de démarrage&lt;/h1&gt;
&lt;p&gt;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 &amp;amp; Brewery » deviendra le berceau d'une nouvelle révolution autour des IPA.&lt;/p&gt;
&lt;p&gt;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 &amp;amp; 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é.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;home brewshop&lt;/em&gt; 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 &amp;amp; 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 dexpérimenter seul sur les recettes.&lt;/p&gt;
&lt;p&gt;En 1997, John part du « Vermont Pub &amp;amp; Brewery » et cofonde avec sa femme Jen un brewpub en 2003, le « Alchemist Pub &amp;amp; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h1 id="la-phase-de-croissance"&gt;La phase de croissance&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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».&lt;/p&gt;
&lt;p&gt;« 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.»&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h1 id="cest-parti"&gt;C'est parti !&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="les-malts"&gt;Les malts&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="les-levures"&gt;Les levures&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="leau"&gt;L'eau&lt;/h2&gt;
&lt;p&gt;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 dempâtage et votre eau de rinçage.&lt;/p&gt;
&lt;p&gt;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é.&lt;/p&gt;
&lt;h2 id="les-houblons"&gt;Les houblons&lt;/h2&gt;
&lt;p&gt;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é.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;flame-out&lt;/em&gt; 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 &lt;em&gt;hop stand&lt;/em&gt;, ou bien de simplement ajouter tous les houblons au &lt;em&gt;flame-out&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 !&lt;/p&gt;</content><category term="Brassage"></category></entry><entry><title>Un club des brasseurs amateurs Rennais</title><link href="https://blog.notmyidea.org/un-club-des-brasseurs-amateurs-rennais.html" rel="alternate"></link><published>2017-10-06T00:00:00+02:00</published><updated>2017-10-06T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2017-10-06:/un-club-des-brasseurs-amateurs-rennais.html</id><summary type="html">&lt;p&gt;En Mars dernier, suite à quelques discussions entre brasseurs amateurs, on à décidé de monter &lt;a href="https://framalistes.org/sympa/subscribe/brassam-rennes"&gt;une liste de diffusion&lt;/a&gt; pour faciliter les échanges autour du brassage amateur sur Rennes et ses alentours.&lt;/p&gt;
&lt;p&gt;Un peu plus tard, &lt;a href="https://www.facebook.com/groups/899071153568179/"&gt;un groupe Facebook&lt;/a&gt; est venu s'ajouter, et c'est vrai qu'on sent une dynamique naissante …&lt;/p&gt;</summary><content type="html">&lt;p&gt;En Mars dernier, suite à quelques discussions entre brasseurs amateurs, on à décidé de monter &lt;a href="https://framalistes.org/sympa/subscribe/brassam-rennes"&gt;une liste de diffusion&lt;/a&gt; pour faciliter les échanges autour du brassage amateur sur Rennes et ses alentours.&lt;/p&gt;
&lt;p&gt;Un peu plus tard, &lt;a href="https://www.facebook.com/groups/899071153568179/"&gt;un groupe Facebook&lt;/a&gt; est venu s'ajouter, et c'est vrai qu'on sent une dynamique naissante autour de la brasserie artisanale dans le coin.&lt;/p&gt;
&lt;p&gt;En six mois, on est maintenant une grosse trentaine de personnes à être inscrits sur les listes et à se retrouver de temps à autres.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;On a pas mal d'idées de trucs sympa a faire, entre autres:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;em&gt;dry hop&lt;/em&gt;, etc.&lt;/li&gt;
&lt;li&gt;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 &lt;a href="https://blog.notmyidea.org/larrivee-du-trouble-ou-comment-faire-des-neipa.html"&gt;une NEIPA&lt;/a&gt; pour ensuite comparer nos résultats.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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…&lt;/p&gt;
&lt;p&gt;Si tu es dans le coin et que tu souhaite nous rencontrer, n'hésite pas à rejoindre &lt;a href="https://www.facebook.com/groups/899071153568179/"&gt;notre groupe de discussion Facebook&lt;/a&gt; et notre &lt;a href="https://framalistes.org/sympa/subscribe/brassam-rennes"&gt;liste de diffusion mail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A bientôt ;)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Brasserie du Vieux Singe — Installation en cours.</title><link href="https://blog.notmyidea.org/brasserie-du-vieux-singe-installation-en-cours.html" rel="alternate"></link><published>2017-06-26T00:00:00+02:00</published><updated>2017-06-26T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2017-06-26:/brasserie-du-vieux-singe-installation-en-cours.html</id><summary type="html">&lt;p&gt;Ça fait maintenant quelques mois que j'ai décidé de &lt;a href="https://www.vieuxsinge.com"&gt;changer de métier&lt;/a&gt;. 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ça fait maintenant quelques mois que j'ai décidé de &lt;a href="https://www.vieuxsinge.com"&gt;changer de métier&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;La chose la plus frappante, c'est la vitesse à laquelle passent les journées: j'ai &lt;em&gt;vraiment&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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 :)&lt;/p&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;p&gt;Un peu de production quand même (pour les amis) mais on se garde la grosse partie pour le lancement.&lt;/p&gt;
&lt;h2 id="apprentissage"&gt;Apprentissage&lt;/h2&gt;
&lt;p&gt;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 &lt;em&gt;bases&lt;/em&gt;, mais qu'est-ce que c'est agréable !&lt;/p&gt;
&lt;p&gt;C'est assez agréable de se remettre dans une posture d'apprenant, et d'avoir le temps pour cet apprentissage.&lt;/p&gt;
&lt;h2 id="questionner-la-posture-de-chef-dentreprise-et-son-rapport-au-temps"&gt;Questionner la posture de «Chef d'entreprise» et son rapport au temps&lt;/h2&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;design&lt;/em&gt; 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.&lt;/p&gt;
&lt;h2 id="les-projets-collectifs"&gt;Les projets collectifs&lt;/h2&gt;
&lt;p&gt;Un autre point important est la place que le &lt;em&gt;collectif&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 ;)&lt;/p&gt;
&lt;h2 id="besoin-de-concret"&gt;Besoin de concret&lt;/h2&gt;
&lt;p&gt;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…&lt;/p&gt;
&lt;p&gt;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 ?&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Comment est-ce que vous générez vos formulaires ?</title><link href="https://blog.notmyidea.org/comment-est-ce-que-vous-generez-vos-formulaires.html" rel="alternate"></link><published>2016-05-31T00:00:00+02:00</published><updated>2016-05-31T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-05-31:/comment-est-ce-que-vous-generez-vos-formulaires.html</id><summary type="html">&lt;p&gt;TL; DR: Je viens à peine de &lt;em&gt;releaser&lt;/em&gt; la première version d'un service de génération de formulaires.
Allez jeter un coup d'œil sur &lt;a href="https://www.fourmilieres.net"&gt;https://www.fourmilieres.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;En février 2012, je parlais ici &lt;a href="https://blog.notmyidea.org/carto-forms.html"&gt;d'un service de génération de formulaires&lt;/a&gt;.
Depuis, pas mal d'eau à coulé sous les ponts, on est …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;TL; DR: Je viens à peine de &lt;em&gt;releaser&lt;/em&gt; la première version d'un service de génération de formulaires.
Allez jeter un coup d'œil sur &lt;a href="https://www.fourmilieres.net"&gt;https://www.fourmilieres.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;En février 2012, je parlais ici &lt;a href="https://blog.notmyidea.org/carto-forms.html"&gt;d'un service de génération de formulaires&lt;/a&gt;.
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 &lt;/em&gt;google forms&lt;em&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;Google Forms&lt;/em&gt;,
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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture de l'interface de création du formulaire" src="https://blog.notmyidea.org/images/formbuilder/formbuilder-build.png"&gt;&lt;/p&gt;
&lt;h2 id="fonctionnalites"&gt;Fonctionnalités&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Je voulais donc quelque chose de simple à utiliser &lt;em&gt;et&lt;/em&gt; pour les créateurs de
formulaires &lt;em&gt;et&lt;/em&gt; pour les utilisateurs finaux. Pas de chichis, juste quelques
vues, et des URLs à sauvegarder une fois l'opération terminée.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture de l'écran avec les URLs générées" src="https://blog.notmyidea.org/images/formbuilder/formbuilder-created.png"&gt;
&lt;img alt="Capture d'écran d'un exemple de formulaire" src="https://blog.notmyidea.org/images/formbuilder/formbuilder-form.png"&gt;&lt;/p&gt;
&lt;h3 id="pas-de-compte"&gt;Pas de compte&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture de la page d'accueil, ou aucun compte n'est requis" src="https://blog.notmyidea.org/images/formbuilder/formbuilder-welcome.png"&gt;&lt;/p&gt;
&lt;h3 id="gardez-la-main-sur-vos-donnees"&gt;Gardez la main sur vos données&lt;/h3&gt;
&lt;p&gt;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 &lt;code&gt;.csv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture de la page de resultats, il est possible de télécharger en CSV." src="https://blog.notmyidea.org/images/formbuilder/formbuilder-results.png"&gt;&lt;/p&gt;
&lt;h3 id="api"&gt;API&lt;/h3&gt;
&lt;p&gt;L'ensemble des données sont en fait stockées dans &lt;a href="https://kinto.readthedocs.org"&gt;Kinto&lt;/a&gt;
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.&lt;/p&gt;
&lt;h3 id="auto-hebergeable"&gt;Auto-hébergeable&lt;/h3&gt;
&lt;p&gt;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
&lt;a href="https://www.fourmilieres.net"&gt;wwww.fourmilieres.net&lt;/a&gt;, 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 !&lt;/p&gt;
&lt;h2 id="on-commence-petit"&gt;On commence petit…&lt;/h2&gt;
&lt;p&gt;Cette &lt;em&gt;release&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;J'ai d'ailleurs créé &lt;a href="https://www.fourmilieres.net/#/form/cfd878264cec4ed2"&gt;un formulaire pour que vous puissiez me faire part de vos
retours&lt;/a&gt;, n'hésitez pas !&lt;/p&gt;
&lt;h2 id="et-euh-comment-ca-marche"&gt;Et, euh, comment ça marche ?&lt;/h2&gt;
&lt;p&gt;Le &lt;em&gt;formbuilder&lt;/em&gt;, comme j'aime l'appeler se compose en fin de compte de deux
parties distinctes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kinto.readthedocs.org"&gt;Kinto&lt;/a&gt;, un service qui stocke
des données coté serveur et qui les expose via des &lt;strong&gt;APIs HTTP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kinto/formbuilder"&gt;Le formbuilder&lt;/a&gt;, 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 &lt;em&gt;APIs&lt;/em&gt; coté
serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au niveau de la &lt;em&gt;stack&lt;/em&gt; technique, le &lt;strong&gt;formbuilder&lt;/strong&gt; est codé en ReactJS. Un
des points techniques intéressants du projet est qu'il génère en fin de compte du
&lt;a href="http://jsonschema.net/"&gt;JSON Schema&lt;/a&gt;, un format de validation de données &lt;em&gt;JSON&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;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".&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le JSON Schema est alors envoyé au serveur Kinto, qui l'utilisera pour valider
les données qu'il recevra par la suite.&lt;/li&gt;
&lt;li&gt;Ce JSON Schema sera aussi utilisé lors de l'affichage du formulaire aux
personnes qui le remplissent.&lt;/li&gt;
&lt;li&gt;Un jeton d'accès est généré et ajouté à l'URL, il s'agit de l'identifiant du
formulaire.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref, en espérant que ça vous serve ! Un petit pas dans la direction des données
rendues à leurs utilisateurs !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Cloisonnement des activités ?</title><link href="https://blog.notmyidea.org/cloisonnement-des-activites.html" rel="alternate"></link><published>2016-05-25T00:00:00+02:00</published><updated>2016-05-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-05-25:/cloisonnement-des-activites.html</id><summary type="html">&lt;p&gt;Je vous écris depuis un train, en rentrant de Bordeaux où j'ai passé quelques
jours à l'occasion de &lt;a href="http://sudweb.fr/"&gt;SudWeb&lt;/a&gt;. 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je vous écris depuis un train, en rentrant de Bordeaux où j'ai passé quelques
jours à l'occasion de &lt;a href="http://sudweb.fr/"&gt;SudWeb&lt;/a&gt;. 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.&lt;/p&gt;
&lt;h1 id="alors-brasserie-ou-code"&gt;Alors, brasserie ou code ?&lt;/h1&gt;
&lt;p&gt;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 &lt;em&gt;la, tout de suite,
maintenant&lt;/em&gt;, je reste un passionné par la chose.&lt;/p&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;p&gt;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é.&lt;/p&gt;
&lt;p&gt;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 !&lt;/p&gt;
&lt;p&gt;Jusqu'ici je me suis dit que je devais choisir. J'ai pensé naivement
que je ne pouvais pas être &lt;em&gt;et&lt;/em&gt; un brasseur &lt;em&gt;et&lt;/em&gt; un developpeur, mais la
réalité c'est que c'est exactement ce que je suis: les deux.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Bref, merci sudweb pour m'avoir accompagné dans ces reflexions, à l'année
prochaine, je ramène des futs ?&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Avez vous confiance en SSL?</title><link href="https://blog.notmyidea.org/avez-vous-confiance-en-ssl.html" rel="alternate"></link><published>2016-03-25T00:00:00+01:00</published><updated>2016-03-25T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-03-25:/avez-vous-confiance-en-ssl.html</id><summary type="html">&lt;p&gt;Dans le cadre &lt;a href="http://autodefense-numerique.readthedocs.org/en/latest/"&gt;des ateliers d'autodéfense numérique&lt;/a&gt;,
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
&lt;strong&gt;absolument&lt;/strong&gt; pas suffisant.&lt;/p&gt;
&lt;p&gt;Allez hop …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dans le cadre &lt;a href="http://autodefense-numerique.readthedocs.org/en/latest/"&gt;des ateliers d'autodéfense numérique&lt;/a&gt;,
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
&lt;strong&gt;absolument&lt;/strong&gt; pas suffisant.&lt;/p&gt;
&lt;p&gt;Allez hop, c'est parti pour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un tour d'horizon du fonctionnement de SSl&lt;/li&gt;
&lt;li&gt;quelques moyens contourner cette "protection" en faisant une attaque en pratique&lt;/li&gt;
&lt;li&gt;un tour des solutions existantes actuellement et de pourquoi je ne les trouve
pas vraiment satisfaisantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="comment-fonctionne-ssl"&gt;Comment fonctionne SSL?&lt;/h2&gt;
&lt;p&gt;Pour expliquer les problèmes de SSL, j'ai d'abord besoin d'expliquer comment
tout ça fonctionne.&lt;/p&gt;
&lt;p&gt;SSL repose sur l'utilisation de certificats, qui sont générés par des autorités
de certification (&lt;em&gt;Certificate Authority&lt;/em&gt; que je nomme &lt;em&gt;CA&lt;/em&gt; dans la suite de
l'article).&lt;/p&gt;
&lt;p&gt;Les certificats SSL permettent deux choses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;De garantir que le site sur lequel vous vous connectez est bien celui que
vous imaginez.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;em&gt;CA&lt;/em&gt; en qui il a confiance.&lt;/p&gt;
&lt;p&gt;Imaginons maintenant qu'une des &lt;em&gt;CA&lt;/em&gt; 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 ?&lt;/p&gt;
&lt;p&gt;N'importe quel &lt;em&gt;CA&lt;/em&gt; 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
&lt;em&gt;CA&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tout cela ne poserait pas de soucis si les &lt;em&gt;CA&lt;/em&gt; étaient gérés de manière fiable,
mais il s'agit d'un travail compliqué, et certains &lt;em&gt;CA&lt;/em&gt; ont par le passé montré
des faiblesses.&lt;/p&gt;
&lt;p&gt;Par exemple, &lt;a href="https://en.wikipedia.org/wiki/DigiNotar"&gt;DigiNotar&lt;/a&gt; (un &lt;em&gt;CA&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Vous pouvez retrouver une liste des risques et menaces autour des &lt;em&gt;CA&lt;/em&gt; &lt;a href="http://wiki.cacert.org/Risk/History"&gt;sur le
wiki de CACert&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="attaque-de-lhomme-du-milieu-avec-ssl"&gt;Attaque de l'homme du milieu avec SSL&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;En l'espace de quelques minutes, il est possible de faire une &lt;em&gt;attaque de
l'homme du milieu&lt;/em&gt; en utilisant par exemple un outil nommé &lt;a href="http://docs.mitmproxy.org/en/stable"&gt;mitm-proxy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour déchiffrer l'ensemble du trafic SSL, j'ai simplement eu à lancer quelques
commandes et avoir un &lt;em&gt;CA&lt;/em&gt; 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).&lt;/p&gt;
&lt;p&gt;Je les colle ici si ça vous intéresse:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sudo aptitude install mitmproxy
$ mitm-proxy -T --host
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il faut faire croire à votre victime que vous êtes la passerelle vers
l'extérieur et à la passerelle que vous êtes la victime:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;arpspoof -i wlan0 -t victime gateway
arpspoof -i wlan0 -t gateway victime
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis dire à notre fausse passerelle de rediriger le trafic des ports 80 et 443
vers notre proxy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo sysctl -w net.ipv4.ip_forward&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport &lt;span class="m"&gt;443&lt;/span&gt; -j REDIRECT --to-port &lt;span class="m"&gt;4443&lt;/span&gt;
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport &lt;span class="m"&gt;80&lt;/span&gt; -j REDIRECT --to-port &lt;span class="m"&gt;4443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et paf, &lt;strong&gt;on voit tout ce qui passe entre la machine et le serveur SSL&lt;/strong&gt;. On peut
d'ailleurs même imaginer faire tourner ces quelques commandes sur un
raspberry pi, pour aller encore plus vite…&lt;/p&gt;
&lt;h3 id="key-pinning-dans-les-navigateurs"&gt;Key-pinning dans les navigateurs&lt;/h3&gt;
&lt;p&gt;Actuellement, n'importe quel &lt;em&gt;CA&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Cette approche a le mérite de fonctionner très bien &lt;a href="https://dxr.mozilla.org/mozilla-central/source/security/manager/ssl/StaticHPKPins.h?from=StaticHPKPins.h"&gt;pour un petit nombre de
sites critiques (Google, Facebook, etc)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="http-public-key-pinning-hpkp"&gt;HTTP Public Key Pinning (HPKP)&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/en/docs/Web/Security/Public_Key_Pinning"&gt;&lt;em&gt;HTTP Public Key Pinning&lt;/em&gt;&lt;/a&gt;
est également une solution de &lt;em&gt;pinning&lt;/em&gt; qui permet d'établir une confiance lors
de la première connexion avec le site. C'est ce qu'on appelle du &lt;em&gt;Trust on First
Use&lt;/em&gt; ou &lt;em&gt;TOFU&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Le navigateur va alors mettre ces informations dans un cache et vérifiera que
les certificats correspondent bien lors des prochaines visites.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;HPKP&lt;/em&gt; est disponible dans Firefox depuis Janvier 2015 et dans Chrome
depuis Octobre 2015.&lt;/p&gt;
&lt;h3 id="certificate-transparency-des-journaux-auditables"&gt;Certificate transparency: des journaux auditables&lt;/h3&gt;
&lt;p&gt;Une autre approche est celle proposée par &lt;em&gt;certificate transparency&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="https://www.certificate-transparency.org/what-is-ct"&gt;Certificate Transparency&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Autrement dit, avec ce système les &lt;em&gt;CA&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Les navigateurs vont alors vérifier que les certificats utilisés sont bien des
certificats qui ont été ajoutés au journal.&lt;/p&gt;
&lt;p&gt;Ici, toute l'intelligence est dans la vérification de ces journaux, qui
permettent donc de valider/invalider des certificats racines ou intermédiaires.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Certificate-Transparency&lt;/em&gt; n'est donc pas une solution contre une écoute
globale mise en place par les gouvernements par exemple.&lt;/p&gt;
&lt;p&gt;Si vous lisez bien l'anglais, je vous invite à aller lire
&lt;a href="http://security.stackexchange.com/a/52838"&gt;cette description du problème et de la solution&lt;/a&gt;
que je trouve très bien écrite.&lt;/p&gt;
&lt;h3 id="dane-dnssec"&gt;DANE + DNSSEC&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="https://datatracker.ietf.org/wg/dane/charter/"&gt;Dane WG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une autre solution est appelée "DANE" et repose par dessus le protocole
&lt;em&gt;DNSSEC&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Je connais assez mal &lt;em&gt;DNSSEC&lt;/em&gt; 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.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et aussi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The need to design a backward-compatible standard that can scale to the
size of the Internet&lt;/li&gt;
&lt;li&gt;Prevention of "zone enumeration" (see below) where desired&lt;/li&gt;
&lt;li&gt;Deployment of DNSSEC implementations across a wide variety of DNS servers
and resolvers (clients)&lt;/li&gt;
&lt;li&gt;Disagreement among implementers over who should own the top-level domain
root keys Overcoming the perceived complexity of DNSSEC and DNSSEC
deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="solutions-basees-sur-la-blockchain"&gt;Solutions basées sur la blockchain&lt;/h2&gt;
&lt;p&gt;Une dernière piste semble être l'utilisation de la &lt;em&gt;blockchain&lt;/em&gt; pour distribuer
des clés par site.&lt;/p&gt;
&lt;p&gt;La solution &lt;em&gt;DNSChain&lt;/em&gt; me paraissait tout d'abord un bon point de départ mais
la lecture de &lt;a href="https://www.indolering.com/okturtles-dnschain-unblock-us"&gt;quelques critiques&lt;/a&gt;
et interventions du développeur du projet m'ont fait changer d'avis.&lt;/p&gt;
&lt;p&gt;Reste encore la piste de &lt;em&gt;Namecoin Control&lt;/em&gt; 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!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Focusing on what matters</title><link href="https://blog.notmyidea.org/focusing-on-what-matters.html" rel="alternate"></link><published>2016-03-17T00:00:00+01:00</published><updated>2016-03-17T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-03-17:/focusing-on-what-matters.html</id><summary type="html">&lt;p&gt;I do have a problem with information.&lt;/p&gt;
&lt;p&gt;You know. I &lt;strong&gt;have&lt;/strong&gt; to check my emails, irc, twitter, my feed reader
etc. I need to.&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I do have a problem with information.&lt;/p&gt;
&lt;p&gt;You know. I &lt;strong&gt;have&lt;/strong&gt; to check my emails, irc, twitter, my feed reader
etc. I need to.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;In practice, I'm really bad at multi-tasking. I tried a few times the
&lt;em&gt;Pomodoro&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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…&lt;/p&gt;
&lt;p&gt;Of course, that Web isn't filled only with lolcats and twitter messages
(even if I would &lt;strong&gt;love&lt;/strong&gt; 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 &lt;strong&gt;need&lt;/strong&gt; to do, and unplug. Alexis, unplug!&lt;/p&gt;
&lt;p&gt;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!)&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check emails only once a day&lt;/strong&gt;. Do &lt;strong&gt;not&lt;/strong&gt; 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)&lt;/li&gt;
&lt;li&gt;Stay away from the Internet during the morning. I'll not connect if
I don't need to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's see how it goes :)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Retours sur un atelier ZeroNet</title><link href="https://blog.notmyidea.org/retours-sur-un-atelier-zeronet.html" rel="alternate"></link><published>2016-03-17T00:00:00+01:00</published><updated>2016-03-17T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-03-17:/retours-sur-un-atelier-zeronet.html</id><summary type="html">&lt;p&gt;Mardi dernier se tenait &lt;a href="http://biblio.insa-rennes.fr/crypto"&gt;une &lt;em&gt;cryptoparty&lt;/em&gt;&lt;/a&gt; dans les locaux de l'INSA de Rennes.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://zeronet.io"&gt;ZeroNet&lt;/a&gt;, un
petit projet fort sympathique qui pourrait devenir une nouvelle manière de
distribuer le …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mardi dernier se tenait &lt;a href="http://biblio.insa-rennes.fr/crypto"&gt;une &lt;em&gt;cryptoparty&lt;/em&gt;&lt;/a&gt; dans les locaux de l'INSA de Rennes.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://zeronet.io"&gt;ZeroNet&lt;/a&gt;, un
petit projet fort sympathique qui pourrait devenir une nouvelle manière de
distribuer le Web, permettant notamment d'éviter la censure.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="un-peu-dhistoire"&gt;Un peu d'histoire&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;data centers&lt;/em&gt; etc afin
de supporter les milliers d'utilisateurs des sites.&lt;/p&gt;
&lt;h2 id="un-web-decentralise"&gt;Un Web décentralisé&lt;/h2&gt;
&lt;p&gt;ZeroNet permet (entre autres) de répondre à ce problème en proposant une manière alternative de &lt;strong&gt;distribuer le Web&lt;/strong&gt;, en pair à pair. Lors d'une visite d'un site:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vous contactez un &lt;em&gt;tracker&lt;/em&gt; BitTorrent pour connaitre la liste des autres
visiteurs du site (les &lt;em&gt;pairs&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Vous demandez aux &lt;em&gt;pairs&lt;/em&gt; de vous donner les fichiers du site.&lt;/li&gt;
&lt;li&gt;Vous validez que les fichiers servis sont bien les bons (en vérifiant la
signature attachée).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;N'importe quel visiteur devient alors un &lt;em&gt;pair&lt;/em&gt;, qui sert le site aux autres
visiteurs.&lt;/p&gt;
&lt;p&gt;Parmi les nombreux avantages de cette approche, je note particulièrement que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est très difficile de censurer un site — Il est sur l'ensemble des machines
des visiteurs.&lt;/li&gt;
&lt;li&gt;Les attaques par &lt;em&gt;fingerprinting&lt;/em&gt; sont impossibles: le navigateur Web se
connecte à un serveur &lt;em&gt;proxy&lt;/em&gt; local.&lt;/li&gt;
&lt;li&gt;Vous détenez directement vos données et (par design) ne les donnez pas à des
silos (Facebook, Google, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;video controls="" src="http://alexis.notmyidea.org/zeronet.webm" width=800&gt;&lt;/video&gt;
&lt;h2 id="atelier"&gt;Atelier&lt;/h2&gt;
&lt;p&gt;Pour l'atelier, j'ai choisi de faire une présentation rapide du projet (&lt;a href="https://blog.notmyidea.org/docs/zeronet-presentation-fr.pdf"&gt;j'ai
traduit les slides&lt;/a&gt; anglais
pour l'occasion — &lt;a href="https://docs.google.com/presentation/d/158C_-V1ueNaaKHMBMBgGOVhunb9xrXzB3hC_g1N53c0/edit?usp=sharing"&gt;accès aux sources&lt;/a&gt;)
avant d'installer ZeroNet sur les machines et de l'utiliser pour publier un
site.&lt;/p&gt;
&lt;h3 id="partager-sur-le-reseau-local"&gt;Partager sur le réseau local&lt;/h3&gt;
&lt;p&gt;Nous avons eu des soucis à cause du réseau (un peu congestionné) sur lequel
les ports utilisés pour la discussion entre &lt;em&gt;pairs&lt;/em&gt; é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.&lt;/p&gt;
&lt;p&gt;Voici donc comment faire pour contourner le souci:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installer et lancer un &lt;em&gt;tracker&lt;/em&gt; BitTorrent (De manière surprenante,
&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=685575"&gt;rien n'est packagé pour debian pour l'instant&lt;/a&gt;)
J'ai choisi d'installer &lt;a href="http://erdgeist.org/arts/software/opentracker/#build-instructions"&gt;OpenTracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ensuite lancer ZeroNet avec des options spécifiques.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ python zeronet.py --trackers udp://localhost:6969 --ip_external &lt;span class="m"&gt;192&lt;/span&gt;.168.43.207
$ python zeronet.py --trackers udp://192.168.43.207:6969 --ip_external &lt;span class="m"&gt;192&lt;/span&gt;.168.43.172
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;La prochaine fois je tenterais de venir avec un HotSpot Wifi et un tracker
BitTorrent dans la poche!&lt;/p&gt;
&lt;h2 id="questions-reponses"&gt;Questions / Réponses&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h3 id="torrent-tor-breche-de-secu"&gt;Torrent + Tor = brèche de sécu ?&lt;/h3&gt;
&lt;p&gt;Il me semblait avoir entendu parler de problèmes de &lt;em&gt;dé-anonymisation&lt;/em&gt;
&lt;a href="https://hal.inria.fr/file/index/docid/471556/filename/TorBT.pdf"&gt;lors de l'utilisation de BitTorrent par dessus Tor&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/HelloZeroNet/ZeroNet/issues/274"&gt;Ce n'est pas le cas de ZeroNet&lt;/a&gt;, ce qui évacue le souci.&lt;/p&gt;
&lt;h3 id="zeromail-cest-lent-non"&gt;ZeroMail, c'est lent non ?&lt;/h3&gt;
&lt;p&gt;Une des applications de démo, &lt;em&gt;ZeroMail&lt;/em&gt;, 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 &lt;em&gt;pot commun&lt;/em&gt;. Tout le monde essaye de déchiffrer tous les messages, mais ne
peut déchiffrer que les siens.&lt;/p&gt;
&lt;p&gt;Cela permet de ne &lt;strong&gt;pas&lt;/strong&gt; fuiter de méta-données, &lt;a href="https://blog.notmyidea.org/les-problemes-de-pgp.html"&gt;à l'inverse de PGP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Une autre solution à laquelle je pensait était de créer un &lt;em&gt;ZeroSite&lt;/em&gt; pour
chaque récipient, mais on connait à ce moment là le nombre de messages qu'un
utilisateur peut recevoir.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h3 id="comment-heberger-des-tres-gros-sites"&gt;Comment héberger des très gros sites ?&lt;/h3&gt;
&lt;p&gt;Par exemple, comment faire pour héberger Wikipedia ?&lt;/p&gt;
&lt;p&gt;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)&lt;/p&gt;
&lt;h3 id="est-ce-quon-a-vraiment-besoin-dun-tracker"&gt;Est-ce qu'on à vraiment besoin d'un tracker ?&lt;/h3&gt;
&lt;p&gt;Le support d'une DHT &lt;a href="https://github.com/HelloZeroNet/ZeroNet/issues/57"&gt;est souhaité&lt;/a&gt;,
mais pour l'instant pas encore implémenté. L'utilisation de la DHT BitTorrent
n'est pas une option puisque &lt;a href="https://github.com/HelloZeroNet/ZeroNet/issues/57"&gt;Tor ne supporte pas UDP&lt;/a&gt;.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>L'horizon</title><link href="https://blog.notmyidea.org/lhorizon.html" rel="alternate"></link><published>2016-03-02T00:00:00+01:00</published><updated>2016-03-02T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-03-02:/lhorizon.html</id><summary type="html">&lt;p&gt;headline : Temps de changer d'horizon. Mon départ de Mozilla et le début d'une nouvelle histoire.
image : images/horizon.jpg&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il y a presque 4 ans et demi, je commençais …&lt;/p&gt;</summary><content type="html">&lt;p&gt;headline : Temps de changer d'horizon. Mon départ de Mozilla et le début d'une nouvelle histoire.
image : images/horizon.jpg&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Quatre ans plus tard, je me retrouve à coder sur Daybed, mon petit
projet perso, devenu &lt;a href="http://kinto.readthedocs.org/"&gt;Kinto&lt;/a&gt; avec une
équipe de personnes plus talentueuses et sympathiques les unes que les
autres (Niko, Rémy, Mat, si vous me lisez…).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;De 14 personnes dans les bureaux Parisiens, nous sommes passés à une
40aine (et de \~500 salariés à 1100 dans le monde).&lt;/p&gt;
&lt;p&gt;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 !)&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Lesquels ? Cela reste à construire (mais je vous le dis, y'a du Kinto
dedans !)&lt;/p&gt;
&lt;h2 id="la-suite"&gt;La suite ?&lt;/h2&gt;
&lt;p&gt;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 !)&lt;/p&gt;
&lt;p&gt;Évidemment, plein d'envies diverses et variées, envie de me balader un
peu et d'expérimenter des choses collectivement...&lt;/p&gt;
&lt;p&gt;On se recroisera surement :)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Service de nuages : Garantir l'intégrité des données via des signatures</title><link href="https://blog.notmyidea.org/service-de-nuages-garantir-lintegrite-des-donnees-via-des-signatures-fr.html" rel="alternate"></link><published>2016-03-01T00:00:00+01:00</published><updated>2016-03-01T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-03-01:/service-de-nuages-garantir-lintegrite-des-donnees-via-des-signatures-fr.html</id><summary type="html">&lt;p class="first last"&gt;Comment garantir l'intégrité des données en utilisant les signatures.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dans le cadre du projet &lt;a class="reference external" href="https://wiki.mozilla.org/Firefox/Go_Faster"&gt;Go Faster&lt;/a&gt;, nous souhaitons distribuer des
mises à jour de parties de &lt;em&gt;Firefox&lt;/em&gt; de manière séparée des mises à jour majeures
(qui ont lieu toutes les 6 semaines).&lt;/p&gt;
&lt;p&gt;Les données que nous souhaitons mettre à jour sur les clients sont multiples.
Entre autres, nous souhaitons gérer &lt;a class="reference external" href="https://blog.mozilla.org/security/2015/03/03/revoking-intermediate-certificates-introducing-onecrl/"&gt;la mise à jour des listes de révocation
(CRL) de certificats SSL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il est évidemment nécessaire de s'assurer que les données qui sont téléchargées
sur les client sont légitimes : que personne ne tente d'invalider des
certificats alors qu'ils sont valides, et que l'ensemble des mises à jour sont
bel et bien récupérées sur le client.&lt;/p&gt;
&lt;p&gt;La signature garantit qu'une mise à jour contient tous les enregistrements, mais il
est toujours possible de bloquer l'accès au service (par exemple avec le &lt;em&gt;china
great firewall&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Ce mécanisme fonctionne pour les listes de certificats à révoquer, mais pas
uniquement. Nous comptons réutiliser ce même fonctionnement dans le futur pour
la mise à jour d'autres parties de Firefox, et vous pouvez également en tirer
parti pour d'autres cas d'utilisation.&lt;/p&gt;
&lt;p&gt;Nous souhaitons utiliser &lt;a class="reference external" href="https://kinto.readthedocs.org"&gt;Kinto&lt;/a&gt; afin
de distribuer ces jeux de données. Un des avantages est que l'on peut
facilement &lt;em&gt;cacher&lt;/em&gt; les collections derrière un CDN.&lt;/p&gt;
&lt;p&gt;Par contre, nous ne souhaitons pas que les clients fassent
confiance aveuglément, ni au serveur Kinto, ni au CDN.&lt;/p&gt;
&lt;p&gt;Effectivement, un attaquant, contrôlant l'un ou l'autre, pourrait
alors envoyer les mises à jour qu'il souhaite à l'ensemble des clients
ou supprimer des certificats révoqués. Imaginez le carnage !&lt;/p&gt;
&lt;p&gt;Afin de résoudre ce problème, considérons les conditions suivantes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;La personne qui a le pouvoir de mettre à jour les CRL (&lt;em&gt;l'updater&lt;/em&gt;)
a accès à une cle de signature (ou mieux, &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Hardware_Security_Module"&gt;un HSM&lt;/a&gt;) qui lui permet de
signer la collection;&lt;/li&gt;
&lt;li&gt;Le pendant public de ce certificat est stocké et distribué dans Firefox;&lt;/li&gt;
&lt;li&gt;Le &lt;em&gt;hashing&lt;/em&gt; et la &lt;em&gt;signature&lt;/em&gt; sont faits côté client pour éviter certains
vecteurs d'attaque (si un attaquant a la main sur le serveur Kinto par
exemple).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le chiffrement à sens unique, aussi appellé &lt;em&gt;hashing&lt;/em&gt; est un moyen de toujours
obtenir le même résultat à partir de la même entrée.&lt;/p&gt;
&lt;div class="section" id="premier-envoi-de-donnees-sur-kinto"&gt;
&lt;h2&gt;Premier envoi de données sur Kinto&lt;/h2&gt;
&lt;p&gt;L'ensemble des données est récupéré depuis une source &lt;em&gt;sécurisée&lt;/em&gt; puis mis dans
une collection JSON. Chaque élément contient un identifiant unique généré sur
le client.&lt;/p&gt;
&lt;p&gt;Par exemple, un enregistrement peut ressembler à :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b7dded96-8df0-8af8-449a-8bc47f71b4c4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;fingerprint&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;11:D5:D2:0A:9A:F8:D9:FC:23:6E:5C:5C:30:EC:AF:68:F5:68:FB:A3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le &lt;em&gt;hash&lt;/em&gt; de la collection est ensuite calculé, signé puis envoyé au serveur
(voir plus bas pour les détails).&lt;/p&gt;
&lt;p&gt;La signature est déportée sur un service qui ne s'occupe que de ça, puisque la
sécurité du certificat qui s'occupe des signatures est extrêmement importante.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="comment-verifier-l-integrite-des-donnees"&gt;
&lt;h2&gt;Comment vérifier l'intégrité des données ?&lt;/h2&gt;
&lt;p&gt;Premièrement, il faut récupérer l'ensemble des enregistrements présents sur
le serveur, ainsi que le &lt;em&gt;hash&lt;/em&gt; et la signature associée.&lt;/p&gt;
&lt;p&gt;Ensuite, vérifier la signature du &lt;em&gt;hash&lt;/em&gt;, pour s'assurer que celui-ci provient
bien d'un tiers de confiance.&lt;/p&gt;
&lt;p&gt;Finalement, recalculer le &lt;em&gt;hash&lt;/em&gt; localement et valider qu'il correspond bien à
celui qui a été signé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ajouter-de-nouvelles-donnees"&gt;
&lt;h2&gt;Ajouter de nouvelles données&lt;/h2&gt;
&lt;p&gt;Pour l'ajout de nouvelles données, il est nécessaire de s'assurer que les
données que l'on a localement sont valides avant de faire quoi que ce soit
d'autre.&lt;/p&gt;
&lt;p&gt;Une fois ces données validées, il suffit de procéder comme la première fois, et
d'envoyer à nouveau le &lt;em&gt;hash&lt;/em&gt; de la collection au serveur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="comment-calculer-ce-hash"&gt;
&lt;h2&gt;Comment calculer ce hash ?&lt;/h2&gt;
&lt;p&gt;Pour calculer le &lt;em&gt;hash&lt;/em&gt; de la collection, il est nécessaire :&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;D'ordonner l'ensemble des éléments de la collection (par leur id) ;&lt;/li&gt;
&lt;li&gt;Pour chaque élément, sérialiser les champs qui nous intéressent (les
concaténer clé + valeur)&lt;/li&gt;
&lt;li&gt;Calculer le &lt;em&gt;hash&lt;/em&gt; depuis la sérialisation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nous sommes encore incertains de la manière dont le hash va être calculé. Les &lt;a class="reference external" href="https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41"&gt;JSON Web Signature&lt;/a&gt; semblent
une piste intéressante. En attendant, une implementation naïve en python
pourrait ressembler à ceci :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b7dded96-8df0-8af8-449a-8bc47f71b4c4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;fingerprint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;11:D5:D2:0A:9A:F8:D9:FC:23:6E:5C:5C:30:EC:AF:68:F5:68:FB:A3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dded96b7-8f0d-8f8a-49a4-7f771b4c4bc4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;fingerprint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;33:6E:5C:5C:30:EC:AF:68:F5:68:FB:A3:11:D5:D2:0A:9A:F8:D9:FC&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;collection_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Let's Encrypt + HAProxy</title><link href="https://blog.notmyidea.org/lets-encrypt-haproxy.html" rel="alternate"></link><published>2016-02-11T00:00:00+01:00</published><updated>2016-02-11T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-02-11:/lets-encrypt-haproxy.html</id><summary type="html">&lt;p&gt;&lt;em&gt;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 &lt;code&gt;certbot --nginx&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Its time for the Web to take a big step forward in terms of security
and privacy …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;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 &lt;code&gt;certbot --nginx&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Its time for the Web to take a big step forward in terms of security
and privacy. We want to see HTTPS become the default. Lets Encrypt
was built to enable that by making it as easy as possible to get and
manage certificates.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Depuis début Décembre, la nouvelle &lt;em&gt;autorité de certification&lt;/em&gt; Let's
Encrypt est passée en version &lt;em&gt;Beta&lt;/em&gt;. 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 &lt;a href="https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu"&gt;attaques de l'homme
du milieu&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Message de firefox lorsque une connexion n'est pas
sécurisée." src="%7Bfilename%7D/static/unsecure-connection.png"&gt;&lt;/p&gt;
&lt;p&gt;Maintenant, grâce à Let's Encrypt il est possible d'avoir des
certificats SSL &lt;strong&gt;gratuits&lt;/strong&gt;, ce qui représente un grand pas en avant
pour la sécurité de nos communications.&lt;/p&gt;
&lt;p&gt;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
&lt;a href="http://www.haproxy.org/"&gt;HAProxy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je me suis basé pour cet article sur
d'&lt;a href="https://blog.infomee.fr/p/letsencrypt-haproxy"&gt;autres&lt;/a&gt;
&lt;a href="http://blog.victor-hery.com/article22/utiliser-let-s-encrypt-avec-haproxy"&gt;articles&lt;/a&gt;,
dont je vous recommande la lecture pour un complément d'information.&lt;/p&gt;
&lt;h2 id="validation-des-domaines-par-lets-encrypt"&gt;Validation des domaines par Let's Encrypt&lt;/h2&gt;
&lt;p&gt;Je vous passe les détails d'installation du client de Let's Encrypt, qui
sont &lt;a href="https://github.com/letsencrypt/letsencrypt#installation"&gt;très bien expliqués sur leur
documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois installé, vous allez taper une commande qui va ressembler à:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;letsencrypt-auto certonly --renew-by-default&lt;/span&gt;
&lt;span class="err"&gt;--webroot -w /home/www/letsencrypt-requests/ \&lt;/span&gt;
&lt;span class="err"&gt;-d hurl.kinto-storage.org \&lt;/span&gt;
&lt;span class="err"&gt;-d forums.kinto-storage.org&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le &lt;em&gt;webroot&lt;/em&gt; est l'endroit ou les preuves de détention du domaine vont
être déposées.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;http://domaine.org/.well-known/acme-challenge&lt;/code&gt;, ou il
voudra trouver des informations qu'il aura généré via la commande
&lt;code&gt;letsencrypt-auto&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J'ai choisi de faire une règle dans haproxy pour diriger toutes les
requêtes avec le chemin &lt;code&gt;.well-known/acme-challenge&lt;/code&gt; vers un &lt;em&gt;backend&lt;/em&gt;
nginx qui sert des fichiers statiques (ceux contenus dans
&lt;code&gt;/home/www/letsencrypt-requests/&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Voici la section de la configuration de HAProxy (et &lt;a href="https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L63-L72"&gt;la configuration
complete&lt;/a&gt;
si ça peut être utile):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;frontend&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="k"&gt;mode&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;
&lt;span class="n"&gt;default_backend&lt;/span&gt; &lt;span class="n"&gt;nginx_server&lt;/span&gt;
&lt;span class="n"&gt;acl&lt;/span&gt; &lt;span class="n"&gt;letsencrypt_check&lt;/span&gt; &lt;span class="n"&gt;path_beg&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;acme&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;
&lt;span class="n"&gt;use_backend&lt;/span&gt; &lt;span class="n"&gt;letsencrypt_backend&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;letsencrypt_check&lt;/span&gt;
&lt;span class="n"&gt;redirect&lt;/span&gt; &lt;span class="n"&gt;scheme&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ssl_fc&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;letsencrypt_check&lt;/span&gt;
&lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="n"&gt;letsencrypt_backend&lt;/span&gt;
&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="k"&gt;Host&lt;/span&gt; &lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="k"&gt;dispatch&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et celle de NGINX:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;server {&lt;/span&gt;
&lt;span class="err"&gt; listen 8000;&lt;/span&gt;
&lt;span class="err"&gt; server_name letsencrypt.requests;&lt;/span&gt;
&lt;span class="err"&gt; root /home/www/letsencrypt-requests;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="installation-des-certificats-dans-haproxy"&gt;Installation des certificats dans HAProxy&lt;/h2&gt;
&lt;p&gt;Vos certificats SSL devraient être générés dans &lt;code&gt;/etc/letsencrypt/live&lt;/code&gt;,
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:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/letsencrypt/live/domaine.org/privkey.pem /etc/letsencrypt/live/domaine.org/fullchain.pem &amp;gt; /etc/ssl/letsencrypt/domaine.org.pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et ensuite dans la configuration de haproxy, pour le (nouveau)
&lt;em&gt;frontend&lt;/em&gt; https:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;bind 0.0.0.0:443 ssl no-sslv3 crt /etc/ssl/letsencrypt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Faites bien attention à avoir un &lt;em&gt;frontend&lt;/em&gt; https pour tous vos sites en
HTTPS. &lt;a href="https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L38-L60"&gt;Pour moi cela ressemble à
ça&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois tout ceci fait, redémarrez votre service haproxy et zou !&lt;/p&gt;
&lt;h2 id="automatisation"&gt;Automatisation&lt;/h2&gt;
&lt;p&gt;Pour automatiser un peu tout ça, j'ai choisi de faire ça comme suit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un fichier domaine dans &lt;code&gt;letsencrypt/domains/domain.org&lt;/code&gt; qui
contient le script &lt;code&gt;letsencrypt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Un fichier d'installation de certificats dans
&lt;code&gt;letsencrypt/install-certs.sh&lt;/code&gt; qui s'occupe d'installer les
certificats déjà générés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voila ! &lt;a href="https://github.com/almet/infra/"&gt;Le tout est dans un dépot
github&lt;/a&gt;, si jamais ça peut vous servir,
tant mieux !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Ateliers d'autodéfense numérique</title><link href="https://blog.notmyidea.org/ateliers-dautodefense-numerique.html" rel="alternate"></link><published>2016-01-14T00:00:00+01:00</published><updated>2016-01-14T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2016-01-14:/ateliers-dautodefense-numerique.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je compte donc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organiser des ateliers de sensibilisation aux outils de …&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je compte donc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organiser des ateliers de sensibilisation aux outils de
communication, envers mes proches;&lt;/li&gt;
&lt;li&gt;Utiliser la communication chiffrée le plus souvent possible, au
moins pour rendre le déchiffrement des messages plus longue,
"noyer le poisson".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- &lt;a href="http://blog.notmyidea.org/chiffrement.html"&gt;Chiffrement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;L'objectif pour ce premier atelier était de:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Échanger autour des besoins et &lt;strong&gt;faire ressortir des histoires&lt;/strong&gt; ou
le manque d'outillage / connaissances à posé problème, dans des
situations concrètes;&lt;/li&gt;
&lt;li&gt;Se rendre compte des "conduites à risque", &lt;strong&gt;faire peur&lt;/strong&gt; aux
personnes formées pour qu'elles se rendent compte de l'état actuel
des choses;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proposer des solutions concrètes&lt;/strong&gt; aux problèmes soulevés, ainsi
que le minimum de connaissance théorique pour les appréhender.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="1-faire-ressortir-les-problemes"&gt;1. Faire ressortir les problèmes&lt;/h2&gt;
&lt;p&gt;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":&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;lanimateur invite les participants à se regrouper par trois, avec des
personnes quon 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.&lt;/p&gt;
&lt;p&gt;-- «&lt;a href="http://www.scoplepave.org/pour-s-ecouter"&gt;Pour s'écouter&lt;/a&gt;», SCOP
Le Pavé.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;De ces &lt;em&gt;GIMs&lt;/em&gt; nous avons pu ressortir quelques histoires, gravitant
autour de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La protection des sources (d'information)&lt;/strong&gt;: Comment faire pour
aider quelqu'un à faire "fuiter" des données depuis l'intérieur
d'une entreprise ?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le chiffrement de ses données&lt;/strong&gt;: Comment éviter de faire "fuiter"
des données importantes lors d'une perquisition de matériel ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-faire-peur"&gt;2. Faire peur&lt;/h2&gt;
&lt;p&gt;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.
&lt;a href="http://blog.barbayellow.com/"&gt;Grégoire&lt;/a&gt; m'avait conseillé quelques
petites accroches qui ont ma foi bien marché:&lt;/p&gt;
&lt;p&gt;J'ai demandé aux présent.e.s de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;donner leur mot de passe à voix haute devant les autres: a priori
personne ne le fera;&lt;/li&gt;
&lt;li&gt;venir se connecter à leur compte email depuis mon ordinateur. J'ai
piégé une personne, qui est venu pour taper son mot de passe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="3-proposer-des-solutions-concretes"&gt;3. Proposer des solutions concrêtes&lt;/h2&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On a expliqué ce qu'était &lt;a href="https://tails.boum.org"&gt;Tails&lt;/a&gt;, et
comment l'utiliser et le dupliquer.&lt;/li&gt;
&lt;li&gt;On a pu faire un tour des outils existants sur Tails, notamment
autour de l'&lt;em&gt;anonymisation&lt;/em&gt; de fichiers et la suppression effective
de contenus.&lt;/li&gt;
&lt;li&gt;Certaines personnes ont pu créer une clé tails avec la persistance
de configurée.&lt;/li&gt;
&lt;li&gt;Nous nous sommes connectés au réseau
&lt;a href="https://www.torproject.org"&gt;Tor&lt;/a&gt; et testé que nos adresses IP
changeaient bien à la demande.&lt;/li&gt;
&lt;li&gt;Nous avons utilisé &lt;a href="https://crypto.cat"&gt;CryptoCat&lt;/a&gt; par dessus Tor,
afin de voir comment avoir une conversation confidentielle dans
laquelle il est possible d'échanger des fichiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="retours"&gt;Retours&lt;/h2&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="la-suite"&gt;La suite&lt;/h2&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;J'ai choisi volontairement de ne pas aborder le chiffrement des messages
via PGP parce que &lt;a href="%7Bfilename%7D2015.05.pgp-problemes.rst"&gt;je pense que la protection que ce média propose n'est
pas suffisante&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;Un compte twitter à été créé recemment autour des crypto-party à Rennes,
si vous êtes interessés, &lt;a href="https://twitter.com/CryptoPartyRNS"&gt;allez jeter un coup
d'œil&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ils sont pour l'instant disponibles &lt;a href="http://autodefense-numerique.readthedocs.org/en/latest/"&gt;sur Read The
Docs&lt;/a&gt;. Tous les
retours sont évidemment les bienvenus !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Le mail doit-il mourir ?</title><link href="https://blog.notmyidea.org/le-mail-doit-il-mourir.html" rel="alternate"></link><published>2015-11-24T00:00:00+01:00</published><updated>2015-11-24T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-11-24:/le-mail-doit-il-mourir.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Et même si j'arrive à convaincre certains de mes proches à …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ce problème est lié directement au protocole email: il est &lt;em&gt;necessaire&lt;/em&gt; de faire fuiter ces meta-données (au moins le destinataire) pour avoir un protocole
mail fonctionnel.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les méta-données seraient chiffrées — Il n'est pas possible de savoir qui
communique avec qui, et quand;&lt;/li&gt;
&lt;li&gt;Le chiffrement serait fort (et protégé d'une phrase de passe ?);&lt;/li&gt;
&lt;li&gt;La fuite d'une clé de chiffrement utilisée dans un échange ne permette pas de
déchiffrer l'ensemble des échanges (forward secrecy);&lt;/li&gt;
&lt;li&gt;Il ne soit pas possible de réutiliser les données comme preuve pour
incriminer l'emmeteur du message (deniability);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec au moins ces besoins en tête, il semble qu'une revue de l'ensemble des projets existants pointe du doigt vers &lt;a href="https://github.com/agl/pond"&gt;pond&lt;/a&gt;, ou vers &lt;a href="https://www.whispersystems.org"&gt;Signal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Malheureusement, Pond est le projet d'une seule personne, qui veut plutôt utiliser ce code comme démonstration du concept en question.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Rencontres python francophones, 2015</title><link href="https://blog.notmyidea.org/rencontres-python-francophones-2015.html" rel="alternate"></link><published>2015-11-02T00:00:00+01:00</published><updated>2015-11-02T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-11-02:/rencontres-python-francophones-2015.html</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;C'était un excellent cru: l'organisation …&lt;/p&gt;</summary><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="http://alexis.notmyidea.org/kinto-pycon/"&gt;les slides de la présentation que j'ai faite&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Parmis les conférences qui m'ont marquées, je vous conseille &lt;a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-hospital-des-tests-en-prod.html"&gt;celle de Benoit
Bryon, sur Hospital&lt;/a&gt;, qui parle de
heartbeat, ou de comment tester vos projets en prod, et celle &lt;a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-geoalchemy.html"&gt;sur Geo Alchemy,
par Éric Lemoine&lt;/a&gt;. Et bien sur, &lt;a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-cliquet.html"&gt;celle
de Mathieu Leplatre sur Cliquet&lt;/a&gt;, le
toolkit qui rassemble les bonnes pratiques que nous souhaitons mettre en avant
chez Mozilla services, mais là, je suis tout sauf impartial !&lt;/p&gt;
&lt;p&gt;Sinon, il peut être interessant de jeter un coup d'oeil au &lt;a class="reference external" href="https://blog.notmyidea.org/pyconfr-2015-table-ronde-diversite.html"&gt;compte rendu de la
table ronde sur la diversité&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;L'ensemble des notes que j'ai pu prendre sont disponibles dans la section &lt;a class="reference external" href="http://blog.notmyidea.org/category/pyconfr2015.html"&gt;PyconFR 2015&lt;/a&gt;.&lt;/p&gt;
</content><category term="conferences"></category></entry><entry><title>PyconFR 2015 — Assemblée générale</title><link href="https://blog.notmyidea.org/pyconfr-2015-assemblee-generale.html" rel="alternate"></link><published>2015-10-18T00:00:00+02:00</published><updated>2015-10-18T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-assemblee-generale.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Mot de feth sur Nelle, qui était une présidente très présente. Merci !&lt;/p&gt;
&lt;div class="section" id="passe"&gt;
&lt;h2&gt;Passé&lt;/h2&gt;
&lt;p&gt;Il existe des communautés locales à Lyon Grenoble, Nantes.
Des Afpyro ont été organisés dans toutes ces villes + Rennes …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Mot de feth sur Nelle, qui était une présidente très présente. Merci !&lt;/p&gt;
&lt;div class="section" id="passe"&gt;
&lt;h2&gt;Passé&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;FOSDEM 2015 était complet. Il y avait une salle python tojours pleine.
Dsicussions sur la diversité.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="futur"&gt;
&lt;h2&gt;Futur&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class="section" id="status"&gt;
&lt;h3&gt;Status&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Il faut faire évoluer les status: ils ne sont pas actuellement bien faits par
rapport à notre utilisation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — Hospital - des tests en prod</title><link href="https://blog.notmyidea.org/pyconfr-2015-hospital-des-tests-en-prod.html" rel="alternate"></link><published>2015-10-18T00:00:00+02:00</published><updated>2015-10-18T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-hospital-des-tests-en-prod.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Benoit Bryon, Peopledoc.&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Benoit Bryon, Peopledoc.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Lors d'un déploiement, comment faire pour vérifier que tout tourne lorsque tout
est déployé ?&lt;/p&gt;
&lt;div class="section" id="comment-faire"&gt;
&lt;h2&gt;Comment faire ?&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Les tests permettent de tester hors sol.&lt;/li&gt;
&lt;li&gt;Le provisionning permet de valider que tout tourne correctement, mais&lt;/li&gt;
&lt;li&gt;simplement au démarrage. Les pannes ne sont pas détectées.&lt;/li&gt;
&lt;li&gt;Le logging va permettre de detecter les erreurs, mais trop tard.&lt;/li&gt;
&lt;li&gt;Le monitoring permet d'avoir une vue de l'exterieur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hostpital propose de faire des assertions sur la configuration,
l'environnement, &lt;em&gt;en cours de fonctionnement&lt;/em&gt;. Ce sont les developeurs qui
ajoutent ces assertions.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hospital"&gt;
&lt;h2&gt;Hospital&lt;/h2&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;::&lt;/dt&gt;
&lt;dd&gt;pip install hospital&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;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:
&lt;cite&gt;assert_http_response&lt;/cite&gt; ou &lt;cite&gt;assert_ping&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Pour la supervision, les healthchecks sont lancés avec une ligne de commande
&lt;cite&gt;hospital-cli&lt;/cite&gt;. Il est possible de lancer également ces tests avec nose ou
py.test.&lt;/p&gt;
&lt;p&gt;Il est aussi possible de faire le monitoring avec une API HTTP &lt;cite&gt;hospital
serve&lt;/cite&gt;.&lt;/p&gt;
&lt;div class="section" id="les-lacunes-de-hospital"&gt;
&lt;h3&gt;Les lacunes de hospital&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="wrap-up"&gt;
&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;Validez votre configuration, la connectivité avec les services externes. Faites
des tests souvent !&lt;/p&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — We don't need your loop</title><link href="https://blog.notmyidea.org/pyconfr-2015-we-dont-need-your-loop.html" rel="alternate"></link><published>2015-10-18T00:00:00+02:00</published><updated>2015-10-18T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-18:/pyconfr-2015-we-dont-need-your-loop.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: serge_sans_paille.&lt;/p&gt;
&lt;p&gt;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 …&lt;/p&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: serge_sans_paille.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;En python, par exemple, il vaut mieux utiliser &lt;cite&gt;sum&lt;/cite&gt; plutôt que de faire
l'addition nous même (pour faire une addition des elements d'une liste).&lt;/p&gt;
&lt;p&gt;Actuellement, le compilateur python est lent si on utilise numpy.sum sur des
matrices complexes.&lt;/p&gt;
&lt;div class="section" id="comment-aller-plus-vite"&gt;
&lt;h2&gt;Comment aller plus vite?&lt;/h2&gt;
&lt;p&gt;Cython est assez compliqué, il faut savoir ce que l'on fait pour optimiser et
écrire du bon code Cython.&lt;/p&gt;
&lt;p&gt;Avec pythran, l'intelligence est dans le compilateur, qui permet d'écrire
notemment des boucles correctement.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Par contre, cela veut dire que plus de connaissances sont necessaire pour lire
le code python.&lt;/p&gt;
&lt;p&gt;pythran permet de compiler directement vers du C++ sans avoir à changer son
code de base (python). C'est utile pour du code numpy notemment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="questions"&gt;
&lt;h2&gt;Questions&lt;/h2&gt;
&lt;p&gt;Possible de paralelliser de manière explicite &lt;strong&gt;ou&lt;/strong&gt; implicite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C'est très utile pour les gens qui font du &amp;quot;number crunching&amp;quot;. Est-ce que
c'est utile pour d'autres domaines d'application (Web)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pas vraiment. CPython est déjà bien fait pour ces cas d'utilisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Est-il possible de lancer pythran sans faire de commentaires ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Est-ce que vous songez à un compilateur à la volée ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — Cliquet</title><link href="https://blog.notmyidea.org/pyconfr-2015-cliquet.html" rel="alternate"></link><published>2015-10-17T00:00:00+02:00</published><updated>2015-10-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-cliquet.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Mathieu Leplatre (&amp;#64;leplatrem), Mozilla&lt;/p&gt;
&lt;p&gt;Toolkit HTTP, pour éventuellement faire des microservices.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Origines&lt;/li&gt;
&lt;li&gt;Protocole&lt;/li&gt;
&lt;li&gt;Toolkit&lt;/li&gt;
&lt;li&gt;Conversation&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="origines"&gt;
&lt;h2&gt;Origines&lt;/h2&gt;
&lt;p&gt;Stockage de données, Cloud Services, Mozilla.
Le boulot, c'est de faire des APIs. On nous …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Mathieu Leplatre (&amp;#64;leplatrem), Mozilla&lt;/p&gt;
&lt;p&gt;Toolkit HTTP, pour éventuellement faire des microservices.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Origines&lt;/li&gt;
&lt;li&gt;Protocole&lt;/li&gt;
&lt;li&gt;Toolkit&lt;/li&gt;
&lt;li&gt;Conversation&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="origines"&gt;
&lt;h2&gt;Origines&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;La réutilisation de certaines protocoles existants était possible (Sync, en
production depuis quelques années).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="protocole"&gt;
&lt;h2&gt;Protocole&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;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éé.&lt;/li&gt;
&lt;li&gt;Les ops ont besoin de quelques endpoints: un heartbeat (monitoring) des
endpoints de batch, un endpoint &amp;quot;hello&amp;quot;, pour connaitre le type de service,
ses URLs etc.&lt;/li&gt;
&lt;li&gt;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 &amp;quot;backoff&amp;quot; qui permet de demander aux clients d'arreter de faire des
requetes durant une durée spécifée par le serveur.&lt;/li&gt;
&lt;li&gt;Pour les resources &amp;quot;REST&amp;quot;, 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.&lt;/li&gt;
&lt;li&gt;Comment la validation fonctionne ? La pagination ? La définition des
permissions ? Les erreurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="toolkit"&gt;
&lt;h2&gt;Toolkit&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Cliquet propose de faire l'ensemble du boilerplate, la lecture du protocole, et
vous permet de créer les backends souhaités.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;le toolkit vise à faire quelque chose de pluggable. Tout est controllable
depuis la configuration.&lt;/p&gt;
&lt;p&gt;Pour le deploiement, cela veut dire que le monitoring est déjà connecté, et il
est possible de changer la configuration depuis un fichier &lt;cite&gt;.ini&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="microservices"&gt;
&lt;h2&gt;Microservices ?&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Cliquet apporte une manière standard de surveiller, deployer, configurer des
services.&lt;/li&gt;
&lt;li&gt;Il est possible de se focaliser sur la logique de l'application, en faisait
une abstraction des backends, etc.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="cliquet-est-utilise-pour"&gt;
&lt;h2&gt;Cliquet est utilisé pour&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Kinto, un service générique de stpclage de données.&lt;/li&gt;
&lt;li&gt;Syncto, un proxy pour Sync en utilisant le protocole.&lt;/li&gt;
&lt;li&gt;La liste de lecture, service qui à été shutdown.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="questions"&gt;
&lt;h2&gt;Questions&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Qu'est-ce qui est pluggable ?&lt;/strong&gt; Les choix qui sont fait dans cliquet
concernent le protocole. Le toolkit est lui fait de manière &amp;quot;pluggable&amp;quot;. Il
est par exemple possible de changer le backend, l'authentification, le cache
ou les permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quelles sont les parties non standard? Est-il prévu de representer ça via
une RFC ?&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Existe-il un client JavaScript, comme pour Kinto ?&lt;/strong&gt; Actuellement, non. Par
contre, Kinto.js est prévu pour que la partie commune entre les APIs (le
protocole) peut etre extrait.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — Geoalchemy</title><link href="https://blog.notmyidea.org/pyconfr-2015-geoalchemy.html" rel="alternate"></link><published>2015-10-17T00:00:00+02:00</published><updated>2015-10-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-geoalchemy.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Eric Lemoine, Camp to camp. (&amp;#64;elemoine)&lt;/p&gt;
&lt;p&gt;Bibliothèque python basée sur SQL alchemy, pour interagir avec des bases de
données geographiques / spatiales.&lt;/p&gt;
&lt;p&gt;Une base de donnée optimisée pour representer et rechercher des …&lt;/p&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: Eric Lemoine, Camp to camp. (&amp;#64;elemoine)&lt;/p&gt;
&lt;p&gt;Bibliothèque python basée sur SQL alchemy, pour interagir avec des bases de
données geographiques / spatiales.&lt;/p&gt;
&lt;p&gt;Une base de donnée optimisée pour representer et rechercher des données qui
representent des objets dans un espace géométrique.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Il est possible d estocker des ligne,s de polygones, des points. Il y a une
colonne géometrie pour stocker ces données.&lt;/li&gt;
&lt;li&gt;Il y a aussi des fonctions qui permettent de travailler sur ces données
(transfomrations, projections, etc).&lt;/li&gt;
&lt;li&gt;Indexs géographiques qui permettent de faire des recherches de manière
performante.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="postgis"&gt;
&lt;h2&gt;POSTGIS&lt;/h2&gt;
&lt;p&gt;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
&amp;quot;boites englobantes&amp;quot;.&lt;/p&gt;
&lt;p&gt;Pour créer une base de données postgis, il faut faire un &amp;quot;create extension
postgis&amp;quot;, ce qui installe tout ce dont on a besoin.&lt;/p&gt;
&lt;p&gt;il est possible d'apeller &lt;cite&gt;GEOMETRY(POINT)&lt;/cite&gt; par exemple.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;ST_GeomFromText('POINT(lat long)')&lt;/cite&gt; permet de convertir un point dans un objet
geometrie interne à postgres.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;ST_DWithin&lt;/cite&gt; permet de trouver les personnes qui sont autour d'un rayon donné.&lt;/p&gt;
&lt;p&gt;L'ensemble des fonctions proposées par postgres commencent par &lt;cite&gt;ST_*&lt;/cite&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sqlalchemy"&gt;
&lt;h2&gt;SQLAlchemy&lt;/h2&gt;
&lt;p&gt;Il s'agit d'une bote à outil qui permet de faire des requetes de manière
simple. Il y a une philosophie forte.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Il ne sohaite pas cacher la base de données&lt;/li&gt;
&lt;li&gt;C'est un language pour faire du SQL en python&lt;/li&gt;
&lt;li&gt;Rien n'est caché.&lt;/li&gt;
&lt;li&gt;Fourni un vocabulaire riche pour générer le SQL&lt;/li&gt;
&lt;li&gt;L'objectif est de changer la manière dont on pense à SQL, redonner le gout du
SQL aux developeurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deux parties:
- ORM
- CORE&lt;/p&gt;
&lt;p&gt;Il est possible d'utiliser simplement le core si l'on sohaite (sans utiliser
l'ORM)&lt;/p&gt;
&lt;div class="section" id="core"&gt;
&lt;h3&gt;Core&lt;/h3&gt;
&lt;p&gt;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
&lt;cite&gt;select().where()&lt;/cite&gt; etc.&lt;/p&gt;
&lt;p&gt;Le &amp;quot;core&amp;quot; ne fait pas de mapping du tout, il manipule des Tables SQLA
directement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="orm"&gt;
&lt;h3&gt;ORM&lt;/h3&gt;
&lt;p&gt;L'ORM fait, lui, du mapping. C'est cette couche que l'on va utiliser dans une
application Web complexe par exemple.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;il est possible de travailler avec une session &lt;cite&gt;Session()&lt;/cite&gt; puis on effectue
des opérations et on &lt;cite&gt;commit()&lt;/cite&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="geoalchemy"&gt;
&lt;h4&gt;GeoAlchemy&lt;/h4&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Créé en 2009, pour supporter uniquement postgis.&lt;/li&gt;
&lt;li&gt;Depuis, d'autres bases de données (MySQL, Spatialite, MySQL server) etc.&lt;/li&gt;
&lt;li&gt;Réécriture depuis grace à la nouvelle API de SQLAlechemy, mais perte du
support d'autres backends.&lt;/li&gt;
&lt;li&gt;Finalement, retour sur POSTGIS uniquement, pour évite d'avoir à supporter les
différences de tous les backends.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="features"&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Très simple de s'intégrer avec les features de POSTGIS, par exemple en
déclarant une colonne en tant que &amp;quot;Géometrie&amp;quot;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;S'intègre bien avec des services existants (shapely, pyramid, etc).&lt;/p&gt;
&lt;p&gt;Utilisation de geojsondumps pour representer des features en geojson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="status"&gt;
&lt;h2&gt;Status&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;3 ou 4 developeurs actifs sur le projet, ça fonctionne plutôt bien. Pour&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first"&gt;contribuer, il est possible de faire cela sur github.&lt;/p&gt;
&lt;p class="last"&gt;Slides de la presentation sur &lt;a class="reference external" href="http://erliem.net/talks/pyconfr2015"&gt;http://erliem.net/talks/pyconfr2015&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Resources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/Shapely"&gt;https://pypi.python.org/pypi/Shapely&lt;/a&gt; - Manipulation and analysis of geometric
objects in the Cartesian plane.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Question:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Dans les exemples geoalchemy, les données geométriques sont passées sous
forme de chaine. Est-ce normal ? Oui.&lt;/li&gt;
&lt;li&gt;Les rasters sont également supportés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — SQL Alchemy</title><link href="https://blog.notmyidea.org/pyconfr-2015-sql-alchemy.html" rel="alternate"></link><published>2015-10-17T00:00:00+02:00</published><updated>2015-10-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-sql-alchemy.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: David Allouche&lt;/p&gt;
&lt;p&gt;SQL Alchemy vous permet de produire le SQL que vous voulez. Il faut que vous
souhaitiez comprendre ce que va etre produit.&lt;/p&gt;
&lt;p&gt;Déclaratif:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;On créé des classes qui representent …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Speaker: David Allouche&lt;/p&gt;
&lt;p&gt;SQL Alchemy vous permet de produire le SQL que vous voulez. Il faut que vous
souhaitiez comprendre ce que va etre produit.&lt;/p&gt;
&lt;p&gt;Déclaratif:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;On créé des classes qui representent nos tables, et les liaisons entre les
tables, en utilisant &lt;cite&gt;relationship&lt;/cite&gt; (qui à énormement d'attributs).&lt;/li&gt;
&lt;li&gt;On définit quelles osnt les clés étrangères entre les tables.&lt;/li&gt;
&lt;li&gt;Puis on va définir les attributs qui sont liés entre les tables
(relationship).&lt;/li&gt;
&lt;li&gt;Pour définir des relations entre les Tables, il est possible d'utiliser des
chaines de caractère &lt;cite&gt;relationship('OtherTable')&lt;/cite&gt;.&lt;/li&gt;
&lt;li&gt;La session es tun concept important.&lt;/li&gt;
&lt;li&gt;Lire efficacement. Attention à ne pas faire énormement de requetes avec
L'ORM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Performance SQL&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Générer le SQL (python)&lt;/li&gt;
&lt;li&gt;Ne pas faire énormement de petites requetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Pour la générer avec SQLAlchemy, il est possible de faire un
&lt;cite&gt;.query(Table).join(Table).join(Table2).filter_by(field=value)&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;En pratique, le mieux est de lister clairemnet le nom des tables&lt;/p&gt;
&lt;p&gt;2ème partie:&lt;/p&gt;
&lt;p&gt;Pour de l'import de données,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;first() fait une requete SQL. A éviter dans les boucles&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;cite&gt;back_populates&lt;/cite&gt; et non pas &lt;cite&gt;backref&lt;/cite&gt;.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;subqueryload&lt;/cite&gt; permet de générer une requete séparée plutôt qu'une jointure.&lt;/li&gt;
&lt;/ul&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>PyconFR 2015 — Table ronde diversité</title><link href="https://blog.notmyidea.org/pyconfr-2015-table-ronde-diversite.html" rel="alternate"></link><published>2015-10-17T00:00:00+02:00</published><updated>2015-10-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-17:/pyconfr-2015-table-ronde-diversite.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Prise de notes: Gordon et Alexis&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;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 …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Voici quelques notes prises durant la PyconFR 2015, à Pau. N'hésitez pas
à les completer si besoin.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Prise de notes: Gordon et Alexis&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;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).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JP — Pourquoi&lt;/strong&gt;: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)&lt;/p&gt;
&lt;p&gt;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:
&lt;a class="reference external" href="http://www.commitstrip.com/fr/2015/09/17/meanwhile-in-a-parallel-universe-2/"&gt;http://www.commitstrip.com/fr/2015/09/17/meanwhile-in-a-parallel-universe-2/&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="tour-de-presentation"&gt;
&lt;h2&gt;Tour de présentation:&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;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).&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 ???.&lt;/li&gt;
&lt;li&gt;Alexia Sumois. organisatrice de django girls bdx. Nouvelle dans le milieu du
code. Les conférences d'aujourd'hui on donné envie d'apprendre.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Jean Phillipe Campguillhem, secrétaire de l'AFPY&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="pourquoi-django-girls"&gt;
&lt;h2&gt;Pourquoi Django Girls ?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Alexia&lt;/strong&gt; — 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurenne&lt;/strong&gt; — Cest pour ça quon se pose la question « comment attirer ces
publics, ces personnes-là ? », importance de limage quon renvoie. Ce nest
pas tant une question de genre, mais dinitié·e·s : on a souvent peur dentrer
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.
&lt;a class="reference external" href="http://djangogirls.com/bordeaux"&gt;http://djangogirls.com/bordeaux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurence&lt;/strong&gt; — 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 »&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurenceu&lt;/strong&gt; — 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 didées pour faire venir plus de candidates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Viviane&lt;/strong&gt; — En tant que femme, on reçoit en permanence le message que ce
métier nest pas fait pour nous. Ces messages ont un impact, le résultat est
que les filles ne vont pas dans les écoles dinformatiques. Il faut aller
convaincre les jeunes filles que cest 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. Cest en ayant une diversité quon parviendra à changer limage 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amandine&lt;/strong&gt; — Cest pourquoi ce genre dévènements non-mixtes permet de faire
des séances de rattrapage pour permettre dintégrer la communauté dans son
ensemble. Cest le point clé pour faire accepter ce genre dinitiatives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurenne&lt;/strong&gt; — 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 lenfance, bien avant lécole. cf les jeux genrés. Il faut
travailler à ce niveau-là.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anna&lt;/strong&gt; — 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vivianne&lt;/strong&gt; — 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 nest 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 quelles ne subiront pas de micro-agressions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurence&lt;/strong&gt; — 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JP&lt;/strong&gt; — 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 liceberg. 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 à
lorigine du CoC. Remerciement envers les intervenantes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Florent (vice secrétaire de l'AFPY)&lt;/strong&gt; — Comme le dit JP, un code of conduct
est affiché devant toutes les portes et à l'entrée. Tout le monde naimait pas
forcément lidée den avoir, on a fini par trancher. Le but est davoir des
endroits safes. Avant davoir un CoC, on ne peut pas dire quon soit safes,
envers l'ensemble des minorités. On a écrit le CoC en conséquence des
agressions. Aujourdhui, pas de tolérance pour des comportements qui nont pas
lieu dêtre (quon a définis comme tels). Ça fonctionne sur la dénonciation
lorsque lon est témoin de ça. On na pas vraiment de mal à rencontrer des
femmes, mais plus de mal à faire comprendre quelles sont bienvenues. Impact
important de blagues sexistes, quon défend comme « cest 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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="questions"&gt;
&lt;h2&gt;Questions.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Questiond de Gawel&lt;/strong&gt;: Question pour Amandine. Est-ce que tu te sens bien à l'AFPY ? Si non, que faire pour que tu te sente mieux ?&lt;/p&gt;
&lt;p&gt;Amandine — Oui je me sens bien, est-ce quil y a eu des évènements ? oui, sans
doute mais jy suis aguerrie, donc je me rends peu compte. Quest-ce quon peut
faire ? Lidée du CoC est daller à lencontre des comportements négatifs, mais
lidée derrière est une ouverture à la différence dans son ensemble, promouvoir
louverture à lautre et à la différence. Lenjeu culturel est darriver à
changer détat desprit et didentifier ces biais cognitifs. Il faudrait pas
quon 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt; : « cest pas fait pour moi », mais plutôt « je suis mauvais, donc
je dois travailler », on en revient à limportance de léducation. Il faut
continuer de pointer du doigt les problèmes. Je suis aussi membre dun 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 lasso est très
masculin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Question de Bruno&lt;/strong&gt;. Pour lécole: quand jétais étudiant, 20% de filles.
(Aujourdhui on est partis de 7/8% pour arriver à 15%). Est-ce que les filles
réussissent plus ?&lt;/p&gt;
&lt;p&gt;Laurence — on na pas de stats, mais elles posent moins de problèmes. Les
filles sont favorisées par les employeurs.&lt;/p&gt;
&lt;p&gt;Vivianne — la motivation des filles à la sortie est identique aux garçons, mais
tout nest 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&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Question de Benoit&lt;/strong&gt;: 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 quon
peut aller organiser des évènements dans des écoles/lycées, des endroits où les
gens se sentent déjà à laise, où les populations sont plus représentées ?&lt;/p&gt;
&lt;p&gt;Vivianne — ça se fait. En tant quenseignante, dès que jai une occasion, que
ce soit pour aller chercher des JF ou des étudiants maths/infos, même si cest
ouvert à tous, je le fais. Si cest que des hommes, les femmes nont pas envie
dy aller.&lt;/p&gt;
&lt;p&gt;Laurenne — cest quelque chose qui se fait beaucoup. On met en avant des femmes
chercheuses dès quon le peut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Question d'Alexis&lt;/strong&gt; : je suis très content quil y ait cette discussion qui
se fasse. Question par rapport aux discriminations positives, quon 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, dessayer. Mais ça a un côté dérangeant.&lt;/p&gt;
&lt;p&gt;Vivianne — à la PyCon (US), jai é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, ya du
travail à faire. En tant quhommes, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 !&lt;/p&gt;
&lt;/div&gt;
</content><category term="pyconfr2015"></category></entry><entry><title>Web distribution signing</title><link href="https://blog.notmyidea.org/web-distribution-signing.html" rel="alternate"></link><published>2015-10-12T00:00:00+02:00</published><updated>2015-10-12T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-10-12:/web-distribution-signing.html</id><summary type="html">&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One &lt;a href="http://www.tonyarcieri.com/whats-wrong-with-webcrypto"&gt;often pointed&lt;/a&gt; flaw in
web-based cryptographic applications is the fact that there is no way to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;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.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One &lt;a href="http://www.tonyarcieri.com/whats-wrong-with-webcrypto"&gt;often pointed&lt;/a&gt; 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).&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;h2 id="the-problem-attack-vectors"&gt;The problem (Attack vectors)&lt;/h2&gt;
&lt;p&gt;Let's try to describe a few potential attacks:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Application Authors&lt;/em&gt; just released a new version of their open source
web crypto messaging application. An &lt;em&gt;Indie Hoster&lt;/em&gt; installs it on their
servers so a wide audience can actually use it.&lt;/p&gt;
&lt;p&gt;Someone alters the files on &lt;em&gt;Indie Hoster&lt;/em&gt; servers, effectively
replacing them with other &lt;em&gt;altered files&lt;/em&gt; with less security properties
/ a backdoor. This someone could either be an &lt;em&gt;Evil Attacker&lt;/em&gt; which
found its way trough, the &lt;em&gt;Indie Hoster&lt;/em&gt; or a CDN which delivers the
files,&lt;/p&gt;
&lt;p&gt;Trusted &lt;em&gt;Certificate Authorities&lt;/em&gt; ("governments" or "hacking team") can
also trick the User Agents (i.e. Firefox) into thinking they're talking
to &lt;em&gt;Indie Hoster&lt;/em&gt; even though they're actually talking to a different
server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Altered files&lt;/strong&gt; are then being served to the User Agents, and &lt;em&gt;Evil
Attacker&lt;/em&gt; now has a way to actually attack the end users.&lt;/p&gt;
&lt;h2 id="problem-mitigation"&gt;Problem Mitigation&lt;/h2&gt;
&lt;p&gt;Part of the problem is solved by the recently introduced &lt;a href="https://w3c.github.io/webappsec/specs/subresourceintegrity/"&gt;Sub Resource
Integrity&lt;/a&gt;
(SRI). To quote them: "[it] defines a mechanism by which user agents
may verify that a fetched resource has been delivered without unexpected
manipulation.".&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;In other words, we miss a way to create trust between &lt;em&gt;Application
Authors&lt;/em&gt; and &lt;em&gt;User Agents&lt;/em&gt;. The User-Agent currently has to trust the
&lt;em&gt;Certificate Authorities&lt;/em&gt; and the delivery (&lt;em&gt;Indie Hoster&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;For desktop software distribution: &lt;em&gt;Crypto Experts&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;For web applications, we don't have such a mechanism, but it should be
possible. Consider the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;App Authors&lt;/em&gt; publish a new version of their software; They provide
a hash of each of their distributed files (including the HTML
files);&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Crypto Experts&lt;/em&gt; audit these files and sign the hashes somehow;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;User Agents&lt;/em&gt; can chose to trust some specific &lt;em&gt;Crypto Experts&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;When a &lt;em&gt;User Agent&lt;/em&gt; downloads files, it checks if they're signed by
a trusted party.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="chosing-who-you-trust"&gt;Chosing who you trust&lt;/h2&gt;
&lt;p&gt;In terms of user experience, handling certificates is hard, and that's
where the community matters. Distributions such as
&lt;a href="https://tails.boom.org"&gt;Tails&lt;/a&gt; could chose who they trust to verify the
files, and issue warnings / refuse to run the application in case files
aren't verified.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[...] 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.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="http://cacr.uwaterloo.ca/techreports/2015/cacr2015-02.pdf"&gt;SoK : Secure
Messaging&lt;/a&gt;;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It seems that some other systems could allow for something more
reliable:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="http://cacr.uwaterloo.ca/techreports/2015/cacr2015-02.pdf"&gt;SoK : Secure
Messaging&lt;/a&gt;;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="/pages/about.html"&gt;get in
touch&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id="addendum"&gt;Addendum&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;A bit like User-Agents do for SSL, but for the actual signature of the
files being viewed.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Service de nuages : Pourquoi avons-nous fait Cliquet ?</title><link href="https://blog.notmyidea.org/pourquoi-cliquet" rel="alternate"></link><published>2015-07-14T00:00:00+02:00</published><updated>2015-07-14T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-07-14:/pourquoi-cliquet</id><summary type="html">&lt;p class="first last"&gt;Basé sur Pyramid, Cliquet est un projet qui permet de se concentrer sur l'essentiel
lors de la conception d'APIs.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;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.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="section" id="les-origines"&gt;
&lt;h2&gt;Les origines&lt;/h2&gt;
&lt;p&gt;L'objectif pour le premier trimestre 2015 était de construire un service de
stockage et de &lt;a class="reference external" href="https://blog.notmyidea.org/service-de-nuages-fr.html"&gt;synchronisation de listes de lecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;De même, nous voulions tirer parti du protocole de &lt;em&gt;Firefox Sync&lt;/em&gt;, robuste et éprouvé,
pour la synchronisation des données «offline».&lt;/p&gt;
&lt;p&gt;Plutôt qu'écrire un &lt;a class="reference external" href="http://blog.octo.com/en/design-a-rest-api/"&gt;énième&lt;/a&gt;
&lt;a class="reference external" href="http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api"&gt;article&lt;/a&gt; de blog,
nous avons préféré les rassembler dans ce qu'on a appellé «un protocole».&lt;/p&gt;
&lt;p&gt;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».&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cliquet&lt;/em&gt; est né.&lt;/p&gt;
&lt;img alt="Cliquet logo" class="align-center" src="https://blog.notmyidea.org/images/cliquet/cliquet-logo.png" /&gt;
&lt;div class="section" id="les-intentions"&gt;
&lt;h3&gt;Les intentions&lt;/h3&gt;
&lt;blockquote class="epigraph"&gt;
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 ?&lt;/blockquote&gt;
&lt;p&gt;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 &lt;strong&gt;protocole HTTP&lt;/strong&gt; 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.&lt;/p&gt;
&lt;blockquote class="epigraph"&gt;
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 ?&lt;/blockquote&gt;
&lt;p&gt;Comme &lt;em&gt;Cliquet&lt;/em&gt; fournit tout ce qui est nécessaire pour être conforme avec les
exigences de la &lt;strong&gt;mise en production&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;blockquote class="epigraph"&gt;
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 ?&lt;/blockquote&gt;
&lt;p&gt;En terme d'implémentation, nous avons choisi de &lt;strong&gt;fournir des abstractions&lt;/strong&gt;.
En effet, nous avions deux services dont le coeur consistait
à exposer un &lt;em&gt;CRUD&lt;/em&gt; en &lt;em&gt;REST&lt;/em&gt;, persistant des données JSON dans un backend.
Comme &lt;em&gt;Pyramid&lt;/em&gt; et &lt;em&gt;Cornice&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Dans le but de tout rendre optionnel et «pluggable», &lt;strong&gt;tout est configurable&lt;/strong&gt;
depuis le fichier &lt;tt class="docutils literal"&gt;.ini&lt;/tt&gt; 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.&lt;/p&gt;
&lt;img alt="Une réunion à Paris..." class="align-center" src="https://blog.notmyidea.org/images/cliquet/cliquet-notes-whiteboard.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="le-protocole"&gt;
&lt;h2&gt;Le protocole&lt;/h2&gt;
&lt;blockquote class="epigraph"&gt;
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 ?&lt;/blockquote&gt;
&lt;p&gt;Quand nous développons un (micro)service Web, nous dépensons généralement beaucoup
trop d'énergie à (re)faire des choix (arbitraires).&lt;/p&gt;
&lt;p&gt;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...&lt;/p&gt;
&lt;p&gt;Les choix principaux du protocole concernent surtout :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Les resources REST&lt;/strong&gt; : Les deux URLs d'une resource (pour la collection
et les enregistrements) acceptent des verbes et des headers précis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les formats&lt;/strong&gt; : le format et la structure JSON des réponses est imposé, ainsi
que la pagination des listes ou la syntaxe pour filtrer/trier les resources via la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Query_string"&gt;querystring&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les timestamps&lt;/strong&gt; : un numéro de révision qui s'incrémente à chaque opération
d'écriture sur une collection d'enregistrements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La synchronisation&lt;/strong&gt; : 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les permissions&lt;/strong&gt; : les droits d'un utilisateur sur une collection ou un enregistrement
(&lt;em&gt;encore frais et sur le point d'être documenté&lt;/em&gt;) &lt;a class="footnote-reference" href="#id3" id="id1"&gt;[1]&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opérations par lot&lt;/strong&gt;: une URL qui permet d'envoyer une série de requêtes
décrites en JSON et d'obtenir les réponses respectives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans la dimension opérationnelle du protocole, on trouve :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;La gestion de version&lt;/strong&gt; : cohabitation de plusieurs versions en production,
avec alertes dans les entêtes pour la fin de vie des anciennes versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le report des requêtes&lt;/strong&gt; : entêtes interprétées par les clients, activées en cas de
maintenance ou de surchage, pour ménager le serveur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le canal d'erreurs&lt;/strong&gt; : toutes les erreurs renvoyées par le serveur ont le même
format JSON et ont un numéro précis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les utilitaires&lt;/strong&gt; : URLs diverses pour répondre aux besoins exprimés par
l'équipe d'administrateurs (monitoring, metadonnées, paramètres publiques).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce protocole est une compilation des bonnes pratiques pour les APIs HTTP (&lt;em&gt;c'est notre métier !&lt;/em&gt;),
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 &lt;em&gt;Firefox Sync&lt;/em&gt; pour la gestion de la concurrence et de l'«offline-first».&lt;/p&gt;
&lt;p&gt;Il est &lt;a class="reference external" href="http://cliquet.readthedocs.org/en/latest/api/index.html"&gt;documenté en détail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.). &lt;a class="footnote-reference" href="#id4" id="id2"&gt;[2]&lt;/a&gt;&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id3" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Voir notre &lt;a class="reference external" href="https://blog.notmyidea.org/service-de-nuages-la-gestion-des-permissions-fr.html"&gt;article dédié sur les permissions&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id4" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Rappel: nous sommes une toute petite équipe !&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="le-toolkit"&gt;
&lt;h2&gt;Le toolkit&lt;/h2&gt;
&lt;div class="section" id="choix-techniques"&gt;
&lt;h3&gt;Choix techniques&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Cliquet&lt;/em&gt; implémente le protocole en Python (&lt;em&gt;2.7, 3.4+, pypy&lt;/em&gt;), avec &lt;a class="reference external" href="http://trypyramid.com/"&gt;Pyramid&lt;/a&gt; &lt;a class="footnote-reference" href="#id6" id="id5"&gt;[3]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pyramid&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cornice&lt;/strong&gt; est une extension de &lt;em&gt;Pyramid&lt;/em&gt;, écrite en partie par Alexis et Tarek,
qui permet d'éviter d'écrire tout le code &lt;em&gt;boilerplate&lt;/em&gt; quand on construit une
API REST avec Pyramid.&lt;/p&gt;
&lt;p&gt;Avec &lt;em&gt;Cornice&lt;/em&gt;, 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...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cliquet&lt;/strong&gt; utilise les deux précédents pour implémenter le protocole et fournir
des abstractions, mais on a toujours &lt;em&gt;Pyramid&lt;/em&gt; et &lt;em&gt;Cornice&lt;/em&gt; sous la main pour
aller au delà de ce qui est proposé !&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id6" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id5"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Au tout début nous avons commencé une implémentation avec &lt;em&gt;Python-Eve&lt;/em&gt;
(Flask), mais n'étions pas satisfaits de l'approche pour la configuration
de l'API. En particulier du côté magique.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="concepts"&gt;
&lt;h3&gt;Concepts&lt;/h3&gt;
&lt;p&gt;Bien évidemment, les concepts du toolkit reflètent ceux du protocole mais il y
a des éléments supplémentaires:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;Les backends&lt;/strong&gt; : abstractions pour le stockage, le cache et les permissions
(&lt;em&gt;ex. PostgreSQL, Redis, en-mémoire, ...&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La supervision&lt;/strong&gt; : logging JSON et indicateurs temps-réel (&lt;em&gt;StatsD&lt;/em&gt;) pour suivre les
performances et la santé du service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La configuration&lt;/strong&gt; : chargement de la configuration depuis les variables
d'environnement et le fichier &lt;tt class="docutils literal"&gt;.ini&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La flexibilité&lt;/strong&gt; : dés/activation ou substitution de la majorité des composants
depuis la configuration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le profiling&lt;/strong&gt; : utilitaires de développement pour trouver les &lt;a class="reference external" href="https://fr.wiktionary.org/wiki/goulet_d%E2%80%99%C3%A9tranglement"&gt;goulets
d'étranglement&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt="Cliquet concepts" class="align-center" src="https://blog.notmyidea.org/images/cliquet/cliquet-concepts.png" /&gt;
&lt;p&gt;Proportionnellement, l'implémentation du protocole pour les resources REST est
la plus volumineuse dans le code source de &lt;em&gt;Cliquet&lt;/em&gt;.
Cependant, comme nous l'avons décrit plus haut, &lt;em&gt;Cliquet&lt;/em&gt; 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 !&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Par exemple, la persistence fournie par défault est &lt;em&gt;schemaless&lt;/em&gt; (e.g &lt;em&gt;JSONB&lt;/em&gt;),
mais rien n'empêcherait d'implémenter le stockage dans un modèle relationnel.&lt;/p&gt;
&lt;p&gt;Comme les composants peuvent être remplacés depuis la configuration, il est
tout à fait possible d'étendre &lt;em&gt;Cliquet&lt;/em&gt; avec des notions métiers ou des
technologies exotiques ! Nous avons posé quelques idées dans &lt;a class="reference external" href="http://cliquet.readthedocs.org/en/latest/ecosystem.html"&gt;la documentation
de l'éco-système&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans les prochaines semaines, nous allons introduire la notion d'«évènements» (ou signaux),
qui permettraient aux extensions de s'interfacer beaucoup plus proprement.&lt;/p&gt;
&lt;p&gt;Nous attachons beaucoup d'importance à la clareté du code, la pertinence des
&lt;em&gt;patterns&lt;/em&gt;, des tests et de la documentation. Si vous avez des commentaires,
des critiques ou des interrogations, n'hésitez pas à &lt;a class="reference external" href="https://github.com/mozilla-services/cliquet/issues"&gt;nous en faire part&lt;/a&gt; !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cliquet-a-l-action"&gt;
&lt;h2&gt;Cliquet, à l'action.&lt;/h2&gt;
&lt;p&gt;Nous avons écrit un &lt;a class="reference external" href="http://cliquet.readthedocs.org/en/latest/quickstart.html"&gt;guide de démarrage&lt;/a&gt;,
qui n'exige pas de connaître &lt;em&gt;Pyramid&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour illustrer la simplicité et les concepts, voici quelques extraits !&lt;/p&gt;
&lt;div class="section" id="etape-1"&gt;
&lt;h3&gt;Étape 1&lt;/h3&gt;
&lt;p&gt;Activer &lt;em&gt;Cliquet&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="hll"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cliquet&lt;/span&gt;
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pyramid.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Configurator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;global_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Configurator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="hll"&gt; &lt;span class="n"&gt;cliquet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_wsgi_app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;À partir de là, la plupart des outils de &lt;em&gt;Cliquet&lt;/em&gt; sont activés et accessibles.&lt;/p&gt;
&lt;p&gt;Par exemple, les URLs &lt;em&gt;hello&lt;/em&gt; (&lt;tt class="docutils literal"&gt;/v1/&lt;/tt&gt;) ou &lt;em&gt;supervision&lt;/em&gt; (&lt;tt class="docutils literal"&gt;/v1/__heartbeat__&lt;/tt&gt;).
Mais aussi les backends de stockage, de cache, etc.
qu'il est possible d'utiliser dans des vues classiques &lt;em&gt;Pyramid&lt;/em&gt; ou &lt;em&gt;Cornice&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="etape-2"&gt;
&lt;h3&gt;Étape 2&lt;/h3&gt;
&lt;p&gt;Ajouter des vues:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;global_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Configurator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cliquet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="hll"&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myproject.views&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_wsgi_app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour définir des resources CRUD, il faut commencer par définir un schéma,
avec &lt;em&gt;Colander&lt;/em&gt;, et ensuite déclarer une resource:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cliquet&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BookmarkSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResourceSchema&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="hll"&gt;&lt;span class="nd"&gt;@resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bookmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseResource&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BookmarkSchema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Désormais, la resource CRUD est disponible sur &lt;tt class="docutils literal"&gt;/v1/bookmarks&lt;/tt&gt;, avec toutes
les fonctionnalités de synchronisation, filtrage, tri, pagination, timestamp, etc.
De base les enregistrements sont privés, par utilisateur.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="err"&gt;http&lt;/span&gt; &lt;span class="err"&gt;GET&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://localhost:8000/v1/bookmarks&amp;quot;&lt;/span&gt;
&lt;span class="err"&gt;HTTP/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="err"&gt;OK&lt;/span&gt;
&lt;span class="err"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://cliquet.readthedocs.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cc103eb5-0c80-40ec-b6f5-dad12e7d975e&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;&amp;quot;last_modified&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1437034418940&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="etape-3"&gt;
&lt;h3&gt;Étape 3&lt;/h3&gt;
&lt;p&gt;Évidemment, il est possible choisir les URLS, les verbes HTTP supportés, de modifier
des champs avant l'enregistrement, etc.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="hll"&gt;&lt;span class="nd"&gt;@resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collection_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/user/bookmarks&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;record_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/user/bookmarks/{{id}}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;collection_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bookmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseResource&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BookmarkSchema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="hll"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;device&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;device&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;device&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://cliquet.readthedocs.org/en/latest/reference/resource.html"&gt;Plus d'infos dans la documentation dédiée&lt;/a&gt; !&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Il est possible de définir des resources sans validation de schema.
&lt;a class="reference external" href="https://github.com/mozilla-services/kinto/blob/master/kinto/views/records.py"&gt;Voir le code source de Kinto&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="etape-4-optionelle"&gt;
&lt;h3&gt;Étape 4 (optionelle)&lt;/h3&gt;
&lt;p&gt;Utiliser les abstractions de &lt;em&gt;Cliquet&lt;/em&gt; dans une vue &lt;em&gt;Cornice&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple, une vue qui utilise le backend de stockage:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cliquet&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;
&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;score&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/score/&lt;/span&gt;&lt;span class="si"&gt;{game}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Store game score&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@score&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ScoreSchema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;post_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;collection_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;scores-&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;game&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authenticated_userid&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validated&lt;/span&gt; &lt;span class="c1"&gt;# c.f. Cornice.&lt;/span&gt;
&lt;span class="hll"&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;span class="hll"&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collection_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="vos-retours"&gt;
&lt;h2&gt;Vos retours&lt;/h2&gt;
&lt;p&gt;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 ?&lt;/p&gt;
&lt;p&gt;Nous prenons tout.&lt;/p&gt;
&lt;div class="section" id="points-faibles"&gt;
&lt;h3&gt;Points faibles&lt;/h3&gt;
&lt;p&gt;Nous sommes très fiers de ce que nous avons construit, en relativement peu
de temps. Et comme nous l'exposions dans l'article précédent (plus accessible), il y a du potentiel !&lt;/p&gt;
&lt;p&gt;Cependant, nous sommes conscients d'un certain nombre de points
qui peuvent être vus comme des faiblesses.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;La documentation d'API&lt;/strong&gt; : actuellement, nous n'avons pas de solution pour qu'un
projet qui utilise &lt;em&gt;Cliquet&lt;/em&gt; puisse intégrer facilement toute
&lt;a class="reference external" href="http://cliquet.readthedocs.org/en/latest/api/index.html"&gt;la documentation de l'API&lt;/a&gt;
obtenue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La documentation&lt;/strong&gt; : 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 «&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Curse_of_knowledge"&gt;curse of knowledge&lt;/a&gt;».&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le protocole&lt;/strong&gt; : on sent bien qu'on va devoir versionner le protocole. Au
moins pour le désolidariser des versions de &lt;em&gt;Cliquet&lt;/em&gt;, si on veut aller au
bout de la philosophie et de l'éco-système.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le conservatisme&lt;/strong&gt; : 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 !&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publication de versions&lt;/strong&gt; : 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="quelques-questions-courantes"&gt;
&lt;h3&gt;Quelques questions courantes&lt;/h3&gt;
&lt;blockquote&gt;
Pourquoi Python ?&lt;/blockquote&gt;
&lt;p&gt;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 !&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;blockquote&gt;
Pourquoi pas Django ?&lt;/blockquote&gt;
&lt;p&gt;On y a pensé, surtout parce qu'il y a plusieurs fans de &lt;em&gt;Django REST Framework&lt;/em&gt;
dans l'équipe.&lt;/p&gt;
&lt;p&gt;On l'a écarté principalement au profit de la légèreté et la modularité de
&lt;em&gt;Pyramid&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
Pourquoi pas avec un framework asynchrone en Python 3+ ?&lt;/blockquote&gt;
&lt;p&gt;Pour l'instant nos administrateurs système nous imposent des déploiements en
Python 2.7, à notre grand désarroi /o\&lt;/p&gt;
&lt;p&gt;Pour &lt;em&gt;Reading List&lt;/em&gt;, nous &lt;a class="reference external" href="https://github.com/mozilla-services/readinglist/blob/1.7.0/readinglist/__init__.py#L19-L26"&gt;avions activé&lt;/a&gt;
&lt;em&gt;gevent&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Puisque l'approche consiste à implémenter un protocole bien déterminé, nous n'excluons
pas un jour d'écrire un &lt;em&gt;Cliquet&lt;/em&gt; en &lt;em&gt;aiohttp&lt;/em&gt; ou &lt;em&gt;Go&lt;/em&gt; si cela s'avèrerait pertinent.&lt;/p&gt;
&lt;blockquote&gt;
Pourquoi pas JSON-API ?&lt;/blockquote&gt;
&lt;p&gt;Comme nous l'expliquions au retour des APIdays,
JSON-API est une spécification qui rejoint plusieurs de nos intentions.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://github.com/mozilla-services/cliquet/issues/254"&gt;pas dépassé le stade de la discussion&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que Cliquet est un framework REST pour Pyramid ?&lt;/blockquote&gt;
&lt;p&gt;Non.&lt;/p&gt;
&lt;p&gt;Au delà des classes de resources CRUD de Cliquet, qui implémentent un
protocole bien précis, il faut utiliser Cornice ou Pyramid directement.&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que Cliquet est suffisamment générique pour des projets hors Mozilla ?&lt;/blockquote&gt;
&lt;p&gt;Premièrement, nous faisons en sorte que tout soit contrôlable depuis la
configuration &lt;tt class="docutils literal"&gt;.ini&lt;/tt&gt; pour permettre la dés/activation ou substitution des
composants.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 !&lt;/p&gt;
&lt;p&gt;Cliquet reste un moyen simple d'aller très vite pour mettre sur pied
une application Pyramid/Cornice.&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que les resources JSON supporte les modèles relationnels complexes ?&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;En revanche, il est tout à fait possible de bénéficier de tous les aspects
du protocole en utilisant une classe &lt;tt class="docutils literal"&gt;Collection&lt;/tt&gt; maison, qui se chargerait
elle de manipuler les relations.&lt;/p&gt;
&lt;p&gt;Le besoin de relations pourrait être un bon prétexte pour implémenter le
protocole avec Django REST Framework :)&lt;/p&gt;
&lt;blockquote&gt;
Est-il possible de faire ci ou ça avec Cliquet ?&lt;/blockquote&gt;
&lt;p&gt;Nous aimerions collecter des besoins pour écrire un ensemble de «recettes/tutoriels». Mais
pour ne pas travailler dans le vide, nous aimerions &lt;a class="reference external" href="https://github.com/mozilla-services/cliquet/issues"&gt;connaitre vos idées&lt;/a&gt; !
(&lt;em&gt;ex. brancher l'authentification Github, changer le format du logging JSON, stocker des
données cartographiques, ...&lt;/em&gt;)&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que Cliquet peut manipuler des fichiers ?&lt;/blockquote&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/mozilla-services/cliquet/issues/236"&gt;Nous l'envisageons&lt;/a&gt;,
mais pour l'instant nous attendons que le besoin survienne en interne pour se
lancer.&lt;/p&gt;
&lt;p&gt;Si c'est le cas, le protocole utilisé sera &lt;a class="reference external" href="http://remotestorage.io/"&gt;Remote Storage&lt;/a&gt;,
afin notamment de s'intégrer dans l'éco-système grandissant.&lt;/p&gt;
&lt;blockquote&gt;
Est-ce que la fonctionnalité X va être implémentée ?&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Cliquet&lt;/em&gt; 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.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Charte et événements non-mixtes au sein de l'Afpy</title><link href="https://blog.notmyidea.org/charte-et-evenements-non-mixtes-au-sein-de-lafpy.html" rel="alternate"></link><published>2015-07-09T00:00:00+02:00</published><updated>2015-07-09T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-07-09:/charte-et-evenements-non-mixtes-au-sein-de-lafpy.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;Mail envoyé sur la liste de diffusion de l'AFPY en Juillet 2015&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bonjour à toutes et tous,&lt;/p&gt;
&lt;p&gt;Récemment, l'Afpy à pris la décision de ne pas relayer la tenue d'un
événement non-mixte d'apprentissage de Python organisé par PyLadies [0].&lt;/p&gt;
&lt;p&gt;La raison est le fait que la tenue d'un tel événement …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;Mail envoyé sur la liste de diffusion de l'AFPY en Juillet 2015&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bonjour à toutes et tous,&lt;/p&gt;
&lt;p&gt;Récemment, l'Afpy à pris la décision de ne pas relayer la tenue d'un
événement non-mixte d'apprentissage de Python organisé par PyLadies [0].&lt;/p&gt;
&lt;p&gt;La raison est le fait que la tenue d'un tel événement ne respecte pas la
charte [1], et particulièrement le fait que c'est un événement
discriminant, alors que toutes les discriminations cherchent à être évitées.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LAFPY souhaite éviter tout type de discrimination, que ce soit sur
le sexe, lorientation sexuelle, le handicap, lapparence physique,
lorigine ou la religion, et sous quelque forme que ce soit (parole,
image, texte et autre).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je suis un peu attristé que notre charte actuelle ne nous permette pas
de soutenir de telles propositions: les événements non-mixtes pour les
minorités sont des pratiques qui existent depuis longtemps, et qui ont
notamment été instrumentales dans la lutte contre lapartheid [2].&lt;/p&gt;
&lt;p&gt;Et donc je voudrais voir cette charte évoluer si possible, mais j'ai du
mal à voir comment travailler le texte pour qu'il permette la tenue
d'événements non-mixtes au sein même de l'Afpy.&lt;/p&gt;
&lt;p&gt;Qu'est-ce que vous en pensez ?&lt;/p&gt;
&lt;p&gt;— Alexis&lt;/p&gt;
&lt;p&gt;[0] http://www.meetup.com/fr/PyLadies-Paris/
[1] http://www.afpy.org/doc/afpy/charte.html
[2] Une citation à ce propos:&lt;/p&gt;
&lt;p&gt;« La pratique de la non-mixité est tout simplement la conséquence de la
théorie de lauto-émancipation. Lauto-émancipation, cest la lutte par
les opprimés pour les opprimés. Cette idée simple, il semble que chaque
génération politique doive la redécouvrir. Dans les années 1960, elle a
dabord été redécouverte par le mouvement américain pour les droits
civils qui, après deux ans de lutte mixte, a décidé de créer des groupes
noirs, fermés aux Blancs. Cétait, cela demeure, la condition&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour que leur expérience de discrimination et dhumiliation puisse se
dire, sans crainte de faire de la peine aux bons Blancs ;&lt;/li&gt;
&lt;li&gt;pour que la rancœur puisse sexprimer et elle doit sexprimer ;&lt;/li&gt;
&lt;li&gt;pour que ladmiration que les opprimés, même révoltés, ne peuvent
sempêcher davoir pour les dominants les noirs pour les Blancs, les
femmes pour les hommes ne joue pas pour donner plus de poids aux
représentants du groupe dominant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Car dans les groupes mixtes, Noirs-Blancs ou femmes-hommes, et en
général dans les groupes dominés-dominants, cest la vision dominante du
préjudice subi par le groupe dominé qui tend à… dominer. Les opprimés
doivent non seulement diriger la lutte contre leur oppression, mais
auparavant définir cette oppression elles et eux-mêmes. Cest pourquoi
la non-mixité voulue, la non-mixité politique, doit demeurer la pratique
de base de toute lutte ; et cest seulement ainsi que les moments mixtes
de la lutte car il y en a et il faut quil y en ait ne seront pas
susceptibles de déraper vers une reconduction douce de la domination.»&lt;/p&gt;
&lt;p&gt;-- http://lmsi.net/La-non-mixite-une-necessite&lt;/p&gt;</content><category term="Féminisme"></category></entry><entry><title>Service de nuages : Perspectives pour l'été</title><link href="https://blog.notmyidea.org/service-de-nuages-perspectives-pour-lete-fr.html" rel="alternate"></link><published>2015-07-07T00:00:00+02:00</published><updated>2015-07-07T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-07-07:/service-de-nuages-perspectives-pour-lete-fr.html</id><summary type="html">&lt;p class="first last"&gt;Le travail en cours et les fonctionnalités à venir pour les prochains mois.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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 à &lt;a class="reference external" href="http://www.openstreetmap.org/node/268148288#map=4/50.12/-122.95"&gt;Whistler, en Colombie Britannique au Canada&lt;/a&gt; !&lt;/p&gt;
&lt;img alt="«All Hands» talk about Lego, by &amp;#64;davidcrob - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-talks.jpg" /&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://kinto.readthedocs.org"&gt;Kinto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous passons en revue les pistes que nous avons pour
les prochains mois.&lt;/p&gt;
&lt;div class="section" id="ateliers-et-promotion"&gt;
&lt;h2&gt;Ateliers et promotion&lt;/h2&gt;
&lt;p&gt;Nicolas a présenté &lt;a class="reference external" href="https://github.com/mozilla-services/kinto.js"&gt;Kinto.js&lt;/a&gt; dans un atelier dédié, avec comme support de
présentation le &lt;a class="reference external" href="http://kintojs.readthedocs.org/en/latest/tutorial/"&gt;tutorial d'introduction&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://kinto.dev.mozaws.net/v1/"&gt;serveur de dev effacé tous les jours&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img alt="Kinto.js workshop - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-workshop.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="mozilla-payments"&gt;
&lt;h2&gt;Mozilla Payments&lt;/h2&gt;
&lt;p&gt;Comme &lt;a class="reference external" href="http://www.servicedenuages.fr/la-gestion-des-permissions"&gt;décrit précédemment&lt;/a&gt;, nous avons mis en place un système de permissions pour répondre aux besoins de suivi des paiements et abonnements.&lt;/p&gt;
&lt;p&gt;Pour ce projet, Kinto sera utilisé depuis une application Django, via un client Python.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class="section" id="a-venir"&gt;
&lt;h3&gt;À venir&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img alt="Whistler Alta Lake - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-lake.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="firefox-os-et-stockage"&gt;
&lt;h2&gt;Firefox OS et stockage&lt;/h2&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://github.com/mozilla-services/msisdn-gateway"&gt;serveur d'identification BrowserID par SMS&lt;/a&gt; et pour &lt;a class="reference external" href="https://github.com/mozilla-services/loop-server"&gt;Firefox Hello&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="in-app-sync"&gt;
&lt;h3&gt;In-App sync&lt;/h3&gt;
&lt;p&gt;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 &lt;a class="reference external" href="http://daybed.readthedocs.org/"&gt;Daybed&lt;/a&gt;. Voici donc une belle opportunité à saisir !&lt;/p&gt;
&lt;p&gt;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 :)&lt;/p&gt;
&lt;p&gt;Le fait que &lt;a class="reference external" href="https://github.com/daleharvey"&gt;Dale&lt;/a&gt;, un des auteurs de &lt;a class="reference external" href="http://pouchdb.com/"&gt;PouchDB&lt;/a&gt; et &lt;a class="reference external" href="https://github.com/michielbdejong"&gt;Michiel de Jong&lt;/a&gt;, un des auteurs de &lt;a class="reference external" href="http://remotestorage.io/"&gt;Remote Storage&lt;/a&gt;, nous aient encouragés sur nos premiers pas nous a bien motivé !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cut-the-rope"&gt;
&lt;h3&gt;Cut the Rope&lt;/h3&gt;
&lt;p&gt;Kinto devrait être mis à profit pour synchroniser les paramètres et les scores
du &lt;a class="reference external" href="http://mozilla.cuttherope.net/"&gt;jeu&lt;/a&gt;. Un premier exercice et une première vitrine sympas !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="syncto"&gt;
&lt;h3&gt;« SyncTo »&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.services.mozilla.com/storage/apis-1.5.html"&gt;Firefox Sync&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;L'implémentation du client en JavaScript est relativement complexe et date un peu maintenant.
Le code existant n'est pas vraiment portable dans &lt;em&gt;Firefox OS&lt;/em&gt; et les tentatives de réécriture
n'ont pas abouti.&lt;/p&gt;
&lt;p&gt;Nous souhaitons implémenter un pont entre &lt;em&gt;Kinto&lt;/em&gt; et &lt;em&gt;Firefox Sync&lt;/em&gt;, de manière
à pouvoir utiliser le client &lt;em&gt;Kinto.js&lt;/em&gt;, 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.&lt;/p&gt;
&lt;p&gt;Alexis a sauté sur l'occasion pour commencer l'écriture d'&lt;a class="reference external" href="https://github.com/mozilla-services/syncclient"&gt;un client python pour Firefox Sync&lt;/a&gt;, qui servira de brique de base pour l'écriture du service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cloud-storage"&gt;
&lt;h3&gt;Cloud Storage&lt;/h3&gt;
&lt;p&gt;Eden Chuang et Sean Lee ont présenté les avancées sur l'intégration de services de stockages
distants (&lt;em&gt;DropBox, Baidu Yun&lt;/em&gt;) dans &lt;em&gt;Firefox OS&lt;/em&gt;. Actuellement, leur preuve de
concept repose sur &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Filesystem_in_Userspace"&gt;FUSE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nous avons évidemment en tête d'introduire la notion de fichiers attachés dans
&lt;em&gt;Kinto&lt;/em&gt;, en implémentant la specification
&lt;a class="reference external" href="https://tools.ietf.org/html/draft-dejong-remotestorage-05"&gt;*Remote Storage*&lt;/a&gt;,
mais pour l'instant les cas d'utilisations ne se sont pas encore présentés officiellement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;À venir&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Nous sommes par ailleurs perpétuellement preneurs de vos retours — et bien
entendu de vos contributions — tant sur le code &lt;a class="reference external" href="https://github.com/mozilla-services/kinto/"&gt;serveur&lt;/a&gt;
que &lt;a class="reference external" href="https://github.com/mozilla-services/kinto.js/"&gt;client&lt;/a&gt; !&lt;/p&gt;
&lt;img alt="Firefox OS Cloud Storage Presentation - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-cloud-storage.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="contenus-applicatifs-de-firefox"&gt;
&lt;h2&gt;Contenus applicatifs de Firefox&lt;/h2&gt;
&lt;p&gt;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. &lt;em&gt;règles de securité, dictionnaires, traductions, ...&lt;/em&gt;) &lt;a class="footnote-reference" href="#id4" id="id3"&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il s'agit de données JSON et binaire qui doivent être versionnées et synchronisées par
les navigateurs (&lt;em&gt;lecture seule&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Il y a plusieurs outils officiels qui existent pour gérer ça (&lt;em&gt;Balrog&lt;/em&gt;, &lt;em&gt;Shavar&lt;/em&gt;, ...),
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, &lt;em&gt;Kinto&lt;/em&gt; est tout aussi pertinent !&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id4" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;La bonne nouvelle c'est que toutes les fonctionnalités &lt;em&gt;third-party&lt;/em&gt; qui ont
été intégrées récemment vont redevenir des &lt;em&gt;add-ons&lt;/em&gt; \o/.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img alt="Landscape - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-landscape.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="awesome-bar"&gt;
&lt;h2&gt;Awesome bar&lt;/h2&gt;
&lt;p&gt;L'équipe &lt;em&gt;Firefox Labs&lt;/em&gt;, 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 &lt;em&gt;Awesome bar&lt;/em&gt;, qui fusionnerait URL, historique et recherche.&lt;/p&gt;
&lt;p&gt;Nous ne pouvons pas en dire beaucoup plus pour l'instant, mais les fonctionnalités
de collections d'enregistrements partagées entre utilisateurs de &lt;em&gt;Kinto&lt;/em&gt;
correspondent parfaitement à ce qui est envisagé pour le futur du navigateur :)&lt;/p&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;À venir&lt;/h3&gt;
&lt;p&gt;Nous serons donc probablement amenés, avant de la fin de l'année, à introduire des
fonctionnalités d'indexation et de recherche &lt;em&gt;full-text&lt;/em&gt; (comprendre &lt;em&gt;ElasticSearch&lt;/em&gt;).
Cela rejoint nos plans précédents, puisque c'est quelque chose que nous avions dans
&lt;em&gt;Daybed&lt;/em&gt;, et qui figurait sur notre feuille de route !&lt;/p&gt;
&lt;img alt="Firefox Labs Meeting - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-labs.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="browser-html"&gt;
&lt;h2&gt;Browser.html&lt;/h2&gt;
&lt;p&gt;L'équipe &lt;em&gt;Recherche&lt;/em&gt; explore les notions de plateforme, et travaille notamment
sur l'implémentation d'un navigateur en JS/HTML avec &lt;em&gt;React&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/mozilla/browser.html"&gt;browser.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Kinto&lt;/em&gt; correspond parfaitement aux attentes
de l'équipe pour synchroniser les données associées à un utilisateur.&lt;/p&gt;
&lt;p&gt;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 à &lt;em&gt;Alexa.com Top 500&lt;/em&gt; pour fournir la complétion d'URL sans
interroger le moteur de recherche.&lt;/p&gt;
&lt;p&gt;L'exercice pourrait être poussé jusqu'à la synchronisation d'états &lt;em&gt;React&lt;/em&gt;
entre périphériques (par exemple pour les onglets).&lt;/p&gt;
&lt;div class="section" id="id7"&gt;
&lt;h3&gt;À venir&lt;/h3&gt;
&lt;p&gt;Si &lt;em&gt;browser.html&lt;/em&gt; 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 &lt;a class="reference external" href="http://www.w3.org/TR/WebCryptoAPI/"&gt;il y a plusieurs standards&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Pour éviter d'interroger le serveur à intervalle régulier afin de synchroniser les
changements, l'introduction des &lt;a class="reference external" href="https://w3c.github.io/push-api/"&gt;*push notifications*&lt;/a&gt; semble assez naturelle.
Il s'agirait alors de la dernière pierre qui manque à l'édifice pour obtenir
un «&lt;em&gt;Mobile/Web backend as a service&lt;/em&gt;» complet.&lt;/p&gt;
&lt;img alt="Roadmap - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-roadmap.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Nous sommes dans une situation idéale, puisque ce que nous avions imaginé
sur &lt;a class="reference external" href="https://github.com/mozilla-services/kinto/wiki/Roadmap"&gt;notre feuille de route&lt;/a&gt; correspond à ce qui nous est demandé par les
différentes équipes.&lt;/p&gt;
&lt;p&gt;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 :)&lt;/p&gt;
&lt;img alt="Friday Night Party - CC0" class="align-center" src="https://blog.notmyidea.org/images/whistler/whistler-top-roof.jpg" /&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Rôles</title><link href="https://blog.notmyidea.org/roles.html" rel="alternate"></link><published>2015-06-29T00:00:00+02:00</published><updated>2015-06-29T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-06-29:/roles.html</id><summary type="html">&lt;p&gt;Headline : De l'importance des rôles informels et de leur partage au sein d'un groupe.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un […] dispositifconsiste à 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 lhabitude de se réfugier suivant leur pente …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Headline : De l'importance des rôles informels et de leur partage au sein d'un groupe.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un […] dispositifconsiste à 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 lhabitude de se réfugier suivant leur pente «
naturelle ».&lt;/p&gt;
&lt;p&gt;Pour ce faire, le groupe prendra du temps pour identifier les types de
positions quadoptent ses protagonistes et les affects qui y sont
liés, imaginer ensuite des questions à résoudre ou des propositions à
travailler qui soient susceptibles denrichir la palette, les couleurs
de la fonction de chacun dans le groupe et les manières qui sont les
siennes dintervenir et de faire évoluer lhistoire.&lt;/p&gt;
&lt;p&gt;-- David Vercauteren, &lt;a href="http://micropolitiques.collectifs.net/Role"&gt;Micropolitiques des
groupes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Une solution évoquée par &lt;a href="http://www.starhawk.org/about/"&gt;StarHawk&lt;/a&gt;,
reprise par &lt;em&gt;David Vercauteren&lt;/em&gt; 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).&lt;/p&gt;
&lt;p&gt;Parmi les rôles principaux, quelques autres citations:&lt;/p&gt;
&lt;div class="note"&gt;
&lt;div class="admonition-title"&gt;
Note
&lt;/div&gt;
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.
&lt;/div&gt;
&lt;h2 id="les-corbeaux"&gt;&lt;a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_0"&gt;Les corbeaux&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Les Corbeaux ont souvent beaucoup dinfluence sur le groupe. Si une ou
deux personnes pensent à des plans au long-terme, les autres
acquiesceront, simplement parce quils nont pas amené dautres
propositions. &lt;strong&gt;Le groupe aurait intérêt à considérer ensemble les
questions du
Corbeau&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-graces"&gt;&lt;a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_1"&gt;Les graces&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Elles apportent au groupe […] enthousiasme, énergie, capacité à
sagrandir. &lt;strong&gt;Elles font en sorte que les gens se sentent bien&lt;/strong&gt;,
génèrent de lenthousiasme pour le groupe, accueillent les nouveaux
venus, amènent de nouvelles personnes. Elles offrent au groupe
linspiration et génèrent de nouvelles
idées.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-dragons"&gt;&lt;a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_2"&gt;Les dragons&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Le dragon permet au groupe de rester connecté à […] laspect
pratique et réaliste des choses. […] Le dragon veille aux ressources
du groupe, à ses frontières et donne voix à ses limites.&lt;/p&gt;
&lt;p&gt;Questions que fait exister le dragon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notre manière de travailler est-elle viable ?&lt;/li&gt;
&lt;li&gt;Nos ressources sont-elles renouvelées ?&lt;/li&gt;
&lt;li&gt;Les gens sépuisent-ils ? Pourquoi ?&lt;/li&gt;
&lt;li&gt;Pouvons-nous vraiment nous lancer dans ce projet et le mener à
bien convenablement ?&lt;/li&gt;
&lt;li&gt;De quelles frontières avec lextérieur avons-nous besoin et
voulons-nous ?&lt;/li&gt;
&lt;li&gt;Comment établissons-nous ces frontières ? Comment nous
protégeons-nous des intrusions ? Invasions ? Distractions ? De ce
qui épuise nos énergies ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;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&lt;/strong&gt;. Ils peuvent être perçus comme des rabat-joie, mais ils
peuvent gagner lestime de ceux qui, dans le groupe, se sentent
dépassés et ne peuvent partager lénergie des Corbeaux et des
Grâces.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-araignees"&gt;&lt;a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_3"&gt;Les araignées&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Le centre dun groupe peut consister en un « cœur spirituel », &lt;strong&gt;un
but ou une vision commune&lt;/strong&gt;, 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. […]&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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
dinteractions
complexes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-serpents"&gt;&lt;a href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_4"&gt;Les serpents&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Les serpents cultivent une attention particulière à la manière dont
les gens se sentent. […]&lt;/p&gt;
&lt;p&gt;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.
[…]&lt;/p&gt;
&lt;p&gt;Les serpents transgressent les lois du Censeur, &lt;strong&gt;parlent des
non-dits, mettent en évidence ce que dautres ne voient pas ou
préfèrent garder caché&lt;/strong&gt;. […]&lt;/p&gt;
&lt;p&gt;Les serpents peuvent diminuer lantipathie dont ils font lobjet sils
prennent la peine de poser des questions au groupe et non dapporter
des analyses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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)&lt;/p&gt;
&lt;p&gt;Aussi, il semble que le groupe doive souhaiter l'établissement d'un
environnement &lt;em&gt;horizontal&lt;/em&gt;, avec une considération partagée de la
direction que le groupe souhaite prendre pour qu'un tel dispositif ait
du sens.&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Service de nuages : Achievement unlocked</title><link href="https://blog.notmyidea.org/service-de-nuages-achievement-unlocked-fr.html" rel="alternate"></link><published>2015-06-01T00:00:00+02:00</published><updated>2015-06-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-06-01:/service-de-nuages-achievement-unlocked-fr.html</id><summary type="html">&lt;p class="first last"&gt;Après près de 3 mois intensifs, nous venons de &lt;em&gt;tagguer&lt;/em&gt; Cliquet 2.0
et Kinto 1.0 !&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Aujourd'hui, c'est jour de fête : nous venons de publier Cliquet &lt;strong&gt;2.0&lt;/strong&gt;
&lt;a class="footnote-reference" href="#id5" id="id1"&gt;[1]&lt;/a&gt; et Kinto &lt;strong&gt;1.0&lt;/strong&gt; &lt;a class="footnote-reference" href="#id6" id="id2"&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;L'aboutissement de 3 années de R&amp;amp;D !&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;Rémy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a class="reference external" href="https://kinto.readthedocs.org/en/latest/"&gt;Kinto&lt;/a&gt; est un service pour
stocker, synchroniser et partager des données arbitraires, attachées à un
compte Firefox (mais le système d'authentification est &lt;em&gt;pluggable&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://cliquet.readthedocs.org/en/latest/"&gt;Cliquet&lt;/a&gt; est une boite à outils pour faciliter l'implémentation de
micro-services HTTP tels que les APIs &lt;em&gt;REST&lt;/em&gt; ayant des besoins de synchronisation.&lt;/p&gt;
&lt;p&gt;Vous pouvez lire plus à propos des raisons qui nous ont poussé à proposer cette nouvelle solution
et de notre ambition sur &lt;a class="reference external" href="http://www.servicedenuages.fr/eco-systeme-et-stockage-generique.html"&gt;http://www.servicedenuages.fr/eco-systeme-et-stockage-generique.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nous sommes fiers du travail que nous avons pu réaliser durant ces derniers
mois sur ces deux projets. Bien que la plupart du travail que nous ayons
réalisé pour le serveur de liste de lecture (Reading List) ait pu être utilisé,
beaucoup de parties ont été repensées et nous avons introduit des
fonctionnalités que l'on attendait depuis longtemps, comme la gestion des
permissions.&lt;/p&gt;
&lt;p&gt;Bien sur, exactement comme après un ré-aménagement de salon, on ne peut
s'empêcher de voir toutes les choses qui doivent toujours être améliorées,
notamment sur la documentation et les performances.&lt;/p&gt;
&lt;p&gt;On peut déjà entrevoir à quoi l'écosystème va ressembler, et c'est prometteur.
Il y a déjà un client JavaScript &lt;a class="footnote-reference" href="#id7" id="id3"&gt;[3]&lt;/a&gt; dont l'objectif est de synchroniser les
données locales du navigateur avec une instance de Kinto.&lt;/p&gt;
&lt;p&gt;N'hésitez vraiment pas à nous solliciter pour discuter avec vous si vous avez
des problématiques proches : nous accueillons avec plaisir toutes sortes de
retours, que ce soit à propos du code, de la documentation, de la sécurité de
la solution ou de la manière de communiquer avec le monde extérieur. Si vous
souhaitez nous contacter, vous pouvez laisser un commentaire ici ou nous
contacter sur le canal &lt;a class="reference external" href="irc://irc.mozilla.org/#storage"&gt;#storage&lt;/a&gt; sur le réseau IRC de Mozilla.&lt;/p&gt;
&lt;p&gt;Et ce n'est que le début ! Le futur se dessine dans notre feuille de route
&lt;a class="footnote-reference" href="#id8" id="id4"&gt;[4]&lt;/a&gt;.&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id5" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Cliquet&lt;/strong&gt; est une boite à outils pour faciliter l'implémentation de
microservices HTTP tels que les APIs &lt;em&gt;REST&lt;/em&gt; ayant des besoins de
synchronisation.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id6" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Kinto&lt;/strong&gt; est un service pour stocker, synchroniser et partager des données
arbitraires, attachées à un compte Firefox (mais le système d'authentification
est &lt;em&gt;pluggable&lt;/em&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id7" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cliquetis, la bibliothèque JavaScript pour consommer l'API HTTP de Kinto —
&lt;a class="reference external" href="https://github.com/mozilla-services/cliquetis"&gt;https://github.com/mozilla-services/cliquetis&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id8" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;La feuille de route de Kinto: &lt;a class="reference external" href="https://github.com/mozilla-services/kinto/wiki/roadmap"&gt;https://github.com/mozilla-services/kinto/wiki/roadmap&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="Technologie"></category></entry><entry><title>Service de nuages : Stocker et interroger les permissions avec Kinto</title><link href="https://blog.notmyidea.org/service-de-nuages-stocker-et-interroger-les-permissions-avec-kinto-fr.html" rel="alternate"></link><published>2015-05-26T00:00:00+02:00</published><updated>2015-05-26T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-26:/service-de-nuages-stocker-et-interroger-les-permissions-avec-kinto-fr.html</id><summary type="html">&lt;p class="first last"&gt;Comment faire pour stocker et interroger la base de données au sujet des permissions avec Kinto ?&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tl;dr: On a maintenant un super système de permission mais comment faire pour stocker et interroger ces permissions de manière efficace ?&lt;/strong&gt;&lt;/p&gt;
&lt;div class="section" id="la-problematique"&gt;
&lt;h2&gt;La problématique&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="obtenir-la-liste-des-principals-d-un-utilisateur"&gt;
&lt;h2&gt;Obtenir la liste des &amp;quot;principals&amp;quot; d'un utilisateur&lt;/h2&gt;
&lt;p&gt;Les &lt;em&gt;principals&lt;/em&gt; de l'utilisateur correspondent à son &lt;tt class="docutils literal"&gt;user_id&lt;/tt&gt;
ainsi qu'à la liste des identifiants des groupes dans lesquels il a
été ajouté.&lt;/p&gt;
&lt;p&gt;Pour éviter de recalculer les &lt;em&gt;principals&lt;/em&gt; de l'utilisateur à chaque
requête, le mieux reste de maintenir une liste des &lt;em&gt;principals&lt;/em&gt; par
utilisateur.&lt;/p&gt;
&lt;p&gt;Ainsi lorsqu'on ajoute un utilisateur à un groupe, il faut bien penser
à ajouter le groupe à la liste des &lt;em&gt;principals&lt;/em&gt; de l'utilisateur.&lt;/p&gt;
&lt;p&gt;Ça se complexifie lorsqu'on ajoute un groupe à un groupe.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;L'avantage de maintenir la liste des &lt;em&gt;principals&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Cela nécessite de donner un identifiant unique aux groupes pour tous
les &lt;em&gt;buckets&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nous proposons de de les nommer avec leur URI:
&lt;tt class="docutils literal"&gt;/buckets/blog/groups/moderators&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="obtenir-la-liste-des-principals-d-un-ace"&gt;
&lt;h2&gt;Obtenir la liste des &amp;quot;principals&amp;quot; d'un ACE&lt;/h2&gt;
&lt;blockquote&gt;
Rappel, un &amp;quot;ACE&amp;quot; est un &lt;em&gt;Access Control Entry&lt;/em&gt;, un des éléments
d'une ACL (e.g. &lt;em&gt;modifier un enregistrement&lt;/em&gt;).&lt;/blockquote&gt;
&lt;p&gt;Avec le &lt;a class="reference external" href="https://blog.notmyidea.org/service-de-nuages-la-gestion-des-permissions-fr.html"&gt;système de permissions choisi&lt;/a&gt;, les permissions d'un
objet héritent de celle de l'objet parent.&lt;/p&gt;
&lt;p&gt;Par exemple, avoir le droit d'écriture sur un &lt;em&gt;bucket&lt;/em&gt; permet la
création des permissions et la modification de tous ses records.&lt;/p&gt;
&lt;p&gt;Ce qui veut dire que pour obtenir la liste complète des &lt;em&gt;principals&lt;/em&gt;
ayant une permission sur un objet, il faut regarder à plusieurs
endroits.&lt;/p&gt;
&lt;p&gt;Rémy a &lt;a class="reference external" href="https://gist.github.com/Natim/77c8f61c1d42e476cef8#file-permission-py-L9-L52"&gt;décrit dans un gist la liste d'héritage de chaque permission&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Prenons l'exemple de l'ajout d'un record dans une collection.&lt;/p&gt;
&lt;p&gt;Le droit &lt;tt class="docutils literal"&gt;records:create&lt;/tt&gt; est obtenu si l'on a l'un des droits suivants:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;bucket:write&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;collection:write&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;records:create&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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. (&lt;em&gt;Je vous laisse imaginer le nombre d'opérations
nécessaires pour ajouter un administrateur sur un *bucket&lt;/em&gt; contenant
1000 collections avec 100000 records chacune.*)&lt;/p&gt;
&lt;p&gt;La solution que nous avons désormais adoptée consiste à stocker les
&lt;em&gt;principals&lt;/em&gt; de chaque &lt;em&gt;ACE&lt;/em&gt; (&lt;em&gt;qui&lt;/em&gt; a le droit de faire telle action
sur l'objet), et de faire l'union des &lt;em&gt;ACE&lt;/em&gt; hérités, afin de les
croiser avec les &lt;em&gt;principals&lt;/em&gt; de l'utilisateur :&lt;/p&gt;
&lt;blockquote&gt;
(ACE(object, permission) inherited_ACE) ∩ PRINCIPALS(user)&lt;/blockquote&gt;
&lt;p&gt;Par exemple l'ACE: &lt;tt class="docutils literal"&gt;/buckets/blog/collections/article:records:create&lt;/tt&gt; hérite de
l'ACE &lt;tt class="docutils literal"&gt;/buckets/blog/collections/article:write&lt;/tt&gt; et de &lt;tt class="docutils literal"&gt;/buckets/blog:write&lt;/tt&gt; :&lt;/p&gt;
&lt;blockquote&gt;
(ACE(/buckets/blog/collections/article:records:create) ACE(/buckets/blog/collections/article:write) ACE(/buckets/blog:write)) ∩ PRINCIPALS('fxa:alexis')&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="recuperer-les-donnees-de-l-utilisateur"&gt;
&lt;h2&gt;Récupérer les données de l'utilisateur&lt;/h2&gt;
&lt;p&gt;La situation se corse lorsqu'on souhaite limiter la liste des
&lt;em&gt;records&lt;/em&gt; d'une collection à ceux accessibles pour l'utilisateur, car
on doit faire cette intersection pour tous les &lt;em&gt;records&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Une première solution est de regarder si l'utilisateur est mentionné
dans les &lt;em&gt;ACL*s du *bucket&lt;/em&gt; ou de la &lt;em&gt;collection&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;Ensuite, si ce n'est pas le cas, alors on filtre les &lt;em&gt;records&lt;/em&gt; pour
lesquels les &lt;em&gt;principals&lt;/em&gt; correspondent à ceux de l'utilisateur.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_user_principals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;can_read_all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;has_read_perms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;can_read_all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_all_records&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filter_read_records&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collection_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-modele-de-donnees"&gt;
&lt;h2&gt;Le modèle de données&lt;/h2&gt;
&lt;p&gt;Pour avoir une idée des requêtes dans un backend SQL, voyons un peu ce
que donnerait le modèle de données.&lt;/p&gt;
&lt;div class="section" id="le-format-des-id"&gt;
&lt;h3&gt;Le format des ID&lt;/h3&gt;
&lt;p&gt;Utiliser des URI comme identifiant des objets présente de nombreux
avantages (lisibilité, unicité, cohérence avec les URLs)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;bucket: &lt;tt class="docutils literal"&gt;/buckets/blog&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;groupe: &lt;tt class="docutils literal"&gt;/buckets/blog/group/moderators&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;collection: &lt;tt class="docutils literal"&gt;/buckets/blog/collections/articles&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;record: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/buckets/blog/collections/articles/records/02f3f76f-7059-4ae4-888f-2ac9824e9200&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="les-tables"&gt;
&lt;h3&gt;Les tables&lt;/h3&gt;
&lt;p&gt;Pour le stockage des principals et des permissions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;principals&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;perms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ace&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;principals&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La table &lt;em&gt;perms&lt;/em&gt; va associer des &lt;em&gt;principals&lt;/em&gt; à chaque &lt;em&gt;ACE&lt;/em&gt;
(e.g.``/buckets/blog:write``).&lt;/p&gt;
&lt;p&gt;Pour le stockage des données:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;write_principals&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="n"&gt;read_principals&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La colonne &lt;em&gt;parent_id&lt;/em&gt; permet de savoir à qui appartient l'objet
(e.g. groupe d'un &lt;em&gt;bucket&lt;/em&gt;, collection d'un &lt;em&gt;bucket&lt;/em&gt;, &lt;em&gt;record&lt;/em&gt; d'une
collection, ...).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="exemple-d-utilisateur"&gt;
&lt;h3&gt;Exemple d'utilisateur&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fxa:alexis&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fxa:natim&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;/buckets/blog/groups/moderators&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="exemple-d-objets"&gt;
&lt;h3&gt;Exemple d'objets&lt;/h3&gt;
&lt;div class="section" id="bucket"&gt;
&lt;h4&gt;Bucket&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;read_principals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;bucket&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;quot;fxa:alexis&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="group"&gt;
&lt;h4&gt;Group&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;read_principals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/groups/moderators&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;group&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;moderators&amp;quot;, &amp;quot;members&amp;quot;: [&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;fxa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;natim&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;]}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce groupe peut être gére par &lt;tt class="docutils literal"&gt;fxa:alexis&lt;/tt&gt; puisqu'il a la permission
&lt;tt class="docutils literal"&gt;write&lt;/tt&gt; dans le &lt;em&gt;bucket&lt;/em&gt; parent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="collection"&gt;
&lt;h4&gt;Collection&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;read_principals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/articles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;collection&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;article&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;system.Everyone&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;/buckets/blog/groups/moderators&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette collection d'articles peut être lue par tout le monde,
et gérée par les membres du groupe &lt;tt class="docutils literal"&gt;moderators&lt;/tt&gt;, ainsi que
&lt;tt class="docutils literal"&gt;fxa:alexis&lt;/tt&gt;, via le &lt;em&gt;bucket&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="records"&gt;
&lt;h4&gt;Records&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;read_principals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/articles/records/02f3f76f-7059-4ae4-888f-2ac9824e9200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;record&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/articles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;02f3f76f-7059-4ae4-888f-2ac9824e9200&amp;quot;,&lt;/span&gt;
&lt;span class="s1"&gt; &amp;quot;title&amp;quot;: &amp;quot;Stocker les permissions&amp;quot;, ...}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;JSONB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="interroger-les-permissions"&gt;
&lt;h3&gt;Interroger les permissions&lt;/h3&gt;
&lt;div class="section" id="id1"&gt;
&lt;h4&gt;Obtenir la liste des &amp;quot;principals&amp;quot; d'un ACE&lt;/h4&gt;
&lt;p&gt;Comme vu plus haut, pour vérifier une permission, on fait l'union des
&lt;em&gt;principals&lt;/em&gt; requis par les objets hérités, et on teste leur
intersection avec ceux de l'utilisateur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;required_principals&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;unnest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;perms&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ace&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog:write&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog:read&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/article:write&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/article:read&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;user_principals&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;unnest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fxa:natim&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;user_principals&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;required_principals&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="filtrer-les-objets-en-fonction-des-permissions"&gt;
&lt;h4&gt;Filtrer les objets en fonction des permissions&lt;/h4&gt;
&lt;p&gt;Pour filtrer les objets, on fait une simple intersection de liste
(&lt;em&gt;merci PostgreSQL&lt;/em&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;record&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/buckets/blog/collections/article&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_principals&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_principals&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;principals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fxa:natim&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les listes s'indexent bien, notamment grâce aux &lt;a class="reference external" href="http://www.postgresql.org/docs/current/static/indexes-types.html"&gt;index GIN&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="avec-redis"&gt;
&lt;h3&gt;Avec Redis&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Redis&lt;/em&gt; présente plusieurs avantages pour ce genre de
problématiques. Notamment, il gère les &lt;em&gt;set&lt;/em&gt; nativement (listes de
valeurs uniques), ainsi que les opérations d'intersection et d'union.&lt;/p&gt;
&lt;p&gt;Avec &lt;em&gt;Redis&lt;/em&gt; on peut écrire l'obtention des &lt;em&gt;principals&lt;/em&gt; pour un &lt;em&gt;ACE&lt;/em&gt;
comme cela :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;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
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;SUNIONSTORE&lt;/tt&gt; permet de créer un set contenant les éléments de
l'union de tous les set suivants. Dans notre cas on le nomme
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;temp_perm:/buckets/blog/collections/articles:write&lt;/span&gt;&lt;/tt&gt; et il contient
l'union des sets d'ACLs suivants:
- &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;permission:/buckets/blog:write&lt;/span&gt;&lt;/tt&gt;
- &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;permission:/buckets/blog/collections/articles:write&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;SINTER&lt;/tt&gt; retourne l'intersection de tous les sets passés en paramètres dans notre cas :
- &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;temp_perm:/buckets/blog/collections/articles:write&lt;/span&gt;&lt;/tt&gt;
- &lt;tt class="docutils literal"&gt;principals:fxa:alexis&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus d'informations sur :
- &lt;a class="reference external" href="http://redis.io/commands/sinter"&gt;http://redis.io/commands/sinter&lt;/a&gt;
- &lt;a class="reference external" href="http://redis.io/commands/sunionstore"&gt;http://redis.io/commands/sunionstore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si le set résultant de la commande &lt;tt class="docutils literal"&gt;SINTER&lt;/tt&gt; n'est pas vide, alors
l'utilisateur possède la permission.&lt;/p&gt;
&lt;p&gt;On peut ensuite supprimer la clé temporaire &lt;tt class="docutils literal"&gt;temp_perm&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;En utilisant &lt;tt class="docutils literal"&gt;MULTI&lt;/tt&gt; on peut &lt;a class="reference external" href="https://gist.github.com/Natim/77c8f61c1d42e476cef8#file-permission-py-L117-L124"&gt;même faire tout cela au sein d'une
transaction&lt;/a&gt;
et garantir ainsi l'intégrité de la requête.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;La solution a l'air simple mais nous a demandé beaucoup de réflexion
en passant par plusieurs propositions.&lt;/p&gt;
&lt;p&gt;L'idée finale est d'avoir :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un backend spécifique permettant de stocker les &lt;em&gt;principals&lt;/em&gt; des
utilisateurs et des &lt;em&gt;ACE&lt;/em&gt; (e.g. avec les sets Redis) ;&lt;/li&gt;
&lt;li&gt;La liste des principals read et write sur la table des objets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Les problèmes de PGP</title><link href="https://blog.notmyidea.org/les-problemes-de-pgp.html" rel="alternate"></link><published>2015-05-25T00:00:00+02:00</published><updated>2015-05-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-25:/les-problemes-de-pgp.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;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?&lt;/p&gt;
&lt;p&gt;-- &lt;a href="http://secushare.org/PGP"&gt;http://secushare.org/PGP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;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?&lt;/p&gt;
&lt;p&gt;-- &lt;a href="http://secushare.org/PGP"&gt;http://secushare.org/PGP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les &lt;em&gt;meta données&lt;/em&gt; (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);&lt;/li&gt;
&lt;li&gt;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;&lt;/li&gt;
&lt;li&gt;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é;&lt;/li&gt;
&lt;li&gt;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
&lt;em&gt;forward secrecy&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;La découverte de la clé de pairs se passe souvent &lt;em&gt;en clair&lt;/em&gt;, sans
utiliser une connexion "sécurisée" (HTTPS). Tout le monde peut donc
voir ces échanges et savoir de qui vous cherchez la clé;&lt;/li&gt;
&lt;li&gt;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).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je suis en train de creuser à propos les alternatives à PGP, par exemple
&lt;a href="https://pond.imperialviolet.org/"&gt;Pond&lt;/a&gt;, 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).&lt;/p&gt;
&lt;p&gt;En attendant, quelques bonnes pratiques sur PGP ;)&lt;/p&gt;
&lt;h2 id="bonnes-pratiques"&gt;Bonnes pratiques&lt;/h2&gt;
&lt;p&gt;Il est en fait assez facile d'utiliser PGP de travers. Riseup à fait &lt;a href="https://help.riseup.net/en/security/message-security/openpgp/best-practices"&gt;un
excellent
guide&lt;/a&gt;
qui explique comment configurer son installation correctement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Générez des clés RSA de 4096 bits, en utilisant sha512;&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parmi les choses les plus frappantes que j'ai rencontrées:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser le &lt;em&gt;flag&lt;/em&gt; hidden-recipient avec PGP pour ne pas dévoiler
qui est le destinataire du message;&lt;/li&gt;
&lt;li&gt;Ne pas envoyer les messages de brouillons sur votre serveur, ils le
seraient en clair !;&lt;/li&gt;
&lt;li&gt;Utilisez HPKS pour communiquer avec les serveurs de clés, sinon tout
le trafic est en clair.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le &lt;a href="https://bitmask.net/"&gt;projet Bitmask&lt;/a&gt; vise lui à rendre les outils
de chiffrement d'échanges de messages et de VPN simples à utiliser,
encore quelque chose à regarder.&lt;/p&gt;
&lt;p&gt;Enfin bref, y'a du taf.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Travail et créativité</title><link href="https://blog.notmyidea.org/travail-et-creativite.html" rel="alternate"></link><published>2015-05-21T00:00:00+02:00</published><updated>2015-05-21T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-21:/travail-et-creativite.html</id><summary type="html">&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Low-risk, low-pressure, and love: The 3 rules of side projects.
-- &lt;a href="https://open.bufferapp.com/side-projects-creative-hobbies/"&gt;The science of side projects&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je ne m'étais jamais fais la remarque, mais les projets dont je suis le
plus fier sont effectivement des &lt;em&gt;side projects&lt;/em&gt;. Des projets que j'ai
commencé parce que j'en avais l'envie et le temps, qui …&lt;/p&gt;</summary><content type="html">&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Low-risk, low-pressure, and love: The 3 rules of side projects.
-- &lt;a href="https://open.bufferapp.com/side-projects-creative-hobbies/"&gt;The science of side projects&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je ne m'étais jamais fais la remarque, mais les projets dont je suis le
plus fier sont effectivement des &lt;em&gt;side projects&lt;/em&gt;. Des projets que j'ai
commencé parce que j'en avais l'envie et le temps, qui n'étaient bien
souvent que des envies passagères.&lt;/p&gt;
&lt;p&gt;Il est arrivé que quelqu'un m'ait demandé de le faire, et que j'y prenne
du plaisir, ou que je le fasse simplement pour moi et que d'autres y
trouvent leur compte, mais il s'agit nécessairement de projets non
&lt;em&gt;commandités&lt;/em&gt; par l'extérieur.&lt;/p&gt;
&lt;p&gt;Encore un signal dans la direction du travailler moins, cette fois ci
pour être plus créatif.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Soupa'Soups." src="/images/soupasoups.jpg"&gt;&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Simplifier les preuves d'identités</title><link href="https://blog.notmyidea.org/simplifier-les-preuves-didentites.html" rel="alternate"></link><published>2015-05-11T00:00:00+02:00</published><updated>2015-05-11T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-11:/simplifier-les-preuves-didentites.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Qu'est-ce que Keybase.io et comment essayent-ils de simplifier la
création de preuves d'identité.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'un des problèmes non réellement résolu actuellement quant au
chiffrement des échanges est lié à l'authenticité des clés. Si quelqu'un
décide de publier une clé en mon nom, et en utilisant mon adresse email,
cela …&lt;/p&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Qu'est-ce que Keybase.io et comment essayent-ils de simplifier la
création de preuves d'identité.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'un des problèmes non réellement résolu actuellement quant au
chiffrement des échanges est lié à l'authenticité des clés. Si quelqu'un
décide de publier une clé en mon nom, et en utilisant mon adresse email,
cela lui est assez facile.&lt;/p&gt;
&lt;p&gt;Il est donc nécessaire d'avoir des moyens de prouver que la clé publique
que j'utilise est réellement la mienne.&lt;/p&gt;
&lt;p&gt;Traditionnellement, il est nécessaire de faire signer ma clé publique
par d'autres personnes, via une rencontre en personne ou des échanges
hors du réseau. C'est par exemple ce qui est réalisé lors des &lt;a href="https://fr.wikipedia.org/wiki/Key_signing_party"&gt;Key
Signing parties&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une manière simple d'effectuer ces vérifications serait, en plus de
donner son adresse email, sa signature de clé, ou a minima de donner un
mot clé pour valider que les échanges proviennent bien de la bonne
personne.&lt;/p&gt;
&lt;p&gt;PGP propose un mécanisme de signature des clés d'autrui, une fois celles
ci validées, ce qui permet de placer sa confiance dans les signataires
de la clé.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://keybase.io"&gt;Keybase.io&lt;/a&gt; est un service qui vise à rendre la
création de ces preuves plus facile, en partant du principe qu'il est
possible d'utiliser différents moyens afin de prouver l'identité des
personnes. Par exemple, leurs comptes Twitter, GitHub ou leurs noms de
domaines. De la même manière qu'il est possible de signer (valider) les
clés de nos amis, il est possible de les "tracker" selon le jargon de
keybase.&lt;/p&gt;
&lt;p&gt;Donc, en somme, &lt;em&gt;Keybase.io&lt;/em&gt; est un annuaire, qui tente de rendre plus
facile la création de preuves. Bien.&lt;/p&gt;
&lt;h2 id="quelques-points-dombre"&gt;Quelques points d'ombre&lt;/h2&gt;
&lt;p&gt;Il s'agit d'une &lt;em&gt;startup&lt;/em&gt; américaine, domiciliée dans le Delaware, qui
se trouve être un des paradis fiscaux qui &lt;a href="https://fr.wikipedia.org/wiki/Delaware"&gt;est connu pour être un
paradis fiscal au coeur même des
États-Unis&lt;/a&gt;. Je ne veux pas
faire de raccourcis trop rapides, bien évidemment, alors &lt;a href="https://github.com/keybase/keybase-issues/issues/1569"&gt;j'ai ouvert un
ticket sur GitHub pour en savoir
plus&lt;/a&gt; (après
tout, le fait d'être un paradis fiscal permet peut-être d'échapper à
certaines lois sur la requêtes de données). D'autant plus étonnant, la
startup n'a pour l'instant &lt;a href="https://github.com/keybase/keybase-issues/issues/788"&gt;pas de &lt;em&gt;business
model&lt;/em&gt;&lt;/a&gt; (ce qui en
un sens est assez rassurant, même si on peut se poser la question de
pourquoi faire une startup dans ces cas là).&lt;/p&gt;
&lt;p&gt;Le service (bien qu'en Alpha), n'est pas mis à disposition sous licence
libre, ce qui pour l'instant empêche quiconque de créer son propre
serveur Keybase. &lt;a href="https://github.com/keybase/"&gt;Une partie des composants, cependant, le sont (open
source)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J'ai du mal à croire en des initiatives qui veulent sauver le monde,
mais dans leur coin, je ne comprends pas pourquoi il n'y à pas de
documentation sur comment monter son propre serveur, ou comment les
aider à travailler sur la fédération. Mais bon, c'est pour l'instant une
initiative encore fraîche, et je lui laisse le bénéfice du doute.&lt;/p&gt;
&lt;p&gt;Sur le long terme, une infrastructure comme &lt;em&gt;Keybase.io&lt;/em&gt;, devra
évidemment être
&lt;a href="https://github.com/keybase/keybase-issues/issues/162"&gt;distribuée&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We've been talking about a total decentralization, but we have to
solve a couple things, synchronization in particular. Right now
someone can mirror us and a client can trust a mirror just as easily
as the server at keybase.io, but there needs to be a way of announcing
proofs to any server and having them cooperate with each other. We'd
be so happy to get this right.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="http://chris.beams.io/posts/keybase/"&gt;Chris Coyne, co-founder of
Keybase&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afin de se "passer" de leur service centralisé, les preuves générées
(qui sont la force du système qu'ils mettent en place) pourraient être
exportées sur des serveurs de clés existants. C'est quelque chose
&lt;a href="https://github.com/keybase/keybase-issues/issues/890"&gt;qu'ils souhaitent réaliser
.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bref, une initiative quand même importante et utile, même si elle
soulève des questions qui méritent qu'on s'y attarde un brin.&lt;/p&gt;
&lt;p&gt;Par ailleurs, &lt;a href="https://leap.se/nicknym"&gt;d'autres projets qui visent des objectifs
similaires&lt;/a&gt; existent, via le projet LEAP, mais
je n'ai pas encore creusé.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Phrases de passe et bonnes pratiques</title><link href="https://blog.notmyidea.org/phrases-de-passe-et-bonnes-pratiques.html" rel="alternate"></link><published>2015-05-09T00:00:00+02:00</published><updated>2015-05-09T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-09:/phrases-de-passe-et-bonnes-pratiques.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Communiquer de manière chiffrée n'est pas aisée, et nécessite de
mémoriser des phrases de passes complexes. Comment s'en sortir ?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Au contraire des autres mots de passe, les mots de passe
cryptographiques ont specifiquement besoin d'être longs et extremement
difficiles à deviner. La raison est qu'un ordinateur (ou un cluster …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Communiquer de manière chiffrée n'est pas aisée, et nécessite de
mémoriser des phrases de passes complexes. Comment s'en sortir ?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Au contraire des autres mots de passe, les mots de passe
cryptographiques ont specifiquement besoin d'être longs et extremement
difficiles à deviner. La raison est qu'un ordinateur (ou un cluster de
plusieurs ordinateurs) peut être programmé pour faire des trillions
d'essais de manière automatique. Si le mot de passe choisi est trop
faible ou construit d'une manière trop prédictible, cette attaque par
la force pourrait se revéler fructueuse en essayant toutes les
possibilités.&lt;/p&gt;
&lt;p&gt;-- &lt;a href="https://www.eff.org/wp/defending-privacy-us-border-guide-travelers-carrying-digital-devices"&gt;The Electronic Frontier
Foundation&lt;/a&gt;
(traduction de mon fait)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Comprendre les concepts et l'écosystème qui permettent d'avoir une vie
numérique chiffrée n'est pas quelque chose d'aisé.
&lt;a href="https://emailselfdefense.fsf.org/fr/"&gt;Plusieurs&lt;/a&gt;
&lt;a href="http://www.controle-tes-donnees.net/outils/GnuPG.html"&gt;guides&lt;/a&gt; ont été
écrits à ce propos, et pour autant je me rends compte que naïvement il
est possible de mal utiliser les outils existants.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Utilisez un &lt;em&gt;bon&lt;/em&gt; mot de passe pour votre session utilisateur et une
&lt;em&gt;bonne&lt;/em&gt; phrase de passe pour proteger votre clé privée. Cette phrase
de passe est la partie la plus fragile de tout le système.&lt;/p&gt;
&lt;p&gt;-- La page de manuel de GPG.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une phrase de passe devrait:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Être suffisamment longue pour être difficile à deviner;&lt;/li&gt;
&lt;li&gt;Ne pas être une citation connue (littérature, livres sacrés etc);&lt;/li&gt;
&lt;li&gt;Difficile à deviner même pour vos proches;&lt;/li&gt;
&lt;li&gt;Facile à se souvenir et à taper;&lt;/li&gt;
&lt;li&gt;être unique et non partagée entre différents sites / applications
etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une des techniques consiste à utiliser des mots du dictionnaire,
sélectionnés de manière aléatoire, puis modifiés.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Trough 20 years of effort, we've succesfully trained everyone to use passwords that are hard for humans to remember, but easy for computers to guess" src="https://imgs.xkcd.com/comics/password_strength.png"&gt;&lt;/p&gt;
&lt;p&gt;Micah Lee &lt;a href="https://github.com/micahflee/passphrases"&gt;travaille également sur un
outil&lt;/a&gt; qui vise à rendre la
mémorisation des phrases de passe plus aisée, de par leur répétition
avec des pauses de plus en plus longues.&lt;/p&gt;
&lt;p&gt;Oui, ce n'est pas aussi simple que ce qu'il y parait. Pour ma part, j'ai
une copie en local de mes clés, dans un fichier chiffré avec une autre
clé que j'ai généré pour l'occasion et que je ne partagerait pas. J'ai
par ailleurs &lt;a href="https://github.com/jamessan/vim-gnupg"&gt;configuré&lt;/a&gt; mon
éditeur de texte pour pouvoir chiffrer les documents textes par défaut.&lt;/p&gt;
&lt;p&gt;J'ai donc regénéré une nouvelle fois mes clés de travail et
personnelles, en utilisant des phrases de passe plus complexes.&lt;/p&gt;
&lt;p&gt;Reste encore la question de la sauvegarde de ces clés privées de manière
chiffrée, que je n'ai pas encore résolue. Bref, tout cela me semble bien
compliqué pour réussir à l'expliquer à des novices, qui pour certains ne
sont même pas sur de l'intérêt de la chose.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Chiffrement</title><link href="https://blog.notmyidea.org/chiffrement.html" rel="alternate"></link><published>2015-05-08T00:00:00+02:00</published><updated>2015-05-08T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-08:/chiffrement.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Face a la surveillance généralisée, une seule solution, le
chiffrement de nos données et communications.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;En france, depuis le 5 Mai 2015, il est possible au Premier Ministre
de surveiller massivement et sans contrôle la population française.&lt;/p&gt;
&lt;p&gt;le projet de loi n'a pas été significativement amendé en séance
mi-avril …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;headline&lt;br&gt;
Face a la surveillance généralisée, une seule solution, le
chiffrement de nos données et communications.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;En france, depuis le 5 Mai 2015, il est possible au Premier Ministre
de surveiller massivement et sans contrôle la population française.&lt;/p&gt;
&lt;p&gt;le projet de loi n'a pas été significativement amendé en séance
mi-avril, et ses dispositions dangereuses ont été conservées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Élargissement des finalités du renseignement, permettant une
&lt;strong&gt;potentielle mise sous surveillance de pans entiers de la vie
politique, syndicale, militante&lt;/strong&gt;, mais aussi économique,
scientifique, etc. ;&lt;/li&gt;
&lt;li&gt;Légalisation massive de pratiques illégales des services de
renseignement et &lt;strong&gt;introduction de techniques de surveillance de
masse des communications électroniques&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Absence de contrôle réel et indépendant&lt;/strong&gt; a priori par la future
CNCTR, et recours des citoyens illusoires ;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-- &lt;a href="https://www.laquadrature.net/fr/lassemblee-nationale-vote-la-surveillance-de-masse-des-citoyens-francais"&gt;La Quadrature du Net - L'Assemblée nationale vote la surveillance
de masse des citoyens français
!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je m'étonne que &lt;a href="https://fr.wikipedia.org/wiki/R%C3%A9v%C3%A9lations_d%27Edward_Snowden"&gt;les révélations d'Edward
Snowden&lt;/a&gt;
— qui ont démontré que la plupart des communications électroniques et
téléphoniques pouvaient être scrutés par la NSA, l'agence de sécurité
Américaine) — ne fassent pas plus de remous que ça.&lt;/p&gt;
&lt;p&gt;À peine deux années après ces révélations, la France fait passer une loi
qui légitime cette surveillance de masse, à plus de 77% des voies. Pour
moi c'est un signal fort de la perte de valeurs de notre démocratie, et
à fortiori de ma perte de foi en notre forme de démocratie.&lt;/p&gt;
&lt;p&gt;Notre liberté d'expression se voit bien évidemment amputée de par la
surveillance généralisée. Sans avoir nécessairement à cacher mes
échanges, ce qui est de la sphère privée devrait pouvoir le rester.&lt;/p&gt;
&lt;p&gt;De toute manière, l'email comme on l'utilise traditionnellement est une
hérésie: toutes les parties qui traitent le message peuvent le lire,
(destinataire, auteur et corps du message entre autres). Il est grand
temps de rendre les outils de chiffrement plus simples et ergonomiques.&lt;/p&gt;
&lt;p&gt;Je compte donc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organiser des ateliers de sensibilisation aux outils de
communication, envers mes proches;&lt;/li&gt;
&lt;li&gt;Utiliser la communication chiffrée le plus souvent possible, au
moins pour rendre le déchiffrement des messages plus longue, "noyer
le poisson".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous êtes intéressé(e)s, faites moi signe, je me ferais un plaisir de
vous expliquer ce qui n'est pas si complexe et vise à laisser dans la
sphère privée ce qui devrait l'être à priori.&lt;/p&gt;
&lt;p&gt;Une manière simple de se protéger est d'installer Thunderbird avec
Enigmail et de le configurer correctement. Ce n'est pas très compliqué
et permet d'avoir des échanges chiffrés. &lt;a href="https://emailselfdefense.fsf.org/fr/"&gt;Référez vous à ce
guide&lt;/a&gt; pour des instructions pas à
pas.&lt;/p&gt;
&lt;p&gt;La clé publique pour me contacter est
&lt;a href="/static/alexis.notmyidea.org.asc"&gt;0x078805D867F56F12&lt;/a&gt;. Et vous ?&lt;/p&gt;
&lt;p&gt;Je vous invite à aller voir le documentaire Citizen Four, qui passe en
salles. Si vous ni avez pas accès, vous pouvez le visionner ici, et
éventuellement faire un don aux auteurs ou associations qui gravitent
autour (&lt;a href="https://supporters.eff.org/donate"&gt;Electronic Fronteer
Fondation&lt;/a&gt;,
&lt;a href="https://tails.boum.org/contribute/how/donate/index.fr.html"&gt;Tails&lt;/a&gt;, &lt;a href="https://support.laquadrature.net/"&gt;La
quadrature du net&lt;/a&gt; en france ou
d'autres…)&lt;/p&gt;
&lt;p&gt;&lt;link href="http://vjs.zencdn.net/4.12/video-js.css" rel="stylesheet"&gt;&lt;/p&gt;
&lt;script src="http://vjs.zencdn.net/4.12/video.js"&gt;&lt;/script&gt;
&lt;video id="MY_VIDEO_1" class="video-js vjs-default-skin" controls
preload="auto" width="640" height="264" poster="MY_VIDEO_POSTER.jpg"
data-setup="{}"&gt;
&lt;source src="https://citizenfour.thecthulhu.com/citizenfour.mp4" type='video/mp4'&gt;
&lt;p class="vjs-no-js"&gt;To view this video please enable JavaScript, and
consider upgrading to a web browser that &lt;a
href="http://videojs.com/html5-video-support/" target="_blank"&gt;supports
HTML5 video&lt;/a&gt;&lt;/p&gt;
&lt;/video&gt;</content><category term="Journal"></category></entry><entry><title>Language</title><link href="https://blog.notmyidea.org/language.html" rel="alternate"></link><published>2015-05-01T00:00:00+02:00</published><updated>2015-05-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-01:/language.html</id><summary type="html">&lt;p&gt;headline : Nos langues peuvent être autant de frontières que de ponts...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nous savons tous que le fait d'obliger les fonctionnaires
internationaux, diplomates ou ministres à s'exprimer dans une langue
qui n'est pas la leur équivaut à les placer en situation
d'infériorité. &lt;strong&gt;Cela les prive de la capacité de nuance et …&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;headline : Nos langues peuvent être autant de frontières que de ponts...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nous savons tous que le fait d'obliger les fonctionnaires
internationaux, diplomates ou ministres à s'exprimer dans une langue
qui n'est pas la leur équivaut à les placer en situation
d'infériorité. &lt;strong&gt;Cela les prive de la capacité de nuance et de
raffinement&lt;/strong&gt;, ce qui revient à faire des concessions à ceux dont
c'est la langue maternelle.&lt;/p&gt;
&lt;p&gt;Aussi nous savons tous que les concepts qui paraissent similaires sont
souvent différents d'une civilisation à l'autre. Les mots expriment
une culture, une façon de penser et une vision du monde.&lt;/p&gt;
&lt;p&gt;-- M. Boutros Boutros-Ghali, ancien secrétaire général des Nations
Unies&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je me surprends à préférer le français pour m'exprimer au lieu de
l'anglais, notamment au niveau des articles non techniques.&lt;/p&gt;
&lt;p&gt;Il y a quelques années, alors que je terminais mes études en Angleterre
et que je commençais à travailler pour Mozilla, on me proposait de venir
aux États-Unis, ce que j'ai refusé parce qu'exprimer mes points de vue
de manière fine m'était trop difficile dans une langue qui n'était pas
la mienne.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cela me permet de pouvoir tenir des discours avec des positions et
un argumentaire "fin", ce qui me serait beaucoup plus difficile dans
une langue que je maitrise moins;&lt;/li&gt;
&lt;li&gt;Sans même parler d'argumentaire, les mots utilisés dans ma langue
maternelle me permettent de manœuvrer plus finement et de faire
passer des idées de manière plus efficace;&lt;/li&gt;
&lt;li&gt;J'ai l'impression de pouvoir engager plus facilement avec les gens
qui m'entourent géographiquement, par exemple par rapport à la
communauté technophile / pythoniste francophone.&lt;/li&gt;
&lt;li&gt;Même si mon niveau d'anglais à progressé, ce n'est pas
nécessairement le cas de mes interlocuteurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par contre, cela nuit clairement à engager avec d'autres personnes dont
la langue n'est pas la mienne, dans tels cas, traduire les contenus
intéressants vers l'anglais semble une solution (chronophage).&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Service de nuages : La gestion des permissions</title><link href="https://blog.notmyidea.org/service-de-nuages-la-gestion-des-permissions-fr.html" rel="alternate"></link><published>2015-05-01T00:00:00+02:00</published><updated>2015-05-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-05-01:/service-de-nuages-la-gestion-des-permissions-fr.html</id><summary type="html">&lt;p class="first last"&gt;Démystification du vocabulaire des permissions et proposition d'implémentation pour Kinto&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dans le cadre de la création d'un service de stockage de données personnelles
(Kinto), la gestion des permissions est un des gros challenges : qui doit avoir
accès à quoi, et comment le définir ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tl;dr: Quelques retours sur le vocabulaire des systèmes de permission et sur nos idées pour l'implementation des permissions dans un stockage générique.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="section" id="la-problematique"&gt;
&lt;h2&gt;La problématique&lt;/h2&gt;
&lt;p&gt;La problématique est simple : des données sont stockées en ligne, et il
faut un moyen de pouvoir les partager avec d'autres personnes.&lt;/p&gt;
&lt;p&gt;En regardant les cas d'utilisations, on se rend compte qu'on a plusieurs types
d'utilisateurs :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;les utilisateurs &amp;quot;finaux&amp;quot; (vous) ;&lt;/li&gt;
&lt;li&gt;les applications qui interagissent en leurs noms.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous les intervenants n'ont donc pas les mêmes droits : certains doivent
pouvoir lire, d'autres écrire, d'autres encore créer de nouveaux
enregistrements, et le contrôle doit pouvoir s'effectuer de manière fine : il
doit être possible de lire un enregistrement mais pas un autre, par exemple.&lt;/p&gt;
&lt;p&gt;Nous sommes partis du constat que les solutions disponibles n'apportaient pas
une réponse satisfaisante à ces besoins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="un-probleme-de-vocabulaire"&gt;
&lt;h2&gt;Un problème de vocabulaire&lt;/h2&gt;
&lt;p&gt;Le principal problème rencontré lors des réflexions fût le vocabulaire.&lt;/p&gt;
&lt;p&gt;Voici ci-dessous une explication des différents termes.&lt;/p&gt;
&lt;div class="section" id="le-concept-de-principal"&gt;
&lt;h3&gt;Le concept de « principal »&lt;/h3&gt;
&lt;p&gt;Un &lt;em&gt;principal&lt;/em&gt;, en sécurité informatique, est une entité qui peut être
authentifiée par un système informatique. &lt;a class="footnote-reference" href="#id2" id="id1"&gt;[1]&lt;/a&gt; En Français il s'agit
du « commettant », l'acteur qui commet l'action (oui, le terme est conceptuel !)&lt;/p&gt;
&lt;p&gt;Il peut s'agir aussi bien d'un individu, d'un ordinateur, d'un
service ou d'un groupe regroupant l'une de ces entités, ce qui
est plus large que le classique « &lt;em&gt;user id&lt;/em&gt; ».&lt;/p&gt;
&lt;p&gt;Les permissions sont alors associées à ces &lt;em&gt;principals&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Par exemple, un utilisateur est identifié de manière unique lors de la
connexion par le système d'authentification dont le rôle est de
définir une liste de &lt;em&gt;principals&lt;/em&gt; pour l'utilisateur se connectant.&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Pour en savoir plus sur les &lt;em&gt;principals&lt;/em&gt; :
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Principal_%28computer_security%29"&gt;https://en.wikipedia.org/wiki/Principal_%28computer_security%29&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="la-difference-entre-role-et-groupe"&gt;
&lt;h3&gt;La différence entre rôle et groupe&lt;/h3&gt;
&lt;p&gt;De but en blanc, il n'est pas évident de définir précisément la
différence entre ces deux concepts qui permettent d'associer
des permissions à un groupe de &lt;em&gt;principals&lt;/em&gt;. &lt;a class="footnote-reference" href="#id4" id="id3"&gt;[2]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La différence est principalement sémantique. Mais on peut y voir une
différence dans la « direction » de la relation entre les deux concepts.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un rôle est une liste de permissions que l'on associe à un &lt;em&gt;principal&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un groupe est une liste de &lt;em&gt;principals&lt;/em&gt; que l'on peut associer à une permission.&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="docutils footnote" frame="void" id="id4" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Plus d'informations :
&lt;a class="reference external" href="http://stackoverflow.com/questions/7770728/group-vs-role-any-real-difference"&gt;http://stackoverflow.com/questions/7770728/group-vs-role-any-real-difference&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="la-difference-entre-permission-acl-ace"&gt;
&lt;h3&gt;La différence entre permission, ACL, ACE&lt;/h3&gt;
&lt;blockquote class="epigraph"&gt;
&lt;p&gt;Une ACL est une liste dAccess Control Entry (ACE) ou entrée de contrôle d'accès
donnant ou supprimant des droits d'accès à une personne ou un groupe.&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;&lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Access_Control_List"&gt;https://fr.wikipedia.org/wiki/Access_Control_List&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je dirais même plus, dans notre cas, « à un &lt;em&gt;principal&lt;/em&gt; ». Par exemple:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;create_record: alexis,remy,tarek
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cet ACE donne la permission &lt;tt class="docutils literal"&gt;create&lt;/tt&gt; sur l'objet &lt;tt class="docutils literal"&gt;record&lt;/tt&gt; aux
utilisateurs Tarek, Rémy et Alexis.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="la-delegation-de-permissions"&gt;
&lt;h2&gt;La délégation de permissions&lt;/h2&gt;
&lt;p&gt;Imaginez l'exemple suivant, où un utilisateur stocke deux types de données en
ligne :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;des contacts ;&lt;/li&gt;
&lt;li&gt;une liste de tâches à faire qu'il peut associer à ses contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'utilisateur a tous les droits sur ses données.&lt;/p&gt;
&lt;p&gt;Cependant il utilise deux applications qui doivent elles avoir un accès restreint :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;une application de gestion des contacts à qui il souhaite déléguer
la gestion intégrale de ses contacts : &lt;tt class="docutils literal"&gt;contacts:write&lt;/tt&gt; ;&lt;/li&gt;
&lt;li&gt;une application de gestion des tâches à qui il souhaite déléguer la
gestion des tâches : &lt;tt class="docutils literal"&gt;contacts:read tasks:write&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il souhaite que son application de contacts ne puisse pas accéder à
ses tâches et que son application de tâches ne puisse pas modifier ses
contacts existants, juste éventuellement en créer de nouveaux.&lt;/p&gt;
&lt;p&gt;Il lui faut donc un moyen de déléguer certains de ses droits à un tiers
(l'application).&lt;/p&gt;
&lt;p&gt;C'est précisément le rôle des &lt;a class="reference external" href="http://tools.ietf.org/html/rfc6749#page-23"&gt;scopes OAuth2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lors de la connexion d'un utilisateur, une fenêtre lui demande quels
accès il veut donner à l'application qui va agir en son nom.&lt;/p&gt;
&lt;p&gt;Le service aura ensuite accès à ces &lt;em&gt;scopes&lt;/em&gt; en regardant le jeton
d'authentification utilisé. Cette information doit être
considérée comme une entrée utilisateur (c'est à dire qu'on ne peut
pas lui faire confiance). Il s'agit de ce que l'utilisateur souhaite.&lt;/p&gt;
&lt;p&gt;Or, il est également possible que l'utilisateur n'ait pas accès aux données
qu'il demande. Le service doit donc utiliser deux niveaux de permissions :
celles de l'utilisateur, et celles qui ont été déléguées à l'application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="espace-de-noms"&gt;
&lt;h2&gt;Espace de noms&lt;/h2&gt;
&lt;p&gt;Dans notre implémentation initiale de &lt;em&gt;Kinto&lt;/em&gt; (notre service de stockage en
construction), l'espace de nom était implicite : les données stockées étaient
nécessairement celles de l'utilisateur connecté.&lt;/p&gt;
&lt;p&gt;Les données d'un utilisateur étaient donc cloisonnées et impossible à partager.&lt;/p&gt;
&lt;p&gt;L'utilisation d'espaces de noms est une manière simple de gérer le partage des données.&lt;/p&gt;
&lt;p&gt;Nous avons choisi de reprendre le modèle de GitHub et de Bitbucket, qui
utilisent les « organisations » comme espaces de noms.&lt;/p&gt;
&lt;p&gt;Dans notre cas, il est possible de créer des &amp;quot;buckets&amp;quot;, qui correspondent à ces
espaces de noms. Un bucket est un conteneur de collections et de groupes
utilisateurs.&lt;/p&gt;
&lt;p&gt;Les ACLs sur ces collections peuvent être attribuées à certains groupes du
&lt;em&gt;bucket&lt;/em&gt; ainsi qu'à d'autres &lt;em&gt;principals&lt;/em&gt; directement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="notre-proposition-d-api"&gt;
&lt;h2&gt;Notre proposition d'API&lt;/h2&gt;
&lt;div class="section" id="les-objets-manipules"&gt;
&lt;h3&gt;Les objets manipulés&lt;/h3&gt;
&lt;p&gt;Pour mettre en place la gestion des permissions, nous avons identifié les
objets suivants :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="23%" /&gt;
&lt;col width="77%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;bucket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On peut les voir comme des espaces de noms. Ils
permettent d'avoir différentes collections portant
le même nom mais stockées dans différents &lt;em&gt;buckets&lt;/em&gt; de
manière à ce que les données soient distinctes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;collection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Une liste d'enregistrements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;record&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un enregistrement d'une collection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un groupe de commetants (« &lt;em&gt;principals&lt;/em&gt; »).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pour la définition des ACLs, il y a une hiérarchie et les objets « héritent » des
ACLs de leur parents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; +---------------+
| Bucket |
+---------------+
+-----&amp;gt;+ - id +&amp;lt;---+
| | - permissions | |
| +---------------+ |
| |
| |
| |
| |
| |
+---+-----------+ +------+---------+
| Collection | | Group |
+---------------+ +----------------+
| - id | | - id |
| - permissions | | - members |
+------+--------+ | - permissions |
^ +----------------+
|
|
+------+---------+
| Record |
+----------------+
| - id |
| - data |
| - permissions |
+----------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="les-permissions"&gt;
&lt;h3&gt;Les permissions&lt;/h3&gt;
&lt;p&gt;Pour chacun de ces objets nous avons identifié les permissions suivantes :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="23%" /&gt;
&lt;col width="77%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Permission&lt;/th&gt;
&lt;th class="head"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;read&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La permission de lire le contenu de
l'objet et de ses sous-objets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;write&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La permission de modifier et
d'administrer un objet et ses sous-
objets. La permission &lt;em&gt;write&lt;/em&gt; permet la
lecture, modification et suppression
d'un objet ainsi que la gestion de ses
permissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;create&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La permission de créer le sous-objet
spécifié. Par exemple:
&lt;tt class="docutils literal"&gt;collections:create&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;À chaque permission spécifiée sur un objet est associée une liste de
&lt;em&gt;principals&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Dans le cas de la permission &lt;tt class="docutils literal"&gt;create&lt;/tt&gt; on est obligé de spécifier
l'objet enfant en question car un objet peut avoir plusieurs types
d'enfants. Par exemple : &lt;tt class="docutils literal"&gt;collections:create&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;groups:create&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Nous n'avons pour l'instant pas de permission pour &lt;cite&gt;delete&lt;/cite&gt; et &lt;cite&gt;update&lt;/cite&gt;,
puisque nous n'avons pas trouvé de cas d'utilisation qui les nécessitent.
Quiconque avec le droit d'écriture peut donc supprimer un enregistrement.&lt;/p&gt;
&lt;p&gt;Les permissions d'un objet sont héritées de son parent. Par exemple,
un enregistrement créé dans une collection accessible à tout le monde
en lecture sera lui aussi accessible à tout le monde.&lt;/p&gt;
&lt;p&gt;Par conséquent, les permissions sont cumulées. Autrement dit, il n'est pas
possible qu'un objet ait des permissions plus restrictives que son parent.&lt;/p&gt;
&lt;p&gt;Voici la liste exhaustive des permissions :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="21%" /&gt;
&lt;col width="32%" /&gt;
&lt;col width="47%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Permissions associées&lt;/th&gt;
&lt;th class="head"&gt;Commentaire&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Configuration
(.ini)&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;buckets:create&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Les &lt;em&gt;principals&lt;/em&gt; ayant le droit
de créer un bucket sont définis
dans la configuration du serveur.
(&lt;em&gt;ex. utilisateurs authentifiés&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="4"&gt;&lt;tt class="docutils literal"&gt;bucket&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;write&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;C'est en quelque sorte le droit
d'administration du &lt;em&gt;bucket&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;read&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;C'est le droit de lire le contenu
de tous les objets du &lt;em&gt;bucket&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;collections:create&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de créer des
collections dans le &lt;em&gt;bucket&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;groups:create&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de créer des groupes
dans le &lt;em&gt;bucket&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="3"&gt;&lt;tt class="docutils literal"&gt;collection&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;write&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission d'administrer tous les
objets de la collection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;read&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de consulter tous les
objets de la collection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;records:create&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de créer des nouveaux
enregistrement dans la collection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;record&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;write&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de modifier ou de
partager l'enregistrement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;read&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de consulter
l'enregistrement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;group&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;cite&gt;write&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission d'administrer le
groupe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;cite&gt;read&lt;/cite&gt;&lt;/td&gt;
&lt;td&gt;Permission de consulter les
membres du groupe.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="les-principals"&gt;
&lt;h3&gt;Les « &lt;em&gt;principals&lt;/em&gt; »&lt;/h3&gt;
&lt;p&gt;Les acteurs se connectant au service de stockage peuvent s'authentifier.&lt;/p&gt;
&lt;p&gt;Ils reçoivent alors une liste de &lt;em&gt;principals&lt;/em&gt; :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;: le &lt;em&gt;principal&lt;/em&gt; donné à tous les acteurs (authentifiés ou pas) ;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;: le &lt;em&gt;principal&lt;/em&gt; donné à tous les acteurs authentifiés ;&lt;/li&gt;
&lt;li&gt;un &lt;em&gt;principal&lt;/em&gt; identifiant l'acteur, par exemple &lt;tt class="docutils literal"&gt;fxa:32aa95a474c984d41d395e2d0b614aa2&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Afin d'éviter les collisions d'identifiants, le &lt;em&gt;principal&lt;/em&gt; de l'acteur dépend
de son type d'authentification (&lt;tt class="docutils literal"&gt;system&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;basic&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;ipaddr&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;hawk&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;fxa&lt;/tt&gt;) et de son identifiant (unique par acteur).&lt;/p&gt;
&lt;p&gt;En fonction du &lt;em&gt;bucket&lt;/em&gt; sur lequel se passe l'action, les groupes dont
fait partie l'utilisateur sont également ajoutés à sa liste de
&lt;tt class="docutils literal"&gt;principals&lt;/tt&gt;. &lt;tt class="docutils literal"&gt;group:moderators&lt;/tt&gt; par exemple.&lt;/p&gt;
&lt;p&gt;Ainsi, si Bob se connecte avec &lt;em&gt;Firefox Accounts&lt;/em&gt; sur le &lt;em&gt;bucket&lt;/em&gt;
&lt;tt class="docutils literal"&gt;servicedenuages_blog&lt;/tt&gt; dans lequel il fait partie du groupe
&lt;tt class="docutils literal"&gt;moderators&lt;/tt&gt;, il aura la liste de &lt;em&gt;principals&lt;/em&gt; suivante :
&lt;tt class="docutils literal"&gt;Everyone, Authenticated, fxa:32aa95a474c984d41d395e2d0b614aa2, group:moderators&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Il est donc possible d'assigner une permission à Bob en utilisant l'un de
ces quatre &lt;em&gt;principals&lt;/em&gt;.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Le &lt;em&gt;principal&lt;/em&gt; &lt;tt class="docutils literal"&gt;&amp;lt;userid&amp;gt;&lt;/tt&gt; dépend du &lt;em&gt;back-end&lt;/em&gt; d'authentification (e.g.
&lt;tt class="docutils literal"&gt;github:leplatrem&lt;/tt&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="quelques-exemples"&gt;
&lt;h3&gt;Quelques exemples&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Blog&lt;/strong&gt;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="35%" /&gt;
&lt;col width="18%" /&gt;
&lt;col width="46%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Permissions&lt;/th&gt;
&lt;th class="head"&gt;Principals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;bucket:blog&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;blog&lt;/span&gt; owner id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;collection:articles&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;group:moderators&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;read&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;record:569e28r98889&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;co-author&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Wiki&lt;/strong&gt;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="35%" /&gt;
&lt;col width="18%" /&gt;
&lt;col width="46%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Object&lt;/th&gt;
&lt;th class="head"&gt;Permissions&lt;/th&gt;
&lt;th class="head"&gt;Principals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;bucket:wiki&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;wiki&lt;/span&gt; administrator id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;collection:articles&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;read&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Sondages&lt;/strong&gt;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="34%" /&gt;
&lt;col width="31%" /&gt;
&lt;col width="35%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Permissions&lt;/th&gt;
&lt;th class="head"&gt;Principals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;bucket:poll&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;admin&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;collection:create&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;collection:&amp;lt;poll&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;poll&lt;/span&gt; author id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;record:create&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Cartes colaboratives&lt;/strong&gt;&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="34%" /&gt;
&lt;col width="31%" /&gt;
&lt;col width="35%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Permissions&lt;/th&gt;
&lt;th class="head"&gt;Principals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;bucket:maps&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;admin&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;collection:create&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;collection:&amp;lt;map&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;map&lt;/span&gt; author id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;read&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;record:&amp;lt;record&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;maintainer&lt;/span&gt; id&amp;gt;&lt;/tt&gt;
(&lt;em&gt;ex. event staff member
maintaining venues&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Plateformes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien sûr, il y a plusieurs façons de modéliser les cas d'utilisation typiques.
Par exemple, on peut imaginer une plateforme de wikis (à la wikia.com), où les
wikis sont privés par défaut et certaines pages peuvent être rendues publiques :&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="32%" /&gt;
&lt;col width="30%" /&gt;
&lt;col width="38%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Objet&lt;/th&gt;
&lt;th class="head"&gt;Permissions&lt;/th&gt;
&lt;th class="head"&gt;Principals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td rowspan="3"&gt;&lt;tt class="docutils literal"&gt;bucket:freewiki&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;administrator&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;collection:create&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;group:create&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Authenticated&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td rowspan="2"&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;collection:&amp;lt;wiki&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;write&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;fxa:&amp;lt;wiki&lt;/span&gt; owner id&amp;gt;&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;group:&amp;lt;editors&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;read&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;group:&amp;lt;readers&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;record:&amp;lt;page&lt;/span&gt; id&amp;gt;&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;read&lt;/tt&gt;&lt;/td&gt;
&lt;td&gt;&lt;tt class="docutils literal"&gt;Everyone&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="l-api-http"&gt;
&lt;h3&gt;L'API HTTP&lt;/h3&gt;
&lt;p&gt;Lors de la création d'un objet, l'utilisateur se voit
attribué la permission &lt;tt class="docutils literal"&gt;write&lt;/tt&gt; sur l'objet :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;PUT&lt;/span&gt; &lt;span class="nn"&gt;/v1/buckets/servicedenuages_blog&lt;/span&gt; &lt;span class="kr"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;Bearer 0b9c2625dc21ef05f6ad4ddf47c5f203837aa32ca42fced54c2625dc21efac32&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;application/json&lt;/span&gt;
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
{
&amp;quot;id&amp;quot;: &amp;quot;servicedenuages_blog&amp;quot;,
&amp;quot;permissions&amp;quot;: {
&amp;quot;write&amp;quot;: [&amp;quot;fxa:49d02d55ad10973b7b9d0dc9eba7fdf0&amp;quot;]
}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il est possible d'ajouter des permissions à l'aide de &lt;tt class="docutils literal"&gt;PATCH&lt;/tt&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;PATCH&lt;/span&gt; &lt;span class="nn"&gt;/v1/buckets/servicedenuages_blog/collections/articles&lt;/span&gt; &lt;span class="kr"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;Bearer 0b9c2625dc21ef05f6ad4ddf47c5f203837aa32ca42fced54c2625dc21efac32&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="l"&gt;application/json&lt;/span&gt;
{
&amp;quot;permissions&amp;quot;: {
&amp;quot;read&amp;quot;: [&amp;quot;+system.Everyone&amp;quot;]
}
}
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
{
&amp;quot;id&amp;quot;: &amp;quot;servicedenuages_blog&amp;quot;,
&amp;quot;permissions&amp;quot;: {
&amp;quot;write&amp;quot;: [&amp;quot;fxa:49d02d55ad10973b7b9d0dc9eba7fdf0&amp;quot;],
&amp;quot;read&amp;quot;: [&amp;quot;system.Everyone&amp;quot;]
}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le &lt;tt class="docutils literal"&gt;PATCH&lt;/tt&gt; nous utilisons la syntaxe préfixée par un &lt;tt class="docutils literal"&gt;+&lt;/tt&gt; ou
par un &lt;tt class="docutils literal"&gt;-&lt;/tt&gt; pour ajouter ou enlever des &lt;em&gt;principals&lt;/em&gt; sur un ACL.&lt;/p&gt;
&lt;p&gt;Il est également possible de faire un &lt;tt class="docutils literal"&gt;PUT&lt;/tt&gt; pour réinitialiser les ACLs,
sachant que le &lt;tt class="docutils literal"&gt;PUT&lt;/tt&gt; va ajouter l'utilisateur courant à la
liste automatiquement mais qu'il pourra se retirer avec un &lt;tt class="docutils literal"&gt;PATCH&lt;/tt&gt;.
Ajouter l'utilisateur courant permet d'éviter les situations où plus
personne n'a accès aux données.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;La permission &lt;tt class="docutils literal"&gt;create&lt;/tt&gt; est valable pour &lt;tt class="docutils literal"&gt;POST&lt;/tt&gt; mais aussi pour &lt;tt class="docutils literal"&gt;PUT&lt;/tt&gt;
lorsque l'enregistrement n'existe pas.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="le-cas-specifique-des-donnees-utilisateurs"&gt;
&lt;h3&gt;Le cas spécifique des données utilisateurs&lt;/h3&gt;
&lt;p&gt;Une des fonctionnalités actuelles de &lt;em&gt;Kinto&lt;/em&gt; est de pouvoir gérer des
collections d'enregistrements par utilisateur.&lt;/p&gt;
&lt;p&gt;Sous &lt;em&gt;*nix&lt;/em&gt; il est possible, pour une
application, de sauvegarder la configuration de l'utilisateur courant
dans son dossier personnel sans se soucier de l'emplacement sur
le disque en utilisant &lt;tt class="docutils literal"&gt;~/&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Dans notre cas si une application souhaite sauvegarder les contacts d'un
utilisateur, elle peut utiliser le raccourci &lt;tt class="docutils literal"&gt;~&lt;/tt&gt; pour faire référence au
&lt;em&gt;bucket&lt;/em&gt; &lt;strong&gt;personnel&lt;/strong&gt; de l'utilisateur : &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/buckets/~/collections/contacts&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Cette URL retournera le code &lt;tt class="docutils literal"&gt;HTTP 307&lt;/tt&gt; vers le &lt;em&gt;bucket&lt;/em&gt; de l'utilisateur courant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/v1/buckets/~/collections/contacts/records&lt;/span&gt; &lt;span class="kr"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
{
&amp;quot;name&amp;quot;: &amp;quot;Rémy&amp;quot;,
&amp;quot;emails&amp;quot;: [&amp;quot;remy@example.com&amp;quot;],
&amp;quot;phones&amp;quot;: [&amp;quot;+330820800800&amp;quot;]
}
HTTP/1.1 307 Temporary Redirect
Location: /v1/buckets/fxa:49d02d55ad10973b7b9d0dc9eba7fdf0/collections/contacts/records
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ainsi il est tout à fait possible à Alice de partager ses contacts
avec Bob. Il lui suffit pour cela de donner la permission &lt;tt class="docutils literal"&gt;read&lt;/tt&gt; à
Bob sur sa collection et de donner l'URL complète
&lt;tt class="docutils literal"&gt;/v1/buckets/fxa:49d02d55ad10973b7b9d0dc9eba7fdf0/collections/contacts/records&lt;/tt&gt;
à Bob.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-delegation-des-permissions"&gt;
&lt;h3&gt;La délégation des permissions&lt;/h3&gt;
&lt;p&gt;Dans le cas de &lt;em&gt;Kinto&lt;/em&gt;, nous avons défini un format pour restreindre les
permissions via les scopes OAuth2:
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;storage:&amp;lt;bucket_id&amp;gt;:&amp;lt;collection_id&amp;gt;:&amp;lt;permissions_list&amp;gt;&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, si on reprend l'exemple précédent de la liste de tâches, il est possible pour
Bob de créer un token OAuth spécifique avec les &lt;em&gt;scopes&lt;/em&gt; suivants :
&lt;tt class="docutils literal"&gt;profile storage:todolist:tasks:write &lt;span class="pre"&gt;storage:~:contacts:read+records:create&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Donc, bien que Bob a la permission &lt;tt class="docutils literal"&gt;write&lt;/tt&gt; sur ses contacts,
l'application utilisant ce token pourra uniquement lire les contacts
existants et en ajouter de nouveaux.&lt;/p&gt;
&lt;p&gt;Une partie de la complexité est donc de réussir à présenter ces &lt;em&gt;scopes&lt;/em&gt; de
manière lisible à l'utilisateur, afin qu'il choisisse quelles permissions
donner aux applications qui agissent en son nom.&lt;/p&gt;
&lt;p&gt;Voilà où nous en sommes de notre réflexion !&lt;/p&gt;
&lt;p&gt;Si vous avez des choses à ajouter, des points de désaccord ou autres
réflexions, n'hésitez pas à nous interrompre pendant qu'il est encore temps !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Eco-système et stockage générique</title><link href="https://blog.notmyidea.org/eco-systeme-et-stockage-generique.html" rel="alternate"></link><published>2015-04-30T00:00:00+02:00</published><updated>2015-04-30T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-04-30:/eco-systeme-et-stockage-generique.html</id><summary type="html">
&lt;p&gt;&lt;strong&gt;tl;dr Nous devons construire un service de suivi de paiements, et nous
hésitons à continuer à nous entêter avec notre propre solution de
stockage/synchronisation.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme nous l'écrivions &lt;a href="https://blog.notmyidea.org/service-de-nuages-fr.html"&gt;dans l'article
précédent&lt;/a&gt;, nous
souhaitons construire une solution de stockage générique. On refait
&lt;a href="http://daybed.readthedocs.org"&gt;Daybed&lt;/a&gt; chez Mozilla !&lt;/p&gt;
&lt;p&gt;Notre objectif est simple: permettre …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;strong&gt;tl;dr Nous devons construire un service de suivi de paiements, et nous
hésitons à continuer à nous entêter avec notre propre solution de
stockage/synchronisation.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme nous l'écrivions &lt;a href="https://blog.notmyidea.org/service-de-nuages-fr.html"&gt;dans l'article
précédent&lt;/a&gt;, nous
souhaitons construire une solution de stockage générique. On refait
&lt;a href="http://daybed.readthedocs.org"&gt;Daybed&lt;/a&gt; chez Mozilla !&lt;/p&gt;
&lt;p&gt;Notre objectif est simple: permettre aux développeurs d'application,
internes à Mozilla ou du monde entier, de faire persister et
synchroniser facilement des données associées à un utilisateur.&lt;/p&gt;
&lt;div id="storage-specs"&gt;
Les aspects de l'architecture qui nous semblent incontournables:
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;La solution doit reposer sur un protocole, et non sur une
implémentation ;&lt;/li&gt;
&lt;li&gt;L'auto-hébergement de l'ensemble doit être simplissime ;&lt;/li&gt;
&lt;li&gt;L'authentification doit être &lt;em&gt;pluggable&lt;/em&gt;, voire décentralisée
(OAuth2, FxA, Persona) ;&lt;/li&gt;
&lt;li&gt;Les enregistrements doivent pouvoir être validés par le serveur ;&lt;/li&gt;
&lt;li&gt;Les données doivent pouvoir être stockées dans n'importe quel
backend ;&lt;/li&gt;
&lt;li&gt;Un système de permissions doit permettre de protéger des
collections, ou de partager des enregistrements de manière fine ;&lt;/li&gt;
&lt;li&gt;La résolution de conflits doit pouvoir avoir lieu sur le serveur ;&lt;/li&gt;
&lt;li&gt;Le client doit être pensé «*offline-first*» ;&lt;/li&gt;
&lt;li&gt;Le client doit pouvoir réconcilier les données simplement ;&lt;/li&gt;
&lt;li&gt;Le client doit pouvoir être utilisé aussi bien dans le navigateur
que côté serveur ;&lt;/li&gt;
&lt;li&gt;Tous les composants se doivent d´être simples et substituables
facilement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La première question qui nous a été posée fût «*Pourquoi vous
n'utilisez pas PouchDB ou Remote Storage ?*»&lt;/p&gt;
&lt;h2 id="remote-storage"&gt;Remote Storage&lt;/h2&gt;
&lt;p&gt;Remote Storage est un standard ouvert pour du stockage par utilisateur.
&lt;a href="http://tools.ietf.org/html/draft-dejong-remotestorage-04"&gt;La
specification&lt;/a&gt;
se base sur des standards déjà existants et éprouvés: Webfinger, OAuth
2, CORS et REST.&lt;/p&gt;
&lt;p&gt;L'API est simple, des &lt;a href="http://blog.cozycloud.cc/news/2014/08/12/when-unhosted-meets-cozy-cloud/"&gt;projets prestigieux
l'utilisent&lt;/a&gt;.
Il y a plusieurs &lt;a href="https://github.com/jcoglan/restore"&gt;implémentations&lt;/a&gt;
du serveur, et il existe &lt;a href="https://www.npmjs.com/package/remotestorage-server"&gt;un squelette
Node&lt;/a&gt; pour
construire un serveur sur mesure.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Remote Storage widget" src="%7Bfilename%7D/images/remotestorage-widget.png"&gt;&lt;/p&gt;
&lt;p&gt;Le client
&lt;a href="https://github.com/remotestorage/remotestorage.js/"&gt;remoteStorage.js&lt;/a&gt;
permet d'intégrer la solution dans les applications Web. Il se charge du
«store local», du cache, de la synchronization, et fournit un widget qui
permet aux utilisateurs des applications de choisir le serveur qui
recevra les données (via Webfinger).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/michielbdejong/ludbud"&gt;ludbud&lt;/a&gt;, la version épurée de
&lt;em&gt;remoteStorage.js&lt;/em&gt;, se limite à l'abstraction du stockage distant. Cela
permettrait à terme, d'avoir une seule bibliothèque pour stocker dans un
serveur &lt;em&gt;remoteStorage&lt;/em&gt;, &lt;em&gt;ownCloud&lt;/em&gt; ou chez les méchants comme &lt;em&gt;Google
Drive&lt;/em&gt; ou &lt;em&gt;Dropbox&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Au premier abord, la spécification correspond à ce que nous voulons
accomplir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La philosophie du protocole est saine;&lt;/li&gt;
&lt;li&gt;L'éco-système est bien fichu;&lt;/li&gt;
&lt;li&gt;La vision politique colle: redonner le contrôle des données aux
utilisateurs (voir &lt;a href="http://unhosted.org/"&gt;unhosted&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;Les choix techniques compatibles avec ce qu'on a commencé (CORS,
REST, OAuth 2);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En revanche, vis à vis de la manipulation des données, il y a plusieurs
différences avec ce que nous souhaitons faire:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'API suit globalement une métaphore «fichiers» (dossier/documents),
plutôt que «données» (collection/enregistrements) ;&lt;/li&gt;
&lt;li&gt;Il n'y a pas de validation des enregistrements selon un schéma (même
si &lt;a href="https://remotestorage.io/doc/code/files/baseclient/types-js.html"&gt;certaines
implémentations&lt;/a&gt;
du protocole le font) ;&lt;/li&gt;
&lt;li&gt;Il n'y a pas la possibilité de trier/filtrer les enregistrements
selon des attributs ;&lt;/li&gt;
&lt;li&gt;Les permissions &lt;a href="https://groups.google.com/forum/#!topic/unhosted/5_NOGq8BPTo"&gt;se limitent à
privé/public&lt;/a&gt;
(et &lt;a href="https://github.com/remotestorage/spec/issues/58#issue-27249452"&gt;l'auteur envisage plutôt un modèle à la
Git&lt;/a&gt;)[1]
;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En résumé, il semblerait que ce que nous souhaitons faire avec le
stockage d'enregistrements validés est complémentaire avec &lt;em&gt;Remote
Storage&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Si des besoins de persistence orientés «fichiers» se présentent, a
priori nous aurions tort de réinventer les solutions apportées par cette
spécification. Il y a donc de grandes chances que nous l´intégrions à
terme, et que &lt;em&gt;Remote Storage&lt;/em&gt; devienne une facette de notre solution.&lt;/p&gt;
&lt;h2 id="pouchdb"&gt;PouchDB&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://pouchdb.com/"&gt;PouchDB&lt;/a&gt; est une bibliothèque JavaScript qui
permet de manipuler des enregistrements en local et de les synchroniser
vers une base distante.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;javascript&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PouchDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dbname&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dave@gmail.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;David&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replicate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://example.com/mydb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le projet a le vent en poupe, bénéficie de nombreux contributeurs,
l'éco-système est très riche et l'adoption par des projets &lt;a href="https://github.com/hoodiehq/wip-hoodie-store-on-pouchdb"&gt;comme
Hoodie&lt;/a&gt; ne fait
que confirmer la pertinence de l'outil pour les développeurs frontend.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PouchDB&lt;/em&gt; gère un « store » local, dont la persistence est abstraite et
&lt;a href="http://pouchdb.com/2014/07/25/pouchdb-levels-up.html"&gt;repose sur&lt;/a&gt; l'API
&lt;a href="https://github.com/level/levelup#relationship-to-leveldown"&gt;LevelDown&lt;/a&gt;
pour persister les données dans &lt;a href="https://github.com/Level/levelup/wiki/Modules#storage-back-ends"&gt;n'importe quel
backend&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Même si &lt;em&gt;PouchDB&lt;/em&gt; adresse principalement les besoins des applications
«*offline-first*», il peut être utilisé aussi bien dans le navigateur
que côté serveur, via Node.&lt;/p&gt;
&lt;h3 id="synchronisation"&gt;Synchronisation&lt;/h3&gt;
&lt;p&gt;La synchronisation (ou réplication) des données locales s'effectue sur
un &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; distant.&lt;/p&gt;
&lt;p&gt;Le projet &lt;a href="https://github.com/pouchdb/pouchdb-server"&gt;PouchDB Server&lt;/a&gt;
implémente l'API de CouchDB en NodeJS. Comme &lt;em&gt;PouchDB&lt;/em&gt; est utilisé, on
obtient un service qui se comporte comme un &lt;em&gt;CouchDB&lt;/em&gt; mais qui stocke
ses données n'importe où, dans un &lt;em&gt;Redis&lt;/em&gt; ou un &lt;em&gt;PostgreSQL&lt;/em&gt; par
exemple.&lt;/p&gt;
&lt;p&gt;La synchronisation est complète. Autrement dit, tous les enregistrements
qui sont sur le serveur se retrouvent synchronisés dans le client. Il
est possible de filtrer les collections synchronisées, mais cela &lt;a href="http://pouchdb.com/2015/04/05/filtered-replication.html"&gt;n'a
pas pour objectif de sécuriser l'accès aux
données&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L'approche recommandée pour cloisonner les données par utilisateur
consiste à créer &lt;a href="https://github.com/nolanlawson/pouchdb-authentication#some-people-can-read-some-docs-some-people-can-write-those-same-docs"&gt;une base de données par
utilisateur&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce n'est pas forcément un problème, CouchDB &lt;a href="https://mail-archives.apache.org/mod_mbox/couchdb-user/201401.mbox/%3C52CEB873.7080404@ironicdesign.com%3E"&gt;supporte des centaines de
milliers de bases sans
sourciller&lt;/a&gt;.
Mais selon les cas d'utilisation, le cloisement n'est pas toujours
facile à déterminer (par rôle, par application, par collection, ...).&lt;/p&gt;
&lt;h2 id="le-cas-dutilisation-payments"&gt;Le cas d'utilisation « Payments »&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Put Payments Here -- Before the Internet - CC-NC-SA Katy Silberger
https://www.flickr.com/photos/katysilbs/11163812186" src="%7Bfilename%7D/images/put-payments.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Dans les prochaines semaines, nous devrons mettre sur pied un prototype
pour tracer l'historique des paiements et abonnements d'un utilisateur.&lt;/p&gt;
&lt;p&gt;Le besoin est simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'application « Payment » enregistre les paiements et abonnements
d'un utilisateur pour une application donnée;&lt;/li&gt;
&lt;li&gt;l'application « Donnée » interroge le service pour vérifier qu'un
utilisateur a payé ou est abonné;&lt;/li&gt;
&lt;li&gt;l'utilisateur interroge le service pour obtenir la liste de tous ses
abonnements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seule l'application « Payment » a le droit de créer/modifier/supprimer
des enregistrements, les deux autres ne peuvent que consulter en lecture
seule.&lt;/p&gt;
&lt;p&gt;Une application donnée ne peut pas accéder aux paiements des autres
applications, et un utilisateur ne peut pas accéder aux paiements des
autres utilisateurs.&lt;/p&gt;
&lt;h3 id="avec-remotestorage"&gt;Avec RemoteStorage&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Remote Love - CC-BY-NC Julie
https://www.flickr.com/photos/mamajulie2008/2609549461" src="%7Bfilename%7D/images/remote-love.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Clairement, l'idée de &lt;em&gt;RemoteStorage&lt;/em&gt; est de dissocier l'application
executée, et les données créées par l'utilisateur avec celle-ci.&lt;/p&gt;
&lt;p&gt;Dans notre cas, c'est l'application « Payment » qui manipule des données
concernant un utilisateur. Mais celles-ci ne lui appartiennent pas
directement: certes un utilisateur doit pouvoir les supprimer, surtout
pas en créer ou les modifier!&lt;/p&gt;
&lt;p&gt;La notion de permissions limitée à privé/publique ne suffit pas dans ce
cas précis.&lt;/p&gt;
&lt;h3 id="avec-pouchdb"&gt;Avec PouchDB&lt;/h3&gt;
&lt;p&gt;Il va falloir créer une &lt;em&gt;base de données&lt;/em&gt; par utilisateur, afin d'isoler
les enregistrements de façon sécurisée. Seule l'application « Payment »
aura tous les droits sur les databases.&lt;/p&gt;
&lt;p&gt;Mais cela ne suffit pas.&lt;/p&gt;
&lt;p&gt;Il ne faut pas qu'une application puisse voir les paiements des autres
applications, donc il va aussi falloir recloisonner, et créer une &lt;em&gt;base
de données&lt;/em&gt; par application.&lt;/p&gt;
&lt;p&gt;Quand un utilisateur voudra accéder à l'ensemble de ses paiements, il
faudra agréger les &lt;em&gt;databases&lt;/em&gt; de toutes les applications. Quand
l'équipe marketing voudra faire des statistiques sur l'ensemble des
applications, il faudra agrégér des centaines de milliers de
&lt;em&gt;databases&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ce qui est fort dommage, puisqu'il est probable que les paiements ou
abonnements d'un utilisateur pour une application se comptent sur les
doigts d'une main. Des centaines de milliers de bases contenant moins de
5 enregistrements ?&lt;/p&gt;
&lt;p&gt;De plus, dans le cas de l'application « Payment », le serveur est
implémenté en Python. Utiliser un wrapper JavaScript comme le fait
&lt;a href="https://pythonhosted.org/Python-PouchDB/"&gt;python-pouchdb&lt;/a&gt; cela ne nous
fait pas trop rêver.&lt;/p&gt;
&lt;h2 id="un-nouvel-eco-systeme"&gt;Un nouvel éco-système ?&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Wagon wheel - CC-BY-NC-SA arbyreed
https://www.flickr.com/photos/19779889@N00/16161808220" src="%7Bfilename%7D/images/wagon-wheel.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Évidemment, quand on voit la richesse des projets &lt;em&gt;PouchDB&lt;/em&gt; et &lt;em&gt;Remote
Storage&lt;/em&gt; et la dynamique de ces communautés, il est légitime d'hésiter
avant de développer une solution alternative.&lt;/p&gt;
&lt;p&gt;Quand nous avons créé le serveur &lt;em&gt;Reading List&lt;/em&gt;, nous l'avons construit
avec &lt;a href="http://cliquet.readthedocs.org/"&gt;Cliquet&lt;/a&gt;, ce fût l'occasion de
mettre au point &lt;a href="http://cliquet.readthedocs.org/en/latest/api/"&gt;un protocole très
simple&lt;/a&gt;, fortement
inspiré de &lt;a href="http://en.wikipedia.org/wiki/Firefox_Sync"&gt;Firefox Sync&lt;/a&gt;,
pour faire de la synchronisation d'enregistrements.&lt;/p&gt;
&lt;p&gt;Et si les clients &lt;em&gt;Reading List&lt;/em&gt; ont pu être implémentés en quelques
semaines, que ce soit en JavaScript, Java (Android) et ASM (Add-on
Firefox), c'est que le principe «*offline first*» du service est
trivial.&lt;/p&gt;
&lt;h3 id="les-compromis"&gt;Les compromis&lt;/h3&gt;
&lt;p&gt;Évidemment, nous n'avons pas la prétention de concurrencer &lt;em&gt;CouchDB&lt;/em&gt;.
Nous faisons plusieurs concessions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;De base, les collections d'enregistrements sont cloisonnées par
utilisateur;&lt;/li&gt;
&lt;li&gt;Pas d'historique des révisions;&lt;/li&gt;
&lt;li&gt;Pas de diff sur les enregistrements entre révisions;&lt;/li&gt;
&lt;li&gt;De base, pas de résolution de conflit automatique;&lt;/li&gt;
&lt;li&gt;Pas de synchronisation par flux (&lt;em&gt;streams&lt;/em&gt;);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jusqu'à preuve du contraire, ces compromis excluent la possibilité
d'implémenter un &lt;a href="https://github.com/pouchdb/pouchdb/blob/master/lib/adapters/http/http.js#L721-L946"&gt;adapter
PouchDB&lt;/a&gt;
pour la synchronisation avec le protocole HTTP de &lt;em&gt;Cliquet&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Dommage puisque capitaliser sur l'expérience client de &lt;em&gt;PouchDB&lt;/em&gt; au
niveau synchro client semble être une très bonne idée.&lt;/p&gt;
&lt;p&gt;En revanche, nous avons plusieurs fonctionnalités intéressantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas de map-reduce;&lt;/li&gt;
&lt;li&gt;Synchronisation partielle et/ou ordonnée et/ou paginée ;&lt;/li&gt;
&lt;li&gt;Le client choisit, via des headers, d'écraser la donnée ou de
respecter la version du serveur ;&lt;/li&gt;
&lt;li&gt;Un seul serveur à déployer pour N applications ;&lt;/li&gt;
&lt;li&gt;Auto-hébergement simplissime ;&lt;/li&gt;
&lt;li&gt;Le client peut choisir de ne pas utiliser de « store local » du tout
;&lt;/li&gt;
&lt;li&gt;Dans le client JS, la gestion du « store local » sera externalisée
(on pense à &lt;a href="https://github.com/mozilla/localForage"&gt;LocalForage&lt;/a&gt; ou
&lt;a href="https://github.com/dfahlander/Dexie.js"&gt;Dexie.js&lt;/a&gt;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et, on répond au reste des &lt;a href="#storage-specs"&gt;specifications mentionnées au début de
l'article&lt;/a&gt; !&lt;/p&gt;
&lt;h3 id="les-arguments-philosophiques"&gt;Les arguments philosophiques&lt;/h3&gt;
&lt;p&gt;Il est &lt;a href="http://en.wikipedia.org/wiki/Law_of_the_instrument"&gt;illusoire de penser qu'on peut tout faire avec un seul
outil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nous avons d'autres cas d'utilisations dans les cartons qui semblent
correspondre au scope de &lt;em&gt;PouchDB&lt;/em&gt; (&lt;em&gt;pas de notion de permissions ou de
partage, environnement JavaScript, ...&lt;/em&gt;). Nous saurons en tirer profit
quand cela s'avèrera pertinent !&lt;/p&gt;
&lt;p&gt;L'éco-système que nous voulons construire tentera de couvrir les cas
d'utilisation qui sont mal adressés par &lt;em&gt;PouchDB&lt;/em&gt;. Il se voudra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basé sur notre protocole très simple ;&lt;/li&gt;
&lt;li&gt;Minimaliste et multi-usages (&lt;em&gt;comme la fameuse 2CV&lt;/em&gt;) ;&lt;/li&gt;
&lt;li&gt;Naïf (&lt;em&gt;pas de rocket science&lt;/em&gt;) ;&lt;/li&gt;
&lt;li&gt;Sans magie (&lt;em&gt;explicite et facile à réimplémenter from scratch&lt;/em&gt;) ;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://cliquet.readthedocs.org/en/latest/rationale.html"&gt;La philosophie et les fonctionnalités du toolkit python
Cliquet&lt;/a&gt; seront
bien entendu à l'honneur :)&lt;/p&gt;
&lt;p&gt;Quant à &lt;em&gt;Remote Storage&lt;/em&gt;, dès que le besoin se présentera, nous serons
très fier de rejoindre l'initiative, mais pour l'instant cela nous
paraît risqué de démarrer en tordant la solution.&lt;/p&gt;
&lt;h3 id="les-arguments-pratiques"&gt;Les arguments pratiques&lt;/h3&gt;
&lt;p&gt;Avant d'accepter de déployer une solution à base de &lt;em&gt;CouchDB&lt;/em&gt;, les &lt;em&gt;ops&lt;/em&gt;
de Mozilla vont nous demander de leur prouver par A+B que ce n'est pas
faisable avec les stacks qui sont déjà rodées en interne (i.e. MySQL,
Redis, PostgreSQL).&lt;/p&gt;
&lt;p&gt;De plus, on doit s'engager sur une pérennité d'au moins 5 ans pour les
données. Avec &lt;em&gt;Cliquet&lt;/em&gt;, en utilisant le backend PostgreSQL, les données
sont persistées à plat dans un &lt;a href="https://github.com/mozilla-services/cliquet/blob/40aa33/cliquet/storage/postgresql/schema.sql#L14-L28"&gt;schéma PostgreSQL tout
bête&lt;/a&gt;.
Ce qui ne sera pas le cas d'un adapteur LevelDown qui va manipuler des
notions de révisions éclatées dans un schéma clé-valeur.&lt;/p&gt;
&lt;p&gt;Si nous basons le service sur &lt;em&gt;Cliquet&lt;/em&gt;, comme c'est le cas avec
&lt;a href="http://kinto.readthedocs.org"&gt;Kinto&lt;/a&gt;, tout le travail d'automatisation
de la mise en production (&lt;em&gt;monitoring, builds RPM, Puppet...&lt;/em&gt;) que nous
avons fait pour &lt;em&gt;Reading List&lt;/em&gt; est complètement réutilisable.&lt;/p&gt;
&lt;p&gt;De même, si on repart avec une stack complètement différente, nous
allons devoir recommencer tout le travail de rodage, de profiling et
d'optimisation effectué au premier trimestre.&lt;/p&gt;
&lt;h2 id="les-prochaines-etapes"&gt;Les prochaines étapes&lt;/h2&gt;
&lt;p&gt;Et il est encore temps de changer de stratégie :) Nous aimerions avoir
un maximum de retours ! C'est toujours une décision difficile à
prendre... &lt;code&gt;&amp;lt;/appel à troll&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tordre un éco-système existant vs. constuire sur mesure ;&lt;/li&gt;
&lt;li&gt;Maîtriser l'ensemble vs. s'intégrer ;&lt;/li&gt;
&lt;li&gt;Contribuer vs. refaire ;&lt;/li&gt;
&lt;li&gt;Guider vs. suivre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous avons vraiment l'intention de rejoindre l'initiative
&lt;a href="https://nobackend.org/"&gt;no-backend&lt;/a&gt;, et ce premier pas n'exclue pas que
nous convergions à terme ! Peut-être que nous allons finir par rendre
notre service compatible avec &lt;em&gt;Remote Storage&lt;/em&gt;, et peut-être que
&lt;em&gt;PouchDB&lt;/em&gt; deviendra plus agnostique quand au protocole de
synchronisation...&lt;/p&gt;
&lt;p&gt;&lt;img alt="XKCD — Standards
https://xkcd.com/927/" src="%7Bfilename%7D/images/standards.png"&gt;&lt;/p&gt;
&lt;p&gt;Utiliser ce nouvel écosystème pour le projet « Payments » va nous
permettre de mettre au point un système de permissions (&lt;em&gt;probablement
basé sur les scopes OAuth&lt;/em&gt;) qui correspond au besoin exprimé. Et nous
avons bien l'intention de puiser dans &lt;a href="http://blog.daybed.io/daybed-revival.html"&gt;notre expérience avec Daybed sur
le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nous extrairons aussi le code des clients implémentés pour &lt;em&gt;Reading
List&lt;/em&gt; afin de faire un client JavaScript minimaliste.&lt;/p&gt;
&lt;p&gt;En partant dans notre coin, nous prenons plusieurs risques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;réinventer une roue dont nous n'avons pas connaissance ;&lt;/li&gt;
&lt;li&gt;échouer à faire de l'éco-système &lt;em&gt;Cliquet&lt;/em&gt; un projet communautaire ;&lt;/li&gt;
&lt;li&gt;échouer à positionner &lt;em&gt;Cliquet&lt;/em&gt; dans la niche des cas non couverts
par PouchDB :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme &lt;a href="http://pouchdb.com/2015/04/05/filtered-replication.html"&gt;le dit Giovanni
Ornaghi&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rolling out your set of webservices, push notifications, or background
services might give you more control, but at the same time it will
force you to engineer, write, test, and maintain a whole new
ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est justement l'éco-système dont est responsable l'équipe &lt;em&gt;Mozilla
Cloud Services&lt;/em&gt;!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Il existe le &lt;a href="https://sharesome.5apps.com/"&gt;projet Sharesome&lt;/a&gt; qui
permet de partager publiquement des ressources de son &lt;em&gt;remote
Storage&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;</content><category term="Technologie"></category></entry><entry><title>Service de nuages !</title><link href="https://blog.notmyidea.org/service-de-nuages-fr.html" rel="alternate"></link><published>2015-04-01T00:00:00+02:00</published><updated>2015-04-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2015-04-01:/service-de-nuages-fr.html</id><summary type="html">&lt;p class="first last"&gt;Retour sur le premier trimestre 2015: Readinglist, Kinto, Cliquet.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pas mal de changements depuis le début de l'année pour l'équipe
«cloud-services» francophone!&lt;/p&gt;
&lt;p&gt;Tout d'abord, nouvelle importante, l'équipe s'étoffe avec des profils assez
complémentaires: &lt;a class="reference external" href="https://nicolas.perriault.net/"&gt;n1k0&lt;/a&gt; et &lt;a class="reference external" href="http://mathieu-leplatre.info"&gt;Mathieu&lt;/a&gt; sont venus prêter main forte à &lt;a class="reference external" href="http://ziade.org/"&gt;Tarek&lt;/a&gt;, &lt;a class="reference external" href="http://natim.ionyse.com"&gt;Rémy&lt;/a&gt; et &lt;a class="reference external" href="http://notmyidea.org"&gt;Alexis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le début de l'année a vu le lancement de &lt;a class="reference external" href="https://www.mozilla.org/en-US/firefox/hello/"&gt;Firefox Hello&lt;/a&gt; ce qui nous a permis de passer
à l'échelle &lt;a class="reference external" href="https://github.com/mozilla-services/loop-server"&gt;le serveur&lt;/a&gt;,
écrit en Node.js®, pour l'occasion.&lt;/p&gt;
&lt;div class="section" id="un-serveur-de-listes-de-lecture"&gt;
&lt;h2&gt;Un serveur de listes de lecture&lt;/h2&gt;
&lt;p&gt;En parallèle, un projet de &lt;a class="reference external" href="https://readinglist.readthedocs.org"&gt;synchronisation de liste de lecture&lt;/a&gt; (&lt;em&gt;Reading List&lt;/em&gt;) a vu le jour. L'idée
étant de pouvoir marquer des pages &amp;quot;à lire pour plus tard&amp;quot; et de continuer la
lecture sur n'importe quel périphérique synchronisé (Firefox pour Android ou
Firefox Desktop). Un équivalent libre à &lt;a class="reference external" href="http://getpocket.com"&gt;Pocket&lt;/a&gt; en quelque sorte, qu'il est
possible d'héberger soit-même.&lt;/p&gt;
&lt;img alt="Capture d'écran de Firefox nightly avec readinglist." src="https://blog.notmyidea.org/images/readinglist-screenshot.png" /&gt;
&lt;p&gt;Pour le construire, nous aurions pu réutiliser &lt;a class="reference external" href="https://github.com/mozilla-services/server-syncstorage"&gt;Firefox Sync&lt;/a&gt;, après tout
c'est un service de synchronisation de données très robuste, construit avec &lt;a class="reference external" href="http://cornice.readthedocs.org/"&gt;Cornice&lt;/a&gt;.
Mais seulement, &lt;em&gt;Sync&lt;/em&gt; n'a pas été pensé pour garantir la pérennité des données,
et la marche était trop haute pour changer ça en profondeur.&lt;/p&gt;
&lt;p&gt;Nous aurions pu aussi nous contenter de faire une énième application qui expose
une API et persiste des données dans une base de données.&lt;/p&gt;
&lt;p&gt;Mais cette nouvelle petite équipe n'est pas là par hasard :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-daybed-team"&gt;
&lt;h2&gt;La «Daybed Team»&lt;/h2&gt;
&lt;p&gt;On partage une vision: un service générique de stockage de données ! Peut-être
que ça vous rappelle &lt;a class="reference external" href="https://daybed.io"&gt;un certain projet nommé Daybed&lt;/a&gt; ?
Pour les applications clientes, JavaScript, mobiles ou autres, l'utilisation de
ce service doit être un jeu d'enfant ! L'application gère ses données
localement (aka offline-first), et synchronise à la demande.&lt;/p&gt;
&lt;p&gt;Ici, le cœur du serveur &lt;em&gt;Reading List&lt;/em&gt; est justement une API &amp;quot;CRUD&amp;quot; (Create,
Retrieve, Update, Delete), qui gère de la synchronisation et de
l'authentification. Nous avons donc pris le parti de faire une API &amp;quot;simple&amp;quot;,
avec le moins de spécificités possible, qui poserait les bases d'un service
générique. Notamment parce qu'il y a d'autres projets dans la même trempe qui vont suivre.&lt;/p&gt;
&lt;p&gt;Pas mal d'expérience ayant été accumulée au sein de l'équipe, avec d'une part la
création de &lt;em&gt;Firefox Sync&lt;/em&gt;, et d'autre part avec &lt;em&gt;Daybed&lt;/em&gt;, notre side-project, nous
tentons de ne pas reproduire les mêmes erreurs, tout en gardant les concepts
qui ont fait leurs preuves.&lt;/p&gt;
&lt;p&gt;Par exemple, nous avons conservé le mécanisme de collections d'enregistrements
et de &lt;em&gt;timestamp&lt;/em&gt; de &lt;em&gt;Sync&lt;/em&gt;. Comme ces problématiques sont récurrentes, voire
incontournables, nous avons décidé de reprendre le protocole de synchronisation,
de l'étendre légèrement et surtout de le dissocier du projet de listes de lecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-mecanisme-qui-force-a-aller-de-l-avant"&gt;
&lt;h2&gt;Le mécanisme qui force à aller de l'avant&lt;/h2&gt;
&lt;p&gt;Comme première pierre à l'édifice, nous avons donné naissance au projet
&lt;a class="reference external" href="https://cliquet.readthedocs.org"&gt;Cliquet&lt;/a&gt;, dont l'idée principale est de
fournir une implémentation de ce protocole en python, tout en factorisant
l'ensemble de nos bonnes pratiques (pour la prod notamment).&lt;/p&gt;
&lt;img alt="Logo du projet Cliquet" class="align-right" src="https://blog.notmyidea.org/images/cliquet/cliquet-logo.png" /&gt;
&lt;p&gt;L'avantage d'avoir un protocole plutôt qu'un monolithe, c'est que si vous
préférez Asyncio, io.js ou Go, on vous encouragera à publier votre
implémentation alternative !&lt;/p&gt;
&lt;p&gt;Avec &lt;em&gt;Cliquet&lt;/em&gt;, le code du serveur liste de lecture consiste principalement
à définir un schéma pour les enregistrements, puis à forcer des valeurs de
champs sur certains appels. Cela réduit ce projet à quelques dizaines de lignes
de code.&lt;/p&gt;
&lt;p&gt;Quant au futur service de stockage générique, &lt;a class="reference external" href="http://kinto.readthedocs.org"&gt;le projet&lt;/a&gt; en est encore à ses balbutiements mais c'est
bel et bien en route ! Il permet déjà d'être branché comme backend de stockage
dans une application &lt;em&gt;Cliquet&lt;/em&gt;, et ça &lt;a class="reference external" href="https://github.com/mozilla-services/kinto/blob/0.2.1/kinto/views/collection.py"&gt;implémenté en 20 lignes de code&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Ah, et cette fois, nous ne construirons les fonctionnalités qu'à partir des
besoins concrets qui surviennent. Ça paraît tout bête, mais sur &lt;em&gt;Daybed&lt;/em&gt; on
l'a pas vu venir :)&lt;/p&gt;
&lt;p&gt;Dans les prochains articles, nous avons prévu de décrire les bonnes pratiques
rassemblées dans le protocole (ou &lt;em&gt;Cliquet&lt;/em&gt;), certains points techniques précis
et de vous présenter notre vision via des exemples et tutoriaux.&lt;/p&gt;
&lt;p&gt;À bientôt, donc !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Technologie"></category></entry><entry><title>Le secret du bonheur</title><link href="https://blog.notmyidea.org/le-secret-du-bonheur.html" rel="alternate"></link><published>2014-11-20T00:00:00+01:00</published><updated>2014-11-20T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2014-11-20:/le-secret-du-bonheur.html</id><summary type="html">
&lt;p&gt;Un enfant demande à son père :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dis papa, quel est le secret pour être heureux ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sans dire un mot, le père demande à son fils de le suivre ; Ils sortent
de la maison, le père sur leur vieil âne et le fils suivant à pied.&lt;/p&gt;
&lt;p&gt;Et les gens du village …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Un enfant demande à son père :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dis papa, quel est le secret pour être heureux ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sans dire un mot, le père demande à son fils de le suivre ; Ils sortent
de la maison, le père sur leur vieil âne et le fils suivant à pied.&lt;/p&gt;
&lt;p&gt;Et les gens du village de dire :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mais quel mauvais père qui oblige ainsi son fils d'aller à pied !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le lendemain ils sortent de nouveau.&lt;/p&gt;
&lt;p&gt;Le père ayant installé son fils sur l'âne et lui marchant à côté.&lt;/p&gt;
&lt;p&gt;Les gens du village dirent alors :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Quel fils indigne, qui ne respecte pas son vieux père et le laisse
aller à pied !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le jour suivant, ils s'installent tous les deux sur l'âne avant de
quitter la maison. Les villageois commentèrent en disant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ils ne respectent pas leur bête à la surcharger ainsi !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le jour suivant, ils partirent en portant eux-mêmes leurs affaires,
l'âne trottinant derrière eux. Cette fois les gens du village y
trouvèrent encore à redire :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Voilà qu'ils portent eux-mêmes leurs bagages maintenant ! C'est le
monde à l'envers !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;De retour à la maison, le père dit à son fils :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tu me demandais l'autre jour le secret du bonheur. Peu importe ce que
tu fais, il y aura toujours quelqu'un pour y trouver à redire. Fais ce
qui te plaît et là tu seras vraiment heureux.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Réfléxions"></category></entry><entry><title>What's Hawk and how to use it?</title><link href="https://blog.notmyidea.org/whats-hawk-and-how-to-use-it.html" rel="alternate"></link><published>2014-07-31T00:00:00+02:00</published><updated>2014-07-31T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2014-07-31:/whats-hawk-and-how-to-use-it.html</id><summary type="html">
&lt;p&gt;At Mozilla, we recently had to implement &lt;a href="https://github.com/hueniverse/hawk"&gt;the Hawk authentication
scheme&lt;/a&gt; for a number of projects,
and we came up creating two libraries to ease integration into pyramid
and node.js apps.&lt;/p&gt;
&lt;p&gt;But maybe you don't know Hawk.&lt;/p&gt;
&lt;p&gt;Hawk is a relatively new technology, crafted by one of the original …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;At Mozilla, we recently had to implement &lt;a href="https://github.com/hueniverse/hawk"&gt;the Hawk authentication
scheme&lt;/a&gt; for a number of projects,
and we came up creating two libraries to ease integration into pyramid
and node.js apps.&lt;/p&gt;
&lt;p&gt;But maybe you don't know Hawk.&lt;/p&gt;
&lt;p&gt;Hawk is a relatively new technology, crafted by one of the original
&lt;a href="https://en.wikipedia.org/wiki/OAuth"&gt;OAuth&lt;/a&gt; specification authors, that
intends to replace the 2-legged OAuth authentication scheme using a
simpler approach.&lt;/p&gt;
&lt;p&gt;It is an authentication scheme for HTTP, built around &lt;a href="https://en.wikipedia.org/wiki/Hmac"&gt;HMAC
digests&lt;/a&gt; of requests and responses.&lt;/p&gt;
&lt;p&gt;Every authenticated client request has an Authorization header
containing a MAC (Message Authentication Code) and some additional
metadata, then each server response to authenticated requests contains a
Server-Authorization header that authenticates the response, so the
client is sure it comes from the right server.&lt;/p&gt;
&lt;h2 id="exchange-of-the-hawk-id-and-hawk-key"&gt;Exchange of the hawk id and hawk key&lt;/h2&gt;
&lt;p&gt;To sign the requests, a client needs to retrieve a token id and a token
key from the server.&lt;/p&gt;
&lt;p&gt;Hawk itself does not define how these credentials should be exchanged
between the server and the client. The excellent team behind &lt;a href="http://accounts.firefox.com"&gt;Firefox
Accounts&lt;/a&gt; put together a scheme to do that,
which acts like the following:&lt;/p&gt;
&lt;div class="note"&gt;
&lt;div class="admonition-title"&gt;
Note
&lt;/div&gt;
All this derivation crazyness might seem a bit complicated, but don't
worry, we put together some libraries that takes care of that for you
automatically.
If you are not interested into these details, you can directly jump to
the next section to see how to use the libraries.
&lt;/div&gt;
&lt;p&gt;When your server application needs to send you the credentials, it will
return it inside a specific Hawk-Session-Token header. This token can be
derived to split this string in two values (hawk id and hawk key) that
you will use to sign your next requests.&lt;/p&gt;
&lt;p&gt;In order to get the hawk credentials, you'll need to:&lt;/p&gt;
&lt;p&gt;First, do an &lt;a href="http://en.wikipedia.org/wiki/HKDF"&gt;HKDF derivation&lt;/a&gt; on the
given session token. You'll need to use the following
parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;key_material = HKDF(hawk_session, &amp;quot;&amp;quot;, &amp;#39;identity.mozilla.com/picl/v1/sessionToken&amp;#39;, 32*2)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="note"&gt;
&lt;div class="admonition-title"&gt;
Note
&lt;/div&gt;
The `identity.mozilla.com/picl/v1/sessionToken` is a reference to this
way of deriving the credentials, not an actual URL.
&lt;/div&gt;
&lt;p&gt;Then, the key material you'll get out of the HKDF need to be separated
into two parts, the first 32 hex caracters are the hawk id, and the next
32 ones are the hawk key.&lt;/p&gt;
&lt;p&gt;Credentials:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;javascript&lt;/span&gt;
&lt;span class="err"&gt;credentials = {&lt;/span&gt;
&lt;span class="err"&gt; &amp;#39;id&amp;#39;: keyMaterial[0:32],&lt;/span&gt;
&lt;span class="err"&gt; &amp;#39;key&amp;#39;: keyMaterial[32:64],&lt;/span&gt;
&lt;span class="err"&gt; &amp;#39;algorithm&amp;#39;: &amp;#39;sha256&amp;#39;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="httpie"&gt;Httpie&lt;/h2&gt;
&lt;p&gt;To showcase APIs in the documentation, I like to use
&lt;a href="https://github.com/jakubroztocil/httpie"&gt;httpie&lt;/a&gt;, a curl-replacement
with a nicer API, built around &lt;a href="http://python-requests.org"&gt;the python requests
library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Luckily, HTTPie allows you to plug different authentication schemes for
it, so &lt;a href="https://github.com/mozilla-services/requests-hawk"&gt;I wrote a
wrapper&lt;/a&gt; around
&lt;a href="https://github.com/kumar303/mohawk"&gt;mohawk&lt;/a&gt; to add hawk support to the
requests lib.&lt;/p&gt;
&lt;p&gt;Doing hawk requests in your terminal is now as simple as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pip install requests-hawk httpie
$ http GET localhost:5000/registration --auth-type&lt;span class="o"&gt;=&lt;/span&gt;hawk --auth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id:key&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In addition, it will help you to craft requests using the requests
library:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests_hawk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HawkAuth&lt;/span&gt;
&lt;span class="n"&gt;hawk_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HawkAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;algorithm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sha256&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hawk_auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, if you don't have the token id and key, you can pass the
hawk session token I talked about earlier and the lib will take care of
the derivation for you:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;hawk_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HawkAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;hawk_session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hawk-session-token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="n"&gt;server_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server_url&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hawk_auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="integrate-with-python-pyramid-apps"&gt;Integrate with python pyramid apps&lt;/h2&gt;
&lt;p&gt;If you're writing pyramid applications, you'll be happy to learn that
&lt;a href="https://www.rfk.id.au/blog/"&gt;Ryan Kelly&lt;/a&gt; put together a library that
makes Hawk work as an Authentication provider for them. I'm chocked how
simple it is to use it.&lt;/p&gt;
&lt;p&gt;Here is a demo of how we implemented it for Daybed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pyramid_hawkauth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HawkAuthenticationPolicy&lt;/span&gt;
&lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HawkAuthenticationPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decode_hawk_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;get_hawk_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_authentication_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authn_policy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The get_hawk_id function is a function that takes a request and a
tokenid and returns a tuple of (token_id, token_key).&lt;/p&gt;
&lt;p&gt;How you want to store the tokens and retrieve them is up to you. The
default implementation (e.g. if you don't pass a decode_hawk_id
function) decodes the key from the token itself, using a master secret
on the server (so you don't need to store anything).&lt;/p&gt;
&lt;h2 id="integrate-with-nodejs-express-apps"&gt;Integrate with node.js Express apps&lt;/h2&gt;
&lt;p&gt;We had to implement Hawk authentication for two node.js projects and
finally came up factorizing everything in a library for express, named
&lt;a href="https://github.com/mozilla-services/express-hawkauth"&gt;express-hawkauth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to plug it in your application, you'll need to use it as a
middleware:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;javascript&lt;/span&gt;
&lt;span class="nt"&gt;var&lt;/span&gt; &lt;span class="nt"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;require&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;express&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;var&lt;/span&gt; &lt;span class="nt"&gt;hawk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;require&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;express-hawkauth&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;express&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;var&lt;/span&gt; &lt;span class="nt"&gt;hawkMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;hawk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;getMiddleware&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;hawkOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;getSession&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;function&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;tokenId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;pass&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;cb&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;key&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;algorithm&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;given&lt;/span&gt; &lt;span class="err"&gt;token&lt;/span&gt; &lt;span class="err"&gt;id.&lt;/span&gt; &lt;span class="err"&gt;First&lt;/span&gt; &lt;span class="err"&gt;argument&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;callback&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;potential&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;error.&lt;/span&gt;
&lt;span class="err"&gt;cb(null,&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;algorithm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sha256&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;createSession&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;function&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;stores&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;session&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;given&lt;/span&gt; &lt;span class="err"&gt;id&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;key.&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Argument&lt;/span&gt; &lt;span class="err"&gt;returned&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;potential&lt;/span&gt; &lt;span class="err"&gt;error.&lt;/span&gt;
&lt;span class="err"&gt;cb(null)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;setUser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;function&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;req&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;res&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;tokenId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;uses&lt;/span&gt; &lt;span class="err"&gt;req&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;res,&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;hawkId&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;they&amp;#39;re&lt;/span&gt; &lt;span class="err"&gt;known&lt;/span&gt; &lt;span class="err"&gt;so&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;tweak&lt;/span&gt; &lt;span class="err"&gt;it.&lt;/span&gt; &lt;span class="err"&gt;For&lt;/span&gt; &lt;span class="err"&gt;instance,&lt;/span&gt; &lt;span class="err"&gt;you&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;store&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;tokenId&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;user.&lt;/span&gt;
&lt;span class="err"&gt;req.user&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;tokenId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/hawk-enabled-endpoint&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;hawkMiddleware&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you pass the createSession parameter, all non-authenticated requests
will create a new hawk session and return it with the response, in the
Hawk-Session-Token header.&lt;/p&gt;
&lt;p&gt;If you want to only check a valid hawk session exists (without creating
a new one), just create a middleware which doesn't have any
createSession parameter defined.&lt;/p&gt;
&lt;h2 id="some-reference-implementations"&gt;Some reference implementations&lt;/h2&gt;
&lt;p&gt;As a reference, here is how we're using the libraries I'm talking about,
in case that helps you to integrate with your projects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Mozilla Loop server &lt;a href="https://github.com/mozilla-services/loop-server/blob/master/loop/index.js#L70-L133"&gt;uses hawk as authentication once you're
logged in with a valid BrowserID
assertion&lt;/a&gt;;
request, to keep a session between client and server;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/daybed/commit/f178b4e43015fa077430798dcd3d0886c7611caf"&gt;I recently added hawk support on the Daybed
project&lt;/a&gt;
(that's a pyramid / cornice) app.&lt;/li&gt;
&lt;li&gt;It's also interesting to note that Kumar put together &lt;a href="http://hawkrest.readthedocs.org/en/latest/"&gt;hawkrest, for
the django rest
framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Technologie"></category></entry><entry><title>Quel métier, quelle utilité ?</title><link href="https://blog.notmyidea.org/quel-metier-quelle-utilite.html" rel="alternate"></link><published>2014-07-29T00:00:00+02:00</published><updated>2014-07-29T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2014-07-29:/quel-metier-quelle-utilite.html</id><summary type="html">
&lt;p&gt;Aujourd'hui, mon métier est d'être développeur d'applications. Imaginer
des solutions techniques pour faire marcher des logiciels, puis écrire
les lignes de code nécessaires.&lt;/p&gt;
&lt;p&gt;Être Développeur n'est pas un métier qui a du sens en lui même (comme
peut l'être le métier d'instituteur/rice par exemple). Tout comme
lorsque l'on est …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Aujourd'hui, mon métier est d'être développeur d'applications. Imaginer
des solutions techniques pour faire marcher des logiciels, puis écrire
les lignes de code nécessaires.&lt;/p&gt;
&lt;p&gt;Être Développeur n'est pas un métier qui a du sens en lui même (comme
peut l'être le métier d'instituteur/rice par exemple). Tout comme
lorsque l'on est écrivain il est important de se poser des questions sur
les textes que l'on produit, pour qui et dans quel but; il est important
de se questionner sur l'utilité du métier de développeur, et sur
l'utilisation des contenus produits.&lt;/p&gt;
&lt;p&gt;Je suis un développeur parce que je défends certaines valeurs. Les
valeurs du partage de connaissances, de la collaboration, et de
l'émancipation.&lt;/p&gt;
&lt;p&gt;Je suis aussi développeur parce qu'il me plait de créer des contenus à
partir de "pas grand chose". La &lt;em&gt;magie&lt;/em&gt; de la création logicielle
m'anime, parce que j'ai l'impression qu'il est possible de faire des
choses géniales à partir de ce "pas grand chose". Donnez moi un
ordinateur et je vous crée une application de partage de semences
paysannes. Un peu comme il est possible de donner une feuille de papier
à un dessinateur pour se retrouver avec un univers magnifique couché
sur papier.&lt;/p&gt;
&lt;p&gt;Je me rends compte qu'au fur et à mesure des années, je me laisse
ramollir, absorber par le quotidien et me retrouve à ne plus me poser de
questions quant à l'utilité de mon métier. Pourquoi est-ce que je code ?
À qui cela sert il ? Quelle est ma motivation réelle ?&lt;/p&gt;
&lt;p&gt;En travaillant pour Mozilla, on pourrait croire que ce problème est
résolu de fait, puisque après tout, Mozilla, c'est les "protecteurs du
web", des gentils, et qu'on essaye nécessairement de faire les choses
bien…&lt;/p&gt;
&lt;h2 id="lomnipresence-technologique"&gt;L'omniprésence technologique&lt;/h2&gt;
&lt;p&gt;Je ne suis pas convaincu qu'utiliser la technologie de la manière dont
on le fait actuellement est systématiquement une bonne chose:&lt;/p&gt;
&lt;p&gt;Depuis 2 ans quasiment maintenant, Mozilla travaille sur un système
d'exploitation mobile, un remplaçant pour les iphones et androides, qui
utilise cette fois ci les technologies du web. Les avantages sont
multiples, et le principal intérêt est de faire un téléphone qui ne soit
pas au service des "gros" du Web mondial (Google et Apple).&lt;/p&gt;
&lt;p&gt;Ces "ordiphones" à destination des pays dits "émergents" sont d'ailleurs
construits à faible coût — toujours de manière honteuse, pour la plupart
en chine, dans les mêmes chaines de production que les autres
téléphones, mais c'est un autre débat.&lt;/p&gt;
&lt;p&gt;L'idée, assez intéressante d'un point de vue marché (les pays en
question n'ayant que peu de périphériques actuellement semblent un
terrain propice à la diffusion des "ordiphones"), est de donner accès à
la technologie, au Web à ces pays émergents.&lt;/p&gt;
&lt;p&gt;L'accès à la technologie pour tous me semble relever de la chimère
productiviste: je conçois que la technologie puisse être un pas en avant
assez fou, notamment lorsque l'on connaît la richesse des contenus qu'on
peut trouver sur le web, mais cette richesse vient aussi avec un certain
coût, que nous avons actuellement du mal, en tant qu'utilisateurs, à
contrôler et à mesurer. Les gens sont beaucoup beaucoup trop connectés.&lt;/p&gt;
&lt;p&gt;Je le suis par exemple bien plus souvent que ce que je voudrais
l'admettre, que ce soit pour regarder un film, lire mes emails,
communiquer avec des amis, faire de l'associatif, écrire du code, des
billets sur ces carnets…&lt;/p&gt;
&lt;p&gt;Cette technologie, omniprésente dans nos vies, je ne sais pas si c'est
un futur que je souhaite partager.&lt;/p&gt;
&lt;p&gt;Pour prendre un autre exemple, les bienfaits de la technologie ne
viennent pas seuls. Les réseaux sociaux, qui constituent une bonne part
de l'utilisation du Web, relèvent du culte de la personnalité, de
l'individualisme, et ce n'est pas ce développement que je souhaite pour
notre société.&lt;/p&gt;
&lt;p&gt;L'idée de base du Web, le fait de faire une toile de connaissances
ouverte et partagée entre tous est en train, petit à petit, de glisser
vers l'idée d'un outil de relai de l'information, où tout va vite, où
l'on ne prends guère plus le temps de lire autre chose que les titres
des quotidiens, ou des "tweets" de cent vingt caractères…&lt;/p&gt;
&lt;h2 id="des-outils-utiles"&gt;Des outils utiles&lt;/h2&gt;
&lt;p&gt;Bon an, mal an, je pense quand même que la technologie puisse être un
vecteur d'émancipation. Plus spécifiquement, je crois qu'il ne faut pas
laisser l'utilisation de la technologie aux "gros", aux entreprises, aux
états ou "spécialistes".&lt;/p&gt;
&lt;p&gt;Il est important de ne pas laisser ceux que l'on combat s'emparer des
"outils du pouvoir". La science, la technologie ou les médias sont
autant de champs qu'il est important de défendre, de conserver, de
s'approprier.&lt;/p&gt;
&lt;p&gt;Un des objectifs que je me fixe, pour les années à venir, ce que j'ai
envie de créer, c'est à la fois des outils utiles pour les
organisations, mais aussi éduquer à ces outils.&lt;/p&gt;
&lt;p&gt;Parce que l'éducation populaire ne s'arrête pas aux frontières du
numérique, parce qu'il est important de se battre avec les mêmes outils
que ce monde que l'on cherche parfois à combattre.&lt;/p&gt;
&lt;p&gt;Les outils sur lesquels j'ai envie d'être amené à travailler sont des
outils qui favorisent et questionnent la collaboration.&lt;/p&gt;
&lt;p&gt;Des outils comme etherpad par exemple, révolutionnent la manière de
prendre des notes en commun, et il reste énormément à faire sur le web à
ce propos.&lt;/p&gt;
&lt;p&gt;Nombre d'associations me demandent de plus en plus souvent ce qu'il en
est de Daybed, et de quand est-ce qu'on va pouvoir utiliser un système
de génération de formulaires en ligne, qui ne soit pas centré sur les
services de google…&lt;/p&gt;
&lt;p&gt;Allez, au boulot !&lt;/p&gt;
&lt;p&gt;PS: je me rends compte après relecture que ce billet fait echo à un
billet que j'ai écris juste alors que je terminais mes études, &lt;a href="%7Bfilename%7D2011.05.travailler-moins-mieux.rst"&gt;sur le
sens du travail et de
l'informatique&lt;/a&gt;, ça
fait du bien :)&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Retours sur deux ans à Mozilla</title><link href="https://blog.notmyidea.org/retours-sur-deux-ans-a-mozilla.html" rel="alternate"></link><published>2014-07-29T00:00:00+02:00</published><updated>2014-07-29T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2014-07-29:/retours-sur-deux-ans-a-mozilla.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;Ça fait un bail que j'ai cet article en cours de rédaction, et je me dis que je dois le poster maintenant, sinon je ne le ferais jamais (saloperie de perfectionnisme ?)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y à deux ans et demi, en décembre, je commençais à travailler chez
Mozilla, dans l'équipe "Cloud Services …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;Ça fait un bail que j'ai cet article en cours de rédaction, et je me dis que je dois le poster maintenant, sinon je ne le ferais jamais (saloperie de perfectionnisme ?)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y à deux ans et demi, en décembre, je commençais à travailler chez
Mozilla, dans l'équipe "Cloud Services".&lt;/p&gt;
&lt;p&gt;Depuis, énormément de choses ont évoluées, tant en ce qui concerne les
objectifs de Mozilla (avec l'arrivée de FirefoxOS) que le travail que
j'effectue au jour le jour. Pour autant, mes objectifs personnels
restent intacts.&lt;/p&gt;
&lt;p&gt;Deux ans ça parait énorme, c'est le temps le plus long que j'ai passé à
travailler sur un projet, avec quasiment les mêmes personnes. Si vous
suivez un peu ces carnets, vous savez surement que j'ai beaucoup
travaillé avec &lt;a href="ziade.org"&gt;Tarek&lt;/a&gt; par exemple.&lt;/p&gt;
&lt;p&gt;Ça a été (et c'est toujours) un réel plaisir de bosser avec la personne
dont j'avais lu les livres pour apprendre le python, merci !&lt;/p&gt;
&lt;h2 id="services"&gt;Services&lt;/h2&gt;
&lt;p&gt;Le principal de mon travail a été de construire des outils. Je suis le
mainteneur de &lt;a href="https://github.com/mozilla-services/cornice"&gt;Cornice&lt;/a&gt;, un
utilitaire qui vient se greffer par dessus &lt;a href="http://docs.pylonsproject.org/projects/pyramid/en/latest/"&gt;le framework python
pyramid&lt;/a&gt; pour
vous simplifier la vie et créer des services web; J'ai travaillé un peu
sur un outil de gestion des processus nommé
&lt;a href="https://github.com/mozilla-services/circus"&gt;Circus&lt;/a&gt;, et également sur
un outil de montée en charge dénommé
&lt;a href="https://github.com/mozilla-services/loads"&gt;Loads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Au tout début, j'ai travaillé sur un concept de &lt;a href="https://github.com/mozilla-services/tokenserver"&gt;serveur de
tokens&lt;/a&gt;. L'idée était
de désolidariser l'authentification des services web des services eux
mêmes.&lt;/p&gt;
&lt;p&gt;L'idée est (je pense) bonne mais le service n'a pas été utilisé durant
plus de deux ans. La raison étant principalement que Sync, pour lequel
le serveur de tokens a été écrit, a subi des changements majeurs (qui
sont rentrés en production il y a quelques semaines)&lt;/p&gt;
&lt;p&gt;Circus est né de besoins découverts via le token server, et il m'a
personnellement beaucoup appris. Le token server est finalement utilisé
dans la nouvelle version de Sync qui est rentrée en production il y a
peu.&lt;/p&gt;
&lt;h2 id="marketplace-chouette-on-va-casser-du-serveur"&gt;Marketplace ("chouette, on va casser du serveur")&lt;/h2&gt;
&lt;p&gt;Après 6 mois à travailler à Services, Tarek et moi avons commencé à
rejoindre l'équipe du Marketplace pour faire un travail d'"audit de
performance".&lt;/p&gt;
&lt;p&gt;L'idée était de prêter main forte à l'équipe du marketplace, mais les
détails étaient alors assez flous. Le code est assez indigeste au
premier abord, ce qui m'avait alors pas mal refroidi. La raison
principale étant que le code est utilisé à la fois par
addons.mozilla.org et par marketplace.firefox.com, rendant les choses
souvent un peu plus compliquées qu'il ne faudrait.&lt;/p&gt;
&lt;p&gt;Cet "audit" a été l'occasion de travailler sur des outils de montée en
charge assez sympa, qui ont donné naissance à un projet qu'on utilise
assez souvent maintenant, &lt;a href=""&gt;Loads&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Énormément d'efforts sont fait pour aller dans la bonne direction et
faire en sorte que le code soit plus facile à maintenir et que le projet
soit plus facile à aborder. D'ailleurs, pas mal de copains djangonautes
français travaillent dessus (salut &lt;a href="http://virgule.net"&gt;Mathieu&lt;/a&gt;, Yohan,
&lt;a href="http://larlet.fr"&gt;David&lt;/a&gt; et &lt;a href="http://mathieu.agopian.info"&gt;Mathieu
Agopian&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;Une partie de notre plan a été de sortir certaines fonctionnalités du
code actuel, pour en faire quelque chose de plus facile à maintenir et
de moins imbriqué.&lt;/p&gt;
&lt;h2 id="la-communaute"&gt;La Communauté&lt;/h2&gt;
&lt;p&gt;&lt;a href=""&gt;Circus&lt;/a&gt; et &lt;a href=""&gt;Cornice&lt;/a&gt; sont deux outils qui semblent utiles à la
communauté. J'ai eu des retours très positifs sur Cornice, et j'essaye
de le faire évoluer dans la direction qui me semble propice.&lt;/p&gt;
&lt;p&gt;D'ailleurs, Cornice est utilisé (par &lt;a href="http://blog.mathieu-leplatre.info/pages/about.html"&gt;Mathieu
L.&lt;/a&gt; — encore un —,
&lt;a href="http://twitter.com/natim"&gt;Rémy&lt;/a&gt; et moi) actuellement pour coder
&lt;a href="https://github.com/spiral-project/daybed"&gt;Daybed&lt;/a&gt; un service de
validation de formulaires, mais ça sera l'objet d'un futur billet.&lt;/p&gt;
&lt;p&gt;Circus commence à recevoir des contributions de plus en plus
intéressantes, et à être utilisé en interne chez nous et chez d'autres,
donc c'est une extrêmement bonne nouvelle.&lt;/p&gt;
&lt;h2 id="talkilla-loop"&gt;Talkilla / Loop&lt;/h2&gt;
&lt;p&gt;Après quelques temps, j'avais envie d'apprendre de nouveau. Python c'est
génial mais c'était devenu ma "zone de confort". J'adore découvrir des
choses, donc c'était le moment de faire en sorte que ça continue!&lt;/p&gt;
&lt;p&gt;C'était aussi l'occasion de travailler avec
&lt;a href="https://nicolas.perriault.net/"&gt;Nicolas&lt;/a&gt; et
&lt;a href="http://monkeypatch.me/blog/"&gt;Romain&lt;/a&gt;. Je suivais le projet Talkilla de
plus ou moins loin depuis quelques mois, c'était donc l'occasion à ne
pas manquer.&lt;/p&gt;
&lt;p&gt;En rentrant dans cette équipe, je cherchais principalement à avoir un
projet visible pour les utilisateurs finaux. Refaire un peu de frontend,
apprendre à faire du JavaScript propre et découvrir de nouvelles
personnes.&lt;/p&gt;
&lt;p&gt;J'y ai aussi récupéré une équipe qui essaye de suivre les principes de
l'agilité et qui est sur mon fuseau horaire (pour la plupart). Le rêve.&lt;/p&gt;
&lt;p&gt;L'idée derrière Talkilla est d'utiliser la technologie de communication
pair à pair dans les navigateurs (WebRTC) pour faire des appels audio /
vidéo. En d'autres termes, c'est un peu transformer votre firefox en
téléphone, sauf que personne ne peut espionner ce qui se passe entre
vous et l'autre bout du fil.&lt;/p&gt;
&lt;p&gt;A peine arrivé dans le projet (peut-être un mois et quelques après mon
débarquement) le choix a été fait de tout réécrire depuis zéro, dans un
projet qui se nomme actuellement "Loop", qui veut proposer la même
chose, mais inclus directement dans Firefox.&lt;/p&gt;
&lt;p&gt;C'est en bonne voie, on a quelque chose qui fonctionne dans nightly, et
le code du serveur fonctionne pas mal. Le code du serveur est ici:
&lt;a href="https://github.com/mozilla-services/loop-server"&gt;https://github.com/mozilla-services/loop-server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un client est en train d'être implémenté dans Firefox et un autre en
tant qu'application pour FirefoxOS. Le boulot ne s'arrête pas de
pleuvoir, mais je pense qu'on va dans une direction intéressante.&lt;/p&gt;
&lt;p&gt;Pour être complètement terminé, il faudrait qu'on soit capable de se
passer complètement de notre provider, TokBox (que l'on utilise en tant
que relai média), pour que n'importe qui puisse choisir d'utiliser son
propre serveur STUN / TURN et installe son serveur loop chez lui.&lt;/p&gt;
&lt;h3 id="le-travail-a-distance"&gt;Le travail à distance&lt;/h3&gt;
&lt;p&gt;Quand j'ai commencé à travailler à Mozilla, j'ai décidé de venir
m'installer à Paris. La plupart des personnes de mon entourage ont
d'ailleurs fait des gros yeux, parce qu'ils connaissaient mon avis sur
la ville en question, mais casser des préjugés n'est jamais une mauvaise
chose.&lt;/p&gt;
&lt;p&gt;Après deux ans passés à Paris, j'ai décidé de partir m'installer à
Rennes, puisque de toute manière, la plupart de mon travail s'effectue
au jour le jour à distance. En d'autres termes, la plupart de mon équipe
n'est pas à coté de moi quand je travaille, ce qui veut dire que je peux
travailler depuis n'importe où.&lt;/p&gt;
&lt;p&gt;Ce qui fonctionne pour moi, c'est de ne quasiment jamais travailler
depuis la maison. J'utilise &lt;a href="http://www.lacantine-rennes.net/"&gt;un espace de
coworking&lt;/a&gt; qui est un moyen de garder
ma vie perso séparée de ma vie privée et de rencontrer des gens
passionnés par ce qu'ils font.&lt;/p&gt;
&lt;p&gt;Depuis que je suis arrivé à Rennes, Rémy a commencé à travailler avec
moi, et c'est un réel bonheur que de pouvoir partager des journées de
travail. On "pair-prog" énormément et j'ai l'impression d'avoir un boost
dans ma productivité quotidienne.&lt;/p&gt;
&lt;h3 id="enseignements"&gt;Enseignements&lt;/h3&gt;
&lt;p&gt;Mozilla est ma première expérience professionnelle, et par conséquent,
je manque nécessairement de recul sur ce qui est acceptable et ce qui ne
l'est pas. D'une manière générale, avoir un environnement de travail
basé sur la confiance est réellement appréciable (La première réaction
des gens quand je dis que je peux travailler à distance, c'est de me
demander comment ils font pour être sur que je travaille. Et la réponse
est… il n'y en a pas).&lt;/p&gt;
&lt;p&gt;J'ai encore un peu de mal à savoir quels indicateurs utiliser pour
savoir si je suis "productif" ou non, mais j'ai globalement l'impression
que je manque de concentration et de discipline: beaucoup
d'interruptions n'aident pas à se concentrer.&lt;/p&gt;
&lt;p&gt;La motivation fluctue aussi énormément: un jour on est super motivé, un
autre c'est juste impossible de la trouver. Après quelques
expérimentations, le mieux (pour moi) est d'avoir des horaires fixes,
pour pouvoir séparer le travail du reste, de ne pas hésiter à faire des
pauses et d'écouter un peu ses envies et son corps (si je suis crevé, ça
ne sert à rien de se lever pour aller travailler, il vaut mieux se
reposer un peu pour être plus efficace ensuite, par exemple).&lt;/p&gt;
&lt;p&gt;J'ai essayé de tirer quelques enseignements de ces deux années:&lt;/p&gt;
&lt;h2 id="malheureusement-le-code-nest-pas-propre"&gt;Malheureusement, le code n'est pas propre&lt;/h2&gt;
&lt;p&gt;Je me rends compte que bien souvent je suis assez déçu de la qualité du
code que je regarde. Principalement parce que je ne suis pas capable de
le comprendre rapidement. Spécifiquement, ça m'est arrivé avec certaines
parties de &lt;a href="https://github.com/mozilla/zamboni"&gt;Zamboni&lt;/a&gt;, le code du
&lt;a href="http://marketplace.firefox.com"&gt;Marketplace&lt;/a&gt; dont je parlais plus haut,
avec certaines parties de Talkilla ou alors le code de Firefox lui même.&lt;/p&gt;
&lt;p&gt;C'était extrêmement frustrant pour moi de découvrir que le code écrit à
Mozilla n'était pas exemplaire. Tout le code qui est ajouté à l'heure
actuelle est revu, corrigé et validé par des pairs, mais un certain
nombre de projets ont un historique assez lourd qui rends leur structure
complexe.&lt;/p&gt;
&lt;p&gt;Je réalise donc que mon travail n'est pas uniquement de savoir écrire du
code propre, mais également de réussir à comprendre du code que je
considère comme "sale" (quitte à l'améliorer au passage !).&lt;/p&gt;
&lt;p&gt;Et c'est pas du gâteau; je m'attendais à réussir à comprendre des
projets complexes facilement, mais aucun miracle de ce coté là. Il faut
réussir à rester concentré pendant suffisamment longtemps pour pouvoir
tirer tous les fils et commencer à démêler… Pas facile !&lt;/p&gt;
&lt;h2 id="apprendre-est-un-processus-actif"&gt;Apprendre est un processus actif&lt;/h2&gt;
&lt;p&gt;Il est facile de passer à coté de l'apprentissage. Être entouré de gens
talentueux ne suffit pas pour continuer à apprendre.&lt;/p&gt;
&lt;p&gt;Savoir reconnaitre un échec est nécessaire. Dire que l'on comprends pour
éviter de passer pour un idiot est un biais qui se prends assez
rapidement, et qu'il faut éviter à tout prix.&lt;/p&gt;
&lt;p&gt;Surtout au début, c'était une erreur que je faisais énormément, une
question d'égo probablement.&lt;/p&gt;
&lt;p&gt;Il y a une espèce de honte de ne pas savoir, alors que tout le monde
autour sait ou en tout cas semble savoir. Bien souvent, les gens autour
ne savent pas non plus, ce qui mène à des discussions de comptoir, sans
trop savoir pourquoi.&lt;/p&gt;
&lt;p&gt;Connaître ses limites techniques est un bon début pour pouvoir les
surpasser. Chercher à les rencontrer est un processus actif.&lt;/p&gt;
&lt;p&gt;Le manque de temps m'empêche bien souvent de pouvoir prendre un livre
technique et de pouvoir l'apprécier. Je ne sais pas exactement pourquoi,
peut être par sur-dose, mais je n'ai ouvert que quelques rares livres
techniques durant ces deux années. Et j'aimerais bien que ça change !&lt;/p&gt;
&lt;h2 id="assez-bien-est-suffisant"&gt;"Assez bien" est suffisant&lt;/h2&gt;
&lt;p&gt;La culture de l'excellence se mets parfois au milieu du chemin. On
oublie souvent que "le mieux est l'ennemi du bien".&lt;/p&gt;
&lt;p&gt;Rien ne sert de faire des commits parfaits tout le temps. Quand j'ai
besoin de "hacker" sur un projet, je ne voulais d'abord pas tout péter,
par peur de ne plus m'y retrouver.&lt;/p&gt;
&lt;p&gt;Mon approche actuelle est bien différente: on mets les mains dans le
cambouis jusqu'à ce que ça marche, et ensuite on répare les dégâts.
Enfin… dans une certaine mesure hein !&lt;/p&gt;
&lt;h2 id="ecrire-des-boites-a-outils-et-non-pas-des-frameworks"&gt;Écrire des boites à outils et non pas des frameworks&lt;/h2&gt;
&lt;p&gt;Écrire des frameworks force les utilisateurs à les utiliser, et à les
connaitre dans les moindres recoins. Heureusement, il existe déjà
énormément de frameworks qui pour la plupart font très bien leur
travail. Ce qui nous manque ce n'est pas plus de frameworks, mais bel et
bien plus de boites à outils.&lt;/p&gt;
&lt;p&gt;Une boite à outil prends un problème bien défini et propose une solution
pour ce problème. Une boite à outils est, en mon sens, ce qu'on appelle
une bibliothèque. Pas besoin de réécrire tout votre projet pour utiliser
ma nouvelle bibliothèque afin de profiter des fonctionnalités qu'elle
apporte (alors que c'est le cas avec un framework, justement).&lt;/p&gt;
&lt;h2 id="etre-le-moteur-de-son-propre-changement"&gt;Être le moteur de son propre changement&lt;/h2&gt;
&lt;p&gt;Facile à dire, héhé ! D'une manière générale, je me rends compte qu'il
est facile de se plaindre sans pour autant être moteur du changement que
l'on souhaite voir arriver.&lt;/p&gt;
&lt;p&gt;Ça vaut le coup de se donner la peine de faire changer les choses,
surtout à Mozilla, parce que le changement n'est pas seulement vu d'un
mauvais œil.&lt;/p&gt;
&lt;p&gt;Pour que les choses évoluent, il faut être force de proposition. Se
plaindre n'a jamais servi à rien si ce n'est pas suivi d'actes ;)&lt;/p&gt;
&lt;p&gt;Je dis de temps en temps que Mozilla est une "do-o-cratie" (celui qui
fait à raison), et je le pense de plus en plus. Quand j'ai envie que
quelque chose soit fait, et bah… il faut le faire !&lt;/p&gt;
&lt;h2 id="ne-pas-chercher-a-avoir-raison"&gt;Ne pas chercher à avoir raison&lt;/h2&gt;
&lt;p&gt;Peu importe qui a raison, l'important n'est pas de chercher à montrer
que tu sais, mais de trouver ce qui est juste. Ça parait peut être
évident, mais bien souvent on cherche à se mettre en avant, au
détriment du projet… Allez, gardons nos égos de coté ;)&lt;/p&gt;
&lt;h2 id="arreter-le-negativisme"&gt;Arrêter le négativisme&lt;/h2&gt;
&lt;p&gt;Il est très facile de se laisser embarquer dans le négativisme. Il y a
toujours des choses qui ne vont pas, et probablement il y en aura
toujours. Ce ne sont pas des raisons suffisantes pour perdre le moral.
Identifier les points faibles est important est permet de savoir ce
qu'il est nécessaire d'améliorer, mais regarder les choses du coté
positif (et il y en a nécessairement un !) est indispensable !&lt;/p&gt;
&lt;p&gt;À plusieurs reprises je me suis retrouvé dans des crises de négativisme,
pour un tas de raisons différentes. La meilleure manière de s'en sortir:
en causer et trouver des solutions, prendre le problème à bras le corps,
et ne pas considérer que c'est un problème sur lequel on a aucune prise
possible.&lt;/p&gt;
&lt;h3 id="la-suite"&gt;La suite ?&lt;/h3&gt;
&lt;p&gt;Je n'ai aucune idée d'à quoi va ressembler la suite, et c'est justement
ce que j'apprécie et qui m'effraie en même temps…&lt;/p&gt;
&lt;p&gt;Je fais actuellement énormément de Javascript et je travaille sur des
projets qui semblent avoir plus de sens qu'avant (même si je vois déjà
des choses que je souhaiterais améliorer, mais chaque chose en son
temps). Donc techniquement j'apprends et dans ma quête de faire des
produits qui touchent un utilisateur.&lt;/p&gt;
&lt;p&gt;Depuis quelques semaines, je peux travailler une journée par semaine sur
un projet qui me tiens vraiment à cœur: daybed
(&lt;a href="http://daybed.rtfd.org"&gt;http://daybed.rtfd.org&lt;/a&gt;). L'objectif est de faire en sorte que le
projet avance et soit utilisé au sein de mozilla.&lt;/p&gt;
&lt;p&gt;Avant toute autre chose, il faudra faire des changements de "pitch" pour
qu'il soit plus simple d'expliquer ce que Daybed souhaite faire, mais…
c'est une autre histoire.&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Des carnets d'esquisse</title><link href="https://blog.notmyidea.org/des-carnets-desquisse.html" rel="alternate"></link><published>2013-08-16T00:00:00+02:00</published><updated>2013-08-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-08-16:/des-carnets-desquisse.html</id><summary type="html">
&lt;p&gt;Je me rends compte que je n'écris pas si souvent que ça ici,
principalement parce que je me sens obligé d'y écrire en Anglais, mais
aussi parce que je le considère comme un espace ou les choses doivent
êtres abouties et non pas expérimentales.&lt;/p&gt;
&lt;p&gt;Des fois j'ai cette envie d'ouvrir …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je me rends compte que je n'écris pas si souvent que ça ici,
principalement parce que je me sens obligé d'y écrire en Anglais, mais
aussi parce que je le considère comme un espace ou les choses doivent
êtres abouties et non pas expérimentales.&lt;/p&gt;
&lt;p&gt;Des fois j'ai cette envie d'ouvrir un "carnet" et d'y jeter juste
quelques notes. Pas grand chose: mes quelques pensées ou alors des liens
que je veux me garder de coté, des pensées que je souhaite partager… Un
endroit ou je peux venir écrire quelque chose et le compléter plus tard.&lt;/p&gt;
&lt;p&gt;Du coup, le flux Atom contiens désormais quelques notes sur des sujets
variés. Ces notes ne sont pas relayées sur la page d'accueil, mais vous
pouvez les trouver dans &lt;a href="%7Ccategory%7Cnotes"&gt;la section notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je ne sais pas encore si il s'agit du meilleur endroit pour ça, mais peu
importe, essayons. A bas la pudeur rédactionelle.&lt;/p&gt;
&lt;p&gt;J'ai du au passage chambouler un peu vos agrégateurs, pardonnez moi :)&lt;/p&gt;
&lt;h2 id="le-retour-des-commentaires"&gt;Le retour des commentaires&lt;/h2&gt;
&lt;p&gt;Au passage, je ne me rappelle plus quand exactement, mais j'avais décidé
de supprimer les commentaires de cet espace. Paf, apu. Comme ça, sans
prévenir.&lt;/p&gt;
&lt;p&gt;Les raisons en étaient à la fois techniques (je ne souhaitait pas avoir
recours à disqus qui est un silo propriétaire de plus) et parce que je
considérais que les commentaires n'avaient que peu d'intérêt. Ceci dit,
le manque d'échange me manque; j'aimerais bien savoir ce que vous pensez
de ce que j'écris des fois, et avoir des débats si nos opinions
divergent.&lt;/p&gt;
&lt;p&gt;Et puis bon, partager dans un seul sens, c'est un peu dommage !&lt;/p&gt;
&lt;p&gt;Il est maintenant possible, avec &lt;a href="http://talka.tv"&gt;talka.tv&lt;/a&gt; d'héberger
soi même ses commentaires. J'ai dans l'idée d'héberger une instance de
ce service sur discus.notmyidea.org, ou d'utiliser Daybed pour faire la
même chose, mais faut il encore que je le fasse, alors en attendant,
j'ai réactivé disqus ici! (Le mieux est l'ennemi du bien, paraît il !)&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>François Elie : Quelle école pour la société de linformation ?</title><link href="https://blog.notmyidea.org/francois-elie-quelle-ecole-pour-la-societe-de-linformation.html" rel="alternate"></link><published>2013-06-14T00:00:00+02:00</published><updated>2013-06-14T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-06-14:/francois-elie-quelle-ecole-pour-la-societe-de-linformation.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference"&gt;http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quelques bouts selectionnés.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mais pourquoi continue t-on à enseigner des maths à des gens qui ne
vont pas les utiliser ? Ben évidemment cest parce quon nest pas
dans une école de linitiation où les mathématiciens …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference"&gt;http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quelques bouts selectionnés.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mais pourquoi continue t-on à enseigner des maths à des gens qui ne
vont pas les utiliser ? Ben évidemment cest parce quon nest pas
dans une école de linitiation où les mathématiciens font ça entre eux
et on nest pas non plus dans une école de lapprentissage où lécole
a pour but de donner un métier, un bagage utilisable. Lécole ne sert
évidemment pas à ça. Dailleurs heureusement parce que sinon on
nenseignerait pas la philosophie qui ne sert à rien à part
fabriquer des profs de philosophie !&lt;/p&gt;
&lt;p&gt;On na pas besoin de tableau numérique pour enseigner linformatique
elle-même pour enseigner la science. De la même façon on na pas
besoin de machine à calculer pour enseigner les mathématiques.
Évidemment ! On na pas besoin dune machine à calculer pour savoir
faire une division. Au contraire, surtout pas !&lt;/p&gt;
&lt;p&gt;Il faut cesser dopposer lenseignement de la programmation dune part
et lenseignement des usages, cest important mais ça cest lécole
des maîtres et des esclaves. Ce quil faut enseigner, vite et à tous,
cest la science, pas la technologie ou lusage. Cest en amont de la
programmation, lalgorithmique. Cest, en amont de telle
instanciation, du codage, du chiffrement, la théorie, quelque chose
qui comme les maths nont besoin que dune craie et dun tableau noir.&lt;/p&gt;
&lt;p&gt;Ce n'est pas un hasard si le mot "numérique" à remplaçé le mot
"informatique", c'est qu'on voudrait nous faire croire qu'il n'y a pas
besoin de l'apprendre.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Notes"></category></entry><entry><title>Notes: Économie libidinale et économie politique</title><link href="https://blog.notmyidea.org/notes-economie-libidinale-et-economie-politique.html" rel="alternate"></link><published>2013-06-07T00:00:00+02:00</published><updated>2013-06-07T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-06-07:/notes-economie-libidinale-et-economie-politique.html</id><summary type="html">
&lt;p&gt;Une enquete d'un cabinet de marketing american ARI qui pour la première
fois en 2004 disait qu'on voyait aparaitre des "alter consommateurs",
qui n'étaient pas de gens qui consommaient moins, mais qui étaient des
gens malheureux de consommer. Et qui définissaient la consommation comme
une dépendance et une addiction.&lt;/p&gt;
&lt;p&gt;Un …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Une enquete d'un cabinet de marketing american ARI qui pour la première
fois en 2004 disait qu'on voyait aparaitre des "alter consommateurs",
qui n'étaient pas de gens qui consommaient moins, mais qui étaient des
gens malheureux de consommer. Et qui définissaient la consommation comme
une dépendance et une addiction.&lt;/p&gt;
&lt;p&gt;Un autre comportement s'est développé: le modèle "collaboratif et
contributif". Ce modèle ne se repose pas sur la consommation mais sur
l'implication et la collaboration. Ce modèle est induit par internet,
qui ne repose plus sur l'opposition production / consommation.&lt;/p&gt;
&lt;p&gt;Sur internet nous ne sommes pas des simples consommateurs, puisque vous
êtes un expéditeur / distributeur.&lt;/p&gt;
&lt;p&gt;Le changement prduit par internet est le fait que les gens ne sont plus
simplement des consommateurs,mais sont également producteurs de contenus
/ viennent améliorer les contenus existants.&lt;/p&gt;
&lt;p&gt;Note perso: quid du culte de la personalité qui en ressort ? Ce qu'il
apelle l'écologie relationelle ?&lt;/p&gt;
&lt;p&gt;Quel est le manque que vient combler facebook par exemple ? Et quel est
l'impact que ces nouveaux réseaux ont sur les modèles relationels que
l'ont connait (famille, école, droit, etc.).&lt;/p&gt;
&lt;h2 id="citations"&gt;Citations&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Une révolution c'est le fait de faire une boucle est d'arriver au
terme de quelque chose. D'avoir clôt un cycle. La lune fait des
révolutions aussi.&lt;/p&gt;
&lt;p&gt;81% des Américains déclarent que le consumerisme est une plaie pour
l'amérique (d'après Juliet Score)&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Notes"></category></entry><entry><title>Le revenu de base</title><link href="https://blog.notmyidea.org/le-revenu-de-base.html" rel="alternate"></link><published>2013-03-10T00:00:00+01:00</published><updated>2013-03-10T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-03-10:/le-revenu-de-base.html</id><summary type="html">
&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/-cwdVDcm-Z0"
frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Quelques notes prises en visualisant le documentaire "le revenu de
base".&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 Allemands sur 10 travaillent.&lt;/li&gt;
&lt;li&gt;3/10 (les enfants et jeunes)&lt;/li&gt;
&lt;li&gt;2/10 retraite / rente&lt;/li&gt;
&lt;li&gt;1/10 assurance chomage / AS&lt;/li&gt;
&lt;li&gt;41% sont le fruit d'un travail rémunéré.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le revenu de base est inconditionnel.&lt;/p&gt;
&lt;p&gt;Le marché du travail ne pourra …&lt;/p&gt;</summary><content type="html">
&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/-cwdVDcm-Z0"
frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Quelques notes prises en visualisant le documentaire "le revenu de
base".&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 Allemands sur 10 travaillent.&lt;/li&gt;
&lt;li&gt;3/10 (les enfants et jeunes)&lt;/li&gt;
&lt;li&gt;2/10 retraite / rente&lt;/li&gt;
&lt;li&gt;1/10 assurance chomage / AS&lt;/li&gt;
&lt;li&gt;41% sont le fruit d'un travail rémunéré.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le revenu de base est inconditionnel.&lt;/p&gt;
&lt;p&gt;Le marché du travail ne pourra pas suffire à toute la population. En
refusant l'idée du RDB, on est obligé de croire en la croissance
économique.&lt;/p&gt;
&lt;p&gt;Différence entre une approche qantitative du travail VS une approche
sociale.&lt;/p&gt;
&lt;p&gt;La croissance éco ≠ croissance de l'emploi.&lt;/p&gt;
&lt;p&gt;Parallelle entre le RDB et la déclaration des droits de l'homme. "Et qui
voudra faire le sale boulot ?"&lt;/p&gt;
&lt;p&gt;Utopie veut dire le "non lieu", le lieu qu'on à pas encore trouvé ici
sur terre, à part dans notre imaginaire.&lt;/p&gt;
&lt;p&gt;Agriculture: Il y à 100 ans, qqn qui travaillait dans l'agriculture
produisait assez pour 3 autres personnes. ajd un agriculteur produit
assez pour 120 personnes, via des machines énormes et à la
rationalisation.&lt;/p&gt;
&lt;p&gt;Rationalisation: moins d'emploi.&lt;/p&gt;
&lt;p&gt;La condition de pouvoir refuser un travail est très importante.&lt;/p&gt;
&lt;h2 id="citations"&gt;Citations&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Le financmenet est acquis, la dificulté c'est la liberté&lt;/p&gt;
&lt;p&gt;— NA&lt;/p&gt;
&lt;p&gt;Il faut en finir avec cette idée fausse, selon laquelle seul le
travail rémunéré constitue une contribution méritoire à la société, en
réalité, c'est souvent exactement l'inverse.&lt;/p&gt;
&lt;p&gt;— Katja Kipping, membre du parlement allemand.&lt;/p&gt;
&lt;p&gt;Si les gens on déjà une sécurité matérielle, ils sont plus difficiles
à corrompre.&lt;/p&gt;
&lt;p&gt;— Katja Kipping&lt;/p&gt;
&lt;p&gt;Soutenir les populations sans poser de condition. c'est un principe
qui à la longe, devra s'imposer. Mais il lui faudra d'abord affronter
les droits et privilèges dont on bénéficie aujourd'hui.&lt;/p&gt;
&lt;p&gt;— Anonyme.&lt;/p&gt;
&lt;p&gt;Si les revenus étaient uniquement lié au travail, il faudrait donner
les plus hauts revenus aux machines.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le sens de l'économie, c'est de libérer l'homme du travail Beaucoup de
gens qui ont une "place de travail", n'ont en réalité qu'une "place de
revenu".&lt;/p&gt;
&lt;h2 id="chiffres"&gt;Chiffres&lt;/h2&gt;
&lt;p&gt;Un sondage à été effectué. La question est: "Si vous aviez un revenu de
base, est-ce que vous iriez encore travailler ?"&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;\~60% disent oui&lt;/li&gt;
&lt;li&gt;30% répondent oui, mais plus à plein temps.&lt;/li&gt;
&lt;li&gt;10% pour faire autre chose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec une question différente:&lt;/p&gt;
&lt;p&gt;"Si on instaurait un revenu de base, est-ce que vous pensez que les
autres iraient travailler ?"&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;\~80% répondent non.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est un changement aussi dans les modes d'éducation, on nous enseigne à
être "employable", et non pas à apprendre quelque chose qui nous
interesse. Les gens ont peur de ne pas trouver du travail.&lt;/p&gt;
&lt;h2 id="ressources"&gt;Ressources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Le sens commun, Thomas Payne.&lt;/li&gt;
&lt;li&gt;Peter Ulrich&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="comment-financer-le-rdb"&gt;Comment financer le RDB&lt;/h2&gt;
&lt;p&gt;Si lon se fie à son produit intérieur brut (PIB), la France est
aujourdhui le cinquième pays le plus riche du monde. En 2010, le
revenu disponible (après versement des pres- tations sociales et
prélèvement des impôts directs) sy élevait à 1 276 euros par mois et
par personne, adultes et enfants confondus. Nous disposons donc de
ressources suffisantes pour garantir à chaque individu 1 276 euros si
lon décidait dopérer un partage strictement égalitaire. Cest
nettement plus que le seuil de pauvreté actuel, fixé en France à 60 % du
revenu médian (1), soit 960 euros par adulte. Qui peut le plus pouvant
le moins, la France a donc sans nul doute les moyens dassurer à tous
ses résidents un revenu au moins égal au seuil de pauvreté.&lt;/p&gt;
&lt;h2 id="a-reculons-par-andre-gorz"&gt;À Reculons, par André Gorz.&lt;/h2&gt;
&lt;p&gt;(Paru dans le monde diplomatique de Juin 1990)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Proche de Jean-Paul Sartre, cofondateur, en 1964, du Nouvel
Observateur, le philosophe André Gorz (1923-2007) sest converti
progressivement à un écosocialisme dont il est devenu lun des
principaux théoriciens. En 1990, dans nos colonnes, sous le titre «
Pourquoi la société salariale a besoin de nouveaux valets », il
formulait une critique de lidéologie du travail qui devait lamener
quelques années plus tard à se prononcer en faveur dun revenu
dexistence.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dans lensemble des pays capitalistes dEurope, on produit trois à
quatre fois plus de richesses quil y a trente-cinq ans ; cette
production nexige pas trois fois plus dheures de travail, mais une
quantité de travail beaucoup plus faible. (...)&lt;/p&gt;
&lt;p&gt;Nous sortons de la civilisation du travail, mais nous en sortons à
reculons, et nous entrons à reculons dans une civilisation du temps
libéré, incapables de la voir et de la vouloir, incapables donc de
civiliser le temps libéré qui nous échoit, et de fonder une culture du
temps disponible et une culture des activités choisies pour relayer et
compléter les cultures techniciennes et profes- sionnelles qui dominent
la scène. (...)&lt;/p&gt;
&lt;p&gt;Pour près de la moitié de la population active, lidéologie du travail
est devenue une mauvaise farce ; lidentification au travail est
désormais impossible, car le système économique na pas besoin ou na
pas un besoin régulier de leur capacité de travail. La réalité que nous
masque lexaltation de la « ressource humaine », cest que lemploi
stable, à plein temps, durant toute lannée et toute la vie active,
devient le privilège dune minorité. Pour [les autres], le travail
cesse dêtre un métier qui intègre dans une communauté productive et
définit une place dans la société. Ce que le patronat appelle «
flexibilité » se traduit pour les salariés par la précarité. (...)&lt;/p&gt;
&lt;p&gt;Que doit être une société dans laquelle le travail à plein temps de tous
les citoyens nest plus nécessaire, ni économiquement utile ? Quelles
priorités autres quéconomiques doit-elle se donner ? Comment doit-elle
sy prendre pour que les gains de productivité, les économies de temps
de travail profitent à tout le monde ? Comment peut-elle redistribuer au
mieux tout le travail socialement utile de manière à ce que tout le
monde puisse travailler, mais travailler moins et mieux, tout en
recevant sa part des richesses socialement produites ?&lt;/p&gt;
&lt;p&gt;La tendance dominante est décarter ce genre de questions et de poser le
problème à lenvers : comment faire pour que, malgré les gains de
productivité, léconomie consomme autant de travail que par le passé ?
Comment faire pour que de nouvelles activités rémunérées viennent
occuper ce temps que, à léchelle de la société, les gains de
productivité libèrent ? A quels nouveaux domaines dactivité peut-on
étendre les échanges marchands pour remplacer tant bien que mal les
emplois supprimés par ailleurs dans lindustrie et les services
industrialisés ?&lt;/p&gt;
&lt;p&gt;On connaît la réponse, pour laquelle les Etats-Unis et le Japon ont
montré la voie : le seul domaine dans lequel il est possible, en
économie libérale, de créer à lavenir un grand nombre demplois, cest
celui des services aux personnes. Le développement de lemploi pourrait
être illimité si lon parvenait à transformer en prestations de
services rétribuées les activités que les gens ont, jusquà présent,
assumées chacun pour soi. Les économistes parlent à ce sujet de «
nouvelle croissance plus riche en emplois », de « tertiarisation » de
léconomie, de « société de services » prenant le relais de la «
société industrielle » (1). (...)&lt;/p&gt;
&lt;p&gt;Le problème de fond auquel nous sommes confrontés est celui dun au-delà
de léconomie et, ce qui revient au même, dun au- delà du travail
rémunéré. La rationalisation économique libère du temps, elle
continuera den libérer, et il nest plus possible, par conséquent, de
faire dépendre le revenu des citoyens de la quantité de travail dont
léconomie a besoin. Il nest plus possible, non plus, de continuer à
faire du travail rémunéré la source principale de lidentité et du sens
de la vie pour chacun.&lt;/p&gt;
&lt;p&gt;La tâche dune gauche, si gauche il doit y avoir, consiste à transformer
cette libération du temps en une liberté nouvelle et en des droits
nouveaux : le droit de chacun et de chacune de gagner sa vie en
travaillant, mais en travaillant de moins en moins, de mieux en mieux,
tout en recevant sa pleine part de la richesse socialement produite. Le
droit, dautre part, de travailler de façon discontinue, intermittente,
sans perdre durant les intermittences de lemploi le plein revenu de
manière à ouvrir de nouveaux espaces aux activités sans but économique
et à reconnaître à ces activités qui nont pas la rémunération pour but
une dignité et une valeur éminentes, tant pour les individus que pour la
société elle-même.&lt;/p&gt;</content><category term="Notes"></category></entry><entry><title>Des profils de confiance partout et pour tout ?</title><link href="https://blog.notmyidea.org/des-profils-de-confiance-partout-et-pour-tout.html" rel="alternate"></link><published>2013-02-04T00:00:00+01:00</published><updated>2013-02-04T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-02-04:/des-profils-de-confiance-partout-et-pour-tout.html</id><summary type="html">
&lt;p&gt;Depuis un petit moment déjà, le site covoiturage.fr est passé "payant".
Il est désormais possible (et même obligatoire) de payer les trajets à l'avance, et en ligne, laissant au passage quelques royalties au site en question.&lt;/p&gt;
&lt;p&gt;Précédemment, il était possible de retrouver le numéro des conducteur sur le site …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Depuis un petit moment déjà, le site covoiturage.fr est passé "payant".
Il est désormais possible (et même obligatoire) de payer les trajets à l'avance, et en ligne, laissant au passage quelques royalties au site en question.&lt;/p&gt;
&lt;p&gt;Précédemment, il était possible de retrouver le numéro des conducteur sur le site et de les appeler soi même, chose maintenant automatisée.&lt;/p&gt;
&lt;p&gt;Dès que cette décision à été prise, il y a eu des émules. Le site
&lt;a href="http://covoiturage-libre.fr"&gt;Covoiturage Libre&lt;/a&gt; à été d'ailleurs créé pour faire en sorte de garder "l'esprit" du covoiturage. Bref ça jasait dans les chaumières.&lt;/p&gt;
&lt;p&gt;Il y à peu, j'ai reçu un &lt;em&gt;couriel&lt;/em&gt; contenant un lien vers une vidéo d'&lt;a href="http://www.covoiturage.fr/blog/2013-confiance"&gt;une conférence animée par le fondateur de
covoiturage.fr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ils semblent vouloir parler de confiance, alors ça m'intrigue, d'autant que la présentation en question est donnée lors d'un évènement TEDx, auquel j'accorde un certain crédit.&lt;/p&gt;
&lt;h2 id="un-capital-de-confiance"&gt;Un "capital de confiance"&lt;/h2&gt;
&lt;p&gt;Cette vidéo parle entre autres du &lt;em&gt;capital de confiance&lt;/em&gt; que nous pouvons nous accorder les uns aux autres; et notamment du fait que ce capital de confiance n'est malheureusement pas partagé au dela d'un cercle de connaissances assez limité. Il reste dans notre cercle de connaissances proche, les amis des amis.&lt;/p&gt;
&lt;p&gt;C'est donc une chose regrettable, parce que ça nous fait perdre du temps (et donc, &lt;em&gt;ohmygod&lt;/em&gt; de l'argent) à tous pour construire cette confiance. Temps qui pourrait être mieux employé.&lt;/p&gt;
&lt;p&gt;La solution proposée, attention les yeux, est de faire appel un maximum aux profils en ligne, une manière de "prouver au monde" que nous sommes des personnes de confiance. Selon les termes de la présentation, nous pourrions alors tous devenir des "super héros du trust", des "trustman".&lt;/p&gt;
&lt;p&gt;Grâce à des profils en ligne ou monsieur et madame tout le monde pourraient aller voter et donner leur avis sur les personnes qu'ils ont rencontré.&lt;/p&gt;
&lt;h2 id="lavenement-du-paiement-en-ligne"&gt;L'avènement du paiement en ligne&lt;/h2&gt;
&lt;p&gt;On nous dit maintenant que le paiement en ligne est une révolution, un moyen de tracer le fait qu'il y à effectivement eu une transaction entre deux personnes; et que donc il en deviendrait un outil pour vérifier que la confiance est bien légitime, et non pas créée de toute pièce sur le profil de la personne en question.&lt;/p&gt;
&lt;p&gt;Plus exactement, ce qui est dit est que le paiement en ligne permet de justifier qu'il y a bien eu transaction entre deux personnes, et que donc les commentaires et "notations" effectuées sont donc légitimes.&lt;/p&gt;
&lt;h2 id="ce-nest-pas-un-probleme-de-confiance"&gt;Ce n'est pas un problème de confiance !&lt;/h2&gt;
&lt;p&gt;Bien que j'arrive à suivre le raisonnement, il soulève certaines
questions :&lt;/p&gt;
&lt;p&gt;Si j'accorde de la confiance à quelqu'un dans mon cercle de
connaissances, c'est justement parce qu'il fait partie de ce cercle de connaissances. Pas parce qu'une personne que je ne connait pas me dit qu'il s'agit d'une personne de confiance. En d'autres termes, &lt;strong&gt;pourquoi ne garderions nous pas ces relations privilégiées de personne à personne ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans le cadre du covoiturage, j'arrive à comprendre le raisonnement du paiement &lt;em&gt;à l'avance&lt;/em&gt;, pour avoir souvent entendu parler de désistements à la dernière minute de la part des voyageurs. Le paiement à l'avance permet d'éviter ce genre de désagréments.&lt;/p&gt;
&lt;p&gt;Mais cela n'as rien à voir avec la confiance, il s'agit d'engagement de la part des deux parties.&lt;/p&gt;
&lt;p&gt;Et c'est bien ce qui semble poser problème: lorsqu'on s'attend à
partager le prix d'un trajet avec quelqu'un, c'est bien d'avoir quelque chose qui nous y engage. J'aime beaucoup l'idée de payer une fois dans la voiture, de garder cette transaction manuelle; et de laisser peu de place au paiements en ligne dans cette histoire, mais je n'ai pas d'autre solution miracle.&lt;/p&gt;
&lt;p&gt;En tout cas, la question n'est pas la question de savoir avec qui on embarque, mais bel et bien la question de l'engagement des deux parties.&lt;/p&gt;
&lt;p&gt;Nous sommes malheureusement dans une société qui est dirigée par la peur. On à peur de se faire agresser par le gars qui tends le pouce sur le bord de la route, peur de se faire envoyer un produit qui ne fonctionne pas via Amazon, etc.&lt;/p&gt;
&lt;p&gt;En poussant l'idée dans ses retranchements, j'aurais bientôt peur de mes voisins alors je ne leur parlerais plus, parce qu'ils n'ont pas leur profil disponible en ligne ou parce que quelqu'un à eu une mauvaise expérience avec eux ?&lt;/p&gt;
&lt;p&gt;Exposer des choses qui relèvent de ma vie privée en ligne de la sorte me pose des problèmes éthiques: d'abord parce que je ne veux pas juger les gens a priori, ensuite parce que l'expérience d'une personne n'est peut-être pas représentative, tout simplement.&lt;/p&gt;
&lt;p&gt;Donc non, ce n'est pas un problème de confiance, il s'agit d'un problème d'engagement, dans le cadre du covoiturage, et les profils en ligne n'ont rien à faire la dedans. Le principe du paiement à l'avance me semble intéressant, mais il n'est à mon avis pas lié au profils en ligne.&lt;/p&gt;
&lt;p&gt;La vidéo termine sur un "libérez la valeur de la confiance". Oui, mais la libérer pour qui ? Quels sont les problèmes liés à cette confiance rendue nécessaire partout et pour tout ? Cela ne nous ferait-il pas évoluer uniquement dans des cercles fermés ? &lt;/p&gt;
&lt;p&gt;Quelle place laisser à l'inconnu, à la surprise ?&lt;/p&gt;
&lt;p&gt;Cette volonté de "confiance partout" semble découler tout droit des délires sécuritaires que l'on nous sert à toutes les sauces. Et
maintenant cela serait rendu accessible à tous grâce à "l'intelligence collective"; gommant au passage les différences de valeur; Préférant éviter de rencontrer les inconnus aux profils "légers".&lt;/p&gt;
&lt;p&gt;Je sais pas vous, mais elle me fait peur cette idée.&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Implementing CORS in Cornice</title><link href="https://blog.notmyidea.org/implementing-cors-in-cornice.html" rel="alternate"></link><published>2013-02-04T00:00:00+01:00</published><updated>2013-02-04T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-02-04:/implementing-cors-in-cornice.html</id><summary type="html">
&lt;div class="note"&gt;
&lt;div class="admonition-title"&gt;
Note
&lt;/div&gt;
I'm cross-posting [on the mozilla services
weblog](https://blog.mozilla.org/services/). Since this is the first
time we're doing that, I though it could be useful to point you there.
Check it out and expect more technical articles there in the future.
&lt;/div&gt;
&lt;p&gt;For security reasons, it's not possible …&lt;/p&gt;</summary><content type="html">
&lt;div class="note"&gt;
&lt;div class="admonition-title"&gt;
Note
&lt;/div&gt;
I'm cross-posting [on the mozilla services
weblog](https://blog.mozilla.org/services/). Since this is the first
time we're doing that, I though it could be useful to point you there.
Check it out and expect more technical articles there in the future.
&lt;/div&gt;
&lt;p&gt;For security reasons, it's not possible to do cross-domain requests. In
other words, if you have a page served from the domain lolnet.org, it
will not be possible for it to get data from notmyidea.org.&lt;/p&gt;
&lt;p&gt;Well, it's possible, using tricks and techniques like
&lt;a href="http://en.wikipedia.org/wiki/JSONP"&gt;JSONP&lt;/a&gt;, but that doesn't work all
the time (see &lt;a href="#how-this-is-different-from-jsonp"&gt;the section below&lt;/a&gt;). I
remember myself doing some simple proxies on my domain server to be able
to query other's API.&lt;/p&gt;
&lt;p&gt;Thankfully, there is a nicer way to do this, namely, "Cross Origin
Resource-Sharing", or &lt;a href="http://www.w3.org/TR/cors/"&gt;CORS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="you-want-an-icecream-go-ask-your-dad-first"&gt;You want an icecream? Go ask your dad first.&lt;/h2&gt;
&lt;p&gt;If you want to use CORS, you need the API you're querying to support it;
on the server side.&lt;/p&gt;
&lt;p&gt;The HTTP server need to answer to the OPTIONS verb, and with the
appropriate response headers.&lt;/p&gt;
&lt;p&gt;OPTIONS is sent as what the authors of the spec call a "preflight
request"; just before doing a request to the API, the &lt;em&gt;User-Agent&lt;/em&gt; (the
browser most of the time) asks the permission to the resource, with an
OPTIONS call.&lt;/p&gt;
&lt;p&gt;The server answers, and tell what is available and what isn't:&lt;/p&gt;
&lt;p&gt;&lt;img alt="The CORS flow (from the HTML5 CORS tutorial)" src="images/cors_flow.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1a. The User-Agent, rather than doing the call directly, asks the
server, the API, the permission to do the request. It does so with
the following headers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access-Control-Request-Headers&lt;/strong&gt;, contains the headers the
User-Agent want to access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access-Control-Request-Method&lt;/strong&gt; contains the method the
User-Agent want to access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1b. The API answers what is authorized:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access-Control-Allow-Origin&lt;/strong&gt; the origin that's accepted. Can
be * or the domain name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access-Control-Allow-Methods&lt;/strong&gt; a &lt;em&gt;list&lt;/em&gt; of allowed methods.
This can be cached. Note than the request asks permission for
one method and the server should return a list of accepted
methods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access-Allow-Headers&lt;/strong&gt; a list of allowed headers, for all of
the methods, since this can be cached as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;The User-Agent can do the "normal" request.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, if you want to access the /icecream resource, and do a PUT there,
you'll have the following flow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt; OPTIONS /icecream&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; Access-Control-Request-Methods = PUT&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; Origin: notmyidea.org&lt;/span&gt;
&lt;span class="err"&gt;&amp;lt; Access-Control-Allow-Origin = notmyidea.org&lt;/span&gt;
&lt;span class="err"&gt;&amp;lt; Access-Control-Allow-Methods = PUT,GET,DELETE&lt;/span&gt;
&lt;span class="err"&gt;200 OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see that we have an Origin Header in the request, as well as a
Access-Control-Request-Methods. We're here asking if we have the right,
as notmyidea.org, to do a PUT request on /icecream.&lt;/p&gt;
&lt;p&gt;And the server tells us that we can do that, as well as GET and DELETE.&lt;/p&gt;
&lt;p&gt;I'll not cover all the details of the CORS specification here, but bear
in mind than with CORS, you can control what are the authorized methods,
headers, origins, and if the client is allowed to send authentication
information or not.&lt;/p&gt;
&lt;h2 id="a-word-about-security"&gt;A word about security&lt;/h2&gt;
&lt;p&gt;CORS is not an answer for every cross-domain call you want to do,
because you need to control the service you want to call. For instance,
if you want to build a feed reader and access the feeds on different
domains, you can be pretty much sure that the servers will not implement
CORS, so you'll need to write a proxy yourself, to provide this.&lt;/p&gt;
&lt;p&gt;Secondly, if misunderstood, CORS can be insecure, and cause problems.
Because the rules apply when a client wants to do a request to a server,
you need to be extra careful about who you're authorizing.&lt;/p&gt;
&lt;p&gt;An incorrectly secured CORS server can be accessed by a malicious client
very easily, bypassing network security. For instance, if you host a
server on an intranet that is only available from behind a VPN but
accepts every cross-origin call. A bad guy can inject javascript into
the browser of a user who has access to your protected server and make
calls to your service, which is probably not what you want.&lt;/p&gt;
&lt;h2 id="how-this-is-different-from-jsonp"&gt;How this is different from JSONP?&lt;/h2&gt;
&lt;p&gt;You may know the &lt;a href="http://en.wikipedia.org/wiki/JSONP"&gt;JSONP&lt;/a&gt; protocol.
JSONP allows cross origin, but for a particular use case, and does have
some drawbacks (for instance, it's not possible to do DELETEs or PUTs
with JSONP).&lt;/p&gt;
&lt;p&gt;JSONP exploits the fact that it is possible to get information from
another domain when you are asking for javascript code, using the
\&amp;lt;script&gt; element.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Exploiting the open policy for \&amp;lt;script&gt; elements, some pages use
them to retrieve JavaScript code that operates on dynamically
generated JSON-formatted data from other origins. This usage pattern
is known as JSONP. Requests for JSONP retrieve not JSON, but arbitrary
JavaScript code. They are evaluated by the JavaScript interpreter, not
parsed by a JSON parser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="using-cors-in-cornice"&gt;Using CORS in Cornice&lt;/h2&gt;
&lt;p&gt;Okay, things are hopefully clearer about CORS, let's see how we
implemented it on the server-side.&lt;/p&gt;
&lt;p&gt;Cornice is a toolkit that lets you define resources in python and takes
care of the heavy lifting for you, so I wanted it to take care of the
CORS support as well.&lt;/p&gt;
&lt;p&gt;In Cornice, you define a service like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cornice&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;
&lt;span class="n"&gt;foobar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foobar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/foobar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# and then you do something with it&lt;/span&gt;
&lt;span class="nd"&gt;@foobar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_foobar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# do something with the request.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To add CORS support to this resource, you can go this way, with the
cors_origins parameter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;foobar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cors_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ta-da! You have enabled CORS for your service. &lt;strong&gt;Be aware that you're
authorizing anyone to query your server, that may not be what you
want.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Of course, you can specify a list of origins you trust, and you don't
need to stick with *, which means "authorize everyone".&lt;/p&gt;
&lt;h3 id="headers"&gt;Headers&lt;/h3&gt;
&lt;p&gt;You can define the headers you want to expose for the service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;foobar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cors_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
&lt;span class="nd"&gt;@foobar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cors_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;X-My-Header&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_foobars_please&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;some foobar for you&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I've done some testing and it wasn't working on Chrome because I wasn't
handling the headers the right way (The missing one was Content-Type,
that Chrome was asking for). With my first version of the
implementation, I needed the service implementers to explicitely list
all the headers that should be exposed. While this improves security, it
can be frustrating while developing.&lt;/p&gt;
&lt;p&gt;So I introduced an expose_all_headers flag, which is set to True by
default, if the service supports CORS.&lt;/p&gt;
&lt;h3 id="cookies-credentials"&gt;Cookies / Credentials&lt;/h3&gt;
&lt;p&gt;By default, the requests you do to your API endpoint don't include the
credential information for security reasons. If you really want to do
that, you need to enable it using the cors_credentials parameter. You
can activate this one on a per-service basis or on a per-method basis.&lt;/p&gt;
&lt;h3 id="caching"&gt;Caching&lt;/h3&gt;
&lt;p&gt;When you do a preflight request, the information returned by the server
can be cached by the User-Agent so that it's not redone before each
actual call.&lt;/p&gt;
&lt;p&gt;The caching period is defined by the server, using the
Access-Control-Max-Age header. You can configure this timing using the
cors_max_age parameter.&lt;/p&gt;
&lt;h3 id="simplifying-the-api"&gt;Simplifying the API&lt;/h3&gt;
&lt;p&gt;We have cors_headers, cors_enabled, cors_origins, cors_credentials,
cors_max_age, cors_expose_all_headers … a fair number of
parameters. If you want to have a specific CORS-policy for your
services, that can be a bit tedious to pass these to your services all
the time.&lt;/p&gt;
&lt;p&gt;I introduced another way to pass the CORS policy, so you can do
something like that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;X-My-Header&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*.notmyidea.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;max_age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;foobar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/foobar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cors_policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="comparison-with-other-implementations"&gt;Comparison with other implementations&lt;/h2&gt;
&lt;p&gt;I was curious to have a look at other implementations of CORS, in django
for instance, and I found &lt;a href="https://gist.github.com/426829.js"&gt;a gist about
it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically, this adds a middleware that adds the "rights" headers to the
answer, depending on the request.&lt;/p&gt;
&lt;p&gt;While this approach works, it's not implementing the specification
completely. You need to add support for all the resources at once.&lt;/p&gt;
&lt;p&gt;We can think about a nice way to implement this specifying a definition
of what's supposed to be exposed via CORS and what shouldn't directly in
your settings. In my opinion, CORS support should be handled at the
service definition level, except for the list of authorized hosts.
Otherwise, you don't know exactly what's going on when you look at the
definition of the service.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;There are a number of good resources that can be useful to you if you
want to either understand how CORS works, or if you want to implement it
yourself.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://enable-cors.org/"&gt;http://enable-cors.org/&lt;/a&gt; is useful to get started when you don't
know anything about CORS.&lt;/li&gt;
&lt;li&gt;There is a W3C wiki page containing information that may be useful
about clients, common pitfalls etc:
&lt;a href="http://www.w3.org/wiki/CORS_Enabled"&gt;http://www.w3.org/wiki/CORS_Enabled&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;HTML5 rocks&lt;/em&gt; has a tutorial explaining how to implement CORS, with
&lt;a href="http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server"&gt;a nice section about the
server-side&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Be sure to have a look at the &lt;a href="http://caniuse.com/#search=cors"&gt;clients support-matrix for this
feature&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;About security, &lt;a href="https://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity"&gt;check out this
page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you want to have a look at the implementation code, check &lt;a href="https://github.com/mozilla-services/cornice/pull/98/files"&gt;on
github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, the W3C specification is the best resource to rely on. This
specification isn't hard to read, so you may want to go through it.
Especially the &lt;a href="http://www.w3.org/TR/cors/#resource-processing-model"&gt;"resource processing model"
section&lt;/a&gt;&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>New year python meme, 2012</title><link href="https://blog.notmyidea.org/new-year-python-meme-2012.html" rel="alternate"></link><published>2013-01-07T00:00:00+01:00</published><updated>2013-01-07T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2013-01-07:/new-year-python-meme-2012.html</id><summary type="html">
&lt;p&gt;This series, also known as "&lt;a href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt; strikes
again", is a good occasion to take a look back at 2012 and see what I've
done related to python. So, let's try.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Whats the coolest Python application, framework or library you
have discovered in 2012 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I discovered
&lt;a href="http://docs.pylonsproject.org/en/latest/docs/pyramid.html"&gt;Pyramid&lt;/a&gt;
this …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;This series, also known as "&lt;a href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt; strikes
again", is a good occasion to take a look back at 2012 and see what I've
done related to python. So, let's try.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Whats the coolest Python application, framework or library you
have discovered in 2012 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I discovered
&lt;a href="http://docs.pylonsproject.org/en/latest/docs/pyramid.html"&gt;Pyramid&lt;/a&gt;
this year and quite enjoyed it. I like the way they bring back some nice
concepts on the table, and how they compete with other frameworks.
That's nicely decomposed and everything fits together really well. I
learned a bit about its internal routing mechanism when working on
&lt;a href="http://cornice.rtfd.org"&gt;Cornice&lt;/a&gt;, and it's really well done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. What new programming technique did you learn in 2012 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I learned about asynchronous programming, something I wasn't really
aware of. (Yes, that's a shame). This was really helpful to understand
some bits of &lt;a href="http://circus.io"&gt;Circus&lt;/a&gt;. I also started to learn about
some related concepts present in &lt;a href="http://golang.org"&gt;go&lt;/a&gt; or in
&lt;a href="http://erlang.org"&gt;erlang&lt;/a&gt; with &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;the actor
model&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Which open source project did you contribute to the most in 2012 ?
What did you do ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I worked a bunch on &lt;a href="http://cornice.rtfd.org"&gt;Cornice&lt;/a&gt; and
&lt;a href="http://circus.io"&gt;Circus&lt;/a&gt;, not as much as I would like, but that was
two really interesting projects. For Cornice, I completely &lt;a href="http://blog.notmyidea.org/refactoring-cornice.html"&gt;refactored
the internals&lt;/a&gt; back
in May, and since that, I added support for
&lt;a href="https://github.com/SPORE/specifications"&gt;SPORE&lt;/a&gt; and am currently
working on porting it to Python 3 and adding support for
&lt;a href="http://www.w3.org/TR/cors/"&gt;CORS&lt;/a&gt;. For Circus, I worked on the web
interface and on other bits of the projects related to stats.&lt;/p&gt;
&lt;p&gt;I didn't contributed that much to &lt;a href="http://getpelican.com"&gt;Pelican&lt;/a&gt;,
mainly because I'm less excited about it than I was previously: the
project is working and needs to focus more on code quality than
features. We started in this direction, hopefully it will pay-off; but I
committed a lot less code than previously.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Which Python blog or website did you read the most in 2012 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I really don't know. I found some interesting python-related news on
&lt;a href="http://news.ycombinator.com/"&gt;hacker news&lt;/a&gt; and on the printed version
as well, &lt;a href="http://hackermonthly.com/"&gt;hacker monthly&lt;/a&gt;. Twitter and IRC
got me some interesting articles as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. What are the three top things you want to learn in 2013 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On the computer science side, I want to learn more about other
paradigms, maybe in other languages. I like python, but I want to learn
about other concepts, maybe some of them don't really fit with python.&lt;/p&gt;
&lt;p&gt;For instance, I don't know that much about pattern matching or about the
actor model. Well I know what it is, but I would like to make good use
of them in order to have something nice and useful.&lt;/p&gt;
&lt;p&gt;Also, I want to learn how to make a product. From scratch. Which means
designing, implementing and maintaining something. Maybe this will be
the case with &lt;a href="https://github.com/spiral-project/daybed"&gt;daybed&lt;/a&gt; ? Who
knows.&lt;/p&gt;
&lt;p&gt;I want to get better at building communities. Working with others is
something that can be complex and quite hard sometimes. I want to learn
how to handle this better.&lt;/p&gt;
&lt;p&gt;On the other side, I want to learn about tons of other non-tech things:
taking pictures, finding a good balance between life and work, working
with children, teaching and animating workshops, writing articles, be
better at reading (being critic when I'm thinking!).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. What is the top software, application or library you wish someone
would write in 2013 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The one missing thing, IMO, is a &lt;strong&gt;good&lt;/strong&gt; webmail reader, in python. One
we could contribute to, one we could write features for, and one that
could come and compete with gmail, in term of features of UI.&lt;/p&gt;
&lt;p&gt;However, most of the time, I'm just impressed by the new ideas that come
from others. I would like to have a library to handle the actor model in
a nice way in Python, I would like to see packaging fixed in python :-)&lt;/p&gt;
&lt;p&gt;Want to do your own list? Here's how:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;copy-paste the questions and answer to them in your blog&lt;/li&gt;
&lt;li&gt;tweet it with the #2012pythonmeme hashtag&lt;/li&gt;
&lt;/ul&gt;</content><category term="Journal"></category></entry><entry><title>Status board</title><link href="https://blog.notmyidea.org/status-board.html" rel="alternate"></link><published>2012-12-29T00:00:00+01:00</published><updated>2012-12-29T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-29:/status-board.html</id><summary type="html">
&lt;p&gt;À force de démarrer des services web pour un oui et pour un non, de
proposer à des copains d'héberger leurs sites, de faire pareil pour
quelques assos etc, je me suis retrouvé avec, comme dirait l'autre, &lt;em&gt;une
bonne platrée&lt;/em&gt; de sites et de services à gérer sur lolnet.org …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;À force de démarrer des services web pour un oui et pour un non, de
proposer à des copains d'héberger leurs sites, de faire pareil pour
quelques assos etc, je me suis retrouvé avec, comme dirait l'autre, &lt;em&gt;une
bonne platrée&lt;/em&gt; de sites et de services à gérer sur lolnet.org, mon
serveur.&lt;/p&gt;
&lt;p&gt;Jusqu'à très récemment, rien de tout ça n'était sauvegardé, et non plus
monitoré. Après quelques recherches, je suis tombé sur
&lt;a href="http://www.stashboard.org/"&gt;stashboard&lt;/a&gt;, un "status board" qu'il est
bien fait. Le seul problème, c'est écrit pour se lancer sur GAE, &lt;em&gt;Google
App Engine&lt;/em&gt;. Heureusement, c'est open-source, et ça a été forké pour
donner naissance à
&lt;a href="https://github.com/bfirsh/whiskerboard"&gt;whiskerboard&lt;/a&gt; (la planche
moustachue, pour les non anglophones).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture d'écran du site." src="images/status_board.png"&gt;&lt;/p&gt;
&lt;h2 id="verifier-le-statut-des-services"&gt;Vérifier le statut des services&lt;/h2&gt;
&lt;p&gt;Donc, c'est chouette, c'est facile à installer, tout ça, mais… mais ça ne fait en fait pas ce que je veux: ça ne fait que m'afficher le statut des services, mais ça ne vérifie pas que tout est bien "up".&lt;/p&gt;
&lt;p&gt;Bon, un peu embêtant pour moi, parce que c'est vraiment ça que je voulais. Pas grave, je sais un peu coder, autant que ça serve. J'ai ajouté quelques fonctionnalités au soft, qui sont disponibles sur mon fork, sur github:: &lt;a href="https://github.com/almet/whiskerboard"&gt;https://github.com/almet/whiskerboard&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Entres autres, il est désormais possible de lancer
&lt;a href="http://celeryproject.org/"&gt;celery&lt;/a&gt; en tache de fond et de vérifier périodiquement que les services sont toujours bien vivants, en utilisant une tache spécifique.&lt;/p&gt;
&lt;p&gt;C'était un bonheur de développer ça (on a fait ça à deux, avec guillaume, avec un mumble + tmux en pair prog, en une petite soirée, ça dépote).&lt;/p&gt;
&lt;p&gt;Les modifications sont assez simples, vous pouvez aller jeter un œil aux changements ici:
&lt;a href="https://github.com/almet/whiskerboard/compare/b539337416...master"&gt;https://github.com/almet/whiskerboard/compare/b539337416...master&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En gros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ajout d'une connection_string aux services (de la forme
protocol://host:port)&lt;/li&gt;
&lt;li&gt;ajout d'une commande check_status qui s'occupe d'itérer sur les
services et de lancer des taches celery qui vont bien, en fonction
du protocole&lt;/li&gt;
&lt;li&gt;ajout des taches en question&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deploiement"&gt;Déploiement&lt;/h2&gt;
&lt;p&gt;Le plus long a été de le déployer en fin de compte, parce que je ne
voulais pas déployer mon service de supervision sur mon serveur,
forcément.&lt;/p&gt;
&lt;p&gt;Après un essai (plutôt rapide en fait) sur &lt;a href="http://heroku.com"&gt;heroku&lt;/a&gt;,
je me suis rendu compte qu'il me fallait payer pas loin de 35$ par mois
pour avoir un process celeryd qui tourne, donc j'ai un peu cherché
ailleurs, pour finalement déployer la chose chez
&lt;a href="https://www.alwaysdata.com/"&gt;alwaysdata&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Après quelques péripéties, j'ai réussi à faire tourner le tout, ça à été
un peu la bataille au départ pour installer virtualenv (j'ai du faire
des changements dans mon PATH pour que ça puisse marcher), voici mon
`.bash_profile`:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;export PYTHONPATH=~/modules/&lt;/span&gt;
&lt;span class="err"&gt;export PATH=$HOME/modules/bin:$HOME/modules/:$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et après y'a plus qu'à installer avec `easy_install`:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;easy_install --install-dir ~/modules -U pip&lt;/span&gt;
&lt;span class="err"&gt;easy_install --install-dir ~/modules -U virtualenv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et à créer le virtualenv:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;virtualenv venv&lt;/span&gt;
&lt;span class="err"&gt;venv/bin/pip install -r requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dernière étape, la création d'un fichier application.wsgi qui s'occupe
de rendre l'application disponible, avec le bon venv:&lt;/p&gt;
&lt;h2 id="ssl-et-requests"&gt;SSL et Requests&lt;/h2&gt;
&lt;p&gt;Quelques tours de manivelle plus loin, j'ai un celeryd qui tourne et qui
consomme les taches qui lui sont envoyées (pour des questions de
simplicité, j'ai utilisé le backend django de celery, donc pas besoin
d'AMQP, par exemple).&lt;/p&gt;
&lt;p&gt;Problème, les ressources que je vérifie en SSL (HTTPS) me jettent. Je
sais pas exactement pourquoi à l'heure qu'il est, mais il semble que
lorsque je fais une requête avec
&lt;a href="http://docs.python-requests.org/en/latest/"&gt;Requests&lt;/a&gt; je me récupère
des &lt;em&gt;Connection Refused&lt;/em&gt;. Peut être une sombre histoire de proxy ? En
attendant, les appels avec CURL fonctionnent, donc j'ai fait &lt;a href="https://github.com/ametaireau/whiskerboard/blob/master/board/tasks.py#L17"&gt;un
fallback vers CURL lorsque les autres méthodes
échouent&lt;/a&gt;.
Pas super propre, mais ça fonctionne.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt; Finalement, il se trouve que mon serveur était mal configuré.
J'utilisais haproxy + stunnel, et la négiciation SSL se passait mal. Une
fois SSL et TLS activés, et SSLv2 désactivé, tout fonctionne mieux.&lt;/p&gt;
&lt;h2 id="et-voila"&gt;Et voilà&lt;/h2&gt;
&lt;p&gt;Finalement, j'ai mon joli status-board qui tourne à merveille sur
&lt;a href="http://status.lolnet.org"&gt;http://status.lolnet.org&lt;/a&gt; :-)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Habitat collectif</title><link href="https://blog.notmyidea.org/habitat-collectif.html" rel="alternate"></link><published>2012-12-28T00:00:00+01:00</published><updated>2012-12-28T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-28:/habitat-collectif.html</id><summary type="html">
&lt;p&gt;Habiter à plusieurs, partager un lieu de vie, monter une communauté,
changer nos modes de vie et prendre plus de temps les uns pour les
autres.&lt;/p&gt;
&lt;p&gt;Ça fait réfléchir un peu quand même, non ? en tout cas ça marche chez
moi.&lt;/p&gt;
&lt;p&gt;Voilà quelques ressources qui peuvent être utiles si jamais …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Habiter à plusieurs, partager un lieu de vie, monter une communauté,
changer nos modes de vie et prendre plus de temps les uns pour les
autres.&lt;/p&gt;
&lt;p&gt;Ça fait réfléchir un peu quand même, non ? en tout cas ça marche chez
moi.&lt;/p&gt;
&lt;p&gt;Voilà quelques ressources qui peuvent être utiles si jamais vous aussi
ça vous titille:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.habicoop.fr/IMG/pdf/Memoire_hbtat_coop_Vaulx-2.pdf"&gt;LHabitat Coopératif : Solution au problème de responsabilisation
sociale des copropriétaires sur la commune de Vaulx en Velin
?&lt;/a&gt; -
mémoire REPIQUET Anne 2005.&lt;/li&gt;
&lt;li&gt;Un bouquin à lire avec plein d'infos: &lt;a href="http://www.ecosociete.org/t101.php"&gt;Vivre
autrement&lt;/a&gt; de Diana Leafe
Christian.&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>Tricot</title><link href="https://blog.notmyidea.org/tricot.html" rel="alternate"></link><published>2012-12-28T00:00:00+01:00</published><updated>2012-12-28T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-28:/tricot.html</id><summary type="html">
&lt;p&gt;Puisque j'ai décidé d'apprendre à faire les trucs moi-même, je me mets
au tricot. Et puis y'a aussi tout un symbole derrière: le tricot, c'est
pour les filles, tu sais, un "truc de gonzesse".&lt;/p&gt;
&lt;p&gt;Eh bah c'est pas gagné, jte le dis. Pour l'instant j'ai réussi à faire à
peu …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Puisque j'ai décidé d'apprendre à faire les trucs moi-même, je me mets
au tricot. Et puis y'a aussi tout un symbole derrière: le tricot, c'est
pour les filles, tu sais, un "truc de gonzesse".&lt;/p&gt;
&lt;p&gt;Eh bah c'est pas gagné, jte le dis. Pour l'instant j'ai réussi à faire à
peu près un rang d'endroit et j'arrive pas à enchainer sur l'envers pour
réussir à faire un point jersey (jersey c'est un rang endroit puis un
rang envers).&lt;/p&gt;
&lt;p&gt;Enfin bref, si jamais ça vous botte vous aussi, voila quelques
ressources que j'ai trouvé sur internet (en plus des conseils avisés de
maman chérie™):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=VcGiBG2BNxo&amp;amp;list=UUskaiVNnKf7amRb5OI5op_w"&gt;Montage des mailles
"normales"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=aIQtNN89pqA&amp;amp;list=UUskaiVNnKf7amRb5OI5op_w"&gt;Le point
jersey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La nana explique plutôt bien et assez lentement. En espérant que ça
prenne.&lt;/p&gt;</content><category term="Notes"></category></entry><entry><title>Astuces SSH</title><link href="https://blog.notmyidea.org/astuces-ssh.html" rel="alternate"></link><published>2012-12-27T00:00:00+01:00</published><updated>2012-12-27T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-27:/astuces-ssh.html</id><summary type="html">
&lt;h2 id="tunelling"&gt;Tunelling&lt;/h2&gt;
&lt;p&gt;Parce que je m'en rapelle jamais (tête de linote):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh -f hote -L local:lolnet.org:destination -N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="sshconfig"&gt;.ssh/config&lt;/h2&gt;
&lt;p&gt;(merci &lt;a href="http://majerti.fr"&gt;gaston&lt;/a&gt; !)&lt;/p&gt;
&lt;p&gt;La directive suivante dans .ssh/config permet de sauter d'hôte en hôte
séparés par des "+" :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Host *+*&lt;/span&gt;
&lt;span class="err"&gt; ProxyCommand ssh $(echo %h | sed&lt;/span&gt;
&lt;span class="err"&gt;&amp;#39;s/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">
&lt;h2 id="tunelling"&gt;Tunelling&lt;/h2&gt;
&lt;p&gt;Parce que je m'en rapelle jamais (tête de linote):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh -f hote -L local:lolnet.org:destination -N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="sshconfig"&gt;.ssh/config&lt;/h2&gt;
&lt;p&gt;(merci &lt;a href="http://majerti.fr"&gt;gaston&lt;/a&gt; !)&lt;/p&gt;
&lt;p&gt;La directive suivante dans .ssh/config permet de sauter d'hôte en hôte
séparés par des "+" :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Host *+*&lt;/span&gt;
&lt;span class="err"&gt; ProxyCommand ssh $(echo %h | sed&lt;/span&gt;
&lt;span class="err"&gt;&amp;#39;s/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /&amp;#39;)&lt;/span&gt;
&lt;span class="err"&gt;PATH=.:\$PATH nc -w1 $(echo %h | sed &amp;#39;s/^.*+//;/:/!s/$/ %p/;s/:/ /&amp;#39;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut donc spécifier des "sauts" ssh du style:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@91.25.25.25&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite on peut essayer de rajouter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Host &amp;lt;label_pour_mon_serveur_privé&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; user &amp;lt;monuser(root)&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; IdentityFile &amp;lt;chemin vers ma clé ssh pour le serveur publique&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; hostname ip_serveur_publique+ip_serveur_privé&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Technologie"></category></entry><entry><title>Gnome 3, extensions</title><link href="https://blog.notmyidea.org/gnome-3-extensions.html" rel="alternate"></link><published>2012-12-27T00:00:00+01:00</published><updated>2012-12-27T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-27:/gnome-3-extensions.html</id><summary type="html">
&lt;p&gt;Après avoir tenté pendant un bout de temps unity, le bureau par defaut
de ubuntu, j'ai eu envie de changements, et j'ai donc essayé un peu de
regarder du coté de gnome 3, à nouveau.&lt;/p&gt;
&lt;p&gt;Et finalement, j'ai trouvé quelques extensions qui sont vraiment utiles,
que je liste ici.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/547/antisocial-menu/"&gt;Antisocial …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">
&lt;p&gt;Après avoir tenté pendant un bout de temps unity, le bureau par defaut
de ubuntu, j'ai eu envie de changements, et j'ai donc essayé un peu de
regarder du coté de gnome 3, à nouveau.&lt;/p&gt;
&lt;p&gt;Et finalement, j'ai trouvé quelques extensions qui sont vraiment utiles,
que je liste ici.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/547/antisocial-menu/"&gt;Antisocial
Menu&lt;/a&gt;
vire les boutons et textes en rapport avec le web social. J'en avais
pas besoin puisque je suis connecté à mon instant messenger dans un
terminal, en utilisant weechat.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/97/coverflow-alt-tab/"&gt;Coverflow
Alt-Tab&lt;/a&gt;
change le switcher d'applications par defaut. Je le trouve bien plus
pratique que celui par defaut puisqu'il me permet de voir "en grand"
quelle est la fenêtre que je vais afficher.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/55/media-player-indicator/"&gt;Media player
indicator&lt;/a&gt;
me permet de voir en temps réel ce qui se passe dans mon lecteur
audio. Ça semble ne pas être grand chose, mais ça me manquait. Ça
s'intègre niquel avec Spotify, et ça c'est chouette.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/149/search-firefox-bookmarks-provider/"&gt;Rechercher dans les bookmarks
firefox&lt;/a&gt;
permet de… à votre avis ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un peu moins utile mais sait on jamais:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://extensions.gnome.org/extension/130/advanced-settings-in-usermenu/"&gt;Advanced Settings in
UserMenu&lt;/a&gt;
permet d'avoir un raccourci vers les paramètres avancés dans le menu
utilisateur (en haut à droite)&lt;/li&gt;
&lt;li&gt;Une &lt;a href="https://extensions.gnome.org/extension/409/gtg-integration/"&gt;intégration à Getting things
Gnome&lt;/a&gt;
(un truc de GTD). Je suis en train d'expérimenter avec cet outil,
donc je ne sais pas encore si ça va rester, mais pourquoi pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez aller faire un tour sur &lt;a href="https://extensions.gnome.org/"&gt;https://extensions.gnome.org/&lt;/a&gt; pour
en trouver d'autres à votre gout.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>"Groovy"</title><link href="https://blog.notmyidea.org/groovy.html" rel="alternate"></link><published>2012-12-27T00:00:00+01:00</published><updated>2012-12-27T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-27:/groovy.html</id><summary type="html">
&lt;p&gt;“Groovy”, c'est comme ça que je l'aime la musique: peut importe le style
finalement, la bonne musique c'est celle qui sonne, celle qui groove,
celle qui fait que tu tapes du pied (le droit chez moi) et que que ta
tête commence à hocher.&lt;/p&gt;
&lt;p&gt;C'est pour ça que j'ai du …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;“Groovy”, c'est comme ça que je l'aime la musique: peut importe le style
finalement, la bonne musique c'est celle qui sonne, celle qui groove,
celle qui fait que tu tapes du pied (le droit chez moi) et que que ta
tête commence à hocher.&lt;/p&gt;
&lt;p&gt;C'est pour ça que j'ai du mal à répondre quand on me demande quel type
de musique j'aime bien. Bah voila, maintenant je sais, je l'aime groovy
;)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Notre dame des landes</title><link href="https://blog.notmyidea.org/notre-dame-des-landes.html" rel="alternate"></link><published>2012-12-27T00:00:00+01:00</published><updated>2012-12-27T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-27:/notre-dame-des-landes.html</id><summary type="html">
&lt;p&gt;La lutte à Notre Dame des Landes ne fait pas du tout que commencer, mais
il se trouve que les médias se sont "emparés" de la question que très
récemment, depuis que JM Ayrault s'est retrouvé premier ministre.&lt;/p&gt;
&lt;p&gt;Voici une sélection d'articles que j'ai trouvé pertinents, à partir de
décembre …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;La lutte à Notre Dame des Landes ne fait pas du tout que commencer, mais
il se trouve que les médias se sont "emparés" de la question que très
récemment, depuis que JM Ayrault s'est retrouvé premier ministre.&lt;/p&gt;
&lt;p&gt;Voici une sélection d'articles que j'ai trouvé pertinents, à partir de
décembre 2012:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Article dans le monde qui explique la complexité de la lutte sur
place:
&lt;a href="http://www.lemonde.fr/idees/article/2012/12/13/notre-dame-des-landes-une-resistance-qui-ne-se-laissera-pas-dicter-sa-conduite_1805511_3232.html"&gt;http://www.lemonde.fr/idees/article/2012/12/13/notre-dame-des-landes-une-resistance-qui-ne-se-laissera-pas-dicter-sa-conduite_1805511_3232.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;autour de relations à la presse:
&lt;a href="http://www.rennestv.fr/catalogue/magazine/notre-dame-des-landes-l-inaceptable-interdiction-de-la-presse.html"&gt;http://www.rennestv.fr/catalogue/magazine/notre-dame-des-landes-l-inaceptable-interdiction-de-la-presse.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notre-Dame-des-Landes : un pilote annonce un fiasco pour le futur
aéroport &lt;a href="http://www.bastamag.net/article2866.html"&gt;http://www.bastamag.net/article2866.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category></entry><entry><title>Semences paysannes</title><link href="https://blog.notmyidea.org/semences-paysannes.html" rel="alternate"></link><published>2012-12-20T00:00:00+01:00</published><updated>2012-12-20T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-20:/semences-paysannes.html</id><summary type="html">
&lt;p&gt;&lt;a href="http://www.dailymotion.com/video/x5nhq0_les-semences-paysannes_news#from=embed"&gt;http://www.dailymotion.com/video/x5nhq0_les-semences-paysannes_news#from=embed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A l'heure actuelle, il est interdit pour deux agriculteurs de
s'échangers des semences dans le but d'en revendre la production.&lt;/p&gt;
&lt;p&gt;Les états ont crée la propriété interellectuelle pour relancer
l'industrie après les dégats de la guerre et les selectionneurs en ont
profité …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;a href="http://www.dailymotion.com/video/x5nhq0_les-semences-paysannes_news#from=embed"&gt;http://www.dailymotion.com/video/x5nhq0_les-semences-paysannes_news#from=embed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A l'heure actuelle, il est interdit pour deux agriculteurs de
s'échangers des semences dans le but d'en revendre la production.&lt;/p&gt;
&lt;p&gt;Les états ont crée la propriété interellectuelle pour relancer
l'industrie après les dégats de la guerre et les selectionneurs en ont
profité en 1960 au sein de l'UPOV pour faire des textes pour s'approprié
les selections qu'ils ont fait. Les textes ont été votés par les députés
depuis: bien prové au lieu de bien collectif.&lt;/p&gt;
&lt;p&gt;Les semenciers n'existent que depuis 150 ans. Ils revendiquent
maintenant le monopole de selection.&lt;/p&gt;
&lt;p&gt;Un catalogue est prévu pour les semences dites "de conservation" (alors
qu'elles évoluent, conservation n'est pas un terme adapté). C'est la
voie qui est possible pour pouvoir échanger des semences entre
agriculteurs.&lt;/p&gt;
&lt;p&gt;→ Quelles sont les semences de conservation depuis 2002 ? → Quid des
semences paysannes, qui évoluent et que l'on garde d'année en année, en
selectionnant les meilleures especes. → Existe-il un autre catalogue ? →
Au niveau européen, quelles sontles contraintes d'inscription ? Gratuité
demandée, qu'en est il ?&lt;/p&gt;
&lt;p&gt;→ Relocalistion sur les terroirs des échanges.&lt;/p&gt;
&lt;p&gt;→ Biodiversité serait tué par l'utilisation d'espèces inscrites.&lt;/p&gt;
&lt;p&gt;Série de vidéos sur la paysannerie:
&lt;a href="http://www.latelevisionpaysanne.fr/video.php?lirevideo=86#86"&gt;http://www.latelevisionpaysanne.fr/video.php?lirevideo=86#86&lt;/a&gt;&lt;/p&gt;</content><category term="Notes"></category></entry><entry><title>Languages</title><link href="https://blog.notmyidea.org/languages.html" rel="alternate"></link><published>2012-12-12T00:00:00+01:00</published><updated>2012-12-12T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-12-12:/languages.html</id><content type="html">
&lt;p&gt;Ouriel Ellert " Languages" avec Anthony Jambon &amp;amp; Natascha Rogers, c'est enregistré par le &lt;a href="http://www.studiomezzanine.fr"&gt;Studio Mezzanine&lt;/a&gt; qui
comme d'hab font un travail impeccable.&lt;/p&gt;
&lt;p&gt;Plus d'infos sur Natasha Rogers et son groupe ici:
&lt;a href="http://www.studiomezzanine.fr/natascha-rogers/"&gt;http://www.studiomezzanine.fr/natascha-rogers/&lt;/a&gt;&lt;/p&gt;
&lt;iframe width="650" height="480" src="http://www.youtube.com/embed/3I5PPdsTFz0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</content><category term="Musique"></category></entry><entry><title>Cheese &amp; code - Wrap-up</title><link href="https://blog.notmyidea.org/cheese-code-wrap-up.html" rel="alternate"></link><published>2012-10-22T00:00:00+02:00</published><updated>2012-10-22T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-10-22:/cheese-code-wrap-up.html</id><summary type="html">
&lt;p&gt;This week-end I hosted a &lt;em&gt;cheese &amp;amp; code&lt;/em&gt; session in the country-side of
Angers, France.&lt;/p&gt;
&lt;p&gt;We were a bunch of python hackers and it rained a lot, wich forced us to
stay inside and to code. Bad.&lt;/p&gt;
&lt;p&gt;We were not enough to get rid of all the cheese and the awesome …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;This week-end I hosted a &lt;em&gt;cheese &amp;amp; code&lt;/em&gt; session in the country-side of
Angers, France.&lt;/p&gt;
&lt;p&gt;We were a bunch of python hackers and it rained a lot, wich forced us to
stay inside and to code. Bad.&lt;/p&gt;
&lt;p&gt;We were not enough to get rid of all the cheese and the awesome meals,
but well, we finally managed it pretty well.&lt;/p&gt;
&lt;p&gt;Here is a summary of what we worked on:&lt;/p&gt;
&lt;h2 id="daybed"&gt;Daybed&lt;/h2&gt;
&lt;p&gt;Daybed started some time ago, and intend to be a replacement to google
forms, in term of features, but backed as a REST web service, in python,
and open source.&lt;/p&gt;
&lt;p&gt;In case you wonder, daybed is effectively the name of a couch. We chose
this name because of the similarities (in the sound) with &lt;strong&gt;db&lt;/strong&gt;, and
because we're using &lt;strong&gt;CouchDB&lt;/strong&gt; as a backend.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Daybed is a big couch!" src="images/daybed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;We mainly hacked on daybed and are pretty close to the release of the
first version, meaning that we have something working.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/spiral-project/daybed"&gt;The code&lt;/a&gt; is available on
github, and we also wrote &lt;a href="http://daybed.rtfd.org"&gt;a small
documentation&lt;/a&gt; for it.&lt;/p&gt;
&lt;p&gt;Mainly, we did a lot of cleanup, rewrote a bunch of tests so that it
would be easier to continue to work on the project, and implemented some
minor features. I'm pretty confidend that we now have really good basis
for this project.&lt;/p&gt;
&lt;p&gt;Also, we will have a nice todolist application, with the backend &lt;strong&gt;and&lt;/strong&gt;
the frontend, in javascript / html / css, you'll know more when it'll be
ready :-)&lt;/p&gt;
&lt;p&gt;Once we have something good enough, we'll release the first version and
I'll host it somewhere so that people can play with it.&lt;/p&gt;
&lt;h2 id="cornice"&gt;Cornice&lt;/h2&gt;
&lt;p&gt;Daybed is built on top of &lt;a href="http://cornice.rtfd.org"&gt;Cornice&lt;/a&gt;, a
framework to ease the creation of web-services.&lt;/p&gt;
&lt;p&gt;At Pycon France, we had the opportunity to attend a good presentation
about &lt;a href="https://github.com/SPORE/specifications"&gt;SPORE&lt;/a&gt;. SPORE is a way
to describe your REST web services, as WSDL is for WS-* services. This
allows to ease the creation of generic SPORE clients, which are able to
consume any REST API with a SPORE endpoint.&lt;/p&gt;
&lt;p&gt;Here is how you can let cornice describe your web service for you&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cornice.ext.spore&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;generate_spore_description&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cornice.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_services&lt;/span&gt;
&lt;span class="n"&gt;spore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;spore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/spore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jsonp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@spore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_spore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_services&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;generate_spore_description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Service name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;application_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And you'll get a definition of your service, in SPORE, available at
/spore.&lt;/p&gt;
&lt;p&gt;Of course, you can use it to do other things, like generating the file
locally and exporting it wherever it makes sense to you, etc.&lt;/p&gt;
&lt;p&gt;I released today &lt;a href="http://crate.io/packages/cornice/"&gt;Cornice 0.11&lt;/a&gt;,
which adds into other things the support for SPORE, plus some other
fixes we found on our way.&lt;/p&gt;
&lt;h2 id="respire"&gt;Respire&lt;/h2&gt;
&lt;p&gt;Once you have the description of the service, you can do generic clients
consuming them!&lt;/p&gt;
&lt;p&gt;We first wanted to contribute to &lt;a href="https://github.com/bl0b/spyre"&gt;spyre&lt;/a&gt;
but it was written in a way that wasn't supporting to POST data, and
they were using their own stack to handle HTTP. A lot of code that
already exists in other libraries.&lt;/p&gt;
&lt;p&gt;While waiting the train with &lt;a href="http://natim.ionyse.com/"&gt;Rémy&lt;/a&gt;, we hacked
something together, named "Respire", a thin layer on top of the awesome
&lt;a href="http://python-requests.org"&gt;Requests&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;We have a first version, feel free to have a look at it and provide
enhancements if you feel like it. We're still hacking on it so it may
break (for the better), but that had been working pretty well for us so
far.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="http://github.com/spiral-project/respire"&gt;find the project on
github&lt;/a&gt;, but here is how to
use it, really quickly (these examples are how to interact with daybed)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;respire&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;client_from_url&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# create the client from the SPORE definition&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client_from_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://localhost:8000/spore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# in daybed, create a new definition&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;todo_def&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;todo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;A list of my stuff to do&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fields&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The item&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;enum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;choices&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;done&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;todo&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;is it done or not&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put_definition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;todo_def&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;make it work&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;9f2c90c0529a442cfdc03c191b022cf7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, we were out of cheese so everyone headed back to their
respective houses and cities.&lt;/p&gt;
&lt;p&gt;Until next time?&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Bière maison !</title><link href="https://blog.notmyidea.org/biere-maison.html" rel="alternate"></link><published>2012-10-04T00:00:00+02:00</published><updated>2012-10-04T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-10-04:/biere-maison.html</id><summary type="html">
&lt;p&gt;Et voilà, c'est notre troisième brassin. On a commencé à faire notre
propre bière (avec un ami, Fred) il y a quasiment un an maintenant, et
après quelques dératés, même s'il nous reste encore bien du chemin à
parcourir pour avoir quelque chose qui nous convienne réellement… c'est
pas si …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Et voilà, c'est notre troisième brassin. On a commencé à faire notre
propre bière (avec un ami, Fred) il y a quasiment un an maintenant, et
après quelques dératés, même s'il nous reste encore bien du chemin à
parcourir pour avoir quelque chose qui nous convienne réellement… c'est
pas si pire comme on dit !&lt;/p&gt;
&lt;p&gt;Cette fois-çi, on s'est penché sur la confection d'une IPA (Indian Pale
Ale, une bière un peu plus amère que celle qu'on à l'habitude de trouver
en France).&lt;/p&gt;
&lt;p&gt;Elle est plus amère car elle comporte plus de houblon que les autres, et
(dans notre cas en tout cas) parce qu'on fait la première fermentation
en présence de houblon.&lt;/p&gt;
&lt;h2 id="comment-quon-fait-de-la-biere"&gt;Comment qu'on fait de la bière ?&lt;/h2&gt;
&lt;p&gt;Machine arrière; n'allons pas trop vite: comment est-ce qu'on fait de la
bière, d'abord ?&lt;/p&gt;
&lt;p&gt;En fin de compte, les quelques étapes nécessaire à la confection de la
bière ne sont pas bien sorcières; concassage de l'orge maltée, cuisson
(libération de l'amidon dans l'eau), infusion du houblon,
refroidissement, première fermentation, embouteillage et seconde
fermentation.&lt;/p&gt;
&lt;p&gt;L'idée principale est transformer l'amidon d'orge maltée en sucre, pour
le "donner à manger" à des levures. Vous ajoutez un peu de houblon au
milieu pour donner un petit goût amer et le tour est joué. Enfin
presque.&lt;/p&gt;
&lt;h2 id="etape-par-etape"&gt;Étape par étape&lt;/h2&gt;
&lt;p&gt;Première étape: &lt;strong&gt;le concassage&lt;/strong&gt;. On avait 6kg d'orge maltée à
concasser (plus exactement 6kg de malt pâle &lt;em&gt;7EDC&lt;/em&gt; et 500g de malt cara
&lt;em&gt;50EDC&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image de concassage." src="images/concassage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Attention, pas trop fin dis donc ! On ne veut pas de la poudre, on veut
simplement permettre à l'amidon de se dissoudre dans l'eau. Si on
concasse le malt trop fin, on se retrouve avec un dépôt dégeulasse au
fond de toutes les bouteilles (c'est l'expérience qui parle, notre
première bière avait plus goût de céréale que de bière…)&lt;/p&gt;
&lt;p&gt;Contrairement aux fois précédentes où nous avions utilisé la technique
du marteau et du torchon (oui, comme vous pouvez l'imaginer, c'est assez
long et fastidieux), On a utilisé… un moulin à malt ! Qui nous à permis
de concasser les 6kg en 30 minutes (heureusement qu'on était trois pour
se relayer sur le moulin, parce que nos petits muscles fatiguaient assez
vite; vous pouvez envisager de faire ça tout seul si vous êtes un
tennisman).&lt;/p&gt;
&lt;p&gt;&lt;img alt="C'est dur !" src="images/concasse.jpg"&gt;&lt;/p&gt;
&lt;p&gt;La seconde étape, &lt;strong&gt;l'empatage&lt;/strong&gt;. Il s'agit de faire chauffer notre orge
maltée à différentes températures. Les fois précédentes, on avait
utilisé plusieurs paliers de température, mais il semble que ça ne soit
pas si nécessaire que ça, selon les informations de l'ami Fred. On à
donc tenté de faire chauffer notre malt directement à 50°C. Une petite
erreur sur la route, on à eu peur de la contamination bactérienne et on
à décidé de faire bouillir nos 26L d'eau pour être sur que les
bactéries s'enfuient en courant. Je dis erreur parce que ça nous à pris
pas loin de 3h30, inertie quand tu nous tiens!&lt;/p&gt;
&lt;p&gt;On se rends compte de la taille de la marmite un peu là:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une grosse marmite" src="images/marmite.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Une fois l'eau à température (54°C), il faut ajouter le malt et le
laisser durant 30mn à cette température, puis augmenter jusqu'à 65°C
durant 1h.&lt;/p&gt;
&lt;p&gt;La troisième étape, c'est &lt;strong&gt;le rinçage&lt;/strong&gt;, l'idée est de récupérer
l'amidon qui s'est dissout dans l'eau et de mettre de côté l'orge maltée
(la partie solide). Pour ça, il faut faire chauffer de l'eau de rinçage.
On a utilisé 10L d'eau de rinçage qu'on a fait chauffer à 78°C, en
comptant sur le fait qu'elle perdra de sa température (20°C à peu près)
en étant utilisée. On a filtré deux fois pour être sûr de ne rien
perdre.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Filtrage filtrage..." src="images/filtrage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;L'étape d'après (la quatrième, vous suivez), c'est &lt;strong&gt;le houblonnage&lt;/strong&gt;.
On va faire infuser notre "solution aqueuse" (wouah, on dirait de la
chimie !) avec du houblon. Il faut porter l'eau à ébullition et laisser
faire durant 1h.&lt;/p&gt;
&lt;p&gt;Dernière étape: &lt;strong&gt;le refroidissement&lt;/strong&gt;. On dirait que c'est tranquilou
comme ça, mais en fait ça ne l'est pas tant que ça: il faut réussir à
passer notre liquide qui était en ébullition à 54°C en un temps
acceptable. Pour ça, on a utilisé un serpentin confectionné main.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Notre refroidisseur fait main par Fred." src="images/refroidisseur.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Ça nous a permis de passer de 100°C à 54°C en… 35 minutes quand même !
(Nous avions essayé les fois précédentes de gérer ça à coup de baignoire
et de glaçons, les temps n'étaient absolument pas au rendez-vous).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Décidement pas." src="images/refroidissement.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Je disais dernière étape, mais il ne faut pas oublier de rajouter les
levures, qui elles vont faire tout le travail et transformer tout ça en…
alcool ! Dans notre cas, on ajoute aussi dans la cuve de fermentation
du houblon question de donner l'amertume dont on a envie.&lt;/p&gt;
&lt;p&gt;On à mesuré une densité de 1046, ce qui veut dire 6° d'alcool. La cuve
est maintenant en train de buller tranquillement (les levures produisent
du gaz qui est évacué), et ça doit durer 15 jours approximativement.&lt;/p&gt;
&lt;h2 id="mise-en-bouteille"&gt;Mise en bouteille&lt;/h2&gt;
&lt;p&gt;Une fois ces deux semaines passées, il faut mettre en bouteille. Dans
notre cas nous avons récupéré des bouteilles à bouchon mécanique (vous
savez, les bouteilles de limonades) qu'on à bien rincé et nettoyé.&lt;/p&gt;
&lt;p&gt;On s'équipe d'un siphon (pensez à prendre un tuyau avec un diamètre
assez important, le notre était petit et c'était assez long) et après
avoir ajouté du sucre dans le mélange (pour réactiver les levures), on
remplit les bouteilles ! Il s'agit de la seconde fermentation, celle
qui va faire les bulles (la première fermentation se charge de l'alcool,
la seconde des bulles).&lt;/p&gt;
&lt;p&gt;Et voilà ! Il ne reste plus qu'à mettre les bouteilles de coté durant
deux semaines de plus et… à déguster le moment venu.&lt;/p&gt;
&lt;p&gt;On a donc pu tester notre bière la semaine dernière et, ma foi, elle est
pas mal du tout. Elle ne mousse pas trop et à un goût un peu amer.
Malheureusement pas assez à mon goût, mais ça viendra. En comparaison à
nos précédents essais, c'est plutôt positif: la première était ratée
puisque trop de pression et trop de dépôt (et donc un fort goût de
levures) alors que la seconde (on avait tenté d'ajouter de la lavande)
avait un goût de lavande amère, pour ne pas dire de savon.&lt;/p&gt;
&lt;p&gt;Cette dernière bière a un goût de… de bière ! Il nous reste encore à
comprendre comment faire pour lui donner la saveur que l'on souhaite,
mais c'est déjà un grand pas en avant. Prochaine étape... La bière de
Noël !&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Motivation, bénévolat et participation</title><link href="https://blog.notmyidea.org/motivation-benevolat-et-participation.html" rel="alternate"></link><published>2012-10-04T00:00:00+02:00</published><updated>2012-10-04T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-10-04:/motivation-benevolat-et-participation.html</id><summary type="html">
&lt;p&gt;Des luttes, dieu (même si on peut à juste titre se demander ce qu'il
vient faire là) sait qu'il y en a. Principalement pour pointer du doigt
les hérésies du système actuel. Ça s'applique à l'informatique et à son
système de brevets, au &lt;a href="http://zad.nadir.org/"&gt;bétonnage de nos
campagnes&lt;/a&gt; ou encore aux …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Des luttes, dieu (même si on peut à juste titre se demander ce qu'il
vient faire là) sait qu'il y en a. Principalement pour pointer du doigt
les hérésies du système actuel. Ça s'applique à l'informatique et à son
système de brevets, au &lt;a href="http://zad.nadir.org/"&gt;bétonnage de nos
campagnes&lt;/a&gt; ou encore aux luttes contre
l'oligarchie et les profits d'une minorité aux dépends du reste du
monde, et à encore bien d'autres choses.&lt;/p&gt;
&lt;p&gt;Pendant un bout de temps, j'ai parlé d'entraide, de collaboration, j'ai
essayé de sensibiliser autour de la question environnementale et aux
alternatives sociales. C'est d'ailleurs de cette manière que je me suis
moi-même le plus sensibilisé à ces questions qui me préoccupaient.&lt;/p&gt;
&lt;p&gt;J'ai tenté de le faire sans tomber dans la critique des choix des uns et
des autres. Je respecte profondément la diversité des points de vues
&lt;strong&gt;mais&lt;/strong&gt; je souhaite également que ces choix soient faits en
connaissance de cause.&lt;/p&gt;
&lt;p&gt;Une des choses difficile à supporter (pour les autres) quand on fait de
la sensibilisation, c'est le syndrôme du jeune con, du donneur de
leçons.&lt;/p&gt;
&lt;p&gt;On dirait qu'on parle de sauver le monde. "Nous qui avons tout compris,
on peut vous aider à aller dans la &lt;em&gt;bonne direction&lt;/em&gt;", mais c'est en
oubliant que la bonne direction pour l'un ne l'est pas nécessairement
pour les autres…&lt;/p&gt;
&lt;h2 id="just-do-it"&gt;Just do it !&lt;/h2&gt;
&lt;p&gt;Se battre &lt;em&gt;contre quelque chose&lt;/em&gt; permet de facilement trouver des
personnes qui partagent les même craintes alors que se battre &lt;em&gt;pour&lt;/em&gt;
permet d'engager des discussions avec des personnes qui partagent une
vision commune.&lt;/p&gt;
&lt;p&gt;Proposer des choses, trouver des personnes qui partagent des points de
vue est un bon point de départ pour le changer ce monde, a notre
échelle. Le récent documentaire &lt;a href="http://justdoitfilm.com/"&gt;"Just do
it"&lt;/a&gt; porte un message assez clair: toute
initiative compte, aussi petite et insignifiante qu'elle puisse sembler.&lt;/p&gt;
&lt;p&gt;Des initiatives locales, il y en a, plein. Et si ce que nous avons dans
notre quotidien nous pèse (aller au supermarché, subir la
sur-médiatisation télévisuelle, ne pas parler à nos voisins de
quartier…), qu'est-ce qui nous empêche d'y substituer des modèles
alternatifs ?&lt;/p&gt;
&lt;p&gt;Monter une &lt;a href="https://fr.wikipedia.org/wiki/AMAP"&gt;AMAP&lt;/a&gt; (Association Pour
le Maintien d'une Agriculture Paysanne) n'est pas aussi compliqué qu'il
y parait. Pour avoir fait l'expérience par deux fois, j'ai été très
agréablement surpris par la facilité des choses, pour peu qu'on ne
cherche pas à s'encombrer de l'inutile (tiens encore une fois on parle
de frugalité !): il est facile de vouloir faire trop, de recréer les
processus complexes auxquels nous sommes souvent confrontés.&lt;/p&gt;
&lt;p&gt;Vous souhaitez partager des connaissances (cuisine, musique, danse,
bricolage, écriture), il suffit de le faire. En fait, pour la plupart
des choses, il suffit de tenter l'expérience, c'est rarement décevant.
Surtout quand on s'embarque dans des choses saugrenues ou
personnellement inédites.&lt;/p&gt;
&lt;p&gt;Pour moi, la frugalité, la simplicité volontaire, la sobriété heureuse,
appelez-ça comme vous le voulez, représente ce qui me convient et me
permet d'être en ligne avec les idées que je défends.&lt;/p&gt;
&lt;h2 id="faciliter-la-participation"&gt;Faciliter la participation&lt;/h2&gt;
&lt;p&gt;Beaucoup de personnes sont à même de participer à des projets locaux,
pour peu qu'ils soient au courant mais pour autant peu franchissent le
pas, et encore moins persévèrent, pourquoi ?&lt;/p&gt;
&lt;p&gt;Et pourquoi pas laisser les présents, les motivés, s'investir par
eux-mêmes ? Avoir des responsabilités est souvent pour ma part un frein
à la réalisation d'un projet lorsque je suis bénévole.&lt;/p&gt;
&lt;p&gt;Décider à l'avance des choses qui semblent utiles et/ou importantes est
parfois indispensable, mais ne pas trop en faire permet de laisser libre
court à l'imagination (souvent débordante) des participants.&lt;/p&gt;
&lt;p&gt;J'aime beaucoup l'idée de faire des camps de quelques jours, où rien
n'est réellement décidé à l'avance, mise à part un thème et quelques
temps de plénière ou il est possible à chacun de s'exprimer sur les
projets qui pourraient êtres réalisés.&lt;/p&gt;
&lt;p&gt;Pas besoin de tant de formalisation: mettez une équipe de bidouilleurs
ensemble durant une semaine sans objectif commun à priori et sans
distractions, vous verrez bien ce qui en ressortira !&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Cheese &amp; Code party: October 20-21</title><link href="https://blog.notmyidea.org/cheese-code-party-october-20-21.html" rel="alternate"></link><published>2012-09-20T00:00:00+02:00</published><updated>2012-09-20T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-09-20:/cheese-code-party-october-20-21.html</id><summary type="html">
&lt;p&gt;At PyconFR, this week-end, a few ideas were thrown in the air and one of
them was to have a /dev/fort doing some python-related coding.&lt;/p&gt;
&lt;p&gt;The concept of a /dev/fort is to put a bunch of hackers together and see
what comes out from it. Tarek is doing …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;At PyconFR, this week-end, a few ideas were thrown in the air and one of
them was to have a /dev/fort doing some python-related coding.&lt;/p&gt;
&lt;p&gt;The concept of a /dev/fort is to put a bunch of hackers together and see
what comes out from it. Tarek is doing something related with the Afpy
Computer Camps at his house each year, I've been there twice and it
really was a nice experience.&lt;/p&gt;
&lt;p&gt;At Djangocong 2012, in Montpellier (south of France), &lt;a href="http://blog.mathieu-leplatre.info/"&gt;Mathieu
Leplatre&lt;/a&gt; and myself started to work
on a model validation and storage service, named
&lt;a href="https://github.com/spiral-project/daybed/"&gt;Daybed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've talked about this project to some persons this week-end (I've even
done &lt;a href="http://alexis.notmyidea.org/lightning-daybed.html"&gt;a lightning
talk&lt;/a&gt; about it) and
it gathered some interest from people in the python community, so we
thought about sprinting on this.&lt;/p&gt;
&lt;h2 id="20-and-21-october-a-computer-camp"&gt;20 and 21 October - A Computer Camp !&lt;/h2&gt;
&lt;p&gt;Add to this a few beers, and the sprint turns magically into a camp.
We'll be sprinting at the end of October (the 20 and 21) near Angers, on
daybed.&lt;/p&gt;
&lt;p&gt;We plan to have great food and wine, so if you feel like it and if you
want to come and work on some python-related things, you're invited!&lt;/p&gt;
&lt;p&gt;Although, I can host a limited number of persons, so you'll need to
contact me before :), that's alexis at notmyidea dot org.&lt;/p&gt;
&lt;p&gt;I've setup a wiki page to organize a bit everything (knowing how many
people will come by will allow me to handle things better), please put
information there:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wiki.python.org/moin/ComputerCampAlexis"&gt;http://wiki.python.org/moin/ComputerCampAlexis&lt;/a&gt;&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Circus sprint at PyconFR</title><link href="https://blog.notmyidea.org/circus-sprint-at-pyconfr.html" rel="alternate"></link><published>2012-09-17T00:00:00+02:00</published><updated>2012-09-17T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-09-17:/circus-sprint-at-pyconfr.html</id><summary type="html">
&lt;p&gt;Last Thursday to Sunday, &lt;a href="http://pycon.fr"&gt;Pycon France&lt;/a&gt; took place, in
Paris. It was the opportunity to meet a lot of people and to talk about
python awesomness in general.&lt;/p&gt;
&lt;p&gt;We had three tracks this year, plus sprints the two first days. We
sprinted on &lt;a href="http://circus.io"&gt;Circus&lt;/a&gt;, the process and socket manager
we're …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Last Thursday to Sunday, &lt;a href="http://pycon.fr"&gt;Pycon France&lt;/a&gt; took place, in
Paris. It was the opportunity to meet a lot of people and to talk about
python awesomness in general.&lt;/p&gt;
&lt;p&gt;We had three tracks this year, plus sprints the two first days. We
sprinted on &lt;a href="http://circus.io"&gt;Circus&lt;/a&gt;, the process and socket manager
we're using at Mozilla for some of our setups.&lt;/p&gt;
&lt;p&gt;The project gathered some interest, and we ended up with 5 persons
working on it. Of course, we spent some time explaining what is Circus,
how it had been built, a lot of time talking about use-cases and
possible improvements, but we also managed to add new features.&lt;/p&gt;
&lt;p&gt;Having people wanting to sprint on our projects is exciting because
that's when making things in the open unleashes its full potential. You
can't imagine how happy I was to have some friends come and work on this
with us :)&lt;/p&gt;
&lt;p&gt;Here is a wrap-up of the sprint:&lt;/p&gt;
&lt;h2 id="autocompletion-on-the-command-line"&gt;Autocompletion on the command-line&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://natim.ionyse.com"&gt;Remy Hubscher&lt;/a&gt; worked on the command-line
autocompletion. Now we have a fancy command-line interface which is able
to aucomplete if you're using bash. It seems that not that much work is
needed to make it happen on zsh as well :)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mozilla-services/circus/blob/master/extras/circusctl_bash_completion"&gt;Have a look at the
feature&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On the same topic, we now have a cool shell for Circus. If you start the
circusctl command without any option, you'll end-up with a cool shell.
Thanks &lt;a href="https://github.com/jojax"&gt;Jonathan Dorival&lt;/a&gt; for the work on
this! You can have a look at &lt;a href="https://github.com/mozilla-services/circus/pull/268"&gt;the pull
request&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="future-changes-to-the-web-ui"&gt;Future changes to the web ui&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/rachbelaid"&gt;Rachid Belaid&lt;/a&gt; had a deep look at the
source code and is much more familiarized to it now than before. We
discussed the possibility to change the implementation of the web ui,
and I'm glad of this. Currently, it's done with bottle.py and we want to
switch to pyramid.&lt;/p&gt;
&lt;p&gt;He fixed some issues that were in the tracker, so we now can have the
age of watchers in the webui, for instance.&lt;/p&gt;
&lt;h2 id="bug-and-doc-fixing"&gt;Bug and doc fixing&lt;/h2&gt;
&lt;p&gt;While reading the source code, we found some inconsistencies and fixed
them, with &lt;a href="http://mathieu.agopian.info/"&gt;Mathieu Agopian&lt;/a&gt;. We also
tried to improve the documentation at different levels.&lt;/p&gt;
&lt;p&gt;Documentation still needs a lot of love, and I'm planning to spend some
time on this shortly. I've gathered a bunch of feedback on this&lt;/p&gt;
&lt;h2 id="circus-clustering-capabilities"&gt;Circus clustering capabilities&lt;/h2&gt;
&lt;p&gt;One feature I wanted to work on during this sprint was the clustering
abilities of Circus. Nick Pellegrino made an internship on this topic at
Mozilla so we spent some time to review his pull requests.&lt;/p&gt;
&lt;p&gt;A lot of code was written for this so we discussed a bunch of things
regarding all of this. It took us more time than expected (and I still
need to spend more time on this to provide appropriate feedback), but it
allowed us to have a starting-point about what this clustering thing
could be.&lt;/p&gt;
&lt;p&gt;Remy wrote &lt;a href="http://tech.novapost.fr/circus-clustering-management-en.html"&gt;a good summary about our
brainstorming&lt;/a&gt;
so I'll not do it again here, but feel free to contact us if you have
ideas on this, they're very welcome!&lt;/p&gt;
&lt;h2 id="project-management"&gt;Project management&lt;/h2&gt;
&lt;p&gt;We've had some inquiries telling us that's not as easy as it should to
get started with the Circus project. Some of the reasons are that we
don't have any release schedule, and that the documentation is hairy
enough to lost people, at some point :)&lt;/p&gt;
&lt;p&gt;That's something we'll try to fix soon :)&lt;/p&gt;
&lt;p&gt;PyconFR was a very enjoyable event. I'm looking forward to meet the
community again and discuss how Circus can evolve in ways that are
interesting to everyone.&lt;/p&gt;
&lt;p&gt;Tarek and me are going to &lt;a href="http://python.ie/pycon/2012/"&gt;Pycon ireland&lt;/a&gt;,
feel free to reach us if you're going there, we'll be happy to meet and
enjoy beers!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Pourquoi Mozilla?</title><link href="https://blog.notmyidea.org/pourquoi-mozilla.html" rel="alternate"></link><published>2012-07-16T00:00:00+02:00</published><updated>2012-07-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-07-16:/pourquoi-mozilla.html</id><summary type="html">
&lt;p&gt;Depuis que j'ai commencé à bosser chez Mozilla, je me retrouve assez
souvent à expliquer ce que j'y fais. J'aime bien raconter l'histoire de
Mozilla, la mission, et comment je m'y rattache.&lt;/p&gt;
&lt;p&gt;Je prends bien sur un malin plaisir à expliquer à chaque fois les
tenants et les aboutissants, aussi …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Depuis que j'ai commencé à bosser chez Mozilla, je me retrouve assez
souvent à expliquer ce que j'y fais. J'aime bien raconter l'histoire de
Mozilla, la mission, et comment je m'y rattache.&lt;/p&gt;
&lt;p&gt;Je prends bien sur un malin plaisir à expliquer à chaque fois les
tenants et les aboutissants, aussi je me suis dit que ça pouvait avoir
du sens de l'écrire quelque part.&lt;/p&gt;
&lt;p&gt;Ça parle bien sur de logiciel libre, de protection de la vie privée et
de contre-pouvoirs.&lt;/p&gt;
&lt;p&gt;Je ne m'adresse pas ici aux afficionados du logiciel libre et du non
contrôle du web, mais aux potentiels intéressés, qui souhaitent
comprendre ce qu'on fait à Mozilla, pourquoi et comment, et plus
particulièrement quel est le rôle que je joue la dedans.&lt;/p&gt;
&lt;h2 id="logiciel-libre"&gt;Logiciel libre&lt;/h2&gt;
&lt;p&gt;Une des premières choses qui vient à l'esprit des gens quand on parle de
Mozilla, et par extension de Firefox, c'est qu'il s'agit d'un logiciel
gratuit. D'un logiciel soit disant "libre". Avouez que le concept est de
prime abord curieux. Un logiciel qui serait libéré, mais libéré de quoi
?&lt;/p&gt;
&lt;p&gt;Je ne vais pas refaire la génèse du logiciel et du logiciel libre, mais
pour résumer et expliquer ça très grossièrement, le logiciel libre c'est
pour moi l'idée de la collaboration. "Plutôt que de travailler chacun
dans son coin, construisons ensemble quelque chose qui nous sera utile à
tous". Ça marche dans le domaine de l'informatique parce qu'on est
exposé à un bien commun non matériel. Ce n'est pas parce que je te
donne un logiciel que je ne l'ai plus. La duplication est possible et
elle rend la collaboration plus facile.&lt;/p&gt;
&lt;h3 id="euh-oui-mais"&gt;Euh, oui mais…&lt;/h3&gt;
&lt;p&gt;Ok, ok. Et comment on coopère ? Derrière un logiciel, il faut écrire des
lignes de code, il faut décrire comment doit se comporter le logiciel
dans l'ensemble des cas qu'il peut rencontrer. Mais pas seulement.
Beaucoup de personnes travaillent pour faire en sorte que Firefox soit
disponible dans près de 100 langues et dialectes par exemple.&lt;/p&gt;
&lt;p&gt;J'aime beaucoup penser que le logiciel libre réussit à réunir des
personnes avec des objectifs differents. Linux, qui est un logiciel
libre, est par exemple utilisé dans beaucoup de domaines très différents
tels que la médecine, l'automobile ou l'énergie.&lt;/p&gt;
&lt;p&gt;Le logiciel libre est une valeur clé que nous défendons chez Mozilla.&lt;/p&gt;
&lt;h2 id="protection-de-la-vie-privee"&gt;Protection de la vie privée&lt;/h2&gt;
&lt;p&gt;Mozilla en fait un peu sa devise. Nous ne sommes pas une entreprise,
nous n'avons aucun intérêt à enfermer les utilisateurs chez nous, et
surtout nous n'exploitons et n'exploiterons pas les données utilisateurs
à des fins commerciales. Jamais.&lt;/p&gt;
&lt;h3 id="stockage-des-donnees"&gt;Stockage des données&lt;/h3&gt;
&lt;p&gt;Un exemple qui est frappant est celui de
&lt;a href="https://www.mozilla.org/en-US/mobile/sync/"&gt;Sync&lt;/a&gt;, l'outil qui permet
de synchroniser les données de navigation entre plusieurs périphériques
(Cela peut être utile pour avoir votre historique de navigation partagé
entre votre ordinateur de bureau et un téléphone portable par exemple)&lt;/p&gt;
&lt;p&gt;Les données qui sont stockées dans un service tel que sync sont
cruciales: vos mots de passe et votre historique de navigation par
exemple. Imaginez ce que des annonceurs publicitaires pourraient faire
avec ces données. Il est assez facile de connaître votre profil et donc
d'ensuite faire de la publicité ciblée à partir de ces informations.
Voire pire. Donner ces données à qui fait suffisemment pression sur vous
pour les récupérer.&lt;/p&gt;
&lt;p&gt;Heureusement, les données qui sont stockées sur les serveurs Sync sont
chifrées, et seul l'utilisateur a accès a la clé de chiffrement et de
déchiffrement. En d'autres termes, en ayant accès aux serveurs de
Mozilla, même de l'intérieur, je pourrais avoir accès à vos données mais
je ne pourrais rien en faire car celles-ci me sont impossibles à
déchiffrer.&lt;/p&gt;
&lt;p&gt;Mozilla essaye de mettre le doigt là où ça fait mal dans l'innovation
web : la publicité et le respect de la vie privée des utilisateurs.
Facebook, Google, Twitter sont autant d'entreprises qui gagnent de
l'argent grâce à leurs utilisateurs et à leurs données privées.&lt;/p&gt;
&lt;p&gt;Cela n'est pas &lt;em&gt;nécessairement&lt;/em&gt; un mal mais il me semble important
d'informer les utilisateurs d'Internet la dessus, et de leur proposer
des méthodes qui leur permettent de protéger leur vie privée.&lt;/p&gt;
&lt;h3 id="decentralisation"&gt;Décentralisation&lt;/h3&gt;
&lt;p&gt;Un autre aspect important est le fait que vous n'avez pas besoin de
dépendre des serveurs de Mozilla si vous ne souhaitez pas en dépendre.
Bien que nous fassions tout ce qui est en notre pouvoir pour avoir des
serveurs très réactifs et capables de tenir la charge, nous ne sommes
pas à l'abri de pannes. Auquel cas il vous faudra simplement vous armer
de patience.&lt;/p&gt;
&lt;p&gt;Mais il est possible pour vous de maintenir votre propre serveur et de
ne pas dépendre de Mozilla pour stocker vos données privées. J'ai parlé
de Sync mais Mozilla (j'en parle un peu plus bas) travaille aussi sur un
système d'exploitation pour téléphone portable, nommé Firefox OS
(anciennement Boot 2 Gecko), et sur l'écosystème qui va avec.&lt;/p&gt;
&lt;p&gt;Actuellement, si vous souhaitez synchroniser vos contacts par exemple,
vous dépendez quasiment toujours d'une autorité à qui vous ne faites
peut être pas confiance: Apple, Microsoft ou bien Google.&lt;/p&gt;
&lt;p&gt;On ne vous propose pas simplement de nous faire confiance, on vous
propose la possibilité de ne faire confiance qu'à ceux à qui vous
souhaitez accorder votre confiance, et ça peut être vous si vous le
souhaitez.&lt;/p&gt;
&lt;p&gt;La décentralisation à ceci de bon qu'elle vous laisse le choix d'où vous
souhaitez stocker vos données.&lt;/p&gt;
&lt;h2 id="innovation-et-standardisation"&gt;Innovation et standardisation&lt;/h2&gt;
&lt;p&gt;Mozilla, dès ses débuts, a été un laboratoire. Firefox (si je ne me
trompe pas) a été le premier navigateur à avoir des onglets. Le web,
c'est cool parce que ça bouge tout le temps ! (Edit: en fait, &lt;a href="http://en.wikipedia.org/wiki/Tabbed_document_interface"&gt;ce
n'était pas le
premier&lt;/a&gt;, mais
l'idée est là)&lt;/p&gt;
&lt;p&gt;La dernière innovation en date est Firefox OS: utilisons les
technologies du web pour créer un téléphone: utilisons le web comme
plateforme, et profitons de tout l'écosystème qui existe déjà autour de
celui-ci.&lt;/p&gt;
&lt;p&gt;C'est bien que ça bouge mais il faut qu'on se mette d'accord sur comment
on veut faire bouger les choses. La guerre des navigateurs a eu lieu. Ne
pas reproduire ça est parfois un challenge. La standardisation, tout le
monde s'y met.&lt;/p&gt;
&lt;p&gt;On a gagné une guerre: aux utilisateurs de choisir les outils qu'ils
souhaitent et non pas aux développeurs d'imposer leurs choix.&lt;/p&gt;
&lt;h2 id="et-moi-quest-ce-que-je-fais-la-dedans"&gt;Et moi, qu'est-ce que je fais la dedans ?&lt;/h2&gt;
&lt;p&gt;Je travaille dans l'équipe nommée Services. On travaille à la mise en
place de services web qui sont capables de tenir la charge, de
fonctionner de manière décentralisée.&lt;/p&gt;
&lt;p&gt;Ce travail a plusieurs objectifs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mettre à disposition des outils pour les développeurs, leur
permettant de créer des services de bonne qualité rapidement;&lt;/li&gt;
&lt;li&gt;Permettre aux utilisateurs d'héberger eux mêmes leurs propres
serveurs s'ils le souhaitent, réduisant leur dépendance a des
services externes.&lt;/li&gt;
&lt;li&gt;Écrire les services en question de telle manière que les
utilisateurs (vous !) puissent les utiliser sans avoir trop de
tracas :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ça semble peu, mais j'aime ce boulot. Éthiquement et techniquement.
C'est ça, pour moi, la mission de Mozilla. Si vous avez des suggestions
sur ce qui pourrait être amélioré dans les services de Mozilla en termes
de protection de la vie privée, de décentralisation et de haute
disponibilité, vous savez vers qui vous tourner !&lt;/p&gt;
&lt;p&gt;La liste des projets sur lesquels je travaille ou j'ai travaillé à
Mozilla pour l'instant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mozilla-services/tokenserver"&gt;https://github.com/mozilla-services/tokenserver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://circus.io/"&gt;http://circus.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://powerhose.rtfd.org/"&gt;http://powerhose.rtfd.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mozilla-services/server-aitc"&gt;https://github.com/mozilla-services/server-aitc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cornice.readthedocs.org/en/latest/index.html"&gt;http://cornice.readthedocs.org/en/latest/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mozilla/PyBrowserID/"&gt;https://github.com/mozilla/PyBrowserID/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chaussette.readthedocs.org/en/0.3/index.html"&gt;http://chaussette.readthedocs.org/en/0.3/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Journal"></category></entry><entry><title>Lifestyle</title><link href="https://blog.notmyidea.org/lifestyle.html" rel="alternate"></link><published>2012-05-11T00:00:00+02:00</published><updated>2012-05-11T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-05-11:/lifestyle.html</id><summary type="html">
&lt;p&gt;Eh beh, c'est pas aussi simple qu'il y parait de trouver un
environnement qui permette autant de travailler correctement et de ne
pas s'enfermer dans le boulot.&lt;/p&gt;
&lt;p&gt;Surtout si comme moi vous cherchez à limiter vos déplacement, que vous
aimez vivre avec peu et cherchez à trouver un équilibre entre …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Eh beh, c'est pas aussi simple qu'il y parait de trouver un
environnement qui permette autant de travailler correctement et de ne
pas s'enfermer dans le boulot.&lt;/p&gt;
&lt;p&gt;Surtout si comme moi vous cherchez à limiter vos déplacement, que vous
aimez vivre avec peu et cherchez à trouver un équilibre entre une vie
connectée et une vie &lt;em&gt;réelle&lt;/em&gt; (oui, celle avec des vrais gens qui ont
d'autres préoccupations que l'informatique !). Comment réussir à
trouver un juste milieu entre le geek inconditionnel et le bon vivant,
qui à du temps à consacrer à autre chose qu'à son travail ?&lt;/p&gt;
&lt;h2 id="voyages"&gt;Voyages&lt;/h2&gt;
&lt;p&gt;Un des premiers trucs que j'ai trouvé surprennant en arrivant à Mozilla,
c'est la fréquence des voyages que l'on peut être amené à avoir. Ah,
c'est pour la bonne cause, c'est tellement plus sympa d'avoir les
collègues à coté pour bosser, plutôt qu'à l'autre bout du monde. Mais
quand même, si je le voulais, entre les semaines de travail et les
conférences, je pourrais être tous les deux mois aux États-Unis !&lt;/p&gt;
&lt;p&gt;Une aubaine, penserons certains. Voyager, c'est &lt;em&gt;cool&lt;/em&gt; ! Bon, si on
mets de coté le cout écologique d'un voyage (nécessairement en avion),
la chose qui me dérange le plus c'est cette impression de venir pour
repartir. Voyager, c'est sympa, mais avoir le temps de prendre un rythme
de vie différent, de rencontrer des gens, de construire quelque chose,
ça me manque.&lt;/p&gt;
&lt;p&gt;Donc je décline quand je n'en ai pas l'envie, tout simplement. Je loupe
des choses intéressantes (&lt;a href="http://pycon.us"&gt;PyCon&lt;/a&gt; à Santa Clara avait
vraiment l'air chouette !), mais ça me permet également d'avoir plus de
temps pour vivre là ou j'habite, pour construire quelque chose
localement. Et puis des évènements, il y en à tellement en France et en
Europe auquel je n'assiste pas que ça me fait mal au cœur d'aller à
l'autre bout du monde pour faire la même chose !&lt;/p&gt;
&lt;p&gt;Bien sur, je serais amené à voyager. Et autant que faire se peut je le
ferais avec plaisir et je tenterais de rester un peu plus avant et après
sur place (plus question de faire un aller/retour en une semaine !),
question de me faire à l'atmosphère ! &lt;a href="http://ziade.org"&gt;Tarek&lt;/a&gt; est par
exemple resté un mois à San Francisco en janvier pour son dernier
séjour, alors pourquoi ne pas prendre exemple ? Tout de suite ça me
parles plus.&lt;/p&gt;
&lt;h2 id="et-quand-est-ce-quon-arrete"&gt;Et quand-est-ce qu'on arrête ?&lt;/h2&gt;
&lt;p&gt;Une autre chose assez difficile à gérer, c'est le temps.&lt;/p&gt;
&lt;p&gt;J'ai vraiment une chance monstrueuse, celle de faire un travail qui me
plait, éthiquement et techniquement. Je pourrais y passer mes journées
et mes nuits que je n'aimerais pas moins ça (même si il m'arrive bien
sur de saturer !).&lt;/p&gt;
&lt;p&gt;Mais j'ai aussi d'autres envies, qui signifient aussi passer du temps
hors-ligne, parce que bizarrement, c'est là que j'ai l'impression de
réfléchir le plus. Loin de ce surplus d'informations…&lt;/p&gt;
&lt;p&gt;Facile à dire.&lt;/p&gt;
&lt;p&gt;D'autant que quand il est possible de travailler depuis n'importe où, la
séparation physique entre le lieu de travail et le lieu de vie tends à
disparaitre assez facilement. Et sans séparation physique, il faut une
sacré motivation pour savoir quand commencer et quand s'arrêter.&lt;/p&gt;
&lt;p&gt;J'essaye de me donner une règle simple: point trop n'en faut. Aucun
intérêt à rester travailler des heures durant sans s'arrêter, ou en
tout cas pas d'intérêt à le faire de manière trop régulière. Une journée
qui commence tôt (\~9h) me permet de me concentrer le matin (les
collègues californiens dorment) et d'avoir un rythme assez "normal". Et
puis, avec ce soleil qui commence à inonder les terrasses, autant faire
autre chose que de rester enfermé à coder en fin d'après midi !&lt;/p&gt;
&lt;h2 id="surplus"&gt;Surplus&lt;/h2&gt;
&lt;p&gt;Tiens, je parlais de surplus, nous y sommes. Que ça soit le surplus
d'informations ou le surplus d'objets, ça m'encombre ! Une journée,
pour ma part est faite de communications diverses, de code et de
lectures (se tenir au courant de ce qui se passe dans le monde du
logiciel n'est pas une tâche des plus facile, et qui peut facilement
prendre énormément de temps).&lt;/p&gt;
&lt;p&gt;Je me demande si je ne devrais pas aspirer à la frugalité de ce coté là
également. Je reçois des mails toute la journée, et mon aggrégateur
rss/atom se remplit également très vite. Mais je n'ai aucunement besoin
d'avoir toutes ces informations dans l'heure, et de les vérifier de
manière fréquente. De la même manière, j'ai simplement arrêté de lire
mes flux rss.&lt;/p&gt;
&lt;p&gt;Quelques (longues) fois dans la semaine semblent suffire et me
permettent de réussir à rester concentrer.&lt;/p&gt;
&lt;h2 id="resolutions"&gt;Résolutions&lt;/h2&gt;
&lt;p&gt;Soyons fous, tentons quelque chose de nouveau, c'est le printemps ! Pas
de communication dans la matinée, je n'en ai probablement pas besoin,
sauf cas extrêmes. Le matin, c'est pour se concentrer sur le travail à
faire.&lt;/p&gt;
&lt;p&gt;Une fois les mails du matin dépilés (à 9h30), pas la peine de garder un
œil sur ma boite mail, j'irais y faire un tour en début et en fin
d'après midi.&lt;/p&gt;
&lt;p&gt;Je pense même à débrancher internet, pour éviter les interactions et
pour me concentrer, mais j'ai comme l'impression que c'est un peu trop
abrupt comme approche.&lt;/p&gt;
&lt;p&gt;Aussi, définir en début de journée la liste des choses prévues, et
revenir dessus jour après jour me permettra surement d'avoir un aperçu
un peu plus global du travail accompli.&lt;/p&gt;
&lt;p&gt;L'avenir dira si tout ça fonctionne :-)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Refactoring Cornice</title><link href="https://blog.notmyidea.org/refactoring-cornice.html" rel="alternate"></link><published>2012-05-01T00:00:00+02:00</published><updated>2012-05-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-05-01:/refactoring-cornice.html</id><summary type="html">
&lt;p&gt;After working for a while with &lt;a href="http://cornice.readthedocs.com"&gt;Cornice&lt;/a&gt;
to define our APIs at &lt;a href="http://docs.services.mozilla.com"&gt;Services&lt;/a&gt;, it
turned out that the current implementation wasn't flexible enough to
allow us to do what we wanted to do.&lt;/p&gt;
&lt;p&gt;Cornice started as a toolkit on top of the
&lt;a href="http://docs.pylonsproject.org/en/latest/docs/pyramid.html"&gt;pyramid&lt;/a&gt;
routing system, allowing to register services in …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;After working for a while with &lt;a href="http://cornice.readthedocs.com"&gt;Cornice&lt;/a&gt;
to define our APIs at &lt;a href="http://docs.services.mozilla.com"&gt;Services&lt;/a&gt;, it
turned out that the current implementation wasn't flexible enough to
allow us to do what we wanted to do.&lt;/p&gt;
&lt;p&gt;Cornice started as a toolkit on top of the
&lt;a href="http://docs.pylonsproject.org/en/latest/docs/pyramid.html"&gt;pyramid&lt;/a&gt;
routing system, allowing to register services in a simpler way. Then we
added some niceties such as the ability to automatically generate the
services documentation or returning the correct HTTP headers &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;as defined
by the HTTP
specification&lt;/a&gt;
without the need from the developer to deal with them nor to know them.&lt;/p&gt;
&lt;p&gt;If you're not familiar with Cornice, here is how you define a simple
service with it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cornice.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;
&lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;validators&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_drink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# do something with the request (with moderation).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This external API is quite cool, as it allows to do a bunch of things
quite easily. For instance, we've written our
&lt;a href="https://github.com/mozilla-services/tokenserver"&gt;token-server&lt;/a&gt; code on
top of this in a blast.&lt;/p&gt;
&lt;h2 id="the-burden"&gt;The burden&lt;/h2&gt;
&lt;p&gt;The problem with this was that we were mixing internally the service
description logic with the route registration one. The way we were doing
this was via an extensive use of decorators internally.&lt;/p&gt;
&lt;p&gt;The API of the cornice.service.Service class was as following
(simplified so you can get the gist of it).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;service_kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# some information, such as the colander schemas (for validation),&lt;/span&gt;
&lt;span class="c1"&gt;# the defined methods that had been registered for this service and&lt;/span&gt;
&lt;span class="c1"&gt;# some other things were registered as instance variables.&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schemas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service_kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, None)&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defined_methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;definitions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;view_kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;This method is a decorator that is being used by some alias&lt;/span&gt;
&lt;span class="sd"&gt; methods.&lt;/span&gt;
&lt;span class="sd"&gt; &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# all the logic goes here. And when I mean all the logic, I&lt;/span&gt;
&lt;span class="c1"&gt;# mean it.&lt;/span&gt;
&lt;span class="c1"&gt;# 1. we are registering a callback to the pyramid routing&lt;/span&gt;
&lt;span class="c1"&gt;# system so it gets called whenever the module using the&lt;/span&gt;
&lt;span class="c1"&gt;# decorator is used.&lt;/span&gt;
&lt;span class="c1"&gt;# 2. we are transforming the passed arguments so they conform&lt;/span&gt;
&lt;span class="c1"&gt;# to what is expected by the pyramid routing system.&lt;/span&gt;
&lt;span class="c1"&gt;# 3. We are storing some of the passed arguments into the&lt;/span&gt;
&lt;span class="c1"&gt;# object so we can retrieve them later on.&lt;/span&gt;
&lt;span class="c1"&gt;# 4. Also, we are transforming the passed view before&lt;/span&gt;
&lt;span class="c1"&gt;# registering it in the pyramid routing system so that it&lt;/span&gt;
&lt;span class="c1"&gt;# can do what Cornice wants it to do (checking some rules,&lt;/span&gt;
&lt;span class="c1"&gt;# applying validators and filters etc.&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;A shortcut of the api decorator&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I encourage you to go read &lt;a href="https://github.com/mozilla-services/cornice/blob/4e0392a2ae137b6a11690459bcafd7325e86fa9e/cornice/service.py#L44"&gt;the entire
file&lt;/a&gt;.
on github so you can get a better opinion on how all of this was done.&lt;/p&gt;
&lt;p&gt;A bunch of things are wrong:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first, we are not separating the description logic from the
registration one. This causes problems when we need to access the
parameters passed to the service, because the parameters you get are
not exactly the ones you passed but the ones that the pyramid
routing system is expecting. For instance, if you want to get the
view get_drink, you will instead get a decorator which contains
this view.&lt;/li&gt;
&lt;li&gt;second, we are using decorators as APIs we expose. Even if
decorators are good as shortcuts, they shouldn't be the default way
to deal with an API. A good example of this is &lt;a href="https://github.com/mozilla-services/cornice/blob/4e0392a2ae137b6a11690459bcafd7325e86fa9e/cornice/resource.py#L56"&gt;how the resource
module consumes this
API&lt;/a&gt;.
This is quite hard to follow.&lt;/li&gt;
&lt;li&gt;Third, in the api method, a bunch of things are done regarding
inheritance of parameters that are passed to the service or to its
decorator methods. This leaves you with a really hard to follow path
when it comes to add new parameters to your API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-do-we-improve-this"&gt;How do we improve this?&lt;/h2&gt;
&lt;p&gt;Python is great because it allows you to refactor things in an easy way.
What I did isn't breaking our APIs, but make things way simpler to
hack-on. One example is that it allowed me to add features that we
wanted to bring to Cornice really quickly (a matter of minutes), without
touching the API that much.&lt;/p&gt;
&lt;p&gt;Here is the gist of the new architecture:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# we define class-level variables that will be the default values for&lt;/span&gt;
&lt;span class="c1"&gt;# this service. This makes things more extensible than it was before.&lt;/span&gt;
&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;simplejson&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;default_validators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_VALIDATORS&lt;/span&gt;
&lt;span class="n"&gt;default_filters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_FILTERS&lt;/span&gt;
&lt;span class="c1"&gt;# we also have some class-level parameters that are useful to know&lt;/span&gt;
&lt;span class="c1"&gt;# which parameters are supposed to be lists (and so converted as such)&lt;/span&gt;
&lt;span class="c1"&gt;# or which are mandatory.&lt;/span&gt;
&lt;span class="n"&gt;mandatory_arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;renderer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;span class="n"&gt;list_arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;validators&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;filters&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# setup name, path and description as instance variables&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;
&lt;span class="c1"&gt;# convert the arguments passed to something we want to store&lt;/span&gt;
&lt;span class="c1"&gt;# and then store them as attributes of the instance (because they&lt;/span&gt;
&lt;span class="c1"&gt;# were passed to the constructor&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="nb"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# we keep having the defined_methods tuple and the list of&lt;/span&gt;
&lt;span class="c1"&gt;# definitions that are done for this service&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defined_methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;definitions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Returns a dict of arguments. It does all the conversions for&lt;/span&gt;
&lt;span class="sd"&gt; you, and uses the information that were defined at the instance&lt;/span&gt;
&lt;span class="sd"&gt; level as fallbacks.&lt;/span&gt;
&lt;span class="sd"&gt; &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Add a view to this service.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# this is really simple and looks a lot like this&lt;/span&gt;
&lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;definitions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defined_methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defined_methods&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;This is only another interface to the add_view method, exposing a&lt;/span&gt;
&lt;span class="sd"&gt; decorator interface&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So, the service is now only storing the information that's passed to it
and nothing more. No more route registration logic goes here. Instead, I
added this as another feature, even in a different module. The function
is named register_service_views and has the following signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;register_service_views&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To sum up, here are the changes I made:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Service description is now separated from the route registration.&lt;/li&gt;
&lt;li&gt;cornice.service.Service now provides a hook_view method, which is
not a decorator. decorators are still present but they are optional
(you don't need to use them if you don't want to).&lt;/li&gt;
&lt;li&gt;Everything has been decoupled as much as possible, meaning that you
really can use the Service class as a container of information about
the services you are describing. This is especially useful when
generating documentation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As a result, it is now possible to use Cornice with other frameworks. It
means that you can stick with the service description but plug any other
framework on top of it. cornice.services.Service is now only a
description tool. To register routes, one would need to read the
information contained into this service and inject the right parameters
into their preferred routing system.&lt;/p&gt;
&lt;p&gt;However, no integration with other frameworks is done at the moment even
if the design allows it.&lt;/p&gt;
&lt;p&gt;The same way, the sphinx description layer is now only a consumer of
this service description tool: it looks at what's described and build-up
the documentation from it.&lt;/p&gt;
&lt;p&gt;The resulting branch is not merged yet. Still, you can &lt;a href="https://github.com/mozilla-services/cornice/tree/refactor-the-world"&gt;have a look at
it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Any suggestions are of course welcome :-)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Bidouille</title><link href="https://blog.notmyidea.org/bidouille.html" rel="alternate"></link><published>2012-04-30T00:00:00+02:00</published><updated>2012-04-30T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-04-30:/bidouille.html</id><summary type="html">
&lt;p&gt;Bidouille bidouille bidouille.&lt;/p&gt;
&lt;p&gt;Je pense que je suis un bidouilleur logiciel: j'aime bien aller
farfouiller dans le code pour comprendre comment tel ou tel programme
fonctionne (ou trop souvent comment il ne fonctionne pas !), faire des
petites modifications, tester, modifier, re-tester, tout casser, réparer
&lt;/p&gt;
&lt;p&gt;Et cette bidouille, cette envie de …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Bidouille bidouille bidouille.&lt;/p&gt;
&lt;p&gt;Je pense que je suis un bidouilleur logiciel: j'aime bien aller
farfouiller dans le code pour comprendre comment tel ou tel programme
fonctionne (ou trop souvent comment il ne fonctionne pas !), faire des
petites modifications, tester, modifier, re-tester, tout casser, réparer
&lt;/p&gt;
&lt;p&gt;Et cette bidouille, cette envie de comprendre comment les choses
fonctionnent, et depuis peu cette envie de mettre en pratique ces
connaissances dépasse la bidouille logicielle. J'ai passé une grosse
partie de mon week-end à Main d'Œuvre, où l'association &lt;a href="http://www.underconstruction.fr"&gt;Under
Construction&lt;/a&gt; faisait se rencontrer le
milieu de l'éducation populaire et le milieu de la bidouille.&lt;/p&gt;
&lt;p&gt;Forcement, ni une ni deux, je saute dans le bateau en marche et, n'étant
ni un très grand bidouilleur ni un très grand animateur, j'en ressort
enrichi de toutes ces rencontres, de tous ces préjugés qui tombent, et
de quelques découvertes bluffantes, des idées plein la tête.&lt;/p&gt;
&lt;p&gt;J'avais entendu parler des "&lt;a href="http://www.reprap.org"&gt;rep-raps&lt;/a&gt;", des
imprimantes en 3 dimensions capables de produire des pièces en plastique
mais je n'avais jamais eu l'occasion de voir le bousin en vrai. Et c'est
impressionnant. Vraiment. ("Bienvenue dans le 21ème siècle !")&lt;/p&gt;
&lt;p&gt;Ça laisse énormément à penser autour des questions d'émancipation
technologique, et de non dépendance envers les constructeurs, dans le
milieu de l'électro-ménager, par exemple. "Ah tiens, cette pièce est
cassée, je vais aller utiliser la rep-rap du coin pour me la fabriquer".
Et hop, on mets fin à tout un cycle d'obsolescence programmée…&lt;/p&gt;
&lt;p&gt;Mais au delà du défi technique et technologique, j'ai pu refaire un
petit peu d'électronique, et découvrir que j'y prends vraiment gout
rapidement. Il y a bien évidemment un coté très ludique (la led s'allume
quand on la branche), mais il y a surtout cette notion de DIY (Do It
Yourself) sous jacente: une fois que je sais comment ça fonctionne, je
peux vraiment faire des choses utiles de mes 10 doigts, réparer des
petits objets, bidouiller ceux existants etc.&lt;/p&gt;
&lt;p&gt;De la récupération de composants on essaye de voir ce qu'on peut faire,
on a terminé par faire un "vibro-bot", un vibreur de téléphone portable
monté sur une tête de brosse à dents, faisant donc avancer cette
dernière.&lt;/p&gt;
&lt;p&gt;C'est pour s'amuser, c'est pas sérieux ! Pour autant, les concepts de
l'électricité sont appris et je me retrouve avec cette envie de
comprendre un peu plus ce monde de l'électronique qui, je m'en rends
compte, m'échappe encore complètement. De l'éducation à la bidouille !&lt;/p&gt;
&lt;p&gt;Allez, demain c'est fer à souder, piles, leds, interrupteurs, potars et
c'est parti !&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Djangocong 2012</title><link href="https://blog.notmyidea.org/djangocong-2012.html" rel="alternate"></link><published>2012-04-16T00:00:00+02:00</published><updated>2012-04-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-04-16:/djangocong-2012.html</id><summary type="html">
&lt;p&gt;Ce week-end, c'était &lt;a href="http://rencontres.django-fr.org"&gt;djangocong&lt;/a&gt;, une
conférence autour de &lt;a href="http://djangoproject.org"&gt;django&lt;/a&gt;, de
&lt;a href="http://python.org"&gt;python&lt;/a&gt; et du web, qui avait lieu dans le sud, à
Carnon-plage, à quelques kilomètres de Montpellier la belle.&lt;/p&gt;
&lt;p&gt;J'ai vraiment apprécié les trois jours passés avec cette bande de geeks.
Je m'attendais à des &lt;em&gt;nerds&lt;/em&gt;, j'y ai trouvé une …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Ce week-end, c'était &lt;a href="http://rencontres.django-fr.org"&gt;djangocong&lt;/a&gt;, une
conférence autour de &lt;a href="http://djangoproject.org"&gt;django&lt;/a&gt;, de
&lt;a href="http://python.org"&gt;python&lt;/a&gt; et du web, qui avait lieu dans le sud, à
Carnon-plage, à quelques kilomètres de Montpellier la belle.&lt;/p&gt;
&lt;p&gt;J'ai vraiment apprécié les trois jours passés avec cette bande de geeks.
Je m'attendais à des &lt;em&gt;nerds&lt;/em&gt;, j'y ai trouvé une qualité d'écoute, des
personnes qui partagent des valeurs qui leur sont chères, mais qui ne
limitent pas leurs discussions à du technique. Eeeh ouais, encore un
préjugé qui tombe, tiens :)&lt;/p&gt;
&lt;p&gt;En tant que &lt;em&gt;hackers&lt;/em&gt;, on a le moyen de créer des outils qui sont utiles
à tous, et qui peuvent être utiles pour favoriser la collaboration et la
mise en commun des données. J'ai eu l'occasion de discuter de projets
tournant autour de l'entraide, que ça soit pour mettre en lien des
associations d'économie sociale et solidaire (ESS) ou simplement pour
que les populations &lt;em&gt;non tech&lt;/em&gt; &lt;a href="http://blog.notmyidea.org/quels-usages-pour-linformatique-fr.html"&gt;puissent utiliser toute la puissance de
l'outil qu'est le
web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Au niveau du format des conférences, je ne savais pas trop à quoi
m'attendre, au vu des échos de l'an dernier, mais c'était adapté: des
mini-confs de 12mn le samedi matin + début d'aprem, en mode no-wifi pour
récupérer une qualité d'écoute. Et contrairement à mes attentes, ce
n'est pas trop court. Pas mal de retours d'expérience pour le coup, et
une matinée pas vraiment techniques, mais ça pose le décor et permet de
savoir qui fait quoi.&lt;/p&gt;
&lt;p&gt;Parmi l'ensemble des conférences du matin, je retiens principalement
celle de Mathieu Leplatre, "des cartes d'un autre monde", qui m'a
réellement bluffée quand à la facilité de créer des cartes avec
&lt;a href="http://mapbox.com/tilemill/"&gt;TileMill&lt;/a&gt;, et qui me pousse à reconsidérer
le fait que "la carto, c'est compliqué". &lt;a href="https://www.youtube.com/watch?v=7NPQo54NbJ8"&gt;La vidéo est (déja !)
disponible en ligne&lt;/a&gt;, je
vous invite à la regarder (c'est une 15aine de minutes) pour vous faire
un avis ;)&lt;/p&gt;
&lt;p&gt;Une fois les conf passées, ça reste très intéressant, voire plus: il
reste un jour et demi pour discuter avec les autres présents. On a pu se
retrouver avec Mathieu pour discuter de "notre" projet &lt;a href="http://blog.notmyidea.org/carto-forms-fr.html"&gt;"carto
forms"&lt;/a&gt;, qui à finalement
pu se redéfinir un peu plus et donner naissance à un
&lt;a href="https://github.com/spiral-project/daybed/blob/master/README.rst"&gt;README&lt;/a&gt;.
On en à profité pour lui choisir un nouveau nom: "daybed", en référence
à couchdb.&lt;/p&gt;
&lt;p&gt;Ça devrait se transformer en code d'ici peu. La curiosité aidant, on a
pu discuter du projet avec d'autres personnes et affiner les attentes de
chacun pour finalement arriver à quelque chose d'assez sympathique.&lt;/p&gt;
&lt;p&gt;J'ai aussi pu me rendre compte que pas mal de monde utilise
&lt;a href="http://pelican.notmyidea.org"&gt;pelican&lt;/a&gt;, le bout de code que j'ai codé
pour générer ce blog, et avoir des retours utiles ! Probablement des
réflexions à venir sur comment éviter qu'un projet open-source ne
devienne chronophage, et sur comment réussir à garder une qualité dans
le code source tout en ne froissant pas les contributeurs.&lt;/p&gt;
&lt;p&gt;Bien évidemment, c'était aussi l'occaz de rencontrer des gens qu'on ne
voir que sur les inter-nets, et de discuter un brin de tout ce qui fait
que notre monde est chouette et moins chouette.&lt;/p&gt;
&lt;p&gt;Entres autres faits notoires, JMad a perdu au baby-foot face à Exirel,
même en m'ayant à ses cotés pour le déconcentrer (et je suis un joueur
d'un autre monde - en d'autres termes, je suis nul), David`bgk ne s'est
pas levé pour aller courir le dimanche matin (il avait dit 5 heures!),
Les suisses ont essayé de me convertir à coup d'abricotine, j'ai perdu
au skulls-n-roses en quelques tours et on a allumé un feu chez Stéphane
le dimanche soir (oui oui, à montpellier, mi avril, je vous le dis
qu'ils mentent avec leur soit disant soleil).&lt;/p&gt;
&lt;p&gt;Et c'est sans parler de &lt;a href="http://jehaisleprintemps.net/blog/fr/2012/04/15/j-ecris-ton-nom/"&gt;la
brasucade&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Bref, vivement la prochaine (et allez, cette fois ci je ferais une
présentation !)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Génération de formulaires, geolocalisés ?</title><link href="https://blog.notmyidea.org/generation-de-formulaires-geolocalises.html" rel="alternate"></link><published>2012-04-02T00:00:00+02:00</published><updated>2012-04-02T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-04-02:/generation-de-formulaires-geolocalises.html</id><summary type="html">
&lt;p&gt;On a un plan. Un "truc de ouf".&lt;/p&gt;
&lt;p&gt;À plusieurs reprises, des amis m'ont demandé de leur coder la même
chose, à quelques détails près: une page web avec un formulaire qui
permettrait de soumettre des informations géographiques, lié à une carte
et des manières de filtrer l'information.&lt;/p&gt;
&lt;p&gt;L'idée fait …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;On a un plan. Un "truc de ouf".&lt;/p&gt;
&lt;p&gt;À plusieurs reprises, des amis m'ont demandé de leur coder la même
chose, à quelques détails près: une page web avec un formulaire qui
permettrait de soumettre des informations géographiques, lié à une carte
et des manières de filtrer l'information.&lt;/p&gt;
&lt;p&gt;L'idée fait son bout de chemin, et je commence à penser qu'on peut même
avoir quelque chose de vraiment flexible et utile. J'ai nommé le projet
&lt;em&gt;carto-forms&lt;/em&gt; pour l'instant (mais c'est uniquement un nom de code).&lt;/p&gt;
&lt;p&gt;Pour résumer: et si on avait un moyen de construire des formulaires, un
peu comme Google forms, mais avec des informations géographiques en
plus?&lt;/p&gt;
&lt;p&gt;Si vous ne connaissez pas Google forms, il s'agit d'une interface simple
d'utilisation pour générer des formulaires et récupérer des informations
depuis ces derniers.&lt;/p&gt;
&lt;p&gt;Google forms est un super outil mais à mon avis manque deux choses
importantes: premièrement, il s'agit d'un outil propriétaire (oui, on
peut aussi dire privateur) et il n'est donc pas possible de le hacker un
peu pour le faire devenir ce qu'on souhaite, ni l'installer sur notre
propre serveur. Deuxièmement, il ne sait pas vraiment fonctionner avec
des informations géographiques, et il n'y à pas d'autre moyen de filtrer
les informations que l'utilisation de leur système de feuilles de
calcul.&lt;/p&gt;
&lt;p&gt;Après avoir réfléchi un petit peu à ça, j'ai contacté
&lt;a href="http://blog.mathieu-leplatre.info/"&gt;Mathieu&lt;/a&gt; et les anciens collègues
de chez &lt;a href="http://makina-corpus.com"&gt;Makina Corpus&lt;/a&gt;, puisque les projets
libres à base de carto sont à même de les intéresser.&lt;/p&gt;
&lt;p&gt;Imaginez le cas suivant:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dans une "mapping party", on choisit un sujet particulier à
cartographier et on design un formulaire (liste des champs (tags) a
remplir + description + le type d'information) ;&lt;/li&gt;
&lt;li&gt;Sur place, les utilisateurs remplissent les champs du formulaire
avec ce qu'ils voient. Les champs géolocalisés peuvent être remplis
automatiquement avec la géolocalisation du téléphone ;&lt;/li&gt;
&lt;li&gt;À la fin de la journée, il est possible de voir une carte des
contributions, avec le formulaire choisi ;&lt;/li&gt;
&lt;li&gt;Un script peut importer les résultats et les publier vers
OpenStreetMap.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="quelques-cas-dutilisation"&gt;Quelques cas d'utilisation&lt;/h2&gt;
&lt;p&gt;J'arrive à imaginer différents cas d'utilisation pour cet outil. Le
premier est celui que j'ai approximativement décrit plus haut: la
génération de cartes de manière collaborative, avec des filtres à
facettes. Voici un flux d'utilisation général:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un "administrateur" se rend sur le site web et crée un nouveau
formulaire pour l'ensemble des évènements alternatifs. Il crée les
champs suivants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nom: le champ qui contient le nom de l'évènement.&lt;/li&gt;
&lt;li&gt;Catégorie: la catégorie de l'évènement (marche, concert,
manifestation…). Il peut s'agir d'un champ à multiples
occurrences.&lt;/li&gt;
&lt;li&gt;Le lieu de l'évènement. Celui-ci peut être donné soit par une
adresse soit en sélectionnant un point sur une carte.&lt;/li&gt;
&lt;li&gt;Date: la date de l'évènement (un "date picker" peut permettre
cela facilement)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chaque champ dans le formulaire a des informations sémantiques
associées (oui/non, multiple sélection, date, heure, champ géocodé,
sélection carto, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une fois terminé, le formulaire est généré et une URL permet d'y
accéder. (par exemple &lt;a href="http://forms.notmyidea.org/alternatives"&gt;http://forms.notmyidea.org/alternatives&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une API REST permet à d'autres applications d'accéder aux
informations et d'en ajouter / modifier de nouvelles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il est maintenant possible de donner l'URL à qui voudra en faire bon
usage. N'importe qui peut ajouter des informations. On peut
également imaginer une manière de modérer les modifications si
besoin est.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bien sur, la dernière phase est la plus intéressante: il est
possible de filtrer les informations par lieu, catégorie ou date, le
tout soit via une API REST, soit via une jolie carte et quelques
contrôles bien placés, dans le navigateur.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous avez dû remarquer que le processus de création d'un formulaire est
volontairement très simple. L'idée est que n'importe qui puisse créer
des cartes facilement, en quelques clics. Si une API bien pensée suit,
on peut imaginer faire de la validation coté serveur et même faire des
applications pour téléphone assez simplement.&lt;/p&gt;
&lt;p&gt;Pour aller un peu plus loin, si on arrive à penser un format de
description pour le formulaire, il sera possible de construire les
formulaires de manière automatisée sur différentes plateformes et
également sur des clients génériques.&lt;/p&gt;
&lt;p&gt;On imagine pas mal d'exemples pour ce projet: des points de recyclage,
les endroits accessibles (pour fauteuils roulants etc.), identification
des arbres, bons coins à champignons, recensement des espèces en voie de
disparition (l'aigle de Bonelli est actuellement suivi en utilisant une
feuille de calcul partagée !), suivi des espèces dangereuses (le frelon
asiatique par exemple), cartographier les points d'affichage
publicitaires, participation citoyenne (graffitis, nids de poule, voir
&lt;a href="http://fixmystreet.ca"&gt;http://fixmystreet.ca&lt;/a&gt;), geocaching, trajectoires (randonnées,
coureurs, cyclistes)…&lt;/p&gt;
&lt;p&gt;Voici quelques exemples où ce projet pourrait être utile (la liste n'est
pas exhaustive):&lt;/p&gt;
&lt;h3 id="un-backend-sig-simple-a-utiliser"&gt;Un backend SIG simple à utiliser&lt;/h3&gt;
&lt;p&gt;Disons que vous êtes développeur mobile. Vous ne voulez pas vous
encombrer avec PostGIS ou écrire du code spécifique pour récupérer et
insérer des données SIG! Vous avez besoin de &lt;em&gt;Carto-Forms&lt;/em&gt;! Une API
simple vous aide à penser vos modèles et vos formulaires, et cette même
API vous permet d'insérer et de récupérer des données. Vous pouvez vous
concentrer sur votre application et non pas sur la manière dont les
données géographiques sont stockées et gérées.&lt;/p&gt;
&lt;p&gt;En d'autres termes, vous faites une distinction entre le stockage des
informations et leur affichage.&lt;/p&gt;
&lt;p&gt;Si vous êtes un développeur django, plomino, drupal etc. vous pouvez
développer un module pour "plugger" vos modèles et votre interface
utilisateur avec celle de &lt;em&gt;Carto-Forms&lt;/em&gt;. De cette manière, il est
possible d'exposer les formulaires aux utilisateurs de vos backoffices.
De la même manière, il est possible d'écrire des widgets qui consomment
des données et les affichent (en utilisant par exemple une bibliothèque
javascript de webmapping).&lt;/p&gt;
&lt;h3 id="un-outil-de-visualisation"&gt;Un outil de visualisation&lt;/h3&gt;
&lt;p&gt;Puisque les données peuvent être proposées de manière automatisée en
utilisant l'API, vous pouvez utiliser la page de résultat de Carto-forms
comme un outil de visualisation.&lt;/p&gt;
&lt;p&gt;Il est possible d'explorer mon jeu de données en utilisant des filtres
sur chacun des champs. La recherche à facettes peut être une idée pour
faciliter ce filtrage. Une carte affiche le résultat. Vous avez
l'impressoin d'être en face d'un système d'aide à la décision !&lt;/p&gt;
&lt;p&gt;Évidemment, il est possible de télécharger les données brutes (geojson,
xml). Idéalement, le mieux serait d'obtenir ces données filtrées
directement depuis une API Web, et un lien permet de partager la page
avec l'état des filtres et le niveau de zoom / la localisation de la
carte.&lt;/p&gt;
&lt;h3 id="un-service-generique-pour-gerer-les-formulaires"&gt;Un service générique pour gérer les formulaires&lt;/h3&gt;
&lt;p&gt;Si vous souhaitez générer un fichier de configuration (ou ce que vous
voulez, messages emails, …) vous aurez besoin d'un formulaire et d'un
template pour injecter les données proposées par les utilisateurs et
récupérer un résultat.&lt;/p&gt;
&lt;p&gt;Un service de gestion des formulaires pourrait être utile pour créer des
formulaires de manière automatique et récupérer les données "nettoyées"
et "validées".&lt;/p&gt;
&lt;p&gt;On peut imaginer par exemple l'utilisation d'un système de templates
externe reposant sur &lt;em&gt;carto-forms&lt;/em&gt;. Celui-ci "parserait" le contenu des
templates et pourrait le lier aux informations ajoutées par les
utilisateurs via un formulaire.&lt;/p&gt;
&lt;p&gt;Pour ce cas particulier, il n'y a pas besoin d'informations
géographiques (SIG). Il s'agit quasiment du service proposé
actuellement par Google forms.&lt;/p&gt;
&lt;h2 id="ca-nexiste-pas-deja-tout-ca"&gt;Ça n'existe pas déjà tout ça ?&lt;/h2&gt;
&lt;p&gt;Bien sur, il y a Google forms, qui vous permet de faire ce genre de
choses, mais comme je l'ai précisé plus haut, il ne s'agit pas
exactement de la même chose.&lt;/p&gt;
&lt;p&gt;Nous avons découvert &lt;a href="https://webform.com"&gt;https://webform.com&lt;/a&gt; qui permet de créer des
formulaires avec un système de drag'n'drop. J'adorerais reproduire
quelque chose de similaire pour l'interface utilisateur. Par contre ce
projet ne gère pas les appels via API et les informations de
géolocalisation …&lt;/p&gt;
&lt;p&gt;L'idée de &lt;a href="http://thoth.io"&gt;http://thoth.io&lt;/a&gt; est également assez sympathique: une api
très simple pour stocker et récupérer des données. En plus de ça,
&lt;em&gt;carto-forms&lt;/em&gt; proposerait de la validation de données et proposerait un
support des points SIG (point, ligne, polygone).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mapbox.com"&gt;http://mapbox.com&lt;/a&gt; fait également un superbe travail autour de la
cartographie, mais ne prends pas en compte le coté auto-génération de
formulaires…&lt;/p&gt;
&lt;h2 id="on-est-parti"&gt;On est parti ?!&lt;/h2&gt;
&lt;p&gt;Comme vous avez pu vous en rendre compte, il ne s'agit pas d'un problème
outrageusement complexe. On a pas mal discuté avec Mathieu, à propos de
ce qu'on souhaite faire et du comment. Il se trouve qu'on peut sûrement
s'en sortir avec une solution élégante sans trop de problèmes. Mathieu
est habitué à travailler autour des projets de SIG (ce qui est parfait
parce que ce n'est pas mon cas) et connaît son sujet. Une bonne
opportunité d'apprendre!&lt;/p&gt;
&lt;p&gt;On sera tous les deux à &lt;a href="http://rencontres.django-fr.org"&gt;Djangocong&lt;/a&gt; le
14 et 15 Avril, et on prévoit une session de &lt;em&gt;tempête de cerveau&lt;/em&gt; et un
sprint sur ce projet. Si vous êtes dans le coin et que vous souhaitez
discuter ou nous filer un coup de patte, n'hésitez pas!&lt;/p&gt;
&lt;p&gt;On ne sait pas encore si on utilisera django ou quelque chose d'autre.
On a pensé un peu à CouchDB, son système de couchapps et geocouch, mais
rien n'est encore gravé dans le marbre ! N'hésitez pas à proposer vos
solutions ou suggestions.&lt;/p&gt;
&lt;p&gt;Voici le document etherpad sur lequel on a travaillé jusqu'à maintenant:
&lt;a href="http://framapad.org/carto-forms"&gt;http://framapad.org/carto-forms&lt;/a&gt;. N'hésitez pas à l'éditer et à ajouter
vos commentaires, c'est son objectif!&lt;/p&gt;
&lt;p&gt;Merci à &lt;a href="http://sneakernet.fr/"&gt;Arnaud&lt;/a&gt; pour la relecture et la
correction de quelques typos dans le texte :)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Thoughts about a form generation service, GIS enabled</title><link href="https://blog.notmyidea.org/thoughts-about-a-form-generation-service-gis-enabled.html" rel="alternate"></link><published>2012-04-02T00:00:00+02:00</published><updated>2012-04-02T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-04-02:/thoughts-about-a-form-generation-service-gis-enabled.html</id><summary type="html">
&lt;p&gt;&lt;em&gt;Written by Alexis Métaireau &amp;amp; Mathieu Leplatre&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We have a plan. A "fucking good" one.&lt;/p&gt;
&lt;p&gt;A bunch of friends asked me twice for quite the same thing: a webpage
with a form, tied to a map generation with some information filtering.
They didn't explicitly ask that but that's the gist of …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;em&gt;Written by Alexis Métaireau &amp;amp; Mathieu Leplatre&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We have a plan. A "fucking good" one.&lt;/p&gt;
&lt;p&gt;A bunch of friends asked me twice for quite the same thing: a webpage
with a form, tied to a map generation with some information filtering.
They didn't explicitly ask that but that's the gist of it.&lt;/p&gt;
&lt;p&gt;This idea has been stuck in my head since then and I even think that we
can come out with something a little bit more flexible and useful. I've
named it &lt;em&gt;carto-forms&lt;/em&gt; for now, but that's only the "codename".&lt;/p&gt;
&lt;p&gt;To put it shortly: what if we had a way to build forms, ala Google
forms, but with geographic information in them?&lt;/p&gt;
&lt;p&gt;If you don't know Google forms, it means having an user-friendly way to
build forms and to use them to gather information from different users.&lt;/p&gt;
&lt;p&gt;In my opinion, Google forms is missing two important things: first, it's
not open-source, so it's not possible to hack it or even to run it on
your own server. Second, it doesn't really know how to deal with
geographic data, and there is no way to filter the information more than
in a spreadsheet.&lt;/p&gt;
&lt;p&gt;I knew that &lt;a href="http://blog.mathieu-leplatre.info/"&gt;Mathieu&lt;/a&gt; and some folks
at &lt;a href="http://makina-corpus.com"&gt;Makina Corpus&lt;/a&gt; would be interested in
this, so I started a discussion with him on IRC and we refined the
details of the project and its objectives.&lt;/p&gt;
&lt;p&gt;Imagine the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;For a mapping party, we choose a specific topic to map and design
the form (list of fields (i.e. tags) to be filled + description +
type of the information) ;&lt;/li&gt;
&lt;li&gt;In situ, users fill the form fields with what they see. Geo fields
can be pre-populated using device geolocation ;&lt;/li&gt;
&lt;li&gt;At the end of the day, we can see a map with all user contributions
seized through this particular form ;&lt;/li&gt;
&lt;li&gt;If relevant, a script could eventually import the resulting dataset
and publish/merge with OpenStreetMap.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="some-use-cases"&gt;Some use cases&lt;/h2&gt;
&lt;p&gt;I can see some use cases for this. The first one is a collaborative map,
with facet filtering. Let's draw a potential user flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An "administrator" goes to the website and creates a form to list
all the alternative-related events. He creates the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: a plain text field containing the name of the event.&lt;/li&gt;
&lt;li&gt;Category: the category of the event. Can be a finite list.&lt;/li&gt;
&lt;li&gt;Location: The location of the event. It could be provided by
selecting a point on a map or by typing an address.&lt;/li&gt;
&lt;li&gt;Date: the date of the event (a datepicker could do the trick)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each field in the form has semantic information associated with it
(yes/no, multiple selection, date-time, geocoding carto, carto
selection etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once finished, the form is generated and the user gets an url (say
&lt;a href="http://forms.notmyidea.org/alternatives"&gt;http://forms.notmyidea.org/alternatives&lt;/a&gt;) for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REST APIs allow third parties to get the form description and to
push/edit/get information from there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;He can communicate the address in any way he wants to his community
so they can go to the page and add information to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then, it is possible to filter the results per location / date or
category. This can be done via API calls (useful for third parties)
or via a nice interface in the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, as you may have noticed, this would allow us to create interactive
maps really easily. It's almost just a matter of some clicks to the
users. If we also come up with a nice Web API for this, we could do
server-side validation and build even phone applications easily.&lt;/p&gt;
&lt;p&gt;To push the cursor a bit further, if we can come with a cool description
format for the forms, we could even build the forms dynamically on
different platforms, with generic clients.&lt;/p&gt;
&lt;p&gt;As mentioned before, the idea of a simple tool to support collaborative
mapping fullfils a recurring necessity !&lt;/p&gt;
&lt;p&gt;We envision a lot of example uses for this : recycling spots, accessible
spots (wheelchairs, etc.), trees identification, mushrooms picking
areas, tracking of endangered species (e.g. Bonelli's Eagle is currently
tracked by sharing a spreadsheet), spotting of dangerous species (e.g.
asian predatory wasps), map advertisement boards (most cities do not
track them!), citizen reporting (e.g. graffiti, potholes, garbage,
lightning like &lt;a href="http://fixmystreet.ca"&gt;http://fixmystreet.ca&lt;/a&gt;), geocaching, trajectories (e.g
hiking, runners, cyclists)...&lt;/p&gt;
&lt;p&gt;Here are some other examples of where &lt;em&gt;carto-forms&lt;/em&gt; could be useful:&lt;/p&gt;
&lt;h3 id="simple-gis-storage-backend"&gt;Simple GIS storage backend&lt;/h3&gt;
&lt;p&gt;Let's say you are a mobile developer, you don't want to bother with
PostGIS nor write a custom and insecure code to insert and retrieve your
GIS data! You need carto-forms! A simple API helps you design your
models/forms and the same API allows you to CRUD and query your data.
Thus, you only need to focus on your application, not on how GIS data
will be handled.&lt;/p&gt;
&lt;p&gt;We make a distinction between storage and widgets.&lt;/p&gt;
&lt;p&gt;Besides, if you are a django / drupal / plomino... maintainer : you can
develop a module to "plug" your models (content types) and UI to
carto-forms! Carto forms are then exposed to your backoffice users (ex:
drupal admin UI, django adminsite), and likewise you can write your own
HTML widgets that consume datasets in frontend views (facets in
JSON/XML, and map data in GeoJSON).&lt;/p&gt;
&lt;h3 id="visualization-tool"&gt;Visualization tool&lt;/h3&gt;
&lt;p&gt;Since data submission can be done programmatically using the API, you
could use Carto-forms results page as a visualization tool.&lt;/p&gt;
&lt;p&gt;You can explore your dataset content using filters related to each form
field. Facets filtering is a great advantage, and a map shows the
resulting features set. You feel like you're in front of a decision
support system!&lt;/p&gt;
&lt;p&gt;Of course, filtered raw data can be downloaded (GeoJSON, XML) and a
permalink allows to share the page with the state of the filters and the
zoom/location of the map.&lt;/p&gt;
&lt;h3 id="generic-forms-service"&gt;Generic forms service&lt;/h3&gt;
&lt;p&gt;If you want to generate a configuration file (or whatever, email
messages, ...), you will need a form and a template to inlay user
submitted values and get the result.&lt;/p&gt;
&lt;p&gt;A form service would be really useful to create forms programmatically
and retrieve cleaned and validated input values.&lt;/p&gt;
&lt;p&gt;You could run a dedicated template service based on &lt;em&gt;carto-forms&lt;/em&gt;!
Parsing a template content, this external service could create a form
dynamically and bind them together. The output of the form service
(fields =&gt; values) would be bound to the input of a template engine
(variables =&gt; final result).&lt;/p&gt;
&lt;p&gt;Note that for this use-case, there is no specific need of GIS data nor
storage of records for further retrieval.&lt;/p&gt;
&lt;h2 id="whats-out-in-the-wild-already"&gt;What's out in the wild already?&lt;/h2&gt;
&lt;p&gt;Of course, there is Google forms, which allows you to do these kind of
things, but it's closed and not exactly what we are describing here.&lt;/p&gt;
&lt;p&gt;We've discovered the interesting &lt;a href="https://webform.com/"&gt;https://webform.com/&lt;/a&gt; which allows one
to create forms with a nice drag-n-drop flow. I would love to reproduce
something similar for the user experience. However, the project doesn't
handle APIs and geolocation information.&lt;/p&gt;
&lt;p&gt;The idea of &lt;a href="http://thoth.io"&gt;http://thoth.io&lt;/a&gt; is very attractive : an extremely simple
web API to store and retrieve data. In addition, &lt;em&gt;carto-forms&lt;/em&gt; would do
datatype validation and have basic GIS fields (point, line, polygon).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mapbox.com"&gt;http://mapbox.com&lt;/a&gt; also did an awesome work on cartography, but didn't
take into account the form aspect we're leveraging here.&lt;/p&gt;
&lt;h2 id="so-lets-get-it-real"&gt;So… Let's get it real!&lt;/h2&gt;
&lt;p&gt;As you may have understood, this isn't a really complicated problem. We
have been sometimes chatting about that with Mathieu about what we would
need and how we could achieve this.&lt;/p&gt;
&lt;p&gt;We can probably come with an elegant solution without too much pain.
Mathieu is used to work with GIS systems (which is really cool because
I'm not at all) and knows his subject, so that's an opportunity to learn
;-)&lt;/p&gt;
&lt;p&gt;We will be at &lt;a href="http://rencontres.django-fr.org"&gt;Djangocong&lt;/a&gt; on April 14
and 15 and will probably have a brainstorming session and a sprint on
this, so if you are around and want to help us, or just to discuss, feel
free to join!&lt;/p&gt;
&lt;p&gt;We don't know yet if we will be using django for this or something else.
We have been thinking about couchdb, couchapps and geocouch but nothing
is written in stone yet. Comments and proposals are welcome!&lt;/p&gt;
&lt;p&gt;Here is the etherpad document we worked on so far:
&lt;a href="http://framapad.org/carto-forms"&gt;http://framapad.org/carto-forms&lt;/a&gt;. Don't hesitate to add your thoughts
and edit it, that's what it's made for!&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="http://sneakernet.fr/"&gt;Arnaud&lt;/a&gt; and
&lt;a href="http://qwerty.fuzz.me.uk/"&gt;Fuzzmz&lt;/a&gt; for proof-reading and typo fixing.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Les dangers du livre numérique</title><link href="https://blog.notmyidea.org/les-dangers-du-livre-numerique.html" rel="alternate"></link><published>2012-01-23T00:00:00+01:00</published><updated>2012-01-23T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-01-23:/les-dangers-du-livre-numerique.html</id><summary type="html">
&lt;p&gt;Le framablog vient de publier &lt;a href="http://www.framablog.org/index.php/post/2012/01/22/stallman-ebook-livre-electronique"&gt;une traduction de l'article de RMS à
propos des dangers du livre
électronique&lt;/a&gt;.
Intéressant, même si il faut faire attention à ne pas confondre livre
électronique et risques liés au format de distribution.&lt;/p&gt;
&lt;p&gt;Si on passe sur le fait qu'un livre électronique est moins agréable …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Le framablog vient de publier &lt;a href="http://www.framablog.org/index.php/post/2012/01/22/stallman-ebook-livre-electronique"&gt;une traduction de l'article de RMS à
propos des dangers du livre
électronique&lt;/a&gt;.
Intéressant, même si il faut faire attention à ne pas confondre livre
électronique et risques liés au format de distribution.&lt;/p&gt;
&lt;p&gt;Si on passe sur le fait qu'un livre électronique est moins agréable à lire que sa version papier, il reste quand même quelques problèmes, la plupart liés au format de distribution de lœuvre.&lt;/p&gt;
&lt;p&gt;J'avoue ne pas trop savoir quoi penser de tout ça. D'un coté le livre électronique permet de franchir les frontières plus facilement, et semble avoir un tas d'avantage (notamment le fait que se trimbaler avec l'ensemble de sa collection de bouquins est désormais possible).&lt;/p&gt;
&lt;p&gt;A mon avis, ce qui pose vraiment problème, ce sont les formats sous
lesquels ces livres sont mis à disposition, non pas les livres eux même.
Encore une question de DRMs donc…&lt;/p&gt;
&lt;p&gt;Encore une problématique liée au copyright et au fait que le copie
privée pose des problèmes à l'industrie en place. Ça renvoie à des
questions plus profondes, et principalement à la mise en perspective du
producteur de contenu et du consomateur de ce même contenu. Exactement
ce qu'on essaye de résoudre dans le milieu agricole par le biais des
AMAPs.&lt;/p&gt;
&lt;p&gt;Sauf qu'ici, on est face au simple problème de la dématérialisation.
Est-ce qu'une responsabilisation des consommateurs ne pourrait pas
résoudre ce problème de publication ?&lt;/p&gt;
&lt;p&gt;Recemment, j'ai récupéré une version piratée d'un livre technique,
simplement parce que je ne trouvais pas une version de ce livre en
numérique qui me permette de faire une copie privée de celui ci. Un
Epub, par exemple. J'ai fait en me disant que c'était un acte militant.
Sauf que non, ce n'est pas une solution soutenable, et j'en viens
maintenant presque à le regretter. On en discutait rapidement avec
&lt;a href="http://ziade.org"&gt;Tarek&lt;/a&gt; il y à quelques jours et il pointait du doigt
que ceux qui en patissent sont les auteurs des livres, non pas les
éditeurs (qu'il ne faut pas non plus diaboliser selon moi, ils
cherchent à trouver des manières de garder leur coeur de métier).&lt;/p&gt;
&lt;p&gt;Or, avoir des auteurs, des personnes qui sont prêtes à partager leur
savoir à de larges audiences me semble primordial pour que la
répartition du savoir continue à se répendre. Certes, le blogging
permet cela dans une faible mesure, mais de manière bien moins
construite, et surtout, est fait de manière bénévole (à moins que
certains bloggeurs aient trouvé des moyens de rémunération dont j'ignore
l'existance ?), donc il est plus difficile pour les auteurs de se
dégager du temps pour travailler sur de gros ouvrages (ceci est bien
évidemment une généralisation).&lt;/p&gt;
&lt;p&gt;Quelles sont nos solutions, donc ? Peut être se tourner vers des
solution de publication alternatives, couplées à une résponsabilisation
des lecteurs. Je ne pense pas necessairement aux plateformes
alternatives comme &lt;a href="http://framabook.org"&gt;framabook&lt;/a&gt;, parce que je me
demande toujours si cela est une solution viable pour les auteurs, du
moins dans les premières années, mais au moins des éditeurs qui ne font
pas le choix du grand verrou numérique.&lt;/p&gt;
&lt;p&gt;On demande pas grand chose, pourtant… Peut être même que de telles
initiatives existent déjà ?&lt;/p&gt;
&lt;p&gt;Et vous, vous les achetez ou vos livres ?&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Mozilla, first months</title><link href="https://blog.notmyidea.org/mozilla-first-months.html" rel="alternate"></link><published>2012-01-21T00:00:00+01:00</published><updated>2012-01-21T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2012-01-21:/mozilla-first-months.html</id><summary type="html">
&lt;p&gt;A lot of changes in these last months. First of all, I've started to work for &lt;a href="http://mozilla.org"&gt;Mozilla&lt;/a&gt;, on the Services team, where I am
working on web services and scalability. Basically, what we are trying
to do at services is to provide a way for developers to make web
services …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;A lot of changes in these last months. First of all, I've started to work for &lt;a href="http://mozilla.org"&gt;Mozilla&lt;/a&gt;, on the Services team, where I am
working on web services and scalability. Basically, what we are trying
to do at services is to provide a way for developers to make web
services able to scale out of the box.&lt;/p&gt;
&lt;p&gt;Our most visible and known project, so far, is Firefox Sync, which
allows to synchronize browsing data (tabs, passwords, history, etc.)
among different instances of Firefox. We are also building other things,
such as a way to get metrics easily, a web service based queue, etc. Our
primary consumers are people inside Mozilla, and we want to help them
having a simple way to create, deploy and scale their apps. The project
is named "sagrada", and you can find some more information about it on
&lt;a href="https://wiki.mozilla.org/Services/Sagrada"&gt;our public wiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All of what we do, we do it in the open. So you can have a look at &lt;a href="http://github.com/mozilla-services"&gt;the
different pieces of code we wrote&lt;/a&gt;
and use them / contribute if you want to.&lt;/p&gt;
&lt;p&gt;I will not dig in to all the details of what I have been doing, but so
far, this have been a pretty amazing experience. Part of this is
explainable by the fact that the team is made of amazing folks, all with
a strong experience in different topics, so I'm learning things™.&lt;/p&gt;
&lt;p&gt;I am currently practicing a bit my C++ to do crypto related things (I
may or may not talk about this later on this web-logs) and it's great
(well, it remembers me why I love python for so many things, but it
makes me think closer to the metal ;)). I love this job.&lt;/p&gt;
&lt;p&gt;Second, I moved to Paris. Yes, Paris. Some of you who know me a bit may
find it unexpected, and that's the case. I'm usually not a big fan of
big cities and am a fairly strong defender of having and creating
activities in the country side, to face the rural exodus problem, into
other thingS.&lt;/p&gt;
&lt;p&gt;I didn't changed my opinion about that. However, I don't want to &lt;em&gt;start&lt;/em&gt;
by working remote, especially when working with a remote team. Having
offices kind of help me to have a differentiation between my working
place and home, which I find to be important.&lt;/p&gt;
&lt;p&gt;And, to be honest, I don't like Paris for unknown reasons: I haven't
been there, so it's a big over-generalisation to say that it's not good
for me. The reality is that I have no idea of what Paris is, and if I'll
like it or not.&lt;/p&gt;
&lt;p&gt;I found a really nice house (yeah, a house!) in Paris and am sharing it
with 3 other persons. We have room, all like good food and… they are not
geeks, which is a big win for me: work is work and home is home.&lt;/p&gt;
&lt;p&gt;So far, Paris had been really nice. A lot of things are going on in
here, and I kind of like the way it is possible to find alternative
related things in here. I found a
&lt;a href="http://en.wikipedia.org/wiki/Community-supported_agriculture"&gt;CSA&lt;/a&gt;,
some people interested by agriculture related problems and I like where
things seems to be going.&lt;/p&gt;
&lt;p&gt;So, new job, new house, new city, things are going forward and that's
great.&lt;/p&gt;
&lt;p&gt;Oh, and I will try to post some more technical articles soon, I'm
missing them :)&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Introducing Cornice</title><link href="https://blog.notmyidea.org/introducing-cornice.html" rel="alternate"></link><published>2011-12-07T00:00:00+01:00</published><updated>2011-12-07T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-12-07:/introducing-cornice.html</id><summary type="html">
&lt;p&gt;Wow, already my third working day at Mozilla. Since Monday, I've been
working with &lt;a href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt;, on a pyramid REST-ish
toolkit named &lt;a href="https://github.com/mozilla-services/cornice"&gt;Cornice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Its goal is to take care for you of what you're usually missing so you
can focus on what's important. Cornice provides you facilities for
validation of …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Wow, already my third working day at Mozilla. Since Monday, I've been
working with &lt;a href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt;, on a pyramid REST-ish
toolkit named &lt;a href="https://github.com/mozilla-services/cornice"&gt;Cornice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Its goal is to take care for you of what you're usually missing so you
can focus on what's important. Cornice provides you facilities for
validation of any kind.&lt;/p&gt;
&lt;p&gt;The goal is to simplify your work, but we don't want to reinvent the
wheel, so it is easily pluggable with validations frameworks, such as
&lt;a href="http://docs.pylonsproject.org/projects/colander/en/latest/"&gt;Colander&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="handling-errors-and-validation"&gt;Handling errors and validation&lt;/h2&gt;
&lt;p&gt;Here is how it works:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/service&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_awesome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;query&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;the awesome parameter is required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_awesome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;yay!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All the errors collected during the validation process, or after, are
collected before returning the request. If any, a error 400 is fired up,
with the list of problems encountered returned as a nice json list
response (we plan to support multiple formats in the future)&lt;/p&gt;
&lt;p&gt;As you might have seen, request.errors.add takes three parameters:
&lt;strong&gt;location&lt;/strong&gt;, &lt;strong&gt;name&lt;/strong&gt; and &lt;strong&gt;description&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;location&lt;/strong&gt; is where the error is located in the request. It can either
be "body", "query", "headers" or "path". &lt;strong&gt;name&lt;/strong&gt; is the name of the
variable causing problem, if any, and &lt;strong&gt;description&lt;/strong&gt; contains a more
detailed message.&lt;/p&gt;
&lt;p&gt;Let's run this simple service and send some queries to it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ curl -v http://127.0.0.1:5000/service
&amp;gt; GET /service HTTP/1.1
&amp;gt; Host: &lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:5000
&amp;gt; Accept: */*
&amp;gt;
* HTTP &lt;span class="m"&gt;1&lt;/span&gt;.0, assume close after body
&amp;lt; HTTP/1.0 &lt;span class="m"&gt;400&lt;/span&gt; Bad Request
&amp;lt; Content-Type: application/json&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTF-8
&lt;span class="o"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;location&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;awesome&amp;quot;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;You lack awesomeness!&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I've removed the extra clutter from the curl's output, but you got the
general idea.&lt;/p&gt;
&lt;p&gt;The content returned is in JSON, and I know exactly what I have to do:
add an "awesome" parameter in my query. Let's do it again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ curl http://127.0.0.1:5000/service?awesome&lt;span class="o"&gt;=&lt;/span&gt;yeah
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;yay!&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Validators can also convert parts of the request and store the converted
value in request.validated. It is a standard dict automatically attached
to the requests.&lt;/p&gt;
&lt;p&gt;For instance, in our validator, we can chose to validate the parameter
passed and use it in the body of the webservice:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;service&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/service&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_awesome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;query&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;the awesome parameter is required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;awesome &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nd"&gt;@service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_awesome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;awesome&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output would look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;curl http://127.0.0.1:5000/service?awesome=yeah&lt;/span&gt;
&lt;span class="err"&gt;{&amp;quot;test&amp;quot;: &amp;quot;awesome yeah&amp;quot;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="dealing-with-accept-headers"&gt;Dealing with "Accept" headers&lt;/h2&gt;
&lt;p&gt;The HTTP spec defines a &lt;strong&gt;Accept&lt;/strong&gt; header the client can send so the
response is encoded the right way. A resource, available at an URL, can
be available in different formats. This is especially true for web
services.&lt;/p&gt;
&lt;p&gt;Cornice can help you dealing with this. The services you define can tell
which Content-Type values they can deal with and this will be checked
against the &lt;strong&gt;Accept&lt;/strong&gt; headers sent by the client.&lt;/p&gt;
&lt;p&gt;Let's refine a bit our previous example, by specifying which
content-types are supported, using the accept
parameter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;text/json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;yay!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, if you specifically ask for XML, Cornice will throw a 406 with the
list of accepted Content-Type values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ curl -vH &lt;span class="s2"&gt;&amp;quot;Accept: application/xml&amp;quot;&lt;/span&gt; http://127.0.0.1:5000/service
&amp;gt; GET /service HTTP/1.1
&amp;gt; Host: &lt;span class="m"&gt;127&lt;/span&gt;.0.0.1:5000
&amp;gt; Accept: application/xml
&amp;gt;
&amp;lt; HTTP/1.0 &lt;span class="m"&gt;406&lt;/span&gt; Not Acceptable
&amp;lt; Content-Type: application/json&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTF-8
&amp;lt; Content-Length: &lt;span class="m"&gt;33&lt;/span&gt;
&amp;lt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;quot;text/json&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="building-your-documentation-automatically"&gt;Building your documentation automatically&lt;/h2&gt;
&lt;p&gt;writing documentation for web services can be painful, especially when
your services evolve. Cornice provides a sphinx directive to
automatically document your API in your docs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rst&lt;/span&gt;
&lt;span class="err"&gt;.. services::&lt;/span&gt;
&lt;span class="err"&gt; :package: coolapp&lt;/span&gt;
&lt;span class="err"&gt; :service: quote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is an example of what a generated page looks like:
&lt;a href="http://packages.python.org/cornice/exampledoc.html"&gt;http://packages.python.org/cornice/exampledoc.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="yay-how-can-i-get-it"&gt;Yay! How can I get it?&lt;/h2&gt;
&lt;p&gt;We just cut a 0.4 release, so it's available at
&lt;a href="http://pypi.python.org/pypi/cornice"&gt;http://pypi.python.org/pypi/cornice&lt;/a&gt; You can install it easily using
pip, for instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pip install cornice
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also have a look at the documentation at
&lt;a href="http://packages.python.org/cornice/"&gt;http://packages.python.org/cornice/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What's next?&lt;/h2&gt;
&lt;p&gt;We try to make our best to find how Cornice can help you build better
web services. Cool features we want for the future include the automatic
publication of a static definition of the services, so it can be used by
clients to discover services in a nice way.&lt;/p&gt;
&lt;p&gt;Of course, we are open to all your ideas and patches! If you feel
haskish and want to see the sources, &lt;a href="https://github.com/mozilla-services/cornice"&gt;go grab them on
github&lt;/a&gt; , commit and send
us a pull request!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Quels usages pour l'informatique ?</title><link href="https://blog.notmyidea.org/quels-usages-pour-linformatique.html" rel="alternate"></link><published>2011-12-01T00:00:00+01:00</published><updated>2011-12-01T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-12-01:/quels-usages-pour-linformatique.html</id><summary type="html">
&lt;p&gt;Quand on termine ses études, on s'en pose un tas, des questions. Sur le
métier que l'on veut faire, sur ce que ça signifie, sur le sens et la
valeur du travail. Et j'en suis arrivé à faire un constat simple:
l'informatique, c'est utile, tant que ça ne vient pas …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Quand on termine ses études, on s'en pose un tas, des questions. Sur le
métier que l'on veut faire, sur ce que ça signifie, sur le sens et la
valeur du travail. Et j'en suis arrivé à faire un constat simple:
l'informatique, c'est utile, tant que ça ne vient pas vous pourrir la
vie. Oui, parce que de l'informatique on en a partout, des "geeks" et
des "accros" aussi, et que ça vient s'immiscer dans nos vies même quand
d'autres moyens ou médias sont plus utiles ou pertinents.&lt;/p&gt;
&lt;p&gt;Certes, l'informatique nous permet de communiquer et travailler plus
efficacement, Mais à quel prix ? Ce n'est pas parce qu'il est possible
d'&lt;a href="http://retourdactu.fr/2011/11/07/la-non-communication-nouveau-modele-de-societe/"&gt;industrialiser
l'éducation&lt;/a&gt;
(ou l'agriculture !), que l'on doit le faire. Oui, ça me dérange d'être
une des nombreuses personnes à l'œuvre derrière cette soit disant
"révolution", qui n'est pas toujours pour le meilleur. Attention, je ne
remets pas l'informatique et son intérêt en cause: je me pose des
questions quand à la place que je veux lui donner et la place que je
souhaites occuper dans son évolution. Ce n'est pas parce qu'on peut tuer
avec un marteau (avec un peu de volonté) qu'il s'agit d'un mauvais
outil, mais si tout le monde se met à tuer avec des marteaux (y a des
malades partout, hein), alors se poser la question de son rôle, en tant
que fabricant de marteaux me semble nécessaire (oui, je vous l'accorde,
on aura vu des comparaisons plus perspicaces).&lt;/p&gt;
&lt;p&gt;Donc: à partir de quel moment l'informatique cesse d'être un outil utile
pour transformer nos modes de vies d'une manière qui me dérange ? Peut
être avec son arrivée sur des périphériques mobiles ? Peut être quand
elle se fait l'instrument du consumérisme et de l'individualisme.&lt;/p&gt;
&lt;h2 id="et-alors-on-fait-quoi"&gt;Et alors, on fait quoi ?&lt;/h2&gt;
&lt;p&gt;Mais si je continue à faire de l'informatique, il y a bien des raison.
J'ai d'ailleurs trouvé mon intérêt de par le coté collaboratif qui est
permis et développé par l'outil informatique, et notamment par le réseau
des réseaux (internet). Faisons ensemble, mes amis. Prouvons que la
collaboration a de meilleurs jours à vivre que la compétition. Le web,
notamment, est une avancée majeure en ce qui concerne la liberté
d'expression et le partage de connaissances (oui, kipédia). Je vous
conseille d'ailleurs à ce propos &lt;a href="http://owni.fr/2011/11/30/vers-une-economie-de-la-contribution/"&gt;l'excellent discours tenu par Bernard
Stiegler&lt;/a&gt;
paru récemment sur &lt;a href="http://www.owni.fr"&gt;owni&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et c'est cet avenir qu'il me plait de défendre: l'ouverture d'esprit, la
possibilité que chacun puisse contribuer et participer à une base de
savoir commune, en apprenant des autres. Mais par pitié, n'imposons pas
la technologie là où elle n'est pas nécessaire, et utilisons la avec
tact quand elle peut nous être profitable.&lt;/p&gt;
&lt;p&gt;Il me plait de repenser l'informatique comme outil et non plus comme
mode de vie. Faisons le l'outil de la collaboration. À l'école,
apprenons à nos enfants à collaborer, à susciter le partage, pas
uniquement avec l'outil informatique, mais aussi avec celui ci, tout en
leurs apprenant à avoir un regard critique sur les informations qu'ils
reçoivent.&lt;/p&gt;
&lt;p&gt;En bref, questionner le rôle que l'on souhaite avoir dans notre société
par le biais de l'informatique est nécessaire. Comme d'autres, je suis
arrivé à l'informatique par le biais du premier ordinateur familial, il
y a de ça une bonne quinzaine d'années. Ça intrigue, on touche un peu à
tout (on en fait des conneries !) et on finit par apprendre/comprendre
comment ça marche, petit à petit. Cette curiosité n'est d'ailleurs pas
le propre de l'informatique puisqu'on la retrouve dans la cuisine, dans
le bricolage et dans un tas de domaines de notre vie quotidienne.&lt;/p&gt;
&lt;p&gt;Finalement, c'est aimer bidouiller, et comprendre comment ça fonctionne,
quitte à sortir les compétences de leur domaine de prédilection (qui a
dit que l'informatique ne pouvait être artistique ?) Le mouvement hacker
(bidouilleurs) aime à sortir l'informatique de son carcan et l'appliquer
ailleurs.&lt;/p&gt;
&lt;p&gt;C'est de cette manière que j'ai envie de considérer mon métier, qui
avant tout est une passion. Je suis un bidouilleur, j'aime découvrir
comment les choses fonctionnent et avoir une panoplie d'outils qui me
permettent de répondre à des besoins réels.&lt;/p&gt;
&lt;h2 id="favoriser-la-collaboration"&gt;Favoriser la collaboration&lt;/h2&gt;
&lt;p&gt;Et donc, en tant qu'individu, pourquoi faire de l'informatique ?
Qu'est-ce qui m'attire dans cet outil ?&lt;/p&gt;
&lt;p&gt;Ce qu'on pourrait qualifier de "recherche fondamentale", l'écriture de
bibliothèques logicielles, est important mais n'est pas tout. Ce qui
importe ce sont les usages qui en découlent. Je souhaite &lt;strong&gt;savoir écrire
des outils qui sont utiles&lt;/strong&gt;, &lt;strong&gt;qui favorisent la collaboration et
participent à l'ouverture des esprits&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Je choisis de faire de l'informatique pour créer les outils qui
répondent à des problématiques réelles, pour trouver de meilleures
manières de communiquer et de travailler ensemble. Mais, comme me le
disait David,
d'&lt;a href="http://outils-reseaux.org/PresentationProjet"&gt;Outils-Réseaux&lt;/a&gt;, on ne
crée pas de la coopération: rien ne sert d'essayer de faire coopérer des
gens qui ne veulent pas. On peut, cependant, la faciliter, en utilisant
les bons outils et en formant les gens à leur utilisation, ainsi qu'aux
pratiques collaboratives (qui, je le répète, ne s'arrêtent pas du tout
aux frontières informatique).&lt;/p&gt;
&lt;p&gt;Le logiciel libre, avant d'être une force pour le marché logiciel, est
une application du partage. Une démonstration qu'il est possible de
travailler ensemble pour fabriquer quelque chose de fonctionnel et
d'utile pour tous. Une sorte d'antithèse de ce modèle capitaliste
incarné par les brevets logiciel.&lt;/p&gt;
&lt;p&gt;A plusieurs reprises, j'ai été bluffé par la réalité du logiciel libre.
Oui, il est facile de collaborer lorsqu'on crée un logiciel, pour peu
qu'on explique les tenants et les aboutissants aux participants. Les
contributeurs sortent d'on ne sait où, pour peu que le projet leur soit
utile. Je ne parle pas d'outils "corpo compliant" (bien que ça soit
probablement aussi le cas), mais d'outils que j'ai pu développer pour
mon propre usage, et sur lesquels il a été possible de collaborer avec
d'autres.&lt;/p&gt;
&lt;p&gt;Parce que l'informatique est utile dans bien des milieux, parce qu'elle
peut être (et elle l'est) un vecteur de participation et de
collaboration, défendons les valeurs qui nous sont chères (logiciels
libres et ouverts!) et construisons des ponts entre les initiatives qui
nous parlent (fermes autogérées, initiatives d'éducation populaire) et
l'informatique.&lt;/p&gt;
&lt;p&gt;Faisons en sorte de rendre l'informatique accessible et utile dans les
milieux ou elle peut apporter quelque chose !&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>How are you handling your shared expenses?</title><link href="https://blog.notmyidea.org/how-are-you-handling-your-shared-expenses.html" rel="alternate"></link><published>2011-10-15T00:00:00+02:00</published><updated>2011-10-15T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-10-15:/how-are-you-handling-your-shared-expenses.html</id><summary type="html">
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; We're kick-starting a new application to manage your shared
expenses. Have a look at &lt;a href="http://ihatemoney.notmyidea.org"&gt;http://ihatemoney.notmyidea.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a student, I lived in a lot of different locations, and the majority
of them had something in common: I lived with others. It usually was a
great experience …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; We're kick-starting a new application to manage your shared
expenses. Have a look at &lt;a href="http://ihatemoney.notmyidea.org"&gt;http://ihatemoney.notmyidea.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a student, I lived in a lot of different locations, and the majority
of them had something in common: I lived with others. It usually was a
great experience (and I think I will continue to live with others). Most
of the time, we had to spend some time each month to compute who had to
pay what to the others.&lt;/p&gt;
&lt;p&gt;I wanted to create a pet project using flask, so I wrote a little (\~150
lines) flask application to handle this. It worked out pretty well for
my housemates and me, and as we had to move into different locations,
one of them asked me if he could continue to use it for the year to
come.&lt;/p&gt;
&lt;p&gt;I said yes and gave it some more thoughts: We probably aren't the only
ones interested by such kind of software. I decided to extend a bit more
the software to have a concept of projects and persons (the list of
persons was hard-coded in the first time, boooh!).&lt;/p&gt;
&lt;p&gt;I then discussed with a friend of mine, who was excited about it and
wanted to learn python. Great! That's a really nice way to get started.
Some more friends were also interested in it and contributed some
features and provided feedback (thanks
&lt;a href="http://www.sneakernet.fr/"&gt;Arnaud&lt;/a&gt; and Quentin!)&lt;/p&gt;
&lt;p&gt;Since that, the project now support multiple languages and provides a
REST API (android and iphone apps in the tubes!), into other things.
There is no need to register for an account or whatnot, just enter a
project name, a secret code and a contact email, invite friends and
that's it (this was inspired by doodle)!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capture d'écran du site." src="images/ihatemoney.png"&gt;&lt;/p&gt;
&lt;p&gt;You can try the project at &lt;a href="http://ihatemoney.notmyidea.org"&gt;http://ihatemoney.notmyidea.org&lt;/a&gt; for now,
and the code lives at &lt;a href="https://github.com/spiral-project/ihatemoney/"&gt;https://github.com/spiral-project/ihatemoney/&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;In the wild, currently, there already are some implementations of this
shared budget manager thing. The fact is that most of them are either
hard to use, with a too much fancy design or simply trying to do too
much things at once.&lt;/p&gt;
&lt;p&gt;No, I don't want my budget manager to make my shopping list, or to run a
blog for me, thanks. I want it to let me focus on something else. Keep
out of my way.&lt;/p&gt;
&lt;h3 id="no-user-registration"&gt;No user registration&lt;/h3&gt;
&lt;p&gt;You don't need to register an account on the website to start using it.
You just have to create a project, set a secret code for it, and give
both the url and the code to the people you want to share it with (or
the website can poke them for you).&lt;/p&gt;
&lt;h3 id="keeping-things-simple"&gt;Keeping things simple&lt;/h3&gt;
&lt;p&gt;"Keep It Simple, Stupid" really matches our philosophy here: you want to
add a bill? Okay. Just do it. You just have to enter who paid, for who,
how much, and a description, like you would have done when you're back
from the farmer's market on raw paper.&lt;/p&gt;
&lt;h3 id="no-categories"&gt;No categories&lt;/h3&gt;
&lt;p&gt;Some people like to organise their stuff into different "categories":
leisure, work, eating, etc. That's not something I want (at least to
begin with).&lt;/p&gt;
&lt;p&gt;I want things to be simple. Got that? Great. Just add your bills!&lt;/p&gt;
&lt;h3 id="balance"&gt;Balance&lt;/h3&gt;
&lt;p&gt;One of the most useful thing is to know what's your "balance" compared
to others. In other words, if you're negative, you owe money, if you're
positive, you have to receive money. This allows you to dispatch who has
to pay for the next thing, in order to re-equilibrate the balance.&lt;/p&gt;
&lt;p&gt;Additionally, the system is able to compute for you who has to give how
much to who, in order to reduce the number of transactions needed to
restore the balance.&lt;/p&gt;
&lt;h3 id="api"&gt;API&lt;/h3&gt;
&lt;p&gt;All of what's possible to do with the standard web interface is also
available through a REST API. I developed a simple REST toolkit for
flask for this (and I should release it!).&lt;/p&gt;
&lt;h2 id="interested"&gt;Interested?&lt;/h2&gt;
&lt;p&gt;This project is open source. All of us like to share what we are doing
and would be happy to work with new people and implement new ideas. If
you have a nice idea about this, if you want to tweak it or to fill
bugs. Don't hesitate a second! The project lives at
&lt;a href="http://github.com/spiral-project/ihatemoney/"&gt;http://github.com/spiral-project/ihatemoney/&lt;/a&gt;&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>La simplicité volontaire contre le mythe de l'abondance</title><link href="https://blog.notmyidea.org/la-simplicite-volontaire-contre-le-mythe-de-labondance.html" rel="alternate"></link><published>2011-10-01T00:00:00+02:00</published><updated>2011-10-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-10-01:/la-simplicite-volontaire-contre-le-mythe-de-labondance.html</id><summary type="html">
&lt;p&gt;Paul Ariès dans la préface de "&lt;a href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747"&gt;La simplicité volontaire contre le mythe
de
l'abondance&lt;/a&gt;"&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je sais aussi qu'à force d'être seulement contre, nous finissons par être « tout contre », tout contre le système, ses débats pourris, ses pratiques immondes, ses perversions mentales. Cessons de porter notre adversaire sur notre dos, car …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;p&gt;Paul Ariès dans la préface de "&lt;a href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747"&gt;La simplicité volontaire contre le mythe
de
l'abondance&lt;/a&gt;"&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je sais aussi qu'à force d'être seulement contre, nous finissons par être « tout contre », tout contre le système, ses débats pourris, ses pratiques immondes, ses perversions mentales. Cessons de porter notre adversaire sur notre dos, car il finira par nous poignarder, au moment ou nous pensions justement pouvoir le vaincre… Entendons-nous bien, il ne s'agit pas d'apprendre à "positiver" sous prétexte que l'on pourrait "moraliser" ou repeindre en vert le capitalisme, il s'agit, bien au contraire, d'être aussi intraitables lorsque nous créons cet autre monde, que lorsque nous étions ces militants purs mais un peu durs à jouir, il s'agit d'être aussi indomptables mais sans oublier que le capitalisme ne pourra être arrêté que par du non-capitaliste… c'est-à-dire en multipliant les expérimentations sociales, en acceptant de faire au maximum sécession, en inventant (réinventant?) une gauche buissonnière et maquisarde, en faisant, au quotidien, la part belle à la dérive, à des modes de comportement expérimentaux.&lt;/p&gt;
&lt;p&gt;Nous ne devons plus accepter de faire de la politique aux conditions de nos adversaires, car c'est la seule façon d'éviter le pessimisme, le ressentiment, une désensibilisation croissante et… la mort lente.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="content"></category></entry><entry><title>Using dbpedia to get languages influences</title><link href="https://blog.notmyidea.org/using-dbpedia-to-get-languages-influences.html" rel="alternate"></link><published>2011-08-16T00:00:00+02:00</published><updated>2011-08-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-08-16:/using-dbpedia-to-get-languages-influences.html</id><summary type="html">
&lt;p&gt;While browsing the Python's wikipedia page, I found information about
the languages influenced by python, and the languages that influenced
python itself.&lt;/p&gt;
&lt;p&gt;Well, that's kind of interesting to know which languages influenced
others, it could even be more interesting to have an overview of the
connexion between them, keeping python …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;While browsing the Python's wikipedia page, I found information about
the languages influenced by python, and the languages that influenced
python itself.&lt;/p&gt;
&lt;p&gt;Well, that's kind of interesting to know which languages influenced
others, it could even be more interesting to have an overview of the
connexion between them, keeping python as the main focus.&lt;/p&gt;
&lt;p&gt;This information is available on the wikipedia page, but not in a really
exploitable format. Hopefully, this information is provided into the
information box present on the majority of wikipedia pages. And… guess
what? there is project with the goal to scrap and index all this
information in a more queriable way, using the semantic web
technologies.&lt;/p&gt;
&lt;p&gt;Well, you may have guessed it, the project in question in dbpedia, and
exposes information in the form of RDF triples, which are way more easy
to work with than simple HTML.&lt;/p&gt;
&lt;p&gt;For instance, let's take the page about python:
&lt;a href="http://dbpedia.org/page/Python_%28programming_language%29"&gt;http://dbpedia.org/page/Python_%28programming_language%29&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The interesting properties here are "Influenced" and "InfluencedBy",
which allows us to get a list of languages. Unfortunately, they are not
really using all the power of the Semantic Web here, and the list is
actually a string with coma separated values in it.&lt;/p&gt;
&lt;p&gt;Anyway, we can use a simple rule: All wikipedia pages of programming
languages are either named after the name of the language itself, or
suffixed with "( programming language)", which is the case for python.&lt;/p&gt;
&lt;p&gt;So I've built &lt;a href="https://github.com/ametaireau/experiments/blob/master/influences/get_influences.py"&gt;a tiny script to extract the information from
dbpedia&lt;/a&gt;
and transform them into a shiny graph using graphviz.&lt;/p&gt;
&lt;p&gt;After a nice:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ python get_influences.py python dot &lt;span class="p"&gt;|&lt;/span&gt; dot -Tpng &amp;gt; influences.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The result is the following graph (&lt;a href="http://files.lolnet.org/alexis/influences.png"&gt;see it directly
here&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Graph des influances des langages les uns sur les
autres." src="http://files.lolnet.org/alexis/influences.png"&gt;&lt;/p&gt;
&lt;p&gt;While reading this diagram, keep in mind that it is a) not listing all
the languages and b) keeping a python perspective.&lt;/p&gt;
&lt;p&gt;This means that you can trust the scheme by following the arrows from
python to something and from something to python, it is not trying to
get the matching between all the languages at the same time to keep
stuff readable.&lt;/p&gt;
&lt;p&gt;It would certainly be possible to have all the connections between all
languages (and the resulting script would be easier) to do so, but the
resulting graph would probably be way less readable.&lt;/p&gt;
&lt;p&gt;You can find the script &lt;a href="https://github.com/ametaireau/experiments"&gt;on my github
account&lt;/a&gt;. Feel free to adapt
it for whatever you want if you feel hackish.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Pelican, 9 months later</title><link href="https://blog.notmyidea.org/pelican-9-months-later.html" rel="alternate"></link><published>2011-07-25T00:00:00+02:00</published><updated>2011-07-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-07-25:/pelican-9-months-later.html</id><summary type="html">
&lt;p&gt;Back in October, I released
&lt;a href="http://docs.notmyidea.org/alexis/pelican"&gt;pelican&lt;/a&gt;, a little piece of
code I wrote to power this weblog. I had simple needs: I wanted to be
able to use my text editor of choice (vim), a vcs (mercurial) and
restructured text. I started to write a really simple blog engine in …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Back in October, I released
&lt;a href="http://docs.notmyidea.org/alexis/pelican"&gt;pelican&lt;/a&gt;, a little piece of
code I wrote to power this weblog. I had simple needs: I wanted to be
able to use my text editor of choice (vim), a vcs (mercurial) and
restructured text. I started to write a really simple blog engine in
something like a hundred python lines and released it on github.&lt;/p&gt;
&lt;p&gt;And people started contributing. I wasn't at all expecting to see people
interested in such a little piece of code, but it turned out that they
were. I refactored the code to make it evolve a bit more by two times
and eventually, in 9 months, got 49 forks, 139 issues and 73 pull
requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Which is clearly awesome.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I pulled features such as translations, tag clouds, integration with
different services such as twitter or piwik, import from dotclear and
rss, fixed a number of mistakes and improved a lot the codebase. This
was a proof that there is a bunch of people that are willing to make
better softwares just for the sake of fun.&lt;/p&gt;
&lt;p&gt;Thank you, guys, you're why I like open source so much.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Using JPype to bridge python and Java</title><link href="https://blog.notmyidea.org/using-jpype-to-bridge-python-and-java.html" rel="alternate"></link><published>2011-06-11T00:00:00+02:00</published><updated>2011-06-11T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-06-11:/using-jpype-to-bridge-python-and-java.html</id><summary type="html">
&lt;p&gt;Java provides some interesting libraries that have no exact equivalent
in python. In my case, the awesome boilerpipe library allows me to
remove uninteresting parts of HTML pages, like menus, footers and other
"boilerplate" contents.&lt;/p&gt;
&lt;p&gt;Boilerpipe is written in Java. Two solutions then: using java from
python or reimplement boilerpipe …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Java provides some interesting libraries that have no exact equivalent
in python. In my case, the awesome boilerpipe library allows me to
remove uninteresting parts of HTML pages, like menus, footers and other
"boilerplate" contents.&lt;/p&gt;
&lt;p&gt;Boilerpipe is written in Java. Two solutions then: using java from
python or reimplement boilerpipe in python. I will let you guess which
one I chosen, meh.&lt;/p&gt;
&lt;p&gt;JPype allows to bridge python project with java libraries. It takes
another point of view than Jython: rather than reimplementing python in
Java, both languages are interfacing at the VM level. This means you
need to start a VM from your python script, but it does the job and stay
fully compatible with Cpython and its C extensions.&lt;/p&gt;
&lt;h2 id="first-steps-with-jpype"&gt;First steps with JPype&lt;/h2&gt;
&lt;p&gt;Once JPype installed (you'll have to hack a bit some files to integrate
seamlessly with your system) you can access java classes by doing
something like that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jpype&lt;/span&gt;
&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startJVM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getDefaultJVMPath&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# you can then access to the basic java functions&lt;/span&gt;
&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hello world&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# and you have to shutdown the VM at the end&lt;/span&gt;
&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shutdownJVM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Okay, now we have a hello world, but what we want seems somehow more
complex. We want to interact with java classes, so we will have to load
them.&lt;/p&gt;
&lt;h2 id="interfacing-with-boilerpipe"&gt;Interfacing with Boilerpipe&lt;/h2&gt;
&lt;p&gt;To install boilerpipe, you just have to run an ant script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; boilerpipe
$ ant
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is a simple example of how to use boilerpipe in Java, from their
sources&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;de.l3s.boilerpipe.demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;de.l3s.boilerpipe.extractors.ArticleExtractor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Oneliner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://notmyidea.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ArticleExtractor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INSTANCE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To run it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ javac -cp dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar src/demo/de/l3s/boilerpipe/demo/Oneliner.java
$ java -cp src/demo:dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar de.l3s.boilerpipe.demo.Oneliner
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yes, this is kind of ugly, sorry for your eyes. Let's try something
similar, but from python&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jpype&lt;/span&gt;
&lt;span class="c1"&gt;# start the JVM with the good classpaths&lt;/span&gt;
&lt;span class="n"&gt;classpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dist/boilerpipe-1.1-dev.jar:lib/nekohtml-1.9.13.jar:lib/xerces-2.9.1.jar&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startJVM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getDefaultJVMPath&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-Djava.class.path=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# get the Java classes we want to use&lt;/span&gt;
&lt;span class="n"&gt;DefaultExtractor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;de&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l3s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;boilerpipe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extractors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultExtractor&lt;/span&gt;
&lt;span class="c1"&gt;# call them !&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;DefaultExtractor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTANCE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jpype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://blog.notmyidea.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And you get what you want.&lt;/p&gt;
&lt;p&gt;I must say I didn't thought it could work so easily. This will allow me
to extract text content from URLs and remove the &lt;em&gt;boilerplate&lt;/em&gt; text
easily for infuse (my master thesis project), without having to write
java code, nice!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Un coup de main pour mon mémoire !</title><link href="https://blog.notmyidea.org/un-coup-de-main-pour-mon-memoire.html" rel="alternate"></link><published>2011-05-25T00:00:00+02:00</published><updated>2011-05-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire.html</id><summary type="html">
&lt;p&gt;Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du
reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais
besoin d'un petit coup de main.&lt;/p&gt;
&lt;p&gt;Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui
connaissent last.fm, je …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Ça y est, bientôt la fin. LA FIN. La fin des études, et le début du
reste. En attendant je bosse sur mon mémoire de fin d'études et j'aurais
besoin d'un petit coup de main.&lt;/p&gt;
&lt;p&gt;Mon mémoire porte sur les systèmes de recommandation. Pour ceux qui
connaissent last.fm, je fais quelque chose de similaire mais pour les
sites internet: en me basant sur ce que vous visitez quotidiennement et
comment vous le visitez (quelles horaires, quelle emplacement
géographique, etc.) je souhaites proposer des liens qui vous
intéresseront potentiellement, en me basant sur l'avis des personnes
qui ont des profils similaires au votre.&lt;/p&gt;
&lt;p&gt;Le projet est loin d'être terminé, mais la première étape est de
récupérer des données de navigation, idéalement beaucoup de données de
navigation. Donc si vous pouvez me filer un coup de main je vous en
serais éternellement reconnaissant (pour ceux qui font semblant de pas
comprendre, entendez "tournée générale").&lt;/p&gt;
&lt;p&gt;J'ai créé un petit site web (en anglais) qui résume un peu le concept,
qui vous propose de vous inscrire et de télécharger un plugin firefox
qui m'enverra des information sur les sites que vous visitez (si vous
avez l'habitude d'utiliser chrome vous pouvez considérer de switcher à
firefox4 pour les deux prochains mois pour me filer un coup de main). Il
est possible de désactiver le plugin d'un simple clic si vous souhaitez
garder votre vie privée privée ;-)&lt;/p&gt;
&lt;p&gt;Le site est par là: &lt;a href="http://infuse.notmyidea.org"&gt;http://infuse.notmyidea.org&lt;/a&gt;. Une fois le plugin
téléchargé et le compte créé il faut renseigner vos identifiants dans
le plugin en question, et c'est tout!&lt;/p&gt;
&lt;p&gt;A votre bon cœur ! Je récupérerais probablement des données durant les
2 prochains mois pour ensuite les analyser correctement.&lt;/p&gt;
&lt;p&gt;Merci pour votre aide !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Travailler moins pour mieux travailler ?</title><link href="https://blog.notmyidea.org/travailler-moins-pour-mieux-travailler.html" rel="alternate"></link><published>2011-05-19T00:00:00+02:00</published><updated>2011-05-19T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler.html</id><summary type="html">
&lt;p&gt;Je viens de passer une semaine et demi quasiment hors-ligne et je dois
dire que je suis assez impressionné du résultat: je suis de retour chez
mes parents pour le "easter break" et j'en ai profité pour donner un
coup aux travaux de la maison (et pour me reposer un …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Je viens de passer une semaine et demi quasiment hors-ligne et je dois
dire que je suis assez impressionné du résultat: je suis de retour chez
mes parents pour le "easter break" et j'en ai profité pour donner un
coup aux travaux de la maison (et pour me reposer un brin!).&lt;/p&gt;
&lt;p&gt;Bosser en extérieur est un réel plaisir et faire quelque chose de manuel
également. Je n'ai pas pour habitude de bricoler autre chose que du
logiciel et c'est vraiment quelque chose que j'apprécie.&lt;/p&gt;
&lt;p&gt;J'avoue, je mens un peu quand je dis que j'étais complètement
déconnecté: j'ai vérifié mes mails assez régulièrement en utilisant
mon téléphone (merci Arnaud pour le prêt du gadget!) et j'ai limité ma
présence web au strict minimum. Je veux dire par là pas de twitter, pas
d'IRC et autres mailing-lists.&lt;/p&gt;
&lt;p&gt;Quand je dis hors-ligne, je ne dis pas que je n'ai pas travaillé sur mon
ordinateur. J'ai à fournir beaucoup plus de travail que ce que je ne
pensait en premier lieu pour la rédaction de mon mémoire et j'ai passé
quelques heures par ci par là à lire des articles et livres sur le sujet
ainsi que rédigé une bonne partie de mon mémoire durant ces 10 jours.
Résultat ? Les heures que j'ai passées à travailler ont été étonnement
plus productives que celles que j'ai l'habitude de passer derrière un
écran. Je ne parles pas uniquement du fait de procrastiner; évidemment
c'est une des causes principales de ma perte de productivité, mais je
pense également au fait de laisser le cerveau reposer, au moins en ce
qui concerne la partie informatique. Bricoler demande de la
concentration et de la réflexion mais permet également de laisser son
esprit vagabonder. J'ai pu donc avancer mes sur certaines parties de mon
mémoire alors que j'étais en train de poser le bardage sur la garage par
exemple.&lt;/p&gt;
&lt;p&gt;Passer du temps sur autre chose (qui demandait également de la
concentration par ailleurs) m'a permis d'être réellement plus efficace
lors de mes phases de rédaction et de lecture.&lt;/p&gt;
&lt;p&gt;Je me demande depuis quelques temps quel sera mon futur travail et
quelle forme il prendra. Éééh oui, la fin des études arrive pour la fin
de l'année, c'est pas une blague. Et je me pose sérieusement la question
du travail aux 3/4 temps. La raison principale étant que je ne souhaites
pas passer la majeure partie de mon temps à travailler derrière un écran
et que la formation que j'ai m'y rattache beaucoup. Ne me comprenez pas
de travers: j'aime ce que je fais; mais j'aime aussi ce que je fais à
coté de l'informatique: associatif, projets alternatifs, permaculture et
autres.&lt;/p&gt;
&lt;p&gt;Viens s'ajouter à ça le fait d'avoir une qualité de vie qui me semble
pouvoir passer par le fait de travailler moins ("il est marant ce gamin,
il à pas encore commencé à travailler qu'il veut bosser moins, regarde
moi cette feignasse!") et travailler plus efficacement. Bien sur, on
n'est jamais 100% productif et c'est d'autant plus vrai pour moi, alors
si gagner en productivité peut passer par travailler moins, pourquoi pas
s'y essayer !&lt;/p&gt;
&lt;p&gt;Peut être que vous pratiquez déjà le travail au 3/4 temps, que vous avez
des retours d'expérience à faire : fausse bonne idée ? Vraie bonne idée
?&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Analyse users' browsing context to build up a web recommender</title><link href="https://blog.notmyidea.org/analyse-users-browsing-context-to-build-up-a-web-recommender.html" rel="alternate"></link><published>2011-04-01T00:00:00+02:00</published><updated>2011-04-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-04-01:/analyse-users-browsing-context-to-build-up-a-web-recommender.html</id><summary type="html">
&lt;p&gt;No, this is not an april's fool ;)&lt;/p&gt;
&lt;p&gt;Wow, it's been a long time. My year in Oxford is going really well. I
realized few days ago that the end of the year is approaching really
quickly. Exams are coming in one month or such and then I'll be working
full …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;No, this is not an april's fool ;)&lt;/p&gt;
&lt;p&gt;Wow, it's been a long time. My year in Oxford is going really well. I
realized few days ago that the end of the year is approaching really
quickly. Exams are coming in one month or such and then I'll be working
full time on my dissertation topic.&lt;/p&gt;
&lt;p&gt;When I learned we'll have about 6 month to work on something, I first
thought about doing a packaging related stuff, but finally decided to
start something new. After all, that's the good time to learn.&lt;/p&gt;
&lt;p&gt;Since a long time, I'm being impressed by the &lt;a href="http://last.fm"&gt;last.fm&lt;/a&gt;
recommender system. They're &lt;em&gt;scrobbling&lt;/em&gt; the music I listen to since
something like 5 years now and the recommendations they're doing are
really nice and accurate (I discovered &lt;strong&gt;a lot&lt;/strong&gt; of great artists
listening to the "neighbour radio".) (by the way, &lt;a href="http://lastfm.com/user/akounet/"&gt;here
is&lt;/a&gt; my lastfm account)&lt;/p&gt;
&lt;p&gt;So I decided to work on recommender systems, to better understand what
is it about.&lt;/p&gt;
&lt;p&gt;Recommender systems are usually used to increase the sales of products
(like Amazon.com does) which is not really what I'm looking for (The one
who know me a bit know I'm kind of sick about all this consumerism going
on).&lt;/p&gt;
&lt;p&gt;Actually, the most simple thing I thought of was the web: I'm browsing
it quite every day and each time new content appears. I've stopped to
follow &lt;a href="https://bitbucket.org/bruno/aspirator/"&gt;my feed reader&lt;/a&gt; because
of the information overload, and reduced drastically the number of
people I follow &lt;a href="http://twitter.com/ametaireau/"&gt;on twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Too much information kills the information.&lt;/p&gt;
&lt;p&gt;You shall got what will be my dissertation topic: a recommender system
for the web. Well, such recommender systems already exists, so I will
try to add contextual information to them: you're probably not
interested by the same topics at different times of the day, or
depending on the computer you're using. We can also probably make good
use of the way you browse to create groups into the content you're
browsing (or even use the great firefox4 tab group feature).&lt;/p&gt;
&lt;p&gt;There is a large part of concerns to have about user's privacy as well.&lt;/p&gt;
&lt;p&gt;Here is my proposal (copy/pasted from the one I had to do for my master)&lt;/p&gt;
&lt;h2 id="introduction-and-rationale"&gt;Introduction and rationale&lt;/h2&gt;
&lt;p&gt;Nowadays, people surf the web more and more often. New web pages are
created each day so the amount of information to retrieve is more
important as the time passes. These users uses the web in different
contexts, from finding cooking recipes to technical articles.&lt;/p&gt;
&lt;p&gt;A lot of people share the same interest to various topics, and the
quantity of information is such than it's really hard to triage them
efficiently without spending hours doing it. Firstly because of the huge
quantity of information but also because the triage is something
relative to each person. Although, this triage can be facilitated by
fetching the browsing information of all particular individuals and put
the in perspective.&lt;/p&gt;
&lt;p&gt;Machine learning is a branch of Artificial Intelligence (AI) which deals
with how a program can learn from data. Recommendation systems are a
particular application area of machine learning which is able to
recommend things (links in our case) to the users, given a particular
database containing the previous choices users have made.&lt;/p&gt;
&lt;p&gt;This browsing information is currently available in browsers. Even if it
is not in a very usable format, it is possible to transform it to
something useful. This information gold mine just wait to be used.
Although, it is not as simple as it can seems at the first approach: It
is important to take care of the context the user is in while browsing
links. For instance, It's more likely that during the day, a computer
scientist will browse computing related links, and that during the
evening, he browse cooking recipes or something else.&lt;/p&gt;
&lt;p&gt;Page contents are also interesting to analyse, because that's what
people browse and what actually contain the most interesting part of the
information. The raw data extracted from the browsing can then be
translated into something more useful (namely tags, type of resource,
visit frequency, navigation context etc.)&lt;/p&gt;
&lt;p&gt;The goal of this dissertation is to create a recommender system for web
links, including this context information.&lt;/p&gt;
&lt;p&gt;At the end of the dissertation, different pieces of software will be
provided, from raw data collection from the browser to a recommendation
system.&lt;/p&gt;
&lt;h2 id="background-review"&gt;Background Review&lt;/h2&gt;
&lt;p&gt;This dissertation is mainly about data extraction, analysis and
recommendation systems. Two different research area can be isolated:
Data preprocessing and Information filtering.&lt;/p&gt;
&lt;p&gt;The first step in order to make recommendations is to gather some data.
The more data we have available, the better it is (T. Segaran, 2007).
This data can be retrieved in various ways, one of them is to get it
directly from user's browsers.&lt;/p&gt;
&lt;h3 id="data-preparation-and-extraction"&gt;Data preparation and extraction&lt;/h3&gt;
&lt;p&gt;The data gathered from browsers is basically URLs and additional
information about the context of the navigation. There is clearly a need
to extract more information about the meaning of the data the user is
browsing, starting by the content of the web pages.&lt;/p&gt;
&lt;p&gt;Because the information provided on the current Web is not meant to be
read by machines (T. Berners Lee, 2001) there is a need of tools to
extract meaning from web pages. The information needs to be preprocessed
before stored in a machine readable format, allowing to make
recommendations (Choochart et Al, 2004).&lt;/p&gt;
&lt;p&gt;Data preparation is composed of two steps: cleaning and structuring (
Castellano et Al, 2007). Because raw data can contain a lot of un-needed
text (such as menus, headers etc.) and need to be cleaned prior to be
stored. Multiple techniques can be used here and belongs to boilerplate
removal and full text extraction (Kohlschütter et Al, 2010).&lt;/p&gt;
&lt;p&gt;Then, structuring the information: category, type of content (news,
blog, wiki) can be extracted from raw data. This kind of information is
not clearly defined by HTML pages so there is a need of tools to
recognise them.&lt;/p&gt;
&lt;p&gt;Some context-related information can also be inferred from each
resource. It can go from the visit frequency to the navigation group the
user was in while browsing. It is also possible to determine if the user
"liked" a resource, and determine a mark for it, which can be used by
information filtering a later step (T. Segaran, 2007).&lt;/p&gt;
&lt;p&gt;At this stage, structuring the data is required. Storing this kind of
information in RDBMS can be a bit tedious and require complex queries to
get back the data in an usable format. Graph databases can play a major
role in the simplification of information storage and querying.&lt;/p&gt;
&lt;h3 id="information-filtering"&gt;Information filtering&lt;/h3&gt;
&lt;p&gt;To filter the information, three techniques can be used (Balabanovic et
Al, 1997):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The content-based approach states that if an user have liked
something in the past, he is more likely to like similar things in
the future. So it's about establishing a profile for the user and
compare new items against it.&lt;/li&gt;
&lt;li&gt;The collaborative approach will rather recommend items that other
similar users have liked. This approach consider only the
relationship between users, and not the profile of the user we are
making recommendations to.&lt;/li&gt;
&lt;li&gt;the hybrid approach, which appeared recently combine both of the
previous approaches, giving recommendations when items score high
regarding user's profile, or if a similar user already liked it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grouping is also something to consider at this stage (G. Myatt, 2007).
Because we are dealing with huge amount of data, it can be useful to
detect group of data that can fit together. Data clustering is able to
find such groups (T. Segaran, 2007).&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Balabanović, M., &amp;amp; Shoham, Y. (1997). Fab: content-based,
collaborative recommendation. Communications of the ACM, 40(3),
6672. ACM. Retrieved March 1, 2011, from
&lt;a href="http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp;"&gt;http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp;&lt;/a&gt;;.&lt;/li&gt;
&lt;li&gt;Berners-Lee, T., Hendler, J., &amp;amp; Lassila, O. (2001). The semantic
web: Scientific american. Scientific American, 284(5), 3443.
Retrieved November 21, 2010, from
&lt;a href="http://www.citeulike.org/group/222/article/1176986"&gt;http://www.citeulike.org/group/222/article/1176986&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Castellano, G., Fanelli, A., &amp;amp; Torsello, M. (2007). LODAP: a LOg
DAta Preprocessor for mining Web browsing patterns. Proceedings of
the 6th Conference on 6th WSEAS Int. Conf. on Artificial
Intelligence, Knowledge Engineering and Data Bases-Volume 6 (p.
1217). World Scientific and Engineering Academy and Society
(WSEAS). Retrieved March 8, 2011, from
&lt;a href="http://portal.acm.org/citation.cfm?id=1348485.1348488"&gt;http://portal.acm.org/citation.cfm?id=1348485.1348488&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kohlschutter, C., Fankhauser, P., &amp;amp; Nejdl, W. (2010). Boilerplate
detection using shallow text features. Proceedings of the third ACM
international conference on Web search and data mining (p. 441450).
ACM. Retrieved March 8, 2011, from
&lt;a href="http://portal.acm.org/citation.cfm?id=1718542"&gt;http://portal.acm.org/citation.cfm?id=1718542&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Myatt, G. J. (2007). Making Sense of Data: A Practical Guide to
Exploratory Data Analysis and Data Mining.&lt;/li&gt;
&lt;li&gt;Segaran, T. (2007). Collective Intelligence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="privacy"&gt;Privacy&lt;/h2&gt;
&lt;p&gt;The first thing that's come to people minds when it comes to process
their browsing data is privacy. People don't want to be stalked. That's
perfectly right, and I don't either.&lt;/p&gt;
&lt;p&gt;But such a system don't have to deal with people identities. It's
completely possible to process completely anonymous data, and that's
probably what I'm gonna do.&lt;/p&gt;
&lt;p&gt;By the way, if you have interesting thoughts about that, if you do know
projects that do seems related, fire the comments !&lt;/p&gt;
&lt;h2 id="whats-the-plan"&gt;What's the plan ?&lt;/h2&gt;
&lt;p&gt;There is a lot of different things to explore, especially because I'm a
complete novice in that field.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I want to develop a firefox plugin, to extract the browsing
informations ( still, I need to know exactly which kind of
informations to retrieve). The idea is to provide some &lt;em&gt;raw&lt;/em&gt;
browsing data, and then to transform it and to store it in the
better possible way.&lt;/li&gt;
&lt;li&gt;Analyse how to store the informations in a graph database. What can
be the different methods to store this data and to visualize the
relationship between different pieces of data? How can I define the
different contexts, and add those informations in the db?&lt;/li&gt;
&lt;li&gt;Process the data using well known recommendation algorithms. Compare
the results and criticize their value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is plenty of stuff I want to try during this experimentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I want to try using Geshi to visualize the connexion between the
links, and the contexts&lt;/li&gt;
&lt;li&gt;Try using graph databases such as Neo4j&lt;/li&gt;
&lt;li&gt;Having a deeper look at tools such as scikit.learn (a machine
learning toolkit in python)&lt;/li&gt;
&lt;li&gt;Analyse web pages in order to categorize them. Processing their
contents as well, to do some keyword based classification will be
done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lot of work on its way, yay !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Working directly on your server? How to backup and sync your dev environment with unison</title><link href="https://blog.notmyidea.org/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html" rel="alternate"></link><published>2011-03-16T00:00:00+01:00</published><updated>2011-03-16T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-03-16:/working-directly-on-your-server-how-to-backup-and-sync-your-dev-environment-with-unison.html</id><summary type="html">
&lt;p&gt;I have a server running freebsd since some time now, and was wondering
about the possibility to directly have a development environment ready
to use when I get a internet connexion, even if I'm not on my computer.&lt;/p&gt;
&lt;p&gt;Since I use vim to code, and spend most of my time …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;I have a server running freebsd since some time now, and was wondering
about the possibility to directly have a development environment ready
to use when I get a internet connexion, even if I'm not on my computer.&lt;/p&gt;
&lt;p&gt;Since I use vim to code, and spend most of my time in a console while
developing, it's possible to work via ssh, from everywhere.&lt;/p&gt;
&lt;p&gt;The only problem is the synchronisation of the source code, config files
etc. from my machine to the server.&lt;/p&gt;
&lt;p&gt;Unison provides an interesting way to synchronise two folders, even over
a network. So let's do it !&lt;/p&gt;
&lt;h2 id="creating-the-jail"&gt;Creating the jail&lt;/h2&gt;
&lt;p&gt;In case you don't use FreeBSD, you can skip this section.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# I have a flavour jail named default&lt;/span&gt;
&lt;span class="err"&gt;$ ezjail-admin -f default workspace.notmyidea.org 172.19.1.6&lt;/span&gt;
&lt;span class="err"&gt;$ ezjail-admin start workspace.notmyidea.org&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In my case, because the "default" flavour contains already a lot of
interesting things, my jail come already setup with ssh, bash and vim
for instance, but maybe you'll need it in your case.&lt;/p&gt;
&lt;p&gt;I want to be redirected to the ssh of the jail when I connect to the
host with the 20006 port. Add lines in &lt;code&gt;/etc/pf.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; &lt;span class="nv"&gt;workspace_jail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;172.19.1.6&amp;quot;&lt;/span&gt;
rdr on &lt;span class="nv"&gt;$ext_if&lt;/span&gt; proto tcp from any to &lt;span class="nv"&gt;$ext_ip&lt;/span&gt; port &lt;span class="m"&gt;20006&lt;/span&gt; -&amp;gt; &lt;span class="nv"&gt;$workspace_jail&lt;/span&gt; port &lt;span class="m"&gt;22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Reload packet filter rules&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ /etc/rc.d/pf reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="working-with-unison"&gt;Working with unison&lt;/h2&gt;
&lt;p&gt;Now that we've set up the jail. Set up unison on the server and on your
client. Unison is available on the freebsd ports so just install it&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh notmyidea.org -p &lt;span class="m"&gt;20006&lt;/span&gt;
$ make -C /usr/ports/net/unison-nox11 config-recursive
$ make -C /usr/ports/net/unison-nox11 package-recursive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install as well unison on your local machine. Double check to install
the same version on the client and on the server. Ubuntu contains the
2.27.57 as well as the 2.32.52.&lt;/p&gt;
&lt;p&gt;Check that unison is installed and reachable via ssh from your machine&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh notmyidea.org -p &lt;span class="m"&gt;20006&lt;/span&gt; unison -version
unison version &lt;span class="m"&gt;2&lt;/span&gt;.27.157
$ unison -version
unison version &lt;span class="m"&gt;2&lt;/span&gt;.27.57
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="let-sync-our-folders"&gt;Let sync our folders&lt;/h2&gt;
&lt;p&gt;The first thing I want to sync is my vim configuration. Well, it's
already &lt;a href="http://github.com/ametaireau/dotfiles/"&gt;in a git repository&lt;/a&gt;
but let's try to use unison for it right now.&lt;/p&gt;
&lt;p&gt;I have two machines then: workspace, the jail, and ecureuil my laptop.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unison .vim ssh://notmyidea.org:20006/.vim
unison .vimrc ssh://notmyidea.org:20006/.vimrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is also possible to put all the informations in a config file, and
then to only run unison. (fire up vim \~/.unison/default.prf.&lt;/p&gt;
&lt;p&gt;Here is my config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; &lt;span class="na"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/home/alexis&lt;/span&gt;
&lt;span class="s"&gt; root = ssh://notmyidea.org:20006&lt;/span&gt;
&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;.vimrc&lt;/span&gt;
&lt;span class="s"&gt; path = dotfiles&lt;/span&gt;
&lt;span class="s"&gt; path = dev&lt;/span&gt;
&lt;span class="na"&gt;follow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Name *&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;My vimrc is in fact a symbolic link on my laptop, but I don't want to
specify each of the links to unison. That's why the follow = Name * is
for.&lt;/p&gt;
&lt;p&gt;The folders you want to synchronize are maybe a bit large. If so,
considering others options such as rsync for the first import may be a
good idea (I enjoyed my university huge upload bandwith to upload 2GB in
20mn ;)&lt;/p&gt;
&lt;h2 id="run-the-script-frequently"&gt;Run the script frequently&lt;/h2&gt;
&lt;p&gt;Once that done, you just need to run the unison command line some times
when you want to sync your two machines. I've wrote a tiny script to get
some feedback from the sync:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="n"&gt;DEFAULT_LOGFILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/unison.log&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;PROGRAM_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Unison syncer&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_LOGFILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;program_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PROGRAM_NAME&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;# init&lt;/span&gt;
&lt;span class="n"&gt;display_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# call unison to make the sync&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;unison -batch &amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{0}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logfile&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# get the duration of the operation&lt;/span&gt;
&lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt;
&lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="c1"&gt;# check what was the last entry in the log&lt;/span&gt;
&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logfile&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;No updates to propagate&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="n"&gt;display_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Synchronization&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; It took &lt;/span&gt;&lt;span class="si"&gt;{0}&lt;/span&gt;&lt;span class="s2"&gt;s.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;display_message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;notify-send -i &lt;/span&gt;&lt;span class="si"&gt;{2}&lt;/span&gt;&lt;span class="s1"&gt; &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{0}&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{1}&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;program_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;info&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is probably perfectible, but that does the job.&lt;/p&gt;
&lt;p&gt;Last step is to tell you machine to run that frequently. That's what
crontab is made for, so let's &lt;code&gt;crontab -e&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt; $ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The \~/.Xdbus allows cron to communicate with your X11 session. Here is
its content.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c1"&gt;# Get the pid of nautilus&lt;/span&gt;
&lt;span class="nv"&gt;nautilus_pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;pgrep -u &lt;span class="nv"&gt;$LOGNAME&lt;/span&gt; -n nautilus&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# If nautilus isn&amp;#39;t running, just exit silently&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$nautilus_pid&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="c1"&gt;# Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus&amp;#39;s environment&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;tr &lt;span class="s1"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &amp;lt; /proc/&lt;span class="nv"&gt;$nautilus_pid&lt;/span&gt;/environ &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;^DBUS_SESSION_BUS_ADDRESS=&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Check that we actually found it&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$DBUS_SESSION_BUS_ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Failed to find bus address&amp;quot;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="c1"&gt;# export it so that child processes will inherit it&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; DBUS_SESSION_BUS_ADDRESS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And it comes from
&lt;a href="http://ubuntuforums.org/showthread.php?p=10148738#post10148738"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A sync takes about 20s + the upload time on my machine, which stay
acceptable for all of my developments.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Wrap up of the distutils2 paris' sprint</title><link href="https://blog.notmyidea.org/wrap-up-of-the-distutils2-paris-sprint.html" rel="alternate"></link><published>2011-02-08T00:00:00+01:00</published><updated>2011-02-08T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-02-08:/wrap-up-of-the-distutils2-paris-sprint.html</id><summary type="html">
&lt;p&gt;Finally, thanks to a bunch of people that helped me to pay my train and
bus tickets, I've made it to paris for the distutils2 sprint.&lt;/p&gt;
&lt;p&gt;They have been a bit more than 10 people to come during the sprint, and
it was very productive. Here's a taste of what …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Finally, thanks to a bunch of people that helped me to pay my train and
bus tickets, I've made it to paris for the distutils2 sprint.&lt;/p&gt;
&lt;p&gt;They have been a bit more than 10 people to come during the sprint, and
it was very productive. Here's a taste of what we've been working on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the datafiles, a way to specify and to handle the installation of
files which are not python-related (pictures, manpages and so on).&lt;/li&gt;
&lt;li&gt;mkgcfg, a tool to help you to create a setup.cfg in minutes (and
with funny examples)&lt;/li&gt;
&lt;li&gt;converters from setup.py scripts. We do now have a piece of code
which reads your current setup.py file and fill in some fields in
the setup.cfg for you.&lt;/li&gt;
&lt;li&gt;a compatibility layer for distutils1, so it can read the setup.cfg
you will wrote for distutils2 :-)&lt;/li&gt;
&lt;li&gt;the uninstaller, so it's now possible to uninstall what have been
installed by distutils2 (see PEP 376)&lt;/li&gt;
&lt;li&gt;the installer, and the setuptools compatibility layer, which will
allow you to rely on setuptools' based distributions (and there are
plenty of them!)&lt;/li&gt;
&lt;li&gt;The compilers, so they are more flexible than they were. Since
that's an obscure part of the code for distutils2 commiters (it
comes directly from the distutils1 ages), having some guys who
understood the problematics here was a must.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some people have also tried to port their packaging from distutils1 to
distutils2. They have spotted a number of bugs and made some
improvements to the code, to make it more friendly to use.&lt;/p&gt;
&lt;p&gt;I'm really pleased to see how newcomers went trough the code, and
started hacking so fast. I must say it wasn't the case when we started
to work on distutils1 so that's a very good point: people now can hack
the code quicker than they could before.&lt;/p&gt;
&lt;p&gt;Some of the features here are not &lt;em&gt;completely&lt;/em&gt; finished yet, but are on
the tubes, and will be ready for a release (hopefully) at the end of the
week.&lt;/p&gt;
&lt;p&gt;Big thanks to logilab for hosting (and sponsoring my train ticket) and
providing us food, and to bearstech for providing some money for
breakfast and bears^Wbeers.&lt;/p&gt;
&lt;p&gt;Again, a big thanks to all the people who gave me money to pay the
transport, I really wasn't expecting such thing to happen :-)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>PyPI on CouchDB</title><link href="https://blog.notmyidea.org/pypi-on-couchdb.html" rel="alternate"></link><published>2011-01-20T00:00:00+01:00</published><updated>2011-01-20T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-01-20:/pypi-on-couchdb.html</id><summary type="html">
&lt;p&gt;By now, there are two ways to retrieve data from PyPI (the Python
Package Index). You can both rely on xml/rpc or on the "simple" API. The
simple API is not so simple to use as the name suggest, and have several
existing drawbacks.&lt;/p&gt;
&lt;p&gt;Basically, if you want to …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;By now, there are two ways to retrieve data from PyPI (the Python
Package Index). You can both rely on xml/rpc or on the "simple" API. The
simple API is not so simple to use as the name suggest, and have several
existing drawbacks.&lt;/p&gt;
&lt;p&gt;Basically, if you want to use informations coming from the simple API,
you will have to parse web pages manually, to extract informations using
some black vodoo magic. Badly, magic have a price, and it's sometimes
impossible to get exactly the informations you want to get from this
index. That's the technique currently being used by distutils2,
setuptools and pip.&lt;/p&gt;
&lt;p&gt;On the other side, while XML/RPC is working fine, it's requiring extra
work to the python servers each time you request something, which can
lead to some outages from time to time. Also, it's important to point
out that, even if PyPI have a mirroring infrastructure, it's only for
the so-called &lt;em&gt;simple&lt;/em&gt; API, and not for the XML/RPC.&lt;/p&gt;
&lt;h2 id="couchdb"&gt;CouchDB&lt;/h2&gt;
&lt;p&gt;Here comes CouchDB. CouchDB is a document oriented database, that knows
how to speak REST and JSON. It's easy to use, and provides out of the
box a replication mechanism.&lt;/p&gt;
&lt;h2 id="so-what"&gt;So, what ?&lt;/h2&gt;
&lt;p&gt;Hmm, I'm sure you got it. I've wrote a piece of software to link
informations from PyPI to a CouchDB instance. Then you can replicate all
the PyPI index with only one HTTP request on the CouchDB server. You can
also access the informations from the index directly using a REST API,
speaking json. Handy.&lt;/p&gt;
&lt;p&gt;So PyPIonCouch is using the PyPI XML/RPC API to get data from PyPI, and
generate records in the CouchDB instance.&lt;/p&gt;
&lt;p&gt;The final goal is to avoid to rely on this "simple" API, and rely on a
REST insterface instead. I have set up a couchdb server on my server,
which is available at
&lt;a href="http://couchdb.notmyidea.org/_utils/database.html?pypi"&gt;http://couchdb.notmyidea.org/_utils/database.html?pypi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is not a lot to see there for now, but I've done the first import
from PyPI yesterday and all went fine: it's possible to access the
metadata of all PyPI projects via a REST interface. Next step is to
write a client for this REST interface in distutils2.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;p&gt;For now, you can use pypioncouch via the command line, or via the python
API.&lt;/p&gt;
&lt;h3 id="using-the-command-line"&gt;Using the command line&lt;/h3&gt;
&lt;p&gt;You can do something like that for a full import. This &lt;strong&gt;will&lt;/strong&gt; take
long, because it's fetching all the projects at pypi and importing their
metadata:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;pypioncouch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;fullimport&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;couchdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you already have the data on your couchdb instance, you can just
update it with the last informations from pypi. &lt;strong&gt;However, I recommend
to just replicate the principal node, hosted at
&lt;a href="http://couchdb.notmyidea.org/pypi/"&gt;http://couchdb.notmyidea.org/pypi/&lt;/a&gt;&lt;/strong&gt;, to avoid the duplication of
nodes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pypioncouch --update http://your.couchdb.instance/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The principal node is updated once a day by now, I'll try to see if it's
enough, and ajust with the time.&lt;/p&gt;
&lt;h3 id="using-the-python-api"&gt;Using the python API&lt;/h3&gt;
&lt;p&gt;You can also use the python API to interact with pypioncouch:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pypioncouch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;XmlRpcImporter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;import_all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;full_import&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="whats-next"&gt;What's next ?&lt;/h2&gt;
&lt;p&gt;I want to make a couchapp, in order to navigate PyPI easily. Here are
some of the features I want to propose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List all the available projects&lt;/li&gt;
&lt;li&gt;List all the projects, filtered by specifiers&lt;/li&gt;
&lt;li&gt;List all the projects by author/maintainer&lt;/li&gt;
&lt;li&gt;List all the projects by keywords&lt;/li&gt;
&lt;li&gt;Page for each project.&lt;/li&gt;
&lt;li&gt;Provide a PyPI "Simple" API equivalent, even if I want to replace
it, I do think it will be really easy to setup mirrors that way,
with the out of the box couchdb replication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also still need to polish the import mechanism, so I can directly
store in couchdb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The OPML files for each project&lt;/li&gt;
&lt;li&gt;The upload_time as couchdb friendly format (list of int)&lt;/li&gt;
&lt;li&gt;The tags as lists (currently it's only a string separated by spaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The work I've done by now is available on
&lt;a href="https://bitbucket.org/ametaireau/pypioncouch/"&gt;https://bitbucket.org/ametaireau/pypioncouch/&lt;/a&gt;. Keep in mind that it's
still a work in progress, and everything can break at any time. However,
any feedback will be appreciated !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Help me to go to the distutils2 paris' sprint</title><link href="https://blog.notmyidea.org/help-me-to-go-to-the-distutils2-paris-sprint.html" rel="alternate"></link><published>2011-01-15T00:00:00+01:00</published><updated>2011-01-15T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2011-01-15:/help-me-to-go-to-the-distutils2-paris-sprint.html</id><summary type="html">
&lt;p&gt;&lt;strong&gt;Edit: Thanks to logilab and some amazing people, I can make it to
paris for the sprint. Many thanks to them for the support!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There will be a distutils2 sprint from the 27th to the 30th of january,
thanks to logilab which will host the event.&lt;/p&gt;
&lt;p&gt;You can find more …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;&lt;strong&gt;Edit: Thanks to logilab and some amazing people, I can make it to
paris for the sprint. Many thanks to them for the support!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There will be a distutils2 sprint from the 27th to the 30th of january,
thanks to logilab which will host the event.&lt;/p&gt;
&lt;p&gt;You can find more informations about the sprint on the wiki page of the
event (&lt;a href="http://wiki.python.org/moin/Distutils/SprintParis"&gt;http://wiki.python.org/moin/Distutils/SprintParis&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I really want to go there but I'm unfortunately blocked in UK for money
reasons. The cheapest two ways I've found is about £80, which I can't
afford. Following some advices on #distutils, I've set up a ChipIn
account for that, so if some people want to help me making it to go
there, they can give me some money that way.&lt;/p&gt;
&lt;p&gt;I'll probably work on the installer (to support old distutils and
setuptools distributions) and on the uninstaller (depending on the first
task). If I can't make it to paris, I'll hang around on IRC to give some
help while needed.&lt;/p&gt;
&lt;p&gt;If you want to contribute some money to help me go there, feel free to
use this chipin page:
&lt;a href="http://ametaireau.chipin.com/distutils2-sprint-in-paris"&gt;http://ametaireau.chipin.com/distutils2-sprint-in-paris&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks for your support !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Fork you! or how the social coding can help you</title><link href="https://blog.notmyidea.org/fork-you-or-how-the-social-coding-can-help-you.html" rel="alternate"></link><published>2010-11-05T00:00:00+01:00</published><updated>2010-11-05T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-11-05:/fork-you-or-how-the-social-coding-can-help-you.html</id><summary type="html">
&lt;p&gt;With &lt;a href="http://github.com"&gt;github&lt;/a&gt; and
&lt;a href="http://www.bitbucket.org"&gt;bitbucket&lt;/a&gt; coming around, a lot of new usages
appears for the developpers: it's now easy to get feedback on your
code/modifications, and to get help from others by, for instance,
forking repositories.&lt;/p&gt;
&lt;p&gt;Eeach time I see people helping others, I'm amazed by how we like to …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;With &lt;a href="http://github.com"&gt;github&lt;/a&gt; and
&lt;a href="http://www.bitbucket.org"&gt;bitbucket&lt;/a&gt; coming around, a lot of new usages
appears for the developpers: it's now easy to get feedback on your
code/modifications, and to get help from others by, for instance,
forking repositories.&lt;/p&gt;
&lt;p&gt;Eeach time I see people helping others, I'm amazed by how we like to
share our knowledge.&lt;/p&gt;
&lt;p&gt;I say github, because it seems to be the more mainstream, but I think
it's something strongly related to the
&lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control"&gt;DVCS&lt;/a&gt;
principles: the "only" thing github have made is to turn that into a
social network, and to reveal the awesomeness of the DVCSes to the
masses.&lt;/p&gt;
&lt;p&gt;What is really interesting is to see how this platform is addictive:
it's automatically updating a webpages with the more accurate
informations about the projects you're involved in, and add a bit of
magic to that using webhooks, allowing you to update your website each
time you push to you repository, for instance.&lt;/p&gt;
&lt;p&gt;Quite nothing, indeed, but, I don't know why, I find this fascinating.&lt;/p&gt;
&lt;p&gt;I haven't had the privilege to see my projects forked from github by
strangers, but I've forked others repository to give an hand some times,
when I wanted to, and the main reason is "because it's &lt;strong&gt;fun&lt;/strong&gt;" to do
so.&lt;/p&gt;
&lt;p&gt;Yeah, you're probably right, you have to be a nerd to find fun to fork
others. The good point is that geeks are a kind of nerds, and some geeks
are coders :)&lt;/p&gt;
&lt;h2 id="new-ways-to-contribute"&gt;New ways to contribute&lt;/h2&gt;
&lt;p&gt;In addition, it seems that he community, or the communities, are there,
on those new social networks for coders. It's really handy to drop an
eye on interesting projects, to report bugs, propose new features, and
check what new projects this or this person have made.&lt;/p&gt;
&lt;p&gt;Well, "it's not new", you may think. That's true, because it's been a
while that SVN was there and even CVS before that. But, it was a bit
messy to "fork" a project, isn't it ? And I'm not talking about all the
hell SVN involved with it (who have not had issues with those messy .svn
folders raises an hand !).&lt;/p&gt;
&lt;p&gt;It have not been so easy to share code and thoughts about code, to
propose changes on existing code, than now. You think it's better to
implement this or that in a different way ? Clone it (fork it), make
your changes and publish them, and then ask projects owners about it.
For sure you'll have answers.&lt;/p&gt;
&lt;p&gt;Even if they don't want it, you can easily keep your changes, and keep
getting their updates!&lt;/p&gt;
&lt;p&gt;Also, lot of &lt;em&gt;fashionables&lt;/em&gt; projects tend to move on DVCS. Personally,
if I know I can fork on a DVCS instead of from a "simple" VCS, I'll
probably be quicker to fork/clone, and to publish changes on my own
copy, than if I had to do so on the upstream repository (and I'll likely
dont have the rights to push to it), because I will not be afraid to
break things.&lt;/p&gt;
&lt;p&gt;DVCSes makes the contribution easier.&lt;/p&gt;
&lt;h2 id="release-early-release-often"&gt;Release early, release often&lt;/h2&gt;
&lt;p&gt;Maybe have you read &lt;a href="http://www.catb.org/~esr/writings/cathedral-bazaar/"&gt;The cathedral and the
bazaar&lt;/a&gt;, by Eric
Steven Raymond ? (If not, consider doing so, it's a really interesting
reading)&lt;/p&gt;
&lt;p&gt;Among a lot of others interesting things, one hint he gives is &lt;em&gt;release
early, release often&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I understand it as: if you want to get contributors, release your code
early, even if it's not perfect, and don't be afraid to publish your
changes each time it's needed.&lt;/p&gt;
&lt;p&gt;Without notifying it, that's basically what I was doing for my own
projects. I guess that's because Social coding platforms encourages
those practices, partially cause of the possible impact publishing each
of your changes can have on your final solution.&lt;/p&gt;
&lt;p&gt;If you have considered publishing your projects, code snippets, or
whatever (code related) but did not done it, considering them not yet
ready, maybe should you think about it twice: you can get feedback and
probably start some interesting discussions about it, if you write code
that's readable, of course!&lt;/p&gt;
&lt;h2 id="a-step-further-for-open-source-softwares"&gt;A step further for open source softwares&lt;/h2&gt;
&lt;p&gt;Well, DVCSes are a honking great idea, and they're starting to be really
powerful when applied to free softwares. I mean: if you can't see a
project, it will be hard to contribute to it. And, I don't think anyone
wants to contribute to something closed/proprietary, &lt;em&gt;just for fun&lt;/em&gt;. Or
maybe am I missing something.&lt;/p&gt;
&lt;p&gt;Maybe it's a kind of revolution, about free and open source softwares
(&lt;a href="http://en.wikipedia.org/wiki/Free_and_open_source_software"&gt;FOSS&lt;/a&gt;),
that is going on. I really like to know I have my word to say about the
changes in the tools I use, and to know that I can make them evolve.&lt;/p&gt;
&lt;p&gt;Let's take an example. Imagine I'm using a web framework on daily basis,
as a part of my job as a web developer. I do like using an open source
software because I know how it's working, and because I know that I can
interact with the authors of the framework while they're doing the
changes on it.&lt;/p&gt;
&lt;p&gt;That's communication, nothing more, and of course I can do that with an
internal proprietary solution, but it will cost me &lt;strong&gt;a lot&lt;/strong&gt; more time,
for a dead-simple reason: a company is not as big and powerful as a
community can be: it will cost time to work on this framework, resources
to maintain it, fix bugs etc.&lt;/p&gt;
&lt;p&gt;Well, I'm starting advocating here about Free and Open Source Softwares
use on companies, what is a bit beyond the scope of this article, so
let's back to our DVCSes and new social related tools.&lt;/p&gt;
&lt;p&gt;If I find a bug in this framework, while working, I have the possibility
to go and talk with the creators of the framework, to open a ticket, and
even to make a fix for it, because I've access to the source code. If I
want to create a new feature, I just have to fork it, hack it, and then
publish my code to have feedback of the community.&lt;/p&gt;
&lt;p&gt;My fix/work will benefit to all the people (and maybe others companies)
working with this framework, and it's a way to prove the community that
my company is enough skilled to make code-fixes to the framework, so
that's all good !&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What's next ?&lt;/h2&gt;
&lt;p&gt;I hope those social coding platforms are only the begining of a new
area. I hope they will make people realize what the power of the
community is, and how easily they can becomes part of it.&lt;/p&gt;
&lt;p&gt;If you're not using them right now, maybe you should do so: have a look
on how the programs you're using are made, consider publishing your
experimentations, and share them with others, you will see, it's kind of
addictive !&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>How to reboot your bebox using the CLI</title><link href="https://blog.notmyidea.org/how-to-reboot-your-bebox-using-the-cli.html" rel="alternate"></link><published>2010-10-21T00:00:00+02:00</published><updated>2010-10-21T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-10-21:/how-to-reboot-your-bebox-using-the-cli.html</id><summary type="html">
&lt;p&gt;I've an internet connection which, for some obscure reasons, tend to be
very slow from time to time. After rebooting the box (yes, that's a hard
solution), all the things seems to go fine again.&lt;/p&gt;
&lt;h2 id="edit-using-grep"&gt;EDIT : Using grep&lt;/h2&gt;
&lt;p&gt;After a bit of reflexion, that's also really easy to do using …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;I've an internet connection which, for some obscure reasons, tend to be
very slow from time to time. After rebooting the box (yes, that's a hard
solution), all the things seems to go fine again.&lt;/p&gt;
&lt;h2 id="edit-using-grep"&gt;EDIT : Using grep&lt;/h2&gt;
&lt;p&gt;After a bit of reflexion, that's also really easy to do using directly
the command line tools curl, grep and tail (but really harder to
read).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/&lt;span class="se"&gt;\?&lt;/span&gt;be&lt;span class="se"&gt;\=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="se"&gt;\&amp;amp;&lt;/span&gt;l0&lt;span class="se"&gt;\=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="se"&gt;\&amp;amp;&lt;/span&gt;l1&lt;span class="se"&gt;\=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="se"&gt;\&amp;amp;&lt;/span&gt;tid&lt;span class="se"&gt;\=&lt;/span&gt;RESTART -d &lt;span class="s2"&gt;&amp;quot;0=17&amp;amp;2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&amp;amp;l0\=1\&amp;amp;l1\=0\&amp;amp;tid\=RESTART | grep -o &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;-9&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; | grep -o &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;-9&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; | tail -n 1`&amp;amp;1&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="the-python-version"&gt;The Python version&lt;/h2&gt;
&lt;p&gt;Well, that's not the optimal solution, that's a bit "gruik", but it
works.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urlparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;
&lt;span class="n"&gt;REBOOT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/b/info/restart/?be=0&amp;amp;l0=1&amp;amp;l1=0&amp;amp;tid=RESTART&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;BOX_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://bebox.config/cgi&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;passman&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPPasswordMgrWithDefaultRealm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;passman&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;authhandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPBasicAuthHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;passman&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;opener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build_opener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authhandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install_opener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reboot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name\=&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;2&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; value=&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;([0-9]+)&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0=17&amp;amp;2=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;1&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__file__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;Reboot your bebox !&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boxurl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;boxurl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BOX_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Base box url. Default is &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;BOX_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urlparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urljoin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;boxurl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REBOOT_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reboot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Technologie"></category></entry><entry><title>Dynamically change your gnome desktop wallpaper</title><link href="https://blog.notmyidea.org/dynamically-change-your-gnome-desktop-wallpaper.html" rel="alternate"></link><published>2010-10-11T00:00:00+02:00</published><updated>2010-10-11T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-10-11:/dynamically-change-your-gnome-desktop-wallpaper.html</id><summary type="html">
&lt;p&gt;In gnome, you can can use a XML file to have a dynamic wallpaper. It's
not so easy, and you can't just tell: use the pictures in this folder to
do so.&lt;/p&gt;
&lt;p&gt;You can have a look to the git repository if you want:
&lt;a href="http://github.com/ametaireau/gnome-background-generator"&gt;http://github.com/ametaireau/gnome-background-generator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;In gnome, you can can use a XML file to have a dynamic wallpaper. It's
not so easy, and you can't just tell: use the pictures in this folder to
do so.&lt;/p&gt;
&lt;p&gt;You can have a look to the git repository if you want:
&lt;a href="http://github.com/ametaireau/gnome-background-generator"&gt;http://github.com/ametaireau/gnome-background-generator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some time ago, I've made a little python script to ease that, and you
can now use it too. It's named "gnome-background-generator", and you can
install it via pip for instance.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;shell&lt;/span&gt;
&lt;span class="err"&gt;$ pip install gnome-background-generator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, you have just to use it this way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;shell&lt;/span&gt;
&lt;span class="err"&gt;$ gnome-background-generator -p ~/Images/walls -s&lt;/span&gt;
&lt;span class="err"&gt;/home/alexis/Images/walls/dynamic-wallpaper.xml generated&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is a extract of the `--help`:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;shell&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;gnome&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="c1"&gt;--help&lt;/span&gt;
&lt;span class="k"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gnome&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;TRANSITION_TIME&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;DISPLAY_TIME&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="k"&gt;simple&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;XML&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;gnome&lt;/span&gt;
&lt;span class="n"&gt;wallpapers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="k"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;walls&lt;/span&gt;
&lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--help show this help message and exit&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--path PATH Path to look for the pictures. If no output is&lt;/span&gt;
&lt;span class="n"&gt;specified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;too&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;outputing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="n"&gt;wallpaper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Default&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;current&lt;/span&gt;
&lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="p"&gt;(.)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--output OUTPUT&lt;/span&gt;
&lt;span class="k"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="k"&gt;no&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wallpaper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;containing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;pictures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;TRANSITION_TIME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--transition-time TRANSITION_TIME&lt;/span&gt;
&lt;span class="k"&gt;Time&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;transitions&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;DISPLAY_TIME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--display-time DISPLAY_TIME&lt;/span&gt;
&lt;span class="k"&gt;Time&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;picture&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;displayed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Default&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--set-background &amp;#39;&amp;#39;&amp;#39;try to set the background using gnome-appearance-&lt;/span&gt;
&lt;span class="n"&gt;properties&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Technologie"></category></entry><entry><title>How to install NGINX + PHP 5.3 on FreeBSD.</title><link href="https://blog.notmyidea.org/how-to-install-nginx-php-53-on-freebsd.html" rel="alternate"></link><published>2010-10-10T00:00:00+02:00</published><updated>2010-10-10T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-10-10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've not managed so far to get completely rid of php, so here's a simple
reminder about how to install php on NGINX, for FreeBSD. Nothing hard,
but that's worse to have the piece of configuration somewhere !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;update&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;portsnap&lt;/span&gt; &lt;span class="k"&gt;fetch&lt;/span&gt; &lt;span class="k"&gt;update&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt; &lt;span class="n"&gt;port …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-10-10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've not managed so far to get completely rid of php, so here's a simple
reminder about how to install php on NGINX, for FreeBSD. Nothing hard,
but that's worse to have the piece of configuration somewhere !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;update&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;portsnap&lt;/span&gt; &lt;span class="k"&gt;fetch&lt;/span&gt; &lt;span class="k"&gt;update&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;php5&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;recursive&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;extensions&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;recursive&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;extensions&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;recursive&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;devel&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;recursive&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;devel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we have all the dependencies installed, we need to configure a bit
the server.&lt;/p&gt;
&lt;p&gt;That's a simple thing in fact, but it could be good to have something
that will work without effort over time.&lt;/p&gt;
&lt;p&gt;Here's a sample of my configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;server_name&lt;/span&gt; &lt;span class="err"&gt;ndd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;set&lt;/span&gt; &lt;span class="err"&gt;$path&lt;/span&gt; &lt;span class="err"&gt;/path/to/your/files&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;root&lt;/span&gt; &lt;span class="err"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;location&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;index&lt;/span&gt; &lt;span class="err"&gt;index.php&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;location&lt;/span&gt; &lt;span class="o"&gt;~*&lt;/span&gt; &lt;span class="o"&gt;^.+.(&lt;/span&gt;&lt;span class="nt"&gt;jpg&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;jpeg&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;gif&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;css&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;png&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;js&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;ico&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;)$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;access_log&lt;/span&gt; &lt;span class="err"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;expires&lt;/span&gt; &lt;span class="err"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;location&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;php&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;fastcgi_param&lt;/span&gt; &lt;span class="err"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="err"&gt;$path$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="err"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;include&lt;/span&gt; &lt;span class="err"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;upstream&lt;/span&gt; &lt;span class="nt"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;server&lt;/span&gt; &lt;span class="err"&gt;127.0.0.1:9000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that's it !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Pelican, a simple static blog generator in python</title><link href="https://blog.notmyidea.org/pelican-a-simple-static-blog-generator-in-python.html" rel="alternate"></link><published>2010-10-06T00:00:00+02:00</published><updated>2010-10-06T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-10-06:/pelican-a-simple-static-blog-generator-in-python.html</id><summary type="html">
&lt;p&gt;Those days, I've wrote a little python application to fit my blogging
needs. I'm an occasional blogger, a vim lover, I like restructured text
and DVCSes, so I've made a little tool that makes good use of all that.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.getpelican.com"&gt;Pelican&lt;/a&gt; (for calepin) is just a simple
tool to generate your …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Those days, I've wrote a little python application to fit my blogging
needs. I'm an occasional blogger, a vim lover, I like restructured text
and DVCSes, so I've made a little tool that makes good use of all that.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.getpelican.com"&gt;Pelican&lt;/a&gt; (for calepin) is just a simple
tool to generate your blog as static files, letting you using your
editor of choice (vim!). It's easy to extend, and has a template
support (via jinja2).&lt;/p&gt;
&lt;p&gt;I've made it to fit &lt;em&gt;my&lt;/em&gt; needs. I hope it will fit yours, but maybe it
wont, and it have not be designed to feet everyone's needs.&lt;/p&gt;
&lt;p&gt;Need an example ? You're looking at it ! This weblog is using pelican
to be generated, also for the atom feeds.&lt;/p&gt;
&lt;p&gt;I've released it under AGPL, since I want all the modifications to be
profitable to all the users.&lt;/p&gt;
&lt;p&gt;You can find a repository to fork at
&lt;a href="https://github.com/getpelican/pelican/"&gt;https://github.com/getpelican/pelican/&lt;/a&gt;. feel free to hack it !&lt;/p&gt;
&lt;p&gt;If you just want to get started, use your installer of choice (pip,
easy_install, …) And then have a look to the help (pelican --help)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pip install pelican
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Here's a sample usage of pelican&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pelican .
writing /home/alexis/projets/notmyidea.org/output/index.html
writing /home/alexis/projets/notmyidea.org/output/tags.html
writing /home/alexis/projets/notmyidea.org/output/categories.html
writing /home/alexis/projets/notmyidea.org/output/archives.html
writing /home/alexis/projets/notmyidea.org/output/category/python.html
writing
/home/alexis/projets/notmyidea.org/output/pelican-a-simple-static-blog-generator-in-python.html
Done !
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You also can use the --help option for the command line to get more
informations&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;$pelican&lt;/span&gt; --help
usage: pelican &lt;span class="o"&gt;[&lt;/span&gt;-h&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-t TEMPLATES&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-o OUTPUT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-m MARKUP&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-s SETTINGS&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-b&lt;span class="o"&gt;]&lt;/span&gt;
path
A tool to generate a static blog, with restructured text input files.
positional arguments:
path Path where to find the content files &lt;span class="o"&gt;(&lt;/span&gt;default is
&lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.
optional arguments:
-h, --help show this &lt;span class="nb"&gt;help&lt;/span&gt; message and &lt;span class="nb"&gt;exit&lt;/span&gt;
-t TEMPLATES, --templates-path TEMPLATES
Path where to find the templates. If not specified,
will uses the ones included with pelican.
-o OUTPUT, --output OUTPUT
Where to output the generated files. If not specified,
a directory will be created, named &lt;span class="s2"&gt;&amp;quot;output&amp;quot;&lt;/span&gt; in the
current path.
-m MARKUP, --markup MARKUP
the markup language to use. Currently only
ReSTreucturedtext is available.
-s SETTINGS, --settings SETTINGS
the settings of the application. Default to None.
-b, --debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enjoy :)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>An amazing summer of code working on distutils2</title><link href="https://blog.notmyidea.org/an-amazing-summer-of-code-working-on-distutils2.html" rel="alternate"></link><published>2010-08-16T00:00:00+02:00</published><updated>2010-08-16T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-08-16:/an-amazing-summer-of-code-working-on-distutils2.html</id><summary type="html">
&lt;p&gt;The &lt;a href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt; I've spent
working on &lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt; is over. It
was a really amazing experience, for many reasons.&lt;/p&gt;
&lt;p&gt;First of all, we had a very good team, we were 5 students working on
distutils2: &lt;a href="http://zubin71.wordpress.com"&gt;Zubin&lt;/a&gt;,
&lt;a href="http://wokslog.wordpress.com/"&gt;Éric&lt;/a&gt;,
&lt;a href="http://gsoc.djolonga.com/"&gt;Josip&lt;/a&gt;,
&lt;a href="http://konryd.blogspot.com/"&gt;Konrad&lt;/a&gt; and me. In addition,
&lt;a href="http://mouadino.blogspot.com/"&gt;Mouad&lt;/a&gt; have worked on the …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;The &lt;a href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt; I've spent
working on &lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt; is over. It
was a really amazing experience, for many reasons.&lt;/p&gt;
&lt;p&gt;First of all, we had a very good team, we were 5 students working on
distutils2: &lt;a href="http://zubin71.wordpress.com"&gt;Zubin&lt;/a&gt;,
&lt;a href="http://wokslog.wordpress.com/"&gt;Éric&lt;/a&gt;,
&lt;a href="http://gsoc.djolonga.com/"&gt;Josip&lt;/a&gt;,
&lt;a href="http://konryd.blogspot.com/"&gt;Konrad&lt;/a&gt; and me. In addition,
&lt;a href="http://mouadino.blogspot.com/"&gt;Mouad&lt;/a&gt; have worked on the PyPI testing
infrastructure. You could find what each person have done on &lt;a href="http://bitbucket.org/tarek/distutils2/wiki/GSoC_2010_teams"&gt;the wiki
page of
distutils2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We were in contact with each others really often, helping us when
possible (in #distutils), and were continuously aware of the state of
the work of each participant. This, in my opinion, have bring us in a
good shape.&lt;/p&gt;
&lt;p&gt;Then, I've learned a lot. Python packaging was completely new to me at
the time of the GSoC start, and I was pretty unfamiliar with python good
practices too, as I've been introducing myself to python in the late
2009.&lt;/p&gt;
&lt;p&gt;I've recently looked at some python code I wrote just three months ago,
and I was amazed to think about many improvements to made on it. I guess
this is a good indicator of the path I've traveled since I wrote it.&lt;/p&gt;
&lt;p&gt;This summer was awesome because I've learned about python good
practices, now having some strong
&lt;a href="http://mercurial.selenic.com/"&gt;mercurial&lt;/a&gt; knowledge, and I've seen a
little how the python community works.&lt;/p&gt;
&lt;p&gt;Then, I would like to say a big thanks to all the mentors that have
hanged around while needed, on IRC or via mail, and especially my mentor
for this summer, &lt;a href="http://tarek.ziade.org"&gt;Tarek Ziadé&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks a lot for your motivation, your leadership and your cheerfulness,
even with a new-born and a new work!&lt;/p&gt;
&lt;h2 id="why"&gt;Why ?&lt;/h2&gt;
&lt;p&gt;I wanted to work on python packaging because, as the time pass, we were
having a sort of complex tools in this field. Each one wanted to add
features to distutils, but not in a standard way.&lt;/p&gt;
&lt;p&gt;Now, we have PEPs that describes some format we agreed on (see PEP 345),
and we wanted to have a tool on which users can base their code on,
that's &lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="my-job"&gt;My job&lt;/h2&gt;
&lt;p&gt;I had to provide a way to crawl the PyPI indexes in a simple way, and do
some installation / uninstallation scripts.&lt;/p&gt;
&lt;p&gt;All the work done is available in &lt;a href="http://bitbucket.org/ametaireau/distutils2/"&gt;my bitbucket
repository&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="crawling-the-pypi-indexes"&gt;Crawling the PyPI indexes&lt;/h3&gt;
&lt;p&gt;There are two ways of requesting informations from the indexes: using
the "simple" index, that is a kind of REST index, and using XML-RPC.&lt;/p&gt;
&lt;p&gt;I've done the two implementations, and a high level API to query those
twos. Basically, this supports the mirroring infrastructure defined in
PEP 381. So far, the work I've done is gonna be used in pip (they've
basically copy/paste the code, but this will change as soon as we get
something completely stable for distutils2), and that's a good news, as
it was the main reason for what I've done that.&lt;/p&gt;
&lt;p&gt;I've tried to have an unified API for the clients, to switch from one to
another implementation easily. I'm already thinking of adding others
crawlers to this stuff, and it was made to be extensible.&lt;/p&gt;
&lt;p&gt;If you want to get more informations about the crawlers/PyPI clients,
please refer to the distutils2 documentation, especially &lt;a href="http://distutils2.notmyidea.org/library/distutils2.index.html"&gt;the pages
about
indexes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can find the changes I made about this in the
&lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt; source code .&lt;/p&gt;
&lt;h3 id="installation-uninstallation-scripts"&gt;Installation / Uninstallation scripts&lt;/h3&gt;
&lt;p&gt;Next step was to think about an installation script, and an uninstaller.
I've not done the uninstaller part, and it's a smart part, as it's
basically removing some files from the system, so I'll probably do it in
a near future.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt; provides a way to install
distributions, and to handle dependencies between releases. For now,
this support is only about the last version of the METADATA (1.2) (See,
the PEP 345), but I'm working on a compatibility layer for the old
metadata, and for the informations provided via PIP requires.txt, for
instance.&lt;/p&gt;
&lt;h3 id="extra-work"&gt;Extra work&lt;/h3&gt;
&lt;p&gt;Also, I've done some extra work. this includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;working on the PEP 345, and having some discussion about it (about
the names of some fields).&lt;/li&gt;
&lt;li&gt;writing a PyPI server mock, useful for tests. you can find more
information about it on the
&lt;a href="http://distutils.notmyidea.org"&gt;documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="futures-plans"&gt;Futures plans&lt;/h2&gt;
&lt;p&gt;As I said, I've enjoyed working on distutils2, and the people I've met
here are really pleasant to work with. So I &lt;em&gt;want&lt;/em&gt; to continue
contributing on python, and especially on python packaging, because
there is still a lot of things to do in this scope, to get something
really usable.&lt;/p&gt;
&lt;p&gt;I'm not plainly satisfied by the work I've done, so I'll probably tweak
it a bit: the installer part is not yet completely finished, and I want
to add support for a real
&lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;
index in the future.&lt;/p&gt;
&lt;p&gt;We'll talk again of this in the next months, probably, but we definitely
need a real
&lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; API
for &lt;a href="http://pypi.python.org"&gt;PyPI&lt;/a&gt;, as the "simple" index &lt;em&gt;is&lt;/em&gt; an ugly
hack, in my opinion. I'll work on a serious proposition about this,
maybe involving &lt;a href="http://couchdb.org"&gt;CouchDB&lt;/a&gt;, as it seems to be a good
option for what we want here.&lt;/p&gt;
&lt;h2 id="issues"&gt;Issues&lt;/h2&gt;
&lt;p&gt;I've encountered some issues during this summer. The main one is that's
hard to work remotely, especially being in the same room that we live,
with others. I like to just think about a project with other people, a
paper and a pencil, no computers. This have been not so possible at the
start of the project, as I needed to read a lot of code to understand
the codebase, and then to read/write emails.&lt;/p&gt;
&lt;p&gt;I've finally managed to work in an office, so good point for home/office
separation.&lt;/p&gt;
&lt;p&gt;I'd not planned there will be so a high number of emails to read, in
order to follow what's up in the python world, and be a part of the
community seems to takes some times to read/write emails, especially for
those (like me) that arent so confortable with english (but this had
brought me some english fu !).&lt;/p&gt;
&lt;h2 id="thanks"&gt;Thanks !&lt;/h2&gt;
&lt;p&gt;A big thanks to &lt;a href="http://www.graine-libre.fr/"&gt;Graine Libre&lt;/a&gt; and &lt;a href="http://www.makina-corpus.com/"&gt;Makina
Corpus&lt;/a&gt;, which has offered me to come
into their offices from time to time, to share they cheerfulness ! Many
thanks too to the Google Summer of Code program for setting up such an
initiative. If you're a student, if you're interested about FOSS, dont
hesitate any second, it's a really good opportunity to work on
interesting projects!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Sprinting on distutils2 in Tours</title><link href="https://blog.notmyidea.org/sprinting-on-distutils2-in-tours.html" rel="alternate"></link><published>2010-07-10T00:00:00+02:00</published><updated>2010-07-10T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-07-10:/sprinting-on-distutils2-in-tours.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-07-06&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yesterday, as I was traveling to Tours, I've took some time to visit
Éric, another student who's working on distutils2 this summer, as a
part of the GSoC. Basically, it was to take a drink, discuss a bit about
distutils2, our respective tasks and general feelings …&lt;/p&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-07-06&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yesterday, as I was traveling to Tours, I've took some time to visit
Éric, another student who's working on distutils2 this summer, as a
part of the GSoC. Basically, it was to take a drink, discuss a bit about
distutils2, our respective tasks and general feelings, and to put a face
on a pseudonym. I'd really enjoyed this time, because Éric knows a lot
of things about mercurial and python good practices, and I'm eager to
learn about those. So, we have discussed about things, have not wrote so
much code, but have some things to propose so far, about documentation,
and I also provides here some bribes of conversations we had.&lt;/p&gt;
&lt;h2 id="documentation"&gt;Documentation&lt;/h2&gt;
&lt;p&gt;While writing the PyPI simple index crawler documentation, I realized
that we miss some structure, or how-to about the documentation. Yep, you
read well. We lack documentation on how to make documentation. Heh.
We're missing some rules to follow, and this lead to a not-so-structured
final documentation. We probably target three type of publics, and we
can split the documentation regarding those:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Packagers&lt;/strong&gt; who want to distribute their softwares.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End users&lt;/strong&gt; who need to understand how to use end user commands,
like the installer/uninstaller&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;packaging coders&lt;/strong&gt; who &lt;em&gt;use&lt;/em&gt; distutils2, as a base for building a
package manager.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also need to discuss about a pattern to follow while writing
documentation. How many parts do we need ? Where to put the API
description ? etc. That's maybe seems to be not so important, but I
guess the readers would appreciate to have the same structure all along
distutils2 documentation.&lt;/p&gt;
&lt;h2 id="mercurial"&gt;Mercurial&lt;/h2&gt;
&lt;p&gt;I'm really &lt;em&gt;not&lt;/em&gt; a mercurial power user. I use it on daily basis, but I
lack of basic knowledge about it. Big thanks Éric for sharing yours with
me, you're of a great help. We have talked about some mercurial
extensions that seems to make the life simpler, while used the right
way. I've not used them so far, so consider this as a personal note.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hg histedit, to edit the history&lt;/li&gt;
&lt;li&gt;hg crecord, to select the changes to commit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have spent some time to review a merge I made sunday, to re-merge it,
and commit the changes as a new changeset. Awesome. These things make me
say I &lt;strong&gt;need&lt;/strong&gt; to read &lt;a href="http://hgbook.red-bean.com/read/"&gt;the hg book&lt;/a&gt;,
and will do as soon as I got some spare time: mercurial seems to be
simply great. So ... Great. I'm a powerful merger now !&lt;/p&gt;
&lt;h2 id="on-using-tools"&gt;On using tools&lt;/h2&gt;
&lt;p&gt;Because we &lt;em&gt;also&lt;/em&gt; are &lt;em&gt;hackers&lt;/em&gt;, we have shared a bit our ways to code,
the tools we use, etc. Both of us were using vim, and I've discovered
vimdiff and hgtk, which will completely change the way I navigate into
the mercurial history. We aren't "power users", so we have learned from
each other about vim tips. You can find &lt;a href="http://github.com/ametaireau/dotfiles"&gt;my dotfiles on
github&lt;/a&gt;, if it could help.
They're not perfect, and not intended to be, because changing all the
time, as I learn. Don't hesitate to have a look, and to propose
enhancements if you have !&lt;/p&gt;
&lt;h2 id="on-being-pythonic"&gt;On being pythonic&lt;/h2&gt;
&lt;p&gt;My background as an old Java user disserves me so far, as the paradigms
are not the same while coding in python. Hard to find the more pythonic
way to do, and sometimes hard to unlearn my way to think about software
engineering. Well, it seems that the only solution is to read code, and
to re-read import this from times to times ! &lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html"&gt;Coding like a
pythonista&lt;/a&gt;
seems to be a must-read, so, I know what to do.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It was really great. Next time, we'll need to focus a bit more on
distutils2, and to have a bullet list of things to do, but days like
this one are opportunities to catch ! We'll probably do another sprint
in a few weeks, stay tuned !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Introducing the distutils2 index crawlers</title><link href="https://blog.notmyidea.org/introducing-the-distutils2-index-crawlers.html" rel="alternate"></link><published>2010-07-06T00:00:00+02:00</published><updated>2010-07-06T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-07-06:/introducing-the-distutils2-index-crawlers.html</id><summary type="html">
&lt;p&gt;I'm working for about a month for distutils2, even if I was being a bit
busy (as I had some class courses and exams to work on)&lt;/p&gt;
&lt;p&gt;I'll try do sum-up my general feelings here, and the work I've made so
far. You can also find, if you're interested, my …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;I'm working for about a month for distutils2, even if I was being a bit
busy (as I had some class courses and exams to work on)&lt;/p&gt;
&lt;p&gt;I'll try do sum-up my general feelings here, and the work I've made so
far. You can also find, if you're interested, my weekly summaries in &lt;a href="http://wiki.notmyidea.org/distutils2_schedule"&gt;a
dedicated wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="general-feelings"&gt;General feelings&lt;/h2&gt;
&lt;p&gt;First, and it's a really important point, the GSoC is going very well,
for me as for other students, at least from my perspective. It's a
pleasure to work with such enthusiast people, as this make the global
atmosphere very pleasant to live.&lt;/p&gt;
&lt;p&gt;First of all, I've spent time to read the existing codebase, and to
understand what we're going to do, and what's the rationale to do so.&lt;/p&gt;
&lt;p&gt;It's really clear for me now: what we're building is the foundations of
a packaging infrastructure in python. The fact is that many projects
co-exists, and comes all with their good concepts. Distutils2 tries to
take the interesting parts of all, and to provide it in the python
standard libs, respecting the recently written PEP about packaging.&lt;/p&gt;
&lt;p&gt;With distutils2, it will be simpler to make "things" compatible. So if
you think about a new way to deal with distributions and packaging in
python, you can use the Distutils2 APIs to do so.&lt;/p&gt;
&lt;h2 id="tasks"&gt;Tasks&lt;/h2&gt;
&lt;p&gt;My main task while working on distutils2 is to provide an installation
and an un-installation command, as described in PEP 376. For this, I
first need to get informations about the existing distributions (what's
their version, name, metadata, dependencies, etc.)&lt;/p&gt;
&lt;p&gt;The main index, you probably know and use, is PyPI. You can access it at
&lt;a href="http://pypi.python.org"&gt;http://pypi.python.org&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="pypi-index-crawling"&gt;PyPI index crawling&lt;/h2&gt;
&lt;p&gt;There is two ways to get these informations from PyPI: using the simple
API, or via xml-rpc calls.&lt;/p&gt;
&lt;p&gt;A goal was to use the version specifiers defined
in&lt;a href="http://www.python.org/dev/peps/pep-0345/"&gt;PEP 345&lt;/a&gt; and to provides a
way to sort the grabbed distributions depending our needs, to pick the
version we want/need.&lt;/p&gt;
&lt;h3 id="using-the-simple-api"&gt;Using the simple API&lt;/h3&gt;
&lt;p&gt;The simple API is composed of HTML pages you can access at
&lt;a href="http://pypi.python.org/simple/"&gt;http://pypi.python.org/simple/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Distribute and Setuptools already provides a crawler for that, but it
deals with their internal mechanisms, and I found that the code was not
so clear as I want, that's why I've preferred to pick up the good ideas,
and some implementation details, plus re-thinking the global
architecture.&lt;/p&gt;
&lt;p&gt;The rules are simple: each project have a dedicated page, which allows
us to get informations about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the distribution download locations (for some versions)&lt;/li&gt;
&lt;li&gt;homepage links&lt;/li&gt;
&lt;li&gt;some other useful informations, as the bugtracker address, for
instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to find all the distributions of the "EggsAndSpam" project,
you could do the following (do not take so attention to the names here,
as the API will probably change a bit):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SimpleIndex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EggsAndSpam&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EggsAndSpam&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EggsAndSpam&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EggsAndSpam&lt;/span&gt; &lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We also could use version specifiers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EggsAndSpam (&amp;lt; =1.2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EggsAndSpam&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EggsAndSpam&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Internally, what's done here is the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it process the &lt;a href="http://pypi.python.org/simple/FooBar/"&gt;http://pypi.python.org/simple/FooBar/&lt;/a&gt; page,
searching for download URLs.&lt;/li&gt;
&lt;li&gt;for each found distribution download URL, it creates an object,
containing informations about the project name, the version and the
URL where the archive remains.&lt;/li&gt;
&lt;li&gt;it sort the found distributions, using version numbers. The default
behavior here is to prefer source distributions (over binary ones),
and to rely on the last "final" distribution (rather than beta,
alpha etc. ones)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, nothing hard or difficult here.&lt;/p&gt;
&lt;p&gt;We provides a bunch of other features, like relying on the new PyPI
mirroring infrastructure or filter the found distributions by some
criterias. If you're curious, please browse the &lt;a href="http://distutils2.notmyidea.org/"&gt;distutils2
documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="using-xml-rpc"&gt;Using xml-rpc&lt;/h3&gt;
&lt;p&gt;We also can make some xmlrpc calls to retreive informations from PyPI.
It's a really more reliable way to get informations from from the index
(as it's just the index that provides the informations), but cost
processes on the PyPI distant server.&lt;/p&gt;
&lt;p&gt;For now, this way of querying the xmlrpc client is not available on
Distutils2, as I'm working on it. The main pieces are already present
(I'll reuse some work I've made from the SimpleIndex querying, and &lt;a href="http://github.com/ametaireau/pypiclient"&gt;some
code already set up&lt;/a&gt;), what I
need to do is to provide a xml-rpc PyPI mock server, and that's on what
I'm actually working on.&lt;/p&gt;
&lt;h2 id="processes"&gt;Processes&lt;/h2&gt;
&lt;p&gt;For now, I'm trying to follow the "documentation, then test, then code"
path, and that seems to be really needed while working with a community.
Code is hard to read/understand, compared to documentation, and it's
easier to change.&lt;/p&gt;
&lt;p&gt;While writing the simple index crawling work, I must have done this to
avoid some changes on the API, and some loss of time.&lt;/p&gt;
&lt;p&gt;Also, I've set up &lt;a href="http://wiki.notmyidea.org/distutils2_schedule"&gt;a
schedule&lt;/a&gt;, and the goal
is to be sure everything will be ready in time, for the end of the
summer. (And now, I need to learn to follow schedules ...)&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Use Restructured Text (ReST) to power your presentations</title><link href="https://blog.notmyidea.org/use-restructured-text-rest-to-power-your-presentations.html" rel="alternate"></link><published>2010-06-25T00:00:00+02:00</published><updated>2010-06-25T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html</id><summary type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-06-25&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wednesday, we give a presentation, with some friends, about the CouchDB
Database, to &lt;a href="http://www.toulibre.org"&gt;the Toulouse local LUG&lt;/a&gt;. Thanks a
lot to all the presents for being there, it was a pleasure to talk about
this topic with you. Too bad the season is over now an …&lt;/p&gt;</summary><content type="html">
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;date&lt;br&gt;
2010-06-25&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;category&lt;br&gt;
tech&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wednesday, we give a presentation, with some friends, about the CouchDB
Database, to &lt;a href="http://www.toulibre.org"&gt;the Toulouse local LUG&lt;/a&gt;. Thanks a
lot to all the presents for being there, it was a pleasure to talk about
this topic with you. Too bad the season is over now an I quit Toulouse
next year.&lt;/p&gt;
&lt;p&gt;During our brainstorming about the topic, we used some paper, and we
wanted to make a presentation the simpler way. First thing that come to
my mind was using &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;restructured
text&lt;/a&gt;, so I've wrote a simple
file containing our different bullet points. In fact, there is quite
nothing to do then, to have a working presentation.&lt;/p&gt;
&lt;p&gt;So far, I've used &lt;a href="http://code.google.com/p/rst2pdf/"&gt;the rst2pdf
program&lt;/a&gt;, and a simple template, to
generate output. It's probably simple to have similar results using
latex + beamer, I'll try this next time, but as I'm not familiar with
latex syntax, restructured text was a great option.&lt;/p&gt;
&lt;p&gt;Here are &lt;a href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.pdf"&gt;the final PDF
output&lt;/a&gt;,
&lt;a href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.rst"&gt;Rhe ReST
source&lt;/a&gt;,
&lt;a href="http://files.lolnet.org/alexis/rst-presentations/slides.style"&gt;the theme
used&lt;/a&gt;,
and the command line to generate the PDF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rst2pdf couchdb.rst -b1 -s ../slides.style&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Technologie"></category></entry><entry><title>first week working on distutils2</title><link href="https://blog.notmyidea.org/first-week-working-on-distutils2.html" rel="alternate"></link><published>2010-06-04T00:00:00+02:00</published><updated>2010-06-04T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-06-04:/first-week-working-on-distutils2.html</id><summary type="html">
&lt;p&gt;As I've been working on &lt;a href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt;
during the past week, taking part of the
&lt;a href="http://code.google.com/intl/fr/soc/"&gt;GSOC&lt;/a&gt; program, here is a short
summary of what I've done so far.&lt;/p&gt;
&lt;p&gt;As my courses are not over yet, I've not worked as much as I wanted, and
this will continues until the end of …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;As I've been working on &lt;a href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt;
during the past week, taking part of the
&lt;a href="http://code.google.com/intl/fr/soc/"&gt;GSOC&lt;/a&gt; program, here is a short
summary of what I've done so far.&lt;/p&gt;
&lt;p&gt;As my courses are not over yet, I've not worked as much as I wanted, and
this will continues until the end of June. My main tasks are about
making installation and uninstallation commands, to have a simple way to
install distributions via
&lt;a href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To do this, we need to rely on informations provided by the Python
Package Index (&lt;a href="http://pypi.python.org/"&gt;PyPI&lt;/a&gt;), and there is at least
two ways to retreive informations from here: XML-RPC and the "simple"
API.&lt;/p&gt;
&lt;p&gt;So, I've been working on porting some
&lt;a href="http://bitbucket.org/tarek/distribute/"&gt;Distribute&lt;/a&gt; related stuff to
&lt;a href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt;, cutting off all non
distutils' things, as we do not want to depend from Distribute's
internals. My main work has been about reading the whole code, writing
tests about this and making those tests possible.&lt;/p&gt;
&lt;p&gt;In fact, there was a need of a pypi mocked server, and, after reading
and introducing myself to the distutils behaviors and code, I've taken
some time to improve the work &lt;a href="http://bitbucket.org/konrad"&gt;Konrad&lt;/a&gt;
makes about this mock.&lt;/p&gt;
&lt;h2 id="a-pypi-server-mock"&gt;A PyPI Server mock&lt;/h2&gt;
&lt;p&gt;The mock is embeded in a thread, to make it available during the tests,
in a non blocking way. We first used &lt;a href="http://wsgi.org"&gt;WSGI&lt;/a&gt; and
&lt;a href="http://docs.python.org/library/wsgiref.html"&gt;wsgiref&lt;/a&gt; in order control
what to serve, and to log the requests made to the server, but finally
realised that &lt;a href="http://docs.python.org/library/wsgiref.html"&gt;wsgiref&lt;/a&gt; is
not python 2.4 compatible (and we &lt;em&gt;need&lt;/em&gt; to be python 2.4 compatible in
Distutils2).&lt;/p&gt;
&lt;p&gt;So, we switched to
&lt;a href="http://docs.python.org/library/basehttpserver.html"&gt;BaseHTTPServer&lt;/a&gt; and
&lt;a href="http://docs.python.org/library/simplehttpserver.html"&gt;SimpleHTTPServer&lt;/a&gt;,
and updated our tests accordingly. It's been an opportunity to realize
that &lt;a href="http://wsgi.org"&gt;WSGI&lt;/a&gt; has been a great step forward for making
HTTP servers, and expose a really simplest way to discuss with HTTP !&lt;/p&gt;
&lt;p&gt;You can find &lt;a href="http://bitbucket.org/ametaireau/distutils2/changesets"&gt;the modifications I
made&lt;/a&gt;, and the
&lt;a href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst"&gt;related
docs&lt;/a&gt;
about this on &lt;a href="http://bitbucket.org/ametaireau/distutils2/"&gt;my bitbucket distutils2
clone&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-pypi-simple-api"&gt;The PyPI Simple API&lt;/h2&gt;
&lt;p&gt;So, back to the main problematic: make a python library to access and
request information stored on PyPI, via the simple API. As I said, I've
just grabbed the work made from
&lt;a href="http://bitbucket.org/tarek/distribute/"&gt;Distribute&lt;/a&gt;, and played a bit
with, in order to view what are the different use cases, and started to
write the related tests.&lt;/p&gt;
&lt;h2 id="the-work-to-come"&gt;The work to come&lt;/h2&gt;
&lt;p&gt;So, once all use cases covered with tests, I'll rewrite a bit the
grabbed code, and do some software design work (to not expose all things
as privates methods, have a clear API, and other things like this), then
update the tests accordingly and write a documentation to make this
clear.&lt;/p&gt;
&lt;p&gt;Next step is to a little client, as I've &lt;a href="http://github.com/ametaireau/pypiclient"&gt;already started
here&lt;/a&gt; I'll take you updated !&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>A Distutils2 GSoC</title><link href="https://blog.notmyidea.org/a-distutils2-gsoc.html" rel="alternate"></link><published>2010-05-01T00:00:00+02:00</published><updated>2010-05-01T00:00:00+02:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-05-01:/a-distutils2-gsoc.html</id><summary type="html">
&lt;p&gt;WOW. I've been accepted to be a part of the &lt;a href="http://code.google.com/intl/fr/soc/"&gt;Google Summer Of
Code&lt;/a&gt; program, and will work on
&lt;a href="http://python.org/"&gt;python&lt;/a&gt; &lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;, with &lt;a href="http://pygsoc.wordpress.com/"&gt;a&lt;/a&gt; &lt;a href="http://konryd.blogspot.com/"&gt;lot&lt;/a&gt; &lt;a href="http://ziade.org/"&gt;of&lt;/a&gt; (intersting !) &lt;a href="http://zubin71.wordpress.com/"&gt;people&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, it's about building the successor of Distutils2, ie. "the python
package manager". Today, there is too many ways to package a python …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">
&lt;p&gt;WOW. I've been accepted to be a part of the &lt;a href="http://code.google.com/intl/fr/soc/"&gt;Google Summer Of
Code&lt;/a&gt; program, and will work on
&lt;a href="http://python.org/"&gt;python&lt;/a&gt; &lt;a href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;, with &lt;a href="http://pygsoc.wordpress.com/"&gt;a&lt;/a&gt; &lt;a href="http://konryd.blogspot.com/"&gt;lot&lt;/a&gt; &lt;a href="http://ziade.org/"&gt;of&lt;/a&gt; (intersting !) &lt;a href="http://zubin71.wordpress.com/"&gt;people&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, it's about building the successor of Distutils2, ie. "the python
package manager". Today, there is too many ways to package a python
application (pip, setuptools, distribute, distutils, etc.) so there is
a huge effort to make in order to make all this packaging stuff
interoperable, as pointed out by
the &lt;a href="http://www.python.org/dev/peps/pep-0376/"&gt;PEP 376&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In more details, I'm going to work on the Installer / Uninstaller features of Distutils2, and on a PyPI XML-RPC client for distutils2. Here are the already defined tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement Distutils2 APIs described in PEP 376.&lt;/li&gt;
&lt;li&gt;Add the uninstall command.&lt;/li&gt;
&lt;li&gt;think about a basic installer / uninstaller script. (with deps) --
similar to pip/easy_install&lt;/li&gt;
&lt;li&gt;in a pypi subpackage;&lt;/li&gt;
&lt;li&gt;Integrate a module similar to setuptools' package_index'&lt;/li&gt;
&lt;li&gt;PyPI XML-RPC client for distutils 2:
&lt;a href="http://bugs.python.org/issue8190"&gt;http://bugs.python.org/issue8190&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I'm relatively new to python, I'll need some extra work in order to apply all good practice, among other things that can make a developper-life joyful. I'll post here, each week, my advancement, and my tought about python and especialy python packaging world.&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>Le temps des grâces, courrez-y !</title><link href="https://blog.notmyidea.org/le-temps-des-graces-courrez-y.html" rel="alternate"></link><published>2010-03-28T00:00:00+01:00</published><updated>2010-03-28T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y.html</id><summary type="html">
&lt;p&gt;Ouf, notre &lt;a href="http://www.reseaugrappe.org"&gt;semaine de l'environnement&lt;/a&gt;
s'est terminée, après un peu de neige et un brin de soleil quand il en
fallait.&lt;/p&gt;
&lt;p&gt;Ce fut l'occasion de rencontrer beaucoup de gens biens, et de regarder
d'un peu plus près toutes ces problématiques qui mériteraient à elles
seules, chacune un billet. Après un …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Ouf, notre &lt;a href="http://www.reseaugrappe.org"&gt;semaine de l'environnement&lt;/a&gt;
s'est terminée, après un peu de neige et un brin de soleil quand il en
fallait.&lt;/p&gt;
&lt;p&gt;Ce fut l'occasion de rencontrer beaucoup de gens biens, et de regarder
d'un peu plus près toutes ces problématiques qui mériteraient à elles
seules, chacune un billet. Après un répis d'une semaine, pour récupérer
des folies organisatrices (c'est ça qui fait du bien, ceci dit -- les
folies, pas le repos), je me retrouve de nouveau sur ces mêms
réflexions, grâce aux journées organisées par &lt;a href="http://www.fne.asso.fr/"&gt;France Nature
Environnement&lt;/a&gt;, qui proposaient ce jeudi soir
une projection de "Le temps des grâces", un documentaire sur
l'agriculture.&lt;/p&gt;
&lt;p&gt;Parce que depuis 60 ans, il est pratiqué le remembrement des parcelles à
gogo, parce que nos sols deviennent completement morts à cause des
tonnes d'intrants qu'on leur fait absorber, et parce que les
exploitations s'agrandissent sans en finir pour tenter de réagir façe à
un marché financier toujours plus insaisissable, mené de très loin par
la PAC, il fallait un film pour en parler. C'est ce que fait "le temps
des grâçes", avec un bon sens et une facilité à faire passer des
messages, qu'on ne peut qu'applaudir.&lt;/p&gt;
&lt;p&gt;Malheureusement il s'agissait de la dernière diffusion à &lt;a href="http://www.cinemas-utopia.org/toulouse/"&gt;L'Utopia de
Toulouse&lt;/a&gt;... Si vous en avez
l'occasion, sautez dessus et profitez le temps de ces 2 heures, ou vous
pourrez écouter à la fois des discours d'agronomes, d'agriculteurs, de
chercheurs et bien d'autres, qui dressent un constat pas si brillant de
notre agriculture. On n'est pas sorti de l'auberge, enfin, c'est
l'expression.&lt;/p&gt;
&lt;p&gt;Je vous laisse avec le synopsis et une bande annonce.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Une enquête documentaire sur le monde agricole français aujourd'hui à
travers de nombreux récits : agriculteurs, chercheurs, agronomes,
écrivains... Un monde qui parvient à résister aux bouleversements qui
le frappent -économiques, scientifiques, sociaux - et qui, bon gré mal
gré, continue d'entretenir les liens entre générations. Un monde au
centre d'interrogations majeures sur l'avenir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ainsi qu'un commentaire que je ne peux m'empécher de relayer, trouvé sur
allocine.fr (oui, vous savez, ce site rempli de pubs).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le temps des grâces c'est je pense le plus grand film traitant de
l'écologie en tant que documentaire ou en sujet principal, on y
apprend une multitude de choses, on en ressort en colère contre le
système, le film propose différents points de vues, ici on a pas de
voix off moralisatrice à deux balles avec des gros titres bien
surlignés pour que même les beaufs matant TF1 puissent comprendre,
ici même si ça reste accessible au citoyen lambda, le film ne fait pas
de compromis avec le monde agroalimentaire, il ose dénoncer les
filière d'agronomie qui apprennent pas les bonnes choses à leurs
étudiants, aux lobbys de cette agro-industrie qui n'en fait qu'à sa
tête pour amasser de l'argent, cette tendance à tout uniformiser et
détruire… Franchement j'ai trouvé ça génial de bout en bout,
captivant, on explore cette campagne française, on comprend les
dilemmes des paysants. Le film n'étant pas opposé à la modernité, ni
même réactionnaire, il propose juste un constat alarmant du monde
agricole français, tout en proposant des alternatives qui pourraient
être utilisée, si les pouvoirs publics lâchaient un peu la main des
lobbys. Passionnant, vraiment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Courrez-y, je vous dis.&lt;/p&gt;</content><category term="Journal"></category></entry><entry><title>Semaine de lenvironnement: La consommation étudiante</title><link href="https://blog.notmyidea.org/semaine-de-lenvironnement-la-consommation-etudiante.html" rel="alternate"></link><published>2010-02-24T00:00:00+01:00</published><updated>2010-02-24T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante.html</id><summary type="html">
&lt;p&gt;Les acteurs associatifs sont bien souvent moteurs des critiques de nos
sociétés. Je pense à &lt;a href="http://www.framasoft.net/"&gt;Framasoft&lt;/a&gt;, à &lt;a href="http://www.laquadrature.net/"&gt;la
Quadrature du net&lt;/a&gt; ou à &lt;a href="http://www.arsindustrialis.org/"&gt;Ars
Industrialis&lt;/a&gt; (dans le domaine de la
science et de l'informatique), mais aussi &lt;a href="http://www.amisdelaterre.org/"&gt;aux Amis de la
Terre&lt;/a&gt;, à &lt;a href="http://www.attac.org/"&gt;ATTAC&lt;/a&gt;
(dans le domaine de l'environnement entres autres …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Les acteurs associatifs sont bien souvent moteurs des critiques de nos
sociétés. Je pense à &lt;a href="http://www.framasoft.net/"&gt;Framasoft&lt;/a&gt;, à &lt;a href="http://www.laquadrature.net/"&gt;la
Quadrature du net&lt;/a&gt; ou à &lt;a href="http://www.arsindustrialis.org/"&gt;Ars
Industrialis&lt;/a&gt; (dans le domaine de la
science et de l'informatique), mais aussi &lt;a href="http://www.amisdelaterre.org/"&gt;aux Amis de la
Terre&lt;/a&gt;, à &lt;a href="http://www.attac.org/"&gt;ATTAC&lt;/a&gt;
(dans le domaine de l'environnement entres autres), et a tout un tas
d'autres associations que je ne peux pas citer ici exhaustivement... Ce
sont eux qui sont porteurs de messages alternatifs, et qui sont les
initiateurs de débats publics, qui permettent de faire avancer des
thématiques aussi importantes que le logiciel libre ou la protection de
l'environnement.&lt;/p&gt;
&lt;p&gt;Dans cette optique, depuis près de 3 ans (déjà !), au sein du &lt;a href="http://www.reseaugrappe.org"&gt;réseau
GRAPPE&lt;/a&gt;, on &lt;em&gt;essaye&lt;/em&gt; d'aborder des
thématiques qui touchent de près ou de loin à l'environnement, parce
que c'est un sujet qui nous importe et nous passionne. L'année dernière,
c'était l'alimentation étudiante, ce qui à abouti à la publication de
&lt;a href="http://public.reseaugrappe.org/alimentation.pdf"&gt;la revue "les étudiants se mettent à
table"&lt;/a&gt;. Cette année
c'est la consommation étudiante qui est au programme.&lt;/p&gt;
&lt;h2 id="la-consommation-etudiante"&gt;La consommation étudiante ?&lt;/h2&gt;
&lt;p&gt;L'idée principale de cette étude est de tenter de faire une analyse de
la "société de consommation", souvent questionnée par les étudiants et
par d'autres, et de jeter un œil sur le rapport des étudiants à cette
société: Quoi et comment consomment-ils ? Les universités et les écoles
ne poussent-elles pas dune certaine manière les étudiants à la
consommation ? Quelles sont les alternatives face aux dérives de
surconsommation ?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Analyse des pratiques, réflexions et mobilisations des étudiants en
termes de consommation seront réalisés pour comprendre leur modes de
vie, mais aussi leurs attentes, leurs propositions sur cette
thématique&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="la-semaine-de-lenvironnement"&gt;La semaine de l'environnement !&lt;/h2&gt;
&lt;p&gt;A travers l'ensemble des villes du réseau, des projections de films et
des débats auront donc lieu sur ce thème, lors de la semaine de
l'environnement 2010, qui se déroulera d'ailleurs durant le mois de Mars
&lt;a href="http://www.reseaugrappe.org/la-semaine-de-lenvironnement-programme/"&gt;partout en
france&lt;/a&gt;,
et &lt;strong&gt;du 6 au 14 Mars sur Toulouse&lt;/strong&gt;. &lt;a href="http://docs.notmyidea.org/sde/prog-toulouse.pdf"&gt;Jetez un oeil au
programme&lt;/a&gt; ! Avec pour
objectif de sonder un peu le ressenti des étudiants en terme de
consommation, nous avons mis en place &lt;a href="http://spreadsheets.google.com/viewform?formkey=dHV2bVllS2lWbzhyV3NBN3NUbi1TM2c6MA"&gt;un questionnaire en
ligne&lt;/a&gt;,
que vous pouvez compléter en une petite 10aine de minutes, n'hésitez pas
! &lt;a href="http://www.reseaugrappe.org/consommation/"&gt;La page sur la consommation étudiante sur le site du
GRAPPE&lt;/a&gt;&lt;/p&gt;</content><category term="Réfléxions"></category></entry><entry><title>Python ? go !</title><link href="https://blog.notmyidea.org/python-go.html" rel="alternate"></link><published>2009-12-17T00:00:00+01:00</published><updated>2009-12-17T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2009-12-17:/python-go.html</id><summary type="html">
&lt;p&gt;Cela fait maintenant un peu plus d'un mois que je travaille sur un
projet en &lt;a href="http://www.djangoproject.org"&gt;django&lt;/a&gt;, et que,
nécessairement, je me forme à &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;. Je prends
un plaisir non dissimulé à découvrir ce langage (et à l'utiliser), qui
ne cesse de me surprendre. Les premiers mots qui me viennent à …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Cela fait maintenant un peu plus d'un mois que je travaille sur un
projet en &lt;a href="http://www.djangoproject.org"&gt;django&lt;/a&gt;, et que,
nécessairement, je me forme à &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;. Je prends
un plaisir non dissimulé à découvrir ce langage (et à l'utiliser), qui
ne cesse de me surprendre. Les premiers mots qui me viennent à l'esprit
à propos de Python, sont "logique" et "simple". Et pourtant puissant
pour autant. Je ne manque d'ailleurs pas une occasion pour faire un peu
d'&lt;em&gt;évangélisation&lt;/em&gt; auprès des quelques personnes qui veulent bien
m'écouter.&lt;/p&gt;
&lt;h2 id="the-zen-of-python"&gt;The Zen of Python&lt;/h2&gt;
&lt;p&gt;Avant toute autre chose, je pense utile de citer Tim Peters, et &lt;a href="http://www.python.org/dev/peps/pep-0020/"&gt;le
PEP20&lt;/a&gt;, qui constituent une
très bonne introduction au langage, qui prends la forme d'un &lt;em&gt;easter
egg&lt;/em&gt; présent dans python&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren&lt;span class="s1"&gt;&amp;#39;t special enough to break the rules.&lt;/span&gt;
&lt;span class="s1"&gt;Although practicality beats purity.&lt;/span&gt;
&lt;span class="s1"&gt;Errors should never pass silently.&lt;/span&gt;
&lt;span class="s1"&gt;Unless explicitly silenced.&lt;/span&gt;
&lt;span class="s1"&gt;In the face of ambiguity, refuse the temptation to guess.&lt;/span&gt;
&lt;span class="s1"&gt;There should be one-- and preferably only one --obvious way to do it.&lt;/span&gt;
&lt;span class="s1"&gt;Although that way may not be obvious at first unless you&amp;#39;&lt;/span&gt;re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it&lt;span class="s1"&gt;&amp;#39;s a bad idea.&lt;/span&gt;
&lt;span class="s1"&gt;If the implementation is easy to explain, it may be a good idea.&lt;/span&gt;
&lt;span class="s1"&gt;Namespaces are one honking great idea -- let&amp;#39;&lt;/span&gt;s &lt;span class="k"&gt;do&lt;/span&gt; more of those!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ai la vague impression que c'est ce que j'ai toujours cherché à faire
en PHP, et particulièrement dans &lt;a href="http://www.spiral-project.org"&gt;le framework
Spiral&lt;/a&gt;, mais en ajoutant ces concepts
dans une sur-couche au langage. Ici, c'est directement de &lt;em&gt;l'esprit&lt;/em&gt; de
python qu'il s'agit, ce qui signifie que la plupart des bibliothèques
python suivent ces concepts. Elle est pas belle la vie ?&lt;/p&gt;
&lt;h2 id="comment-commencer-et-par-ou"&gt;Comment commencer, et par ou ?&lt;/h2&gt;
&lt;p&gt;Pour ma part, j'ai commencé par la lecture de quelques livres et
articles intéressants, qui constituent une bonne entrée en matière sur
le sujet (La liste n'est bien évidemment pas exhaustive et vos
commentaires sont les bienvenus) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://diveintopython.adrahon.org/"&gt;Dive into python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.swaroopch.com/notes/Python_fr:Table_des_Matières"&gt;A byte of
python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.fr/Python-Petit-guide-lusage-développeur/dp/2100508830"&gt;Python: petit guide à l'usage du développeur
agile&lt;/a&gt;
de &lt;a href="http://tarekziade.wordpress.com/"&gt;Tarek Ziadé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.python.org/index.html"&gt;La documentation officielle
python&lt;/a&gt;, bien sûr !&lt;/li&gt;
&lt;li&gt;&lt;a href="http://video.pycon.fr/videos/pycon-fr-2009/"&gt;Les vidéos du
pyconfr 2009&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Un peu de temps, et une console python ouverte :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'essaye par ailleurs de partager au maximum les ressources que je
trouve de temps à autres, que ce soit &lt;a href="http://www.twitter.com/ametaireau"&gt;via
twitter&lt;/a&gt; ou &lt;a href="http://delicious.com/ametaireau"&gt;via mon compte
delicious&lt;/a&gt;. Allez jeter un œil &lt;a href="http://delicious.com/ametaireau/python"&gt;au tag
python&lt;/a&gt; sur mon profil, peut
être que vous trouverez des choses intéressantes, qui sait!&lt;/p&gt;
&lt;h2 id="un-python-sexy"&gt;Un python sexy&lt;/h2&gt;
&lt;p&gt;Quelques fonctionnalités qui devraient vous mettre l'eau à la bouche:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.python.org/library/stdtypes.html#comparisons"&gt;Le chaînage des opérateurs de
comparaison&lt;/a&gt;
est possible (a\&amp;lt;b \&amp;lt;c dans une condition)&lt;/li&gt;
&lt;li&gt;Assignation de valeurs multiples (il est possible de faire a,b,c =
1,2,3 par exemple)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.python.org/tutorial/datastructures.html"&gt;Les listes&lt;/a&gt;
sont simples à manipuler !&lt;/li&gt;
&lt;li&gt;Les &lt;a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions"&gt;list
comprehension&lt;/a&gt;,
ou comment faire des opérations complexes sur les listes, de manière
simple.&lt;/li&gt;
&lt;li&gt;Les
&lt;a href="http://docs.python.org/library/doctest.html?highlight=doctest"&gt;doctests&lt;/a&gt;:
ou comment faire des tests directement dans la documentation de vos
classes, tout en la documentant avec de vrais exemples.&lt;/li&gt;
&lt;li&gt;Les
&lt;a href="http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt"&gt;métaclasses&lt;/a&gt;,
ou comment contrôler la manière dont les classes se construisent&lt;/li&gt;
&lt;li&gt;Python est &lt;a href="http://wiki.python.org/moin/Why%20is%20Python%20a%20dynamic%20language%20and%20also%20a%20strongly%20typed%20language"&gt;un langage à typage fort
dynamique&lt;/a&gt;:
c'est ce qui m'agaçait avec PHP qui est un langage à typage faible
dynamique.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cous pouvez également aller regarder &lt;a href="http://video.pycon.fr/videos/free/53/"&gt;l'atelier donné par Victor Stinner
durant le Pyconfr 09&lt;/a&gt;. Have fun
!&lt;/p&gt;</content><category term="Technologie"></category></entry><entry><title>AMAP + Média = Paniers bio à 5e ?!</title><link href="https://blog.notmyidea.org/amap-media-paniers-bio-a-5e.html" rel="alternate"></link><published>2009-11-11T00:00:00+01:00</published><updated>2009-11-11T00:00:00+01:00</updated><author><name></name></author><id>tag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e.html</id><summary type="html">
&lt;p&gt;Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien
trop souvent. La dernière &lt;em&gt;mes-utilisation&lt;/em&gt; que j'ai à décrier est celle
d'un reportage télé, passé sur France 2 vendredi 23 Octobre (&lt;a href="http://docs.notmyidea.org/amap/amap-fr2.avi"&gt;voir la
vidéo&lt;/a&gt;), ou on parles de
&lt;a href="http://amap.zest.free.fr"&gt;l'AMAP étudiante Zest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Malgré tout le temps passé à …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;Le raccourci me semble un peu rapide. Et pourtant, il est emprunté bien
trop souvent. La dernière &lt;em&gt;mes-utilisation&lt;/em&gt; que j'ai à décrier est celle
d'un reportage télé, passé sur France 2 vendredi 23 Octobre (&lt;a href="http://docs.notmyidea.org/amap/amap-fr2.avi"&gt;voir la
vidéo&lt;/a&gt;), ou on parles de
&lt;a href="http://amap.zest.free.fr"&gt;l'AMAP étudiante Zest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Malgré tout le temps passé à expliquer que justement, l'AMAP c'est avant
tout, pour nous, une notion de solidarité envers les agriculteurs,
malgré le fait que le message soit plus profond que simplement aller
acheter du bio (ça, c'est possible aussi en supermarché), malgré le fait
qu'il s'agisse en fait d'une remise en cause plus profonde de la
société, les journalistes n'ont choisi de prendre que les quelques
secondes qui leurs convenaient, celles qui ne faisaient pas tache, celle
ou je dis que "l'AMAP permet aux étudiants de réapprendre à cuisiner,
plutôt que de manger des nouilles et de se faire des plats réchauffés".
Bien sur, je l'ai dit et je le pense d'ailleurs, là n'est pas le
problème, mais mon message n'était pas celui là.&lt;/p&gt;
&lt;p&gt;Jamais, dans les quelques minutes du reportage, on ne dit ce que AMAP
signifie: Association de &lt;strong&gt;Maintien&lt;/strong&gt; d'une Agriculture &lt;strong&gt;Paysanne&lt;/strong&gt;. On
ne parles même pas des agriculteurs ! C'est simplement plus facile pour
les étudiants de venir récupérer leurs paniers, puisque les points de
distribution sont sur les facs, et en plus ça ne coute que 5 euros !
...&lt;/p&gt;
&lt;p&gt;Alors je crois bon de rappeler que L'AMAP n'est pas seulement un
service, c'est un engagement. Sur 5 mois, un engagement solidaire, c'est
la donnée principale de l'équation, celle sans quoi ça ne peut
fonctionner. Par le biais de cette AMAP, on essaye de montrer que
d'autres agricultures sont possibles, que la solidarité c'est bien réel,
et qu'il est possible de sortir du &lt;em&gt;tout, tout de suite&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Mais bon, apparemment, ça passe pas bien à la télé.&lt;/p&gt;</content><category term="Réfléxions"></category></entry></feed>