MakeMake The Dwarf Planet is a feed agregator.

Python 3.10 : récapitulatif des nouveautés

by Olivier Pons from Olivier Pons

Pep 604

Tester plusieurs types avec le | :

isinstance(5, int | str)
isinstance(None, int | None)
isinstance(42, None | int)
issubclass(bool, int | float)

Même chose pour les annotations :

def ma_fonction(
        ma_liste: List[int | str],
        param: int | None
    ) -> float | str:
    pass

Messages d’erreur plus parlants

  • L’erreur est maintenant affichée à la ligne de début du problème, et non plus lorsque l’interpréteur n’y comprend plus rien, l’exemple le plus marquant étant avec l’oubli d’une parenthèse fermante, ou d’une mauvaise indentation
  • Les messages ont été corrigés de manière à ce qu’ils soient plus clairs, avec des suggestions très utiles qui correspondent souvent à l’erreur

Le match/case

Le match/case de Python est similaire à l’instruction switch/case, qui est reconnue comme un « pattern matching structurel » en Python.

Le match/case de Python se compose de trois entités principales :

  1. Le mot-clé match
  2. Une ou plusieurs clauses case
  3. Du code pour chaque case

Là où Python se démarque des autres langages, c’est que l’on peut faire un match sur des patterns !

Exemples de match, du plus simple au plus avancé :


Match très simple, avec le « or »

exemple = True
match exemple:
    case (True|False):
        print("C'est un booléen")
    case _ :
        print("Ce n'est pas un booléen")


Récupérer les sous-patterns

def alarm(item):
    match item:
        case [time, action]:
            print(f"{time} ! C'est l'heure de {action}!")
        case [time, *actions]:
            print(f'{time} !')
            for action in actions:
                print(f"C'est l'heure {action}!")
alarm(['Bon après-midi', 'de travailler'])
alarm(['Bonjour', 'du petit déjeuner', 'se laver les dents'])


Nommer les sous-patterns

def alarme(item):
    match item:
        case [('bonjour' | 'bonsoir') as time, action]:
            print(f"{time.title()} ! Il faudrait {action} !")
        case _:
            print('Mot-clé invalide.')
alarme(['bonsoir', 'travailler'])
alarme(['bonjour', 'petit déjeuner', 'se laver les dents'])


Nommer les sous-patterns et filtres conditionnels

def alarme(item):
    match item:
        case ['bonsoir', action] if action not in ['travailler']:
            print(f'Journée finie ! Il faut {action}!')
        case ['bonsoir', _]:
            print('Il faut se reposer !')
        case [time, *action]:
            print(f'{time.title()}! Il faut {" et ".join(action)}.')
        case _:
            print('Mot-clé invalide.')
alarme(['bonsoir', 'travailler'])
alarme(['bonsoir', 'jouer'])
alarme(['bonjour', 'petit déjeuner', 'se laver les dents'])


Match sur des objets

class Move:
    def __init__(self, horizontal=None, vertical=None):
        self.horizontal = horizontal
        self.vertical = vertical
def str_move(move):
    match move:
        case Move(horizontal='est', vertical='nord'):
            print('Dir. nord-est')
        case Move(horizontal='est', vertical='sud'):
            print('Dir. sud-est')
        case Move(horizontal='ouest', vertical='nord'):
            print('Dir. nord-ouest')
        case Move(horizontal='ouest', vertical='sud'):
            print('Dir. sud ouest')
        case Move(horizontal=None):
            print(f'Dir. {move.vertical}')
        case Move(vertical=None):
            print(f'Dir. {move.horizontal}')
        case _:
            print('? Move inconnu ?')
d1 = Move('est', 'sud')
d2 = Move(vertical='nord')
d3 = Move('centre', 'centre')
str_move(d1)
str_move(d2)
str_move(d3)

Lire la suite…

Design et création d'un nuage, Nubla.io

by Brunélie Lauret <brunelie@yaal.coop> from Yaal

C'est quoi, Nubla ?

Nubla, c'est un projet de service pour fournir des e-mails, de l'espace de stockage Cloud, de messagerie instantanée et d'agenda pour tous⋅tes, sans passer sous le giron de Google et des géants du web.

On veut passer par des solutions libres, mises à disposition à des frais qui varient selon les moyens de nos utilisateurs. Ca, on y tient. C'est un souhait aussi depuis le début, s'adapter et faire un service qui puisse profiter à un maximum de monde, sans vente de données, sans fins publicitaires et sur mesure.

Bannière nubla.io

☁️


