[j-mad] Django 1.7 et écriture de tests, petites explorations
[Biologeek] Moments sportifs
Ce moment où le cœur ralentit et où chaque cellule réclame sa ration de sucre, de magnésium, de calcium et d’acides aminés. L’organisme se rappelle qu’il lui faut vivre et non plus survivre.
Ce moment où le corps refroidit et où chaque douleur refait surface. La douche brûlante pour essayer de retarder ce nouvel état. Les étirements et les massages pour soulager les muscles, les exercices posturaux pour supporter le reste.
Ce moment où le cerveau s’engourdit et où les images défilent. Passées et à venir, fantasmées et avec désir. Avant de se laisser choir dans les bras de Morphée.
Le temps de la récupération.
[logilab] PyconFR 2014 : jour 1, BDD, postgresql et asyncio
J'ai eu le plaisir de participer à la conférence PyconFR 2014, voici quelques notes sur les présentations auxquelles j'ai pu assister. Étant donné la longueur, je vais publier sous forme de plusieurs billets de blog.
BDD avec Behave
Le Behaviour Driven Develpment en Python peut se faire avec behave. Dans un premier temps on décrit en language "naturel" le test. Dans un deuxième temps on implémente les tests unitaires pour faire le lien avec la description behave, et on met les chaines de caractères dans un decorateur @given, puis @when puis @then.
Les scenarios behave sont utiles pour le dévelopement, pour la documentation, pour la formation des nouveaux arrivants et même pour faciliter la supervision des applications en production.
Les diapos de la présentation sont disponible sur slideshare.
Python + PostgreSQL
Stéphane Wirtle nous a présenté comment les relations étroites entre le monde de Python et celui de PostgreSQL.
Points à noter :
- FDW : Foreign Data Wrapper, dont voici une liste sur le wiki de PostgreSQL
- PL (Procedure Language) : PL/C, PL/Python, PL/v8, etc. pour étendre sa base de donnée. Les procedure language SQL sont par défault "trusted", les autres ne sont pas trusted par défaut. Dans CubicWeb, nous utilisons PL/Python pour la recherche plein texte et la lemmatisation du texte.
Pour ceux qui souhaiteraient essayer un ORM, Stéphane Wirtle conseille Peewee ORM.
Pour les migrations de schema SQLalchemy, Stéphane Wirtle nous conseille Alembic.
Parfois un ORM peut générer beaucoup de requêtes SQL et il y a de la place pour une optimisation en tapant directement du SQL. Pour évaluer la surcharge dûe à l'ORM, on peut utiliser pgBadger.
Support de présentation : https://speakerdeck.com/matrixise/python-and-postgresql-a-wonderful-wedding/
Un serveur fiable avec python 3.4
Après une petite introduction aux principes de concurrence, Martin Richard nous a présenté un retour d'expérience sur l'utilisation du module asyncio introduit dans python 3.4. Il permet de ne plus avoir à utiliser twisted ou gevent.
Les ressources et bibliothèques qui utilisent asyncio sont recensées sur http://asyncio.org/
objgraph permet de d'analyser des structures de données Python pour identifier des fuites memoire.
memoryview introduit dans python3.4 permet de faire "référence" à une structure de données sans la copier, ce qui peut être très pratique mais rend complexe la gestion de code.
Martin a utilisé @lru_cache pour mettre en cache les resultats d'un calcul en utilisant la politique de cache "Least Recently Used (LRU)".
Support de présentation : http://marti.us/t/pyconfr-2014/
Prochain épisode
Prochain épisode : 1ère journée pyconfr, frameworks web et gestion de source.
[Biologeek] Flux et données
Probablement une des choses qui change le plus quand on passe d’une architecture dite d’ « entreprise » à l’architecture d’un pure player du web, c’est l’orientation nette vers une logique de flux.
Un architecte d’entreprise vous présentera son architecture en commençant par les grands blocs applicatifs puis continuera par le système d’échange et d’intégration des données entre les différents systèmes applicatifs.
A l’inverse, l’architecte d’un pure player présentera son architecture dans la perspective d’un flux : de la collecte des données à leur mode de persistance en passant par les divers traitements. On a tout de suite le sentiment d’avoir l’orchestration temporelle d’une suite d’événements.
Dans un cas on met l’accès sur les données comme ressources applicatives, dans l’autre on met l’accent sur le flux des données. Là où la première conception est plutôt spatiale et statique, la deuxième est plutôt temporelle et dynamique.
Je vous invite à aller lire le billet complet de Christian et le premier commentaire de Gautier. Il y est question de dualité entre des données stockées dans des bases distribuées et un système de log globalisé. Là où ça devient intéressant, c’est lorsque l’on rapproche ces réflexions de ce qu’a fait Facebook avec Flux :
Flux is the application architecture that Facebook uses for building client-side web applications. It complements React’s composable view components by utilizing a unidirectional data flow. It’s more of a pattern rather than a formal framework, and you can start using Flux immediately without a lot of new code.
Il n’y a plus d’opposition entre statique et dynamique mais une unidirectionnalité du flux de dynamisation du statique. (Ça c’est pour Damien :p.) La problématique ne se pose plus en termes de stockage et de transfert mais en terme d’évolutivité des données. Ainsi on s’abstrait de la nécessité d’un log global en ayant des flux indépendants et isolés, le stockage peut être distribué c’est le dispatcher qui va s’assurer de la cohérence de la modification des données. On se retrouve avec une approche hybride qui est à la fois spatiale et temporelle. L’intégration et le croisement des données est — si l’on fait abstraction des problèmes de performances — plus politique que technique (cf. OpenData et citoyenneté ou OpenData et évaluation), il ne faut pas concentrer les données dans un même log mais réunir les acteurs dans une même pièce ;-).
Je suis extrêmement surpris que les vieux concepts réutilisés dans Flux n’aient pas donné lieux à une prolifération de nouveaux frameworks web. Je suis presque sûr que l’on peut combiner cette approche à asyncio…
[logilab] PyconFR 2014 : jour 1, frameworks web et gestion de source
Suite de pyconfr 2014 jour 1 épisode 1.
Performance des frameworks web : Python vs the world
Ronan Amicel nous a présenté le travail de benchmark publié par TechEmpower. Ces tests et résultats sont forcement faux et biaisés, mais le code source des tests est publié en libre et il est donc possible d'apporter des corrections via le projet sur github
Pour l'instant, Python3 serait plus lent que Python2, mais on peut espérer que Python3 rattrape son retard, puisqu'il est toujours développé. La comparaison avec pypy est surprenante, celui-ci est bien plus lent, l'hypothèse étant qu'il est ralenti lorsqu'il parle au driver mysql. En revanche, pour le test pypy + tornado, les performances peuvent être meilleures que nodejs car tornado est écrit en pur python il peut être optimisé par pypy.
Dans le comparatif entre python et php, un acteur surprenant est phalcon qui a pris le parti de tout coder en C (plutôt qu'une partie seulement comme on peut le trouver dans nombre de projets python).
Support de présentation : https://speakerdeck.com/ronnix/performance-des-frameworks-web-python-vs-the-world-v1-dot-1
CubicWeb - Vos données ont du sens
Nous attendions avec impatience cette présentation, et Christophe de Vienne a très bien présenté CubicWeb, le framework web dont Logilab est à l'origine.
Après une courte introduction aux concepts du web sémantique (les URIS, les relations, le Linked Data), il a appuyé sur la nécéssité de donner du sens aux données que l'on stoque dans nos applications. Il a expliqué la finesse des réglages dans le moteur de permissions de CubicWeb.
Il a expliqué certaines fonctionnalités intéressantes selon lui dans Cubicweb :
- les hooks: équivalent des procédures stockées déclenchées par des triggers, ils sont écrits en Python et permettent de modifier des données en cascades, implémenter des règle de gestion ou générer des notifications.
- les adaptateurs : permettent de maximiser la réutilisation de code en adaptant une entité à une nouvelle interface
Selon Christophe, CubicWeb permet de développer une "base de donnée métier" strictement structurée, mais restant souple. Il a expliqué que l'interface par défaut n'est pas très sexy, mais qu'elle est néanmoins fonctionnelle comme backend d'édition.
Une petite introduction aux cubes qui sont les "plugins" ou les "extensions" dans le monde CubicWeb, ils contiennent :
- un schéma
- du code métier
- des vues
- des contrôleurs
Pour manipuler les données, CubicWeb utilise RQL, qui a été inventé avant SPARQL (langage de requête du web sémantique) et est plus pragmatique et lisible. Une fonctionnalité notable de RQL : plus besoin d'écrire des jointures SQL !
Finalement Christophe a conclu en présentant le mariage de Pyramid et Cubicweb. Selon lui, en regardant dedans, ils ont des philosophies communes. Le code permettant de développer une application Pyramid sur une base CubicWeb est publié sur la forge de CubicWeb. Christophe a aussi expliqué qu'il pousse des modifications pour que CubicWeb soit plus accessible aux développeurs habitués aux modes de développement "à la python".
Support de présentation : https://dl.dropboxusercontent.com/u/36590471/pyconfr-2014-pres-cubicweb/index.html
La gestion de version, ce problème tellement simple…
Pierre-Yves David (marmoute) nous a concocté un petit panorama des problèmes traités par les gestionnaires de source, avec des anecdotes de problèmes non-triviaux et quelques rappels historiques sur notre "science" informatique (merci les encodages!) Pierre-Yves s'est concentré sur les systèmes de gestion de version de "nouvelle génération", les outils décentralisés (hg, git, bzr). Forcément, étant donné qu'il travaille sur mercurial (et oui, celui écrit en python) il s'est concentré sur celui-là.
Quand il travaillait chez Logilab, Pierre-Yves a notamment rajouté à Mercurial la notion de changeset obsolete et de phase pour faciliter la revue de code et le travail en équipe.
Manipuler son code python avec RedBaron
baron et RedBaron sont des projets assez prometteurs (et assez dingues) de manipulation de code en utilisant du code (plutôt que des éditeurs).
Laurent Peuch est revenu sur les outils historiques du domaine : rope qui a pris la suite de bicycle repair man. Il y a aussi pyfmt par le même auteur, et autopep8 écrit par d'autres.
Un exemple qui m'a parlé : ajouter @profile sur toutes les fonctions d'un script devient faisable en 3 lignes de python, et inversement pour les enlever. À suivre...
Support de présentation : https://psycojoker.github.io/pyconfr-redbaron/presentation.html
Prochain épisode
Prochain épisode: jour 1, bus de communication, packaging et fin
[logilab] PyconFR 2014 : jour 1, bus de communication, packaging et fin
Suite à :
XBUS
Florent Aide nous a présenté son projet XBUS, un bus de communication pour les applications. L'idée est de gérer l'historique : pour faire parler des applications métier entre elles, on les connecte toutes au même bus. Dans certains cas, notamment quand la sécurité des données est en jeux, l'application qui traite le message renvoie un accusé de réception et de traitement (ACK).
Côté technique, il s'agit de :
- un cœur écrit en Go
- zmq pour la communication
- Python pour la logique
Lors des questions un projet similaire a été mentionné : autobahn. Le projet XBUS est libre et publié sur bitbucket.
Comment le packaging m'a simplifié la vie
Étant donné qu'à Logilab, nous avons des avis assez arrêté sur les questions de packaging, je suis allé voir cette conférence.
Xavier Ordoquy nous a présenté en détail virtualenv (pyvenv directement dans python à partir de 3.4) ainsi que l'outil pip.
Historiquement pypi a été instable, mais la situation s'est améliorée depuis qu'il est sur un CDN. Il y a un travail en cours sur la sécurité (vérification d'intégrité, ssl obligatoire etc). devpi permet d'avoir un pypi en interne comme cache, mais aussi comme système de "staging" avant de publier sur le pypi "officiel".
Selon Xavier, la guerre des distutils, python.packaging, distutils2, distribute, etc est finie. Il faut à présent utiliser setuptools et le connaître sur le bouts des doigts. Xavier nous recommande de copier un setup.py pour démarrer nos projets, par exemple celui de sentry.
Côté numéro de version, il faut aller lire la PEP440 Version Identification and Dependency Specification.
extra_requires permet de faire : pip install sentry[postgres] qui installe sentry mais aussi les dépendances pour le faire marcher avec PostgreSQL.
Côté packaging, il va falloir selon Christophe apprendre à utiliser wheel et stevedore (code).
Lors des questions, un membre du public mentionne le projet diecutter (docs, pypi).
Support de présentation : https://speakerdeck.com/xordoquy/packaging-pratique-fr
Autres liens collectés
- Pour travailler sur les docstrings d'un projet python, pyment peut être utile.
- fedmsg est un bus de communication utilisé chez fedora/redhat pour un grand nombre d'applications, il y a probablement de bonnes choses dedans. Il y a un début de travail sur un bus similaire chez debian
Prochain épisode
Prochain épisode: jour 2
[AFPy-Nantes] Retour sur le meetup du 09 avril 2014
Lors de ce premier meetup Python, où plus d'une vingtaine de personnes étaient présentes, Raphaël Braud nous a présenté GrapheekDB, une base de données de graphe libre !
Ce premier rendez-vous était surtout l'occasion de nous rencontrer et de discuter de l'organisation de nos prochaines rassemblements.
À bientôt, et en attendant ... respectez la PEP8 :)
[logilab] Pylint 1.3 / Astroid 1.2 released
The EP14 Pylint sprint team (more on this here and there) is proud to announce they just released Pylint 1.3 together with its companion Astroid 1.2. As usual, this includes several new features as well and bug fixes. You'll find below some structured list of the changes.
Packages are uploaded to pypi, debian/ubuntu packages should be soon provided by Logilab, until they get into the standard packaging system of your favorite distribution.
Please notice Pylint 1.3 will be the last release branch support python 2.5 and 2.6. Starting from 1.4, we will only support python greater or equal to 2.7. This will be the occasion to do some great cleanup in the code base. Notice this is only about the Pylint's runtime, you should still be able to run Pylint on your Python 2.5 code, through using Python 2.7 at least.
New checks
- Add multiple checks for PEP 3101 advanced string formatting: 'bad-format-string', 'missing-format-argument-key', 'unused-format-string-argument', 'format-combined-specification', 'missing-format-attribute' and 'invalid-format-index'
- New 'invalid-slice-index' and 'invalid-sequence-index' for invalid sequence and slice indices
- New 'assigning-non-slot' warning, which detects assignments to attributes not defined in slots
Improved checkers
- Fixed 'fixme' false positive (#149)
- Fixed 'unbalanced-iterable-unpacking' false positive when encountering starred nodes (#273)
- Fixed 'bad-format-character' false positive when encountering the 'a' format on Python 3
- Fixed 'unused-variable' false positive when the variable is assigned through an import (#196)
- Fixed 'unused-variable' false positive when assigning to a nonlocal (#275)
- Fixed 'pointless-string-statement' false positive for attribute docstrings (#193)
- Emit 'undefined-variable' when using the Python 3 metaclass= argument. Also fix 'unused-import' false for that construction (#143)
- Emit 'broad-except' and 'bare-except' even if the number of except handlers is different than 1. Fixes issue (#113)
- Emit 'attribute-defined-outside-init' for all statements in the same module as the offended class, not just for the last assignment (#262, as well as a long standing output mangling problem in some edge cases)
- Emit 'not-callable' when calling properties (#268)
- Don't let ImportError propagate from the imports checker, leading to crash in some namespace package related cases (#203)
- Don't emit 'no-name-in-module' for ignored modules (#223)
- Don't emit 'unnecessary-lambda' if the body of the lambda call contains call chaining (#243)
- Definition order is considered for classes, function arguments and annotations (#257)
- Only emit 'attribute-defined-outside-init' for definition within the same module as the offended class, avoiding to mangle the output in some cases
- Don't emit 'hidden-method' message when the attribute has been monkey-patched, you're on your own when you do that.
Others changes
- Checkers are now properly ordered to respect priority(#229)
- Use the proper mode for pickle when opening and writing the stats file (#148)
Astroid changes
- Function nodes can detect decorator call chain and see if they are decorated with builtin descriptors (classmethod and staticmethod).
- infer_call_result called on a subtype of the builtin type will now return a new Class rather than an Instance.
- Class.metaclass() now handles module-level __metaclass__ declaration on python 2, and no longer looks at the __metaclass__ class attribute on python 3.
- Add slots method to Class nodes, for retrieving the list of valid slots it defines.
- Expose function annotation to astroid: Arguments node exposes 'varargannotation', 'kwargannotation' and 'annotations' attributes, while Function node has the 'returns' attribute.
- Backported most of the logilab.common.modutils module there, as most things there are for pylint/astroid only and we want to be able to fix them without requiring a new logilab.common release
- Fix names grabed using wildcard import in "absolute import mode" (i.e. with absolute_import activated from the __future__ or with python 3) (pylint issue #58)
- Add support in brain for understanding enum classes.
[cubicweb] CubicWeb roadmap meeting on November 6th, 2014
The Logilab team holds a roadmap meeting every two months to plan its CubicWeb development effort. The previous roadmap meeting was in September 2014.
Here is the report about the November 6th, 2014 meeting. Christophe de Vienne (Unlish) and Dimitri Papadopoulos (CEA) joined us to express their concerns and discuss the future of CubicWeb.
Versions
Version 3.17
This version is stable but old and maintainance will continue only as long as some customers will be willing to pay for it (current is 3.17.17).
If you're still using 3.17, you should go directly to 3.19.
Version 3.18
This version is stable but old and maintained (current is 3.18.6).
Version 3.19
This version is stable and maintained (current is 3.19.5).
Version 3.20
This version is still under development but should be released very soon now (expected next week). Its main feature being the inclusion of CWEP-002 (computed attributes and relations), along with many small improvement patches.
For details read list of tickets for CubicWeb 3.20.0.
We would have loved to integrate the pyramid cube in this release, but the debian packaging effort needed by the pyramid stack is quite big on is only reasonable if we target jessie only (at decent price).
Version 3.21
For now, the roadmap for 3.21 is still the complete removal of the dbapi, the merging of Connection and ClientConnection, and possibly including CWEP-003 (adding a FROM clause to RQL).
Integrate the pyramid cube.
CWEP-004 is being under heavy discussions.
Version 4.0
We expect to accelerate development of CubicWeb 4, which exact roadmap is still to be discussed, but we may already want:
- be pyramid-based (remove twisted, auth management, etc.),
- do not have anything left of old dbapi and ClientConnection,
- integrate squareui as main (and only) web-ui "template" or remove web generation (almost) completely from cubicweb-core and provide it only through the cube system.
Cubes
- cubicweb-bootstrap (0.6.5)
- cubicweb-brainomics (0.11.4, 0.12.0)
- cubicweb-clinipath (0.2.1, 0.2.2)
- cubicweb-collaboration (1.0.1)
- cubicweb-fastimport (0.2.0)
- cubicweb-file (1.16.1)
- cubicweb-forge (1.10.2)
- cubicweb-forgotpwd (0.6.0)
- cubicweb-invoice (0.8.0)
- cubicweb-leaflet (0.2.1, 0.3.0)
- cubicweb-mediaplayer (0.1.3, 0.1.4)
- cubicweb-medicalexp (0.12.3)
- cubicweb-osmfrance (0.2.2)
- cubicweb-person (1.8.1, 1.9.0)
- cubicweb-postgis (0.3.0)
- cubicweb-relationwidget (0.2.0)
- cubicweb-rqlcontroller (0.2.0, 0.3.0)
- cubicweb-squareui (0.3.7)
- cubicweb-subprocess (0.2.0)
- cubicweb-tracker (1.16.1)
- cubicweb-transactionlog (0.2.0, 0.2.1)
- cubicweb-worker (3.0.3, 3.0.4)
- cubicweb-wsme (0.1.0)
- cwclientlib (0.2.0)
- cwtags (1.1.0)
New cubes and libraries
- cubicweb-i18nfield (0.1.0)
- cubicweb-pyramid (0.1.0)
- cubicweb-massmailing (0.1.0)
- cubicweb-wsme (0.1.0)
- pyramid-cubicweb (0.1.0, 0.1.1)
- rqlquery (0.1.0, 0.1.1)
Work in progress
Some work is in progress around CKAN, DCAT and othr Open Data and Semantic Web related technologies.
Agenda
Next roadmap meeting will be held at the beginning of january 2015 at Logilab, and Christophe and Dimitri or Yann are invited.
Open Discussions
Migration:
- AppObjects should be not loaded by default
- Have a look at Alembic and take inspiration from there
[Biologeek] Cours IUT : Flexbox et Styleguide
Afin de faire émerger les pratiques personnelles des élèves, renforcer leurs connaissances, il me semble important d’instaurer l’horizontalité dans les rapports humains, au sein de la classe. J’espère pouvoir devenir alors un accompagnateur, un facilitateur, encadrant le processus de maîtrise des concepts de littérature et de grammaire. Le but est de fluidifier la communication, d’augmenter les feedbacks, de rendre les réussites plus accessibles.
D’une sélection artificielle à une sélection naturelle dans un écosystème complexe
Suite de mes aventures dans l’enseignement, après les bases, on passe à du plus consistant. On commence par repartir de zéro sur un sujet qui leur tient à cœur et en plus petit groupes comme proposé en rétro. La première contrainte et d’établir un styleguide en parallèle du développement du site, c’est quelque chose que j’utilise depuis 7 ans et qui dispose maintenant de nombreuses ressources. J’aime cette approche pour plusieurs raisons :
- réflexion sur la sémantique lorsqu’on se rend compte du nombre d’id/class à ajouter au styleguide pour avoir quelque chose de potable ;
- documentation dynamique pour les divers contributeurs et pour soi-même, on a vite fait de dupliquer un style par méconnaissance du projet ;
- facilité d’expérimentation lors de refontes en applicant directement la nouvelle feuille de style au styleguide.
Il s’avère que c’est aussi extrêmement utile en terme de retour pour corriger un bug récalcitrant de façon visuelle.
Le second concept que je souhaite aborder est Flexbox, c’est encore relativement récent mais Vincent me rappelait à juste titre que l’« on enseigne pour aujourd’hui et pour demain » (pour hier, il reste les polyfills) et Flexbox est aussi un moyen de ne pas les dégoûter tout de suite des CSS :-). C’était bien sûr une occasion pour moi de me mettre à niveau dans ce domaine et d’expérimenter, participer à une formation reste la meilleure façon d’apprendre.
Quelques ressources sur le sujet :
- CSS3 Flexbox Layout module chez Alsacréations
- The Ultimate Flexbox Cheat Sheet
- Solved by Flexbox
- Flexbox Cheatsheet Cheatsheet
- A Complete Guide to Flexbox
Si j’ai le temps, je terminerai sur l’approche mobile et les media-queries pour tirer pleinement partie de Flexbox. Je me rends compte à quel point les minutes sont comptées lorsqu’on est limité à 24 heures de cours sur un sujet aussi vaste…
[logilab] EP14 Pylint sprint Day 2 and 3 reports
Here are the list of things we managed to achieve during those last two days at EuroPython.
After several attempts, Michal managed to have pylint running analysis on several files in parallel. This is still in a pull request (https://bitbucket.org/logilab/pylint/pull-request/82/added-support-for-checking-files-in) because of some limitations, so we decided it won't be part of the 1.3 release.
Claudiu killed maybe 10 bugs or so and did some heavy issues cleanup in the trackers. He also demonstrated some experimental support of python 3 style annotation to drive a better inference. Pretty exciting! Torsten also killed several bugs, restored python 2.5 compat (though that will need a logilab-common release as well), introduced a new functional test framework that will replace the old one once all the existing tests will be backported. On wednesday, he did show us a near future feature they already have at Google: some kind of confidence level associated to messages so that you can filter out based on that. Sylvain fixed a couple of bugs (including https://bitbucket.org/logilab/pylint/issue/58/ which was annoying all the numpy community), started some refactoring of the PyLinter class so it does a little bit fewer things (still way too many though) and attempted to improve the pylint note on both pylint and astroid, which went down recently "thanks" to the new checks like 'bad-continuation'.
Also, we merged the pylint-brain project into astroid to simplify things, so you should now submit your brain plugins directly to the astroid project. Hopefuly you'll be redirected there on attempt to use the old (removed) pylint-brain project on bitbucket.
And, the good news is that now both Torsten and Claudiu have new powers: they should be able to do some releases of pylint and astroid. To celebrate that and the end of the sprint, we published Pylint 1.3 together with Astroid 1.2. More on this here.
[Biologeek] Cours IUT : Responsive et Documentation
Un exemple de manque de pragmatisme : j’ai déjà vu sur un projet, les intégrateurs faire toute l’intégration d’un site avec flexbox, puis passer des jours à tout refaire dans une autre feuille de style pour IE, alors qu’il était établi dès le départ que IE8 était dans la cible. Ils avaient envie d’utiliser flexbox, ce qui est compréhensible, mais dans ce contexte c’était une perte de temps pour tout le monde. La bonne technique aurait du être de faire une version correcte sur IE8, avec les techniques utilisables (ça ne manque pas), et d’ajouter ensuite les beaux dégradés, ombres, etc… que permet CSS3.
La dernière session des cours que je donne à l’IUT a permis d’attaquer un projet qui servira de fil rouge. La plupart se sont mis en groupe de 2 ou 3 et j’ai 2 personnes qui ont préférées faire cavalier seul, l’une pour tout comprendre et l’autre pour garder son indépendance. La rétrospective nous a permis de discuter des améliorations possibles :
- aborder tout ce qui est relatif à l’approche mobile et responsive ;
- avoir la possibilité d’afficher des choses sur le vidéoprojecteur (2 fails consécutifs là-dessus avec un adaptateur oublié la première fois et un vidéoprojecteur incompatible la seconde…) ;
- faire un goûter.
Le prochain cours va donc mettre l’accent sur l’adaptation aux différentes résolutions à l’aide des media-queries en présentant les différents outils comme responsive.is ou des approches comme la responsive typography. Il existe même des moyens de visualiser les principes de base ou de réfléchir en terme de responsive philosophy. Une première étape sera de pouvoir modifier leur menu géré avec Flexbox en changeant la flex-direction de row à column par exemple. Je ne compte pas aller jusqu’à la gestion des différentes résolutions d’images, il y a déjà bien assez à faire en parlant de contenu.
J’ai préparé des cookies pour la pause du goûter, l’occasion de parler de préservation de la vie privée ? :-)
La seconde partie va encore une fois être l’occasion de les mettre en situation en faisant tourner les sources des différents projets entre les groupes et en leur demandant une amélioration mineure. L’occasion de voir à quel point il est difficile de reprendre un projet et l’intérêt d’une documentation haut niveau en plus du styleguide qu’ils ont commencé à faire lors du dernier cours.
Si j’ai un peu de temps on abordera aussi les notions de performances web car j’ai pu remarquer à quel point les élèves sont enclins à rajouter des polices ou des images assez lourdes. C’est l’intérêt d’avoir demandé à récupérer tous les projets par email en imposant d’avoir moins d’1Mo par site. J’ai ainsi pu leur faire un retour personnalisé sur les choses à améliorer, on verra ce qu’ils en ont fait.
[unlish] Unlish à PyconFR
Ces deux jours passés dans les amphis de l'université de Lyon ont été l'occasion de retrouver de nombreuses têtes connues, découvrir des usages de python, et faire connaître CubicWeb, un élément essentiel de notre architecture technique.
Nous y avons parlé robotique, tests unitaires, programmation asynchrone, Web des données, refactoring, gestion de version, pyramid et même, des choses qu'on n'aime pas dans Python !
C'est la tête pleine de bons souvenirs que nous avons quittés Lyon, et nous attendons avec impatience la prochaine édition. Pour que le temps semble moins long, nous ferons peut-être un tour au FOSDEM pour Python-FOSDEM.
Merci aux organisateurs, aux orateurs, et à tous les pythoneux qui ont fait le déplacement !
[unlish] pip install -e / setup.py develop on a cube
The current layout of CubicWeb cubes is not setuptools friendly, and does not permit to use the "develop" mode. The CWEP 004, currently under discussion, aims to solve that problem, and once adopted make life easier for the developers.
Meanwhile, some people (like us at Unlish) would like to use the develop mode anyway, so that we can work on a cube without cloning the whole tree of CubicWeb requirements.
After a few experiments, it turns out we can tweak the virtualenv after pip install -e is run on the cube, and have the benefit of it.
The solution I describe below allows to work on both the cube and the unittests, importing from "cubes.thecube" and "cubes.anothercube" in a virtualenv. It can be applied to several cubes in the same virtualenv. It does *not* apply to the other cubicweb packages.
Problem 1 - the cubes path
Once pip install -e has been run the cube on which it was launched is not usable because it is not present in the cube path.We do not want to add the parent directory of our cube to CW_CUBES_PATH because:
- When importing from cubes.acube, and because "cubes" is not a proper namespace, we have issues
- The spirit of virtualenv is that where the project was checked out does not matter -> we do not want to put restriction on where it can be put in the filesystem.
Solution
From within the virtualenv :ln -s $(pwd) $VIRTUAL_ENV/share/cubicweb/cubes/thecube
Problem 2 - the python path
- pip install -e add our directory to the interpreter path. It is a problem because it pollutes the root namespace, it not masks some modules when the names match (for example in unlish we have a 'markdown.py' file).
- for some reason I did not identified, I could not import from cubes.xxx because the virtualenv cubes path is not added to the syspath like I expected it to (I may have done something wrong on this matter).
Solution
- Remove our directory from the virtualenv path
PTH=$VIRTUAL_ENV/lib/python2.7/site-packages/easy-install.pth
grep -v $(pwd) $PTH > .pth.tmp
mv .pth.tmp $PTH - Add the virtualenv cubes path to the python path
This last command has to be done each time the virtualenv is activated, it is recommended to add it to the 'activate' script, OR postactivate script if you are using virtualenvwrapper (which I recommend too).export PYTHONPATH=$VIRTUAL_ENV/share/cubicweb
Put it all together
The following script does all that for you, and has to be run after each run of pip install -e.Note that it will overwrite your postactivate script, set CW_MODE=user and define a 'ctl' alias, so you may need to modify it before using it.
#!/bin/bash
MYPATH=$(pwd)
MODNAME=$(python -c "import __pkginfo__; print __pkginfo__.modname")
if [ -z "$VIRTUAL_ENV" ]; then
exit 1
fi
if [ -n "$VIRTUAL_ENV/bin/postactivate" ]; then
cat >>$VIRTUAL_ENV/bin/activate <<EOF
. $VIRTUAL_ENV/bin/postactivate
EOF
fi
cat >$VIRTUAL_ENV/bin/postactivate <<EOF
export CW_MODE=user
export PYTHONPATH=$VIRTUAL_ENV/share/cubicweb
alias ctl=cubicweb-ctl
EOF
rm -rf $VIRTUAL_ENV/share/cubicweb/cubes/$MODNAME
ln -s $MYPATH $VIRTUAL_ENV/share/cubicweb/cubes/$MODNAME
PTH=$VIRTUAL_ENV/lib/python2.7/site-packages/easy-install.pth
grep -v $MYPATH $PTH > .pth.tmp
mv .pth.tmp $PTH
echo "Tweaked virtualenv $VIRTUAL_ENV"
echo "Don't forget to re-activate it:"
echo ""
echo " workon $(basename $VIRTUAL_ENV)"
To conclude, this is only a hackish workaround to wait for the real solution: reforming the cubes in cubicweb.
(this post was initially a mail on the cubicweb mailing-list)
[unlish] Nose, coverage, and CubicWeb
Fortunately, we can do something about it.
nose
Using nosetests to run the tests immediately fails with an obscure:TypeError: unbound method __init__() must be called with SkipAwareTextTestRunner instance as first argument (got TextTestRunner instance instead)
After some digging, I discovered that CubicWebTC, from which we inherit all the test cases, ultimately depends on logilab pytest... which is meant to be a test runner, or so it should.
Logilab pytest, as a runner, introduce features missing from the early versions of unittests. To do so, it monkey-patch unittests itself. And I have a feeling that nose is doing something similar... which leads to the ugly error we have.
The solution is to un-monkey-patch unittests, by including these few lines somewhere loaded before any of the test (we do that in test/__init__.py):
import unittest
save_testrunner = unittest.TextTestRunner
import logilab.common.pytest # noqa
unittest.TextTestRunner = save_testrunner
After that, we can happily use nose to run the cube unittests!coverage
The Logilab pytest tool is supposed to do code coverage measurement. Thing is: 1) I could not get it working 2) we want to use another test runner.The naïve approach, using directly coverage or the cover extension of nose (or py.test), unfortunately fails because pytest is still messing with the trace function. The result will invariably be a coverage of 0%.
To avoid CubicWebTC to call any of the tracing-related functions of pytest, we simply inject noop() operations where they are used:
def noop(): pass
import cubicweb.devtools.testlib
cubicweb.devtools.testlib.pause_tracing = noop
cubicweb.devtools.testlib.resume_tracing = noop
And voilà!
In the end, we can use the test runner we want and get coverage to work properly. It remains a hackish workaround though, I think we ultimately need to cut the dependency from CubicWebTC to logilab.devtools.pytest.[Biologeek] Dos et posture
Il existe un lien entre la typographie web et les maux de dos ; il suffit de composer votre texte en petits caractères et vous inviterez naturellement le lecteur à se pencher sur son écran pour les lire. Quoiqu’on en dise, le premier réflexe d’un lecteur ne sera pas de grossir le texte par des moyens techniques. Son premier réflexe sera d’ajuster sa posture, se rapprocher, sans même en avoir conscience.
[…]
Si vous pensez que cela est mineur, c’est que vous n’avez pas (encore ?) de véritables problèmes de dos, que vous récupérez rapidement des fatigues occasionnées par ces sollicitations répétées, ou que vous ne mesurez pas encore ce que ces micro-ajustements de posture peuvent occasionner insidieusement au terme de plusieurs heures, semaines, mois, années, de pratique (moi oui, c’est pour cela que je vous en parle).
J’ai découvert récemment que j’avais tout comme Emmanuel des problèmes de dos occasionnés par la combinaison d’un déséquilibre du bassin et d’une mauvaise posture. Si le premier est quasi-inné vu qu’il proviendrait d’un siège décomplété, le second est dû aux 10 dernières années passées sur un ordinateur portable (dont les 5 dernières sur un 11 pouces…). Même en diversifiant les positions, le dos en pâtit. Si vous ajoutez à cela le port régulier d’un petit bonhomme de 10kg et l’apprentissage de nouveaux sports de manière intensive vous obtenez une colonne vertébrale qui fait pâlir mon ostéopathe.
Si vous avez mal entre les omoplates, vous souffrez peut-être du même problème. Depuis que j’y fais attention, je me rends compte qu’il y a un nombre assez important de geeks qui ont cette posture un peu voûtée. Quelques conseils pour retrouver une bonne posture :
- adaptez votre poste de travail, et pas uniquement physiquement avec un grand écran bien positionné : augmentez la taille de police de vos applications pour avoir l’impression d’être poussé par l’écran (je vous assure que c’est perturbant au début mais ça marche, j’en suis à 18/20px) ;
- ayez l’impression d’avoir une ventouse/un grappin/ce-qui-vous-fait-kiffer sur l’arrière du sommet du crâne qui vous tire en permanence pendant les 66 prochains jours (c’est le temps nécessaire pour prendre une habitude posturale) : au début doucement car vos muscles ne sont plus suffisamment développés pour avoir la bonne posture ;
- si vous avez la chance d’avoir un lit électrique, adaptez-le à la position qui vous semble la moins inconfortable mais qui vous étire progressivement le dos quand même, ça serait dommage de rester voûté la nuit ;
- travaillez la souplesse de vos épaules et ne pratiquez pas d’activités qui désalignent votre colonne (mauvaise position en natation par exemple).
Au passage si vous n’utilisez pas f.lux ou équivalent c’est bien dommage pour vos yeux. De même si vous ne pouvez pas régler la luminosité de votre écran rapidement et régulièrement.
Pour ce qui est du bassin, il s’agit avant tout de prendre de nouvelles habitudes : croisement de pieds, de jambes, positionnement sur une seule jambe à l’attente, couché sur un bras, etc doivent maintenant s’effectuer sur le côté qui vous semble le moins naturel. Bien s’étirer pour ouvrir le bassin et pratiquer le squatting est un plus même si vous n’êtes pas assez souple pour tenir tout seul.
Dernier conseil si vous devez porter une charge lourde sur le côté : gainez.
[Biologeek] Cours IUT : Javascript et jQuery
Le jour où l’on chercha à imposer l’enseignement obligatoire au Tibet, on se heurta à la résistance des femmes.
— Mais ils sont fous ces hommes, de vouloir enlever nos enfants pour les instruire à un âge où ils ont tant de choses à apprendre. Instruire signifie imposer des idées qui ne sont pas celles des enfants. C’est une offense au droit de vivre de l’enfant. Dans une culture qui n’est pas notre culture occidentale, un enfant n’appartient pas à ses parents. La tradition veut qu’il soit donné dès sa naissance à l’Univers (qui est vie et mort) et le respect que les parents lui doivent est fait du même respect qu’ils doivent à leurs ancêtres.
— Tu peux, dit-on aux parents, donner aux enfants ton amour, mais non tes idées. Tu peux enfanter leur corps mais non leur âme. Tu peux essayer de devenir comme eux, mais tu ne peux exiger qu’ils deviennent comme toi, car la vie est projet et non retour vers le passé.Préface de Libres enfants de Summerhill, Maud Mannoni
Plutôt satisfait du déroulé du dernier cours qui a gagné en fluidité et en échanges. J’ai pour l’instant une personne en grande difficulté mais motivée, une personne qui s’en fout, une autre qui fait ses trucs dans son coin et les 21 autres qui progressent tant bien que mal avec plus ou moins de motivation.
On passe maintenant à du dynamique avec Javascript et jQuery (imposé). J’hésite encore à tout faire en utilisant ES 6, je compte leur laisser le choix. Mes objectifs pour cette introduction :
- comprendre la console et le scope, en expliquant "use strict" et les IEFF
(function(){ /* code */ }());
- comprendre l’écoute d’événements, avec
addEventListener(’action’, fonction)
- savoir utiliser les sélecteurs natifs et jQuery, via
document.getElementsByTagName
,document.getElementsByClassName
,document.querySelectorAll
etdocument.querySelector
vs.$(’’)
- savoir utiliser les manipulations du DOM, via
.innerHTML
et peut-êtredocument.createDocumentFragment
vs..append(’’)
- savoir modifier des classes CSS, via
el.classList.add/remove/contains
vs.$(el).addClass/removeClass/hasClass
- savoir modifier des propriétés CSS, via
el.style.property = ’foo’
vs.$(el).css({ property: ’foo’ })
Je ne compte pas aller vers des concepts de type programmation fonctionnelle avec les map, reduce, filter et compagnie faute de temps et de niveau. Je ne vais pas non plus essayer de jongler entre les animations jQuery et ce que l’on peut faire maintenant en CSS. Quelques liens pour approfondir :
- jQuery, c’est bien, le DOM moderne, c’est mieux !
- Ditching jQuery for Vanilla JS
- Native equivalents of jQuery functions
- Replacing jQuery with Vanilla JavaScript
- Native JavaScript Equivalents of jQuery Methods
Il faut aussi que je leur donne quelques tricks pour Sublime Text qui leur a été imposé par le précédent intervenant et la série des awesome pour HTML 5, CSS et Javascript. Et que je me retienne de les assommer de liens :-).
Il serait peut-être temps de leur parler de ces billets de blog comme ressources pour garder une trace et des liens en plus de leur travail en groupe. Je ne voudrais pas leur spoiler les cours non plus vu que je publie à l’avance… peut-être faire un point sur la curiosité et le googling de leurs profs ? Ou pas, si ça se trouve certains me lisent déjà.
[tarek] DNS-Based soft releases
Firefox Hello is this cool WebRTC app we've landed in Firefox to let you video chat with friends. You should try it, it's amazing.
My team was in charge of the server side of this project - which consists of a few APIs that keep track of some session information like the list of the rooms and such things.
The project was not hard to scale since the real work is done in the background by Tokbox - who provide all the firewall traversal infrastructure. If you are curious about the reasons we need all those server-side bits for a peer-2-peer technology, this article is great to get the whole picture: http://www.html5rocks.com/en/tutorials/webrtc/infrastructure/
One thing we wanted to avoid is a huge peak of load on our servers on Firefox release day. While we've done a lot of load testing, there are so many interacting services that it's quite hard to be 100% confident. Potentially going from 0 to millions of users in a single day is... scary ? :)
So right now only 10% of our user base sees the Hello button. You can bypass this by tweaking a few prefs, as explained in many places on the web.
This percent is going to be gradually increased so our whole user base can use Hello.
How does it work ?
When you start Firefox, a random number is generated. Then Firefox ask our service for another number. If the generated number is inferior to the number sent by the server, the Hello button is displayed. If is superior, the button is hidden.
Adam Roach proposed to set up an HTTP endpoint on our server to send back the number and after a team meeting I suggested to use a DNS lookup instead.
The reason I wanted to use a DNS server was to rely on a system that's highly available and freaking fast. On the server side all we had to do is to add a new DNS entry and let Firefox do a DNS lookup - yeah you can do DNS lookups in Javascript as long as you are within Gecko.
Due to a DNS limitation we had to move from a TXT field to an A field - which returns an IP field. But converting IP to integer values is not a problem, so that worked out.
See https://wiki.mozilla.org/Loop/Load_Handling#Service_Soft_Start for all the details.
Generalizing the idea
I think using DNS as a distributed database for simple values like this is an awesome idea. I am happy I thought of this one :)
Based on the same technique, you can also set up some A/B testing based on the DNS server ability to send back a different value depending on things like a user location for example.
For example, we could activate a feature in Firefox only for people in Connecticut, or France or Europe.
We had a work week in Portland and we started to brainstorm on how such a service could look like, and if it would be practical from a client-side point of view.
The general feedback I had so far on this is: Hell yeah we want this!
To be continued...
[tarek] 5 work week tips
Our Mozilla work week just ended with an amazing evening. We had a private Mackelmore concert. Just check out Twitter with the #mozlandia tag and feel the vibe. example.
When they got on stage I must admit I did not know who Mackelmore was. yeah sorry. I live in a Spotify-curated music world and I have no TV.
At some point they played a song that got me thinking: ooohhh yeah that song, ok.
Anyways.
During some conversations a lot of folks told me that they where overwhelmed by the work week and har a very hard time to keep up with all the events. Some of them were very frustrated and felt like they were completely disconnected.
I went through this a lot in the past but things improved throughout the years. This blog post collect a few tips.
1. List the folks you want to meet
This one is a given. Before you arrive, make a list of the folks you want to meet and the topics you want to talk about with them.
Make that list short. 10, no more.
2. Do not code
This is the worst thing to do: dive into your laptop and code. It's easy to do and time will fly by once you've started to code. People that don't know you well will be afraid of disturbing you.
Coding is not something to do during your work weeks. If you need a break from the crowd that's the next tip.
3. Listen to your body
A work week is intense for your body. By the end of the week you will look like a Zombie and you will not be able to fully enjoy what's happening. If you are coming for a far place, the jetlag is going to make the problem worse. If you're a partygoer that's not going to help either. All the food and drinks are not really helping.
I've seen numerous folks getting really sick on day 3 or 4 because they had intensive days at the beginning of the event. It's hard not to burn out.
Some (young) folks are doing fine on this. I know I am not. What I did for the Portland work week was to skip everything on day 2 starting at 5pm, ate a soup and went to sleep at 8pm. Skipping on all the cookies and beers and goodies gives your body a bit of rest :)
That gave me the energy I needed for day 3.
4. Don't hang with your team all the time
You talk to those folks all the time. Meet other folks, check out other sessions, etc.
This is especially important if your native langage is not English. I got trapped many time by this problem: just hanging with a few french guys.
5. Walk away from meetings
Don't be shy of walking away from meetings that don't bring you any value. Walk out discretly and politely. You are not in a meeting to read hackernews on your laptop. You can do this at home.
People won't get offended in the context of a work week - unless this is a vital team meeting or something.
What are your tips?
[Biologeek] Cours IUT : PHP et Formulaires
A l’origine d’internet il existait une personne qui possédait tous les pouvoirs. Cet individu avait le droit de vie ou de mort sur un site internet. Cette personne c’était le maître du web aka webmaster.
Il connaissait tous les raccourcis Frontpage, pouvait animer une page à l’aide d’images 16 couleurs en .gif, faire défiler ou clignoter du texte, et transférer ses fichier sur le web à l’aide de logiciels FTP.
Certains de ces individus se sont transformés en développeurs web. D’autres en découpeurs HTML, encore appelés intégrateurs. Ces magiciens du CSS étaient capables de cacher des liens dans des images à l’aide de leur logiciel de prédilection Dreamweaver. Ils ont aussi découvert le copier / coller et l’utilisaient à travers le web pour récupérer du code source JavaScript.
Mais ce temps est révolu...
J’ai été contraint et forcé de parler de PHP. Un langage que je n’ai pas utilisé depuis 10 ans. Un langage de bidouilles par excellence. Un langage dont la qualité des ressources en ligne est très variable (mais il y a des pépites). Dur.
Mais c’est aussi l’occasion d’essayer de transmettre quelque chose que je ne maîtrise pas du tout, entamer la discussion sur l’importance d’apprendre à apprendre tout au long de sa carrière. Sur ce que l’on peut apprendre en aidant sur un forum, sur irc, en participant à une conférence ou en formant. Et de faire une introduction à la mise en forme des formulaires et aux attributs HTML 5 dédiés. Et de troller un peu aussi hein.
Je compte partir sur un formulaire d’envoi d’email très basique mais qui permet d’explorer les différents concepts (architecture client/serveur, double validation, séparation du code et de l’affichage, etc) :
Ce simple exemple nous prendra je l’espère moins de 4 heures à expliquer, c’est pas gagné car à 24 l’inertie de compréhension est terrible. Il faut que j’arrive à mieux faire en sorte que ceux qui percutent rapidement aident les autres.
Pour l’instant, les retours sur les cours sont vraiment positifs et les étudiants en redemandent ce qui est très motivant. Je vais peut-être avoir une autre classe plus technique pour parler du web mobile (whatever it means) lors du premier trimestre 2015.