Design et création d'un nuage, Nubla.io ☁️

Ma priorité sur le site de Nubla, c'est de faire un site internet fonctionnel, accessible et lisible. Et quand je dis accessible, c'est au sens de l'accessibilité à tous⋅tes : Choix de polices d'écriture intelligibles, contrastes suffisants, hiérarchisation des contenus et facilité de navigation.

La seconde, c'est de créer quelque chose qui me fasse plaisir à imaginer, à dessiner, puis à intégrer.

Utiliser des outils et des techniques qui me plaisent : coolors pour le choix des palettes de couleur, me tourner vers des polices d'écriture libres, des illustrations open source aussi avec undraw, l'utilisation de CSS Grid pour l'intégration...

Premières pistes

Palettes, tests de fonts avec le texte nubla.io

Quand j'ai proposé au vote les différentes palettes à l'équipe, on s'en est sortis avec une égalité retentissante.

Le point commun entre toutes : Elles sont colorées. Vraiment. Dans mes préférences, j'aimerais garder au moins une palette qui contient du jaune pour faire une petite référence discrète à Yaal Coop.

Parmi les autres couleurs, je tiens généralement à utiliser un noir qui n'est pas parfaitement noir, et un blanc pas parfaitement blanc. Juste pour ne pas trop agresser la rétine, je trouve ça plus doux. Ici, #323232 fait office de noir, et #F4F4F4 fait office de blanc.

Les fonts testées ici sont :

  • Jost - Une police d'écriture libre, adaptée à la technologie variable font d'OpenType, reproduisant l'esprit de la légendaire Futura.
  • Varela Round - Une police d'écriture ronde, sympathique, créée par le designer Joe Prince.

J'ai finalement opté pour Jost, du fait de sa grande polyvalence, mais également pour son aspect géométrique et lisible qui viendra contraster avec les motifs décoratifs plutôt ronds du site (les fameux blobs).

Tests d'interaction des couleurs entre elles

Côté formes, décoratives, j'ai testé le géométrique et l'anguleux, mais pour un projet cloud avec une face amicale/familiale, je lui ai préféré les courbes et les "blobs" arrondis. La police d'écriture choisie elle-même déjà tout en angles et en pointes créée un contraste et une dynamique amusants.

Image du blob de fond

Wireframes

Sur la sturcture du site, j'avais très envie de travailler avec CSS Grid Je suis partie sur une structure de cinq colonnes, chacune séparée d'une gouttière de 20px, la première et la dernière colonne restant "vides" pour aérer le site. Je met vides entre guillemets, parce que c'est dans la colonne de droite que j'ai prévu de poser la navigation, fixée en haut à droite de l'écran pour rester toujours visible.

Wireframe de la page d'accueil, en noir et blanc

Wireframe de la page à propos, en noir et blanc

Déclinaison de maquettes

Les maquettes ci-dessous ne sont pas finales, mais sont là pour donner une idée assez claire des différents layouts qui seront mis en place sur le site et du rendu qu'on pourra obtenir.

Je suis pas vraiment adepte des maquettes pixel perfect (je vais pas m'étaler là dessus), d'autant plus lorsque je ne suis pas seul responsable des contenus du site. Je préfère poser une base, voir quels contenus sont proposés puis m'y adapter en respectant l'esprit et les déclinaisons de layouts choisis pour le site.

Maquettes graphiques du site Nubla.io

Maquettes graphiques du site Nubla.io

Pourquoi le cadre ? Jeu sur la structure du site, évite la sensation de "flottement" des éléments dans le vide. Peut aussi permettre des jeux de parallaxe. Jouer avec le scroll à l'intérieur du cadre, avec la navigation fixe, je trouve ça assez marrant.

☁️


Le Site

Structure du site :

Schéma de la structure du site

  • Le body, sur lequel je place le blob de fond.
  • Un conteneur, celui qui a le cadre noir et un padding qui laisse la place pour la scrollbar à droite et les notes de pied de page en bas
  • Un layout en grille CSS de 5 colonnes, séparées par des gouttières de 20px.
  • La navigation, qui semble posée sur la 5eme colonne mais est en réalitée positionnée en position:fixed; pour ne pas bouger d'un pouce lorsque l'on navigue sur la page.

Les petits détails qui font plaiz

... ou comment faire l'effet de soulignement dynamique des liens :

Gifs de quelques interactions animées, genre le soulignage des liens

C'est fait comme ça :

.line {
    display: inline-block;
    position: relative;
    font-style: normal;
    z-index: 1;
    color:var(--dark);
}

a.line:hover, a.line:focus {
    color:var(--dark);
}
.line::after {
    width: 100%;
    height: .7em;
    content:" ";
    background-color: var(--yellow);
    position: absolute;
    left:10px;
    bottom:0px;
    z-index: -2;
}
a.line::before {
    width: 0%;
    height: .7em;
    content:" ";
    background-color: var(--magenta);
    position: absolute;
    left:10px;
    bottom:0px;
    z-index: -1;
    transition: .2s all;
}
a.line:hover::before, a.line:focus::before {
    width: 100%;
    transition: .2s all;
}

Ce serait dommage de se priver de ce genre de petites choses ! Ca me fait expérimenter un peu, et puis c'est toujours amusant à voir. Bien sûr, dans un souci d'accessibilité, les animations se déclenchent aussi lorsqu'un élément est placé en [focus] et pas seulement au survol de la souris.

☁️


Et voilà !

Vous voulez voir ce que ça donne en vrai ? C'est par là : 👉 https://nubla.io 👈

Et n'hésitez pas à faire un tour sur notre sondage concernant vos usages e-mail, cloud et internet, et savoir si l'offre de Nubla pourrait vous intéresser !

J'espère que la lecture vous a plu !

Lire la suite…

Dernières contributions à des logiciels libres par l'équipe Yaal Coop (rentrée 2021)

by Éloi Rivard <eloi@yaal.coop> from Yaal

pytest

Outil de tests unitaires en Python

simple-svelte-autocomplete

Composant svelte de suggestion d'éléments dans une liste déroulante

toast-ui editor

Éditeur markdown wysiwyg en Javascript

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

sheraf

Surcouche objet à ZODB

ZEO

Serveur de base de données pour ZODB

rstr

Bibliothèque Python produisant des chaînes de caractères aléatoire

Pygments

Bibliothèque Python de coloration syntaxique

  • Ajout d'un lexeur à Pygments pour le format Procfile. Les fichiers Procfile sont utilisés par des hébergeurs comme Heroku mais ils servent aussi pour des développements locaux (avec Foreman ou Honcho).

Python.org

  • Correction d'un exemple de code sur le site python.org. La correction est intégrée dans le dépôt, mais pas encore disponible sur le site.

Lire la suite…

Last FOSS contributions from the Yaal Coop team (summer 2021)

by Éloi Rivard <eloi@yaal.coop> from Yaal

pytest

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing

simple-svelte-autocomplete

Simple Autocomplete / typeahead component for Svelte

toast-ui editor

Markdown WYSIWYG Editor

canaille

Simplistic OpenID Connect provider over OpenLDAP

sheraf

A versatile ZODB abstraction layer

ZEO

ZODB Client-Server framework

rstr

rstr is a helper module for easily generating random strings of various types.

Pygments

Pygments is a generic syntax highlighter written in Python

Python.org

Lire la suite…

Manifeste agile et confinement - une rétrospective

by Le blog de Dim' from Le blog de Dim'

Introduction - retour sur le manifeste agile #

Relisons-le ensemble, il est là:

=> https://agilemanifesto.org/iso/fr/manifesto.html

Manifeste pour le développement Agile de logiciels

Nous découvrons comment mieux développer des logiciels par la pratique et en aidant les autres à le faire. Ces expériences nous ont amenés à valoriser :

Les individus et leurs interactions plus que les processus et les outils Des logiciels opérationnels plus qu’une documentation exhaustive La collaboration avec les clients plus que la négociation contractuelle L’adaptation au changement plus que le suivi d’un plan

Nous reconnaissons la valeur des seconds éléments, mais privilégions les premiers.

Notez que la comparaison “les individus et les interactions plus que processus et les outils” est en premier.

Comme le reste de l’article s’appuie sur ce concept je vous propose de le nommer “Principe d’Humanité” ci-dessous pour plus de lisibilité.

D’un autre côté “réagir au changement plus que suivre un plan” est en dernier et c’est pourtant la phrase qui donne son titre au manifeste - l’adjectif “agile” a été choisi pour s’y référer. Par conséquent, c’est la partie “réagir au changement” que l’on retient le plus, alors que le Principe d’Humanité est beaucoup moins connu.

Explorons ensemble ce paradoxe, en se replongeant dans l’effet du confinement en entreprise.

Ce qu’était le confinement #

Le confinement au niveau des individus #

Du jour au lendemain, tous les salariés de la société ont été obligés de travailler depuis leur domicile. Les réactions de chaque personne ont été très différentes, entre :

Celles qui préfèrent tout simplement ne plus avoir à venir au bureau - pour un tas de raisons diverses (temps de trajet, peur de contaminer des proches, envie de passer du temps avec ses enfants, etc …)

Celles qui tolèrent mal le confinement - également pour des raisons diverses (besoin de socialiser avec les autres salariés, pas les bonnes conditions matérielles chez elles, etc …)

Celles qui ne le tolèrent pas du tout et cessent de travailler (cela peut aller de la simple perte de motivation en passant par la démission ou la dépression nerveuse)

Sans oublier les personnes qui pratiquaient le télétravail depuis déjà longtemps, ou celles qui ont simplement changé d’emploi

Nous voyons ici que la bonne façon d’aborder le problème du confinement doit nécessairement prendre en compte les individus au sens fort - c’est-à-dire pas seulement les personnes une par une, mais des personne singulières - dotées de personnalités propres.

Le confinement au niveau des interactions entre individus #

D’un autre côté, les conditions matérielles des interactions entre individus ont radicalement changé.

Prenons par exemple le cas d’une conversation entre deux personnes (je laisse de côté les réunions à plusieurs qui mériteraient un article à part).

Voici une liste non-exhaustive des différentes façons dont une conversation de travail peut avoir lieu si les deux collègues sont face à face :

  • de part à et d’autre d’un bureau pour un conversation “officielle”
  • entre deux portes - par exemple juste avant ou juste après une réunion
  • autour de la machine à café pour parler de la météo
  • autour d’un verre dans un bar en fin d’après-midi pour décompresser après le boulot
  • à la table d’un restaurant le midi pour une réunion commerciale
  • etc.

Voici une liste exhaustive des différentes façons dont une conversation peut avoir lieu si les deux personnes ne sont /pas/ face à face :

  • voix seulement (téléphone)
  • texte seulement (SMS ou messagerie instantanée)
  • vidéo-conférence (audio et vidéo - avec messagerie instantanée incluse ou non)

Et c’est à peu près tout ce que la technique permet aujourd’hui - qu’on le veuille ou non !

Ainsi, la question posée par le confinement en entreprise peut être formulée ainsi : comment reproduire toute la richesse permise par les discussions face à face ?

Notez que cette question n’est ni problème technique, ni un problème financier, ni un problème de processus, mais bien d’interactions entre individus …

L’impact du confinement sur une entreprise fonctionnant sans le Principe d’Humanité #

La thèse que je veux défendre est celle-ci : si l’entreprise dans son ensemble a oublié l’importance des individus et de leurs interactions, elle n’a aucun bon moyen de gérer correctement la question du confinement !

De fait, elle va naturellement ignorer le problème principal et s’occuper à la place des problèmes qu’elle sait déjà gérer, c’est à dire les problèmes pour lesquels il existe déjà un processus.

Par exemple la perte de clients, les problèmes d’approvisionnement etc. liés au confinement sont des soucis financiers ou logistiques pour lesquelles les solutions sont connues.

Au final, les problèmes liés véritablement au confinement vont être perçus comme des problèmes “d’organisation du travail”.

Ainsi, en supposant que l’entreprise survive, elle risque de prendre des décisions qui n’adressent pas vraiment la question, comme “mettre en place un nouveau processus de travail” (phrase floue si l’en est) - en s’inspirant de processus déjà existants comme SAfe, SCRUM, ou OKR pour ne citer que les plus connus.

À l’extrême, l’entreprise va économiser sur le prix de l’immobilier en optant pour des locaux plus petits (ou pas de locaux du tout) et compenser de la sorte le manque de productivité de la “masse salariale” …

L’impact du confinement sur une organisation fonctionnant suivant le Principe d’Humanité #

La question posée par le confinement reste compliquée, bien sûr, mais au moins ce n’est pas un problème différent en nature de ceux que l’organisation sait déjà traiter.

Et en tout cas, une entreprise suivant le Principe d’Humanité aura de bien meilleures chances de gérer correctement la fin du confinement.

Conclusion et retour sur l’agilité en entreprise #

Réduire la question du confinement à “il faut trouver un moyen technique de travailler à distance”, et simplement investir dans la visioconférence et des outils collaboratifs en ligne, est, je pense, manquer l’essentiel.

Au passage, c’est aussi ignorer que l’Humanité a déjà connu dans l’histoire des conditions similaires au confinement - typiquement, un couvre-feu pendant la guerre.

J’espère vous avoir convaincu maintenant que le dernier principe agile (réagir au changement) découle en fait du premier.

En effet, les entreprises qui valorisaient les individus et leurs interactions par-dessus le le reste ont probablement pu réagir au changement qu’était le confinement bien mieux que les autres sans nécessairement avoir besoin de faire de plan - ce qui de toutes façons était très compliqué (souvenez-vous de votre propre état mental lors du premier confinement).

En réalité, les entreprises qui ont oublié le Principe d’Humanité sont finalement fort peu capables de réagir à des changements non prévus et sont finalement … peu agiles.

D’ailleurs, la seule chose qui ne changera probablement jamais dans une entreprise, c’est que c’est un ensemble complexe et mouvant d’individus et d’interactions …

Lire la suite…

Last FOSS contributions from the Yaal Coop team (spring 2021)

by Éloi Rivard <eloi@yaal.coop> from Yaal

simple-svelte-autocomplete

Simple Autocomplete / typeahead component for Svelte

canaille

Simplistic OpenID Connect provider over OpenLDAP

sheraf

A versatile ZODB abstraction layer

python-slapd

Controls a slapd process in a pythonic way

  • Project creation and publication.

cpython

wtforms

A flexible forms validation and rendering library for Python.

Debian

Lire la suite…

Dernières contributions à des logiciels libres par l'équipe Yaal Coop

by Éloi Rivard <eloi@yaal.coop> from Yaal

simple-svelte-autocomplete

Composant svelte de suggestion d'éléments dans une liste déroulante

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

sheraf

Surcouche objet à ZODB

python-slapd

Bibliothèque python pour contrôler un server OpenLDAP

  • Création et publication du projet.

cpython

wtforms

Bibliothèque python de gestion de formulaires web

Debian

Lire la suite…

Python : compiler et faire tourner plusieurs versions sans collisions

by Olivier Pons from Olivier Pons

Il faut aller chercher le code source qui vous intéresse.

Exemple, faire tourner un « vieux » Python 3.6, aller dans les versions ici et prendre celle qui nous intéresse.

Puis récupérer le code source et le compiler :

mkdir ~/source ; cd ~/source
wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tar.xz
tar xvf Python-3.6.13.tar.xz
cd ~/source/Python-3.6.13
./configure && make
sudo make altinstall

Et voilà :

~/source/Python-3.6.13$ python3.6
Python 3.6.13 (default, May 21 2021, 17:12:12) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Lire la suite…

Une page se tourne

by Le blog de Dim' from Le blog de Dim'

Une page se tourne … #

Vendredi dernier j’ai signé une rupture conventionnelle qui mettra fin au contrat qui me lie à Tanker le 24 février 2021.

Ainsi se conclura une aventure de près de 5 années riches en enseignements et en rebondissements. Merci à tous mes collègues, et bon courage pour la suite!

Et ensuite ? #

Plusieurs possibilités s’ouvrent à moi.

Dans l’idéal, j’aimerais trouver une activité de professeur à temps plein (toujours dans le domaine de l’informatique) et dans la région parisienne, mais je suis ouvert à toute forme de contrat.

J’ai acquis de nombreuses compétences en tant que développeur professionnel - tant chez Tanker que dans ma dans ma boîte précédente, Softbank Robotics - compétences que je souhaite aujourd’hui transmettre.

Parmi les sujets sur lesquels je me sens prêt à donner des cours dès maintenant:

  • Le langage de programmation Python (Voir: https://dmerej.info/python/)
  • Les bonnes pratiques de développement (tests automatiques, intégration continue, DevOps, revue de code, …)
  • Les méthodes agiles (SCRUM et Lean en particulier)
  • etc …

Il est bien sûr possible que je n’arrive pas à trouver un poste à temps plein tout de suite, et donc j’ai prévu de chercher également un poste dans une coopérative ou similaire.

Je ne me vois pas du tout travailler dans une société de service ou dans une grosse boîte, et après plus de 10 ans passés dans le monde des start- up, j’ai besoin de changement. Je pense que je m’épanouirai davantage dans ce genre de structure, et en tout cas, cela m’intéresse de découvrir une nouvelle forme d’organisation.

Une invitation #

J’écris cet article en partie pour clarifier mes objectifs pour l’avenir, mais surtout pour que vous, chers lecteurs, puissiez le partager et m’aider à passer cette nouvelle étape de ma carrière.

Comme d’habitude, ma page de contact est là si vous avez des pistes à me suggérer, des questions à me poser, ou pour toute autre remarque.

À bientôt !

Lire la suite…