MakeMake The Dwarf Planet is a feed agregator.

Sur Lyon − Meetup le 19 décembre

by grewn0uille from AFPy discuss

Hello tout le monde,

Meetup de fin d’année le jeudi 19 décembre, dans les locaux de Lowit (métro Part-Dieu) !

Comme l’an dernier, on vous propose un format Lightning Talks :christmas_tree:

Si vous souhaitez parler de quelque chose, d’une bibliothèque, d’un outil, d’un projet… N’hésitez pas à me contacter pour que je rajoute sur la liste des sujets :slight_smile:

Lightning Talks de Noël 🎄

2024-12-19 19:00 (Europe/Paris) → 2024-12-19 21:30 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Effacer terminal

by mapommfj from AFPy discuss

Bonjour, encore une petite question de néophyte, désolé:
j’ai un script qui ouvre (à travers une combo) un terminal où se déroule un script python3. Cela donne:

def sel_mo(event):
	af=ctn.get()
	if af == c1:
		subprocess.run(f"gnome-terminal -- python3 {f1}", shell=True)
	elif af == c2:
		subprocess.run(f"gnome-terminal -- python3 {f2}", shell=True)
	etc...

je voudrais fermer le terminal quand on change d’item dans la combo puisque je rouvre un terminal à chaque item, mais je n’y arrive pas.
J’avais essayé un bouton avec subprocess.run("clear", shell=True), mais cela ne donne rien.
Auriez-vous une piste ? Merci d’avance

8 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Idées de talk pour les meetups

by vpoulailleau from AFPy discuss

Salut,

Je discutais par mail avec Reuven Lerner, un habitué des conférences Python internationales (PyVideo.org).

C’est difficile de trouver des speakers pour les meetups. Il m’a suggéré plein d’idées de talks. Libre à vous d’en proposer au public pour faire que quelques personnes du public deviennent les speakers des prochains meetups.

Je vous mets un bout du mail (en anglais…)

Here are a few types of conference/meetup talks that could be interesting:

  1. How does ___ work behind the scenes?

Assignment. Dictionaries. Lists. Importing modules. Grouping in Pandas.
Functions. This is one of my favorite things to do, because it has
almost infinite depth, and you’ll surprise yourself with what you find
in preparing such a talk.

  1. ___ has changed in Python, and I’ll tell you about it

PyArrow in Pandas. Dictionaries (a while ago). Sorting (very recently).
f-strings. case-match.

  1. You think that ___ is complicated. I’m going to simplify it for you.

Decorators. Comprehensions.

  1. Here’s a cool thing that I did in Python. I’ll show it to you, and
    tell you what I learned along the way.

  2. Weird and surprising stuff.

Qu’en pensez-vous ?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Tremplin MiXiT 2025

by grewn0uille from AFPy discuss

Hello tout le monde,

Le MiXiT et CraftRecords retravaillent ensemble pour l’édition 2025 du MiXiT et proposent un tremplin.

L’idée du tremplin est d’accompagner des personnes qui n’ont jamais fait de conférence ; de la formalisation du sujet à la prise de parole.

Cette année, uniquement des sujets techniques sont recherchés.

6 personnes sont sélectionnées et accompagnées. À l’issue de la période de coaching, un meetup est organisé et le public vote pour ses conférences préférées.
Les deux conférences ayant le plus de voix seront sélectionnées pour le MiXiT !

Si vous êtes sur Lyon ou alentours, n’hésitez pas à postuler (en plus les coachs sont trop sympas :stuck_out_tongue:)

:date: Date limite pour postuler : 22 décembre 2024
:studio_microphone: Meetup de sélection : 26 mars 2024
:muscle: Équipe de coachs : Léa Coston, Yann Bouvet, Houleymatou Baldé, Antoine Caron, @liZe et moi-même
:arrow_right: Formulaire d’inscription : Inscription Tremplin Mixit 2025

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Afficher une fenêtre de notification depuis le shell

by ascendances from ascendances

Plusieurs commandes permettent d’afficher une fenêtre de notification qui disparaît automatiquement. Voici quelques outils avec les fonctionnalités minimales. Chacun d’entre eux a des paramètres supplémentaires spécifiques.

Notify-send

notify-send est disponible dans le paquet libnotify-bin (dans Debian et ses dérivées) et est probablement déjà installé. La capture montre le rendu avec Gnome. La commande :

$ notify-send "ici un titre" "ici le contenu"

Zenity

zenity est basé sur GTK et permet l’affichage de différents types de fenêtre. Pour obtenir la fermeture automatique de la fenêtre, il faut ajouter un paramètre spécifique :

$ zenity --info --title="ici un titre" --text="ici un contenu" --timeout=5

Kdialog

Notification avec kdialog

kdialog fait partie de KDE. Le type passivepopup est une notification qui apparaît dans un coin du bureau et disparaît automatiquement :

$ kdialog --passivepopup --title "ici un titre" "ici un contenu"

Xmessage

xmessage fait partie d’outils fournis avec X11 (paquet x11-utils sous Debian et dérivées). Il doit être disponible à peu près partout mais, contrairement aux commandes citées précédemment, ne bénéficie pas de l’intégration avec le thème du bureau. En bref, ça fonctionne mais c’est moche.

$ xmessage -timeout 5 "ici un contenu"

Versions utilisées

Le rendu des captures d’écran peuvent différer selon la version des logiciels utilisés. Les captures ont été faites avec :

  • Gnome 47
  • KDE Plasma 5.27
  • Zenity 4.0.2
  • Xmessage 1.0.7

Lire la suite…

affichage label

by mapommfj from AFPy discuss

Bonjour,
voici la structure de mon programme:

import modules
fen=Tk()
...
label1=Label(fen,text,...)
...
# lecture des @ sites web dans un fichier csv
# test si @ site valide
# affichage des erreurs (Labels)
fen.mainloop()

Je dois attendre la fin du programme pour afficher le label1 alors qu’il est au début du programme. Merci de m’expliquer pourquoi cela se passe ainsi.

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Django : Optimiser les performances pour la production

by Camille Roux from Human coders

Découvrez les meilleures pratiques pour optimiser Django dans des environnements de production. Cet article explore des techniques pour améliorer les performances, gérer l’évolutivité, et garantir la stabilité de vos applications Django à grande échelle. De la gestion des bases de données aux stratégies de mise en cache, chaque aspect est couvert pour vous aider à tirer le meilleur parti de votre stack.


Commentaires
L'article Django : Optimiser les performances pour la production a été posté dans la catégorie Python de Human Coders News

Lire la suite…

Et hop, un nouvel exercice sur HackInScience : les carrés magiques

by mdk from AFPy discuss

TL;DR : HackInScience — Magic Square

La moulinette étant toute fraîche elle contient probablement encore des bugs, sois indulgent et n’hésite pas à me donner quelques retours (ou faire une PR, le code est là exercises/magic-square · main · hackinscience / hkis-exercises · GitLab).

Oui je sais j’avais déjà quelque chose autour des carrés magiques (HackInScience — Dirichlet solver) mais celui-ci est beaucoup plus simple.

Inspiré d’un exercice de math donné en élémentaire à une de mes filles, quand j’ai vu l’exo (remplir un carré magique) ma première réaction a été « ça se script… » et ma 2ème « ahh bah ça fera un exo hackinscience » :slight_smile:

Si vous avez des idées d’exos je prends !

11 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Utilisation de pybind11

by Mindiell from AFPy discuss

Coucou ici,

Je tente de générer un binding python pour une librairie. Pour le moment, je ne gère qu’une classe avec une seule méthode.

Mais quoi que je fasse, j’obtiens toujours une erreur “undefined symbol”.

Quelques infos :

  • La librairie compile bien, en dynamique ou en statique.
  • j’ai réussi à générer les exemples donnés par pybind11 dans leur tutoriel (les premiers pas quoi)
  • la commande que j’utilise pour compiler est un poil complexe :

g++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) -ISFML/include -Lbuild/lib -lsfml-system pysfml2/example.cpp -o example$(python3-config --extension-suffix)

la librairie a été compilée dans le répertoire build/lib et son nom est libsfml-system.so ou bien libsfml-system-s (pour la version statique), mon fichier pybind11 est pysfml2/main.cpp.

La compilation se passe bien, mais si j’importe le résultat :

>>> import example
ImportError: /[...]/sfml/example.cpython-312-x86_64-linux-gnu.so: undefined symbol: _ZNK2sf4Time9asSecondsEv

Il ne trouve donc ps le symbole sf::Time.asSeconds.

Tout idée est la bienvenue :slight_smile:

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Python dans org-mode avec des tables en entrée et en sortie

by mdk from AFPy discuss

On en parlait avec @Merwyn pendant la PyConFR, mais une démo vaut mieux que démo^Wdes mots :

D’abord ça nécessite un peu de config :

(org-babel-do-load-languages
 'org-babel-load-languages
 '((python . t)))

puis dans un fichier org :

On définit d'abord une table (optionnel mais bon pour la démo)
et on la nomme :

#+tblname: tbl-hostnames
| Host     |
|----------|
| mdk.fr   |
| afpy.org |

Ensuite un peu de Python, qui prend (ou pas) la table en variable
d'entrée :

#+begin_src python :var hostnames=tbl-hostnames
  import subprocess

  pings = []
  for hostname, in hostnames:
      pings.append((hostname, subprocess.run(["ping", "-c1", hostname], stdout=subprocess.PIPE).stdout.decode().splitlines()[-1]))

  return pings
#+end_src

#+RESULTS:
| mdk.fr   | rtt min/avg/max/mdev = 4.698/4.698/4.698/0.000 ms |
| afpy.org | rtt min/avg/max/mdev = 2.951/2.951/2.951/0.000 ms |

Pour exécuter le code (et avoir le `#+RESULTS` qui apparaît tout seul)
c'est comme toujours dans org-mode: `C-c C-c`.

J’entends d’ici les gens râler sur ma virgule après for hostname, haha.

Bon pas besoin de sortir Python pour juste un ping :

 | mdk.fr        | 36.251/36.251/36.251/0.000 ms |
 | afpy.org      | 20.700/20.700/20.700/0.000 ms |
 | deb2.afpy.org | 19.779/19.779/19.779/0.000 ms |
 | bbb.afpy.org  | 20.608/20.608/20.608/0.000 ms |
#+TBLFM: $2='(shell-command-to-string (concat "ping -c 1 " $1 " | tail -n 1 | cut -d= -f2 | tr -d '\n'"))

D’ici à lancer mes playbooks Ansible depuis org-mode y’a qu’un pas…

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Documentation multi langue alabaster

by yabb85 from AFPy discuss

Bonjour,

J’essaie de faire une documentation qui contient plusieurs langues avec sphinx et le thème alabaster. j’arrive bien à générer chaque langue, mais je n’ai rien pour passer de l’une a l’autre. C’est soit je génère une langue, soit l’autre mais pas les deux en même temps.
Savez-vous comment ajouter un moyen de passer d’une langue a l’autre dans la documentation générée?
Merci

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Rapport de transparence de la PyConFR 2024

by grewn0uille from AFPy discuss

PyCon France (PyConFR) est une conférence qui a lieu chaque année (sauf circonstances exceptionnelles) en France. Cette année, elle a eu lieu du 31 octobre au 3 novembre à Strasbourg, rassemblant des personnes de la communauté Python. Les participantes et participants à la conférence sont tenues de respecter ​le Code de Conduite de l’Association Francophone Python, l’association qui organise l’événement.

Le but de ce document est d’améliorer l’accueil et la sécurité des participantes et participants ainsi que de donner aux organisateurs et organisatrices des indicateurs sur le comportement de la communauté. En effet, pour pouvoir entendre, il faut pouvoir écouter. C’est maintenant devenu une pratique courante, pour les organisations ayant un Code de Conduite, de publier un rapport de transparence suite à la tenue d’une conférence. C’est le but de ce document.

Télécharger le rapport en PDF (FR/EN)

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Bordeaux − Meetup le 11 décembre

by yoan from AFPy discuss

Salut,

Deuxième meetup de l’année au Node à bordeaux :partying_face:

Bordeaux Python Meetup 2024.2

2024-12-11 18:30 (Europe/Paris) → 2024-12-11 20:30 (Europe/Paris)

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Réunions du comité directeur 2024-2025

by entwanne from AFPy discuss

Ceci est le sujet lié à la réunion récurrente du comité directeur.
Celle-ci a lieu chaque mois le 3ème mardi à 20h30.

Les compte-rendus de réunions sont publiés sur notre dépôt git et le lien sera posté sur ce sujet après chaque réunion.

Vous pouvez utiliser ce sujet pour proposer des points à aborder lors d’une prochaine réunion : vous serez alors invité à la prochaine réunion pour venir discuter de ce point.
Ces réunions sont aussi accessibles à toute personne qui en ferait la demande auprès du comité.

Réunion du comité directeur

2024-11-19 20:30 (Europe/Paris)

2 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Version Programme AppImage

by mapommfj from AFPy discuss

Bonjour,
je cherche via un script a connaitre la version d’un logiciel externe de type AppImage. Y-aurait-il un moyen pour le faire ?
Par exemple avec BalenaEtcher si je le lance je récupère un résultat (str) dans lequel il y a la version. J’ai essayé avec LibreOffice mais cela ne donne rien.
Une idée serait la bienvenue, …si c’est possible…

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Version d'un programme AppImage

by mapommfj from AFPy discuss

Bonjour,
je cherche via un script a connaitre la version d’un logiciel externe de type AppImage. Y-aurait-il un moyen pour le faire ?
Par exemple avec BalenaEtcher si je le lance je récupère un résultat (str) dans lequel il y a la version. J’ai essayé avec LibreOffice mais cela ne donne rien.
Une idée serait la bienvenue, …si c’est possible…

12 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

La 3ème journée de la PyconFr se termine. Il ne vous reste plus qu'une journée pour venir voir des conférences et des ateliers sur votre langage de programmation préféré :D

Lire la suite…

Swift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} Calshh

by dnbrhhdgdgf from AFPy discuss

Swift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} Cal
A-Complete-Guide-to-Online-Customer-Service-in-2023
Swift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} CalSwift Finance Loan App Customer .Care Helpline Number +91)((+9201333017-))℅+/{+8817792161+} Cal

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

La PyConFR 2024 démarre ce jeudi 31 octobre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Programme pour compter les lettres d'un mot

by sergebourlon from AFPy discuss

Bonjour,

J’essaye de créer un petit programme qui permet de printer le nombre de fois que chaque lettre du mot choisi apparait
Exemple :
Entrez un mot : anana
La lettre a apparait 3 fois
La lettre n apparait 2 fois

Voici mon programme assez lourd :

from collections import defaultdict

mot =(input("Entrez un nouveau mot: "))

chars = defaultdict(int)

for char in mot:

chars[char] += 1

print("la lettre a apparait",chars["a"],"fois")

print("la lettre b apparait",chars["b"],"fois")

print("la lettre c apparait",chars["c"],"fois") # element not present in the string, hence print 0

print("la lettre d apparait",chars["d"],"fois")

print("la lettre e apparait",chars["e"],"fois")

print("la lettre f apparait",chars["f"],"fois")

print("la lettre g apparait",chars["g"],"fois")

print("la lettre h apparait",chars["h"],"fois")

print("la lettre i apparait",chars["i"],"fois")

print("la lettre j apparait",chars["j"],"fois")

Merci de m’aider :wink:

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

la PyConFR 2024 se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Lanceur script environnement virtuel

by mapommfj from AFPy discuss

Bonjour,
Nouveau sur le site et pas expert en Python, j’ai installé sur un PC Linux bureau Cinnamon, un environnement virtuel “venv”.
Quand j’active mon environnement virtuel (source .../activate) et que je lance un script Python3 depuis un terminal (python3 nomduscript.py) , il fonctionne bien.
Je voudrais créer un lanceur (bureau Cinnamon) pour exécuter ce script (dans l’environnement virtuel), mais je n’arrive pas à créer la commande correcte.
J’ai mis le shebang du script Python à :

#!/home/cheminEnvirVirtuel/bin/python3.12

et la commande du lanceur à :

python3 /home/cheminEnvirVirtuelduScriptPyth/nomduscript.py

La commande sort une erreur car on ne se trouve pas dans l’environnement virtuel. Comment faire ??
Merci d’avance

9 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Besoin d'aide pour la PyConFR : vos sujets de consommation d'APIs

by romain from AFPy discuss

Hello!

On est en train de finir de préparer les sprints et le workshop autour de HARP Proxy avec Arthur et bien qu’on ait déjà plein de choses en stock, on se dit que ce serait encore plus intéressant si on rajoutais des cas / exemples / démos / réponses provenant de la communauté.

J’ai fait un (mini) google form, on est sûrs que vous rencontrez plein de problématiques en consommant des APIs, et on est aussi très intéressé par des retours d’expériences du type «on utilise une API qui resemble à foo, tous les 3 jours elle décide de renvoyer son contenu à l’envers si l’âge du capitaine est un nombre premier. Du coup on a décidé de mocker la date système pour que l’êge calculé soit toujours pair». Enfin avec du vrai, quoi.

Si vous venez à la PyconFR (ou pas, d’ailleurs), ce serait vraiment chouette si vous pouviez nous partager quelques use cases / issues soit ici soit dans le google form, histoire qu’on affine tout ça.

Et si vous êtes curieux, n’hésitez pas à venir nous faire un coucou à la PyconFR.

Merci d’avance et au plaisir de se croiser à Strasbourg!

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

t-shirt pour la PyConFR 2024 à Strasbourg, t-shirt noir avec un logo sur le haut représentant un serpent rouge enroulé comme un bretzel, en-dessous se trouve les informations "PyConFR - 2024 Strasbourg"

Lire la suite…

Python et Dynamo pour Revit

by Patrick from AFPy discuss

Bonjour, je m’appelle Patrick Emin, webmaster du site Dessein-tech.com. Mon site est dédié à la CAO Autodesk et aux nouvelles technologies (sous Discourse). J’y propose entre autres une rubrique sur le développement et la programmation, avec un accent particulier sur Dynamo et son langage Python pour Revit. C’est pourquoi j’ai partagé l’adresse de votre site sur le mien, afin que ceux qui souhaitent approfondir leurs connaissances en Python puissent y trouver des ressources utiles.

J’ai trouvé votre site sur discover.discourse :smiley:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Only 10 days to go until the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Plus que 10 jours avant la PyConFR 2024, se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Un jeu vidéo en encart de Jeux et Stratégies : Le Sceptre Maudit v0.2

by Julien Laumonier from Linuxfr.org

D'où ça vient ?

Depuis un temps certain, je souhaite programmer des jeux vidéos. Un de mes plus vieux exemples est un (début de) jeu que j'avais appelé Sorciers et Sortilèges et que j'avais programmé en Basic.

sets-basic.gif

Je n'ai jamais terminé ce jeu pour des raisons techniques de gestion de mémoire, mais surtout parce que je n'avais aucune idée de ce que je voulais réaliser. Bref, à titre d'archive, ce jeu est disponible sous licence CC BY-SA 4.0 si quelqu'un est intéressé à y jeter un oeil : https://gitlab.com/jlaumonier/sets-qb.git

Implémenter un jeu : le Sceptre Maudit

Mais ce n'est pas pour ça que je fais cette annonce aujourd'hui. En fait, comme je n'ai pas arrêté d'essayer de programmer des jeux, je me suis pour l'instant réorienté vers la réimplémentation de jeux existants, et principalement des jeux de plateau. Ça me permet de me concentrer sur la partie technique pour la base et en parallèle, je pense à quelle sorte de jeu je veux vraiment faire.

Donc, je me suis mis au Python et j'ai commencé par "Le Sceptre Maudit" provenant du Jeux et Stratégies no 38 et je sors aujourd'hui la version 0.2. Cette version permet de créer un personnage, de se déplacer sur le plateau et d'ouvrir/casser des portes. Il permet aussi de jouer à plusieurs via un réseau local.

À 1 seul joueur :
sceptremaudit-v0.2-solo.gif

Et à plusieurs :
sceptremaudit-v0.2-2players.gif

La version 0.2 est disponible pour linux et win64 : https://gitlab.com/jlaumonier/encartgames/-/releases/v0.2. Le code source est disponible sous licence CC BY-SA-NC 4.0 sur gitlab : https://gitlab.com/jlaumonier/encartgames.git

Py MAS Engine Plateform

Ce jeu est basé sur une bibliothèque multiagent, que je développe en parallèle, Pymasep (qui vient de sortir en version 0.2 aussi), et que je n'ose pas vraiment appeler un moteur de jeu, mais que je ne sais pas vraiment comment classer. C'est un mélange entre moteur de simulation et moteur de jeu, mais sans avoir totalement les caractéristiques propres à chacun.

Sans trop rentrer dans les détails, cette bibliothèque vise à utiliser des concepts le plus près possible des véritables concepts des jeux en général, un peu à la manière d'une architecture orientée domaine et bien sûr avec une architecture orientée agents. Pour cela, elle s'appuie sur des modèles théoriques comme le DEC-POMDP et les Graphes conceptuels. D'un point de vue technique, elle est basée sur pygame-ce et pygame-gui pour la partie affichage.

Elle est disponible comme paquet pypi et sur gitlab sous license MIT :

https://pypi.org/project/pymasep/

https://readthedocs.org/projects/pymasep/

https://gitlab.com/jlaumonier/pymasep

Pour un exemple d'utilisation de Pymasep avec une implémentation simple de l'algorithme Q-Learning sur le jeu de Chat et Souris : https://gitlab.com/jlaumonier/pymasep-examples

Cat/Mouse Qlearning

Si vous trouvez ça intéressant, faites-moi signe, ça m'indiquera à quel point je continuerai les annonces des nouvelles sorties. Aussi, si vous connaissez des communautés sur Internet qul pourraient être intéressées, dites-le-moi ou n'hésitez pas à partager l'annonce.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Panversion, un outil pour comparer des numéros de versions simplement

by Mindiell from AFPy discuss

Coucou ici,

J’ai créé une toute petite librairie nommée “panversion” permettant de comparer et donc trier des versions.
L’idée de base c’est de l’utiliser dans mon autre projet “packmon”, mais je voulais la séparer pour qu’elle puisse potentiellement servir à d’autres projets.

Elle support les versions sémantiques et les versions specifiers de Python pour le moment. Si vous connaissez un autre système de numérotation de version, ça m’intéresse ;o)

Le lien : panversion · PyPI

14 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Ce que j'ai appris en créant le backend Python pour YTO

by Matthieu Segret from Human coders

Cet article explore les leçons tirées de la création du backend Python pour YouTube Transcript Optimizer (YTO). L’auteur partage des réflexions sur la conception de l’architecture, l’optimisation des performances, la gestion des erreurs et les défis rencontrés lors du développement. Il offre des conseils pratiques pour les développeurs cherchant à créer des services backend efficaces et bien structurés.


Commentaires
L'article Ce que j'ai appris en créant le backend Python pour YTO a été posté dans la catégorie Python de Human Coders News

Lire la suite…

Comparaison des performances : Python 3.12 vs Python 3.13

by Camille Roux from Human coders

Cet article examine les différences de performances entre Python 3.12 et Python 3.13 à travers divers tests et benchmarks. L’auteur compare la vitesse d’exécution, l’efficacité mémoire, et d’autres métriques clés pour évaluer les améliorations apportées par la nouvelle version. Il met également en lumière les nouveaux ajustements internes du langage qui impactent les performances des applications Python dans différents contextes. All tests were run o


Commentaires
L'article Comparaison des performances : Python 3.12 vs Python 3.13 a été posté dans la catégorie Python de Human Coders News

Lire la suite…

Dernières nouvelles de FPDF2

by Lucas-C from Human coders

Cet article présente les dernières mises à jour de FPDF2, une bibliothèque Python pour la génération de fichiers PDF. Il détaille les nouvelles fonctionnalités, les corrections de bugs et les améliorations de performance, ainsi que les contributions récentes de la communauté. FPDF2 continue d’évoluer avec des ajouts comme la prise en charge de nouvelles polices et des outils pour faciliter la création de documents PDF personnalisés.


Commentaires
L'article Dernières nouvelles de FPDF2 a été posté dans la catégorie Python de Human Coders News

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Only 17 days to go until the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Plus que 17 jours avant la PyConFR 2024, se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

écrire du code dans le corps d'une classe python

by jtremesay from Linuxfr.org

Découverte que je viens de faire à l'instant : il est possible d'écrire du code dans le corps d'une classe python, et ce code est exécuté automatiquement au chargement du module.

Exemple :

import datetime

class MyClass:
    if datetime.datetime.now().isoweekday() == 5:
        current_day = "trolldi"
        for i in range(10):
            print("TODAY IS", current_day, "!!!!!!!!")
    else:
        current_day = "pas trolldi"

print("current_day:", MyClass.current_day)
$ python3 bla.py
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
TODAY IS trolldi !!!!!!!!
current_day: trolldi

Voila, c'est tout. Bisous et bon weekend à tous !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur la consommation énergétique de Python

by mdk from AFPy discuss

Je lis parfois que Python « c’est pas green » et que les vrais écolos devraient coder en C pour économiser du charbon.

Je viens de voir passer une étude intéressante à ce sujet :

https://arxiv.org/pdf/2410.05460

Une partie de leur conclusion :

Our results suggest that the choice of programming language has no significant impact on energy consumption beyond runtime. Programmers aiming to reduce energy consumption can do so even in “inefficient” programming languages like Python by using faster language implementations, employing faster algorithms, and using fast third-party (native) libraries.

Voilà, boom !

On est pas bien, là, tranquilles, dans notre biais de confirmation ?

9 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Alexandre Astier code en Python

by rewind from Linuxfr.org

Lors d'une interview qu'il a donné à la chaîne Youtube Legend, Alexandre Astier répond à une série de rumeurs le concernant. Une de ces rumeurs est : «Tu envoies toi-même tes courriers recommandés quand c'est les scénarios pour fermer toi-même l'enveloppe et les amener à la Poste». Ce à quoi il répond : «Tellement pas ! C'est complètement faux. Il n'y a pas de courrier, il n'y a pas de version papier, je code mes PDF et les PDF sont mis sur un serveur avec un autre code et une autre interface qui est générée par une appli Python que j'ai écrite moi-même. Les mecs, je les attends»

Il sait vraiment tout faire ce gars, c'est assez exceptionnel.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Nouveautés de Python 3.13

by Matthieu Segret from Human coders

La version 3.13 de Python apporte des améliorations majeures, dont la désactivation possible du Global Interpreter Lock (GIL) pour un multi-threading optimisé et l’intégration du compilateur Just-in-Time (JIT). Ces nouveautés améliorent les performances et la gestion des threads, offrant aux développeurs des gains d’efficacité notables. D’autres optimisations et corrections rendent cette version essentielle pour les utilisateurs de Python.


Commentaires
L'article Nouveautés de Python 3.13 a été posté dans la catégorie Python de Human Coders News

Lire la suite…

:loudspeaker: Appel à volontaires pour la PyConFR 2024 !

by ReiNula from AFPy discuss

Cher·e·s membres de la communauté Python,

La PyConFR 2024 approche à grands pas et nous avons besoin de votre aide pour faire de cet événement un succès inoubliable ! Que vous soyez un habitué·e de la PyCon ou un·e nouvelle·au venu·e désirant contribuer, il y a une place pour vous dans notre équipe.

Nous recherchons activement des volontaires pour de la PyConFR pour :

Organisation de l’événement : Que ce soit sur place ou en amont, toutes les formes d’aide sont les bienvenues pour organiser la PyConFR. Que vous souhaitiez aider à mettre en place les salles, gérer l’accueil des participants, coordonner les sessions ou contribuer à la logistique générale, votre contribution sera grandement appréciée.

Si vous êtes intéressé·e à vous impliquer, veuillez répondre à ce post en indiquant votre domaine d’intérêt ou contactez-nous directement par message privé. Ensemble, faisons de la PyConFR 2024 un événement mémorable et inclusif pour tous !

Merci pour votre soutien et votre engagement !

L’équipe organisatrice de la PyConFR 2024

26 messages - 16 participant(e)s

Lire le sujet en entier

Lire la suite…

Hacker des radios pour une exposition / Musée d'Aquitaine

by NicolasBeirnaert from AFPy discuss

Bonjour à tous, je me présente, Nico, j’ai filmé la dernière Pycon avec mon association, Raffut, et je serai là pour filmer celle qui arrive à Strasbourg.
J’ai aussi un vrai métier, je suis technicien audiovisuel au Musée d’Aquitaine. En Mai, se tiendra une importante exposition sur l’immédiate après-guerre dans la région bordelaise.
Le commissaire d’exposition a proposé une idée intéressante : mettre tout au long du parcours de l’exposition des radios anciennes “hackées” pour diffuser des archives d’époque. En gros on tourne un potard, ça change d’archive sonore, et idéalement ça fait un petit bruit de modulation de fréquence à l’ancienne quand on change de “station”.
L’idée est super, le problème c’est que c’est sur moi que ça tombe, et je ne suis pas du tout compétent pour ce qui est de l’interaction entre le potard et le matériel qui va lire les sons (genre un orangepi, un ESP32 ou équivalent je suppose?). J’ai des notions, j’ai une idée de comment faire, mais j’ai besoin d’aide, je ne pense pas pouvoir devenir une bête de Python en 6 mois.
Je me suis inscrit au Fablab de la fac de Bordeaux, déjà, et je vais donner des nouvelles régulières de l’avancement des travaux ici, mais je prendrai toute lumière que vous pourrez apporter.
Evidemment, l’idée est de détailler ce projet sur un wiki, et rendre tout ouvert à la fin. C’est pour un musée, ça doit être ouvert à tous, réparable, et si possible durable.

11 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Mon équipe idéale

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

Introduction #

3 ans chez Arolla : un bilan #

Le 18 octobre 2024 cela fera trois ans exactement que j’aurai rejoint Arolla - une ESN à Paris où j’aurai beaucoup appris, et aussi beaucoup transmis, en tout cas c’est ce que j’espère.

J’ai par exemple eu l’opportunité de découvrir le métier de coach, en accompagnant une dizaine d’équipes sur des sujets divers et dans des contextes variés, et même effectué une courte mission de conseil avec le CTO d’Arolla, Cyrille Martraire.

Au final, j’ai rencontré beaucoup de monde, que ce soit les autres consultants et consultantes d’Arolla, les équipes que j’ai rejointes pour des missions de développement ou de coaching, et enfin toutes les personnes que j’ai formées. Ces rencontres ont souvent été extrêmement enrichissantes.

J’en profite pour remercier ici celles et ceux avec qui j’ai pu avoir des discussions passionnantes et qui m’ont également aidé et soutenu quand j’en avais besoin - j’espère avoir pu vous aider en retour.

À la recherche d’un nouvel emploi #

Malheureusement, toutes les bonnes choses ont une fin et, mon contrat avec Arolla se terminant bientôt, je me retrouve depuis la semaine dernière sur le marché du travail.

Celles et ceux qui me connaissent savent que je préfère par-dessus tout travailler dans une équipe où je me sens bien, et que rien ne me plaît davantage que de résoudre des problèmes complexes à plusieurs.

Ainsi, au-delà des aspects pratiques (le lieu géographique, le domaine d’activité, le salaire, etc.), ce sont bien les caractéristiques de l’équipe que je serais amené à rejoindre qui vont être déterminantes dans le choix de mon prochain poste, et je vais tenter de les détailler ici.

Mon équipe idéale #

D’abord, elle assure la sécurité psychologique des personnes qui la compose:

  • La santé et le bien-être des membres de l’équipe (et de leurs proches) passent toujours avant les considérations commerciales ou financières.
  • L’equipe dispose d’un code de conduite clair (notamment sur les blagues déplacées), de personnes qu’on peut contacter si l’on se sent mal à l’aise, et d’un dispositif pour prendre des sanctions rapides le cas échéant si jamais le code de conduite n’est pas respecté.
  • Elle prend le temps de bien faire les choses bien plutôt que de subir des pressions et de prendre des raccourcis.
  • Les personnes qui la composent prennent soin les unes des autres.

Ensuite, elle se repose sur l’intelligence collective :

  • Elle utilise une communication douce et positive, à la fois entre les membres et avec les autres équipes autour d’elle
  • Elle pratique la recherche du consensus et une certaine forme de démocratie interne
  • Elle cultive une atmosphère où les erreurs sont perçues comme des occasions d’apprendre plutôt que des échecs qui doivent être sanctionnés.
  • Ses membres travaillent régulièrement à plusieurs, que ce soit en binôme ou par petits groupes.
  • Elle se retrouve régulièrement (en présentiel de préférence) pour prendre de la hauteur sur ses méthodes de travail et ses outils - et trouver des solutions concrètes pour améliorer le quotidien de ses membres.

Enfin, elle est composée de personnes diverses et variées. Ces différences sont respectées et sont une source de réflexion et de partage.

Côté code (parce que je compte bien continuer à développer 😉 ) :

  • Les postes de travail sont agréables à utiliser, sans restrictions inutiles.
  • L’équipe emploie déjà des méthodes Craft (telles que le TDD, le pair programming, ou la programmation à plusieurs) - ou est volontaire pour les découvrir et les mettre en place au quotidien.
  • L’équipe travaille dans en domaine riche en complexité métier - et elle peut discuter facilement avec les utilisateurs finaux des applications qu’elle développe.
  • Enfin, elle utilise un langage que j’apprécie (ça peut aller de Rust à Python en passant par Java et TypeScript) - dans un contexte où je suis compétent (le backend d’applications web, ou les outils en ligne de commande). Cela dit je suis ouvert à l’exploration d’autres contextes.

Conclusion #

Je ne sais pas si une telle équipe existe : j’en ai croisé quelques-unes qui y ressemblaient beaucoup - et je pense avoir pu contribuer modestement à faire progresser celles dans lesquelles je me trouvais dans la bonne direction. Je pense aussi que dans les bonnes conditions, cet idéal est non seulement souhaitable mais atteignable.

Si vous partagez cette vision - et encore plus si vous connaissez une équipe proche de celle que j’ai décrite (et qui recrute à Paris ou pas loin) - alors faites-moi signe (dans les commentaires ou via ma page de contact) - et n’hésitez pas à relayer cet article autour de vous.

Sinon, si cette vision vous semble trop idéaliste, alors le prendrai comme un compliment 😎.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Only 24 days to go until the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Plus que 24 jours avant la PyConFR 2024, se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Programme qui se vérifie lui-même pour voir s'il a été modifié

by desktop.ready from Linuxfr.org

Je vous propose un challenge intéressant avec un début de réponse: comment écrire un programme qui se teste lui-même pour savoir s'il n'a pas été modifié.
(bien sûr cela ne compte pas d'utiliser la date de modification du fichier)

Bien entendu "cela ne peut pas marcher car on peut toujours modifier le programme pour enlever l'étape de vérification" et le sujet a sans doute été maintes fois abordés de manière bien plus complexe par ceux qui luttent contre le piratage ou la tricherie.

Mais j'ai trouvé l'idée rigolote d'essayer d'inclure un checksum du code dans le code lui-même.

J'ai donc implémenté cela en utilisant l'algorithme Luhn mod N et cela donne ça en Python 3:

import argparse, string

def GenerateCheckCharacter(codepoints, text):
    factor = 2
    summation = 0
    n = len(codepoints)

    for i in range(len(text)-1, -1, -1):
        codePoint = codepoints.index(text[i])
        addend = factor * codePoint
        factor = 1 if (factor == 2) else 2
        addend = int(addend / n) + (addend % n)
        summation += addend

    remainder = summation % n
    checkCodePoint = (n - remainder) % n

    return codepoints[checkCodePoint]

def ValidateCheckCharacter(codepoints, text):
    factor = 1
    summation = 0
    n = len(codepoints)

    for i in range(len(text)-1, -1, -1):
        codePoint = codepoints.index(text[i])
        addend = factor * codePoint
        factor = 1 if (factor == 2) else 2
        addend = int(addend / n) + (addend % n)
        summation += addend

    remainder = summation % n
    return (remainder == 0)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Luhn mod N algorithm demonstration')
    parser.add_argument('--codepoints', type=str, nargs='?', default = string.printable, help='Verify file')
    parser.add_argument('--generate', type=str, nargs='?', default = None, help='Generate check character to add at the end of the file')
    parser.add_argument('--verify', type=str, nargs='?', default = None, help='Verify file')
    args = parser.parse_args()

    if args.generate:
        filename = args.generate
    elif args.verify:
        filename = args.verify
    else:
        filename = __file__

    with open(filename) as fp:
        text = fp.read()[:-1]

    if args.generate:
        character = GenerateCheckCharacter(args.codepoints, text)
        print(f"Character to add at the end of the file: '{character}' (character code {args.codepoints.index(character)})")
    else:
        character = text[-1]
        print(f"Character found at the end of the file: '{character}' (character code {args.codepoints.index(character)})")
        print(f"File is verified: {ValidateCheckCharacter(args.codepoints, text)}")

    print("Script ended successfully")
    # <

Vous pouvez donc voir le "checksum" à la fin du code. Notez bien que j'enlève le vrai dernier caractère (retour à la ligne) pour l'algorithme.
Si on modifie le code, le "checksum" va changer et la vérification ne marchera plus.

Ce que je n'ai pas réussi à faire, c'est de me passer d'ajouter ce dernier caractère.
Normalement le dernière caractère c'est un retour à ligne et si on est malin on peut modifier astucieusement le dernier print pour que le "checksum" corresponde exactement à un retour à la ligne.

J'image qu'il faut tenter une approche "brute-force" en générant des phrases autour de variations ("Script ended perfectly", "Script executed without issues", "No errors detected", etc.). Mais pour l'instant cela dépasse mes compétences, mais si vous voulez tenter…
Ce serait vraiment rigolo car cela rendrait vraiment le programme assez mystérieux pour les non-initiés.

Voilà, j'ai trouvé cet algorithme Luhn Mod N assez sympathique et je souhaitais partager cela avec vous.
Peut-être que vous avez d'autres algorithmes dans ce genre pour la même utilisation ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Tout ce que vous devez savoir sur Python 3.13 – JIT et suppression du GIL

by Matthieu Segret from Human coders

Cet article présente les deux grandes innovations de Python 3.13 : la possibilité de désactiver le Global Interpreter Lock (GIL) pour un multi-threading plus efficace et l’introduction du Just-in-Time (JIT) compiler pour des performances accrues. Il détaille les implications de ces changements pour les développeurs, en particulier en ce qui concerne les performances des tâches lourdes en calcul.


Commentaires
L'article Tout ce que vous devez savoir sur Python 3.13 – JIT et suppression du GIL a été posté dans la catégorie Python de Human Coders News

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Only 31 days to go until the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Plus que 31 jours avant la PyConFR 2024, se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Ingénieur spécialisé en courants faibles et très bon en Python et C# (Alsace)

by Fabrice-64 from AFPy discuss

En tant que programmeur de systèmes de courants faibles du bâtiment vous serez responsable du développement, de la programmation et de la mise en service de solutions logicielles courants faibles et de sureté électronique.

Ce poste requiert des compétences techniques avancées dans la programmation de logiciels, ainsi qu’une solide compréhension des solutions et architectures numériques de systèmes bâtimentaires.

Responsabilités

  • Programmation logiciel : programmer des logiciels pour les systèmes de courants faibles, tels que les systèmes de contrôle d’accès, les systèmes de vidéosurveillance, les systèmes de détection d’intrusion, les automates etc.
  • Personnalisation des systèmes : Adapter les solutions logicielles existantes aux besoins spécifiques des clients, en tenant compte de leurs exigences et de l’environnement dans lequel les systèmes seront déployés.
  • Intégration des solutions : Intégrer et configurer les différentes solutions de courants faibles entre elles, en veillant à leur interopérabilité et à leur fonctionnement harmonieux.
  • Tests et débogage : Effectuer des tests rigoureux sur les systèmes programmés pour s’assurer de leur bon fonctionnement et résoudre les éventuels problèmes de compatibilité ou de performance.
  • Mise en service : Installer, configurer et mettre en service les systèmes de courants faibles sur site, en travaillant en étroite collaboration avec les équipes techniques et les clients.
  • Formation des utilisateurs : Former les utilisateurs finaux aux procédures d’utilisation, afin de garantir une adoption efficace.
  • Veille technologique : Rester informé des dernières avancées technologiques dans le domaine des systèmes de sureté et des courants faibles, et recommander des améliorations en conséquence.

Profil

  • Titulaire d’une formation BAC+3/5 en informatique, génie électrique, génie informatique ou domaine connexe, vous justifiez d’une expérience professionnelle pertinente dans la programmation de logiciels, de préférence dans le domaine des systèmes de sûreté ou de courants faibles.
  • Vous connaissez les protocoles de communication réseau et normes de sécurité informatique ainsi que des langages de programmation courants tels que C#, HTML5, Python etc…
  • Autonome, vous disposez de compétences en communication et savez collaborer efficacement avec les équipes techniques et les clients.
  • La connaissance des logiciels BACNET, MODBUS, PCVue, Panorama, Genetec, AppVision, ObsManager serait un plus.

Info en plus

  • On est assez ouvert sur le profil,
  • La personne va travailler à 70% sur Hindisheim pour faire de la programmation et à 30% sur le terrain ( mise en service sur site, formation du client …) Déplacement sur l’Alsace
  • Travaillera sur des clients tertiaires / industrie
  • Type de programmation sur des systèmes de surveillance, intrusion, contrôle d’accès …)

Pour toute info, s’adresser à :
conseil@justinelepaulard.com
07.72.72.51.58

Et je précise: je n’ai aucun intérêt commercial dans l’affaire !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Only 35 days to go until the PyConFR 2024, taking place from October 31 to November 3 in Strasbourg. Registration is mandatory but free of charge.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Plus que 35 jours avant la PyConFR 2024, se déroulant du 31 octobre au 3 novembre à Strasbourg, inscription obligatoire mais gratuite

Lire la suite…

Introduction à l'UX, présentation d'une présentation

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

Expérience utilisateur, sensibilisation et périmètre

Etant l'unique designer de l'équipe de Yaal Coop à ce jour et depuis l'ouverture de la SCIC en 2020, j'ai réalisé courant 2023 une petite présentation de sensibilisation à l'UX, ou Expérience Utilisateur, à destination du reste de l'équipe.

On trouvait ça dommage de tout garder pour nous, alors c'est accessible à tous⋅tes !

La présentation, en format pages web, est accessible à tous⋅tes sur notre site à l'adresse https://yaal.coop/ux/index.html. Elle regroupe quelques notions de base d'UX, comme son périmètre, son interconnexion avec les métiers adjacents (conception, développement, communication, support...), quelques éléments sur lesquels être vigilants à chaque étape de conception, et quelques outils pratiques d'expérience utilisateur et de design.

La vision proposée dans cette courte présentation survole un sujet vaste et qui mérite beaucoup plus d'heures et d'assiduité pour connaître tous ses rouages. J'espère qu'elle peut inspirer des développeurs et développeuses à s'y pencher plus en profondeur !

Lire la suite…

Contributions à des logiciels libres par l'équipe Yaal Coop durant l'été 2024

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

Mécénat

Pygments

Bibliothèque Python de coloration syntaxique

PSPSDK

Ensemble d'outils et de bibliothèques pour la console PSP de Sony

apt-setup

Partie de Debian-Installer. Produit un fichier /etc/apt/sources.list pour le système installé

scim2-models

Sérialisation et validation de ressources SCIM avec Pydantic

scim2-client

Fabrication et analyse pythonique de requêtes SCIM

scim2-tester

Outil de vérification de conformité de serveurs aux normes SCIM

scim2-cli

SCIM application development CLI

scim2-server

Lightweight SCIM2 server prototype

authlib

Bibliothèque python de gestion des identités et des accès

synapse

Serveur Matrix écrit en Python/Twisted

pydanclick

Ajoutez des options Click à partir de modèles Pydantic

canaille

Serveur d’identité et d'autorisations ultra-léger

Lire la suite…

Summer 2024 FOSS contributions from by the Yaal Coop team

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

Sponsoring

Pygments

Pygments is a generic syntax highlighter written in Python

PSPSDK

Collection of tools and libraries written for Sony's Playstation Portable (PSP) gaming console

apt-setup

Part of Debian-Installer. Generate an /etc/apt/sources.list for the installed system

scim2-models

SCIM resources serialization and validation with Pydantic

scim2-client

Pythonically build SCIM requests and parse SCIM responses

scim2-tester

SCIM RFCs server compliance checker

scim2-cli

SCIM application development CLI

scim2-server

Lightweight SCIM2 server prototype

authlib

Identity and Access management library for python

synapse

Matrix homeserver written in Python/Twisted

pydanclick

*Add click options from a Pydantic model *

canaille

Lightweight identity and authorization management software

Lire la suite…

Recherche à facette

by mdk from AFPy discuss

Contexte : je travaille sur un django oscar : une boutique avec des produits qui ont des caractéristiques.

J’essaye de mettre en place une « recherche à facette » sur les caractéristiques, le truc classique qu’on trouve sur toutes les boutiques en ligne, à gauche, par exemple pour sélectionner une ou plusieurs marques, type, fréquence, format…

J’ai tenté comme Oscar fait, d’utiliser django-haystack avec Apache Solr derrière.

Point positif : ça marche, c’est assez simple à mettre en place, juste besoin de décrire les attributs de produit qu’on utilise et django-haystack s’occupe de parler à Solr (insertion des produits, mise à jour des produits, et recherche), c’est propre.

Souci : je n’arrive à requêter qu’avec des “et”, çàd si j’ai des tshirt bleus, rouges, et noirs, de taille S, M, ou L, je peux faire la requête “bleu et M”, mais pas la requête “bleu et (M ou L)”. J’arrive à faire “bleu et M et L” mais ça ne renvoie (évidemment) rien.

cf. une issue chez django-haystack où j’en parle aussi :

Une idée ?

5 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

PyConFR 2024, planning et inscriptions

by grewn0uille,Benoît Sibaud,gUI from Linuxfr.org

La PyConFR 2024 a lieu du jeudi 31 octobre au dimanche 3 novembre à l’UFR Mathématique et d’Informatique de Strasbourg. Le planning est disponible et les inscriptions sont ouvertes !

Comme toujours, la PyConFR est un évènement gratuit et l’inscription est obligatoire.

Les deux premiers jours de la conférence seront occupés par les sprints. Et les deux jours suivants seront dédiés aux conférences (longues et courtes) et ateliers.

Trois keynotes sont également au programme :

  • De villageoise à l’itWoman… Quelles actions pour faire de mon rêve TECH une réalité ?, par Houleymatou Baldé
  • Recherche des bonnes pratiques de packaging, par Françoise Conil
  • Reality is not an end-to-end prediction problem: Applied NLP in the age of Generative AI, par Ines Montani

Cette année, un espace enfants (de 3 ans à 12 ans) est mis à disposition gratuitement sur inscription. Vous pouvez inscrire vos enfants jusqu’au 15 octobre.

Durant cette édition, c’est aussi le retour du déjeuner PyLadies. Un des objectifs est de tisser des liens entre la communauté PyLadies et le reste de la communauté Python francophone.
Les inscriptions au déjeuner PyLadies sont ouvertes jusqu’au 27 octobre.

Le dimanche matin, l'AFP y tiendra son assemblée générale. Si vous souhaitez y voter, assurez vous d'être à jour de cotisation.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

PyConFR 2024 : Planning et inscriptions

by grewn0uille from AFPy discuss

Hello tout le monde,

Le planning de la PyConFR 2024 est disponible !

Comme toujours, la PyConFR est un évènement gratuit et l’inscription est obligatoire.

Les deux premiers jours de la conférence seront occupés par les sprints. Et les deux jours suivants seront dédiés aux conférences (longues et courtes) et ateliers.

Trois keynotes sont également au programme :

Cette année, un espace enfants (de 3 ans à 12 ans) est mis à disposition gratuitement sur inscription. Vous pouvez inscrire vos enfants jusqu’au 15 octobre.

Durant cette édition, c’est aussi le retour du déjeuner PyLadies. Ce déjeuner, gratuit, est destiné à rassembler les femmes (cis et trans), les hommes trans, les personnes non-binaires ou les agenré⋅es qui font du Python, et a pour but de les aider à devenir des membres actifs et des moteurs de la communauté. Un des objectifs est également de tisser des liens entre la communauté PyLadies et le reste de la communauté Python francophone.

Les inscriptions au déjeuner PyLadies sont ouvertes jusqu’au 27 octobre.

Le dimanche matin, l’AFPy tiendra son assemblée générale. Si vous souhaitez y voter, assurez vous d’être à jour de cotisation.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Workshop PyClermont | 25 sept à 18h30

by drigaudie from AFPy discuss

Hello,

Workshop PyClermont

2024-09-25 18:30 (Europe/Paris) → 2024-09-25 21:30 (Europe/Paris)

Venez partager notre 1er workshop de 18h30 à 21h30 le mercredi 25 sept de 18h30 à 20h30

Mettre en place de l’observabilité sur un projet Flask

par Fabien VERGNES

Nous serons accueilli par notre partenaire Simplon.co qui nous met à disposition ses locaux ainsi que des rafraichissement pour tenir ce workshop

Pensez à bien emmener votre ordinateur, notre animateur vous proposera de mettre les mains dans le cambouis

Inscription OBLIGATOIRE sur le meetup du groupe Mettre en place de l'observabilité sur un projet Flask, Wed, Sep 25, 2024, 6:30 PM | Meetup

Infos : PyClermont #7

Au plaisir

2 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

PyData Paris 2024 | 25-26 Septembre à la Cité des Sciences

by SylvainCorlay from AFPy discuss

Nous sommes ravis d’annoncer la prochaine édition de PyData Paris 2024, le rassemblement de la communauté open-source de la science des données et de l’IA/ML en France.

PyData Paris se tiendra à la Cité des Sciences du 25 au 26 septembre 2024. Organisé par QuantStack et NumFOCUS, cet événement promet de réunir les mainteneurs et les passionnés de l’open-source scientifique, ainsi que des experts du monde entier, tous unis par leur passion pour les technologies open-source.

PyData Paris 2024 rassemble la communauté florissante de l’open-source scientifique et de l’IA/ML à Paris, mettant en lumière l’écosystème en pleine expansion qui inclut des acteurs clés tels que Hugging Face et Mistral AI, des projets open-source comme scikit-learn et Jupyter, ainsi que des éditeurs de logiciels open-source comme :probabl. et QuantStack.

Nous sommes honorés de présenter une série de keynotes de renom qui partageront leur expertise :

Sophia Yang

Sophia Yang

Sophia Yang est « developer advocate » et chercheuse en IA chez Mistral AI, une entreprise qui développe des technologies d’IA générative ouvertes pour les développeurs et les entreprises.

Katharine Jarmul

Katharine Jarmul

Katharine Jarmul est une militante pour la vie privée et une « data scientist » internationalement reconnue, dont le travail et la recherche se concentrent sur la vie privée et la sécurité des workflows de data science. Elle est l’auteure de « Practical Data Privacy » et travaille dans le domaine de la vie privée et de l’apprentissage automatique depuis sept ans.

En plus de ces réalisations professionnelles, Katharine est la cofondatrice du mouvement mondial PyLadies, qui vise à promouvoir et à autonomiser les femmes dans les communautés Python et de la science des données.

Olivier Grisel

Olivier Grisel

Olivier Grisel est un ingénieur en apprentissage automatique chez :probabl. et un mainteneur de la bibliothèque scikit-learn. Olivier est diplômé de l’Imperial College London et de l’ENSTA ParisTech.

Merve Noyan

Merve Noyan

Merve Noyan est une ingénieure en machine learning et chercheuse en « computer vision » chez Hugging Face. Merve travaille à rendre le machine learning plus accessible à tous en développant et en documentant des technologies de machine learning de pointe.

En plus de ces quatre keynotes, le programme de PyData Paris compte plus de quarante présentations. Il peut être consulté sur le site pydata.org/paris2024. Les tickets sont aussi en vente sur le même site.

Pour rester aux faits des dernières nouvelles, n’hésitez pas à vous abonner aux comptes de PyData Paris sur les réseaux sociaux :

Si vous êtes intéressés par cette communauté open-source, n’hésitez-pas à rejoindre le groupe Meetup PyData-Paris, qui compte aujourd’hui plus de 4600 membres.

Sylvain Corlay
CEO @ QuantStack
General Chair @ PyData Paris 2024
Director @ NumFOCUS

2 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

exposer le système de fichiers local dans le navigateur à l'aide d'une solution toute faite

by kirisakow from AFPy discuss

Bonjour, mes propres recherches sur Google et GitHub n’ayant pas donné de résultat satisfaisant pour le moment, je viens ici pour solliciter vos connaissances et recommandations.

Je cherche une solution pour exposer le système de fichiers local dans le navigateur avec la possibilité de les manipuler à distance. Souhaits particuliers :

  • une solution toute faite et fonctionnellement complète (serveur + front-end + fonctionnalités CRUD), donc principalement sous forme d’un paquet / package ou d’une image Docker ;

  • néanmoins plus récente que, par exemple, un projet comme flask-file-server (au point mort depuis au moins 4 ans et toujours sous python 2.7), le seul du genre que j’ai su trouver jusqu’ici ;

  • et enfin, plus conviviale que le rendu front-end minimaliste de la technique de base qu’est

    python -m http.server
    

    et qui sera mon choix par défaut si je ne trouve pas mieux que ça.

Update: D’autres projets trouvés

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Machine Learning NLP Python Engineer - client Radio France Maison de la Radio Paris 16e

by baptistealexandre from AFPy discuss

:radio::fr: Notre client Radio France recherche un·e Machine Learning Engineer avec expérience importante en #NLP, pour avoir un rôle de Lead.
50% de télétravail, dans les locaux de Radio France situés dans la Maison de la Radio Paris 16e.
Prestation temps plein freelance ou portage salarial.

Contact par email :e-mail: alex@alxdr.com, LinkedIn (Baptiste Alexandre) ou sur le discord AFPy (baptistealexandre).

Python, TensorFlow, PyTorch, scikit-learn, Numpy, Pandas, Kubernetes, Postgres.

Exemples de projets :
Conception d’un algorithme chapitrage automatique de podcast basé sur le transcript,
Détection de la géolocalisation d’articles et de contenus audio,
Optimisation d’un moteur de recherche sémantique fait maison,
Fine-tuning de Whisper pour améliorer la qualité de la transcription,
Détection de moments clés dans un contenu audio pour aider à la découpe d’extraits.

3 à 10+ ans d’expérience en data science, avec une partie importante en NLP.
Nous préférerons la motivation à la séniorité.

Data science :
Forte expertise sur le domaine du NLP
Maîtrise des techniques d’apprentissage automatique (Machine learning)
Excellente connaissance des bibliothèques open source clés telles que TensorFlow, PyTorch, scikit-learn, Numpy, et Pandas
Une expérience en traitement automatique du signal audio sera appréciée
Une appétence pour la veille technologique

Software/data engineering :
Parfaite maîtrise de Python
Appétence pour les travaux de préparation de données
Bonnes dispositions pour la mise en oeuvre de la CI/CD, comme Gitlab-CI
Connaissance de Kubernetes / Postgres appréciée

Soft skills :
Une parfaite autonomie est un critère essentiel pour cette mission. La personne devra être en capacité de mener à bien des projets de R&D en autonomie technique et tactique. Il devra être capable de faire des choix techniques et de prendre des décisions pour répondre aux découvertes et difficultés rencontrées lors de ses travaux exploratoires
Un réelle aptitude à communiquer des concepts techniques à des non-experts, notamment pour expliquer les résultats des projets R&D aux autres membres de l’équipe et aux parties prenantes.
Une capacité à travailler efficacement en équipe, avec parfois des échanges interdisciplinaire (journalistes, documentalistes, etc.).

Aspect primordial : nous cherchons une personne motivée, autonome et bonne communicante pour être à l’aise sur des travaux exploratoires dans une équipe de R&D.

Enfin, un intérêt pour les médias et une capacité à être force de proposition pour de nouvelles idées seront des éléments très appréciés.

Bonne rentrée :school_satchel:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Henskan: nouveau logiciel pour optimiser ses manga et/ou webtoons pour liseuse

by Jean Gabes from Linuxfr.org

Bonjour,

Je viens de sortir il y a quelques temps les premières versions d'un nouveau logiciel pour mettre et optimiser ses mangas ou webtoons sur liseuses (Kobo et Kindle pour l'instant) : Henskan

Aperçu de l'interface

En résumé le logiciel est capable d'aller lire sur votre poste tout un répertoire avec votre manga/webtoon, et va le découper/optimiser pour un bon affichage sur liseuse. Il va par exemple enlever les marges en trop sur les images, ou mettre une palette d'image adaptée au modèle de liseuse, permettant de diminuer la taille de l'archive sans perdre en qualité.

C'est un fork du logiciel Mangle, sous GPLv3, écrit en Python. J'étais utilisateur et contributeur depuis de nombreuses années, mais le logiciel original était resté en python 2 et a été archivé par son auteur.

J'ai donc décidé de le forker et en faire une version qui colle à mon usage, et ça pourrait intéresser du monde donc je le poste ici :)

En résumé, après avoir migré de python 2/QT3 à python3/QT6, j'ai fortement simplifié l'usage, en enlevant des fonctionnalités que je trouvaient peu pertinentes, et automatisant autant que possible ce qui était possible de faire, limitant au maximum ce qui est demandé à l'utilisateur.

A noté que le fait d'avoir peu de fonctionnalités, mais qui collent à 80% des usages est totalement assumé. Je ne compte rajouter que des fonctionnalités (ou traitements d'images) qui pourront être automatisable.

A savoir que d'autres logiciels existent dans le domaine, avec par exemple le très bon et puissant KCC, mais qui a bien trop d'options à mon goût (et qui a un algorithme de découpage de webtoon un peu limité je trouve, mais je reconnais que la problématique est complexe).

Pour l'instant seul le build pour Windows est automatisé, mais ceci attends juste des contributeurs et utilisateurs sur d'autres systèmes pour en automatiser d'autres :)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Paris - Meetup Django le 17 septembre

by sabderemane from AFPy discuss

Bonjour à toutes et à tous,

Meetup Django le 17 septembre 2024 dans les locaux d’Octopus Energy/Kraken Tech 6 Bd Haussmann, Paris.

L’occasion de se retrouver et d’en apprendre plus sur:

  • Faire du gRPC facilement avec Django par Adrien Montagu & Léni Gauffier (Français)
  • Comparatif Django / Ruby on Rails par Rémy Maucourt (Français)

Tres bonne journée à toute/s !

Django Paris Meetup - Septembre

2024-09-17 19:00 (Europe/Paris) → 2024-09-17 22:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sortie de Crème CRM en version 2.6

by GuieA_7,Benoît Sibaud,palm123,Ysabeau 🧶 from Linuxfr.org

Le 5 août 2024 est sortie la version 2.6 du logiciel de gestion de la relation client Crème CRM (sous licence AGPL-3.0), environ 11 mois après Creme 2.5 (11 septembre 2023).

Icône de Crème CRM

Au programme notamment, un système de notification, des améliorations pour le calendrier ou des filtres réservés aux rapports. Les nouveautés sont détaillées dans la suite de la dépêche.

Sommaire

Description du logiciel

Crème CRM est un logiciel de gestion de la relation client, généralement appelé CRM (pour Customer Relationship Management). Il dispose évidemment des fonctionnalités basiques d’un tel logiciel :

  • un annuaire, dans lequel on enregistre contacts et sociétés : il peut s’agir de clients, bien sûr, mais aussi de partenaires, prospects, fournisseurs, adhérents, etc. ;
  • un calendrier pour gérer ses rendez‐vous, appels téléphoniques, conférences, etc. ; chaque utilisateur peut avoir plusieurs calendriers, publics ou privés ;
  • les opportunités d’affaires, gérant tout l’historique des ventes ;
  • les actions commerciales, avec leurs objectifs à remplir ;
  • les documents (fichiers) et les classeurs.

Crème CRM dispose en outre de nombreux modules optionnels le rendant très polyvalent :

  • campagnes de courriels ;
  • devis, bons de commande, factures et avoirs ;
  • tickets, génération des rapports et graphiques…

L’objectif de Crème CRM est de fournir un logiciel libre de gestion de la relation client pouvant convenir à la plupart des besoins, simples ou complexes. À cet effet, il propose quelques concepts puissants qui se combinent entre eux (entités, relations, filtres, vues, propriétés, blocs), et il est très configurable (bien des problèmes pouvant se résoudre par l’interface de configuration) ; la contrepartie est qu’il faudra sûrement passer quelques minutes dans l’interface de configuration graphique pour avoir quelque chose qui vous convienne vraiment (la configuration par défaut ne pouvant être optimale pour tout le monde). De plus, afin de satisfaire les besoins les plus particuliers, son code est conçu pour être facilement étendu, tel un cadriciel (framework).

Du côté de la technique, Crème CRM est codé notamment avec Python/Django et fonctionne avec les bases de données MySQL, SQLite et PostgreSQL.

Principales nouveautés de la version 2.6

Voici les changements les plus notables de cette version :

Le nouveau système de notification

Depuis toujours Crème possède un système de Mémentos (Reminders), qui permet de recevoir des e-mails pour vous prévenir d’une échéance. Ce système est utilisé par les Alertes & les ToDos ; par exemple vous recevez un e-mail lorsqu’une Alerte qui vous est attribuée va expirer dans 30 minutes. Et comme vous pouvez créer des Alertes dont la date d’expiration est un champ date de la fiche associée, cela permet par exemple d’être prévenu qu’une activité importante à laquelle vous participez va bientôt avoir lieu.

Le nouveau système de notification qui a été introduit amène 2 avancées principales :

  • les notifications envoyées ne sont pas limitées à des e-mails, vous pouvez aussi les voir dans votre navigateur (donc sans quitter Crème).
  • si les mémentos ont été retravaillés pour utiliser ce nouveau système, d’autres parties de Crème en profitent aussi. Par exemple, une notification vous est envoyée si un administrateur a changé votre mot de passe ; ou bien quand un job d’import CSV vient de s’achever.

Une notification web est arrivée

Chaque notification est associée à un canal, et vous pouvez configurer les canaux pour savoir si la notification est envoyée dans le navigateur, par e-mail ou bien les 2. Si le canal n’est pas obligatoire, vous pouvez aussi choisir de ne pas recevoir les notifications du tout. Chaque utilisateur peut utiliser sa propre configuration si la configuration générale du canal ne lui convient pas.

La configuration des canaux

Améliorations du calendrier

  • Le composant JavaScript FullCalendar est passé à la version 5. Même si ce n’est pas la toute dernière version (il faut dire qu’il y a pas mal de changements cassants entre chaque version), on profite de pas mal d’améliorations diverses.
  • Il est maintenant possible de configurer graphiquement le calendrier (premier jour de la semaine, plage horaire, jour travaillés…). Il y a une configuration globale utilisée par tout le monde, mais comme presque toujours dans Creme, il est possible de créer des configurations par rôle.

La configuration des calendriers du module « Activités »

Filtres spécifiques aux Rapports

Les Rapports utilisent généralement un filtre, afin d’affiner leurs résultats. Ces filtres sont les mêmes que ceux qu’utilisent les vues en liste ; par exemple si vous faites un Rapport sur les Devis, il peut utiliser les filtres disponibles sur la liste des Devis.

Un problème que cela entraîne est que beaucoup d’utilisateurs créent des filtres un peu spécifiques afin de les utiliser dans leurs Rapports, mais ces filtres viennent « polluer » la vue en liste correspondante (car la sélection de filtres proposent de nombreux filtres non pertinents). Afin de corriger ce souci, il est désormais possible de créer des filtres utilisables uniquement dans les Rapports. Les Rapports peuvent bien sûr continuer à utiliser les filtres classiques, mais les filtres spécifiques aux Rapports ne sont pas utilisables dans les vues en liste évidemment.

La création d’un rapport avec un filtre spécifique sélectionné

Quelques autres améliorations notables

  • Python 3.12 est officiellement géré.
  • Dans le module facturation, vous pouvez maintenant configurer les statuts sélectionnés par défaut (dans les formulaires), ainsi que les statuts utilisés par les Factures lorsque leur numéro est généré.
  • Un nouveau bouton, qui peut être mis sur la vue détaillée des Contacts, est disponible: « Créer un appel non abouti » (détails).
  • La configuration des blocs d’un rôle peut maintenant être créée en clonant la configuration d’un autre rôle (les rôles pouvant avoir des configurations assez proches, ça peut être un gain de temps appréciable).
  • Les blocs basés sur OpenStreetMap sont maintenant utilisés dans l’installation par défaut (à place de ceux basés sur GoogleMaps).
  • Un rôle «Utilisateur normal» est créé dans les nouvelles installations. Dans la mesure où c’est une bonne chose que tout le monde ne soit pas connecté en tant que super-utilisateur, ce rôle devrait permettre de gagner du temps et servir au moins de base de travail.
  • Un bouton permettant de transformer un simple Contact en utilisateur a été ajouté. Auparavant il fallait fusionner ce Contact avec le Contact automatiquement créé à la création d’un utilisateur.
  • Les Graphes ont reçu de nombreuses améliorations : plus de champs sont disponibles en abscisse, plus de champs sont disponibles pour le filtrage, les couleurs associées aux petits modèles auxiliaires (du genre « Statut ») sont utilisées…
  • La validation des URLs est désormais moins stricte dans les champs informatifs. Cela posait pas mal de problèmes notamment lors des imports, les gens mettant rarement le « http:// » dans leur base de données.

Le futur

La prochaine version marquera notamment le passage à Django 5.2, la future LTS qui sortira en avril 2025. À l’année prochaine !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Rechercher dans une base de données

by Devinsty from AFPy discuss

Bonjour à tous
je développe une application en python et dans une partie de l’application il faut faire une recherche dans une base de données et afficher le résultat dans un tableau .
Malheureusement ma requêtes de recherche me renvois une erreur

ci-dessous ma fonction pour la recherche

def recherche():

    num_bapteme = RECHERCHE_txtEntre.get()
    date_bapteme = RECHERCHEEntre.get()
    nom_pere = RECHERCHEEntre.get()
    prenom_baptise = RECHERCHEEntre.get()

    conn = mysql.connector.connect(host='localhost', user='root', password='', db='registre_stbernard')
    cursor = conn.cursor()
    cursor.execute(" select * from r_bapteme where numero_bapteme like ?", ('%' + num_bapteme + '%',))
    results = cursor.fetchall
  

l’erreur

File "C:\Users\SF_RSI\PycharmProjects\Registre_StBernard\RECH_BAPTEME.py", line 16, in recherche
    cursor.execute(" select * from r_bapteme where numero_bapteme like ?", ('%' + num_bapteme + '%',))
  File "C:\Users\SF_RSI\PycharmProjects\pythonProject\.venv\Lib\site-packages\mysql\connector\cursor_cext.py", line 352, in execute
    raise ProgrammingError(
mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement

Merci de bien vouloir m’aider chez communauté

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

ConFoo Montreal 2025 : l’appel à conférences est ouvert

by Yann Larrivee,Ysabeau 🧶,Benoît Sibaud,Pierre Jarillon from Linuxfr.org

La conférence ConFoo est de retour pour sa 23ᵉ édition, du 26 au 28 février 2025 à l’Hôtel Bonaventure de Montréal ! Venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs et développeuses en Amérique du Nord et de partout à travers le monde.

Nous sommes présentement à la recherche de conférenciers et de conférencières avides de partager leur expertise et leur savoir dans une multitude de domaines des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, Intelligence Artificielle, et plus encore !

Offertes en français ou en anglais, nos présentations sont généralement d’un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers et conférencières invitées profitent d’un traitement privilégié ; avec notamment la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).

Vous avez jusqu’au 22 septembre prochain pour soumettre votre projet de présentations !

Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de 300$ en réservant votre inscription d'ici au 18 octobre !

Faites partie de l’aventure avec nous et découvrez comment l’intelligence humaine façonne le milieu des hautes technologies !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

🇬🇧 Information for those who have proposed a conference or workshop at 2024: acceptance emails are starting to be sent this week.
Don't forget to check your mailbox (and spam folder) to confirm your coming to Strasbourg! 🐍

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

🇫🇷 Information pour les personnes ayant proposé une conférence, un atelier à la 2024 : les mails d'acceptation commencent à partir cette semaine.
N'oubliez pas de vérifier votre boîte mail (et dans les spams) pour confirmer votre venue à Strasbourg ! 🐍

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Registration open for PyconFR 2024 at Strasbourg (from October 31th to November 3rd), registration free but mandatory

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Inscription à la PyconFR de Strasbourg (du 31 octobre au 3 novembre) ouverte, elle est gratuite mais reste obligatoire

Lire la suite…

Ma programme affiche : Process finished with exit code 0 lors de l'exécution sans lire mes instructions

by joel-gaetan-hassam-o from AFPy discuss

Salut à tous, je viens vers vous demander de l’aide.

En effet,
Je suis un jeune développeur et je suis actuellement en train d’apprendre python et je m’inspire du livre Apprendre à programmer avec python de Gérard Swinnen car j’aimes lire des livres.

Je suis actuellement sur le chapitre sur la programmation orientée objet, plus particulièrement sur la création des classes, objets et attributs et voici mon problème :

J’ai écrit un code pour calculer la distance entre deux points en utilisant une fonction, une classe et deux objets. Mon code n’affiche pas d’erreur mais aussi exécutes pas les instructions souhaitées !


17 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Dev Python FastAPI microservices SQLAlchemy (temps plein, freelance OK)

by baptistealexandre from AFPy discuss

Bonjour à tous :wave:

Nous recherchons un/une dev Python FastAPI pour rejoindre l’équipe backend d’une plateforme en microservices hostée chez AWS.

  • Stack : Python, FastAPI, SQLAlchemy et PostgreSQL, Docker, Kubernetes, AWS, GraphQL
  • Contexte grand groupe/scale-up dans des équipes tech de 5-10 personnes.
  • Goût pour la performance, la qualité du code et des interfaces utilisateur
  • 5-12+ ans en dev Python souhaités

Remote hybride entre 2 et 3 jours par semaine à Paris

Contact par
Email : :e-mail: alex@alxdr.com
Discord AFPy : baptistealexandre
LinkedIn : Baptiste Alexandre - ALXDR Software Engineering | LinkedIn

Merci et bonne journée :slightly_smiling_face:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Manipulation des fichiers précisément Enregistrement des variables diverses

by joel-gaetan-hassam-o from AFPy discuss

Je souhaite écrire un programme qui permet enregistrer les données (nombre à virgules flottantes) dans un fichier pour pouvoir les extraire par la suite par une fonction.
J’utilises le module pickle pour le moment car je suis en phase d’apprentissage !
Je rencontre un véritable problème quand il s’agit de convertir le message en float quand l’utilisateur saisi ces nombres. Je mets le code et l’erreur affiché ci dessous:

1- Le code:

nom_du_fichier = input("Entrez le nom du fichier: ")
name_file = open(nom_du_fichier, 'wb')
nouv = 0.0
while 1:
    txt = float(input())
    nouv = nouv + txt
    if txt=="":
        break
    pickle.dump(nouv, name_file)
print("Bien enregistré")
name_file.close()

2- le message d’erreur:

Traceback (most recent call last):
  File "C:\Users\JOEL\PycharmProjects\manipuation_fichiers\.venv\Scripts\write_file_all_type.py", line 25, in <module>
    txt = float(input())
          ^^^^^^^^^^^^^^
ValueError: could not convert string to float: ''

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Débuter avec Python pour un novice.

by Djey from AFPy discuss

Bonjour, je viens tout juste de m’inscrire et je désire commencer sur le langage Python afin d’élargir mes connaissances dans un premier temps et comprendre l’approche de la programmation.
Merci a vous, si vous avez des conseils et le bon cheminement réseau relationnel…

10 messages - 8 participant(e)s

Lire le sujet en entier

Lire la suite…

[Alternance] Developer Fullstack

by asaidomar from AFPy discuss

:computer:

[Alternance] Developer Fullstack

:round_pushpin:Paris, IDF

Qweeko c’est quoi ?

Chez Qweeko, nous sommes spécialisés en évaluation environnementale sur le secteur des Équipements Électriques et Électroniques (3E).

Plus concrètement, nous automatisons le procédé scientifique de l’Analyse de Cycle de Vie (ACV), afin de le rendre simple, accessible et scalable pour tous les industriels de ce secteur.

Notre technologie, Qweeko Pro, permet ainsi au marché de mieux décrypter l’impact de ses produits afin de le réduire de manière efficace, mais aussi de se mettre en conformité avec différentes législations auxquelles il est soumis.

Qweeko c’est qui ?

A l’origine, Qweeko ce sont 2 co-fondateurs, Marie et Martin, qui se sont rencontrés en 2020 avant de se lancer dans l’aventure en 2021.

Qweeko se divise en 3 équipes :

  • L’équipe ACV : une ingénieure doctorante, une ingénieure opérationnelle et un assistant account manager

  • L’équipe tech : notre CTO, Ali, encadre 2 développeurs juniors et un DevOps, accompagnés par Marie au poste de CPO.

  • L’équipe sales : composée de Martin, notre 1er commercial, et d’un assistant business developer.

Aujourd’hui nous sommes donc 10, et prêts à accueillir notre nouvelle recrue… peut être toi !

Informations supplémentaires :

Moyenne d’âge : 27 ans

Parité : 40% de femmes et 60% d’hommes

Le poste


Le poste d’alternant développeur te permettra de découvrir tout au long de l’année les différentes technologies que nous avons déployé pour automatiser la méthodologie scientifique de l’Analyse de Cycle de Vie (ACV).

Les missions de l’équipe portent aussi bien sur les domaines du front (Vue.JS) que du back (Python), et intègre aussi une dimension DevOps.

Notre équipe utilise la méthode Shape up, et se réunit à travers différents rituels tout au long de la semaine.

Retour d’expérience de nos anciens alternants :

“J’ai beaucoup apprécié travailler chez Qweeko. Cette expérience m’a permis de développer considérablement mes compétences en tant que développeur web full stack. La mise en place des rituels et l’ambiance de travail sont excellentes.”

Profil recherché


Idéalement nous recherchons un profil :

  • 4e ou 5e année de Master

  • Autonome

  • Curieux

  • Bonnes connaissances POO (Python et TypeScript)

  • Sensible aux enjeux environnementaux

Bonus :

  • Design d’API (Django, FastAPI)

  • DevOps friendly

:rotating_light: Pas besoin de remplir toutes les conditions présentes dans cette fiche de poste. Si tu es motivé, et que notre domaine t’intéresse, n’hésite pas à nous écrire pour en discuter !

Les avantages


  • Un projet avec du sens : travailler pour réduire l’empreinte écologique de produits de consommation et apporter de la visibilité aux consommateurs

  • Un produit impactant et avec une vraie finalité : l’objectif est de chambouler tout le marché de l’ACV dont le monopole est détenu par des cabinets de consulting, qui proposent une offre qui n’est pas en adéquation avec les besoins et ressources des industriels. Nous souhaitons révolutionner le travail des experts ACV en leur offrant des outils pour gagner en efficacité et leur permettre de se concentrer sur l’essentiel.

  • 2 jours de TT par semaine ⇒ Paris

  • 3 jours de TT par semaine ⇒ Marseille


Ce poste t’intéresse ? Envoie nous ton CV !

marie@qweeko.io

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Lead Développeur·euse - pass Culture

by francois from AFPy discuss

Bonjour,

Je suis Engineering Manager au pass Culture, et je recrute un·e Lead Dev qui codera en Python (et en React si affinités) mais avec une forte appétence pour les aspects Produit.

Les candidatures se font sur WTTJ, je recopie ici le contenu de l’annonce:


Le produit du pass Culture connait depuis sa création en 2019 une très forte croissance :

  • ouvertures successives à toute la population âgée de 18 ans puis 15-17 ans : 4 millions de jeunes ont été crédités soit aujourd’hui 80% de la population âgée de 19 ans, et ont effectué 32 millions de réservations
  • lancement de la part collective dans l’enseignement secondaire, soit 4.2 millions d’élèves dans 11000 établissements scolaires qui ont participé à une offre collective.
  • diversification des produits et une vision de devenir le “GPS de la culture” pour tous les Français grâce à une galaxie de 200 millions d’offres culturelles et de multiples connexions à des systèmes externes (catalogues d’offres, billetteries).

En plus d’évoluer dans un environnement particulièrement dynamique, l’équipe a relevé de multiples défis techniques : il y a beaucoup à apprendre tant dans notre organisation que dans les technologies développées.

Missions

  • Echanger régulièrement avec les PM et UX Designer de la squad pour construire la roadmap et cadrer les chantiers.
  • Préparer la stratégie technique des chantiers et livrables avec les autres devs de la squad.
  • Contribuer à la base de code du backend (Python), le cœur de notre système, ainsi qu’aux différents services qui gravitent autour.
  • Aider à résoudre les éventuels blocages techniques ou méthodologiques des devs de la squad.
  • Veiller à ce que les problématiques de sécurité, qualité, performance soient pensées au plus tôt.

Environ la moitié du temps de ce poste est consacrée à cadrer, communiquer et accompagner, et l’autre moitié à contribuer individuellement.

Technique

Notre stack se compose :

  • d’un backend en Python (Flask),
  • d’une DB PostgreSQL (avec l’ORM SQLAlchemy),
  • de frontends pro en React, et
  • d’une application mobile/web en React Native.

Nous utilisons aussi Algolia, Contentful, Sentry, Cypress et de nombreuses API partenaires.

Le code source applicatif est ouvert et hébergé sur GitHub.

La CI est hébergée sur Github Actions, et nous mettons en place cette année la livraison continue (Continuous Delivery).
L’infrastructure est en Terraform, déployée dans des clusters Kubernetes sur Google Cloud Platform.

Environnement de travail

Les directions Tech & Produit s’organisent en 3 tribes, qui conçoivent des produits pour différentes typologies d’utilisateur·ice : une app mobile/web pour les bénéficiaires, un portail pro pour les partenaires culturels & un catalogue d’offres collectives pour les professeurs et un back office pour les internes.

Une tribe est composée de squads, typiquement composées d’un trinôme PM - UX Designer - Lead Dev qui construisent ensemble la roadmap, et de 3 devs.
Des rôles transverses de Tech leads (front et back), QA, Ops, Data Analysts et UI Lead épaulent les squads.

L’équipe Engineering est composée d’environ 40 développeur·euses dont 2/3 de salarié·e·s.

Les locaux (entièrement rénovés) du pass Culture occupent tout un étage du 89 rue la Boétie, 75008 PARIS.

Nous travaillons en hybride, jusqu’à 3 jours de télétravail par semaine.

Pourquoi nous rejoindre ?

  • Pour donner du sens à son métier, en participant pleinement à une mission d’intérêt général qui touche des millions de nos concitoyens, dans le magnifique secteur de la Culture.
  • Pour partager nos valeurs : curiosité, esprit d’équipe, bienveillance et rigueur.
  • Pour travailler au sein d’une équipe brillante, engagée et dynamique.
  • Nos avantages employeur comprennent entre autres :
    • Politique d’égalité salariale
    • Une 6e semaine de congés payés
    • Le maintien de salaire sans condition d’ancienneté pour les congés de maternité, paternité et d’accueil de l’enfant, garde d’enfant malade
    • La Carte Culture, qui permet d’accéder gratuitement et en coupe-file aux monuments, musées nationaux et expositions

Profil recherché

  • Vous avez 5 ans d’expérience en Python et développement web
  • Vous souhaitez travailler dans le secteur de la Culture
  • Vous aimez réfléchir à l’architecture et l’organisation du code
  • Vous voulez vous impliquer dans les aspects Produit
  • Vous communiquez facilement avec des techs et des non-techs, à l’oral comme à l’écrit

Vous ne pensez pas remplir 100% de ces critères ? Vous pouvez quand même être la bonne personne pour ce rôle !


Déroulement des entretiens

  • Un entretien téléphonique de 25 minutes
  • Un exercice technique à faire en asynchrone durant 1 heure, suivi d’un débriefing 1 ou 2 jours plus tard avec 2 devs backend durant 50 minutes
  • Une rencontre avec PM, Lead Dev, et UX Designer durant 45 minutes
  • Une conversation avec notre CTO durant 30 minutes

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Chef·fe de projet technique (Tech Lead) des projets nationaux sur GeoNature (Paris ou Gap)

by camille_monchicourt from AFPy discuss

1. Contexte du recrutement et définition de poste

CONTEXTE ET DEFINITION DU POSTE

Vous aimez le développement et vous cherchez une mission utile pour l’évaluation de la biodiversité ?

Rejoignez PatriNat, le centre national d’expertise et de données sur la nature, et contribuez à ses missions de gestion des connaissances sur la biodiversité de France métropolitaine et d’outre-mer. Vous travaillerez au sein d’une équipe technique en collaboration étroite avec les scientifiques et producteurs de données.

Dans le cadre d’un projet en partenariat avec le Parc National des Ecrins, venez contribuer au développement du projet open-source GeoNature en collaboration étroite avec l’équipe projet et la communauté de contributeurs.

Vous intégrerez l’équipe « Applications informatiques », une équipe dynamique d’une quinzaine de personnes aux compétences complémentaires, tout en étant au plus près des équipes du Parc National des Ecrins, sur le terrain.

Grâce au télétravail et au choix du rythme de travail vous pourrez concilier vie personnelle et vie professionnelle. Vous travaillerez dans un cadre de travail exceptionnel, à Gap au pied des Montagnes et à 2h de la mer, ou au Jardin des plantes à Paris.

DESCRIPTIONS DES MISSIONS

En tant que chef(fe) de projet maitrise d’œuvre SI sur GeoNature, vous serez en charge de l’analyse technique des besoins, la conception technique des solutions, le conseil aux contributeurs de la communauté GeoNature et la conduite des développements. Les missions principales seront :

  • Analyser les besoins de la maitrise d’ouvrage et participer à l’alimentation du backlog produit ainsi qu’à sa priorisation ;
  • Définir la conception technique et rédiger les spécifications techniques détaillées des projets PatriNat ;
  • Organiser, coordonner et animer l’équipe de développeurs GeoNature de PatriNat ;
  • Proposer, en cours de projet, d’éventuelles modifications d’objectifs (qualité, coût, délai) liées à des contraintes de réalisation ou des modifications d’environnement ;
  • Conseiller les contributeurs sur leur projet de développement GeoNature.

Le contexte technique inclut, GitHub et GitLab pour le versionnage et le devops, docker, swarm et portainer pour les déploiements sur l’infrastructure SI du Muséum.

2. Profil recherché

CONDITIONS ADMINISTRATIVES REQUISES

De formation supérieure, minimum bac+5 Master ou Ecole d’ingénieur, vous justifiez d’une expérience minimale de 3 ans au sein d’une équipe de développeurs.

Rigoureux(se), organisé(e), déterminé(e), pragmatique, autonome, avec un excellent relationnel.

Compétences Techniques Requises

  • Très bonne maîtrise des concepts du développement
  • Maîtrise des langages HTML, Python, Javascript, CSS et SQL
  • Maîtrise d’un framework Python (Flask, Django ou autre) avec une préférence pour Flask
  • Maîtrise de Bootstrap, Angular, Git
  • Maîtrise des concepts de base de données (Modélisation, SQL, PostgreSQL/PostGIS de préférence) et du fonctionnement des SGBD relationnels
  • Connaissance de l’architecture REST
  • Connaissance en administration et sécurité de serveurs web linux
  • Connaissance en SIG (QGIS ou autre)
  • Maîtrise en ergonomie et architecture web
  • Connaissance des méthodologies de gestion de projet (Agile notamment)
  • Connaissances naturalistes ou dans les domaines de la biologie, de la conservation ou de l’écologie seront un plus

Savoir être

  • Esprit d’initiative et capacité d’écoute
  • Autonomie, Rigueur et logique
  • Sens de l’organisation
  • Bonnes qualités relationnelles et capacité à communiquer avec des partenaires internes et externes
  • Capacité rédactionnelle et de synthèse
  • Aptitude au travail en équipe
  • Intérêt pour les projets open-source

3. Information(s) complémentaire(s)

Venez rejoindre un établissement chargé d’histoire, engagé dans la société, en pleine évolution, à la renommée nationale et internationale. Riche d’une grande variété de métiers et d’activités, le Muséum vous propose d’intégrer des équipes à taille humaine dans un cadre de travail agréable et un environnement stimulant.

Le contrat

Localisation : Siège du Parc national des Ecrins, GAP (05) ou Jardin des plantes, PARIS (75)

Contrat : CDD de droit public renouvelable d’une durée de 12 mois

Temps de travail : 35h35 par semaine et 44 jours de congés annuels

Rémunération : en fonction du profil du candidat retenu et des grilles de rémunération de l’établissement

Les avantages

Remboursement de 75% des frais de transport en commun (si Paris) ou forfait mobilité durable (vélo ou covoiturage)

Télétravail possible jusqu’à deux jours par semaine en fonction du cycle de travail et selon cadre légal

Prise en charge partielle de votre mutuelle

Un comité social et une association sportive et culturelle

Accès illimité aux sites de l’établissement avec invités

Candidature avant le 30 juin sur Chef de projet technique (Tech Lead) des projets nationaux sur GeoNature (F/H) @ Muséum national d'Histoire naturelle

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Contributions à des logiciels libres par l'équipe Yaal Coop durant le printemps 2024

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

Mécénat

Bat

Un clone de cat(1) avec coloration syntaxique et intégration Git

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

ihatemoney

Une application web simple de gestion de budget

python-libfaketime

Une alternative rapide à freezegun pour mocker les dates, en utilisant libfaketime

pytest-libfaketime

Prepare pytest à l’utilisation de python-libfaketime

pytest-iam

Serveur OAuth2/OIDC léger pour suites de tests unitaires

Debian

  • Extraction de la page de manuel de BlastEm car elle n'est plus dans le dépôt amont
  • Mise-à-jour de l'amélioration de la page de manuel de BlastEm sur la page de manuel nouvellement extraite

scim2-models

Sérialisation et validation de ressources SCIM avec Pydantic

scim2-client

Fabrication et analyse pythonique de requêtes SCIM

scim2-tester

Outil de vérification de conformité de serveurs aux normes SCIM

scim2-cli

SCIM application development CLI

Lire la suite…

Spring 2024 FOSS contributions from by the Yaal Coop team

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

Sponsoring

Bat

A cat(1) clone with syntax highlighting and Git integration

canaille

Lightweight identity and authorization management software

ihatemoney

A simple shared budget manager web application

python-libfaketime

A fast time mocking alternative to freezegun that wraps libfaketime.

pytest-libfaketime

Prepare pytest for python-libfaketime

pytest-iam

A fully functional OAUTH2 / OpenID Connect (OIDC) server to be used in your testsuite

Debian

  • Extract BlastEm manpage because it does not existe anymore in the upstream repository
  • Update improved BlastEm manpage to the new manpage

scim2-models

SCIM resources serialization and validation with Pydantic

scim2-client

Pythonically build SCIM requests and parse SCIM responses

scim2-tester

SCIM RFCs server compliance checker

scim2-cli

SCIM application development CLI

Lire la suite…

Argos Panoptès : la supervision de sites web simple et efficace

by Framasky,Xavier Teyssier,Benoît Sibaud from Linuxfr.org

Il y a un nouveau venu parmi les logiciels de supervision : Argos Panoptès !

Loin de la complexité des Nagios, Centreon, Icinga et autres mastodontes qui font le café, Argos Panoptès (on l’appellera Argos dans la suite de ce texte) ne surveille que des sites web, ce qui lui permet d’être bien plus simple et léger.

Argos a été développé par Alexis Métaireau pour Framasoft dans le cadre de Framaspace (du Nextcloud fourni gracieusement par Framasoft aux associations et collectifs militants).
Framasoft a fait appel à un prestataire, faute de temps disponible pour développer nous-même l’outil.

Sommaire

Pourquoi cet outil ? Lorsque l'on prévoit de créer plein d’espace Nextcloud, il semble pertinent de les surveiller.
Et comme Framasoft prévoit de déployer jusqu’à 10 000 espaces, il fallait quelque chose qui tienne la route… ce que le Shinken de l’association ne permettait pas : trop de sondes à exécuter, trop peu de temps pour le faire et on se retrouve avec des coups de sondes pas assez fréquents, laissant les sites avec des problèmes avec de trop longs délais de détection.

Sans compter que Shinken est en Python 2, qui est obsolète depuis déjà bien longtemps.

Le passage à une nouvelle solution de supervision complète (nous lorgnons sur Icinga) étant trop chronophage pour le temps que nous avons à lui consacrer pour l’instant, nous avons préféré partir sur une solution de surveillance de sites web, suivant l’adage UNIX « un logiciel qui fait une seule chose, mais qui la fait bien ».

Mais enfin, y a déjà des outils pour ça !

Anakin : « J’ai besoin d’un logiciel de supervision ». Padme, tout sourire : « Donc tu vas en prendre un qui existe ? ». Anakin ne dit rien et la regarde avec un rictus. Padme, inquiète : « Tu vas en prendre un qui existe, hein ? »

Bien sûr ! Nous avons testé statping-ng et Uptime Kuma mais avec nos très nombreux sites à surveiller, cela les mettait à genoux… ou alors c’est le navigateur qui ne tenait pas : ces deux solutions affichent sur la page d’accueil l’état de tous les sites à surveiller, et avec un historique de leur état en plus. Lorsque l'on veut surveiller des centaines de sites avec au moins trois coups de sondes chacun (un pour vérifier que le site HTTP redirige bien vers la version sécurisée, un pour vérifier que la version sécurisée répond bien, et un pour vérifier l’expiration du certificat du site), ça fait énormément d’appels AJAX au serveur quand on consulte le site et soit c’est le serveur qui a du mal, soit c’est le navigateur qui peine.

Ainsi est née l’idée du développement d’une solution qui remplisse notre cahier des charges

Le nom

Argos Panoptès fait référence au géant aux cent yeux de l’antiquité grecque, « Panoptès » signifiant « celui qui voit tout ».

Le cahier des charges

Il était simple mais toutefois complet, rédigé par votre serviteur (étant adminSys et développant aussi, j’avais mon idée sur ce que je voulais déployer et ce que j’aurais voulu coder moi-même) :

  • un langage simple, qui peut attirer du monde pour les contributions : Python ;
  • un langage moderne : la cible était Python 3.11, à savoir la version de Debian Bookworm ;
  • le support d’une base de donnée robuste : PostgreSQL ;
  • une architecture agents / serveur, permettant d’ajouter des agents pour les coups de sondes au fur et à mesure de l’augmentation des besoins. Ceci pour éviter le goulot d’étranglement constaté sur Shinken (l’ajout de plus d’agents Shinken n’étant pas possible puisque Python2) ;
  • une configuration simple et automatisable : l’infrastructure de Framasoft étant gérée via Salt, de même que la configuration des sondes de Shinken, il était vital de pouvoir créer la configuration des sites à surveiller de façon programmatique. Le YAML fut choisi pour cela ainsi que pour sa simplicité de lecture par un humain ;
  • divers moyens de notifications, courriel et Gotify a minima.

Quelqu’un susurre « PostgreSQL » à l’oreille d’une autre personne, on voit un bras couvert de chair de poule

Le code

Le code d’Argos est sur la forge logicielle de Framasoft : https://framagit.org/framasoft/framaspace/argos/.

Une suite de tests est exécutée en intégration continue, ainsi que du linting, ce qui permet d’éviter autant que possible les régressions et de maintenir un style de code uniforme.

Pour les dépendances, rien d’exotique (et c’est tant mieux !) :

  • Click pour l'interface en ligne de commande ;
  • FastAPI est le cadriciel qui nous permet d'exposer l'API HTTP ;
  • HTTPX est utilisé pour émettre des requêtes asynchrones dans les agents ;
  • Jinja gère la mise en page ;
  • Pydantic est utile pour s'assurer que les données correspondent à nos attentes ;
  • SQLAlchemy est l'ORM que nous utilisons pour nous connecter à notre base de données et lancer des requêtes ;
  • Alembic est utilisé pour les migrations de bases de données ;
  • Tenacity un petit utilitaire pour réessayer une fonction en cas d'erreur ;
  • Uvicorn est l'outil utilisé pour faire tourner notre serveur ;
  • Gunicorn est le serveur WSGI HTTP recommandé pour la production.

Pour aider les potentiels contributeurs, une partie du site officiel est dédiée au développement.

L’API d’Argos est auto-documentée : en installant Argos, vous aurez des pages de documentation aux formats Swagger et Redoc.

Le fonctionnement en production

Si Argos a été annoncé sur le Framablog mi-mai 2024, cela faisait déjà plusieurs mois que la version de développement était en production.

Capture d’écran de la page de statut d’Argos

Le moins qu’on puisse dire, c’est qu’Argos tient ses promesses ! Il est rapide… très rapide !

Lors du dernier démarrage à vide d’une version de développement, Argos a lancé ses 2145 tests configurés à une vitesse impressionnante : il ne lui a fallu qu’une minute et 15 secondes pour tous les effectuer.

L’API présentant un point permettant de connaître le nombre de sondes dans chaque état (les classiques ok, warning, critical et unknown), nous avons ajouté une sonde à notre Shinken pour intégrer les résultats d’Argos dans celui-ci.

En effet, avoir un outil dédié, c’est sympa, mais si ça fait une page web de plus à consulter, c’est enquiquinant. La centralisation de la supervision au sein de Shinken permet de contourner ce problème.

Le futur

Depuis la première version et une version de micro-changements, la majeure partie des modifications s’est concentrée sur l’amélioration de la documentation, ainsi que sur la simplification de la configuration et de l’installation.

Quelques nouvelles fonctionnalités seront de la partie, réduisant quelques frictions rencontrées depuis la mise en production de la dernière version.

Les contributions sont les bienvenues (peut-être quelqu’un intégrera-t-il les notifications via Apprise ?) 😉

One more thing

Framasoft est actuellement en pleine campagne de collecte de fonds dans le cadre de la démarche de soin de nos services en ligne « Dorlotons Dégooglisons » (mais ça, vous le saviez peut-être déjà).

Merci de nous soutenir si vous le pouvez ! 🙂

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Dev Django / Python pour une startup en cybersécurité (Paris)

by Valerie from AFPy discuss

Bonjour à tous,

Je recrute actuellement pour une start-up franco-américaine (en interne /CDI).

Nous développons actuellement l’équipe de “Founding engineers” : sans produit encore commercialisé, la société vient de lever 3 M$ auprès d’investisseurs spécialisés en cyber afin de développer ses activités principalement aux US.

  • Stack tech : Python / Django principalement
  • Contrat : CDI
  • Lieu : Paris (R&D) / New York (Sales)
  • Politique de télétravail : 2 à 3 j. /semaine
  • Salaire : 55-75k€

N’hésitez pas à me contacter sur mon adresse : valerien@hurryman.fr ou par téléphone :
01 80 88 50 74

Au plaisir d’échanger (fiche de poste en MP).

Valérie

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Comment parler de politique

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

Introduction #

L’heure est grave.

Dans 3 semaines, il y a une possibilité que l’extrême droite obtienne une majorité absolue à l’Assemblée Nationale.

Qu’est-ce que ça aura pour conséquences?

  1. Emmanuel Macron devra nommer un premier Ministre qui ne soit pas rejeté par une majorité à l’Assemblée - pas le choix, ça sera Jordan Bardella.

  2. On rentera dans une cohabitation, avec un Président qui a très peu de pouvoir, et un Premier Ministre qui gouverne, donc une politique d’extrême-droite pendant 3 ans (ni le Président ni le Sénat pourront empêcher le RN de voter les lois de son programme - seul le Conseil Constitutionnel pourra empêcher les votes des lois les plus dures).

  3. En 2027, Marine Le Pen remportera l’élection présidentielle et la France basculera vers le fascisme.

Les deux premiers points sont assez certains, cela découle naturellement du fonctionnement de nos institutions. Le troisième point est assez probable si l’on se base sur les précédents historiques - en tout cas, il donne une idée de l’importance colossale de ces législatives anticipées.

Mes convictions #

Je suis convaincu de plusieurs choses:

  1. Le scénario décrit en introduction est crédible et peut nous amener au fascisme en France en 2027
  2. La meilleure stratégie pour éviter cela c’est de faire barrage au RN lors des législatives
  3. Le meilleur moyen de faire barrage au RN c’est de voter massivement pour les candidats et candidates Front Populaire dès le premier tour.
  4. Le pire peut arriver, mais la bonne nouvelle c’est qu’il est aussi possible d’avoir une majorité Front Populaire à l’Assemblée Nationale - et ça, ça serait une vraie rupture avec les 7 dernières années de Macronisme.
  5. Vous qui me lisez, vous pouvez y faire quelque chose, et ce dès le premier tour.
  6. Le résultat du vote du 29 juin dépendra en grande partie des conversations que vous aurez autour de vous.

Le dernier point est important et je trouve qu’on en parle pas assez - et donc il mérite sa propre section.

De l’importance des conversations #

La question à se poser c’est : pourquoi est-ce que le Front Populaire ferait mieux en 2024 que la NUPES en 2022?

Notamment, qu’est-ce qui va pousser des personnes qui n’ont pas voté du tout ou ont voté autre chose que NUPES à voter Front Populaire?

Je pense que cela passera par une foule de gens (dont vous qui me lisez, j’espère) qui auront des conversations et arriveront à convaincre des indécis.

Pourquoi je pense que cela va marcher?

Je ne sais pas. Je n’ai pas de bon argument. C’est quelque chose que j’ai choisi de croire. Comme disait Chomsky:

If you assume that there is no hope, you guarantee that there will be no hope. If you assume that there is an instinct for freedom, that there are opportunities to change things, then there is a possibility that you can contribute to making a better world.

Traduction :

Si vous partez du principe qu’il n’y a pas d’espoir, alors il ne pourra pas y en avoir. Si vous partez du principe qu’il existe un instinct pour la liberté, qu’il y a des opportunités pour changer les choses, alors il est possible que vous puissiez contribuer à bâtir un monde meilleur.

Si vous avez tenu jusque là, on peut rentrer dans le vif du sujet.

Parler politique, mode d’emploi #

Quand je parle de conversation, je parle de deux personnes qui discutent ensemble - surtout pas d’un débat devant un public!

Assurez-vous que la personne avec qui vous discutez souhaite parler de politique (ça reste un tabou pour beaucoup de gens).

Si la personne vous dit “je compte m’abstenir”, “je compte voter blanc”, “je compte voter RN”, ne la jugez pas. Au contraire, écoutez-la et montrez-vous curieux. Exemple:

— Je ne peux pas voter pour le Front Populaire parce que Mélenchon et la LFI me font peur.

— Je comprends. Beaucoup de gens ont peur de la LFI. Qu’est-ce qui te fait peur chez LFI?

— Ce sont des extrémistes.

— Comment ça?

— Ils soutiennent les islamistes.

— Qu’est-ce que tu entends par islamistes?

— Ben, les terroristes du Hamas, tout ça. En plus ils sont antisémites.

Vous voyez l’idée - commencez par écouter et comprendre les émotions de la personne avec qui vous discutez avant de présenter votre point de vue.

Ici par exemple, vous pouvez esquiver le sujet de l’antisémitisme (reconnaissons-le, c’est un sujet important mais compliqué) et plutôt expliquer la différence entre soutenir Gaza et soutenir le terrorisme.

Mettez de l’eau dans votre vin! Vous n’avez pas besoin de défendre votre parti (ou votre personne) préférée sur tous les points. De toutes façon le Front Populaire c’est une coalition de gauche qui va de la LFI au PS en passant par les écologistes et le parti communiste. Si vous êtes fan d’Untel ou Unetelle mais que la personne que vous voulez convaincre la déteste dites simplement “je sais - beaucoup de gens pensent comme toi - c’est une personnalité clivante” et passez à la suite.

L’important c’est de prendre en compte les sentiments, les émotions et les besoins de la personne avec qui vous discutez - sinon vous allez la braquer et vous n’arriverez pas à la convaincre.

Autre exemple:

— Je vais pas voter parce que mon vote sert à rien

— Pourquoi tu penses que ton vote ne sert à rien?

— Parce qu’une fois élus ils font le contraire de ce qu’ils ont promis

— Je sais. En fait c’est plutôt logique vu le fonctionnement des institutions. Mais ce n’est pas l’enjeu. L’enjeu c’est d’empêcher l’extrême-droite d’arriver au pouvoir.

Et là vous pouvez rentrer sur pourquoi la perspective de l’extrême droite au pouvoir vous touche vous, personnellement, ou bien vos proches.

Ainsi, vous allez vous montrer vulnérable et ce sera plus facile d’instaurer une confiance réciproque.

Finalement, contentez-vous de petites victoires. Il est très difficile de faire changer d’avis quelqu’un. Cela dit, si vous vous y prenez correctement vous aurez planté des graines qui écloront plus tard.

Souvenez-vous aussi qu’il est plus facile pour quelqu’un de changer d’avis quand plusieurs personnes différentes lui parlent du même sujet.

Conclusion #

C’est le premier article qui parle explicitement de politique sur ce blog depuis sa création 2016, mais je ne pouvais pas ne pas l’écrire.

J’ai quelques idées sur la suite à donner, mais cela dépendra beaucoup de vos retours, chers lecteurs et lectrices.

Vous noterez que les commentaires sous ce billet sont désactivés parce que, justement, si le sujet vous intéresse, je veux avoir une vraie conversation avec vous ;)

Enfin et si vous le souhaitez, n’hésitez pas à partager cet article autour de vous, ça m’intéresse de recueillir une variété de points de vue.

Lire la suite…

Sur Lyon − Meetup en mixité choisie le 19 juin

by grewn0uille from AFPy discuss

Hello,

Nouveau meetup en mixité choisie le mercredi 19 juin.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.

Pour ce meetup, nous sommes accueillies par Hashbang (métro Brotteaux).

Au programme de cette session :

  • Tempête de boulettes géantes, par Agnès
  • Plongez dans pytest : testez votre code comme un·e pro !, par Carmen

EN MIXITÉ CHOISIE, Du Python, mais pas que !

2024-06-19 19:00 (Europe/Paris) → 2024-06-19 21:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Recherche d'opportunité Dev python

by youcef.lyousfi from AFPy discuss

Bonjour à tous,

Après six années d’études en informatique et mathématiques, je suis à la recherche d’une opportunité professionnelle pour débuter ma carrière. Pendant mon parcours académique, j’ai travaillé sur divers projets, allant du développement web au développement logiciel, ce qui m’a permis d’acquérir une solide expertise en Java JEE, HTML, CSS, Python Django et Spring Boot.

L’une de mes expériences les plus marquantes a été ma contribution au développement d’un système automatisé de mesure du linéaire du pontage pour le groupe NextRoad lors de mon stage de fin d’études. Cette expérience m’a permis de développer non seulement mes compétences techniques, mais aussi ma capacité à résoudre des problèmes complexes et à collaborer efficacement au sein d’une équipe.

Je suis particulièrement attiré par les entreprises qui valorisent l’innovation, l’excellence technique et le développement continu. Mon objectif est de rejoindre une équipe dynamique où je pourrais appliquer mes compétences et continuer à apprendre et à évoluer dans un environnement stimulant.

Si vous avez connaissance d’une opportunité correspondant à mon profil ou si vous souhaitez discuter de potentielles collaborations, n’hésitez pas à me contacter. Je suis disponible pour échanger sur mes expériences et compétences, et je serais ravi de contribuer au succès de votre entreprise.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

De l'usage de Python pour bidouiller les jeux HTML gratuits

by mdk from AFPy discuss

J’ai trouvé un jeu, qui rappelle un peu les vieux jeux de stratégie gratuits en ligne tout en HTML qui ont bercés mon enfance, genre Hyperiums (qui se souvient ?).

Capture d’écran d’Hyperiums pour rafraîchir votre mémoire :
Capture d'écran d'Hyperiums

C’est du tour par tour (un tour par an) ça rappelle la lenteur d’Hyperiums :heart: et l’interface n’est pas vraiment meilleure qu’Hyperiums (voire pire, soyons honnêtes, en plus c’est codé en Java). Et y’a MASSSSS joueurs, plus de 10 millions il paraît, mais on peut pas voir, j’imagine la facture de l’infra derrière :smiley:

Là où ils ont mis un réel effort par rapport aux autres jeux HTML c’est sur le moteur de règles.

Les règles sont d’une complexité folle, personne n’a jamais encore réussi à toutes les comprendre, alors chaque joueur se spe dans un domaine, un peu comme dans les meuporgs.

Les règles sont tellement compliquées qu’ils ont inventé un langage dédié (mais pas Turing complet, sniff) pour décrire les règles : le langage M.

Et elles changent subtilement à chaque tour de jeu.

Au total c’était plus de 62k lignes de règles il y a 8 ans, peut-être près de 90_000 aujourd’hui.

Comme à chaque fois que je joue à un vidéo de ce genre, j’essaye de voir si en scriptant un peu avec Python je peux pas bidouiller des trucs.

Et là je cherche, et BOOM, y’a une team française qui joue aussi et qui a rendu open-source une ré-implémentation from scratch du jeu de règles en Python.

Avec on peut simuler un tour du jeu (ou plusieurs) à l’avance pour chercher des opti perchées, faire varier des valeurs, voir comment ça fait réagir le jeu, ou carrément aller lire le code d’un calcul en particulier : vu que c’est du Python, ça se lit comme un livre ouvert.

Bon assez de blah blah, je vous montre le code pour une simulation toute simple, genre Alice et Bob, d’abord il faut déclarer les paramètres de la simulation avec un simple dict :


TEST_CASE = {
    "individus": {
        "Alice": {
            "salaire_imposable": {"2023": 34_567},
        },
        "Bob": {
            "salaire_imposable": {"2023": 23_456},
        },
        "Eve": {}
    },
    "menages": {
        "menage_1": {
            "personne_de_reference": ["Alice"],
            "conjoint": ["Bob"],
            "enfants": ["Eve"],
        }
    },
    "familles": {
        "famille_1": {
            "parents": ["Alice", "Bob"],
            "enfants": ["Eve"],
        }
    },
    "foyers_fiscaux": {
        "foyer_fiscal_1": {
            "declarants": ["Alice", "Bob"],
            "personnes_a_charge": ["Eve"],
            "f7uf": {"2023": 860},  # Dons à Framasoft
            "f7ea": {"2023": 1},  # Eve est au collège
        },
    },
}

Ensuite on charge ça dans le simulateur de règles :

tax_benefit_system = CountryTaxBenefitSystem()

simulation_builder = SimulationBuilder()
sim = simulation_builder.build_from_entities(tax_benefit_system, TEST_CASE)

et BOOM on peut lui faire calculer n’importe quelle variable :

print(sim.calculate("impot_revenu_restant_a_payer", "2023"))

OK j’ai pris quelques raccourcis (les imports, tout ça). Voici un script qui fait un joli résumé avec rich de toutes les variables importantes du point de vue d’Alice et Bob, copie-collé ça marche :

(bon euh, pip install git+https://github.com/openfisca/openfisca-france rich avant hin)

from openfisca_core.simulation_builder import SimulationBuilder
from openfisca_france import CountryTaxBenefitSystem
from openfisca_core.model_api import ADD
import warnings
import sys
from rich.console import Console
import re

console = Console()

warnings.simplefilter("ignore")


TEST_CASE = {
    "individus": {
        "Alice": {
            "salaire_imposable": {"2023": 34_567},
        },
        "Bob": {
            "salaire_imposable": {"2023": 23_456},
        },
        "Eve": {}
    },
    "menages": {
        "menage_1": {
            "personne_de_reference": ["Alice"],
            "conjoint": ["Bob"],
            "enfants": ["Eve"],
        }
    },
    "familles": {
        "famille_1": {
            "parents": ["Alice", "Bob"],
            "enfants": ["Eve"],
        }
    },
    "foyers_fiscaux": {
        "foyer_fiscal_1": {
            "declarants": ["Alice", "Bob"],
            "personnes_a_charge": ["Eve"],
            "f7uf": {"2023": 860},  # Dons à Framasoft
            "f7ea": {"2023": 1},  # Eve est au collège
        },
    },
}

avance_perçue_sur_les_réductions_et_crédits_d_impôt = {"2023": 99}
prelevement_a_la_source = {"2023": 200}

tax_benefit_system = CountryTaxBenefitSystem()

simulation_builder = SimulationBuilder()
sim = simulation_builder.build_from_entities(tax_benefit_system, TEST_CASE)


class SimulationStudy:
    def __init__(self, simulation, year):
        self.simulation = simulation
        self.year = year

    def calc(self, label):
        return self.simulation.calculate(label, self.year)

    def print(self, indent, label, help=None):
        value = self.calc(label)
        if indent:
            console.print("    " * indent, end="")
        if "taux_" in label:
            console.print(f"{label} = [bold]{value.sum():.1%}[/bold]", end="")
        else:
            console.print(f"{label} = [bold]{round(value.sum())}[/bold]", end="")
        if help:
            console.print(f" ([italic]{help}[/italic])", end="")
        print()


def parse_args():
    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument("-v", "--verbose", action="store_true")
    parser.add_argument("-y", "--years", nargs="*", default=("2023",))
    return parser.parse_args()


do_not_show = (
    "plafond_securite_sociale",
    "contrat_de_travail",
    "nombre_jours_calendaires",
    "quotite_de_travail",
    " age<",
    "zone_apl",
    "apprentissage_contrat",
    "titre_restaurant_taux_employeur",
    "date_naissance",
    "nbptr",
)


def main():
    args = parse_args()
    for year in args.years:
        study = SimulationStudy(sim, year)
        console.rule(f"[bold red]Revenus {int(year) - 1} déclarés en {year}")

        if args.verbose:
            sim.trace = True
            study.calc("impot_revenu_restant_a_payer")
            for line in sim.tracer.computation_log.lines():
                if re.search(">>.*[1-9]", line):
                    if any(pat in line for pat in do_not_show):
                        continue
                    print(line)
            break

        study.print(0, "nbptr", "Nombre de parts")
        study.print(0, "rbg", "Revenu brut global")
        study.print(1, "revenu_categoriel")
        study.print(2, "revenu_categoriel_deductions")
        study.print(3, "traitements_salaires_pensions_rentes")
        study.print(4, "revenu_assimile_salaire")
        study.print(4, "revenu_assimile_salaire_apres_abattements")
        study.print(4, "abattement_salaires_pensions")
        study.print(3, "indu_plaf_abat_pen")
        study.print(2, "revenu_categoriel_capital")
        study.print(2, "revenu_categoriel_foncier")
        study.print(2, "revenu_categoriel_non_salarial")
        study.print(2, "revenu_categoriel_plus_values")

        study.print(
            0, "rng", "Revenu net global (rbg - csg_patrimoine - charges_deduc)"
        )
        study.print(1, "csg_patrimoine_deductible_ir")
        study.print(1, "charges_deduc")

        study.print(0, "rni", "Revenu net imposable (rng - abat_spe)")
        study.print(1, "abat_spe", "Abattements spéciaux")

        console.rule("[red]QUOTIENT FAMILIAL")
        study.print(0, "ir_plaf_qf", "Impôt après plafonnement quotient familial")
        study.print(1, "ir_ss_qf", "Impôt sans quotient familial")
        study.print(1, "avantage_qf")
        study.print(1, "ir_brut", "Impôt sur les revenus soumis au barème")
        study.print(1, "ir_tranche")
        study.print(1, "ir_taux_marginal")

        console.rule("[red]IMPÔT NET")
        study.print(0, "ip_net", "Impôt net avant réductions (ir_plaf_qf - decote)")
        study.print(1, "decote")
        study.print(2, "decote_gain_fiscal")

        console.rule("[red]RÉDUCTIONS D'IMPÔT")
        study.print(0, "reductions")
        study.print(1, "reductions_plafonnees")
        study.print(1, "reductions_deplafonnees")
        study.print(2, "dfppce", "Dons à des organismes d'intérêt général")
        study.print(3, "f7uf")
        study.print(2, "reduction_enfants_scolarises")
        study.print(0, "iaidrdi", "Impôt après imputation des réductions")
        study.print(0, "iai", "Impôt avant imputations de l'impôt sur le revenu")

        console.rule("[red]TOTAL DE L'IMPOSITION")
        study.print(0, "impot_revenu_restant_a_payer")
        console.print(
            "    [i]iai - credits_impot - accomptes_ir - prelevements_forfaitaires + contribution_hauts_revenus[/i]"
        )
        study.print(1, "contribution_exceptionnelle_hauts_revenus")
        study.print(1, "prelevement_forfaitaire_unique_ir")
        study.print(1, "prelevement_forfaitaire_liberatoire")

        console.rule("[red]PRÉLÈVEMENT À LA SOURCE ET AVANCE PERÇUE")
        avance_percue = avance_perçue_sur_les_réductions_et_crédits_d_impôt[year]
        console.print(f"avance_percue = [bold]{avance_percue}[/bold]")
        pas = prelevement_a_la_source[year]
        console.print(f"preleve_a_la_source = [bold]{pas}[/bold]")

        console.rule("[red]RESTE À PAYER")
        console.print(
            "[i]    -impot_revenu_restant_a_payer - preleve_a_la_source + avance_percue[/i]\n"
            "[i]    car par convention impot_revenu_restant_a_payer est négatif[/i]"
        )
        console.print(
            f"  [b]{round(-sim.calculate('impot_revenu_restant_a_payer', year)[0] - pas + avance_percue)}[/b]\n"
        )
        study.print(0, "taux_moyen_imposition")

        console.rule("[red]REVENU FISCAL")
        study.print(0, "rfr", "Revenu fiscal de référence")
        study.print(1, "rni", "Revenu net imposable")


if __name__ == "__main__":
    main()

Le résultat :

Qui est chaud pour qu’on se monte une équipe ?

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup le 13 juin

by grewn0uille from AFPy discuss

Hello tout le monde,

Prochain meetup Python à Lyon le jeudi 13 juin à 19h !
On parlera de suivi de consommation OVH, de Prometheus et de Grafana :mag_right:

Pour ce meetup nous sommes accueillis par Kobalt (métro Ampère Victor Hugo).

Observabilité : surveiller sa conso OVH avec Python, Prometheus et Grafana 🔎

2024-06-13 19:00 (Europe/Paris) → 2024-06-13 21:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Développeur·euse Python polyvalent·e dans une coopérative

by azmeuk from AFPy discuss

Lire l’offre d’emploi sur le site de Yaal Coop

Yaal Coop recrute 1 développeur·euse polyvalent·e

Offre de CDI - F/H - 35H - Bordeaux-Bègles

Pour fortifier son équipe, Yaal Coop recrute 1 développeur·euse, avec une tête bien faite plutôt qu’avec une tête bien pleine !

Culture organisationnelle

Nous pensons que pour des résultats excellents, il est essentiel de constituer une équipe aux compétences complémentaires, prenant soin d’elles-même et de ses clients : fiable, réactive, astucieuse, apprenante, communicante et bienveillante.

Vous rejoignez une jeune coopérative à l’organisation horizontale, composée de cinq associé·es salarié·es polyvant·es qui partagent leurs activités entre :

  • trois quarts du temps consacrés à la production (développement, design, support utilisateur, gestion de projet) selon les besoins des produits et les appétences de chacun
  • un quart du temps réservé à la gestion et la vie du collectif, la stratégie et le commerce, la communication, la veille et la formation

Nos produits

Nous travaillons principalement sur des projets web en python, autant sur le backend (Flask, Django, etc.) que sur le frontend (HTMX, Svelte, etc.) et le devops (Linux, Conteneurs lxc/lxd et Docker, CI/CD, Ansible).

Nous sommes très attachés à l’utilisation, la contribution et la production de logiciels libres.

TDD, pair-programming et agilité font partie de nos pratiques quotidiennes.

Nous privilégions des produits et les clients qui ont du sens et qui s’inscrivent dans nos valeurs. À titre d’exemple nous comptons actuellement parmi nos clients : Beta.gouv, Telecoop et l’Éducation Nationale.

Mais nous investissons également sur des projets internes pour créer et tester librement des outils auxquels nous croyons !

Recherche actuelle

Nous recherchons actuellement une personne au goût prononcé pour la programmation, le travail en équipe, capable de prendre des initiatives, et désirant produire un travail de qualité.

Les compétences techniques que nous recherchons en particulier sont la conception logicielle (de l’architecture au développement dirigé par les tests) et la maintenance logicielle (du support client, à la résolution de bug et documentation). Une pratique ou une appétence pour les technologies que nous utilisons ou d’autres complémentaires seront appréciées.

Rémunération et condition

Selon le profil et l’expérience, nous offrons un salaire compris dans une fourchette entre 30k€ et 45k€ brut annuel.

Au delà du salaire, nous nous efforçons de créer les conditions de réussite :

  • En équipe plutôt que seul·e ;
  • En collaboration plutôt qu’en subordination ;
  • Sur du matériel efficace plutôt que sur une machine premier prix ;
  • Dans un endroit convivial et bien situé (local proche de la gare et du tramway C, entièrement rénové, salle de repos) ;
  • En conjuguant professionnalisme et plaisir au travail ;
  • Avec de la flexibilité (1 à 2 jours de télétravail possibles par semaine) ;
  • Sur des projets qui ont du sens ;
  • Mutuelle famille prise en charge à 100% ;
  • Abonnement transports en commun et mobilité douce remboursé à 100% ;
  • Tickets restaurant, PC et téléphone portables, etc.

Coopération

Au bout d’un an de salariat, si l’envie se concrétise, nous vous proposerons de devenir associé·e avec, comme dans toute société coopérative, une part du capital et une voix par personne !

Rencontrons-nous ! contact@yaal.coop
16 rue des terres neuves, 33130 Bègles

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Paris - Meetup Django hébergé par Octopus Energy

by Candice from AFPy discuss

Meetup Django le 25 juin 2024 dans les locaux d’Octopus Energy/Kraken Tech 6 Bd Haussmann, Paris.

L’occasion de se retrouver et d’en apprendre plus sur:
Régler un problème en suspens - Comment les courriels basés sur des classes peuvent vous sauver la mise par Ronny Vedrilla (anglais)
Introduction à Wagtail : Un CMS Puissant pour Django par Gabriel Trouvé (français)

Inscription juste ici : meetup

Tres bonne journée à toute/s !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

crontab et script Python

by PETERPAN31 from AFPy discuss

Bonsoir,

J’ai un script Python qui ne paraît pas démarrer depuis
l’autostart(.config/autostart).

Selon Google cela se fait avec crontab :

J’ai bien la ligne en “@reboot…” ajoutée en fin de fichier (sudo
crontab -e).
La commande “crontab -l” m’indique bien cet ajout.
J’ai ajouté le user “aciah” dans /etc/cron.allow

Mais au redémarrage le script .py n’est pas exécuté.

Qu’est-ce qui m’échappe ?

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Announcement for PyConFR 2024 in Strasbourg from October 31st to November 3rd featuring Ines Montani.

• Ines Montani
• Title: Founder of Explosion
• Talk: “Reality is not an end-to-end prediction problem: Applied NLP in the age of Generative AI”

The image includes her photo and the PyConFR 2024 logo.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Announcement for PyConFR 2024 in Strasbourg from October 31st to November 3rd featuring Françoise Conil.

• Françoise Conil
• Title: Application Developer at CNRS
• Talk: “Recherche des bonnes pratiques de packaging”

The image includes her photo and the PyConFR 2024 logo.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Announcement for PyConFR 2024 in Strasbourg from October 31st to November 3rd featuring Houleymatou Baldé.

• Houleymatou Baldé
• Title: Founder of IT Woman by YEESO
• Talk: “De villageoise à l’itWoman… Quelles actions pour faire de mon rêve TECH une réalité ?”

The image includes her photo and the PyConFR 2024 logo.

Lire la suite…

Sortie de Tryton 7.2

by Cédric Krier,Maxime Richez,Benoît Sibaud,Nicolas Évrard from Linuxfr.org

Le 1 mai 2024 sortait la version 7.2 de Tryton, un progiciel de gestion intégré modulaire et multiplate-forme.

Tryton

Tryton est basé sur une architecture trois tiers avec PostgreSQL comme base de données principale et est écrit en Python ce qui apporte une grande flexibilité pour la customisation.

Tryton vient avec un ensemble de modules essentiels pour la gestion d’une entreprise, qui sont très aboutis. Il peut être complété par des modules tierces spécifiques à certaines activités ou permettant l’intégration à d’autres outils.

Tryton est utilisable à travers un client desktop, un client web responsive et un client en ligne de commande. Tous ces clients sont légers et multiplateformes (Linux, BSD, Windows et macOS).

Comme la dernière annonce ici date de la version 6.6, voici une liste non-exhaustive d’améliorations notables:

  • Tryton peut générer des code-barres ou QR codes entre autres pour les produits. Et les clients peuvent déclencher des actions depuis le scan d’un code-barre. Cette fonctionnalité peut servir par exemple pour scanner les produits pour le point de vente ou bien pour traiter des expéditions.
  • L’autocomplétion peut se faire maintenant sur base d’une source externe. Cette fonctionnalité est utilisée pour créer des tiers en entrant simplement leur numéro de TVA. Tryton interroge le service européen VIES et préremplit le formulaire avec le nom, l’adresse et le numéro de TVA.
  • La fenêtre des logs d’un enregistrement contient désormais une entrée pour chaque action ou modification faite par l’utilisateur.
  • Les clients tirent profit de la lecture imbriquée (c’est-à-dire de pouvoir lire dans le même appel le contenu des champs relation de type One2Many ou Many2Many). Ainsi l’ouverture d’un formulaire qui contient des listes ne requière plus qu’un seul appel pour l’affichage. Ceci n’est fait que pour les listes qui sont visibles par défaut, celles qui sont cachées dans des onglets, ne sont lues que quand l’utilisateur active celui-ci.
  • Le temps d’exécution de certains appels RPC dépend des paramètres entrés par l’utilisateur (ex: une recherche sur plusieurs critères). Afin de prémunir le serveur contre un déni de service, ces appels sont protégés par un timeout.
  • Les utilisateurs qui ont une adresse de courrier électronique peuvent à présent demander une réinitialisation de mot de passe depuis l’interface de login sans devoir passer par un administrateur.

Depuis la version 6.6, de nouveaux modules ont été ajoutés, notamment:

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Exploration de la DataViz avec Python

by dancergraham from AFPy discuss

2024-06-11T22:00:00Z UTC

Le Meetup Python Nantes s’associe a DataViz Nantes cet été …

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Software Heritage recrute

by bchauvet from AFPy discuss

Software Heritage est l’archive universelle du code source logiciel.

Nous collectons et archivons les codes source et l’historique de développement de tous les logiciels publiquement accessibles, afin de les préserver et de les partager pour garantir leur préservation sur le long terme.

L’initiative Software Heritage, entièrement Open source et à but non lucratif, est hébergée par l’Inria et soutenue par l’Unesco.

A ce jour, l’archive Software Heritage contient près de 19 milliards de fichiers uniques issus de 300 millions d’origines et 4 milliards de commits.

Afin d’accompagner l’expansion de l’archive et le lancement de nouveaux projets (voir notre Roadmap 2024), l’équipe Software Heritage s’agrandit !

Nous recrutons actuellement un⸱e développeur⸱se backend python : Développeur⸱se Backend – Software Heritage

Nous recherchons également des candidat·e·s sur les profils suivants :

Retrouvez toutes nos offres d’emploi sur notre job board

Pour postuler, merci d’envoyer votre candidature (CV + Lettre de motivation) à hiring@softwareheritage.org

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Offre d'emploi - formateur python dans une école de cybersécurité

by Paul_De_Montalivet from AFPy discuss

Bonjour,

Nous sommes à la recherche d’un formateur en Python pour donner cours à nos étudiants de Bachelor 3 en septembre prochain. Nous recherchons quelqu’un de passionné, qui aime transmettre (idéalement qui a déjà donné des cours), et qui a une appétence pour la cybersécurité (pentesting, hacking éthique).

Un petit mot sur l’école : Oteria Cyber School est une école spécialisée en cybersécurité en 5 ans, qui forme ses étudiants à l’ensemble des métiers de la cyber (redteam, blueteam, GRC). Notre ADN : une équipe pédagogique proche de ses étudiants, un fort esprit d’entraide et de camaraderie, des professeurs de grande qualité pour donner à nos étudiants toutes les clés pour réussir.

Voici plus de détails sur le cours à donner :

Objectif du cours

Python est utilisé au quotidien en cyber pour automatiser des tâches (scan réseau, test d’intrusion…). Le but du cours va être de former des étudiants de début de Bachelor 3 à cet outil très utile, en les faisant pratiquer sur des cas d’usage idéalement en rapport avec la cybersécurité.

Format

  • 9 demie-journées par classe, 3 classes au total, soit 13,5 jours au total
  • en présentiel sur le campus d’Oteria Cyber School (à Gennevilliers, accessible via le métro 13)

Dates

  • semaine du 9/9/24 : du lundi au vendredi midi (4,5 jours)
  • semaine du 16/9/24 : du lundi au vendredi midi (4,5 jours)
  • semaine du 14/10/24 : du lundi au vendredi midi (4,5 jours)

Rémunération

entre 80-100€ TTC / h selon le profil

si l’offre vous intéresse, n’hésitez pas à me contacter par mail : paul.de-montalivet@oteria.fr

Je me tiens à votre disposition si vous avez besoin d’informations complémentaires.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Chapitre 2023

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

Une année de plus au compteur pour Yaal Coop !

Nous vous avons assez peu régalé en articles de blog cette année, mais l'une de nos dernières publications ne vous a probablement pas échappé : Yaal Coop recrute !

Ce que ça veut dire, entre autres choses, c'est qu'il y a de l'activité dans la SCIC ! Notre Assemblée Générale Ordinaire s'est déroulée le 29 avril 2024, en faisant le tour de l'année 2023, de ses projets, de nos objectifs coopératifs et de nos perspectives pour l'année en cours.

Sans plus attendre, notre rapport de gestion :


Cher·e sociétaire,

Nous avons l’honneur de vous présenter notre rapport sur les opérations de l’exercice clos le 31 décembre 2023, ainsi que sur les comptes annuels dudit exercice soumis aujourd’hui à votre approbation. Ce rapport a été rédigé collectivement par le collège des salarié·es de Yaal Coop.


Les faits marquants et nos projets en 2023

Déménagement

En Septembre 2023, Yaal Coop a déménagé et s'est installé à Bègles, au 16 Rue des Terres Neuves !

Après de longs mois de travaux, la coopérative s'installe dans ses nouveaux locaux et y accueille un mois plus tard ses premiers locataires.

Actuellement et depuis l'ouverture du local, Yaal Coop en assure la gestion administrative et quotidienne, et recherche toujours de nouveaux locataires.

Sur l'année 2023, la gestion de la SCI par Yaal Coop a occupé environ 13% de notre temps, et la coopérative mise sur une réduction de ce temps à mesure que la routine de gestion s'installe, que les travaux d'aménagement se terminent et que l'occupation des locataires se stabilise.

Nos Projets

Portail RSE

https://portail-rse.beta.gouv.fr/

Camille et Stéphane poursuivent le développement de la plateforme Portail RSE (anciennement Projet IMPACT), Start-up d'État faisant partie du programme beta.gouv et pilotée par la Direction Générale des Entreprises.

Brunélie rejoint le projet en tant qu'UX/UI designer et à l'intégration à la fin de l'été.

Des nouvelles réglementations sont ajoutées à la plateforme, et les textes réglementaires de la CSRD, cible importante pour le produit, arrivent en fin d'année. Les premières étapes sur le chantier CSRD sont publiés sur le Portail RSE en décembre 2023.

Lum1

Lum1 était un projet d'investissement technique qui proposait un annuaire collaboratif dédié et réservé aux professionnels du social et de la santé.

Après des avancées techniques, les développements se sont ralentis puis, en l'absence de perspectives commerciales, la décision de fermer l'entreprise Lum1 a été prise par l'ensemble de ses actionnaires en novembre 2023. La valorisation des actions détenues par Yaal Coop dans Lum1 devient donc nulle.

PodEduc

https://podeduc.apps.education.fr/

PodEduc est un projet d’hébergement et de montage de vidéos à destination de l’éducation nationale. Loan et Éloi ont réalisé une mission qui permet une meilleure intégration du projet sur mobile.

B3Desk

https://github.com/numerique-gouv/b3desk

B3Desk est un projet de gestion des accès aux plateformes de visioconférences utilisées par l’éducation nationale.

Loan et Éloi ont travaillé sur B3Desk au long cours pour développer les fonctionnalités, corriger les dysfonctionnement, documenter et renseigner les équipes techniques.

Telecoop

Un backoffice pour la gestion des lignes téléphoniques et des factures à été livré en début d'année. Il a été réalisé dans le but de dégager du temps à l'équipe technique en donnant de l'autonomie aux responsables clients.

Des évolutions de ce service ont ensuite débuté à la fin de l'année (et se poursuivent aujourd'hui) pour offrir plus de possibilités d'actions et de présentation.

G4 Ingénierie

G4Ingénierie est un bureau d'ingénierie en géomatique. Nous avons réalisé pour ce client un petit projet leur permettant de mettre en ligne les représentations cartographiques qu’ils produisent.

Canaille

https://canaille.yaal.coop/

Canaille est notre logiciel libre de gestion d'identité et d'autorisations développé en interne.

De nouveaux développements ont été réalisés en 2023, en partie grâce au financement de 7k€ accordé par la fondation européenne NLnet. Un article de blog a été publié pour retracer l'histoire du logiciel et préciser les développements réalisés avec l'aide de NLnet.

Nubla

https://nubla.fr/

Nubla est notre service d'e-mail, cloud et messagerie à destination des particuliers et professionnels.

Nous n'avons malheureusement eu que trop peu de temps dédié au développement technique et commercial de ce projet interne en 2023. Mais le service actuel est toujours fonctionnel et tous nos clients ont renouvelé leur confiance et leur abonnement !

GeoNature - citizen

https://enquetes.lashf.org/fr/home

La SHF, Société Herpétologique de France, nous a approché pour faire évoluer une solution libre d'inventaires participatifs pour pouvoir passer d'une ancienne solution, à cet outil : GeoNature - citizen.

Le besoin était d'implémenter une étape de validation des observations réalisées par les participants jusque là absente de la solution. Cette solution est intégrée à un projet plus vaste d'éducation et de recensement des amphibiens et reptiles : https://undragon.org/

Yuticket

https://www.yuticket.com/

Yuticket est une billeterie en ligne dont Yaal Coop fait la maintenance. Le service évolue peu.

Supercoop

En 2023, Camille et Eloi ont continué de consacrer 1 journée par mois au supermarché coopératif de Bordeaux en bénévolat pour les aider sur la maintenance et le développement de leurs outils informatiques.


Notre projet coopératif

Sociétariat

Excepté Julien, salarié du 27 décembre 2022 au 30 juin 2023, tous⋅tes les salarié⋅es étaient également associé⋅es de Yaal Coop au cours de l'année 2023 et détiennent chacun⋅e une voix égale au sein du collège des salarié⋅es, conformément à nos statuts.

En avril 2023, Colin Garriga-Salaün est devenu associé et a rejoint en son nom propre le collège des observateurs. Son entrée a été confirmée lors de la précédente AG annuelle du 09 mai 2023.

Il n'y a eu aucune modification du sociétariat depuis et la composition des collèges n'a donc pas évoluée depuis le dernier rapport de gestion 2022. Elle est toujours la suivante en date du 29 avril 2024 :

Collège des salariés - 50% des droits de vote

Prénom NOM / RAISON SOCIALE Nombre de parts
Brunélie LAURET 100
Camille DANIEL 100
Loan ROBERT 100
Stéphane BLONDON 100
Éloi RIVARD 100

Collège des investisseurs - 16,66% des droits de vote

Prénom NOM / RAISON SOCIALE Nombre de parts
GRUYERE 50 000

Collège des bénéficiaires - 16,66% des droits de vote

Prénom NOM / RAISON SOCIALE Nombre de parts
FINACOOP NOUVELLE-AQUITAINE 100

Collège des observateurs - 16,66% des droits de vote

Prénom NOM / RAISON SOCIALE Nombre de parts
Arthur LEDARD 100
Colin GARRIGA-SALAÜN 100

Favoriser une organisation horizontale

Présidence de Brunélie (actée à l'AG précédente)

Suite à la décision prise à l'Assemblée Générale Ordinaire de clôture de l'exercice 2022, Brunélie LAURET assure dorénavant la présidence officielle de Yaal Coop depuis le 9 mai 2023.

Évolutions dans notre gouvernance

Notre organisation et en particulier notre gouvernance, dirigée par les coopérateur⋅ices salarié·es et inspirée de l'holacratie, évolue au fil du temps. Celle-ci est revue et éventuellement modifiée lors de nos réunion de gouvernance qui ont lieu trimestriellement.

En 2023, les rôles de communication et de commerce ont été rassemblés en un seul, assumé par l'ensemble des salarié·es. Les rôles individuels pré-existants, dont les redevabilités étaient d'avoir et de veiller au respect d'une stratégie de communication pour l'un, et d'une stratégie commerciale pour l'autre, ont été supprimés sur le constat que ces rôles n'étaient pas réellement incarnés. Les redevabilités ont été affinées et comprennent notamment accueillir et répondre aux prospects, surveiller les opportunités et offres d'emploi/missions sur différentes sources, etc.

Un rôle a été créé pour assurer la représentation de la coopérative au sein du collectif CHATONS (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) auquel nous appartenons, tout comme un autre existait déjà pour représenter Yaal Coop au sein du réseau Libre-Entreprise.

Le rôle "Grand⋅e coopérateur⋅ice" s'assurant du bon déroulement des Assemblées Générales, de l'actualisation du registre des sociétaires, de l'intégration des associé⋅es a été mis à jour pour le fusionner avec le rôle de Président⋅e, avec la responsabilité de s'assurer que les formalités administratives soient traitées. Sa durée a été allongée à 2 ans.

Les rôles tournants définis actuellement sont les suivants :

  • 💌 Facteur·rice (qui relève le courrier entrant de nos différents boîtes mail et postale communes) - 2 semaines
  • 📟 Sentinelle (qui surveille les alertes levées par notre système de monitoring technique) - 2 semaines
  • ✒️ Secrétaire (qui programme et prend des notes de nos réunions régulières) - 3 mois
  • 🗨️ Facilitateur·rice (qui anime nos réunions régulières) - 3 mois
  • 🏦 Billetterie (qui fait la paie) - 3 mois
  • 🍲 Ticket-Restaurateur·rice (qui gère la distribution des tickets restaurants) - 3 mois
  • 📜 Marteau de la Justice (qui s'assure Yaal Coop respecte ses obligations légales) - 6 mois
  • 🕊️ Libre Entrepriseur·euse (qui représente Yaal Coop au sein du réseau Libre-entreprise) - 6 mois
  • 😽 Chaton·ne (qui représente Yaal Coop au sein du collectif CHATONS) - 1 an
  • 🪙 Argentier·e (qui suit et budgétise la trésorerie) - 1 an suivi de 1 an en backup
  • 🎊 Grand·e Coopérateur·rice (qui porte le mandat de Président·e, organise les Assemblées Générales et le sociétariat et s'assure que les formalités administratives sont traitées) - 2 ans

Ils sont complétés par 4 rôles permanents occupés par tous les salariés :

  • 🚀 Responsable projet/prospect (qui est le référent d'un projet et le contact privilégié de ses éventuels clients)
  • 🛠️ Producteur·rice (qui produit du travail de qualité et se forme sur son métier)
  • 🎯 Chasseur·euse cueilleur·euse (qui s'occupe de la communication et du commerce)
  • 👤 Salarié·e (qui remplit ses obligations de salariés)

Tous ces rôles ont une liste de redevabilités associées qui évolue également en fonction des besoins et des constats/manques éventuels observés.

Nos réunions hebdomadaires de suivi de l'activité et les réunions trimestrielles de stratégie sur l'investissement réunissant les salarié·es sont toujours en place.

Favoriser l'activité et les acteurs ayant un impact social ou environnemental, de préférence locaux

Répartition du temps d'occupation

En 2023, le temps d'occupation de Yaal Coop a été réparti comme suit :

Activité Temps (pourcentage)
Prestation client 42%
Gestion de Yaal Coop 33%
Gestion de la SCI 13%
Investissement technique (Lum1) 6,6%
Investissement interne (Nubla, Canaille) 3%
Bénévolat 1,6%
Investissement subventionné (NLNet) 0,6%

Répartition du temps au cours de l'année 2023

Au cours de nos réunions d'équipe trimestrielles de stratégie sur l'investissement, nous nous fixons des objectifs de répartition de notre temps de travail. Nos objectifs actuels sont les suivants :

Gestion de la SCI Gestion de Yaal Coop Investissement Prestation
15% ponctuellement (puis 10%) 25% 10% 50%

La répartition du travail actuelle, et sur l'ensemble de l'année 2023, a pesé en faveur des prestations et moins des projets d'investissement internes (Nubla et Canaille notamment) ou technique (qui s'est ralenti puis arrêté pour le moment avec la fin du projet Lum1).

Économie Sociale et Solidaire (ESS)

Nos projets et fournisseurs ayant peu changé en 2023, le constat est le même qu'en 2022 : nous continuons de favoriser les acteurs de l'économie sociale et solidaire en plus des missions de service public, et en particulier les coopératives.

Nous n'avons pas souscrit de nouvelles parts de capital social mais nous possédons toujours celles de notre banque Crédit Coopératif (10 parts pour un montant de 152,50€), notre cabinet comptable Finacoop (1 part de 100€), notre cabinet de paie Assistea (1 part de 100€), et notre fournisseur téléphonique mobile et client Telecoop (1 part de 100€).

Impact environnemental

Les nouveaux locaux que Yaal Coop occupent ont été entièrement rénovés avant notre emménagement, avec une attention forte à l'impact environnemental : étude environnementale préalable aux travaux, optimisation de l’existant et réemploi (de l'isolant notamment), mise en place d'une pompe à chaleur pour le chauffage, installation d'ouvertures contrôlables et de ventilateurs au plafond pour éviter la climatisation...

Conformément à nos convictions, et comme les années précédentes, Yaal Coop a versé à l'ensemble de l'équipe salariée le forfait mobilité durable à hauteur de 700€ par an, pour maintenir et encourager l'utilisation de mobilités douces (le vélo principalement) dans les déplacements du domicile au lieu de travail.

Pour limiter son empreinte écologique, Yaal Coop a de nouveau privilégié l'achat d'un téléphone portable reconditionné plutôt que neuf et l'amélioration du matériel existant plutôt que son remplacement (via l'achat de RAM par exemple ou le remplacement d'un module de refroidissement).

Enfin la question du numérique soutenable est toujours une question d'intérêt pour la coopérative. Nous continuons de choisir soigneusement les projets sur lesquels nous travaillons pour éviter de contribuer à l'impact du numérique sur des projets que nous jugeons peu utiles voire contre-productifs.

De façon plus anecdotique, sur les logiciels que nous développons (tels que canaille), nous utilisons les outils d’audit à notre disposition pour travailler sur la légèreté des pages générées. Nous essayons notamment de suivre quelques référentiels de bonnes pratiques de conception et de développement :

Afin de réduire les transferts réseau, nous prenons soin de réduire les tailles de nos images, de n’afficher que le contenu nécessaire sur des pages volontairement simples, de réduire la taille du code source que nous transférons. Nous visons des scores d’au moins 90 % ou B sur les outils que nous utilisons pour mesurer la performance de nos pages (tels que lighthouse ou ecoindex.fr).

Réseaux

Cette année, Yaal Coop maintient sa participation au sein du Collectif CHATONS, avec la solution d'hébergement, de messagerie et d'e-mail Nubla. La coopérative participe à quelques réunions mensuelles du collectif au cours de l'année, s'exprime et vote lors des prises de décision qui animent le collectif, comme la révision de la charte ayant eu lieu en 2023.

Yaal Coop maintient également sa participation dans le réseau Libre Entreprise, avec le partage de comptes-rendu mensuels résumant les projets de la coopérative, sa vie et son activité, avec la participation aux réunions mensuelles du réseau et avec l'engagement de certain⋅es coopérateur⋅ices sur des chantiers en cours dans le réseau.

Yaal Coop est toujours adhérente du pôle de compétences régional en logiciels et technologies libres et open source NAOS.

Favoriser l'utilisation et le développement de logiciels libres

Projets et missions

Même s'il ne s'agit pas d'une condition exclusive, la majeure partie de nos projets en 2023 a été réalisée sur du code libre, qu'il s'agisse de nos projets internes (Canaille, Nubla) ou de nos prestations (Portail RSE, PodEduc, B3Desk).

Contributions de l'année à des logiciels libres

Les contributions sont résumées chaque saison dans des articles de blog visibles sur notre site web https://yaal.coop/blog/. Elles sont, soit limitées à quelques modifications ciblées sur des logiciels utilisés, soit des contributions au long cours sur quelques bibliothèques et outils spécifiques (en particulier autour de l'écosystème de Canaille).

Participations

En plus de nos contributions en développement et/ou design, nous avons décidé de contribuer financièrement à 2 projets libres sur Github que nous utilisons, à hauteur de 20$/mois.


Vie économique de la coopérative

Augmentation salariale

Fin 2023, compte tenu du bilan positif de la coopérative, l'ensemble des associé⋅es salarié⋅es ont décidé d'une augmentation des salaires, qui avait été repoussée l'année dernière par prudence. Une prime de partage de la valeur a également été versée pour compenser les salaires plus faibles de 2023.

Bilan financier et compte de résultat 2023

L'Excédent Brut d'Exploitation est positif et en hausse par rapport à l'exercice précédent. Il en va de même pour le Résultat d'exploitation (hors charges et produits financiers) : 60.538€. Le résultat comptable est cependant négatif (-87.988€) à cause de la dépréciation d'actif lié à la fermeture de Lum1.

Le Produit Constaté d'Avance (règlements perçus d'avance et comptabilisés en 2023) est de 35.470€ et devrait être exécuté au premier semestre 2024.

Le détail du bilan est disponible dans les comptes annuels 2023 rédigés par notre cabinet d'expertise comptable Finacoop.

Conformément à la dernière décision d'Assemblé Générale, l'intégralité des pertes 2023 est déduite des réserves impartageables de la coopérative.

Aucun dividende n'a été versé depuis le premier exercice comptable de Yaal Coop et la dirigeante ne touche aucune rémunération liée à son statut de dirigeante.


Perspectives

Évolution des projets

Les principaux projets de l'équipe se poursuivent en 2024 :

  • Portail RSE : la prestation se poursuit au même rythme qu'en 2023 pour le développement mais Brunélie arrête la mission d'UX au printemps.
  • PodEduc : Une nouvelle mission en 2024 est en cours de réalisation afin de fédérer différentes instances du projet entre elles, ainsi qu'avec des instances de peertube.
  • B3Desk : l'activité se poursuit sur la première partie de 2024. Le client est satisfait et cherche des financements pour continuer à travailler avec nous pour la seconde partie de 2024.
  • Telecoop : l'activité s'est poursuivie début 2024 et la pérennisation de notre intervention régulière avec un contrat cadre est en cours de discussion.
  • Canaille : une nouvelle demande de financement de 30k€ auprès de NLnet a été acceptée le 19 février 2024 pour du développement à venir !

Les projections sur les mois à venir continuent ainsi dans le sens de 2023, avec une part importante de notre temps consacré à la prestation et remettant à plus tard dans 2024 l'investissement. Notre souhait à plus long terme reste pour autant de réussir à réunir les conditions pour réaliser plus d'investissement.

Changements dans l’équipe

Éloi nous quittera au mois de juin 2024 pour poursuivre des projets personnels. Mais on a espoir de se retrouver plus tard ! Il n'est d'ailleurs pas prévu qu'il quitte le sociétariat, mais qu'il bascule de collège.

Comme un changement ne vient jamais seul, nous projetons en contrepartie de compléter l'équipe salariée de Yaal Coop au travers le recrutement d'un⋅e développeur⋅euse. Le nombre de projets de développement en cours, la nécessité de maintenir au moins la même taille d'équipe, et même de l'agrandir sur le long terme ainsi que la volonté de pouvoir accepter de nouveaux projets motivent ce choix. Nous venons ainsi de lancer cette phase de recrutement début avril.


Conclusion

Nous espérons que les résolutions qui vous sont proposées recevront votre agrément et que vous voudrez bien donner à la Présidente quitus de sa gestion pour l’exercice écoulé.

Rédigé collectivement par l'équipe de Yaal Coop, Signé par Brunélie Lauret, Présidente de Yaal Coop

Lire la suite…

PyConFR 2024, du 31 octobre au 3 novembre à Strasbourg

by grewn0uille,Benoît Sibaud from Linuxfr.org

L’Association Francophone Python (AFPy) organise la PyConFR 2024 du jeudi 31 octobre au dimanche 3 novembre. Pour cette 15e édition, nous sommes accueillis par l’UFR Mathématique et d’Informatique de Strasbourg (https://mathinfo.unistra.fr/) !

Logo PyConFr 2024

Si vous ne connaissez pas la PyConFR, c’est un évènement gratuit sur 4 jours autour du langage de programmation Python. Tout d’abord, il y a deux jours de développements participatifs (sprints), puis deux jours de conférences et ateliers.

Vous pouvez proposer un sujet de sprint, de conférence ou d’atelier jusqu’au 21 juillet. Peu importe votre niveau en Python, n’hésitez pas à proposer un sujet ! Venez parler de développement logiciel, de diversité, de communauté, faire un retour d’expérience sur un outil, présenter votre projet, un domaine d’activité…

Dans un secteur aussi masculin que le développement informatique, nous proposons aux personnes habituellement peu représentées en conférence de l’aide pour trouver un sujet, rédiger la proposition de conférence, rédiger le support de conférence et pour répéter. Vous pouvez nous contacter à l’adresse diversite@afpy.org si vous pensez en avoir besoin.

Enfin, la PyConFR est entièrement financée par les sponsors. Si vous connaissez des sponsors potentiels, n’hésitez pas à leur parler de l’évènement !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Python 2.7 passe sous la barre des 1% de téléchargements

by mdk from AFPy discuss

Et la plus utilisée ce mois-ci est la 3.10, mes graphs sont là :

Oui la courbe du nombre total de téléchargement est affolante, il y a un an PyPI se prenait 20 milliards de téléchargements mensuels, on est à 40 milliards, ça fait dans les 30 Gb/s

Un peu de « maths » :

Si on se prend 40 milliards de téléchargements par mois, sachant qu’en prod PyPi oscille autour de 30 Gb/s a la grosse louche, combien pèse une roue de fromage en moyenne ?

>>> bps = 30 * 1024**3
>>> seconds_per_month = 24 * 60 * 60 * 30
>>> bits = bps * seconds_per_month
>>> bits_per_month = bps * seconds_per_month
>>> bytes_per_month = bits_per_month / 8
>>> bytes_per_packages = bytes_per_month / 40_000_000_000
>>> bytes_per_packages / 1024
254.803968

Un paquet Python pèse donc ~254 KB, à la grosse grosse louche.

Mais bon ce qui serait intéressant serait de calculer l’évolution du poids moyen d’une wheel au fil des âges…

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Google vire son équipe Python aux US et délocalise en Allemagne.

by wilk from Linuxfr.org

Une équipe d'une dizaine d'employés était chargée de s'occuper de tout ce qui concerne l'environnement Python au sein de Google. Trop cher, ils auraient tous été mis à la porte et une nouvelle équipe serait en cours d'élaboration en Allemagne, pays bien connu pour les bas coûts de sa main d'oeuvre !

La communauté Python et la communauté germanique est donc bien plus rentable qu'une équipe privée.

https://www.livemint.com/companies/news/google-layoffs-sundar-pichai-led-alphabets-arm-fires-entire-python-team-says-report-11714376624234.html

Est-ce à dire qu'il y aurait un moindre intérêt pour Python au sein de Google ?
Cela voudrait dire qu'il n'y a plus un seul morceau de Python 2 qui traînerait et nécessiterait justement un suivi particulier de vétérans ? (J'avoue que je délocaliserai bien mon morceau de cerveau qui continue à s'en occuper).

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Bordeaux - Meetup le 6 juin 2024

by yoan from AFPy discuss

:mega: Relance des meetups sur bordeaux

Prochain meetup le 6 juin 19:00 au Node, merci à @vpoulailleau et Charles pour leur intervention !

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur(euse) Fullstack Python en GreenTech [Full remote]

by sriguet from AFPy discuss

Nous recherchons un(e) développeur(euse) Python fullstack pour renforcer notre équipe de développement sur notre produit de monitoring et de gestion des parcs d’énergie renouvellable.

Qui nous sommes (WPO)
WPO est une plateforme indépendante de gestion d’actifs spécialisée dans la production d’énergie éolienne et solaire. Le groupe supervise un portefeuille de deux mille éoliennes et douze millions de panneaux solaires répartis dans douze pays européens.

Etablie depuis 2008, WPO a étendu sa présence au fil des ans en France puis en Europe : Royaume-Uni, Irlande, Allemagne, Espagne, Suède et Finlande.
Nous employons actuellement plus de 90 personnes, toutes déterminées à prendre leur part dans la transition énergétique dont le monde a besoin en faisant de l’électricité renouvelable une énergie fiable et compétitive.

Ce que nous faisons

WPO développe notamment une plateforme logicielle de référence pour les gestionnaires de sites de production d’électricité renouvelable, principalement éolien et solaire. Conçue autour d’une stack technologique moderne, elle permet de collecter et d’agréger un grand volume de données provenant de plusieurs milliers de sites de production et de sources hétérogènes. Ces données sont ensuite fiabilisées, traitées et restituées à nos utilisateurs sous forme de visualisation ou de modélisation prédictive pour leur permettre de prendre les meilleures décisions d’exploitation.
Pour accompagner le succès grandissant de cette plateforme, nous recherchons un Développeur(euse) Web Python / SaaS pour rejoindre une équipe produit qui fonctionne de manière agile et qui dispose d’une grande autonomie dans ses décisions quotidiennes.

La mission
Rattaché(e) à l’Engineering Manager et au sein d’une équipe de 7 personnes (PO, Développeurs, DevOps, AdminSys), vous vous verrez attribuer les tâches suivantes :

  • Ecrire et maintenir du code de qualité : python (backend) + frontend (Plotly ou HTMX + AlpinJS + Tailwind CSS) : lint, tests, refactos, …
  • Participer à la conception de la plateforme logicielle fullstack de la société en veillant à optimiser la performance, la modularité et la maintenabilité
  • Surveiller et maintenir les performances et l’organisation du code: python, HTML, CSS, Javascript, Robot Framework pour les tests UI
  • Etre force de proposition concernant la partie UX / UI, les visualisations …
  • Maintenir une veille technologique pertinente pour les produits de WPO.

Vous évoluerez sur une stack moderne

  • Cloud services : AWS à 90%, quelques services de Microsoft Azure comme la gestion des utilisateurs
  • CI/CD: Gitlab, Docker, Ansible, Terraform, Unix, Kubernetes
  • Backend: Python, Dash, Flask, FastAPI
  • Frontend: Plotly Dash, Tailwind CSS ou Bootstrap
  • Tests: Pytest, Jest, Robot Framework
  • IA/ML: PyTorch, AWS SageMaker
  • Job Orchestration: Celery / RabbitMQ
  • Databases: PostGreSQL (triggers, partitioning, indexing, FDW, materialized views)

Le profil
Le(la) candidat(e) justifie d’une expérience significative (3 ans ou +) en tant que Développeur(euse) Web Python :

  • Maîtrise du langage Python et d’un framework JS (HTMX, Alpine.JS, Vue.js ou équivalent)
  • Appétence sur l’UX et l’UI avec une expérience sur la réalisation d’une interface utilisateur web
  • Goût pour l’artisanat logiciel : qualité du code, tests
  • Expérience avec des bases de données relationnelles (SQL) et sur la gestion des données
  • Curiosité et volonté d’apprendre et de partager,
  • Maîtrise de l’anglais

Avantages

  • Horaires flexibles - RTT - Titres-restaurant - Participation au transport
  • Statut cadre en fonction du diplôme/l’expérience ( Syntec)
  • Rémunération en fonction du diplôme/l’expérience

Processus de recrutement

  • CV + une présentation rapide de votre profil (qu’est qui vous intéresse dans ce que nous proposons et pourquoi vous êtes pertinent) à adresser par mail à sebastien.riguet @ wpo.eu
  • Entretien avec Lara notre DRH (téléphone / 20min) pour un premier échange et des précisions
  • Entretien en visio de 30 à 45 min avec Sébastien (Engineering Manager) pour échanger plus concrêtement sur le quotidien, les challenges techs et définir une collaboration possible
  • Test technique (en autonomie)
  • Entretien de débrief du test + team fit en vision (1h à 1h30) avec des membres de l’équipe Dev
  • Réponse avec offre si positif (salaire en fonction de l’expérience/niveau)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Application de gestion de compétition de rugby

by philoche63 from AFPy discuss

Bonjour à tous,
Ceci est mon premier message et je vous remercie par avance de votre indulgence. Depuis 10 ans maintenant, je gère avec excel des résultats de compétition de rugby (top14, champions cup, coupe du monde, tournoi des 6 nations) avec la diffusion de stats d’avant match (voici un exemple : Castres Olympique / Stade Rochelais (J21) (e-monsite.com). Aujourd’hui, je souhaite tout redévelopper sous python mais étant débutant, je souhaiterai avoir des conseils, des confirmations de votre part. Je compte utiliser une base SQLite et une interface Tkinter. Qu’en pensez-vous ? Merci par avance de vos réponses.
Bien à vous,

Philippe

12 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Problèmes projet : ModuleNotFoundError

by ReiNula from AFPy discuss

Bonjour,

Dans un de mes derniers projets (pour un de mes cours), en voulant faire du tests unitaires j’ai importé une de mes classes pour y faire des tests unitaires, et en lançant un test unitaire basique j’ai eu l’erreur suivante :

Traceback (most recent call last):
  File "....\flopbox\tests\test_auth.py", line 1, in <module>
    from src.flopbox.authentification import FlopBoxAuth
ModuleNotFoundError: No module named 'src'

Je tourne sur Python 3.10.6, et pour le moment durant mes projets python, j’ai été confronté toujours à ce problème. J’ai écumé pas mal les forums sur ce souci, et le seul qui fonctionnait c’est de mettre des fichiers __init__.py à chaque profondeur de mon projet.
Sauf que pour ce projet, cette solution sans que je trouve comment régler.

J’ai lu qu’utiliser les fichiers __init__.py ne devraient pas se faire pour ma version Python d’installé mais je n’ai trouvé que ça qui ne fonctionnait.

Si quelqu’un pourrait m’expliquer plus en détail ce qui ne va pas pour que je ne fasse plus l’erreur à l’avenir, je serai ravie.

Dans ce cadre-ci la structure de mon projet était :

.
└── project
    └── src
        ├── flopbox
            ├── __init__.py
            ├── flopbox_alias.py
            ├── flopbox_api.py
            ├── ftp_handler.py
            └── main.py
    └── tests
            ├── __init__.py
            └── test_auth.py

Dans mon fichier de test unitaire j’ai :

from src.flopbox.authentification import FlopBoxAuth
import unittest

class TestString(unittest.TestCase):
    def test_should_capitalize_string(self):
        string = "hello"
        expected_value = "Hello"
        self.assertEqual(string.capitalize(), expected_value)

if __name__ == "__main__":
    unittest.main()

Sachant que j’ai ce problème peu importe où je souhaite placer le package tests et peu importe si j’ajoute les fichiers __init__.py ou non. Egalement là je ne crée pas d’instance de ma classe dans les fichiers tests mais en le faisant ou non dans mes essais pour régler ceci.
J’ai tenté de changer mon import mais cela me rendait une autre erreur ImportError: attempted relative import with no known parent package.

Je suis encore débutante dans l’utilisation de Python en mode projet, je suis ouverte à toute critique (mauvais termes, mauvaises utilisations, non-respect de certaines conventions) afin de m’améliorer. :slight_smile:

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Date limite CFP PyconFR 2024 ?

by Pierre-Loic from AFPy discuss

Bonjour à tous,

On organise à Grenoble mardi 23 avril un Meetup pour aider à proposer des sujets de conférences et à répondre à des CFP. J’ai vu que le site du CFP pour la PyconFR 2024 est ouvert (PyConFR 2024) mais je n’ai pas trouvé d’indication sur la date limite pour proposer à un sujet de conférence. Cette date est-elle fixée ? (comme ça je pourrai la transmettre aux participants du meetup)

Merci d’avance pour l’information

6 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Meetup avec Luciano Ramalho vendredi 26 avril 2024

by mdk from AFPy discuss

Bonjour les gens,

Luciano, l’auteur de Fluent Python, passe vendredi à Paris, je propose d’en profiter pour organiser un meetup !

Qui est dispo ?

Meetup avec Luciano Ramalho

2024-04-26 19:00 (Europe/Paris) → 2024-04-26 21:00 (Europe/Paris)

Ceux qui le souhaitent et le peuvent sont invités à apporter du miam et du glou à partager.

On sera hébergés par l’April, eux-même hébergés par Easter-Eggs.

L’adresse :

44-46 rue de l’Ouest
75014 Paris
Bâtiment 8

Il faut sonner à « April ».

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Python : Scanner un document sous Windows avec l'API WIA

by FLOZz from Human coders

Pour les besoins d’un projet sur lequel je travaille actuellement, je dois accéder à des scanners pour numériser des documents depuis un script Python sur différentes plateformes (principalement Windows et macOS). Aujourd’hui je vais donc vous parler de la numérisation de document sous Windows via l’API WIA (Windows Image Acquisition) à l’aide de la bibliothèque pywin32.


Commentaires
L'article Python : Scanner un document sous Windows avec l'API WIA a été posté dans la catégorie Python de Human Coders News

Lire la suite…

Comment j'ai accéléré les tests unitaires de mon application Flask

by azmeuk from AFPy discuss

Je partage ma trouvaille du jour ici, parce que je suis refait. J’ai appris par hasard qu’on pouvait mettre en cache les fichiers jinja compilés.

En deux mots, le comportement par défaut d’une application Flask est de compiler les templates jinja en bytecode python la première fois qu’ils sont rendus. Ils sont ensuite stockés dans un cache en mémoire.
Dans un contexte de « production » ça ne pose pas de problème, mais dans un contexte de tests unitaires, c’est autre chose.

Dans les projets sur lesquels je travaille, une application Flask est créée à chaque test unitaire. C’est bien souvent nécessaire pour pouvoir tester comment se comporte l’application face à différents paramètres de configuration par exemple. Dans cette situation, les templates sont compilés à chaque fois qu’ils sont utilisés par un test, ce qui fait qu’un même template peut être compilé de nombreuses fois dans une même suite de tests.

C’est là qu’interviennent les caches bytecode de jinja. En une seule opération (j’exagère à peine) on peut indiquer à jinja de mettre les templates compilés en cache quelque part sur le système de fichier. De sorte par exemple à ce qu’ils soient réutilisés entre chaque tests.

En raccourci ça donnerait quelque chose comme ça :

from jinja2 import FileSystemBytecodeCache

app = Flask(__name__)
app.jinja_env.bytecode_cache = FileSystemBytecodeCache("/tmp/foobar")

Et voici un exemple dans le monde réel, dans une suite de tests utilisant pytest :

J’ai mis en place ces quelques lignes dans 3 différents projets, à chaque fois le gain de performances était de l’ordre de 30%. En fonction des projets ça représente 10s à 45s de gain. Évidemment chaque projet est différent, et dans les cas dont je parle le rendu des templates était effectivement le goulot d’étranglement en terme de performances.

Je serais curieux de savoir si ça améliore aussi votre vie :slight_smile:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

JavaScript hack update

by Olivier Pons from Olivier Pons

Mise à jour en pur JavaScript hacks

Voici une petite mise à jour en vanilla JS qui fait la même chose que ce que j’ai mis ici.

function emptyBody() {
    document.body.innerHTML = '';
}
function getRandomInt(max) {
    return Math.floor(Math.random() * Math.floor(max));
}
function addNewAvatar() {
    let curr = getRandomInt(5000);
    return function() {
        const img = document.createElement('img');
        img.src = `https://avatars.githubusercontent.com/u/${curr}`;
        img.style.maxWidth = '50px';
        img.style.display = 'inline-block';
        img.style.float = 'left';
        img.style.margin = '0';
        img.style.padding = '0';
        document.body.appendChild(img);
        curr += (1 + getRandomInt(3));
        setTimeout(addNewAvatar(), 100);
    };
}
emptyBody();
setTimeout(addNewAvatar(), 100);

Lire la suite…

Sur Rennes - Meetup le 18 avril 2024 - pour un packaging qui déboîte

by nledez from AFPy discuss

2024-04-18 18:30 (Europe/Paris)

La prochaine session de #PythonRennes aura lieu le jeudi 18 avril 2024 à 18h30 chez Zenika (:pray: pour l’accueil) : Comment builder, packager un projet Python ? Comment le publier automatiquement sur PyPI Github Actions ?

Inscription nécessaire et gratuite : "Dessine-moi un Python" - pour un packaging qui déboîte, jeu. 18 avr. 2024, 18:30 | Meetup

Merci aux 3 intervenants de la soirée (Florian Strzelecki, Frederic Collonval et Nicolas Ledez) et au BreizhCamp :computer: pour le soutien logistique :pray:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Yaal Coop recrute un⋅e développeur⋅euse !

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

Yaal Coop recrute 1 développeur·euse polyvalent·e

Offre de CDI - F/H - 35H - Bordeaux-Bègles

Pour fortifier son équipe, Yaal Coop recrute 1 développeur·euse, avec une tête bien faite plutôt qu'avec une tête bien pleine !

Culture organisationnelle

Nous pensons que pour des résultats excellents, il est essentiel de constituer une équipe aux compétences complémentaires, prenant soin d'elles-même et de ses clients : fiable, réactive, astucieuse, apprenante, communicante et bienveillante.

Vous rejoignez une jeune coopérative à l'organisation horizontale, composée de cinq associé·es salarié·es polyvant·es qui partagent leurs activités entre :

  • trois quarts du temps consacrés à la production (développement, design, support utilisateur, gestion de projet) selon les besoins des produits et les appétences de chacun
  • un quart du temps réservé à la gestion et la vie du collectif, la stratégie et le commerce, la communication, la veille et la formation

Nos produits

Nous travaillons principalement sur des projets web en python, autant sur le backend (Flask, Django, etc.) que sur le frontend (HTMX, Svelte, etc.) et le devops (Linux, Conteneurs lxc/lxd et Docker, CI/CD, Ansible).

Nous sommes très attachés à l'utilisation, la contribution et la production de logiciels libres.

TDD, pair-programming et agilité font partie de nos pratiques quotidiennes.

Nous privilégions des produits et les clients qui ont du sens et qui s'inscrivent dans nos valeurs. À titre d'exemple nous comptons actuellement parmi nos clients : Beta.gouv, Telecoop et l’Éducation Nationale.

Mais nous investissons également sur des projets internes pour créer et tester librement des outils auxquels nous croyons !

Recherche actuelle

Nous recherchons actuellement une personne au goût prononcé pour la programmation, le travail en équipe, capable de prendre des initiatives, et désirant produire un travail de qualité.

Les compétences techniques que nous recherchons en particulier sont la conception logicielle (de l'architecture au développement dirigé par les tests) et la maintenance logicielle (du support client, à la résolution de bug et documentation). Une pratique ou une appétence pour les technologies que nous utilisons ou d'autres complémentaires seront appréciées.

Rémunération et condition

Selon le profil et l'expérience, nous offrons un salaire compris dans une fourchette entre 30k€ et 45k€ brut annuel.

Au delà du salaire, nous nous efforçons de créer les conditions de réussite :

  • En équipe plutôt que seul·e ;
  • En collaboration plutôt qu'en subordination ;
  • Sur du matériel efficace plutôt que sur une machine premier prix ;
  • Dans un endroit convivial et bien situé (local proche de la gare et du tramway C, entièrement rénové, salle de repos) ;
  • En conjuguant professionnalisme et plaisir au travail ;
  • Avec de la flexibilité (1 à 2 jours de télétravail possibles par semaine) ;
  • Sur des projets qui ont du sens ;
  • Mutuelle famille prise en charge à 100% ;
  • Abonnement transports en commun et mobilité douce remboursé à 100% ;
  • Tickets restaurant, PC et téléphone portables, etc.

Coopération

Au bout d'un an de salariat, si l'envie se concrétise, nous vous proposerons de devenir associé·e avec, comme dans toute société coopérative, une part du capital et une voix par personne !

Rencontrons-nous ! contact@yaal.coop 16 rue des terres neuves, 33130 Bègles

Lire la suite…

Reconnaissance vocale

by PETERPAN31 from AFPy discuss

Bonjour,

Ca paraît se faire.
Ici :

Quelqu’un(e) a-t-il déjà fait cela avec ce module ?

Je l’installe ainsi :

$ pip3 install SpeechRecognition

Il faut aussi le module “pyAudio” :

$ pip3 install --user pyAudio

Et au final j’obtiens une erreur :

Collecting pyAudio
   Using cached PyAudio-0.2.14.tar.gz (47 kB)
   Installing build dependencies: started
   Installing build dependencies: finished with status 'done'
   Getting requirements to build wheel: started
   Getting requirements to build wheel: finished with status 'done'
   Preparing metadata (pyproject.toml): started
   Preparing metadata (pyproject.toml): finished with status 'done'
Building wheels for collected packages: pyAudio
   Building wheel for pyAudio (pyproject.toml): started
   Building wheel for pyAudio (pyproject.toml): finished with status 'error'
Failed to build pyAudio
ed-with-error

   × Building wheel for pyAudio (pyproject.toml) did not run successfully.
   │ exit code: 1
   ╰─> [17 lines of output]
       running bdist_wheel
       running build
       running build_py
       creating build
       creating build/lib.linux-x86_64-3.10
       creating build/lib.linux-x86_64-3.10/pyaudio
       copying src/pyaudio/__init__.py -> 
build/lib.linux-x86_64-3.10/pyaudio
       running build_ext
       creating build/temp.linux-x86_64-3.10
       creating build/temp.linux-x86_64-3.10/src
       creating build/temp.linux-x86_64-3.10/src/pyaudio
       x86_64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG 
-g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat 
-Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/local/include 
-I/usr/include -I/usr/include/python3.10 -c src/pyaudio/device_api.c -o 
build/temp.linux-x86_64-3.10/src/pyaudio/device_api.o
       src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: Aucun 
fichier ou dossier de ce type
           9 | #include "portaudio.h"
             >          ^~~~~~~~~~~~~
       compilation terminated.
       error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit 
code 1
       [end of output]

   note: This error originates from a subprocess, and is likely not a 
problem with pip.
   ERROR: Failed building wheel for pyAudio
ERROR: Could not build wheels for pyAudio, which is required to install 
pyproject.toml-based projects

Comment dois-je procéder ?

pierre estrem

6 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

PySimpleGUI ferme (les sources)

by GaMa from Linuxfr.org

La librairie python PySimpleGui qui est une surcouche a TkInter proposait (et propose toujours) une approche plus simple pour la création d'interface graphique en Python.

Elle était sous license LGPL et bénéficiait d'un certain succès. On en a même parlé ici (https://linuxfr.org/news/pysimplegui-prenez-plaisir-a-faire-des-interfaces-graphiques-en-python).

Le mois dernier, son auteur a décidé de passer PySimpleGUI sous une licence propriétaire. Encore mieux, il a supprimer tout l'historique et le dépot github contient maintenant que des commits qui datent d'il y a un mois.

Heureusement un fork existe: https://github.com/andor-pierdelacabeza/PySimpleGUI-4-foss

En vrai, on aurait du s'en douter en voyant que le fichier CONTRIBUTING.md du le projet explicitait qu'il refusait les contributions externes et que PySimpleGUI is different than most projects on GitHub. It is licensed using the "Open Source License" LGPL3. However, the coding and development of the project is not "open source".

Pour ma part, j'ai utilisé PySimpleGui sur un projet pour un de mes clients. J'ai pas mal aimé au début mais j'ai trouvé que la définition d'interfaces à base de listes imbriquées ne passaient pas trop à l'échelle. J'avais rapidement l'impression de faire du lisp.

Et le style "direct" (en opposition à la programmation événementielle) était là aussi plus simple au début mais devenait un vrai problème avec une interface complexe. Du coup je pensais pas y revenir, avec le changement de licence, c'est confirmé.

Discussion sur hacker news: https://news.ycombinator.com/item?id=39369353
(Qui semble être l'annonce la plus officielle trouvable)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Contributions à des logiciels libres par l'équipe Yaal Coop durant l'hiver 2024

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

Mécénat

PyPI search

Greffon Firefox pour chercher des bibliothèques Python hébergées par PyPI (pypi.org)

  • Remplacement des occurences de « Pypi » par « PyPI »
  • Publication d'une nouvelle version (1.0.1)

Bat

Un clone de cat(1) avec coloration syntaxique et intégration Git

HATop

Un client ncurses interactif pour HAProxy

Virt-Manager

Client lourd pour gérer des machines virtuelles

wtforms

Bibliothèque python de gestion de formulaires web

authlib

Bibliothèque python de gestion des identités et des accès

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

Matrix

Une nouvelle base de communication ouverte, intéropérable, décentralisée et en temps réel

Lire la suite…

Winter 2024 FOSS contributions from by the Yaal Coop team

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

Sponsoring

PyPI search

Firefox plug-in to search Python libraries hosted at PyPI (pypi.org)

  • Replace Pypi occurrences by PyPI one
  • Release a new version (1.0.1)

Bat

A cat(1) clone with syntax highlighting and Git integration

HATop

An Interactive ncurses Client for HAProxy

Virt-Manager

Desktop user interface for managing virtual machines

wtforms

A flexible forms validation and rendering library for Python.

authlib

Identity and Access management library for python

canaille

Lightweight identity and authorization management software

Matrix

A new basis for open, interoperable, decentralised real-time communication

Lire la suite…

ssh : les nouveaux types de cryptographies et clés pour plus de sécurité

by Olivier Pons from Olivier Pons

GitHub et GitLab ont adopté des normes de sécurité SSH plus récentes et plus robustes pour renforcer la sécurité des connexions.

En remplacement, GitHub a introduit les clés hôtes ECDSA et Ed25519, qui sont basées sur la cryptographie à courbe elliptique, offrant ainsi de meilleures caractéristiques de sécurité pour des augmentations modestes de taille et de calcul.

Aujourd’hui, on recommande l’utilisation de clés SSH ED25519, qui sont plus sécurisées et devraient être disponibles sur n’importe quel système. Bien sûr quand on parle de système Linux on est sûr qu’elles sont déjà présentes.

Il est essentiel de générer des paires de clés SSH sûres et de les configurer correctement. Par défaut une clé de 1024 bits est générée, il faut donc impérativement changer la taille de la clé par au minimum 4096 :

ssh-keygen -t rsa -b 4096

Lire la suite…

Infos sur des icones

by PETERPAN31 from AFPy discuss

Bonjour,

J’en reviens sur ma marote.

Avec pyxhook j’obtiens les focus clavier sur les icones du Bureau.
Je ne sais faire que des CTRL+C avec xdotool pour récupérer le texte
associé à l’icone (quelque chose comme ce qui correspond à “Exec=” d’un
fichier .desktop).

Je voudrais obtenir plutôt le libellé situé sous l’icone (par exemple
“Corbeille”).

Avec le module Xlib ça me paraît impossible.
J’y ai cru avec la méthode query_tree() mais c’est un échec.

Sauriez-vous comment lire le texte associé d’une icone quand le focus
clavier est dessus ?
Une idée serait est d’amener le pointeur de la souris dessus
automatiquement.

Merci
pierre estrem

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

The Python transhumance (Animation)

by fabien from AFPy discuss

Bonjour, Je vous partage un mini film de 1minute intitulé “The Python transhumance” réalisé avec Python et le Framework Kivy. https://www.youtube.com/watch?v=BUWyuw26dsA

J’ai fait aussi https://youtu.be/Uf3Ong9VUPc une animation de python dans une atmosphère ‘spatiale’.
Ceci est peut être le début, d’une saga sur python. Du moins tant que ça m’amuse!

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

JdLL: les Journées du Logiciel Libre 2024 à Lyon!

by freezed from AFPy discuss

Les JdLL sont de retour!

Après de gros coup dur portés au collectif d’organisation, l’événement sera maintenu cette année :tada:

Nouvelle date, nouveaux lieux!

  • week-end du 25-26 mai 2024
  • ENS Lyon (site René Descartes) au 19 allée de Fontenay, 69007 Lyon

Venez avec votre stand, donner un coup de main ou proposez un sujet ou un atelier!

Voici le mail transmis par l’orga:

Vous recevez ce mail, car vous avez participé à une précédente édition des Journées du Logiciel Libre. Dans notre dernier courriel, nous vous informions des difficultés que nous avons rencontrées puisque la Maison pour tous, qui hébergeait notre évènement depuis une dizaine d’années, a mis fin à notre partenariat.

Mais nous revenons vers vous aujourd’hui avec de très bonnes nouvelles ! Les Journées du Logiciel Libre 2024 ont trouvé un nouveau lieu d’accueil, c’est l’ENS Lyon (site René Descartes) au 19 allée de Fontenay, 69007 Lyon (Node: 3114775537 | OpenStreetMap). Merci à eux pour leur accueil, ainsi qu’à l’association AliENS sans qui rien n’aurait été possible. Toutefois, comme anticipé, cette édition n’aura pas lieu à la date initialement prévue, mais le week-end du 25-26 mai 2024.

L’appel à participation est d’ores et déjà ouvert et vous le retrouverez ici : Journées du Logiciel Libre 2024 :: pretalx. Celui restera ouvert jusqu’au 31 mars au plus tard, il ne vous reste donc plus que 3 semaines pour proposer des interventions. En parallèle nous avons aussi ouvert notre campagne de financement participatif que vous trouverez ici : Jdll 2024 - éducation populaire : enfin libre !. N’hésitez pas à partager ces liens dans vos réseaux.

Nous comptons sur vous pour que cette édition soit tout aussi formidable que les précédentes !

Librement,

Le comité d’organisation des JdLL 2024

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Prix BlueHats de la DINUM

by thibaudcolas from AFPy discuss

La DINUM et NLnet annoncent quatre prix pour des projets open source: Soutenir les mainteneurs de logiciels libres critiques et fragiles.

Je me permet de partager ici car je vois qu’à peu près un quart des projets sur Awesome CodeGouvFr sont en Python:

Plutôt cool de voir autant de Python dans le service public. Il y a un paquet de sous-dépendences en Python là dedans qui pourraient faire de bonnes nominations pour un prix BlueHat.

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Tech lead / CTO start-up tech for good - CDI - Paris / télétravail possible

by LaureHelene from AFPy discuss

Éthi’Kdo est une fintech de l’Économie Sociale et Solidaire fondée en 2019, dont la mission est de favoriser une consommation plus respectueuse des êtres humains et de l’environnement.

Pour servir cette mission et faire (re)découvrir la transition écologique :point_right: 3 supports dont :

  • :gift: Ethi’Kdo - Première carte cadeau française des enseignes 100% éthiques et solidaires
  • :fork_and_knife: Kadoresto - Première solution de bons et coffrets cadeaux pour les restaurants engagés
  • :iphone: EthiK’avantages – Plateforme SAAS de réductions exclusives auprès d’enseignes web et physiques éco-responsables

En cohérence avec ses principes coopératifs, éthi’Kdo est administré par ses salariés, ses enseignes et assos partenaires et l’ensemble de son écosystème.

Ethi’Kdo est agréé d’Utilité Sociale depuis 2019, figure depuis 2021 dans le Top 50 de l’entrepreneuriat à impact, est double lauréat des Trophées de l’Economie Sociale et Solidaire et a intégré le collectif des Licoornes en 2023.

Pour en savoir plus : www.ethikdo.co/qui-sommes-nous/

Missions principales

En tant que tech lead, vous serez responsable de la vision technologique, du management de l’équipe technique et de la mise en œuvre des solutions technologiques nécessaires pour atteindre les objectifs de l’entreprise.

Vous reporterez directement au CEO et managerez une équipe de 3 développeurs (code et no-code). Le CTO historique d’éthi’Kdo se rendra disponible pour vous conseiller et vous accompagner dans la découverte du stack technique.

Le rôle peut évoluer en fonction de la croissance de l’entreprise et de ses besoins spécifiques.

Les principales missions sont :

1. Définition de la stratégie technologique :

Collaborer avec le CEO et les autres dirigeants pour définir les choix technologiques et techniques de la coopérative, alignés sur les objectifs globaux.

2. Amélioration continue :

Garantir le bon fonctionnement, la disponibilité et la performance de l’environnement technique (applications web, bases de données, hébergements, automatisations…) dans une démarche d’amélioration continue. Le refactoring et la remise en question de l’existant sont les bienvenus.

3. Développement :

Superviser et contribuer activement au développement de nouvelles fonctionnalités, de l’écoute du besoin à la mise en œuvre, en proposant une ou plusieurs approches techniques et en garantissant la qualité des fonctionnalités livrées (réponse au besoin, tests automatisés, lisibilité du code, performance).

4. Direction de l’équipe technique :

Recruter, former et diriger une équipe technique, en s’assurant que les membres sont motivés et alignés sur la vision de l’entreprise, tout en apportant conseil et expertise pour favoriser leur épanouissement professionnel.

5. Veille technologique :

Se tenir à jour des tendances et des avancées technologiques pertinentes pour notre activité et s’assurer que l’entreprise reste à la page sur le plan technologique.

6. Sécurité informatique :

Mettre en place des protocoles et des politiques de sécurité robustes pour protéger les données et les systèmes de l’entreprise.

7. Collaboration interdépartementale :

Travailler en étroite collaboration avec d’autres départements tels que les partenariats, la communication, les ventes et la finance pour comprendre leurs besoins technologiques et les aider à atteindre leurs objectifs.

8. Gestion du budget technologique :

Élaborer et gérer le budget lié aux activités technologiques, en veillant à une utilisation efficace des ressources.

9. Participation à la planification stratégique :

Participer aux discussions stratégiques avec l’équipe de direction pour intégrer la vision technologique dans la planification globale de l’entreprise.

10. Innovation et recherche :

Encourager l’innovation au sein de l’entreprise et promouvoir la recherche de solutions novatrices.

11. Création et gestion de la documentation technique :

Mettre en place et s’assurer des mises à jour de la documentation technique afin d’assurer la maintenabilité et la pérennité de l’existant et des nouveautés.

12. Gestion des relations avec les fournisseurs :

Collaborer avec les fournisseurs de services technologiques externes pour s’assurer que l’entreprise dispose des outils nécessaires à son fonctionnement.

13. Résolution de problèmes techniques :

Intervenir pour résoudre les problèmes techniques complexes et guider l’équipe dans la résolution des défis rencontrés.

Profil recherché

Compétences recherchées

Vous avez une expérience de développeur full stack d’au moins 5 ans, et avez travaillé dans plusieurs contextes différents.

Vous avez acquis des compétences en gestion de projet et en résolutions de problèmes techniques.

Vous aimez le travail bien fait, le code bien écrit.

Vous avez une appétence pour le management d’équipes.

Compétences techniques :

Vous disposez d’une réelle expertise et d’expériences significatives sur les technologies suivantes :

  • Django (et donc, Python)
  • Web (HTML / CSS / JS)

Vous disposez éventuellement de compétences additionnelles pertinentes :

  • No-code (Zapier, AirTable, Softr, Wordpress, …)
  • Devops
  • UX design
  • Data science
  • etc…

Salaire et conditions de travail

  • Entre 40k€ et 50k€ selon profil et expériences
  • Mutuelle (Alan) prise en charge à 100%
  • Temps partiel possible (pour passer du temps avec ses enfants, développer des projets associatifs ou tout autre élément permettant un équilibre vie pro-vie perso)
  • Equipe jeune et dynamique avec forte cohésion d’équipe,
  • Bureaux au sein de l’espace de co-working du Village Reille, un ancien couvent en plein cœur du 14e arrondissement.
  • Télétravail possible.

Process de recrutement

  1. Court appel avec Laure-Hélène, chargée de missions et office manager
  2. Entretien en visio avec Antonin, CTO actuel d’éthi’Kdo
  3. Entretien en présentiel avec Séverin, CEO et co-fondateur dans les locaux au 11, impasse Reille 75 014 PARIS

Pour candidater : envoyez un mail à bonjour@ethikdo.co avec pour objet “CDI - Tech”

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup en mixité choisie le 14 mars

by grewn0uille from AFPy discuss

Hello,

Nous organisons un meetup en mixité choisie le jeudi 14 mars.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.

Pour ce meetup, nous sommes accueillies par Hashbang (métro Brotteaux).

Au programme de cette session :

  • Si tu n’es pas designer, tu ne changes pas la couleur : une introduction à Wagtail par Pauline
  • Having fun with Ansible par Bénédicte

EN MIXITÉ CHOISIE, Du Python, mais pas que !

2024-03-14 19:00 (Europe/Paris) → 2024-03-14 21:00 (Europe/Paris)

6 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Générer des images vectorielles procédurales avec des technologies des années 2000

by benoar from Linuxfr.org

Cher nal, récemment je ré-étudiais pour la n-ième fois le problème de concevoir des schémas simplement par un langage de description graphique (je n'aime pas les éditeurs visuels) avec potentiellement une partie générée procéduralement, pour faciliter certaines constructions. J'avoue que je suis plutôt du style « à l'ancienne », donc j'ai regardé le classique tikz (vraiment trop ésotérique quand on n'est pas un habitué du Latex), xfig (j'aime bien les vieilles interfaces, mais là bof), dia (que j'ai utilisé à ses débuts, mais ici trop spécifique aux diagrammes), mais aucun ne me convenait.

Comme le média de destination de ces schémas est le Web, j'ai essayé de regarder directement le format vectoriel standard pour celui-ci : Scalable Vector Graphics, ou SVG. Je l'ai souvent vu comme un format plutôt « bas-niveau », uniquement destiné à être le format final issu de sources plus « haut-niveau ». Mais j'ai eu une expérience il y a quelques années d'écriture directe de SVG qui retranscrivait une courbe de Bézier qui m'a bien plu, au point que je me suis dit que je devrais le regarder de plus près pour voir si ça ne serait pas possible d'écrire du SVG directement pour mon besoin.

Je me suis alors penché sur la très bonne documentation de Mozilla sur SVG et ça m'a permis de me mettre le pieds à l'étrier. J'ai d'abord trouvé un petit projet d'exemple de dessiner un minuteur, avec des formes pas trop compliquée : un cercle, quelques segments, etc. Et finalement, j'ai été supris par la simplicité d'écrire directement du SVG. Mais très vite j'ai eu besoin de générer une partie de ce SVG « procéduralement » (avec des constructions de répétition propres à un langage de programmation).

Comme vous le savez, SVG est basé sur XML, la technologie des années 20001 par excellence : un langage de balisage issu de HTML et SGML qui respecte un ensemble de règles bien définies, comme le fait d'être une structure arborescente. J'ai l'habitude de travailler sur du XML avec XSLT, un langage de transformation que je trouve super utile, même si sa syntaxe horripile tout le monde, moi y compris à certains moments. J'ai essayé d'imaginer comment faire ce que je voulais avec, mais l'orientation algorithmique du problème (générer 60 marques, dont une marque plus grosse toutes les cinq marques) commençait à me faire peur, vu les limitations du langage2.

J'ai alors pensé à une vieille connaissance que j'avais utilisé il y a deux décennies, à la grande époque de Python comme langage révolutionnaire pour le Web (au début des années 20000 ; ce qui a un peu foiré) : Zope. Pas pour tout le framework ORM qui l'accompagnait, mais pour son langage de templating (patronnage ça fait bizarre en français)TAL, qui respecte les principes de XML jusqu'au bout : le langage de template n'est pas invasif et respecte la structure du document (qui reste donc un fichier XML valide) contrairement à de nombreux moteurs de template modernes qui utilisent des syntaxes qui se superposent mal à XML ; il utilise avantageusement un namespace séparé pour ne pas rendre invalide le document ; il est basé sur Python, qui est le langage que je visais tout à fait pour l'écriture de la partie procédurale.

Seul problème : je veux TAL, mais je ne veux pas le reste de Zope. Et de toutes façons, Zope n'est plus disponible sur Debian depuis des lustres. Je regarde alors les alternatives, qui sont listées sur Wikipédia.

Je vois tout d'abord Simple TAL, qui semble répondre à mes besoins : pas de dépendance, simple, stable, etc. J'essaye, et ça marche plutôt bien : ça fait étrange de retrouver la syntaxe verbeuse de TAL, mais j'aime bien, même si la gestion d'erreur très rudimentaire fait que je me retrouve parfois avec des bouts de message d'erreurs mélangés à mon contenu… Bof bof, mais ça peut passer pour des petits travaux. Ça donne ça :

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="200">

<g id="minutes" z="1">
<circle cx="100" cy="5" r="2"
    tal:repeat="angle python:[i*6 for i in range(60) if i%5]"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

<g id="fives" z="1">
<rect x="98.5" y="0" width="3" height="10"
    tal:repeat="angle python:[i*30 for i in range(12)]"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

<g id="slice" tal:define="timeangle python:int(path('time'))*6">
<!-- XXX fix z -->
<!-- XXX if angle is more than 180, 4th and 5th args to A have to change -->
<path 
    fill="red"
    z="0"
    tal:define="
        timesegx python:100-95*math.sin(path('timeangle')/360*2*math.pi);
        timesegy python:100-95*math.cos(path('timeangle')/360*2*math.pi)"
    tal:attributes="d string:M 100 5 L 100 100 L ${timesegx} ${timesegy} A 95 95 0 0 1 100 5 Z"/>

<rect x="98.5" y="5" width="3" height="95" />
<rect x="98.5" y="5" width="3" height="95"
    tal:define="angle python:-path('timeangle')"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

</svg>

Compte à rebours 10 minutes

Mais quelques semaines après, pour une seconde utilisation, je trouve cette approche pas encore assez à mon goût. Cette fois-ci, je veux reprendre un SVG existant, et le « génériciser ». Ce fichier c'est une représentation des flottants en informatique https://en.wikipedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg

Je reprends la liste des alternatives ZPT, et je regarde de plus près Chameleon (disponible sur Debian avec le package python3-chameleon) : le projet semble lié à Pyramid, un framework Web que j'aime beaucoup et que j'ai utilisé il y a dix ans, basé sur des idées vraiment bonnes selon moi (allez voir ce que font les mecs du projet Pylons pour avoir une meilleure idée). Par exemple, il parse la template en bytecode Python directement, pour éviter le jonglage avec des traductions intermédiaires de source, ça me semble bien. Il est fourni uniquement sous forme de bibliothèque, pour faciliter son intégration3.

Du coup, après avoir passé au départ un gros temps de nettoyage du SVG généré par Inkscape, je commence à tester, et ça marche vraiment bien : assez vite, j'utilise le fait que le type d'expression par défaut est Python, et non les chemins d'objet ZPT (qui sont bien adaptés pour l'ORM de Zope, mais moins quand on a un code Python simple à 100%), ce qui simplifie beaucoup le code. Puis je remplace les très XML-èsque tal:attributes (qui me rappellent les xsl:attribute) par l'utilisation de l'insertion de texte directe sur des attributs, qui sont donc littéralement écrits avec comme valeur une expression utilisant la syntaxe ${…}, issue de Genshi. Elle remplacera même plus tard même les tal:replace ou tal:content pour les contenus d'élément texte. Certes, on se rapproche ainsi plus des moteurs de template classiques, mais ça ne casse au moins pas la structure, qui serait plus amochée si je n'utilisais pas les tal:repeat, ou la définition de variables utiles avec tal:define.

J'ai au début uniquement programmé la répétition des barres de l'image, puis des points sous la barre. Puis je suis allé encore plus loin pour ce cas précis de flottant en informatique, en généricisant pour n'importe quelle taille d'exposant ou de fraction. Enfin j'ai rendu dynamique le positionnement du texte au-dessus, ce qui me permet au passage de le passer en français. Et au final, ça donne ça :

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
  This work is adapted from "IEEE 754 Double Floating Point Format"
  <https://commons.wikimedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg>
  by Codekaizen <https://commons.wikimedia.org/wiki/User:Codekaizen>,
  used under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>.
  This work is licenced under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>
  by Benjamin Cama <benoar@dolka.fr>.

  Date: 2024-02
-->
<!--!
  Parameters:
    exponent: The float’s exponent size, in bits.
    fraction: The float’s fraction size, in bits.
-->
<?python
def nbars(n):
    "Size of `n` bars."
    return n * 9
?>
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:tal="http://xml.zope.org/namespaces/tal"
    tal:define="exponent int(exponent); fraction int(fraction); start 28"
    width="${ start + nbars(1 + exponent + fraction + 1) }" height="100">
  <defs>
    <rect id="bar" width="${nbars(1)}" height="28"/>
  </defs>
  <style>
    #bar    { stroke: black; }
    .above  { stroke: black; fill: none; }
    text    { font-size: 12px; text-align: center; text-anchor: middle; font-family: sans }
    circle  { stroke: black; fill: black; fill-opacity: 0.25; }
  </style>
  <g>
    <!-- bars -->
    <use href="#bar" tal:repeat="i range(1)"
        style="fill:#d5ffff" x="${ start + nbars(i) }" y="44"/>
    <use href="#bar" tal:repeat="i range(1, 1+exponent)"
        style="fill:#a4ffb4" x="${ start + nbars(i) }" y="44"/>
    <use href="#bar" tal:repeat="i range(1+exponent, 1+exponent+fraction)"
        style="fill:#ffb2b4" x="${ start + nbars(i) }" y="44"/>

    <!-- sign -->
    <g tal:define="x start + nbars(0 + 1/2)">
      <text style="text-anchor: end">
    <tspan x="${ x + 2 }" y="25" >signe</tspan>
      </text>
      <path class="above" d="M ${x},31.5 L ${x},41.5"/>
    </g>

    <!-- exponent -->
    <text tal:define="x start + nbars(1 + exponent/2)">
      <tspan x="${x}" y="12.5" >exposant</tspan>
      <tspan x="${x}" y="25" >(${exponent} bits)</tspan>
    </text>
    <path tal:define="x1 start + nbars(1); x2 start + nbars(1 + exponent)"
        class="above" d="M ${x2-1},41.5 L ${x2-1},31.5 L ${x1},31.5 L ${x1},41.5"/>

    <!-- fraction -->
    <text tal:define="x start + nbars(1 + exponent + fraction/2)">
      <tspan x="${x}" y="12.5">fraction</tspan>
      <tspan x="${x}" y="25" >(${fraction} bits)</tspan>
    </text>
    <path tal:define="x1 start + nbars(1 + exponent); x2 start + nbars(1 + exponent + fraction)"
        class="above" d="M ${x2},41.5 L ${x2},31.5 L ${x1+1},31.5 L ${x1+1},41.5"/>

    <!-- bit dots -->
    <g tal:repeat="b (0, fraction, fraction+exponent)">
      <g tal:omit-tag="" tal:define="x start + nbars(1/2+exponent+fraction - b)">
    <circle cx="${x}" cy="79" r="3.7"/>
    <text x="${x}" y="93">${b}</text>
      </g>
    </g>
  </g>
</svg>

Et je suis vraiment content du résultat. C'est plutôt propre, relativement conforme à ce qu'on attend d'un XML, au point où j'imagine même une chaîne de traitement qui pourrait combiner TAL et XSLT ! Ah, et pour voir le résultat, sur un double par exemple :

Flottant à double précision

Le seul bémol par rapport à la « standardicité » de ce template utilisant TAL, c'est que Chameleon ré-utilise l'espace de nommage (namespace) original de Zope alors qu'ils ont en fait étendu le dialecte pour l'insertion directe par exemple, ou le fait que les expressions soient en Python par défaut (il y a d'autres nouveautés également). Dans un soucis de compatibilité ascendante, idéalement, ils auraient dû définir un nouveau namespace pour ces extensions4.

Mais justement, rien que le fait d'utiliser un namespace pour intégrer de la « procéduralité » dans un SVG va permettre de montrer une possibilité géniale de XML : de pouvoir être une structure de données mélangeant divers aspects de manière non-intrusive (ou orthogonale), ce qui permet par exemple dans notre cas de modifier le SVG avec Inkscape par exemple, et de continuer à obtenir un template valide ! Ça fonctionne moyennement avec le template ci-dessus, car le dessin ne ressemble à rien vu que par exemple les coordonnées des objets n'ont pas de valeur correcte : on utilise l'insertion directe avec des ${x} par exemple, qui n'est pas une coordonnée valide. C'est pour ce cas où rester avec la syntaxe strictement XML d'origine de TAL peut être utile : ces attributs auront une valeur qui est utile pour présenter ce dessin dans un logiciel d'édition de SVG comme Inkscape, mais seront remplacés lors de l'instanciation du template par TAL ! Essayez avec cette version du dessin, vous verrez que le template continue d'être utilisable et applique les modifications que vous y avez effectué.

Et ça c'est la puissance de XML qui n'a malheureusement jamais été beaucoup développée : pouvoir intégrer plusieurs dialectes ou formats (avec son propre namespace) au sein d'un même fichier pour qu'il soit « multiforme ». J'avais il y a quelques années ainsi intégré une extension à un diagramme à état en SCXML qui me permettait de travailler sur un aspect orthogonal au diagramme, en utilisant au passage un namespace que j'avais créé pour l'occasion en utilisant les Tag URI. Vous voyez d'ailleurs qu'Inkscape intègre lui-même ses propres données au fichier SVG standard à travers le namespace souvent préfixé « sodipodi » (le nom d'origine du projet) pour y stocker ses paramètres. Dans un autre contexte, RDFa est une manière d'étendre le HTML pour faire du RDF, en trouvant un entre-deux n'utilisant que des attributs préfixés et non pas des éléments spécifiques, afin de concilier le divorce du HTML moderne avec XML (mais faites du XHTML5 même s'il n'a pas de schéma !).

Bref, j'espère que ce journal t'auras un peu réconcilié avec XML, et puis donné envie de lier Python et XML pour ton prochain projet. Tu trouveras tous les fichiers de mon expérimentation ici : http://dolka.fr/bazar/tal-svg-experiment/


  1. j'ai toujours trouvé ça étrange mais quand on dit « les années XXXX », on parle de la dizaine d'année qui commence par l'année citée ; dans notre cas, les années 2000--2010. 

  2. en fait, XSLT n'est vraiment pas fait pour de la génération procédurale, mais pour du traitement de données en flux. Il est idéal pour transformer un document en un autre, mais laissez tomber dès que la part de calcul devient trop importante. À la limite, vous pouvez partir d'un programme dans un langage classique pour la partie calcul, et sortir un document « de base » –  en utilisant même des printf() à la barbare avec une structure simple  – à transformer plus aval par XSLT. Mais n'essayez pas de tout faire en XSLT. 

  3. du coup Chameleon étant une bibliothèque seulement, j'ai créé un petit outil talproc pour traiter les templates TAL. Il s'utilise à la manière de xsltproc avec les paramètres du template passés en --stringparam. Par exemple, pour générer le fichier du flottant double précision : talproc --stringparam exponent 11 --stringparam fraction 52 IEEE_754_Floating_Point_Format-direct-template.svg 

  4. pour troller, je voudrais signaler que Microsoft, pourtant habitué au EEE, a correctement namespacé ses extensions à OOXML et continue de le faire des années après, cf. https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/d0a2e301-0ff7-4e9e-9bb7-ff47070dce0a issu de https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd. Après, vous pourrez arguer qu'avoir un « standard » qui continue d'avoir des extensions (à l'utilité discutable, si vous regardez le contenu précisément) tous les deux ans, ça n'est pas vraiment une forme de stabilité qui lui confèrerait un caractère si « standard », mais bon… 

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Littérature "Python"

by Mindiell from AFPy discuss

Nathalie Azoulay a écrit un livre intitulé “Python”. Je ne l’ai pas lu, mais je trouve certaines remarques de l’écrivaine assez intéressantes dans l’émission “La grande librairie” du 7 février (Jean-Christophe Rufin, Asma Mhalla, Raphaël Enthoven, Nathalie Azoulai et Raphaël Gaillard en replay - La grande librairie)

Le bouquin : Python (2024) – Nathalie Azoulai

Ca change un peu des sujets techniques :wink:

7 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

EuroPython 2024 Call for Contributors

by artcz from AFPy discuss

Hi everyone!

I’m Artur, from the EuroPython team.

We’re currently running a Call for Contributors for the conference in 2024.
We published a short blog post last week explaining how anyone in the community can get involved either by joining one of the core teams, helping with reviewing the proposals or mentoring the speakers.

The deadline for the Team Members form is today, but the other form (for Reviewers and Mentors) will stay open.

We would be really happy if French community members would like to join us with shaping the conference this year, and if you have any questions I’m happy to answer them :slight_smile:

Cheers,
Artur

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Modification de la sortie de bat

by ascendances from ascendances

bat permet d’afficher le contenu d’un fichier en activant la coloration syntaxique par défaut. bat permet aussi de changer le thème (DarkNeon dans les captures d’écran suivant) ou les informations affichées.

Avec le code Python suivant contenu dans un fichier nommé futilite.py :

def sujet_principal(sujets):
    """d'après https://fr.wikipedia.org/wiki/Loi_de_futilit%C3%A9_de_Parkinson"""
    ordre = sorted(sujets, key=lambda sujet: sujet.importance)    
    return ordre[0]

L’ensemble des décorations possibles est affiché avec le paramètre full.

bat futilite.py --style="full"

Au contraire, la version sans décoration (et donc celle qui est le plus proche du comportement de cat) s’obtient avec le style plain. C’est aussi équivalent à l’utilisation de pygmentize avec un alias (cf. un article précédent).

bat futilite.py --style="plain"
Plusieurs blocs sont activables ou non en ajoutant des éléments au paramètre style. La liste des éléments est disponible dans la page de man. Par exemple, changes pour afficher des différences Git, header-filesize pour afficher la taille du fichier, rule pour afficher une ligne entre deux fichiers, etc.).

Par exemple, si on veut limiter l’affichage aux numéros de ligne, à la taille du fichier (et son contenu évidemment) :

bat futilite.py --style="numbers, header-size"

Personne n’ayant envie de retaper ce paramètre style en permanence, il est enregistrable dans le fichier $HOME/.config/bat/config (le chemin est modifiable par une variable d’environnement). Un contenu d’exemple est montré dans le README.md de bat.

Lire la suite…

Interruption des services de l'AFPy

by mdk from AFPy discuss

Bonjour,

On se réveille avec un :

afpy.org: [Errno 101] Network is unreachable
bbb.afpy.org: [Errno 101] Network is unreachable
dl.afpy.org: [Errno 101] Network is unreachable
logs.afpy.org: [Errno 101] Network is unreachable
photos.afpy.org: [Errno 101] Network is unreachable
git.afpy.org: [Errno 101] Network is unreachable
fr.pycon.org: [Errno 101] Network is unreachable
2010.pycon.fr: [Errno 101] Network is unreachable
2011.pycon.fr: [Errno 101] Network is unreachable
2012.pycon.fr: [Errno 101] Network is unreachable
2016.pycon.fr: [Errno 101] Network is unreachable
autoconfig.pycon.fr: [Errno 101] Network is unreachable
cfp-2023.pycon.fr: [Errno 101] Network is unreachable
paullaroid.pycon.fr: [Errno 101] Network is unreachable
pycon.fr: [Errno 101] Network is unreachable
videos-2015.pycon.fr: [Errno 101] Network is unreachable
www.pycon.fr: [Errno 101] Network is unreachable

La bonne nouvelle c’est que discuss.afpy.org n’est pas impacté.

C’est un incident côté Gandi :

A filer on PARIS-SD6 has crashed and restart, downtime experienced over certain SD6 services.

Donc pas d’inquiétude pour le moment, ça va revenir :smiling_face:

Pensée aux Gandiens qui doivent être en train de regarder le filer avec un regard méchant jusqu’à ce qu’il reparte.

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Python SQLite: les requêtes update ne fonctionne pas

by Skilgannon from Linuxfr.org

Bonjour,

J'ai créé un script python dont le but est de modifier la basse de données SQLite générée par l'application androïd MyLibrary.

Le problème est que au vu des log tout semble fonctionner, les requêtes sql semble bonnes…

2024-02-10 18:36:59 mypc __main__[14467] DEBUG (238, '[]', 'Le secret des Eïles', 1382, None, None, None, '0', 0, '9782302024380', 48, '05/12/2012', 'Soleil', 1, None, '[{"title":"legende","volume":6.0}]', "Après avoir reconquis son trône et passé quelques mois à remettre les choses en bon ordre, le chevalier Tristan s'aperçoit qu'il n'est pas fait pour régenter une cour. Il l'abandonne alors, choisissant une vie plus proche de la Nature qui l'a vu grandir.Mais ses nuits sont hantées par les Eïles, créatures envoûtantes qui essaient de lui voler son âme pendant son sommeil... Une crainte étrange s'éveille alors en lui, plus inquiétante encore que tous les combats périlleux menés jusqu'alors...", 'Le secret des Eïles', None, None, None)
coucou
YOLO
2024-02-10 18:36:59 archbertha __main__[14467] DEBUG UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238
UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238

Sauf que quand, après avoir executer le scriptp je vérifie avec un select, rien n'a été modifier dans le base de donnée.

> $ sqlite3 mylibrary.db 'SELECT * FROM COMIC  WHERE ID IS 239;'
239|[]|Les forêts profondes|1383||||0|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes|||
> $ # Ca devrait etre
239|[]|yolo|1383||||coucou|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes||1|

Le script est le suivant:

#!/usr/bin/env python3
import argparse
import logging
import pathlib
import sqlite3
import coloredlogs

class Book:
    def __init__(self, row) -> None:
        self.is_comic = ""
        self.id = row[0]
        self.additional_authors = row[1]
        self.amazon_url = row[2]
        self.author = row[3]
        self.categories = row[4]
        self.comments = row[5]
        self.cover_path = row[6]
        self.fnac_url = row[7]
        self.in_wishlist = row[8]
        self.isbn = row[9]
        self.pages = row[10]
        self.published_date = row[11]
        self.publisher = row[12]
        self.read = row[13]
        self.reading_dates = row[14]
        self.series = row[15]
        self.summary = row[16]
        self.title = row[17]
        self.amazon_small_cover_url = row[18]
        self.amazon_cover_url = row[19]

    def correct_amazon_url(self):
        if not self.amazon_url.startswith("http"):
            print("YOLO")
            self.amazon_url = "yolo"

    def correct_fnac_url(self):
        if self.fnac_url != "":
            print("coucou")
            self.fnac_url = "coucou"


def main(args):
    logger.debug(args)
    connection = sqlite3.connect(args.db)
    cursor = connection.cursor()

    cursor.execute(f"SELECT * FROM {args.table}")
    for row in cursor.fetchall():
        book = Book(row)
        logger.info("id:" + str(book.id) + ":isbn:" + str(book.isbn))
        logger.debug(row)

        book.correct_fnac_url()
        book.correct_amazon_url()

        if args.table == "BOOK":
            book.is_comic = "0"
        else:
            book.is_comic = "1"

        sql_command = f"UPDATE {args.table} SET FNAC_URL = {book.fnac_url} AND AMAZON_URL = {book.amazon_url} AND IS_COMIC = {book.is_comic} WHERE ID = {book.id} "
        logger.debug(sql_command)
        cursor.execute(
            f"UPDATE {args.table} SET FNAC_URL = ? AND AMAZON_URL = ? AND IS_COMIC = ? WHERE ID = ?",
            (book.fnac_url, book.amazon_url, book.is_comic, book.id),
        )
        connection.commit()
    connection.close()


if __name__ == "__main__":
    coversPath = pathlib.Path(pathlib.Path(), "covers")
    dbPath = pathlib.Path(pathlib.Path(), "mylibrary.db")
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v", "--verbose", action="count", help="increase output verbosity", default=0
    )
    parser.add_argument(
        "-d", "--db", action="store", help="DB path", type=pathlib.Path, default=dbPath
    )
    parser.add_argument(
        "-t", "--table", choices=["BOOK", "COMIC"], help="Wich table ?", required=True
    )
    args = parser.parse_args()

    logger = logging.getLogger(__name__)
    formatter = logging.Formatter(
        "%(asctime)s %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s"
    )
    if not args.verbose:
        coloredlogs.install(level="ERROR", logger=logger)
    elif args.verbose == 1:
        coloredlogs.install(level="WARNING", logger=logger)
    elif args.verbose == 2:
        coloredlogs.install(level="INFO", logger=logger)
    elif args.verbose >= 3:
        coloredlogs.install(level="DEBUG")
    else:
        logging.critical("Log level fail !!!")

    main(args)

Merci par avance.

PS: Connaissez vous une application du même style opensource ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Meetup Python - Django a Saint Herblain

by dancergraham from AFPy discuss

Demat d’an holl, bonjour a tou-te-s,

Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain

:bus: Bus 23, 59, 81 ou 91 arret Maison des arts
:tram: + :footprints:Tram 1 arret Frachon a 15 minutes a pied
:red_car: Porte de Saint Herblain

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Meetup Python - Django chez Ripple Motion a Saint Herblain

by dancergraham from AFPy discuss

Demat d’an holl, bonjour a tou-te-s,

Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain

:bus: Bus 23, 59, 81 ou 91 arret Maison des arts
:tram: + :footprints:Tram 1 arret Frachon a 15 minutes a pied
:red_car: Porte de Saint Herblain

Des apps Django construites pour durer par Olivier Tabone de Ripple Motion

Stratégies de tests, mise à jour de Django, outillage, architecture,… mon retour d’expérience sur la construction d’applications Django et leur évolution sur une durée de 10 ans et plus.

30 minutes

L’intégration de nouveaux développeurs par Lucas Guérin de Ripple Motion

Découvrez nos bonnes pratiques pour intégrer sereinement des profils développeurs débutants dans nos projets. Comment leur permettre de se former, de développer et de monter en compétence sur les projets sans craindre les erreurs.

30 minutes

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sur Paris - Django Meetup le 26 mars 2024 chez Octopus Energy

by Candice from AFPy discuss

Bonjour à toutes et à tous,

Meetup Django

2024-03-26 19:00 (Europe/Paris) → 2024-03-26 21:45 (Europe/Paris)

Meetup Django le 26 mars dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.

L’occasion de se retrouver et d’en apprendre plus sur les channels Django et également de comprendre comment optimiser le Cycle de Vie des Domaines Métiers avec Django-FSM.

Inscription juste ici : Django Meetup Paris

Tres bonne journée à toute/s !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Python 3.10 passe devant Python 3.8

by mdk from AFPy discuss

Janvier 2024 c’est Python 3.10 qui devient la version la plus utilisée, qui l’avait vu venir ?

Python 3.8 est restée la plus utilisée 7 mois consécutifs, alors que la 3.7 était restée la plus utilisée 32 mois consécutifs, ça s’accélère, ou ça se lisse (en fait c’est pareil).

Et Python 3.9 n’a jamais été la plus utilisée :frowning:

Je pense que les gros pics d’utilisation qu’on a pu voir dans le passé (plus de 75% sur Python 2.7, plus de 40% sur Python 3.7) sont terminés pour deux raisons :

  • Ils ont été crées artificiellement par la migration de 2 à 3.
  • Le cycle de release est passé d’un an et demi à un an (PEP 602).

Et en effet ça se “lisse” encore ce mois-ci : la version la plus utilisée n’est qu’à 19.79% (contre 19.91% le mois dernier).

Ahh et ça fait deux mois que Python 3.12 est plus utilisé que Python 2.7, si quelqu’un avait encore besoin d’un argument contre Python 2.7…

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Masquer un bout de document PDF

by pierre.imbaud from AFPy discuss

En de nombreuses occasions, je voudrais pouvoir masquer une partie d’un document pdf à imprimer.
Masque positif: ne garder que telle partie.
Masque négatif: enlever telle partie.
Non, pas enlever: rendre non visible à l’impression.
Une des applications visées: je prends souvent le train, j’ai le “billet” disponible sur l’appli sncf-connect, mais je suis dépendant de mon smartphone, qui peut me lacher, faute de batterie… Solu, imprimer le billet! Mais le billet comporte de larges à-plat colorés, qui bouffent de l’encre! Je voudrais donc soit masquer ces à-plat, avant impression (masque négatif), soit n’imprimer que le qr-code (masque positif).
Je peux me contenter d’une appli, android ou de préférence linux, ou mettre les mains dans le cambouis, et faire du script avec reportlab: montée en compétence, sans doute valorisable ailleurs.
Merci d’avance de vos suggestions.
Pierre

9 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

2024 à l’AFPy !

by grewn0uille from AFPy discuss

Bonjour tout le monde,

L’AFPy vous souhaite une bonne année 2024 et vous présente ses meilleurs vœux pour cette nouvelle année !

En ce début d’année, nous avons lancé notre campagne d’adhésions 2024 sur HelloAsso :sparkles:

En adhérant, vous permettez à l’APFy de financer ses frais de fonctionnement, d’engager les dépenses pour l’organisation de la PyConFR et d’assurer la promotion du langage Python en francophonie :snake:

Être membre de l’AFPy vous permet également de prendre part à la vie de l’association en votant lors de l’Assemblée Générale.

Nous travaillons actuellement sur l’organisation de la prochaine PyConFR qui reprendra son créneau “classique” après les vacances d’été.
Si votre entreprise est intéressée pour soutenir un évènement gratuit, ouvert à toutes et tous, autour du langage Python, n’hésitez pas à consulter les différentes offres de sponsoring disponibles !

Pour ne manquer aucune nouvelle sur l’AFPy, les meetups locaux et la PyConFR, vous pouvez nous suivre sur nos différents réseaux (Mastodon, Twitter / X, LinkedIn) et participer sur le forum ou le salon Discord :smile:

Merci pour votre soutien :sparkling_heart:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Jouer avec Lenia (modèle de vie artificielle) en Python

by omc from Linuxfr.org

Bon c'est dimanche et on s'ennuie un peu, c'est donc le moment idéal pour s'amuser !

J'ai été totalement fasciné par cette vidéo de David Louapre qui décrit le modèle de vie artificielle Lenia imaginé par Bert Wang-Chak Chan qui est une extension du fameux jeu de la vie.

David Louapre propose un notebook Python avec une version simplifiée de Lenia en Python. Ce notebook est très facile à installer et à exécuter, car il ne dépend que de scipy, numpy et matplotlib.

Par contre, l'installation du modèle de Bert Wang-Chak est un peu plus retors, notamment pour satisfaire les dépendances. Comme j'ai peur de ne plus me souvenir de ce que j'ai fait, voici une petite recap des commandes effectuées :

## clonage de https://github.com/Chakazul/Lenia
git clone https://github.com/Chakazul/Lenia.git 
## creation d'un env python dedié avec conda
conda create -n lenia pip python=3.8 
## activation de l'env conda
conda activate lenia 
## installation des dépendances
pip install funcsigs==1.0.2 Mako==1.1.3 MarkupSafe==1.1.1 numpy==1.21 pillow==8.3.1 reikna==0.7.5 scipy==1.3.3 
## on file dans le bon répertoire...
cd Lenia/Python
## et on execute Lenia !
python LeniaNDKC.py -c3 -k3

Et voila !!

anim

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Nantes - Meetup le 8 février 2024 chez OctopusMind et RGOODS

by dancergraham from AFPy discuss

Meetup Python chez OctopusMind et RGOODS, Thu, Feb 8, 2024, 6:30 PM | Meetup2024-02-08T17:30:00Z UTC

Scrapy : automatiser le puzzlescraping par Mouna d’OctopusMind
Non, ce n’est pas la dernière tendance instagrammable, mais une façon de me renseigner sur ma passion préférée : les puzzles. Découvrons ensemble le fonctionnement de Scrapy, framework complet qui permet d’automatiser la collecte de données, notamment pour des projets web ou data. Au programme, un bestiaire numérique qui met en scène un python, un poulpe, une araignée, des pandas, et peut-être aussi des chats.
Wagtail : Un CMS pour Django, mais pas que par Seb de Rgoods
Préparez-vous pour une exploration de Wagtail, le CMS qui allie la puissance de Django à une UI léchée. Cette session de meetup s’adresse aux développeurs connaissant déjà Python, offrant un aperçu détaillé de Wagtail, de son architecture basée sur les modèles Django, et des fonctionnalités qui en font le choix idéal pour la gestion de contenu. Mais pas que ! Découvrez comment RGOODS a fait de Wagtail la brique centrale de sa plateforme de dons SaaS.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Firefox et Chrome en 2024

by mdk from AFPy discuss

Je lisais :

(merci la revue de presse de l’April)

bon je dois vivre dans une bulle, dans laquelle 89% des utilisateurs utilisent Firefox

Ahh je vis dans une bulle dans une bulle selon statcounter : en France Firefox est à 9.35%.

Alors je me demandais, sur discuss.afpy.org, on est dans une bulle dans une bulle, ou pas ?

Bon c’est pas joli joli niveau vie privée, sorry les gens, mais un petit one-liner awk pour sortir le dernier user-agent de chaque IP des logs du Discourse :

zcat /var/log/nginx/access.log* | cut -d' ' -f2,13- |sed 's/ /\t/'| awk -F$'\t' '{BY_IP[$1] = $2} END { for (ip in BY_IP) {print ip, BY_IP[ip]}}' | cut -d' ' -f2- > /tmp/agents

Et un peu de Python pour parser ça :

>>> from pathlib import Path
>>> from user_agents import parse
>>> from collections import Counter
>>> agents = Path("agents").read_text().splitlines()
>>> Counter(parse(agent).browser.family for agent in agents).most_common()
[('Chrome', 994), ('Other', 778), ('Chrome Mobile WebView', 642), ('Firefox', 589)

Ça fait, …, 1636 Chrome pour 589 Firefox, disons 25% pour Firefox et 75% pour Chrome. Petite bulle, bravo à nous, on résiste mieux que la moyenne.

Aller, pour les 75% d’entre nous qui sont encore sur Chrome :

https://contrachrome.com/comic/681/

10 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur·se Python Fullstack (présentiel Nantes/TT)

by f.oliveau from AFPy discuss

Nous recherchons un·e développeur·se avec déjà une première expérience significative en Python poursuivre le développement de notre application www.j360.info

Type d’emploi : CDI ou CDD, temps plein ou 4/5, présentiel sur Nantes 1/2 jours hebdo.

Ce n’est pas un poste de data scientist, une proposition d’alternance ou de stage.

Qui est OctopusMind ?

OctopusMind, spécialiste de l’Open Data économique, développe des services autour de l’analyse des données. Nous éditons principalement une plateforme mondiale de détection d’appels d’offres : www.j360.info
L’entreprise, d’une dizaine de personnes, développe ses propres outils pour analyser quotidiennement une grande masse de données, en alliant intelligence humaine et artificielle www.octopusmind.info
Une partie de l’équipe technique est dans d’autres villes. Aussi, nous recherchons pour ce poste un collaborateur pouvant venir régulièrement dans nos bureaux à Nantes (centre ville/gare).

Nous vous proposons

L’équipe IT, sans lead developer, est en lien avec l’équipe R&D ML et l’équipe de veille des marchés. Nous suivons un SCRUM “maison”, ajusté régulièrement selon nos besoins. Nous discutons ensemble de nos priorités et nous les répartissons à chaque sprint selon les profils et envies de chacun·e.

Vous participerez :

  • Au développement back de j360 (Python/Django, PostgreSQL, ElasticSearch).
  • Au déploiement des applications (Docker/Docker-Compose, Ansible).
  • Au développement front de l’application j360 (Vue3/Quasar/Typescript).
  • Aux scripts de collecte de données (Python/Scrapy).
  • À la relecture de code de vos collègues
  • À la réflexion produit, analyse technique et à la définition des priorités de l’entreprise.
  • À l’ajustement de nos méthodes de travail au sein de l’équipe et de l’entreprise.

Avantages :

  • Horaires flexibles - RTT - Titres-restaurant - Participation au transport - Plan d’intéressement et plan épargne entreprise
  • Télétravail & présentiel (domicile/travail possible facilement dans la journée)
  • Statut cadre en fonction du diplôme/l’expérience ( Syntec)

Processus de recrutement

  • CV + une présentation de votre profil - qu’est qui vous intéresse par rapport à l’entreprise et aux missions proposées - à adresser par mail à job @ octopusmind.info
  • Vous pouvez illustrer vos compétences techniques avec des exemples de projets
  • Échanges et précisions par mail ou téléphone
  • Test technique
  • Entretien dans nos bureaux avec des membres de l’équipe IT
  • Offre (salaire en fonction de l’expérience/niveau)

SVP pas de démarchage pour de l’outsouring, cabinet RH, freelance merci

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Dévoilement du programme de l’édition 2024 de ConFoo à Montréal !

by Yann Larrivee,Benoît Sibaud,Ysabeau 🧶 🧦 from Linuxfr.org

ConFoo

Voulez-vous être à l’avant-garde de l’industrie ? Réservez votre calendrier pour la 22ᵉ édition de ConFoo en février 2024 à Montréal !

Avec plus de 170 présentations, offertes par des conférenciers de partout à travers le monde, ConFoo est une conférence destinée aux développeurs Full-Stack, couvrant tout, du backend au frontend : JavaScript, PHP, Java, Dotnet, Sécurité, Intelligence Artificielle, DevOps et bien plus encore.

ConFoo apporte une remarquable diversité de contenu pour élargir vos connaissances, augmenter votre productivité et amener vos compétences en développement au niveau supérieur.

Avec un choix de présentations axé sur les technologies de pointe, il y a une raison pour laquelle les participants qui reviennent de ConFoo disent avoir appris davantage en ces trois jours que pendant trois années à l’université !

Inscrivez-vous dès maintenant pour participer, rencontrer les conférenciers de renom qui contribuent aux projets Open Source que vous utilisez tous les jours.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Ingénieur software Python CDI Lyon / Innovation

by sophie from AFPy discuss

Bonjour,
Nous recrutons des profils d’Ingénieur Software Python pour venir renforcer nos équipes.
Société innovante en très forte croissance, nous travaillons dans le secteur de l’efficacité énergétique. Pour compléter notre équipe, nous recherchons nos futurs talents qui interviendront sur des sujets de développement de notre solution. Nous utilisons les technos Python, FastAPI, Flask… Nous recherchons des personnes passionnées voulant rejoindre une structure type startup qui évolue rapidement et qui est tournée vers l’innovation et l’international.
Merci pour vos retours.
Sophie

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Traitement de PDF (séparation, renommage, deplacement)

by ptiseb60 from AFPy discuss

Bonjour à tous,

Je ne sais pas si vous accepterez de m’aider (parce qu’il y a du taff :D) mais je tente tout de même le coup on sait jamais.

Je suis total débutant sur Python, jusque là j’ai développé tout mes projets avec AutoIt mais pour celui ci je tourne en rond alors après recherche je pense qu’il serait réalisable sur Python.

concrètement, j’ai besoin de développer une app pour effectuer le traitement de pdf selon le process suivant :

  • les fichiers pdf a traiter son des numérisation de plusieurs documents de plusieurs page en une seule numérisation dont chaque première page contient 2 informations en bas de page (1 pour le renommage et 1 mot clé indiquant le début d’un nouveau document)
  • premier traitement a réaliser, séparer chaque pdf a chaque fin d’un document en utilisant le mot clé.
  • second traitement, renommer les pdf généré en fonction de l’information de renommage qui n’est pas toujours la même (exemple “recu_2401102501”, “naiss_01011005” ou encore procctx_24051206_05… j’en ai une cinquantaine comme ça et les partie en chiffre n’est pas toujours sur le même nombre de caractères
  • troisième traitement déplacer les fichier pdf dans des dossiers réseaux en fonction de la première partie de leur nom (la partie en lettres)
  • dernier traitement, supprimer les fichiers d’origine.

Information supplémentaire : les fichiers arrivent au fil de l’eau il est donc possible qu’entre le lancement et la fin des traitements, de nouveaux fichiers soient déposé. Il ne faut donc pas les prendre en compte dans la dernière étape de suppression.

Idéalement il faudrait alimenter un fichier log a chaque étape de traitement.

Comme je l’ai dit je suis total débutant et je suis donc très vite coincé. pour le moment je n’arrive qu’a séparer en plusieurs fichiers sur détection du mot clé et uniquement pour des fichiers sur lesquels il y a eu de l’OCR de faite par le copieur servant aux numérisation. Problème certain fichier font pas loin de 100 pages donc l’OCRisation (si je puis dire) est très longue et le poids du fichier on en parle même pas… De plus je n’arrive a le faire qu’en ciblant un fichier en particulier.

Bref vous l’aurez compris a ce stade c’est même pas de l’entraide c’est limite de l’assistanat j’en suis conscient.

pour info j’ai utilisé PyPDF2

Je vous remercie par avance pour vos retour.
Ptiseb

13 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Jitsi ou Big Blue Button ?

by mdk from AFPy discuss

Bonjour les gens,

notre BBB n’est plus très à jour, ni très utilisé à part pour les réunions mensuelles du comité directeur, et ponctuellement peut-être qq membres.

C’était bien pour passer le COVID quoi.

C’est à mon goût pas très pratique à administrer un BBB (c’est le seul service que je n’arrive pas à gérer via Ansible).

Je propose donc trois alternatives et vous laisse m’indiquer vos préférences entre :

Cliquez pour voir le sondage.

Arrêter de s’auto-héberger implique d’utiliser Framatalk (ou autre ?) comme on faisait avant.

Garder BBB implique que je dois me coltiner une mise à jour à la main (nouvelle machine, install from scratch, migration des comptes et des enregistrements, ça prend du temps).

Jitsi me semble un peu plus simple à administrer, ça semble gérable via Ansible (c’est un apt install, pas un curl | sh).

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Ça y est Python 3.10 a plus d'utilisateurs que Python 3.9

by mdk from AFPy discuss

Mais bon, 3.10, 3.9, 3.8, et 3.7 sont toutes les 4 autour de 19% d’utilisateurs :

Autres points notables :

  • 3.12 est plus utilisée que 2.7 (1.67% contre 1.58%).
  • Il aura fallu 21 mois pour que la 3.7 passe de 0% à 1% d’utilisateurs, contre seulement 14 mois pour la 3.8, 11 mois pour la 3.9, 17 mois pour la 3.10, 10 mois pour la 3.11, et 1 mois pour la 3.12 !!
  • Décembre 2023 c’est la première fois qu’on a aucune version de Python avec plus de 20% d’utilisateurs. Alors que 2.7 avait 75% d’utilisateurs en janvier 2016, et que la 3.7 avait 42% d’utilisateurs en août 2021.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

L'installation et la distribution de paquets Python (2/4)

by jeanas,Benoît Sibaud,Nils Ratusznik,Ysabeau 🧶 🧦 from Linuxfr.org

Cette dépêche est la deuxième d’une série de quatre sur le packaging en Python :

  1. L’histoire du packaging Python
  2. Tour de l’écosystème actuel
  3. Le casse-tête du code compilé
  4. La structure de la communauté en question

Je vais donc proposer un aperçu plus ou moins complet des différents outils, et de ce qu’ils font ou ne font pas, en essayant de les comparer. Mais je parlerai aussi des fichiers de configuration, des dépôts où les paquets sont publiés, des manières d’installer Python lui-même, et de l’interaction de tout ceci avec les distributions Linux. En revanche, je laisse de côté pour l’instant les paquets écrits en C, C++ ou Rust et la complexité qu’ils apportent.

Sommaire

Commençons par un outil dont à peu près tout utilisateur de Python a entendu parler : pip.

Pip

L’installeur de paquets pip est un outil fondamental et omniprésent. Son nom est un acronyme récursif signifiant « Pip Installs Packages ». Il permet d’installer un paquet depuis le PyPI, mais aussi depuis une copie locale du code source, ou encore depuis un dépôt Git. Il dispose, bien sûr, d’un résolveur de dépendances pour trouver des versions à installer qui soient compatibles entre elles. Il possède aussi un certain nombre de fonctionnalités standard pour un gestionnaire de paquets, comme désinstaller un paquet, lister les paquets installés, etc.

S’il y a un outil de packaging quasi universel, c’est bien pip. Par exemple, la page de chaque paquet sur PyPI (exemple) affiche une commande pour l’installer, à savoir pip install <paquet>. Quand la documentation d’un paquet donne des instructions d’installation, elles utilisent généralement pip.

De plus, la distribution officielle de Python permet de boostraper très simplement pip avec la commande python -m ensurepip. Cela rend pip très facile à installer, et lui donne un caractère officiel, soutenu par les développeurs de Python, caractère que n’ont pas la plupart des autres outils que je vais mentionner.

Même les autres outils qui installent aussi des paquets depuis le PyPI (comme pipx, Hatch, tox, etc.) le font presque tous en utilisant, en interne, pip (sauf Poetry qui est un peu à part).

Dans l’univers parallèle de Conda et Anaconda, les utilisateurs sont souvent obligés d’utiliser pip dans un environnement Conda parce qu’un paquet donné n’est pas disponible au format Conda (ce qui crée, d’ailleurs, des problèmes de compatibilité, mais c’est un autre sujet).

Les dangers de pip sous Linux

Malheureusement, sous Linux spécifiquement, l’interface en ligne de commande de pip a longtemps été un moyen très facile de se tirer une balle dans le pied. En effet, la commande simple

pip install <paquet>

tentait d’installer le paquet au niveau du système, de manière visible pour tous les utilisateurs de la machine (typiquement dans /usr/lib/pythonX.Y/site-packages/). Bien sûr, il faut des permissions pour cela. Que fait Monsieur Toutlemonde quand il voit « permission denied error » ? Élémentaire, mon cher Watson :

sudo pip install <paquet>

Or, sous Linux, installer des paquets avec pip au niveau du système, c’est mal. Je répète : c’est MAL. Ou plutôt, c’est valable dans 0,1% des cas et dangereux dans 99,9% des cas.

J’insiste : ne faites JAMAIS sudo pip install ou sudo pip uninstall. (Sauf si vous savez parfaitement ce que vous faites et que vous avez scrupuleusement vérifié qu’il n’y a aucun conflit.)

Le souci ? Les distributions Linux contiennent, elles aussi, des paquets écrits en Python, qui sont installés au même endroit que celui dans lequel installe la commande sudo pip install. Pip peut donc écraser un paquet installé par le système avec une version différente du même paquet, potentiellement incompatible avec le reste, ce qui peut avoir des conséquences catastrophiques. Il suffit de penser que DNF, le gestionnaire de paquets de Fedora, est écrit en Python, pour avoir une idée des dégâts potentiels !

Aujourd’hui, heureusement, la commande pip install <paquet> (sans sudo), au lieu d’échouer avec une erreur de permissions, installe par défaut dans un emplacement spécifique à l’utilisateur, typiquement ~/.local/lib/pythonX.Y/site-packages/ (ce qui devait auparavant se faire avec pip install --user <paquet>, l’option --user restant disponible si on veut être explicite). De plus, pip émet un avertissement sous Linux lorsqu’exécuté avec les droits root (source). Ainsi, pip install <paquet> est devenu beaucoup moins dangereux.

Attention, j’ai bien dit moins dangereux… mais dangereux quand même ! Pourquoi, s’il n’efface plus les paquets du système ? Parce que si un paquet est installé à la fois par le système, et par pip au niveau de l’utilisateur, la version de pip va prendre le dessus, car le dossier utilisateur a priorité sur le dossier système. Le résultat est que le conflit, en réalité, persiste : il reste possible de casser un paquet système en installant une version incompatible avec pip au niveau utilisateur. Seulement, c’est beaucoup plus facile à corriger (il suffit d’un rm -rf ~/.local/lib/pythonX.Y/site-packages/*, alors qu’un conflit dans le dossier système peut être quasi irréparable).

La seule option qui soit sans danger est de ne jamais rien installer en dehors d’un environnement virtuel (voir plus bas pour les instructions).

Pour finir, la PEP 668 a créé un mécanisme pour qu’une distribution Linux puisse marquer les dossiers de paquets Python qu’elle contrôle. Pip refuse (par défaut) de modifier ces dossiers et affiche un avertissement qui mentionne les environnements virtuels. Debian (à partir de Debian Bookworm), Ubuntu (à partir d’Ubuntu Lunar) et d’autres distributions Linux, ont choisi de mettre en place cette protection. Donc, désormais, sudo ou pas, pip install en dehors d’un environnement virtuel donne une erreur (on peut forcer l’opération avec l’option --break-system-packages).

En revanche, Fedora n’a pas implémenté la protection, espérant réussir à créer un dossier pour pip qui soit au niveau système mais séparé du dossier de la distribution Linux, pour que pip install soit complètement sûr et qu’il n’y ait pas besoin de cette protection. Je recommande la présentation de Miro Hrončok à la conférence PyCon polonaise en janvier 2023, qui explique le casse-tête dans les menus détails. Petite citation en avant-goût : « The fix is quite trivial when you design it, and it only strikes back when you actually try to do it ».

Pip est un outil de bas niveau

Pip a une autre chausse-trappe qui est surprenant quand on est habitué au gestionnaire de paquets d’une distribution Linux. Petite illustration :

$ python -m venv my-venv/ # crée un environnement isolé vide pour la démonstration

$ source my-venv/bin/activate # active l’environnement

$ pip install myst-parser
[...]
Successfully installed MarkupSafe-2.1.3 Pygments-2.16.1 alabaster-0.7.13 [...]
[...]

$ pip install mdformat-deflist
[...]
Installing collected packages: markdown-it-py, mdit-py-plugins, mdformat, mdformat-deflist [...]
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
myst-parser 2.0.0 requires markdown-it-py~=3.0, but you have markdown-it-py 2.2.0 which is incompatible.
myst-parser 2.0.0 requires mdit-py-plugins~=0.4, but you have mdit-py-plugins 0.3.5 which is incompatible.
Successfully installed markdown-it-py-2.2.0 mdformat-0.7.17 mdformat-deflist-0.1.2 mdit-py-plugins-0.3.5 [...]

$ echo $?
0

Comme on peut le voir, la résolution des dépendances par pip ne prend pas en compte les paquets déjà installés dans l’environnement. Autrement dit, pour installer un paquet X, pip va simplement regarder quelles sont les dépendances de X (y compris les dépendances transitives), trouver un ensemble de versions qui soient compatibles entre elles, et les installer. Pip ne vérifie pas que les versions des paquets sont aussi compatibles avec ceux qui sont déjà installés. Ou plutôt, il les vérifie, mais seulement après avoir fait l’installation, à un moment où le mal est déjà fait, et uniquement pour afficher un avertissement. Dans l’exemple ci-dessus, on installe d’abord myst-parser, dont la dernière version dépend de markdown-it-py version 3.x, puis on installe mdformat-deflist, qui dépend de markdown-it-py version 1.x ou 2.x. En installant mdformat-deflist, Pip installe aussi, comme dépendance, markdown-it-py 2.x, ce qui casse le myst-parser installé précédemment.

Ceci n’est naturellement pas du goût de tout le monde (je me rappelle d’ailleurs d’une enquête utilisateur faite par les développeurs de Pip il y a quelques années, où ils posaient la question de savoir ce que Pip devait faire dans cette situation). La morale est que pip est surtout un outil conçu pour créer un environnement virtuel où se trouvent toutes les dépendances dont on a besoin, pas pour s’en servir comme de apt ou dnf, en installant et désinstallant manuellement des dépendances. Et surtout, que pip install X; pip install Y n’est absolument pas équivalent à pip install X Y, et c’est la seconde forme qui est correcte.

Les environnements virtuels : venv, virtualenv, pipx

Les environnements virtuels permettent de travailler avec des ensembles de paquets différents, installés de façon indépendante entre eux. L’outil d’origine pour les créer est virtualenv. Néanmoins, le plus utilisé aujourd’hui est venv, qui est une version réduite de virtualenv intégrée à la bibliothèque standard. Malheureusement, venv est plus lent et n’a pas toutes les fonctionnalités de virtualenv, qui reste donc utilisé également…

Pour créer un environnement virtuel (avec venv), on exécute :

python -m venv nom-de-l-environnement

Cela crée un dossier nom-de-l-environnement/. Chaque environnement est donc stocké dans un dossier. À l’intérieur de ce dossier se trouve notamment un sous-dossier bin/ avec des exécutables :

  • un exécutable python, qui ouvre un interpréteur Python ayant accès aux paquets de l’environnement virtuel (et, par défaut, seulement eux),

  • un exécutable pip, qui installe les paquets à l’intérieur de l’environnement.

De plus, pour simplifier l’utilisation dans un shell, on peut « activer » l’environnement, avec une commande qui dépend du shell. Par exemple, sous les shells UNIX classiques (bash, zsh), on exécute

source nom-de-l-environnement/bin/activate

Cette commande modifie la variable PATH pour y ajouter nom-de-l-environnement/bin/ afin que (par exemple) la commande python invoque nom-de-l-environnement/bin/python.

Malgré cela, les environnements virtuels restent un niveau de confort en dessous du Python du système, puisqu’il faut activer un environnement avant de s’en servir, ou écrire à chaque fois le chemin dossier-environnement/bin/. Bien sûr, il faut aussi mémoriser les commandes, et puis c’est si facile de faire pip install dans l’environnement global (non virtuel). Donc, beaucoup n’y prêtent malheureusement pas attention et installent au niveau global, ce qui cause des conflits de dépendances (c’est maintenant refusé par défaut sous Debian et dérivés, comme je l’expliquais dans la section précédente, mais c’est toujours majoritaire sous macOS et Windows).

C’est aussi pour rendre plus pratiques les environnements virtuels qu’existent pléthore d’outils qui les créent et/ou activent pour vous. Je termine avec l’un de ces outils, lié à la fois à pip et aux environnements virtuels, j’ai nommé pipx. À première vue, pipx a une interface qui ressemble à celle de pip, avec par exemple des sous-commandes pipx install, pipx uninstall et pipx list. Mais, à la différence de pip, qui installe un paquet dans un environnement déjà créé, pipx va, pour chaque paquet installé, créer un nouvel environnement virtuel dédié. Pipx est principalement destiné à installer des outils dont l’interface est en ligne de commande, pas sous forme d’un module importable en Python. Pipx utilise pip, pour ne pas trop réinventer la roue quand même. Au final,

$ pipx install pycowsay

revient à quelque chose comme

$ python -m venv ~/.local/pipx/pycowsay/
$ ~/.local/pipx/pycowsay/bin/pip install pycowsay
$ ln -s ~/.local/pipx/pycowsay/bin/pycowsay ~/.local/bin/pycowsay

Pour résumer, pipx permet d’installer des outils en ligne de commande, de manière isolée, qui n’interfèrent pas avec le système ou entre eux, sans avoir à gérer les environnements virtuels soi-même.

L’invocation d’un build backend : build

Pour déposer son projet sur PyPI, il faut d’abord obtenir deux fichiers : une sdist (source distribution), qui est essentiellement une archive .tar.gz du code avec des métadonnées ajoutées, et un paquet installable au format wheel, d’extension .whl. L’outil build sert à générer ces deux fichiers. Il s’invoque comme ceci, dans le dossier du code source :

python -m build

Petit exemple dans le dépôt de Sphinx (l’outil de documentation le plus répandu dans le monde Python) :

$ python -m build
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core>=3.7)
* Getting build dependencies for sdist...
* Building sdist...
* Building wheel from sdist
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core>=3.7)
* Getting build dependencies for wheel...
* Building wheel...
Successfully built sphinx-7.3.0.tar.gz and sphinx-7.3.0-py3-none-any.whl

$ ls dist/
sphinx-7.3.0-py3-none-any.whl  sphinx-7.3.0.tar.gz

Comme on peut le comprendre, build est un outil très simple. L’essentiel de sa documentation tient en une courte page. Il crée un environnement virtuel pour installer le build backend, en l’occurrence Flit, puis se contente d’invoquer celui-ci.

Le transfert sur PyPI : twine

À l’image de build, twine est un outil fort simple qui remplit une seule fonction et la remplit bien : déposer la sdist et le wheel sur PyPI (ou un autre dépôt de paquets). En continuant l’exemple précédent, on écrirait :

twine upload dist/*

Après avoir fourni un login et mot de passe, le projet est publié, il peut être installé avec pip, et possède sa page https://pypi.org/project/nom-du-projet.

La configuration d’un projet : le fichier pyproject.toml

pyproject.toml est le fichier de configuration adopté par à peu près tous les outils de packaging, ainsi que de nombreux outils qui ne sont pas liés au packaging (par exemple les linters comme Ruff, les auto-formateurs comme Black ou le même Ruff, etc.). Il est écrit dans le langage de configuration TOML. On a besoin d’un pyproject.toml pour n’importe quel projet publié sur PyPI, et même, souvent, pour les projets qui ne sont pas distribués sur PyPI (comme pour configurer Ruff).

Dans ce fichier se trouvent trois sections possibles — des « tables », en jargon TOML. La table [build-system] détermine le build backend du projet (je reviens plus bas sur le choix du build backend). La table [project] contient les informations de base, comme le nom du projet, la version, les dépendances, etc. Quant à la table [tool], elle est utilisée via des sous-tables [tool.<nom de l'outil>] : tout outil peut lire de la configuration dans sa sous-table dédiée. Rien n’est standardisé par des spécifications PyPA dans la table [tool], chaque outil y fait ce qu’il veut.

Avant qu’on me dise que pyproject.toml est mal documenté, ce qui a pu être vrai, je précise que des efforts ont été faits à ce niveau dans les dernières semaines, par moi et d’autres, ce qui donne un guide du pyproject.toml normalement complet et compréhensible, ainsi qu’une explication sur ce qui est déprécié ou non concernant setup.py et un guide sur la migration de setup.py vers pyproject.toml. Tout ceci réside sur packaging.python.org, qui est un site officiel de la PyPA rassemblant des tutoriels, guides et spécifications techniques.

Les build backends pour code Python pur

Le build backend est chargé de générer les sdists et les wheels que l’on peut ensuite mettre sur PyPI avec twine ou autre. Il est spécifié dans le fichier pyproject.toml. Par exemple, pour utiliser Flit, la configuration est :

[build-system]
requires = ["flit_core>=3.7"]
build-backend = "flit_core.buildapi"

requires est la liste des dépendances (des paquets sur PyPI), et build-backend est le nom d’un module (qui doit suivre une interface standardisée).

Il peut sembler étrange qu’il faille, même pour un projet simple, choisir son build backend. Passons donc en revue les critères de choix : de quoi est responsable le build backend ?

D’abord, il doit traduire les métadonnées du projet. En effet, dans les sdists et wheels, les métadonnées sont encodées dans un format un peu étrange, à base de MIME, qui est conservé au lieu d’un format plus moderne comme TOML ou JSON, pour des raisons de compatibilité. La plupart des build backends se contentent de prendre les valeurs dans la table [project] du pyproject.toml et de les copier directement sous la bonne forme, mais setuptools permet aussi de configurer les métadonnées via setup.py ou setup.cfg, également pour préserver la compatibilité, et il y a aussi des build backends comme Poetry qui n’ont pas adopté la table [project] (j’y reviens dans la section sur Poetry).

De plus, les build backends ont souvent des façons de calculer dynamiquement certaines métadonnées, typiquement la version, qui peut être lue depuis un attribut __version__, ou déterminée à partir du dernier tag Git.

C’est aussi le build backend qui décide des fichiers du projet à inclure ou exclure dans la sdist et le wheel. En particulier, on trouve généralement des options qui permettent d’inclure des fichiers autres que .py dans le wheel (c’est le wheel qui détermine ce qui est installé au final, alors que la sdist peut aussi contenir les tests etc.). Cela peut servir, par exemple, aux paquets qui doivent être distribués avec des icônes, des données en JSON, des templates Django…

Enfin, s’il y a des extensions en C, C++, Rust ou autre, le build backend est chargé de les compiler.

Il existe aujourd’hui de nombreux build backends. Beaucoup sont spécifiques à un type d’extensions compilées, ils sont présentés dans la troisième dépêche. Voici les build backends principaux pour du code Python pur.

setuptools

C’est le build backend historique. Il reste très largement utilisé.

Avant qu’arrive pyproject.toml, il n’y avait qu’un build backend, setuptools, et il était configuré soit par le setup.py, soit par un fichier en syntaxe INI, nommé setup.cfg (qui est l’ancêtre de pyproject.toml). Ainsi, il existe aujourd’hui trois manières différentes de configurer setuptools, à savoir setup.py, setup.cfg et pyproject.toml. On rencontre les trois dans les projets existants. La façon recommandée aujourd’hui est pyproject.toml pour tout ce qui est statique, sachant que setup.py, qui est écrit en Python, peut toujours servir s’il y a besoin de configuration programmable.

Aujourd’hui, setuptools ne se veut plus qu’un build backend, mais historiquement, en tant que descendant de distutils, il a beaucoup de fonctionnalités, désormais dépréciées, pour installer des paquets ou autres. On peut se faire une idée de l’ampleur des évolutions qui ont secoué le packaging au fil des années en parcourant l’abondante documentation des fonctionnalités obsolètes, notamment cette page, celle-ci ou encore celle-là.

Flit

Flit est l’exact opposé de setuptools. C’est le build backend qui vise à être le plus simple et minimal possible. Il n’y a pratiquement pas de configuration autre que la configuration standardisée des métadonnées dans la table [project] du pyproject.toml.

Flit se veut volontairement inflexible (« opinionated »), pour qu’il n’y ait pas de choix à faire. Avec Flit, un projet appelé nom-projet doit obligatoirement fournir un module et un seul, soit nom_projet.py, soit nom_project/. De même, il est possible d’inclure des fichiers autres que .py, mais ils doivent obligatoirement se trouver tous dans un dossier dédié au même niveau que le pyproject.toml.

Flit dispose aussi d’une interface en ligne de commande minimale, avec des commandes flit build (équivalent de python -m build), flit publish (équivalent de twine upload), flit install (équivalent de pip install .), et flit init (qui initialise un projet).

Hatchling

Hatchling est le build backend associé à Hatch, un outil tout-en-un dont il sera question plus loin.

Contrairement à setuptools, il est plutôt facile d’utilisation, et il fait plus souvent ce qu’on veut par défaut. Contrairement à Flit, il offre aussi des options de configuration plus avancées (comme pour inclure plusieurs modules dans un paquet), ainsi que la possibilité d’écrire des plugins.

PDM-Backend

De même que hatchling est associé à Hatch, PDM-Backend est associé à PDM. Je n'en ai pas d'expérience, mais à lire sa documentation, il me semble plus ou moins équivalent en fonctionnalités à hatchling, avec des options un peu moins fines.

Poetry-core

Comme les deux précédents, Poetry-core est associé à un outil plus vaste, à savoir Poetry.

Par rapport à hatchling et PDM-backend, il est moins sophistiqué (il ne permet pas de lire la version depuis un attribut dans le code ou depuis un tag Git).

La gestion des versions de Python : pyenv

L’une des difficultés du packaging Python est que l’interpréteur Python lui-même n’est généralement pas compilé upstream et téléchargé depuis le site officiel, du moins pas sous Linux (c’est davantage le cas sous Windows, et plus ou moins le cas sous macOS). L’interpréteur est plutôt fourni de l’extérieur, à savoir, sous Linux, par le gestionnaire de paquets de la distribution, ou bien, sous macOS, par XCode, Homebrew ou MacPorts. Cela peut aussi être un Python compilé à partir du code source sur la machine de l’utilisateur.

Ce modèle est différent d’autres langages comme Rust, par exemple. Pour installer Rust, la plupart des gens utilisent Rustup, un script qui télécharge des exécutables statiques compilés upstream (le fameux curl | bash tant décrié…).

Le but de pyenv est de simplifier la gestion des versions de Python. On exécute, par exemple, pyenv install 3.10.2 pour installer Python 3.10.2. Comme pyenv va compiler le code source, il faut quand même installer soi-même les dépendances (avec leurs en-têtes C).

Un outil de test et d’automatisation : tox

À partir du moment où un projet grossit, il devient souvent utile d’avoir de petits scripts qui automatisent des tâches courantes, comme exécuter les tests, mettre à jour tel fichier à partir de tel autre, ou encore compiler des catalogues de traduction en format MO à partir des fichiers PO. Il devient également nécessaire de tester le projet sur différentes versions de Python, ou encore avec différentes versions des dépendances.

Tout cela est le rôle de tox. Il se configure avec un fichier tox.ini. Voici un exemple tiré de Pygments:

[tox]
envlist = py

[testenv]
description =
    run tests with pytest (you can pass extra arguments for pytest,
    e.g., "tox -- --update-goldens")
deps =
    pytest >= 7.0
    pytest-cov
    pytest-randomly
    wcag-contrast-ratio
commands =
    pytest {posargs}
use_develop = True

On peut avoir plusieurs sections [testenv:xxx] qui définissent des environnements virtuels. Chaque environnement est créé avec une version de Python ainsi qu’une certaine liste de dépendances, et peut déclarer des commandes à exécuter. Ces commandes ne passent pas par un shell, ce qui garantit que le tox.ini reste portable.

Interlude : vous avez dit lock file?

Pour faire simple, un lock file est un fichier qui décrit de manière exacte un environnement de sorte qu’il puisse être reproduit. Prenons un exemple. Imaginons une application Web déployée sur plusieurs serveurs, qui a besoin de la bibliothèque requests. Elle va déclarer cette dépendance dans sa configuration. Éventuellement, elle fixera une borne sur la version (par exemple requests>=2.31), pour être sûre d’avoir une version compatible. Mais le paquet requests a lui-même des dépendances. On souhaiterait que l’environnement soit vraiment reproductible — que des serveurs différents n’aient pas des versions différentes des dépendances, même si les environnements sont installés à des moments différents, entre lesquels des dépendances publient des nouvelles versions. Sinon, on risque des bugs difficiles à comprendre qui ne se manifestent que sur l’un des serveurs.

La même problématique se pose pour développer une application à plusieurs. Sauf si l’application doit être distribuée dans des environnements variés (par exemple empaquetée par des distributions Linux), il ne vaut pas la peine de s’embarrasser de versions différentes des dépendances. Il est plus simple de fixer toutes les versions pour tout le monde.

Dans la vraie vie, une application peut avoir des centaines de dépendances, dont quelques-unes directes et les autres indirectes. Il devient très fastidieux de maintenir à la main une liste des versions exactes de chaque dépendance.

Avec un lock file, on s’assure de geler un ensemble de versions de tous les paquets qui sera le même pour tous les contributeurs, et pour tous les déploiements d’une application. On sépare, d’un côté, la déclaration des dépendances directes minimales supposées compatibles avec l’application, écrite à la main, et de l’autre côté, la déclaration des versions exactes de toutes les dépendances, générée automatiquement. Concrètement, à partir de la contrainte requests>=2.31, un générateur de lock file pourrait écrire un lock file qui fixe les versions certifi==2023.11.17, charset-normalizer==3.3.2, idna==3.4, requests==2.31.0, urllib3==2.1.0. À la prochaine mise à jour du lock file, certaines de ces versions pourraient passer à des versions plus récentes publiées entre-temps.

Le concept de lock file est en revanche beaucoup plus discutable pour une bibliothèque (par opposition à une application), étant donné qu’une bibliothèque est faite pour être utilisée dans d’autres projets, et que si un projet a besoin des bibliothèques A et B, où A demande requests==2.31.0 alors que B demande requests==2.30.0, il n’y a aucun moyen de satisfaire les dépendances. Pour cette raison, une bibliothèque doit essayer de minimiser les contraintes sur ses dépendances, ce qui est fondamentalement opposé à l’idée d’un lock file.

Il existe plusieurs outils qui permettent de générer et d’utiliser un lock file. Malheureusement, l’un des plus gros problèmes actuels du packaging Python est le manque criant, sinon d’un outil, d’un format de lock file standardisé. Il y a eu une tentative avec la PEP 665, rejetée par manque de consensus (mais avant qu’on soupire qu’il suffisait de se mettre d’accord : il y a de vraies questions techniques qui se posent, notamment sur l’adoption d’un standard qui ne permet pas de faire tout ce que font certains outils existants, qui risquerait de fragmenter encore plus au lieu d’aider).

Un gestionnaire de lock file : pip-tools

pip-tools est un outil assez simple pour générer et utiliser un lock file. Il se compose de deux parties, pip-compile et pip-sync.

La commande pip-compile, prend un ensemble de déclarations de dépendances, soit dans un pyproject.toml, soit dans un fichier spécial requirements.in. Elle génère un fichier requirements.txt qui peut être installé par pip.

Quant à la commande pip-sync, c’est simplement un raccourci pour installer les dépendances du requirements.txt.

Les locks files sont donc des fichiers requirements.txt, un format pas si bien défini puisqu’un requirements.txt est en fait essentiellement une série d’arguments et d’options en ligne de commande à passer à pip.

Les outils « tout-en-un »

Face à la prolifération d’outils à installer et mémoriser, certains ont essayé de créer une expérience plus cohérente avec des outils unifiés. Malheureusement, ce serait trop simple s’ils s’étaient accordés sur un projet commun…

Poetry

Poetry est un outil un peu à part qui fait à peu près tout par lui-même.

Poetry se destine aux développeurs de bibliothèques et d’applications. Toutefois, en pratique, il est plutôt orienté vers les applications.

La configuration se fait entièrement dans le fichier pyproject.toml. Poetry s’utilise toujours avec son build backend Poetry-core, donc la partie [build-system] du pyproject.toml est configurée comme ceci :

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

En revanche, contrairement à la plupart des autres build backends, Poetry n’accepte pas la configuration dans la table [project]. À la place, il faut écrire les métadonnées sur le projet (nom, version, mainteneurs, etc.) dans la table [tool.poetry], dans un format différent du format standard.

La particularité de Poetry qui le rend à part est d’être centré profondément sur le concept de lock file, d’insister fortement sur le Semantic Versioning, et d’avoir son propre résolveur de dépendances. Poetry n’installe jamais rien dans l’environnement virtuel du projet avant d’avoir généré un lock file qui trace les versions installées. Sa configuration a aussi des raccourcis typiques du semantic versioning, comme la syntaxe nom_du_paquet = "^3.4", qui dans la table [project] s’écrirait plutôt "nom_du_paquet >= 3.4, < 4.

(Ironiquement, les versions de Poetry lui-même ne suivent pas le Semantic Versioning.)

Je ne vais pas présenter les commandes de Poetry une par une car cette dépêche est déjà bien trop longue. Je renvoie à la documentation. Disons simplement qu’un projet géré avec Poetry se passe de pip, de build, de twine, de venv et de pip-tools.

PDM

Je l’avoue, je connais mal PDM. D’après ce que j’en ai compris, il est assez semblable à Poetry dans son interface, mais suit tout de même plus les standards, en mettant sa configuration dans la table [project], et en utilisant le résolveur de dépendances de pip. (Je parlerai tout de même, dans la quatrième dépêche, de la motivation à l’origine du développement de PDM, qui cache toute une histoire. Pour ceux qui ont compris, oui, c’est bien résumé par un nombre qui est multiple de 97.)

Hatch

Hatch est plus récent que Poetry et PDM. (Il n’est pas encore au niveau de Poetry en termes de popularité, mais loin devant PDM.) Il est encore en développement rapide.

Comparé à Poetry et PDM, il ne gère pas, pour l’instant, les lock files. (Ici aussi, il y a une histoire intéressante : l’auteur a d’abord voulu attendre que les discussions de standardisation aboutissent à un format commun, mais vu l’absence de progrès, il a fait savoir récemment qu’il allait implémenter un format non standardisé, comme Poetry et PDM le font déjà.)

En contrepartie, Hatch gère aussi les versions de Python. Il est capable d’installer ou de désinstaller une version très simplement, sachant que, contrairement à pyenv, il ne compile pas sur la machine de l’utilisateur mais télécharge des versions précompilées (beaucoup plus rapide, et aucune dépendance à installer soi-même). Il a aussi une commande fmt pour reformater le projet (plutôt que de définir soi-même un environnement pour cela dans Poetry ou PDM), et il est prévu qu’il gagne bientôt des commandes comme hatch test et hatch doc également.

De plus, dans Poetry, lorsque l’on déclare, par exemple, un environnement pour compiler la documentation, avec une dépendance sur sphinx >= 7, cette dépendance est résolue en même temps que les dépendances principales du projet. Donc, si votre générateur de documentation demande une certaine version, mettons, de Jinja2 (ou n’importe quel autre paquet), vous êtes forcé d’utiliser la même version pour votre propre projet, même si l’environnement pour exécuter votre projet n’a rien à voir avec l’environnement pour générer sa documentation. C’est la même chose avec PDM. Je trouve cette limitation assez frustrante, et Hatch n’a pas ce défaut.

La création d’exécutables indépendants et installeurs : PyInstaller, cx_freeze, briefcase, PyOxidizer (etc.)

Distribuer son projet sur PyPI est bien beau, mais pour installer un paquet du PyPI, il faut d’abord avoir Python et savoir se servir d’un terminal pour lancer pip. Quid de la distribution d’une application graphique à des gens qui n’ont aucune connaissance technique ?

Pour cela, il existe une pléthore d’outils qui créent des installeurs, contenant à la fois Python, une application, ses dépendances, une icône d’application, et en bref, tout ce qu’il faut pour satisfaire les utilisateurs qui n’y comprennent rien et réclament juste une « application normale » avec un « installeur normal », un appli-setup.exe ou Appli.dmg. Les plus connus sont PyInstaller et py2exe. Plus récemment est aussi apparu briefcase.

Il y a aussi d’autres outils qui ne vont pas jusqu’à créer un installeur graphique, mais se contentent d’un exécutable qui peut être lancé en ligne de commande. Ce sont notamment cx_freeze et PyOxidizer, mais il y en a bien d’autres.

Malheureusement, toute cette classe d’usages est l’un des gros points faibles de l’écosystème actuel. PyInstaller, par exemple, est fondé sur des principes assez douteux qui datent d’une époque où le packaging était beaucoup moins évolué qu’aujourd’hui (voir notamment ce commentaire). Pour faire simple, PyInstaller détecte les import dans le code pour trouver les fichiers à inclure dans l’application, au lieu d’inclure toutes les dépendances déclarées par les mainteneurs. Il semble que briefcase soit meilleur de ce point de vue.

De manière plus générale, embarquer un interpréteur Python est techniquement compliqué, notamment à cause de l’interaction avec des bibliothèques système (comme OpenSSL), et chacun de ces projets résout ces difficultés d’une manière différente qui a ses propres limitations.

Conda, un univers parallèle

Comme expliqué dans la première dépêche sur l’historique du packaging, Conda est un outil entièrement indépendant de tout le reste. Il ne peut pas installer de paquets du PyPI, son format de paquet est différent, ses environnements virtuels sont différents. Il est développé par une entreprise, Anaconda Inc (mais publié sous une licence libre). Et surtout, bien que chacun puisse publier des paquets sur anaconda.org, il reste principalement utilisé à travers des dépôts de paquets comprenant plusieurs milliers de paquets, qui sont gérés non pas par les auteurs du code concerné, mais par des mainteneurs propres au dépôt de paquets, à la manière d’une distribution Linux, ou de Homebrew et MacPorts sous macOS. En pratique, les deux dépôts principaux sont Anaconda, qui est maintenu par Anaconda Inc, et conda-forge, maintenu par une communauté de volontaires.

Quelques outils gravitent autour de Conda (mais beaucoup moins que les outils compatibles PyPI, car Conda est plus unifié). Je pense notamment à Condax, qui est à Conda ce que pipx est à pip. Il y a aussi conda-lock pour les lock files.

Grâce à son modèle, Conda permet une distribution très fiable des extensions C et C++, ce qui constitue son atout principal. Un inconvénient majeur est le manque de compatibilité avec PyPI, qui reste la source unique pour la plupart des paquets, Conda n’ayant que les plus populaires.

Petite comparaison des résolveurs de dépendances

Les résolveurs de dépendances sont des composants invisibles, mais absolument cruciaux des systèmes de packaging. Un résolveur de dépendances prend un ensemble de paquets, et de contraintes sur ces paquets, de la forme « l’utilisateur demande le paquet A version X.Y au minimum et version Z.T au maximum », ou « le paquet A version X.Y dépend du paquet B version Z.T au minimum et U.V au maximum ». Il est chargé de déterminer un ensemble de versions compatibles, si possible récentes.

Cela paraît simple, et pourtant, le problème de la résolution de dépendances est NP-complet (c’est facile à démontrer), ce qui signifie que, sauf à prouver fausse l'hypothèse du temps exponentiel (et si vous le faites, vous deviendrez célèbre et couronné de gloire et du prix Turing), il n’existe pas d’algorithme pour le résoudre qui ait une complexité meilleure qu’exponentielle. Les algorithmes utilisés en pratique se fondent soit sur des heuristiques, soit sur une traduction en problème SAT et appel d’un SAT-solveur. Le bon résolveur est celui qui réussira à résoudre efficacement les cas rencontrés en pratique. Pour revenir à Python, il y a aujourd’hui trois résolveurs de dépendances principaux pour les paquets Python.

Le premier est celui de pip, qui est implémenté dans resolvelib. Il utilise des heuristiques relativement simples. Historiquement, il s’est construit sur une contrainte forte : jusqu’à récemment (PEP 658), il n’y avait aucun moyen sur PyPI de télécharger seulement les métadonnées d’un paquet sans télécharger le paquet entier. Donc, il n’était pas possible d’obtenir tout le graphe de dépendances entier avant de commencer la résolution, car cela aurait nécessité de télécharger le code entier de toutes les versions de chaque dépendance. Or, il n’y a aucun solveur SAT existant (à ma connaissance) qui permette de modifier incrémentalement le problème. Par conséquent, pip était de toute façon forcé d’adopter une stratégie ad-hoc. La contrainte a été levée, mais l’algorithme est resté.

Le deuxième résolveur est celui de Conda. (En fait, le résolveur est en train de changer, mais l’ancien et le nouveau sont similaires sur le principe.) Contrairement à pip, Conda télécharge à l’avance un fichier qui donne les dépendances de chaque version de chaque paquet, ce qui lui permet de traduire le problème de résolution entier en problème SAT et d’appliquer un solveur SAT.

Enfin, le troisième résolveur fait partie de Poetry. Si j’ai bien compris ceci, il utilise l’algorithme PubGrub, qui ne traduit pas le problème en SAT, mais le résout plutôt avec une méthode inspirée de certains solveurs SAT.

En pratique, dans mon expérience, le solveur de pip se montre rapide la plupart du temps (sauf dans les cas vraiment complexes avec beaucoup de dépendances et de contraintes).

Toujours dans mon expérience, la résolution de dépendances dans Conda est en revanche franchement lente. À sa décharge, je soupçonne que le résolveur lui-même n’est pas spécialement lent (voire, plus rapide que celui de pip ? je ne sais pas), mais comme Conda a pour principe de ne prendre quasiment rien dans le système, en ayant des paquets comme wget, freetype, libxcb, pcre2, etc. etc. etc., certains paquets ont un nombre absolument effrayant de dépendances. Par exemple, il y a quelque temps, j’ai eu à demander à conda-lock un environnement satisfaisant les contraintes suivantes :

- pyqt=5.15.9
- sip=6.7.11
- pyqt-builder=1.15.2
- cmake=3.26.4
- openjpeg=2.5.0
- jpeg=9e
- compilers=1.6.0
- boost-cpp
- setuptools=68.0.0
- wheel

Sur mon ordinateur, il faut environ 7 minutes pour que Conda calcule l’environnement résultant — j’insiste sur le fait que rien n’est installé, ce temps est passé uniquement dans le résolveur de dépendances. Le lock file créé contient environ 250 dépendances (!).

À titre illustratif : « Conda has gotten better by taking more shortcuts and guessing things (I haven't had a 25+ hour solve in a while) » — Henry Schreiner

Quant au résolveur de Poetry, même si je n’ai jamais utilisé sérieusement Poetry, je crois savoir que sa lenteur est l’une des objections les plus fréquentes à cet outil. Voir par exemple ce bug avec 335 👍. (Je trouve aussi révélateur que sur les premiers résultats renvoyés par une recherche Google de « poetry dependency resolver », une moitié environ se plaigne de la lenteur du résolveur.)

D’un autre côté, le solveur de Poetry n’est appelé que lorsque le lock file est mis à jour, donc beaucoup moins souvent que celui de pip ou même Conda. Il y a un vrai compromis à faire : le résolveur de Poetry se veut plus précis (il est censé trouver plus souvent une solution avec des versions récentes), mais en contrepartie, la mise à jour du lock file peut prendre, apparemment, une dizaine de minutes dans certains cas.

Conclusion et avis personnels

Je termine en donnant mes choix très personnels et partiellement subjectifs, avec lesquels tout le monde ne sera pas forcément d’accord.

D’abord, il faut une manière d’installer des outils en ligne de commande distribués sous forme de paquets Python. Il est sage de donner à chacun son environnement virtuel pour éviter que leurs dépendances n’entrent en conflit, ce qui peut arriver très vite. Pour cela, on a essentiellement le choix entre pipx, ou créer à la main un environnement virtuel à chaque fois. Sans hésiter, je choisis pipx.

(Il y a un problème de boostrap parce que pipx est lui-même un outil du même genre. La solution consiste à l’installer avec un paquet système, que la plupart des distributions fournissent, normalement sous le nom python3-pipx.)

Ensuite, pour travailler sur un projet, on a le choix entre utiliser build et twine à la main pour générer la sdist et le wheel et les distribuer sur PyPI, ou bien utiliser un outil plus unifié, soit Flit, soit Poetry, soit PDM, soit Hatch. Dans le premier cas, on peut utiliser n’importe quel build backend, dans le deuxième, on est potentiellement restreint au build backend associé à l’outil unifié (c’est le cas avec Flit et Poetry, mais pas avec PDM, et plus avec Hatch depuis très récemment).

Parlons d’abord du build backend. À vrai dire, lorsque les builds backends ont été introduits (par la PEP 517, voir dépêche précédente), la motivation était largement de permettre l’émergence d’alternatives à setuptools au vu du triste état de setuptools. L’objectif est atteint, puisqu’il y a désormais des alternatives mille fois meilleures. L’ennui, c’est qu’il y a aussi un peu trop de choix. Donc, comparons.

D’abord, il y a setuptools. Sa configuration est franchement compliquée, par exemple je ne comprends pas précisément les douze mille options de configuration qui contrôlent les modules qui sont inclus dans les wheels. De plus, setuptools est vraiment excessivement verbeux. Dans le dépôt de Pygments, un module dont je suis mainteneur, python -m build | wc -l comptait 4190 lignes de log avec setuptools, à comparer à 10 lignes depuis que nous sommes passés à hatchling. Mais surtout, le problème avec setuptools, c’est qu’il y a mille et une fonctionnalités mutantes dont on ne sait pas très bien si elles sont obsolètes, et la documentation est, pour moi, tout simplement incompréhensible. Entendons-nous bien : j’ai beaucoup de respect pour les gens qui maintiennent setuptools, c’est absolument essentiel vu le nombre de paquets qui utilisent setuptools parce que c’était historiquement le seul outil, mais aujourd’hui, peu contestent que setuptools est moins bon qu’à peu près n’importe quel build backend dans la concurrence, et on ne peut pas le simplifier, justement à cause de toute la compatibilité à garder.

Alors… Flit ? Pour les débutants, ce n’est pas mal. Mais la force de Flit, son inflexibilité, est aussi son défaut. Exemple ici et où, suite à un commentaire de Ploum sur la dépêche précédente, je l’ai aidé à résoudre son problème de packaging, dont la racine était que Flit ne permet tout simplement pas d’avoir plusieurs modules Python dans un même paquet.

Alors… Poetry-core ? PDM-backend ? Hatchling ? Les différences sont moins marquées, donc parlons un peu des outils unifiés qui leur sont associés.

D’abord, que penser de Poetry ? Je précise que ne l’ai jamais utilisé moi-même sur un vrai projet. À ce que j’en ai entendu, la plupart de ceux qui l’utilisent l’apprécient et le trouvent plutôt intuitif. Par ailleurs, comme décrit plus haut, il a son propre résolveur de dépendances, et celui-ci est particulièrement lent au point que la génération du lock file peut prendre du temps. Soit. Mais je suis un peu sceptique à cause de points plus fondamentaux, notamment le fait que les dépendances de votre générateur de documentation contraignent celles de votre projet, ce que je trouve assez idiot. Je recommande aussi ces deux posts très détaillés sur le blog d’Henry Schreiner : Should You Use Upper Bound Version Constraints? et Poetry versions. Pour faire court, Poetry incite fortement à mettre des contraintes de version maximum (comme jinja2 < 3), ce qui est problématique quand les utilisateurs de Poetry se mettent à en abuser sans s’en rendre compte. Et il a aussi des opinions assez spéciales sur la résolution de dépendances, par exemple il vous force à mettre une contrainte < 4 sur Python lui-même dès qu’une de vos dépendances le fait, alors que tout projet Poetry le fait par défaut. J’ajoute le fait qu’on ne peut pas utiliser un autre build backend avec Poetry que Poetry-core. En corollaire, on ne peut pas utiliser Poetry sur un projet si tout le projet n’utilise pas Poetry, ce qui implique de changer des choses pour tous les contributeurs (alors que PDM et Hatch peuvent fonctionner avec un build backend différent). C’est pour moi un gros point noir.

Alors… PDM ? Honnêtement, je n’en ai pas assez d’expérience pour juger vraiment. Je sais qu’il corrige la plupart des défauts de Poetry, mais garde le « défaut du générateur de documentation ».

Alors… Hatch ? C’est celui que j’utilise depuis quelques mois, et jusqu’ici, j’en suis plutôt satisfait. C’est un peu dommage qu’il n’ait pas encore les lock files, mais je n’en ai pas besoin pour mes projets.

Je n’utilise pas pyenv. Déjà avant Hatch, je trouvais qu’il représentait trop de travail à configurer par rapport au service rendu, que je peux facilement faire à la main avec ./configure && make dans le dépôt de Python. Et depuis que j’utilise Hatch, il le fait pour moi, sans avoir à compiler Python.

De même, je n’utilise plus tox, je fais la même chose avec Hatch (avec la nuance que si j’ai déjà tanné mes co-mainteneurs pour remplacer make par tox, j’hésite à re-changer pour Hatch…). J’ai fini par me méfier du format INI, qui est piégeux (c’est subjectif) et mal spécifié (il y en a mille variantes incompatibles).

Donc, en résumé, j’utilise seulement deux outils, qui sont pipx, et Hatch. (Et j’espère n’avoir bientôt plus besoin de pipx non plus.) Mais si vous avez besoin de lock files, vous pourriez remplacer Hatch par PDM.

Je termine la comparaison avec un mot sur Conda. À mon avis, entre écosystème Conda et écosystème PyPI, le choix est surtout pragmatique. Qu’on le veuille ou non, l’écosystème Python s’est historiquement construit autour de PyPI, qui reste prédominant. Malheureusement, la réponse de Conda à « Comment installer dans un environnement Conda un paquet PyPI qui n’est pas disponible au format Conda ? » est « Utilisez pip, mais à vos risques et périls, ce n’est pas supporté », ce qui n’est pas fantastique lorsque l’on a besoin d’un tel paquet (cela arrive très vite). D’un autre côté, pour le calcul scientifique, Conda peut être plus adapté, et il y a des pans entiers de ce domaine, comme le géospatial, qui fonctionnent avec Conda et ne fonctionnent pas du tout avec PyPI.

J’espère que ce très long panorama était instructif et aidait à y voir plus clair dans l’écosystème. Pour la troisième dépêche, je vous proposerai un focus sur la distribution des modules d’extension écrits dans des langages compilés, sur ses difficultés inextricables, et sur les raisons pour lesquelles le modèle de Conda en fait une meilleure plateforme que PyPI pour ces extensions.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Contributions à des logiciels libres par l'équipe Yaal Coop durant l'automne 2023

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

Mécénat

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

wtforms

Bibliothèque python de gestion de formulaires web

flask-wtf

Intégration de WTForms dans Flask

django-anymail

Anymail: Intégration de fournisseurs d'e-mails transactionnels dans Django

ihatemoney

Une application web simple de gestion de budget

authlib

Bibliothèque python de gestion des identités et des accès

flask-webtest

Utilitaires de test d'applications Flask avec WebTest

Lire la suite…

Autumn 2023 FOSS contributions from by the Yaal Coop team

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

Sponsoring

canaille

Simplistic OpenID Connect provider over OpenLDAP

wtforms

A flexible forms validation and rendering library for Python.

flask-wtf

Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.

django-anymail

Anymail: Django email integration for transactional ESPs

ihatemoney

A simple shared budget manager web application

authlib

Identity and Access management library for python

flask-webtest

Lire la suite…

Sur Nantes - Meetups 2024

by dancergraham from AFPy discuss

Bonjour, voici un post wiki pour organiser le Nantes Python Meetup cette année:

Utiliser le bouton “Modifier” en bas a droite du message :arrow_heading_down: ou répondre ci-desssous

Lieux

Avec personne nommé comme contacte si possible

Dates 2024

  • 8 février chez OctopusMind?
  • 12 mars (proposition)
  • 9 avril (proposition)
  • 14 mai (proposition)

Sujets

Merci de répondre ci-dessous avec des propositions de sujet / contacter un organisateur directement.

  • La qualité dans un projet Python (Qualité, TDD, BDD, etc) par @tominardi
  • Django ORM et optimisation par @b0uh
  • Playwright: python testing for front end apps by Felix ?
  • Django ORM by ???
  • Install party - aider au setup Python / Conda / Django …
  • Préparer un talk pour le Meetup / PyCon / DevFest / …
  • Lightning Talks non-préparés en avance
  • Barcamp – on choisi 5 sujets ensemble, on se divise en petits groupes pour en parler

Sponsors

Merci a nos sponsors qui nous permettent une organisation avec beaucoup plus de confort et de snacks! Onepoint, Lengow, Wild Code School, Acernis Innovation

Organisateurs

Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

MINISTERE DE L'ECONOMIE ET DES FINANCES - Administratrice (-teur) système...

by pilou from AFPy discuss

Emploi ouvert aux contractuels (Catégorie A+ ), deux jours de télétravail par semaine.

Descriptif de l’employeur

Le service à compétence nationale (SCN) dénommé « Pôle d’Expertise de la Régulation Numérique » (PEReN), a pour mission d’apporter son expertise et son assistance techniques aux services de l’État et autorités administratives intervenant dans la régulation des plateformes numériques. Il est placé sous l’autorité des ministres chargés de l’économie, de la communication et du numérique et rattaché au Directeur Général des Entreprises pour sa gestion administrative et financière.

Le PEReN réunit les expertises humaines et ressources technologiques principalement dans les domaines du traitement des données, de la data science et de l’analyse algorithmique. Il fournit son savoir-faire technique aux services de l’État et autorités administratives qui le sollicitent (par exemple, Autorité de la concurrence, ARCOM, CNIL, ARCEP, ou directions ministérielles telles que la DGE, la DGCCRF, la DGT ou la DGMIC) en vue d’accéder à une compréhension approfondie des écosystèmes d’information exploités par les grands acteurs du numérique.
Le PEReN est également un centre d’expertise mutualisé entre les différents services de l’État qui conduit une réflexion sur la régulation des plateformes numériques et les outils de cette régulation, dans une approche à la pointe des avancées scientifiques. Il a également vocation à animer un réseau de recherche dédié à la régulation des grandes plateformes numériques et peut être amené à réaliser à son initiative des travaux de recherche académique liés aux différentes thématiques.

Description du poste

L’administratrice (ou administrateur) système participe aux évolutions fonctionnelles et de sécurité du système d’information du PEReN, permettant à ce service de développer et d’opérer les outils nécessaires à la réalisation de ses missions. En particulier, elle ou il :

  • assure une veille en terme de sécurité informatique et applique les mises à jour adéquates
    gère l’infrastructure et les services existants
  • développe et met en production la configuration de nouveaux services pour répondre aux besoins des utilisateurs
  • analyse et corrige les problèmes signalés par les utilisateurs ou par les alertes de supervision
    participe aux rituels du PEReN et s’implique dans l’équipe de gestion de l’infrastructure (3 membres).

Description du profil recherché

  • connaissance des outils de développement (pratique usuelle de git),
  • bonne connaissance de l’administration de systèmes Linux/Debian et des processus de CI/CD,
  • bonne connaissance des outils d’Infrastructure / Config as Code (Ansible),
  • maîtrise des enjeux de sécurité informatique dans un environnement GNU/Linux,
  • expérience(s) au service d’équipe(s) de développement logiciel (Python).

Les expériences suivantes seront considérées comme des atouts sans pour autant être strictement requises dans le contexte de cette fiche de poste :

  • la participation à des projets open-source (en tant que mainteneur, contributeur, ou encore d’animation de communauté, …).
  • comprendre les droits et obligations liés aux licences logicielles et les sujets liés à la propriété intellectuelle

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Focus sur icones du bureau

by PETERPAN31 from AFPy discuss

Bonjour,

Pour rappel je suis déficient visuel.

Je continue avec Python ei j’ai écrit un Player qui utilise espeak pour vocaliser un texte.
Dans une petite interface tkinter j’ai “bindé” des raccourcis pour réaliser des fonctions.

Je voudrais aller plus loin et récupérer le focus clavier des icones du bureau comme on le ferait avec les widgets de tkinter.
Evidemment ce n’est pas avec tkinter que je ferais cela.

J’étudie le module Xlib et je tourne autour uniquement du type window sans deviner où trouver les objets comme les icones.
Une icone pourrait-elle être une window “réduite” ?

Je ne trouve aucun post sur Xlib sur afpy.org.

Ce n’est peut-être pas la bonne méthode pour connaître quelle icone a le focus.

Auriez-vous une solution ou piste ?

Cordialement
pierre estrem

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup le 21 décembre

by grewn0uille from AFPy discuss

Prochain meetup Python le jeudi 21 décembre !

Pour ce dernier meetup de 2023, nous vous proposons un format Lightning Talks ! :christmas_tree:

Si vous souhaitez parler de quelque chose, d’une bibliothèque, d’un outil, d’un projet… N’hésitez pas à me contacter pour que je rajoute sur la liste des sujets :slight_smile:

Nous serons accueillis par Lowit (métro Part-Dieu).

Lightning Talks de Noël 🎄

2023-12-21 19:00 (Europe/Paris) → 2023-12-21 21:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Un wiki pour les fonctions

by mdk from AFPy discuss

J’aimais beaucoup https://rosettacode.org/ je découvre :

https://www.wikifunctions.org/

On peut y implémenter du Python et du JavaScript, j’ai hâte de voir où le projet va…

J’ai tenté une implèm : Function: Remove diacritics Z12391 Function (Z8) - Wikifunctions

Bon c’est à la wikidata : chaque objet a un identifiant opaque. Donc ma fonction c’est Z12391, elle est de type Z8, son implémentation en Python c’est Z12392, elle a un seul test : Z12393, elle prend en paramètre Z6 et renvoie Z6. J’ai du mal à m’y faire mais je crois comprendre le besoin d’internationalisation derrière.

8 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

pytest et conftest à rallonge

by fipaddict from AFPy discuss

Bonjour,

Rien que sur mes petits “projets”, je finis par avoir un conftest.py de plusieurs centaines de lignes et des noms de pytest.fixture qui ne veulent rien dire.

Je suis à la recherche de ressources (idéalement, PAS des tutoriels vidéo) sur les bonnes pratiques autour de pytest et conftest
et plus particulièrement sur la gestion des fixtures.
Par exemple :

  • Comment organiser ceux-ci (dans des fichiers et/ou une arborescence ?) plutôt que de les laisser dans un conftest.py à rallonge.
  • Est-il pertinent d’utiliser le même fixture pour plusieurs tests ?
  • Quelles règles de nommage adopter ?

Si vous avez des idées, des conseils de lecture, et pourquoi pas des exemples de projets qui ont mis en place de trucs autour de conftest (Si en plus, je peux aider à des trucs simples pour progresser autour de pytest et du reste), n’hésitez pas :slight_smile:

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Étude des backends de build utilisés dans les pyproject.toml

by mdk from AFPy discuss

Moi qui suis hésitant à tester d’autres backends que setuptools, je suis content de voir qu’il est toujours premier.

Bon pour combien de temps je l’ignore… en tout cas c’est très cool d’avoir ce genre de graph !

Ou sans ceux qui ont moins de 5 utilisations (qui peuvent être des petits wrappers persos typiquement) :

Source (et retoots bienvenus) :

Je suis un peu déçu que flit ne fasse pas plus, il colle bien à la philosophie « ne faire qu’une seule chose mais le faire bien », et pendant qu’on y est il colle bien à « keep it simple » aussi (en essayant pas de gérer les venvs, les dépendances, la vie, et le reste en même temps). S’il y en a un que j’essayerai plus volontiers que les autres (et que j’ai déjà essayé j’avoue) c’est bien celui-là.

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Oubliez `venv`, adoptez `pipenv`, un projet porté par PyPA

by kirisakow from AFPy discuss

Ce sujet est ma tentative de faire connaître pipenv dont on parle peu, j’ai l’impression, alors même qu’on continue de parler de venv et de comment lui tordre le bras — parce que, oui, venv a des défauts notoires. Il serait grand temps que venv prenne la retraite pour laisser place à ce qui se fait de mieux, actuellement.

pipenv : petite intro

Extrait de la note d’intention (non traduite en français) publiée sur le site officiel du projet pipenv :

Pipenv: Python Dev Workflow for Humans

Pipenv is a Python virtualenv management tool that supports a multitude of systems and nicely bridges the gaps between pip, python (using system python, pyenv or asdf) and virtualenv. Linux, macOS, and Windows are all first-class citizens in pipenv.

Pipenv automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your Pipfile as you install/uninstall packages. It also generates a project Pipfile.lock, which is used to produce deterministic builds.

Pipenv is primarily meant to provide users and developers of applications with an easy method to arrive at a consistent working project environment.

The problems that Pipenv seeks to solve are multi-faceted:

  • You no longer need to use pip and virtualenv separately: they work together.

  • Managing a requirements.txt file with package hashes can be problematic. Pipenv uses Pipfile and Pipfile.lock to separate abstract dependency declarations from the last tested combination.

  • Hashes are documented in the lock file which are verified during install. Security considerations are put first.

  • Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.

  • Gives you insight into your dependency graph (e.g. $ pipenv graph).

  • Streamline development workflow by supporting local customizations with .env files.

Pour aller plus loin :

Un peu de pratique : installer pipenv dans le cadre d’un projet

Petites précisions pour la clarté :

  • Le texte ci-dessous est un extrait des notes perso, prises en suivant un tuto de Django.
  • Les notes sont en anglais (pas taper ! c’est pas de l’anglais littéraire non plus…)

1. Why pipenv? pipenv vs venv

pipenv has some advantages over venv, like:

Feature pipenv venv
Dependency management Uses a Pipfile to track and manage package dependencies Does not have built-in dependency management
Reproducibility Can create a Pipfile.lock file to recreate your virtual environment on another machine or at a later time Does not have a built-in mechanism for reproducibility
Simplicity Combines the functionality of venv and pip into a single tool Is a lower-level tool that only creates virtual environments

2. Set up pipenv virtual environment

2.1. Make sure pipenv is installed, otherwise install it

sudo apt update

sudo apt install pipenv

2.2. Open terminal in a so-called my-django-workspace directory and run pipenv install django

cd my-django-workspace

pipenv install django

This will create

  • ./Pipfile (a TOML config file)

  • ./Pipfile.lock (a JSON file)

and a few new directories in your user’s home directory:

~/.local/share/virtualenv/
├── py_info/
└── wheel/

~/.local/share/virtualenvs/
└── my-django-workspace-A3MO-irQ/

2.3. Run pipenv shell to launch the virtual environment

  • Make sure you are in a directory with the Pipfile and Pipfile.lock files.

  • Run pipenv shell

  • To quit the virtual environment, press ctrl d.

2.4. Other useful pipenv commands

  • pipenv run pip freeze

5 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

venv, prompt bash (et emacs (et LSP))

by mdk from AFPy discuss

J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…

Déjà voilà à quoi ça ressemble chez moi :

Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.

(Oui mon laptop s’appelle seraph et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)

Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :

venv()
{
    printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
    direnv allow .
}

de cette manière dès que je cd dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv c’est pour dire à layout python3 où mettre le venv.

Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.

Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1 avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.

Le code (attention, 42 lignes…):

Ça s’imbrique parfaitement dans emacs avec le module envrc qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

venv, direnv, prompt bash (et emacs (et LSP))

by mdk from AFPy discuss

J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…

Déjà voilà à quoi ça ressemble chez moi :

Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.

(Oui mon laptop s’appelle seraph et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)

Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :

venv()
{
    printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
    direnv allow .
}

de cette manière dès que je cd dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv c’est pour dire à layout python3 où mettre le venv.

Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.

Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1 avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.

Le code (attention, 42 lignes…):

Ça s’imbrique parfaitement dans emacs avec le module envrc qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV :

8 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Python : Soucis d'affectation de variables

by Peter49 from AFPy discuss

Je souhaite réaliser une boucle sur les 3 champs de BT0 ou BT1 ou BT2
sachant que le 0,1 ou 2 (de chaque BT) est une variable par exemple i, donc BT[i].
Cette dernière syntaxe ne fonctionne pas. Je n’arrive pas à construire une variable composée de BT et de i
Une fois ce point réglé, je souhaite réaliser une deuxième boucle sur le contenu
de LGx, CLx et GRx en fonction du BT[i] sélectionné.

J’ai tenté plusieurs approches, mais sans succès.

Merci de votre aide

BT0 = [LG1, CL1, GR1]
BT1 = [LG1, CL2, GR1]
BT2 = [LG1, CL3, GR1]

LG1=[0,1,2,3,4,5,6,7,8]
CL1=[0,9,18,27,36,45,54,63,72]
CL2=[1,10,19,28,37,46,55,64,73]
CL3=[2,11,20,29,38,47,56,65,74]
GR1=[0,1,2,9,10,11,18,19,20]

7 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Hébergement Python

by Hector from AFPy discuss

Bonjour
J’ai développé une application Python en local. Celle-ci dialogue avec une base de données Mysql située chez l’hébergeur Ikoula
Ikoula ne supportant pas Python (du moins sur serveur mutualisé) je cherche un autre hébergeur…le moins cher possible !

L’idéal pour moi serait :

  • appli Python et base de données chez l’hébergeur à trouver (j’ai vu Pythonanywhere et Hidora, mais c’est très complexe pour moi)
  • accès à la base de données depuis un navigateur, en l’occurrence via une application PHP
  • lancement de l’application Python depuis cette appli PHP

Merci d’avance pour l’aide

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Canaille, un système léger de gestion d’identité et d’accès

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

Depuis un certain temps l’équipe de Yaal Coop travaille sur Canaille, un logiciel de gestion d’identité et d’accès. Nous profitons de la fin de travaux financés par la fondation NLNet pour vous raconter l’histoire autour de Canaille.

Canaille

Au début étaient les annuaires

À Yaal Coop (comme presque partout ailleurs) nous utilisons une palette d’outils qui nous permettent de travailler ensemble. Emails, fichiers, carnets de contacts, gestion de projet, suivi du temps, comptabilité, intégration continue, collecte de rapports de bugs… la liste est longue. Pour des raisons de praticité (et de sécurité) on cherche généralement à connecter une telle collection d’outils à un logiciel central qui se charge de la gestion des utilisateur·ices et de leurs accès. Traditionnellement, c’est LDAP1 qui est utilisé pour cet usage, on parle alors d’annuaire.

Si un outil est connecté à un annuaire, vous n’avez pas besoin de vous y créer un compte, vous pouvez vous connecter en utilisant votre mot de passe habituel, celui que vous avez renseigné dans l’annuaire. C’est pratique pour vous puisque vous n’avez qu’un unique mot de passe à retenir (ou à oublier), on parle généralement d’inscription unique ou Single Sign On (SSO). C’est aussi pratique pour les personnes qui gèrent les comptes dans votre organisation, puisqu’elles peuvent créer et révoquer des comptes utilisateur·ices une seule fois pour tous les outils à la fois.

LDAP, c’est vieux et c’est robuste. Pour des logiciels, ce sont des qualités. Les quelques décennies d’expérience de LDAP en font une technologie éprouvée et compatible avec un énorme choix de logiciels.

Mais LDAP, c’est aussi compliqué et austère. C’est une base de donnée en arbre qui ressemble à peu d’autres choses, la documentation est éparse et absconse, les conventions sont curieuses, pleines d’acronymes angoissants, l’outillage est rare… Et puis c’est conçu pour les données qui sont lues souvent mais écrites rarement. Les modèles de données utilisables dans LDAP sont eux aussi peu évolutifs. Généralement quelques uns sont fournis d’office et permettent de manipuler des attributs de base sur des utilisateur·ices et des groupes. Et si on veut que son système puisse gérer d’autres attributs comme les couleurs préférées, alors il faut écrire ses propres modèles de données, et on a intérêt à être sûr de soi puisqu’aucun mécanisme de mise à jour des schémas ou de migration des données n’est prévu2. Si on souhaite ensuite partager ces modèles de données, alors il est conseillé de s’enregistrer à l’IANA3, et de fournir une référence en ligne de ses schémas. Quand on se plonge dans l’univers de LDAP, on a l’impression qu’une fois mises en place, les installations ne bougent pas pendant des années ; et donc les personnes qui ont la connaissance fuient l’austérité de cette technologie sans avoir à s’y ré-intéresser (puisque ça fonctionne), et sans trop documenter leurs aventures. J’exagère à peine, si on compare4 le nombre de questions sur stackoverflow, pour ldap on en dénombre environ 1000 tandis que postgresql ou mongodb en comptent environ 14 000 et mysql 45 000.

Puis vint l’authentification unique

Lors de temps de bénévolat à Supercoop5, nous avons notamment travaillé à installer, comme pour chez nous, plusieurs outils numériques de collaboration. Évidemment tous les outils étaient branchés sur un annuaire LDAP. Nous nous sommes rendus compte que l’équipe dite de gestion des membres, passait un certain temps à traiter des demandes de réinitialisation de mot de passe, à aider des personnes qui échouaient à utiliser les outils dès les premières étapes de connexion. Ce constat nous a donc poussé à chercher des outils (libres, évidemment) d’authentification unique et de gestion d’utilisateur·ices, en complément ou remplacement de l’annuaire. Ce que l’authentification unique ou Single Login Identification (SLI) apporte au SSO fourni par LDAP, c’est que les utilisateur·ices peuvent naviguer entre les outils sans avoir à s’identifier à nouveau. On peut passer de l’interface mail à son calendrier en ligne sans repasser par l’écran d’identification, tandis qu’avec un simple annuaire, il aurait été nécessaire d’entrer son mot de passe une fois pour chaque outil. Pour un public non technophile, c’est l’opportunité de se passer de quelques écrans techniques, et limiter les sources d’erreur et de frustration.

Actuellement les protocoles de prédilection pour faire du SLI sont OAuth2 et OpenID Connect (OIDC)6. On note qu’il existe d’autres standards, plus historiques ou bien plus orientés vers les grosses organisations, tels SAML ou CAS. Les normes OAuth2 et OIDC sont modernes mais bénéficient d’une dizaine d’années de retours d’expérience. Les outils et les documentations sont nombreuses, la communauté est active, et les standards évoluent en ce moment même grâce au groupe de travail oauth de l’IETF7. Mais là encore tout n’est pas rose et OIDC vient avec son lot de difficultés.

Tout d’abord, OAuth2 et OIDC c’est environ 30 standards complémentaires, dont certains contredisent et apportent des corrections sur des standards antérieurs. Tous ne sont pas pertinents dans l’usage que nous visons, mais ne serait-ce que simplement comprendre le fonctionnement de ceux qui nous intéressent demande déjà du temps et de la réflexion. Les implémentations d’OIDC — par les logiciels de gestions d’utilisateur·ices, ou par les outils qui s’y branchent — sont généralement partielles, et parfois bugguées. Pour ne rien arranger, les gros acteurs de l’industrie prennent délibérément des libertés avec les standards et forcent le développement de spécificités pour être compatibles avec leurs logiciels.8

Mais revenons à nos moutons. Pour Supercoop nous souhaitions trouver un outil qui soit d’une grande simplicité à plusieurs points de vue :

  • pour les utilisateur·ices : les coopérateur·ices du magasin. L’utilisation doit se faire sans aucune connaissance technique préalable, et sans assistance ;
  • pour l’équipe de gestion des membres du magasin. Nous voulions un outil simple à prendre en main. Un apprentissage de l’outil est envisageable mais non souhaitable. En effet le magasin fonctionnant grâce à la participation de bénévoles, il y a un enjeu à ce que le temps passé soit le moins rébarbatif possible, afin de ne décourager personne.
  • enfin pour l’équipe informatique, il y a là aussi un enjeu de simplicité. Si les outils déployés pour le magasin requièrent trop de connaissances, nous aurons des problèmes pour trouver des gens compétents pour nous aider. Et la nature de la participation du magasin fait que les coopérateur·ices contribuent ponctuellement, tournent souvent, et n’ont pas nécessairement le temps d’apprendre toute la pile technique mise en œuvre. Idéalement, l’équipe informatique devrait pouvoir administrer l’outil que nous recherchons avec une connaissance superficielle des protocoles concernés. Et vues les descriptions que j’ai faites de LDAP et OIDC, vous commencez à cerner une partie du problème.

Notre recherche nous a montré qu’il existait une quinzaine d’outils pouvant répondre aux besoins que nous avons identifiés. Pour autant, aucun outil ne nous semblait cocher toutes les cases. En fait, par leur nature, les outils de gestion d’identité et d’autorisations ou Identity and Authorization Management (IAM) sont destinés à de grosses organisations, qui peuvent donc s’offrir les services de personnes qualifiées pour s’en occuper. Ce sont donc des logiciels lourds mais puissants, supportant beaucoup de protocoles qui ne nous concernent pas, requiérant une certaine technicité pour l’installation, la maintenance ou la gestion. Motivés par notre curiosité nous avons fini par bricoler quelque chose dans notre coin.

Canaille

Quelques temps après, notre prototype a grossi et a donné Canaille.

Les fonctionnalités

Canaille est un logiciel qui permet de gérer des utilisateur·ices et des groupes d’utilisateur·ices, de créer, modifier et administrer des comptes, de réinitialiser des mots de passes perdus, d’inviter des nouveaux utilisateur·ices. En plus de ça, Canaille implémente OIDC et fournit donc une authentification unique aux utilisateur·ices vers d’autres outils. Son interface est personnalisable et … c'est tout. Nous tâchons de garder le périmètre fonctionnel de Canaille assez restreint pour qu'il reste simple.

Canaille peut être utilisé pour :

  • apporter une interface web épurée de gestion des comptes utilisateur·ices au dessus d’un annuaire LDAP. L’outillage autour de LDAP étant comme on l’a dit plutôt épars, Canaille peut être utilisé pour modifier facilement un profil utilisateur·ice ou réinitialiser un mot de passe perdu.
  • amener du SLI sur un annuaire LDAP. Si vous avez historiquement un annuaire LDAP et que vous voulez moderniser votre pile logicielle avec une couche d’authentification unique, Canaille peut s’intégrer discrètement au-dessus de votre installation existante sans rien modifier, et vous laisser le temps de prévoir – ou pas – une migration.
  • développer des applications utilisant OIDC. Si, comme nous, vous faites du développement logiciel et travaillez régulièrement sur des applications nécessitant une connexion OIDC, alors vous pouvez utiliser Canaille dans votre environnement de développement. Canaille étant très léger, c'est désormais pour nous la solution de choix comme IAM pour travailler sur nos applications.
  • tester des applications utilisant OIDC. Nous utilisons aussi Canaille dans des suites de tests unitaires python, grâce à pytest-iam. Ce greffon de pytest embarque Canaille, le prépare et l’instancie pour que vos suites de tests puissent effectuer une réelle connexion OIDC.

Les choix techniques

Canaille est un logiciel écrit en python, avec flask pour le côté serveur et fomantic-ui et htmx pour la partie client utilisateur·ice. Nous apprécions la simplicité de python et celle de flask et croyons sincèrement que ce sont autant de freins en moins à la participation d’éventuels contributeur·ices. Nous avons été sidérés par notre découverte récente de HTMX, qui en deux mots nous permet de créer des pages web dynamiques sans plus écrire de Javascript. Un langage en moins dans un projet c'est autant de complexité en moins.

Sous le capot, Canaille peut se brancher au choix à un annuaire LDAP ou à une base de données SQL.

Les techniques de développement

Nous utilisons Canaille en production, à Supercoop donc où il est utilisé pour gérer environ 1800 membres, mais aussi chez nous à Yaal Coop et au sein de notre offre mutualisée de services Nubla, et sur des instances dédiées Nubla Pro. Cette large base d’utilisateur·ices nous permet de récolter des retours d’expérience, et nous améliorons le logiciel au fur et à mesure des besoins.

Canaille suit le principe du développement dirigé par les tests, ou Test Driven Development (TDD), dans la mesure du possible. La couverture du code est de 100% (branches comprises), et c’est un pré-requis pour toute contribution. En plus d’avoir confiance dans nos tests, cela nous a permis à plusieurs reprises de simplement supprimer du code qui n’était plus utilisé, et simplifier d’autant le projet. On débusque plus facilement les bugs quand il y a moins de code.

Canaille utilise tous les analyseurs et formatteurs de code source modernes, au sein de pre-commit, et les test unitaires sont joués sur toutes les versions de Python officiellement supportées.

Enfin la traduction de l’interface de Canaille se fait de manière communautaire sur weblate.

Contributions

Comme la plupart des logiciels modernes, Canaille réutilise des bibliothèques logicielles existantes pour que nous n’ayions pas à ré-inventer ce que d’autres ont déjà fait.

Lorsque nous rencontrons des erreurs dans ces bibliothèques, nous suivons une stratégie qui consiste à implémenter les corrections à la fois dans Canaille et dans les logiciels. D’une part nous amenons donc les corrections dans Canaille, de manière temporaire et efficace. Mais tout ce code que nous écrivons nous-même est un fardeau de maintenance à venir, nous tâchons donc en parallèle de proposer des solutions mieux conçues aux mainteneur·euses desdites bibliothèques, en discutant avec eux en amont. C'est pour nous la garantie que les briques logicielles sur lesquelles nous nous appuyons sont pérennes, et c’est un moyen de contribuer à cet écosystème nécessaire qu’est celui du logiciel libre.

Par ailleurs lorsque nous souhaitons des fonctionnalités supplémentaires dans ces bibliothèques, nous expliquons nos motivations aux mainteneur·euses et parfois proposons des implémentations. Nous avons par exemple développé le support des spécifications OIDC RFC7591 et RFC9068 dans authlib, une brique utilisée pour la partie OIDC de Canaille.

Le résultat de ces efforts est visible dans nos articles trimestriels de contributions à des logiciels libres.

Le hasard des contributions nous a amené à partager la maintenance de certaines des bibliothèques que nous utilisons, comme wtforms qui permet de gérer les formulaires dans Canaille, ou encore nextcloud-oidc-login et OpenIDConnect-PHP qui permettent à nextcloud (le gestionnaire de fichiers proposé par Nubla) de se connecter à Canaille.

Nous sponsorisons aussi modestement tous les mois les mainteneur·ices de fomantic-ui et authlib.

L’aide de la fondation NLNet

Canaille a été développé pour répondre aux besoins spécifiques que nous avons rencontrés : à l’origine Canaille s’interfaçait donc seulement avec des annuaires LDAP. L’écosystème évoluant, nous nous sommes aperçus que de plus en plus de logiciels étaient capables de communiquer avec OIDC en plus de LDAP. In fine, si plus aucun des logiciels que nous utilisons ne dépend directement de LDAP, alors nous pouvons envisager un outil de remplacement avec lequel nous nous sentons plus à l’aise. Pour aller dans cette direction, nous avons sollicité fin 2022 l’aide de 7 000€ au fond NGI Zero Entrust de la fondation NLNet pour financer le support de travaux dans Canaille :

Canaille

Ces développements ont été achevés fin novembre 2023, et ont été la source de nombreux réusinages, de nombreuses corrections de bogues, et plus généralement d’une meilleure conception et d’une meilleure fiabilité de Canaille. Nous sommes particulièrement reconnaissant·es à la fondation NLNet de nous avoir permis de travailler sur notre outil, et de nous aider à contribuer à notre échelle à l’écosystème du logiciel libre.

Et la suite ?

Passer en version bêta

Nous avons depuis le début gardé Canaille en version alpha, nous sommes à l’heure actuelle à la version 0.0.35. Nous indiquions que le logiciel était impropre aux environnements de production. C’était pour nous un moyen de pouvoir expérimenter dans notre coin sans avoir à se soucier de rétrocompatibilité. Nous souhaitons sévir une dernière fois en remettant à plat la manière de configurer Canaille avant de passer Canaille en bêta, et lever les mises en garde d’usage.

Nous regroupons les tickets pour le passage en version bêta de Canaille dans ce jalon.

Passer en version stable

Les travaux que nous immaginons réaliser pour passer d’une version bêta à une version finale sont principalement des efforts de documentation, d’installation et de prise en main de Canaille. L’objectif est pour nous de rendre Canaille facile d’accès, afin de créer de l’usage et collecter des retours utilisateurs.

Nous regroupons les tickets pour le passage en version stable de Canaille dans ce jalon.

Et au-delà…

Pour l’avenir nous souhaitons travailler sur le provisionnement, en implémentant la norme SCIM. Ce travail permettra de découpler l’authentification des utilisateur·ices et la création des comptes utilisateur·ices. En effet aujourd’hui dans les outils externes que nous avons branchés à Canaille, les comptes des utilisateur·ices sont créés à la première connexion. Cela peut s’avérer problématique dans certaines situations : par exemple si l’on veut partager des fichiers dans Nextcloud avec un utilisateur·ice qui ne s’est encore jamais connecté. SCIM permet aussi de supprimer des comptes utilisateur·ices sur ces outils externes, tâche qui doit être réalisée plus ou moins manuellement à l’heure actuelle.

Parmi les chantiers à venir, nous voyons aussi le travail sur la déconnexion unique, ou Single Log-Out (SLO). C’est un développement qui devra être réalisé en premier lieu dans authlib, et qui permettra aux utilisateur·ices de se déconnecter de tous les outils en une seule action. C’est une fonctionnalité qui apportera de la sécurité et du confort d’utilisation.

Enfin, nous aimerions travailler sur une gestion avancée des groupes d’utilisateur·ices et des droits, ainsi que sur des mécanismes d’authentification multi-facteurs.

Si tout cela vous intéresse, vous pouvez tester Canaille immédiatement sur notre interface de demo. Canaille est évidemment ouvert aux contributions, alors si vous souhaitez nous aider dans tout ça, la porte est ouverte !

  1. enfin, un logiciel qui implémente LDAP, ici je parle indifféremment du protocole ou de ses implémentations ↩︎
  2. du moins avec OpenLDAP ↩︎
  3. ce que nous avons fait, notre numéro à l’IANA est le 56207 ↩︎
  4. d’accord, la comparaison est fallacieuse puisque ces différentes bases de données ne répondent pas aux mêmes besoins, mais l’ordre de grandeur est révélateur de l’intérêt autour de ces technologies ↩︎
  5. le supermarché coopératif de l’agglomération bordelaise ↩︎
  6. par abus de langage, je dirai simplement OIDC ↩︎
  7. l’« Internet Engineering Task Force » un organsime étasunien de développement et de promulgation de standards ↩︎
  8. Ils peuvent aussi êtres moteurs de nouvelles améliorations, comme RFC7628 ou RFC9068 qui furent des usages avant d’être des standards. ↩︎

Lire la suite…

Canaille, a lightweight identity and authorization management software

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

Since a while, the Yaal Coop team is working on Canaille, an identity and authorization management software (or IAM). At the occasion of the end of an endeavour that benefited the help of the NLNet foundation, we want to tell the history around Canaille.

Canaille

At first was the Single Sign On

At Yaal Coop (like anywhere else) we use a bunch of tools to work together as a team. Emails, files, address book, project management, time tracking, accountability, continuous integration, bug reporting… and the list goes on. For the comfort of use (and for security), those tools are generally plugged to a central software that manages user accounts and accesses. Usually, LDAP[ref]or more exactly, a software implementing the LDAP protocol[/ref] is used for that, and this is called a directory. If a service is connected to a directory, you do not need to register to that service, you can just use your usual password, the one you set in the directory. It is convenient for you since you just have one single password to remember (or to forget). This is what is called Single Sign On (SSO). It is also convenient for people managing the user accounts in your organization, as they can create and revoke accounts for all the plugged services at a time.

LDAP is old and robust, and for software those are qualities. The few decades of experience behind LDAP make it a battle-tested technology compatible with a large selection of services. But unfortunately LDAP is also complicated and abstruse.

Its tree model looks like few other things you might know, the documentation is rare and obscure, conventions are intriguing, with a lot of distressing acronyms, tooling is sparse… Also, this was made for data often read but rarely written. The data models LDAP offers cannot easily evolve. Generally, the provided ones allow to handle basic attributes on users and groups. If you want to manage more advanced aspects like the favourite color of users, then you need to write your own data models[ref]that are called schemas[/ref]. And you'd better be confident when you do it, because no update mechanism is provided for neither data nor data models[ref]at least with OpenLDAP[/ref]. Then, if you wish to share your data models with the world, it is advised that your register at the IANA[ref]what we did, our IANA number is 56207[/ref], and provide an online reference of your schemas.

When we took a close look at the LDAP universe, we had the impression that once set up, LDAP installation were left alone for years ; like if people who might had knowledge to share had flew the austerity of that technology without documenting their adventures, and without need to returning to it because it just works. I am barely exaggerating, if we have a look[ref]OK, the comparison has limits since those different databases are not used for the same needs, but the magnitude of the numbers says something about the interest around those technologies[/ref] at the number of questions in stackoverflow, ldap has approximately 1000 questions, while postgresql or mongodb have around 14.000, and mysql has 45.000.

Then came the Single Log In

During our volunteer time at Supercoop[ref]a cooperative supermarket near Bordeaux, France[/ref], among other tasks, we worked to install collaboration software, like we did for ourselves. Obviously, those tools were plugged on a LDAP directory. We noticed that the members management team of the supermarket was spending a certain amount of time dealing with user support, notably with password reset demands. People were failing to use the tools we deployed for them as soon as the first login step. This verdict pushed us to look for Single Login Identification (SLI) software (free and open-source, obviously), in replacement or in addition to our historical directory. What SLI brings, is that users can navigate between services without having to sign in every time. They can switch from the webmail interface to the calendar without having to make a step by the authentication screen, while with a simple directory, they would have to enter their password once for each service. For a non tech-savvy public, this is the opportinity to get rid of several technical screens, limit the error sources and the frustration.

Currently the predilection protocols for SLI are OAuth2 and OpenID Connect (OIDC)[ref]for sake of simplicity, I will keep to OIDC[/ref]. (There are other existing standards, more historical or more focused towards big organizations, like SAML or CAS.) The OAuth2 and OIDC specifications are recent but they still benefit from a decade of feedback. Tooling and documentation are numerous, the community is alive and active, and standards are still evolving at this day with the work of the IETF oauth workgroup. But here again, everything is not perfect and OIDC comes with its difficulties. First of all, OAuth2 and OIDC make about 30 different standards, some of which contradicting or bringing corrections upon prior standards. All of those are not pertinent for what we want to do, but simply understanding how work the few standards that actually interests us already requires a certain amount of time and work. The OIDC implementations – by the IAMs or the services connected to IAMs – are sometimes partial or bugged. To make nothing better, big industry actors sometimes deliberately take some liberties with the standards, and make some additional developments a requirements to be compatible with their software.[ref]They can also be a driving force for new features, like RFC7628 or RFC9068 that were commonly used before they became standards.[/ref]

Let's get back on topic. For Supercoop, we wanted to find a tool that would be utterly simple from several point of views:

  • for the final users: the volunteers of the shop. They must be able to use the tool without any prior technical knowledge, and without help;
  • for the members management team. We wanted a relatively simple tool where a little bit of learning would be acceptable but not desirable. As the cooperative supermarket operates with benevolent labour, we want to take care of the volunteer time and avoid disagreeable tasks.
  • for the IT team. Here again simplicity is at stake. If there is a too steep learning curve on the tools the supermarket uses, there will be an issue for recruiting competent people to help us. The nature of the benevolent participation of the shop make that volunteers are helping punctually, and rarely engage for years, so they do not always have the time to learn the whole technical stack. Ideally the IT team should be able to administrate the tool we are seeking with a superficial knowledge of the underlying protocols. And with the descriptions I made of LDAP and OIDC, you start to make an idea of the problem we have.

Our search showed us that there was a dozen of tools that could answer our needs. However, none was fitting all our expectations. Actually, by their very nature, the IAM software are intended to big organizations, that consequently can afford to hire competent people to administrate them, so complexity is not really an issue. Those are mostly big powerful software, with a large protocol compatibility not pertinent for us, and requiring some technical knowledge for installation, maintenance and administration. Pushed by our curiosity, we finally hacked something on our side.

Canaille

A few times later, our prototype had grown bigger and became Canaille.

The features

Canaille is a user and group management software that allows account creation, edition, administration, registration, forgotten password reset, user invitation etc. In addition, Canaille implements OIDC and provide a SLI layer for other services. Its interface is customizable and… that's all. We try to keep the functional scope tight so Canaille can stay simple to maintain and to operate.

Canaille can be used for:

  • bringing an account edition interface on top of a LDAP directory. The tooling around LDAP being quite sparse, Canaille can be a convenient option and allow utilities like password reset.
  • bringing a SLI layer on top of a LDAP directory. If your organization has a historical LDAP directory and you want to modernize your stack with SLI, Canaille can discretely integrate your existing stack (almost) without modifying anything, and let you the time to prepare (or not) a migration.
  • develop applications relying upon an OIDC server. If, like us, you are doing software development and regularly work on applications that needs to connect to a OIDC server, then you can use Canaille in your development environment. Canaille being very light, this is now our tool of choice to work on client applications.
  • test applications relying upon an OIDC server. We also use canaille in unit tests suites, with pytest-iam. This is a pytest plugin that configures and run a Canaille instance so your unit tests suite can achieve actual OIDC connections.

The technical choices

Canaille is written in Python, with Flask for the backend and fomantic-ui and htmx for the frontend. We like the simplicity of Python and Flask, and strongly believe those are arguments that make contributions easier and increase software longevity. We have been shocked by our discovery of HTMX earlier this year, that in short allows us to build dynamical pages without writing Javascript. One language less is as much less complexity in the project.

Under the hood, Canaille can be plugged to a LDAP directory or a SQL database.

The development techniques

We use Canaille in production, at Supercoop where it is used to manage 1800 users, but also in our own stack in our Nubla mutualized cloud services, and on dedicated Nubla Pro instances. That large userbase allows us to collect user feedback, and we improve Canaille gradually in reaction to demands and according to our roadmap.

Cannaille development follows the principles of the Test Driven Development (TDD) when possible. The code coverage reaches 100% (including branches), and this is a prerequisite for new contributions. In addition to giving us confidence in our tests, this allowed us to simply delete unused pieces of code. Bugs are easier to find when there is less code to search them into.

Canaille uses all the modern Python source code linters and formatters, with pre-commit, and the unit tests are run on all the officially supported Python versions.

Finally, the translation of Canaille is done by the community with Weblate.

Contributions

Like most of modern software, Canaille relies on libraries so we don't have to re-invent what is already existing.

At Yaal Coop for all our projects, when we find bugs in libraries, we follow a strategy that consists in implementing fixes both in our code and the libraries at the same time. At first we patch our code with temporary but functional fixes. However all that code we write is a maintenance burden to come, so in parallel we discuss with the maintainers of those libraries, and propose better conceived long term fixes. This is for us a guarantee of the sustainability of those pieces of software we rely upon, and this is a way to contribute to that necessary FLOSS ecosystem. Once the upstream library is patched, we delete our quick fix.

In the same fashion when we wish additional features in libraries, we discuss our motivations with maintainers and sometimes provide implementations. We have for instance developed the OIDC specifications RFC7591 and RFC9068 in authlib, a library Canaille uses to deal with OIDC.

The results of those efforts can be seen in our seasonal blogposts about our FLOSS contributions.

The chance of the contributions brought us to share the maintenance of certain libraries we rely upon, like wtforms that is a form management tool, or nextcloud-oidc-login and the underlying OpenIDConnect-PHP that allow nextcloud (the file manager integrated in Nubla) to connect with Canaille.

We also modestly sponsor the maintainers of fomantic-ui and authlib on a monthly basis.

The help of the NLNet foundation

Canaille has been developed to answer specific needs we met: initially Canaille was only made to work with LDAP directories. Watching the ecosystem, we noticed that more and more software became compatible with OIDC in addition to LDAP. Ultimately, if no service we use directly rely upon LDAP, then we could consider a replacement database with which we feel more comfortable. In addition to this, it is more likely that people interested by the Canaille approach will have experience with things like SQL than with LDAP. To go towards this directory, we sollicitated the NGI Zero Entrust fund of the NLNet foundation in the late 2022, for a amount of 7.000€, to help us realize tasks on Canaille (and around):

  • database connection genericity. This was a mandatory preparatory step to plugging additional databases than LDAP;
  • SQL databases support. This allows Canaille to connect to a lot of widespread databases like postgresql, mariadb and sqlite, thanks to sqlalchemy.
  • pytest-iam. This is a tool that can prepare and run a Canaille instance in the purpose of unit testing Python applications with pytest.

Canaille

Those developments have been achieved in november 2023, and have implied numerous refactoring, bugfixes, and better conception and reliability on Canaille. We are very grateful towards the NLNet foundation for having allowed us to work on our tool, and help at our scale to contribute to the free and open source ecosystem.

What's next?

Go in beta version

From the beginning we have kept Canaille in alpha, we are currently at version 0.0.35. We advise in the documentation that the software is still not suited for production environments. This was for us a way to experiment and break things without having to be worried about compatibility. We would like to break one last little thing by re-thinking the configuration files before we let Canaille go in bêta, and remove usage warnings.

We track the beta version tasks in this milestone.

Go in stable version

The work we intend to realize to go from a bêta version to a finale version will essentially consists in documentation efforts and ease of installation and usage of Canaille. The goal is to make Canaille really easy to access, in order to create usage and collect more user feedback.

We track the finale version tasks in this milestone.

And beyond…

In the future, we would like to work on provisioning, by implementing the SCIM specification. This will allow to decouple user authentication and account creation. Indeed, at the moment user accounts are created the first time users log in at our services. This can raise issues in some situations: for instance one cannot share files in Nextcloud with users who have not log in yet. SCIM also provides a mechanism to delete user accounts in those services, that is a thing we do more or less manually at the moment.

Among the things we look forward to implement, there are also the Single Log-Out (SLO) OIDC specifications. This will allow users to disconnect from all the services in a single action. SLO is a feature that will bring security and comfort of use. This will need to be developed in authlib in a first time.

At last, we would like to work on advanced group management and permissions, and on multi-factor authentication to bring even more flexibility and security in Canaille.

Canaille is open to contributions, if you want to help us in this endeavour, the door is open!

Lire la suite…

Vendredi 13 sur Hackinscience

by AlexisAmand from AFPy discuss

Bonjour tout le monde !

En plein apprentissage de Python, j’ai commencé les exercices proposés sur Hackinscience. Là, je suis arrivé à celui qui s’appelle “Vendredi 13”. J’ai écrit cette version qui semble tourner à perfection quand je l’exécute sur mon pc avec Visual Studio et Python 3.12.

Je précise que la dernière ligne me sert juste à faire mes tests en local.

Pourriez vous m’expliquer - simplement - pourquoi le code ne fonctionne pas une fois envoyé sur Hackinscience ? J’ai le message suivant :

TypeError: FakeDatetime.date() takes 1 positional argument but 4 were given

Je trouve ça un peu étrange car je n’ai pas utilisé cette fonction, et je ne savais même pas qu’elle existait.

Voici mon code :

# Vendredi 13

import datetime

def friday_the_13th():
    # date actuelle
    aujourdhui = datetime.datetime.now()    
    jour = int(aujourdhui.strftime('%d'))
    mois = int(aujourdhui.strftime('%m'))
    annee = int(aujourdhui.strftime('%Y'))
 
    # on teste si aujourd'hui, nous sommes un vendredi 13
    if jour == 13 and aujourdhui.date(annee, mois, jour).weekday() == 4:
        vendredi13 = str(annee) + "-" + str(mois) + "-13"
    else:   
        # sinon, on boucle sur les 13 des mois successifs
        # pour voir si ça tombe un vendredi 
        
        while datetime.date(annee, mois, 13).weekday() != 4:
            if mois < 12:
                mois += 1
            elif mois == 12:
                mois = 1
                annee += 1
                
        # le prochain vendredi 13
        # avec un ajustement sur le mois pour l'avoir avec 2 chiffres       
        mois = str(mois).rjust(2, "0")
        vendredi13 = str(annee) + "-" + str(mois) + "-13"
        
        return vendredi13
    
# test
print(friday_the_13th())

8 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Difficulté dans la gestion des boutons (tkinter)

by Peter49 from AFPy discuss

Bonjour,
Ci-dessous le code en question (qui ne fonctionne pas). Quand j’appuis sur n’importe quel bouton, c’est toujours le dernier bouton qui change de texte.
je souhaite que le texte change en rapport au bouton utilisé.
Par ailleurs si on pouvait m’expliquer comment “indexer” un bouton cela serait super.
exemple btn[i] ne fonctionne pas. Comment faire pour sélectionner un bouton particulier . Mon projet doit comporter à terme 81 boutons
Merci

import tkinter as tk

def update(i):
btn.configure(text=‘X %d’ % i)

for i in range(10):
btn = tk.Button(text=‘b %d’ % i, command=lambda i=i: update(i))
btn.grid(row=i, column=0)

tk.mainloop()

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Offpunk 2.0

by ploum from Linuxfr.org

Je suis heureux de vous annoncer la sortie d’Offpunk 2.0.

https://ploum.net/2023-11-25-offpunk2.html

Offpunk est un navigateur web, gemini, gopher et lecteur RSS en ligne de commande. Il n’y a ni clic, ni raccourcis clavier: tout se fait en tapant des commandes. Pour suivre un lien, on entre le numéro de ce lien.

Page officielle : https://sr.ht/~lioploum/offpunk/

Une dépêche linuxfr avait annoncé la version 1.0 avec une description plus poussée de la manière d’utiliser offpunk:

https://linuxfr.org/news/offpunk-1-0-un-navigateur-deconnecte-pour-le-smolnet

Mais la fonctionnalité majeure d’Offpunk est qu’il fonctionne en mode déconnecté: toute ressource accédée depuis le réseau est en effet gardée dans un cache permanent ("~/.cache/offpunk/"), ce qui permet d’y accéder plus tard.

Et si une ressource n’est pas encore cachée, elle est marquée comme devant être téléchargée plus tard, ce qui sera fait lors de la prochaine synchronisation ("offpunk --sync").

S’habituer à Offpunk demande un peu d’effort mais, une fois la philosophie générale comprise (les listes, le tour, la synchronisation régulière), Offpunk peut se révéler un redoutable outil de navigation et de gestion de favoris et de liens tout en supprimant la lourdeur souvent inutile du web. On revient au texte et aux images.

La version 2.0 offre désormais certaines fonctionnalités de Offpunk sous forme d’outils en ligne de commande indépendants:

  • netcache : sorte de wget/curl mais utilisant le cache d’offpunk et permettant d’accéder aux ressources hors-ligne ("option --offline")
  • ansicat : comme "cat" mais en effectuant un rendu des formats HTML/RSS/Gemtext et même images.
  • opnk : un "open" universel qui tente d’afficher n’importe quel fichier ou URL dans le terminal et, si il n’y arrive pas, se réduit à utiliser xdg-open.

Offpunk 2.0 est déjà packagé pour pas mal de plateformes grâce à des packageurs incroyables : https://repology.org/project/offpunk/versions (et cette version 2.0 doit beaucoup à l’aide très sympathique de Jean Abou Samra, auteur de la dépêche sur le packaging python : https://linuxfr.org/news/l-installation-et-la-distribution-de-paquets-python-1-4 )

Si vous souhaitez vous lancer, n’hésitez pas à envoyer un mail à liste utilisateurs :

https://lists.sr.ht/~lioploum/offpunk-users

Je viens également de lancer un salon Matrix pour ceux qui souhaite discuter en direct sur le salon #offpunk:matrix.org ou https://matrix.to/#/#offpunk:matrix.org

Si vous utilisez offpunk, je serais ravi d’avoir vos retours et suis curieux d’entendre comment vous utilisez cet outil.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

whisper sur Debian

by tisaac from Linuxfr.org

J'essaie de me mettre à l'IA. Il faut bien être hype, non ?

Bon, j'essaie surtout de faire du speech to text comme on dit en bon français.

J'ai vu passé des commentaires pas trop négatif sur whisper

J'ai aussi vu des incantations avec pip mais quand j'essaie ces incantations sur ma debian, j'ai le message suivant :

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

Comme je suis un garçon pas contraire, j'ai installé python3-whisper.

Puis, j'ai fait un petit doc avec les lignes de codes suggérées par Internet

import whisper

model = whisper.load_model("large")
result = model.transcribe("audio.mp3")
print(result["text"])

Mais mon ordinateur, il est pas content quand j'essaie de faire tourner ce programme. Il me dit

Traceback (most recent call last):
  File "/home/user/Documents/Tanguy/test.py", line 3, in <module>
    model = whisper.load_model("base")
            ^^^^^^^^^^^^^^^^^^
AttributeError: module 'whisper' has no attribute 'load_model'

Comme la ligne import ne pose pas problème, je me dis que j'ai bien installé quelque chose sur mon PC et que ce qq chose doit bien être importé lorsque le programme tourne. Mais je suis déçu et surtout je ne comprend pas que mon PC m'indique une AttributeError

Si vous avez une piste d'explication, je suis preneur. Si vous avez en plus une piste pour que whisper fonctionne, je suis tout ouïe.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[résolu] whisper sur Debian

by tisaac from Linuxfr.org

J'essaie de me mettre à l'IA. Il faut bien être hype, non ?

Bon, j'essaie surtout de faire du speech to text comme on dit en bon français.

J'ai vu passé des commentaires pas trop négatif sur whisper

J'ai aussi vu des incantations avec pip mais quand j'essaie ces incantations sur ma debian, j'ai le message suivant :

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

Comme je suis un garçon pas contraire, j'ai installé python3-whisper.

Puis, j'ai fait un petit doc avec les lignes de codes suggérées par Internet

import whisper

model = whisper.load_model("large")
result = model.transcribe("audio.mp3")
print(result["text"])

Mais mon ordinateur, il est pas content quand j'essaie de faire tourner ce programme. Il me dit

Traceback (most recent call last):
  File "/home/user/Documents/Tanguy/test.py", line 3, in <module>
    model = whisper.load_model("base")
            ^^^^^^^^^^^^^^^^^^
AttributeError: module 'whisper' has no attribute 'load_model'

Comme la ligne import ne pose pas problème, je me dis que j'ai bien installé quelque chose sur mon PC et que ce qq chose doit bien être importé lorsque le programme tourne. Mais je suis déçu et surtout je ne comprend pas que mon PC m'indique une AttributeError

Si vous avez une piste d'explication, je suis preneur. Si vous avez en plus une piste pour que whisper fonctionne, je suis tout ouïe.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Strasbourg - Meetup le 23 novembre

by Jeffd from AFPy discuss

Sur Strasbourg - Meetup le 23 novembre

2023-11-23 18:00 (Europe/Paris) → 2023-11-23 20:00 (Europe/Paris)

Ce jeudi 23 novembre, rendez-vous à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.

Deux présentations durant cette soirée:

  • Initiation au webscrapping et à l’analyse lexicale de discours avec Python (accessible aux personnes débutantes)
  • Clean Architecture en action: implémenter des interfaces et non des classes

Vous pouvez aussi rejoindre cet événement sur notre page LinkedIn

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup en mixité choisie le 27 novembre

by grewn0uille from AFPy discuss

Nous organisons un premier meetup en mixité choisie le lundi 27 novembre.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.

Pour ce meetup nous sommes accueillies par Hashbang (métro Brotteaux).

Au programme de cette session, trois sujets !

  • Qu’est-ce que PyLadies ? par Chiara
  • Scrapy, automatiser le puzzlescraping, par @MounaSb
  • Les gens ne savent pas ce qu’ils font, la plupart du temps ! par Léa

EN MIXITÉ CHOISIE, Du Python, mais pas que !

2023-11-27 19:00 (Europe/Paris) → 2023-11-27 21:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

L’installation et la distribution de paquets Python (1/4)

by jeanas,Benoît Sibaud,alberic89 🐧,L'intendant zonard,nonas,palm123,gUI from Linuxfr.org

Quelques dépêches précédentes ont parlé des outils de packaging Python, comme ici, ou encore . Je vais chercher à faire un tour complet de la question, non seulement du point de vue de l’utilisateur qui cherche à comprendre quelle est « la bonne » solution (← ha ha ha rire moqueur…), mais aussi en expliquant les choix qui ont été faits, les évolutions, la structure de la communauté autour des outils, et les critiques qui leur sont souvent adressées, à tort ou à raison.

    Sommaire

    Il est question ici de packaging, terme pris dans un sens très large :

    • L’installation de paquets,
    • L’installation de Python lui-même,
    • L’administration d’environnements isolés,
    • La gestion de dépendances (lock files notamment),
    • La distribution de son code, en tant qu’auteur d’un paquet Python,
    • La compilation de code natif (écrit en C, C++, Rust…) pour être utilisé depuis Python.

    Le langage Python, avec son écrasante popularité (premier au classement TIOBE), est vanté pour sa simplicité. Hélas, c’est devenu un lieu commun que cette simplicité ne s’étend pas aux outils de packaging, qui sont tout sauf faciles à maîtriser. Personnellement, j’y ai été confronté en voulant soulager la situation de Frescobaldi, une application écrite avec Python et PyQt. Frescobaldi possède une dépendance qui se trouve concentrer quelques difficultés de distribution et d’installation coriaces, en raison de code C++.

    Ce problème d’ensemble a conduit à des évolutions rapides au cours des dernières années, qui tentent de garder un équilibre fragile entre l’introduction de nouvelles méthodes et la compatibilité avec l’existant. Parmi les utilisateurs, une confusion certaine a émergé avec cette cadence des changements, qui fait que des tutoriels écrits il y a quelques années voire quelques mois à peine sont complètement obsolètes, de même que des outils encore récemment recommandés.

    Bien que de nombreux progrès soient indéniables, il existe un scepticisme très répandu concernant le degré de fragmentation déconcertant de l’écosystème, qui met l’utilisateur face à un labyrinthe d’outils qui se ressemblent.

    Pour illustrer ce labyrinthe, voici une liste des outils que, personnellement, j’utilise ou j’ai utilisé, ou dont j’ai au moins lu sérieusement une partie de la documentation :

    pip, pipx, virtualenv, venv, ensurepip, conda, condax, conda-lock, tox, build, twine, setuptools, setuptools-scm, flit, hatch, poetry, pdm, rye, pip-tools, maturin, setuptools-rust, meson-python, scikit-build, sip, pyinstaller, py2app, py2exe, cx_freeze, pyoxidizer, pynsist, briefcase, wheel, repairwheel, auditwheel, delocate, delvewheel, cibuildwheel

    Encore une fois, je n’ai mis ceux que je connais. On en trouve encore d’autres ici.

    Sans compter quelques outils dont j’ai connaissance mais qui sont aujourd’hui obsolètes ou non-maintenus :

    distutils, distutils2, distribute, pyflow, bento, pipenv

    Et quelques librairies de plus bas niveau : importlib.metadata, packaging, distlib, installer

    Face à cette profusion, le classique aujourd’hui est de citer le XKCD qui va bien, et de renchérir en comparant au langage Rust, connu pour la simplicité de ses outils, à savoir :

    cargo, rustup

    Et c’est tout. Alors, pourquoi a-t-on besoin de plusieurs douzaines d’outils différents pour Python ?

    Cela s’explique largement par des facteurs techniques, que j’expliquerai, qui font à la fois que le packaging Python est intrinsèquement plus compliqué, et qu’on lui demande beaucoup plus. En vérité, dans ces outils, on trouve des projets qui ont des cas d’utilisation complètement différents et ne s’adressent pas au même public (comme pip et repairwheel). Le hic, c’est qu’il y a, aussi, beaucoup de projets dont les fonctionnalités se recouvrent partiellement, voire totalement, comme entre pip et conda, entre venv et virtualenv, entre hatch et poetry, entre pyinstaller et briefcase, etc. Ces projets sont en concurrence et ont chacun leurs adeptes religieux et leurs détracteurs, à la manière des vieilles querelles Vim/Emacs et compagnie.

    Cette dépêche est la première d’une série de quatre, qui ont pour but de décortiquer comment tout cela fonctionne, de retracer comment on en est arrivés là, et de parler des perspectives actuelles :

    1. L’histoire du packaging Python
    2. Tour de l’écosystème actuel
    3. Le casse-tête du code compilé
    4. La structure de la communauté en question

    Les outils historiques : distutils et setuptools

    Guido van Rossum a créé le langage Python en 1989. Rappelons qu’à l’époque, le World Wide Web n’existait pas encore, ni d’ailleurs le noyau Linux, les deux ayant été créés en 1991. D’après Wikipédia (source), le premier logiciel comparable aux gestionnaires de paquets actuels a été CPAN ­— destiné au langage Perl — qui ne date que de 1995. Python a donc grandi en même temps que l’idée des paquets, des gestionnaires de paquets et des dépôts sur Internet prenait racine.

    C’est en 1998 (source) que le module distutils est né pour répondre au même besoin que CPAN pour Perl, dans le monde Python encore balbutiant. Ce module servait à compiler et installer des paquets, y compris des paquets écrits en C. Historiquement, il permettait aussi de générer des paquets au format RPM de Red Hat, et d’autres formats pour des machines de l’époque comme Solaris et HP-UX (source).

    distutils faisait partie de la bibliothèque standard du langage. Il était configuré avec un fichier écrit en Python, nommé conventionnellement setup.py, qui prenait généralement cette forme :

    from distutils.core import setup
    
    setup(name='nom-paquet',
          version='x.y.z',
          ...)

    On pouvait alors exécuter le setup.py comme un script, en lui passant le nom d’une commande :

    $ python setup.py install # installe le paquet
    $ python setup.py bdist_rpm # génère un RPM

    Le téléchargement de paquets depuis un dépôt partagé ou la résolution des dépendances n’ont jamais fait partie des fonctions de distutils. De façon peut-être plus surprenante, distutils n’offre pas de moyen simple ou fiable pour désinstaller un paquet.

    Le projet setuptools est arrivé en 2004 (source) pour pallier les limitations de distutils. Contrairement à distutils, setuptools a toujours été développé en dehors de la bibliothèque standard. Cependant, il était fortement couplé à distutils, le modifiant par des sous-classes… et par une bonne dose monkey-patching (source).

    Lesdites limitations ont également conduit à un fork de distutils, nommé distutils2, démarré en 2010. Parmi les raisons citées par son initiateur figure le désir de faire évoluer distutils à un rythme plus soutenu que ce qui était raisonnable pour un module de la bibliothèque standard, surtout un module largement utilisé au travers de setuptools et son monkey-patching (source). Mais distutils2 a cessé d’être développé en 2012 (source).

    De même, entre 2011 et 2013 (source), il a existé un fork de setuptools appelé distribute. Ses changements ont fini par être fusionnés dans setuptools.

    Pour finir, distutils a été supprimé de la bibliothèque standard dans la version 3.12 de Python, sortie en octobre 2023, au profit de setuptools. Mais cela ne signifie pas que distutils n’est plus utilisé du tout : setuptools continue d’en contenir une copie qui peut être utilisée (bien que ce ne soit pas recommandé).

    Il est aussi à noter que NumPy, la bibliothèque Python quasi universelle de calcul scientifique, maintient elle aussi son propre fork de distutils, numpy.distutils, qui est en train d’être remplacé (source). Cela montre à quel point le code de distutils s’est révélé à la fois essentiel, omniprésent à travers divers avatars ou forks, et difficile à faire évoluer.

    La montée en puissance de pip et PyPI

    Avec le développement d’Internet et la croissance de la communauté Python, il devenait nécessaire d’avoir un registre centralisé où pouvaient être déposés et téléchargés les paquets. C’est dans ce but qu’a été créé PyPI, le Python Package Index, en 2002 (source). (Ne pas confondre PyPI avec PyPy, une implémentation alternative de Python. PyPy se prononce « paille paille » alors que PyPI se prononce « paille pie aïe »).

    distutils pouvait installer un paquet une fois le code source téléchargé, mais pas installer le paquet depuis PyPI directement, en résolvant les dépendances. Le premier outil à en être capable a été setuptools avec la commande easy_install (source), apparue en 2004.

    Puis est arrivé pip en 2008. Entre autres, pip était capable, contrairement à tout ce qui existait jusque là, de désinstaller un paquet ! En quelques années, easy_install est devenu obsolète et pip s’est imposé comme l’outil d’installation standard. En 2013, la PEP 453 a ajouté à la bibliothèque standard un module ensurepip, qui bootstrape pip en une simple commande : python -m ensurepip. De cette manière, pip a pu continuer d’être développé indépendamment de Python tout en bénéficiant d’une installation facile (puisqu’on ne peut évidemment pas installer pip avec pip) et d’une reconnaissance officielle.

    L’introduction du format « wheel »

    Sans rentrer trop dans les détails à ce stade, le format principal pour distribuer un paquet jusqu’en 2012 était le code source dans une archive .tar.gz. Pour installer un paquet, pip devait décompresser l’archive et exécuter le script setup.py, utilisant setuptools. Bien sûr, cette exécution de code arbitraire posait un problème de fiabilité, car il était critique de contrôler l’environnement, par exemple la version de setuptools, au moment d’exécuter le setup.py.

    setuptools avait bien un format de distribution précompilé, le format egg (le nom est une référence aux Monty Python). Un paquet en .egg pouvait être installé sans exécuter de setup.py. Malheureusement, ce format était mal standardisé et spécifique à setuptools. Il était conçu comme un format importable, c’est à dire que l’interpréteur pouvait directement lire l’archive (sans qu’elle soit décompressée) et exécuter le code dedans. C’était essentiellement une façon de regrouper tout le code en un seul fichier, mais il n’y avait pas vraiment d’intention de distribuer les .egg.

    La PEP 427 a défini le format wheel pour que les paquets puissent être distribués sous forme précompilée sur PyPI, évitant l’exécution du setup.py durant l’installation.

    Parmi les innovations, les fichiers wheels sont nommés d’après une convention qui indique avec quelle plateforme ils sont compatibles. Ceci a grandement facilité la distribution de modules Python codés en C ou C++. Jusqu’ici, ils étaient toujours compilés sur la machine de l’utilisateur, durant l’exécution du setup.py. Avec les wheels, il est devenu possible de distribuer le code déjà compilé, avec un wheel par système d’exploitation et par version de Python (voire moins, mais c’est pour la troisième dépêche).

    Les débuts des environnements virtuels

    Voici un problème très banal : vous voulez utiliser sur la même machine les projets foo et bar, or foo nécessite numpy version 3.14 alors que bar nécessite numpy version 2.71. Malheureusement, en Python, il n’est pas possible d’installer deux versions du même paquet à la fois dans un même environnement, alors que d’autres langages le permettent. (Plus précisément, il est possible d’installer deux versions en parallèle si elles ont des noms de module différents, le nom de module Python n’étant pas forcément le même que le nom de paquet, cf. Pillow qui s’installe avec pip install pillow mais s’importe avec import PIL. Mais tant que le module Python n’est pas renommé, les deux sont en conflit.)

    La solution est alors de se servir d’un environnement virtuel, qui est un espace isolé où on peut installer des paquets indépendamment du reste du système. Cette technique a été développée dans le projet virtualenv, créé par Ian Bicking, qui est aussi l’auteur originel de pip. La première version date de 2007 (source).

    Plus tard, en 2012 (source), un module venv a été ajouté à la bibliothèque standard. C’est une version réduite de virtualenv. On peut toutefois regretter que virtualenv soit encore nécessaire dans des cas avancés, ce qui fait que les deux sont utilisés aujourd’hui, même si venv est largement prédominant.

    La création de la Python Packaging Authority (PyPA)

    La première réaction naturelle en entendant le nom « Python Packaging Authority » est bien sûr de penser qu’à partir de 2012, date de sa création, ce groupe a été l’acteur d’une unification, d’une standardisation, d’une mise en commun des efforts, etc. par contraste avec la multiplication des forks de distutils.

    Sauf que… le mot « Authority » était au départ une blague (sérieusement !). La preuve sur l’échange de mails où le nom a été choisi, les alternatives proposées allant de « ianb-ng » à « Ministry of Installation » (référence aux Monty Python), en passant par « Politburo ».

    La Python Packaging Authority a démarré comme un groupe informel de successeurs à Ian Bicking (d’où le « ianb ») pour maintenir les outils qu’il avait créés, pip et virtualenv. Elle est un ensemble de projets, reconnus comme importants et maintenus.

    Au fil du temps, la partie « Authority » son nom a évolué progressivement de la blague vers une autorité semi-sérieuse. La PyPA d’aujourd’hui développe des standards d’interopérabilité, proposés avec le même processus que les changements au langage Python lui-même, sous forme de PEP (Python Enhancement Proposals), des propositions qui ressemblent aux RFC, JEP et autres SRFI. La PyPA est également une organisation GitHub, sous l’égide de laquelle vivent les dépôts de divers projets liés au packaging, dont la plupart des outils que je mentionne dans cette dépêche, aux exceptions notables de conda, poetry et rye.

    La PyPA n’est pas :

    • Un ensemble cohérent d’outils. Il y a beaucoup d’outils redondants (mais chacun ayant ses adeptes) dans la PyPA. Pour ne donner qu’un exemple, tout ce que peut faire flit, hatch peut le faire aussi.

    • Une véritable autorité. Elle reste composée de projets indépendants, avec chacun ses mainteneurs. Le fait qu’un standard soit accepté ne garantit pas formellement qu’il sera implémenté. J’ai lu quelque part une allusion à un exemple récent de « transgression » dans setuptools, mais je n’ai pas retrouvé de quel standard il s’agissait. Concrètement, cela ne veut pas dire que les transgressions sont fréquentes, mais plutôt qu’une PEP risque de ne pas être acceptée s’il n’est pas clair que les mainteneurs des outils concernés sont d’accord.

    La décision finale sur une PEP est prise par un « délégué », et normalement, cette personne ne fait que formaliser le consensus atteint (même s’il peut y avoir des exceptions).

    Il n’y a donc pas de place dans la PyPA actuelle pour des décisions du type de « flit devient officiellement déprécié au profit de hatch ».

    Le développement d’un écosystème alternatif, conda et Anaconda

    Pour compléter la liste de tout ce qui s’est passé en 2012, c’est aussi l’année de la première version de conda.

    Cet outil a été créé pour pallier les graves lacunes des outils classiques concernant la distribution de paquets écrits en C ou C++ (Rust était un langage confidentiel à l’époque). Jusque là, on ne pouvait redistribuer que le code source, et il fallait que chaque paquet soit compilé sur la machine où il était installé.

    Le format wheel introduit plus haut a commencé à résoudre ce problème, mais toutes ces nouveautés sont concomitantes.

    Contrairement à tous les autres outils mentionnés dans cette dépêche, Conda, bien qu’open source, est développé par une entreprise (d’abord appelée Continuum Analytics, devenue Anaconda Inc.). C’est un univers parallèle à l’univers PyPA : un installeur de paquets différent (conda plutôt que pip), un format de paquet différent, un gestionnaire d’environnements virtuel différent (conda plutôt que virtualenv ou venv), une communauté largement séparée. Il est aussi beaucoup plus unifié.

    conda adopte un modèle qui se rapproche davantage de celui d’une distribution Linux que de PyPI, en mettant le packaging dans les mains de mainteneurs séparés des auteurs des paquets. Il est possible de publier ses propres paquets indépendamment d’une organisation, mais ce n’est pas le cas le plus fréquent. On pourrait comparer cela à ArchLinux, avec son dépôt principal coordonné auquel s’ajoute un dépôt non coordonné, l’AUR.

    Cette organisation permet à conda de faciliter énormément la distribution de modules C ou C++. En pratique, même avec les wheels, cela reste une source infernale de casse-têtes avec les outils PyPA (ce sera l’objet de la troisième dépêche), alors que tout devient beaucoup plus simple avec conda. Voilà son gros point fort et sa raison d’être.

    Il faut bien distinguer conda, l’outil, d’Anaconda, qui est une distribution de Python contenant, bien sûr, conda, mais aussi une flopée de paquets scientifiques ultra-populaires comme NumPy, SciPy, matplotlib, etc. Anaconda est très largement utilisée dans le monde scientifique (analyse numérique, data science, intelligence artificielle, etc.). Il existe aussi Miniconda3, qui est une distribution plus minimale avec seulement conda et quelques autres paquets essentiels. Enfin, conda-forge est un projet communautaire (contrairement à Anaconda, développé au sein de l’entreprise Anaconda Inc.) qui distribue des milliers de paquets. On peut, dans une installation d’Anaconda, installer un paquet depuis conda-forge avec conda - c conda-forge (le plus courant), ou bien (moins courant) installer une distribution nommée « Miniforge », qui est un équivalent de Miniconda3 fondé entièrement sur conda-forge.

    Les PEP 517 et 518, une petite révolution

    S’il y a deux PEP qui ont vraiment changé le packaging, ce sont les PEP 517 et 518.

    La PEP 518 constate le problème que le fichier de configuration de setuptools, le setup.py, est écrit en Python. Comme il faut setuptools pour exécuter ce fichier, il n’est pas possible pour lui, par exemple, de spécifier la version de setuptools dont il a besoin. Il n’est pas possible non plus d’avoir des dépendances dans le setup.py autres que setuptools (sauf avec un hack nommé setup_requires proposé par setuptools, qui joue alors un rôle d’installeur de paquets comme pip en plus de son rôle normal… ce pour quoi setuptools n’excellait pas). Elle décrit aussi explicitement comme un problème le fait qu’il n’y ait pas de moyen pour une alternative à setuptools de s’imposer. En effet, le projet setuptools souffrait, et souffre toujours gravement, d’une surcomplication liée à toutes ses fonctionnalités dépréciées.

    Pour remédier à cela, la PEP 518 a introduit un nouveau fichier de configuration nommé pyproject.toml. Ce fichier est écrit en TOML, un format de fichier de configuration (comparable au YAML). C’est l’embryon d’un mouvement pour adopter une configuration qui soit déclarative plutôt qu’exécutable. Le TOML avait déjà été adopté par l’outil Cargo de Rust.

    Le pyproject.toml contient une table build-system qui déclare quels paquets doivent être installés pour exécuter le setup.py. Elle se présente ainsi :

    [build-system]
    requires = ["setuptools>=61"]

    Cet exemple pourrait être utilisé dans un projet dont le setup.py a besoin de setuptools version 61 au moins.

    Mais ce n’est pas tout. La PEP 518 définit aussi une table tool avec des sous-tables arbitraires tool.nom-d-outil, qui permet à des outils arbitraires de lire des options de configuration, qu’ils soient des outils de packaging, des reformateurs de code, des linters, des générateurs de documentation,… pyproject.toml est donc devenu un fichier de configuration universel pour les projets Python. (Anecdote : au départ, il n’était pas prévu pour cela, mais il a commencé à être utilisé comme tel, si bien que la PEP 518 a été modifiée a posteriori pour structurer cela dans une table tool.)

    La deuxième étape a été la PEP 517. Elle va plus loin, en standardisant une interface entre deux outils appelés build frontend et build backend. Le build frontend est l’outil appelé par l’utilisateur, par exemple pip, qui a besoin de compiler le paquet pour en faire un wheel installable (ou une sdist, soit une archive du code source avec quelques métadonnées, mais c’est un détail). Le build backend est un outil comme setuptools qui va créer le wheel.

    Le rôle du build frontend est assez simple. Pour schématiser, il lit la valeur build-system.requires du pyproject.toml, installe cette liste de dépendances, puis lit la valeur build-system.build-backend, importe le build backend en Python, et appelle la fonction backend.build_wheel().

    Voici un exemple de pyproject.toml utilisant les PEP 517 et 518 avec setuptools comme build backend :

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

    Ainsi, il est devenu possible d’écrire et utiliser des build backends complètement différents de setuptools, sans même de fichier setup.py. L’un des premiers build backends alternatifs a été flit, qui cherche à être l’opposé de setuptools : le plus simple possible, avec le moins de configuration possible.

    La PEP 517 décrit bien son objectif :

    While distutils / setuptools have taken us a long way, they suffer from three serious problems : (a) they’re missing important features like usable build-time dependency declaration, autoconfiguration, and even basic ergonomic niceties like DRY-compliant version number management, and (b) extending them is difficult, so while there do exist various solutions to the above problems, they’re often quirky, fragile, and expensive to maintain, and yet (c) it’s very difficult to use anything else, because distutils/setuptools provide the standard interface for installing packages expected by both users and installation tools like pip.

    Previous efforts (e.g. distutils2 or setuptools itself) have attempted to solve problems (a) and/or (b). This proposal aims to solve (c).

    The goal of this PEP is get distutils-sig out of the business of being a gatekeeper for Python build systems. If you want to use distutils, great ; if you want to use something else, then that should be easy to do using standardized methods.

    La PEP 621, un peu de standardisation

    Suite aux PEP 518 et 517, plusieurs build backends alternatifs ont émergé. Bien sûr, tous les build backends avaient des manières différentes de spécifier les métadonnées du projet comme le nom, la version, la description, etc.

    La PEP 621 a standardisé cette partie de la configuration, en définissant une nouvelle section du pyproject.toml, la table project. Concrètement, elle peut ressembler à :

    [project]
    name = "my-project"
    version = "0.1"
    description = "My project does awesome things."
    requires-python = ">=3.8"
    authors = [{name = "Me", email = "me@example.com"}]
    ...

    En effet, écrire les métadonnées n’est pas la partie la plus intéressante d’un build backend. Les vraies différences se trouvent, par exemple, dans la prise en charge des extensions C ou C++, ou bien dans des options de configuration plus avancées. La PEP 621 permet de changer plus facilement de build backend en gardant l’essentiel de la configuration de base.

    De plus, elle encourage la configuration statique, par opposition au setup.py de setuptools. L’avantage d’une configuration statique est sa fiabilité : aucune question ne se pose sur l’environnement d’exécution du setup.py, sa portabilité, etc.

    Pour donner un exemple concret, on apprend dans cette section de la PEP 597 que les développeurs écrivaient souvent dans le setup.py un code qui lit le README avec l’encodage système au lieu de l’UTF-8, ce qui peut rendre le paquet impossible à installer sous Windows. C’est le genre de problèmes systémiques qui sont éliminés par la configuration statique.

    Malgré tout, la configuration dynamique reste utile. C’est typiquement le cas pour la valeur de version, qui est avantageusement calculée en consultant le système de contrôle de version (par exemple avec git describe pour Git). Dans ces situations, on peut marquer la valeur comme étant calculée dynamiquement avec

    [project]
    dynamic = ["version"]

    C’est alors au build backend de déterminer la valeur par tout moyen approprié (éventuellement configuré dans la table tool).

    L’émergence d’outils tout-en-un alternatifs

    Cet historique est très loin d’être exhaustif, et pourtant on sent déjà la prolifération d’outils différents. Face à la confusion qui en résulte, des développeurs ont tenté d’écrire des outils « tout-en-un » qui rassemblent à peu près toutes les fonctionnalités en une seule interface cohérente : installation, build frontend, build backend, gestion des environnements virtuels, installation d’une nouvelle version de Python, mise à jour d’un lock file, etc. Parmi eux, on peut notamment citer poetry, développé depuis 2018 (source), qui se distingue en ne participant pas à la PyPA et en réimplémentant bien plus de choses que d’autres (notamment en ayant son propre résolveur de dépendances distinct de celui de pip). On peut penser aussi à hatch, qui, lui, fait partie de la PyPA et ne fait pas autant de choses, mais s’intègre mieux à l’existant. Et pour mentionner le dernier-né, il y a également rye, qui cherche à modifier la façon dont Python est boostrapé, en utilisant exclusivement des Pythons gérés par lui-même, qui ne viennent pas du système, et en étant écrit lui-même en Rust plutôt qu’en Python.

    Conclusion

    J’espère que cet historique permet de mieux comprendre pourquoi le packaging est tel qu’il est aujourd’hui.

    L’un des facteurs majeurs est l’omniprésence des extensions C, C++ ou maintenant Rust qui doivent être précompilées. C’est la raison essentielle pour laquelle conda et tout son écosystème existent et sont séparés du monde de la PyPA.

    Un autre facteur est à chercher dans les problèmes de conception de distutils, un code qui date de l’époque des premiers gestionnaires de paquets et qui n’était pas prêt à accompagner Python pour vingt ans. C’est pour cela qu’il a été forké si souvent, et c’est pour en finir avec l’hégémonie de son fork setuptools que les PEP 518 et 517 ont volontairement ouvert le jeu aux outils alternatifs.

    Il faut enfin voir que la PyPA n’a jamais été un groupe unifié autour d’un outil, et qu’il est difficile de changer de modèle social.

    Dans la deuxième dépêche, je ferai un tour complet de l’état actuel, en présentant tous les outils et les liens entre eux.

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sprint de traduction de Python 3.12 par Montréal-Python

    by ygingras from AFPy discuss

    Allô tout le monde! Montréal-Python organise un sprint de traduction les deux dernières semaines de novembre:

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Offres d'emploi Développeuse / Développeur Lyon - Hashbang

    by Morgane_H from AFPy discuss

    Bonjour,

    Nous recrutons ! Pouvez-vous mettre en ligne l’offre suivante ?

    "

    Offre d’emploi Développeuse/Développeur

    HashBang est une société coopérative (SCOP) de services informatiques basée à Lyon. Nous sommes une équipe de 7 personnes.

    Nous développons des applications sur mesure avec une approche de co-construction. Nous intervenons sur toute la chaîne de production d’un outil web, de la conception à la maintenance. Nos technologies préférées sont Python, Django, Vue.js, Ansible. Nos méthodes s’inspirent des méthodes agiles. Vous pouvez consulter nos références ici : https://hashbang.fr/references/.

    Nos clients sont des startups/TPEs/PMEs/associations et en particulier des organisations qui font partie de l’Économie Sociale et Solidaire.

    Nous sommes attachés aux questions de qualité du code et de maintenabilité ainsi qu’au bien-être au travail.

    Nous privilégions la prise de décision collective. Notre organisation est horizontale basée sur la sociocratie. Après une phase d’intégration chaque salarié·e est amené·e à intervenir et participer à la gestion de la coopérative dans différent domaines (ressources humaines, comptabilité, gestion du planning, commercial, etc.).

    Le poste

    Contexte

    Hashbang crée un poste de développeuse/développeur en contrat à durée indéterminée pour agrandir et dynamiser son équipe de production.

    Missions

    Vous aurez pour principales missions :

    • Développer des applications web à l’aide de frameworks tels que Django, Django REST, Vue.js
    • Faire des tests unitaires et fonctionnels de votre code
    • Faire des revues de code
    • Savoir traduire les besoins du client en une solution fonctionelle
    • Communiquer régulièrement avec le client sur l’avancée du projet
    • Participer à la vie de la coopérative

    Conditions

    Le poste est à pourvoir dans nos locaux : Hashbang, 13 ter Place Jules Ferry, 69006 LYON. Le télétravail partiel ou total est possible après une période d’intégration.

    Le contrat proposé est à durée indéterminée. Le temps de travail est de 35h par semaine (80% possible).

    Le salaire est fixé selon une grille en fonction de votre niveau d’étude et de votre expérience passée, et évolue périodiquement avec l’ancienneté. Nous proposons des tickets restaurants et un forfait mobilité durable qui prend en charge les frais de transport en commun et/ou de déplacement à vélo.

    En tant que SCOP, une partie des bénéfices est reversée aux salarié·e·s. Vous pourrez également devenir associé.e de la coopérative.

    Compétences recherchées

    Pré-requis techniques

    Pour occuper ce poste, vous aurez besoin de :

    • Savoir chercher de l’information par vous-même, rester en veille technologique
    • Savoir utiliser un logiciel de gestion de version type git
    • Être à l’aise avec Python / Javascript / HTML et CSS
    • De préférence, avoir déjà utilisé Django et Vue.js
    • Être à l’aise dans la relation client et la gestion de projet

    Qualités professionnelles

    Pour ce poste et pour vous épanouir dans notre coopérative, vous aurez besoin :

    • D’être curieux·se ;
    • D’une forte attirance pour le travail collaboratif ;
    • D’un sens de la communication afin de vous exprimer en groupe, ainsi qu’avec nos clients;
    • D’une capacité à prendre des décisions en groupe et individuellement ;
    • De savoir prendre des initiatives, tester, rater, recommencer, réussir;
    • D’être capable de travailler en autonomie.

    Vous êtes en phase avec nos valeurs et êtes intéressé·e par le modèle coopératif, l’informatique libre et l’organisation horizontale.

    Candidater

    Envoyez un mail de candidature à rh@hashbang.fr avec un CV et la description de vos motivations pour cette offre en particulier.

    "

    J’ajoute la fiche de poste en PJ également,

    Merci beaucoup,

    Fiche_poste_dev_HB.pdf (25.7 KB)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Paris meetup traduction

    by kw-andy from AFPy discuss

    Hello,

    Je vous propose deux dates pour faire un meetup trad, le jeudi 16 nov ou le jeudi 23 novembre au lab86, 86 av Philippe Auguste dans le 11 ème.

    Le framadate pour voter pour votre date

    Bonne journée

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Tas de sables abéliens

    by mdk from AFPy discuss

    Qui je n’ai pas encore tanné avec mes tas de sables ?

    Pour ceux qui suivent, et pour les autres, j’explore en ce moment les tas de sables abéliens, du moins une petite partie, celle qui consiste à construire une « colonne » de grains de sable, puis de la regarder s’effondrer.

    La seule règle pour l’effondrement est : « Si une pile fait plus de 4 grains de haut, elle s’écroule en envoyant un grain au nord, un au sud, un à l’ouest, et un à l’est ».

    Donc en Python on peut construire un tas assez simplement :

    width = 150
    terrain = np.zeros((width, width), dtype=np.int64)
    terrain[width // 2, width // 2] = 20_000
    

    et le faire s’écrouler tout aussi simplement :

    for x in range(width):
        for y in range(width):
            if terrain[x][y] >= 4:
                terrain[x][y] -= 4
                terrain[x - 1][y] += 1
                terrain[x + 1][y] += 1
                terrain[x][y + 1] += 1
                terrain[x][y - 1] += 1
    

    Un seul écroulement n’est peut-être pas suffisant, on peut donc recommencer à écrouler jusqu’à ce que le tas soit bien étalé, qu’il soit « stable », que toutes les piles fassent moins de 4 grains.

    Alors déjà en augmentant le nombre de grains placés au centre on constate deux choses :

    • C’est lent (très lent).
    • C’est beau (très beau).

    Côté lenteur, je vous laisse tester.

    Côté beauté voilà ce que ça donne avec 2**26 grains de sable (après 22h de calcul) :

    Oui il n’y a que 4 couleurs, et oui mon choix de couleur n’est probablement pas le meilleur :

    • blanc pour 0 grain,
    • bleu clair pour 1 grain,
    • bleu pour 2 grains,
    • bleu foncé pour 3 grains.

    Pour ceux que ça titille, j’ai posté plusieurs implémentations par ici : https://git.afpy.org/mdk/fast-abelian-sandpile/, y’a du Python et du C.

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Rencontres et présentations autour de Python à Strasbourg

    by JeffD from Linuxfr.org

    A l'occasion de cette rentrée 2023, nos rencontres autour du langage Python reprennent à Strasbourg. Nous sommes désormais accueillis par la Plage Digitale.

    • Prochaine rencontre le jeudi 26 octobre à 18h00
    • Adresse: Plage Digitale, 13 rue Jacques Peirotes à Strasbourg (Bourse/Place de Zurich)
    • Vous pouvez retrouver l'événement sur le Discuss de l'AFPY.

    On parlera rapidement de l'organisation de l'événement (sa fréquence, ses règles…), de quelques ressources pour apprendre ou perfectionner son code puis nous verrons une démonstration de l'outil Google Collab.

    On terminera par un temps d'échange et d'entraide. Les personnes débutantes sont la bienvenue car l'équipe organisatrice cherche au mieux à démontrer les possibilité du langage Python dans le cursus universitaire (analyse de données, scrapping web, etc).

    Au plaisir de vous y retrouver

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Strasbourg - Meetup 26 octobre

    by Jeffd from AFPy discuss

    Vous êtes invité-e au MeetUp Python, le 26 octobre 18h00, à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.

    Au programme:

    1. Présentation d’outils, cours et tutos qui vous aideront à apprendre et à progresser en Python,
    2. Découverte de Google Colaboratory qui vous permet de coder depuis votre navigateur

    Vous pouvez retrouver cet événement sur la page LinkedIn

    Sur Strasbourg - Meetup 26 octobre

    2023-10-26 18:00 (Europe/Paris) → 2023-10-26 20:00 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Entr'ouvert - Développeur·euse Python/Django - [Paris, Lyon, télétravail]

    by thomasnoel from AFPy discuss

    Entr’ouvert a du succès et grandit au rythme de son chiffre d’affaires. Nous cherchons actuellement un·e développeur·euse Python/Django.

    Entr’ouvert est un éditeur de logiciels libres dont l’activité s’est développée autour de la gestion de la relation usager. Notre mission, c’est de simplifier les démarches des citoyens puis de les proposer en ligne… en ce moment cela a un certain succès.

    Entr’ouvert est une SCOP fonctionnant depuis 2002 de manière démocratique, détenue intégralement et à parts égales par ses salarié·es et où chacun, en tant qu’associé·e, participe aux prises de décision. Et parce que nous ne faisons pas les choses à moitié, nous avons institué la stricte égalité salariale.

    Nous sommes actuellement 26 : 14 développeuses·eurs, 11 chef·fes de projet et une responsable administrative.

    Nous n’utilisons et ne produisons que des logiciels libres. Nous avons développé une relation de confiance avec nos clients, basée sur la qualité, l’importance accordée aux détails, le travail bien fait. Et cela ne nous empêche pas de rigoler, c’est même recommandé, l’esprit de sérieux étant un mauvais esprit. Au-delà des compétences professionnelles, nous recherchons des personnes qui sauront intégrer notre équipe et s’impliquer dans notre structure coopérative.

    Nous cherchons un·e développeur·euse :

    • Vous connaissez bien Python et Django, vous possédez des connaissances basiques en HTML, CSS et Javascript.
    • Vous savez faire un git commit et un git push (sans -f).
    • Vous êtes à l’aise avec l’écriture de tests, unitaires ou fonctionnels.
    • On suit les recommandations PEP8, on aime le code propre et maintenable et on espère que vous aussi.
    • Vous savez exprimer une situation ou une solution à vos collègues et aux clients.
    • Vous appréciez la relation directe avec les client·e·s afin de bien cerner leurs demandes.
    • Vous savez gérer les priorités et aimez tenir vos échéances.
    • A priori pour savoir faire tout cela, vous avez déjà quelques années d’expérience.

    Votre mission :

    • Après un temps de formation avec l’équipe, vous travaillerez à l’amélioration et sur les évolutions de Publik suivant les tickets et la roadmap.
    • Vous relirez des patches proposés par les collègues, chercherez à les améliorer, bref, vous ferez du code review.
    • Selon les projets vous serez développeur·euse ou chef·fe de projet technique (c’est-à-dire en charge de la coordination des développements et de la relation technique avec le client).

    Quelques exemples de notre quotidien :

    Les conditions de travail :

    • CDI de 52 000 € brut annuel, soit environ 3300 € net par mois — même salaire pour tout le monde
    • Participation, intéressement et primes correspondant à 84% des bénéfices répartis à parts égales entre les travailleuses·eurs.
    • Organisation du temps de travail sur 4 jours de la semaine.
    • Travail depuis nos locaux à Paris XIVème ou à Lyon, télétravail total ou partiel possible depuis partout en France.
    • Douche disponible (à Paris) pour les sportives·fs du matin (très encouragé !) (la douche, le sport lui n’est pas obligatoire). Local vélo & vestiaires.
    • Chèques déjeuner, mutuelle familiale, 8,5 semaines de congés payés.
    • 50% de la carte Navigo, café, thé et chocolat inclus dans les bureaux parisiens et lyonnais.
    • Un bon ThinkPad, accompagné d’un grand écran, avec un beau clavier et une souris optique qui brille dans le noir (sans oublier un budget annuel pour tout type de matériel utile pour le télétravail).
    • Coopératrice·teur, associé·e de la SCOP, à part égale de tous les autres.

    Le processus de recrutement :

    Un entretien de présentation mutuelle, suivi de l’envoi d’un court test technique puis un second entretien de debrief et discussion avec des membres de l’équipe technique. Les deux entretiens peuvent avoir lieu en visio ou dans nos locaux parisiens.

    Comment candidater :

    Ça se passe sur https://www.entrouvert.com/actualites/2023/embauche-developpeuse-eur-python-django/

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sortie de Crème CRM en version 2.5

    by GuieA_7,Xavier Teyssier,Benoît Sibaud,gUI from Linuxfr.org

    Le 11 septembre 2023 est sortie la version 2.5 du logiciel de gestion de la relation client Crème CRM (sous licence AGPL-3.0), un peu plus de sept mois après Creme 2.4 (1ᵉʳ février 2023).

    Icone de Crème CRM

    Au programme notamment, le passage à Django 4.2, un nouveau mode de navigation ou la configuration visuelle des serveurs SMTP pour les campagnes de courriels. Les nouveautés sont détaillées dans la suite de la dépêche.

    Sommaire

    Description du logiciel

    Crème CRM est un logiciel de gestion de la relation client, généralement appelé CRM (pour Customer Relationship Management). Il dispose évidemment des fonctionnalités basiques d’un tel logiciel :

    • un annuaire, dans lequel on enregistre contacts et sociétés : il peut s’agir de clients, bien sûr, mais aussi de partenaires, prospects, fournisseurs, adhérents, etc. ;
    • un calendrier pour gérer ses rendez‐vous, appels téléphoniques, conférences, etc. ; chaque utilisateur peut avoir plusieurs calendriers, publics ou privés ;
    • les opportunités d’affaires, gérant tout l’historique des ventes ;
    • les actions commerciales, avec leurs objectifs à remplir ;
    • les documents (fichiers) et les classeurs.

    Crème CRM dispose en outre de nombreux modules optionnels le rendant très polyvalent :

    • campagnes de courriels ;
    • devis, bons de commande, factures et avoirs ;
    • tickets, génération des rapports et graphiques…

    L’objectif de Crème CRM est de fournir un logiciel libre de gestion de la relation client pouvant convenir à la plupart des besoins, simples ou complexes. À cet effet, il propose quelques concepts puissants qui se combinent entre eux (entités, relations, filtres, vues, propriétés, blocs), et il est très configurable (bien des problèmes pouvant se résoudre par l’interface de configuration) ; la contrepartie est qu’il faudra sûrement passer quelques minutes dans l’interface de configuration graphique pour avoir quelque chose qui vous convienne vraiment (la configuration par défaut ne pouvant être optimale pour tout le monde). De plus, afin de satisfaire les besoins les plus particuliers, son code est conçu pour être facilement étendu, tel un cadriciel (framework).

    Du côté de la technique, Crème CRM est codé notamment avec Python/Django et fonctionne avec les bases de données MySQL, SQLite et PostgreSQL.

    Principales nouveautés de la version 2.5

    Voici les changements les plus notables de cette version :

    Décalages des sorties de version & passage à Django 4.2

    Cette version est plus courte que d’habitude, puisque les versions sortent une fois par an habituellement. Cela vient du fait que nous avons décidé de faire les sorties au milieu de l’année plutôt qu’au début (nous essaierons de sortir Creme 2.6 vers juin 2024), afin de mieux profiter des périodes de support de Django.

    En effet, comme on peut le voir ici, depuis quelques années les nouvelles versions de Django sortent tous les huit mois, et toutes les trois versions (une fois tous les deux ans en avril), sort une version gérée pendant trois ans (Long Term Support). On a eu le cycle 3.0/3.1/3.2 (3.2 est la LTS), puis est arrivé le cycle 4.0/4.1/4.2 (4.2 est la LTS) et ainsi de suite.

    Les versions de Creme, elles, sortent une fois par an, et utilisent les versions LTS de Django. Comme auparavant nous sortions en début d’année, lorsqu’une nouvelle version LTS sortait (en avril je le rappelle) il fallait attendre le mois de janvier suivant pour profiter de cette version, tandis que la version LTS précédente n’était plus alors gérée que pendant quelques mois.

    En sortant en milieu d’année la période pour monter votre version de Creme pendant laquelle les versions de Django sous-jacentes sont gérées devient nettement plus grande (de genre juin à avril de l’année suivante).

    Creme 2.5 utilise donc Django 4.2 sorti en avril 2023. Avec ce changement Python 3.7 est abandonné (Python 3.8 devient la version minimale), la version minimale de MySQL devient la 8, celle de MariaDB la 10.4 et celle de PostGreSQL la 12.

    Le mode exploration

    Il est courant de se préparer, depuis une vue en liste, un ensemble de fiches (Contacts, Sociétés…) à traiter, en utilisant les divers outils de filtrage (filtre, recherche rapide par colonne) et d’ordonnancement, puis en ouvrant les différentes vues détaillées de ces fiches dans des onglets de son navigateur Web. Cependant ça peut devenir un peu fastidieux, on peut facilement oublier des lignes etc.

    C’est pour rendre ce genre de tâche plus facile que le mode « exploration » a été créé. Une fois votre vue en liste filtrée & ordonnée afin de contenir les fiches que vous souhaitez traiter, il suffit d’appuyer sur le bouton présent dans l’entête de la liste.

    Liste de société affichant le bouton pour rentrer en exploration

    Vous êtes alors redirigé vers la vue détaillée de la première fiche de votre liste. Une fois que vous l’avez traitée, vous pouvez passer à la fiche suivante grâce au bouton présent en haut dans la barre de menu.

    Fiche de société affichant le bouton pour continuer l’exploration

    Vous allez ainsi pouvoir passer de fiche en fiche sans risque d’oubli. Lorsque toutes les fiches ont été passées en revue, une page vous indique la fin de l’exploration et vous permet de revenir à la liste de départ.

    La configuration visuelle des serveurs SMTP pour les campagnes de courriels.

    Creme permet depuis longtemps de créer des campagnes d’envoi de courriels. Une campagne est associée à des listes d’envoi (créées par exemple en filtrant vos contacts), et à chaque envoi vous choisissez un patron de message qui va permettre de générer le sujet et le corps des e-mails.

    La configuration du serveur SMTP utilisé pour envoyer les e-mails était définie dans un fichier Python de configuration (le fameux fichier « settings.py »). Ce n’était pas évident à comprendre que c’est là qu’il fallait chercher (car pas forcément très bien documenté), et en plus cela limitait cette configuration à l’administrateur uniquement.

    Cette configuration se réalise désormais graphiquement. De plus, vous avez désormais la possibilité de configurer autant de serveurs SMTP que vous le voulez.

    Configuration du module des e-mails

    Réinitialisation des formulaires personnalisés

    Les utilisateurs ont bien apprécié la possibilité, arrivée avec Creme 2.2, de pouvoir personnaliser les formulaires des fiches. Certains se sont beaucoup amusés avec même, à tel point que parfois à force d’expérimentation ils obtiennent des formulaires pas géniaux, et souhaitaient pouvoir repartir sur des bases saines.

    Avec cette version, il est désormais possible de remettre un formulaire personnalisé dans son état d’origine (et donc de pouvoir tester des choses sans crainte—les expérimentations c’est bien).

    Quelques améliorations en vrac

    • Le nom affiché pour les utilisateurs peut être configuré (afin de garder des noms courts tout en gérant les collisions de noms comme vous le souhaitez).
    • des couleurs personnalisables ont été ajoutées dans plein de petits modèles, comme les statuts d’Activité ou de Facture.
    • les lignes de produits & services dans les devis/factures peuvent être ré-ordonnées (détails).
    • le rendu des graphes a été amélioré, notamment quand il y a beaucoup de choses à afficher.

    Le futur

    Des améliorations sur le calendrier ont d’ores et déjà été intégrées (et d’autres sont bientôt prêtes) et on planche notamment sur une amélioration des notifications. À l’année prochaine !

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Lyon − Meetup le 19 octobre

    by grewn0uille from AFPy discuss

    Prochain meetup Python le jeudi 19 octobre !

    @arthru nous présentera asyncio et fera un retour d’expérience de son utilisation avec le projet WatchGhost.

    Nous serons accueillis par Kobalt (métro Ampère Victor Hugo).

    Qu'est ce qu'asyncio et quand l'utiliser, un exemple avec WatchGhost

    2023-10-19 19:00 (Europe/Paris) → 2023-10-19 21:00 (Europe/Paris)

    Édit : changement de sujet à la suite d’un petit soucis du côté du speaker initial

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    MEANQUEST - Opportunité Dev Python à Genève

    by Aurelie_Breal from AFPy discuss

    Bonjour,

    Chargée de recrutement chez Meanquest, j’ai contacté Lucie Anglade qui m’a conseillé de déposer une annonce sur le Discourse de l’AFPy via la section “Offres d’emplois” de votre site.

    Je me permets donc de vous écrire car je recherche un développeur Python.

    Le poste est basé à Genève et nécessite une relocalisation à proximité mais pas obligatoirement en Suisse. Le full remote n’est pas possible. Il y a, après période d’essai validée, 2 jours de télétravail par semaine. Le candidat doit plutôt être sénior (mini 4 ans d’expérience) et avoir un bon niveau d’anglais.

    Les conditions et l’environnement de travail sont plutôt agréables. Il s’agit d’une chouette opportunité, tant sur le plan humain que technique.

    Voici l’annonce :

    Développeur Fullstack (H/F) à dominante Backend Python et avec d’excellentes connaissances en Angular et Javascript.

    Missions :

    • Développer, déployer et améliorer des systèmes d’information complexes selon la méthodologie Agile
    • Effectuer l’assurance et le contrôle de la qualité
    • Maintenir et gérer les environnements techniques y compris l’automatisation des processus dans les systèmes CI/CD
    • Assurer le respect des bonnes pratiques et normes du secteur, en éclairant les décisions de conception de haut niveau et la sélection des normes techniques
    • Participer à la mise à jour et l’enrichissement de la base de connaissances

    Profil recherché :

    • Formation Ingénieur IT ou équivalent
    • Minimum 5 ans d’expérience professionnelle en tant qu’Ingénieur / développeur logiciel
    • Maîtrise du langage Python 2 et/ou 3
    • Maîtrise des technologies Front-End : JavaScript/TypeScript, Framework Angular 2+, Flask ou Django, NodeJS
    • Connaissances des bases de données : PostgreSQL, MySQL, SQL Server
    • Maîtrise de Git
    • Bonnes connaissances des technologies HTML5/CSS3/Bootstrap, protocole HTTP, REST
    • Connaissances des technologies de conteneurisation et orchestration (Docker)
    • Connaissances des Cloud Amazon, Azure et Google
    • Connaissances en sécurité : SSO, OAuth, OpenID Connect, Saml2, JWT
    • Connaissances des données géospatiales, concepts et technologies associées, un plus
    • Vous êtes bilingue français / anglais

    Pourquoi postuler ?

    :arrow_right: Environnement international

    :arrow_right: Bonne ambiance dans l’équipe

    :arrow_right: Possibilité de télétravail

    :arrow_right: Avantage prévoyance professionnelle

    :arrow_right:

    Pourriez-vous publier cette offre d’emploi sur votre « job board », svp ?

    Par avance merci pour votre réponse.

    Belle journée,

    Aurélie.

    image001.png

    image002.png

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    bug python2, vaut-ce le coup? Non, cest pas 1 bug!

    by pierre.imbaud from AFPy discuss

    Je viens de trouver un bug python 2!
    Question: est-ce que ça présente le moindre intérêt?
    C’est un vieux script où je veux, dans certains cas, rajouter une ligne vide sur stdout.
    Je fais un print()… et je trouve () au lieu d’une ligne vide!
    Si intérêt, faut que je réduise le script au cas minimal significatif…

    5 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Stage 6 mois - Développement logiciel] - Concevoir et développer un outil de gestion documentaire simple basé sur le CMS Wagtail

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission
    L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.

    Vous aurez pour missions de :
    • Réaliser des maquettes fonctionnelles pour définir les interactions,
    • Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
    office,
    • Développer avec Vue.js la partie “front-office” de l’application,
    • Réaliser les tests unitaires et fonctionnels,
    • Rédiger la documentation technique,
    • Publier en Open Source l’application sur Github avec la documentation nécessaire.

    Profil
    Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
    • Une expérience en Python et/ou JavaScript est requise,
    • Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez-nous qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage 3 à 6 mois - Développement logiciel] - Concevoir et développer en front end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end, et sous la responsabilité de développeurs front end vous aurez pour missions de :

    • Développer des webapps
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des librairies de cartographie
    • Apprendre les méthodes de tests et de déploiement continu.

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +5) et vous recherchez un stage pouvant débuter en janvier 2024.

    Vous êtes compétent(e) et motivé(e) pour faire du développement web front end, de préférence en React, Angular ou Vue.js.

    Vous maîtrisez la communication API/Rest et possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez :slight_smile:

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage 3 à 6 mois - Développement logiciel] ] - Concevoir et développer en back end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end et sous la responsabilité de développeurs back end, vous aurez pour missions de :

    • Développer des applications Django
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des bibliothèques de cartographie
    • Apprendre les méthodes de tests et de déploiement continu

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    • Création d’une application pour la gestion de l’altimétrie / les géometries 3D depuis Geotrek-admin/altimetry utilisable dans Geotrek-admin mais aussi GeoCRUD
    • Mise a jour du site de gestion des utilisateurs Geotrek
    • Permettre de brancher Geotrek sur un back end d’authentification unifiée

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).

    Vous possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Développeur-Développeuse sénior(e) Python Django - [Toulouse et Nantes]

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez en tant que sénior(e) technique sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous accompagnerez la montée en compétences de profils moins expérimentés et partagerez votre savoir, en interne ou en externe (formation) et en présentiel/distanciel.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté Python / Django.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ou en télétravail complet (sous conditions avec un retour en présentiel de 4 jours/mois).

    Ingénieur en études et développement informatiques

    Profil

    Niveau Bac +5 en informatique de préférence**.** Vous justifiez d’une expérience similaire d’au minimum 3 ans des technologies Python et Django, et êtes à l’aise dans un environnement GNU/Linux. Nous apprécierions que vous possédiez certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL GS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Vous appréciez accompagner la montée en compétences de profils moins expérimentés et partager votre savoir.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? V enez nou s rencontrer , un.e makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Développeur-Développeuse junior(e) Python/Django - [Toulouse]

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous serez accompagné(e) tout au long de votre montée en compétences : encadrement par un développeur sénior (pair-programming, codes reviews…), interactions/transmission de compétences avec les équipes, formations, autoformation etc.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Profil

    De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.

    Vous avez envie d’acquérir certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL JS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? V e nez nous rencontrer, un.e Makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Administrateur-Administratrice système et devops

    by makina from AFPy discuss

    Makina Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : https://makina-corpus.com/references, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.

    Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.

    Vos missions en ingénierie infrastructure/administration système et devops consisteront à :

    1) Exploitation du SI de la société (partie administration systèmes) :

    • Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle

    • Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)

    • Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines

    • Superviser les environnements clients (préproduction et production)

    • Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques

    • Développer des outils d’aide aux tâches d’administration système et de supervision

    2) Orchestrer le déploiement de nos applications métiers (partie devops) :

    • Mettre en œuvre et optimiser les processus d’intégration et de déploiement de nos applications métiers Python/Django et PHP (Drupal/Symfony) en fonction des spécificités et besoins des développeurs par le biais de l’intégration continue/déploiement continu (GitLab-CI, Ansible)
    • Conseiller et assister les équipes de développement sur les bonnes pratiques liées au déploiement, aux solutions techniques et enjeux de performance et de sécurité en production
    • Maintenir et faire évoluer des outils, modèles et bases de projet, documentations à destination des développeurs pour les accompagner dans la livraison des applications.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté
    • Jouer un rôle visible dans les communautés des logiciels libres : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Le profil

    Vous avez d’excellentes connaissances et une expérience dans l’administration de systèmes Linux (Debian/Ubuntu) ainsi que dans ces technologies :

    • Écosystème Docker (conteneurs, registry, orchestration)
    • Intégration continue GitLab-CI
    • Gestion de configuration avec Ansible

    Ainsi qu’une connaissance des technologies suivantes :

    • PostgreSQL
    • Scripting bash
    • Prometheus/Grafana
    • Kubernetes

    Une connaissance des langages de programmation Python et PHP serait un véritable avantage.

    Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.

    Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Chef-Cheffe de projets web

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous intégrerez un pôle interdisciplinaire (chefs de projets, ergonomes, graphistes, développeurs Back/Front/Mobile, SIG, DBA…) réparti entre Toulouse, Nantes et Paris, au sein duquel vous aurez pour mission de piloter les projets de nos clients et de participer au développement commercial.

    Vos missions consisteront à :

    • Identifier et mettre en œuvre au sein du projet les besoins technico-fonctionnels des clients
    • Formaliser, organiser, planifier et contrôler les phases de réalisation
    • Piloter et coordonner l’équipe projet
    • Assurer le suivi du planning et le contrôle de la qualité
    • Gérer les engagements vis-à-vis du client et s’assurer de sa satisfaction
    • Fidéliser, entretenir et développer le portefeuille client existant
    • Participer aux phases d’avant-vente en relation avec le client et avec nos équipes, rédiger une proposition commerciale

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).

    Profil

    Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.

    Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.

    Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.

    Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !

    Serait également un plus un background technique dans le développement web.

    Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.

    Informations complémentaires

    Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Paris - Meetup django le 24 octobre

    by Candice from AFPy discuss

    Bonjour à toutes et à tous,

    Meetup Django le 24 octobre dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.

    L’occasion de se retrouver et entre autre d’en apprendre plus sur les synergies entre Django et Jupyter Notebook et de tirer des leçons de la construction d’un monolithe Django de 3 millions de lignes.

    Inscription juste ici : Django Meetup Paris

    Tres bonne journée à tous !

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Importer des "issues" GitHub dans des "tickets" Trac

    by pulkomandy from Linuxfr.org

    Bon, je me suis laissé entraîner. Je savais que ça finirait mal. Il y a quelques années, j'ai ouvert un compte Github. J'en avais probablement besoin pour participer à un projet hébergé sur cette plateforme. Et puis j'ai commencé à y mettre mes propres projets, parce que c'était pratique de pouvoir créer un dépôt Git en 3 clics. Je me suis bientôt retrouvé avec plus de 100 projets sur Github.

    Seulement voilà, Github, ce n'est pas un logiciel libre. Et en plus, maintenant ils se concentrent sur l'intelligence artificielle et plus sur les outils pour écrire du logiciel. Et en plus, ils ont rendu l'authentification à 2 facteurs bientôt obligatoire et j'ai pas envie de leur donner mon numéro de téléphone (surtout que j'ai eu des problèmes avec mon téléphone il y a quelques jours et c'était déjà assez pénible comme ça).

    J'aurais pourtant dû le voir venir: j'avais déjà dû quitter Google Code Project Hosting ainsi que BerliOS il y a quelques années. Je m'étais mis en place un Trac et un Subversion sur mon serveur personnel pour héberger mes projets.

    Ces derniers mois j'ai commencé à migrer quelques-uns de mes petits projets à nouveau sur mon propre serveur. J'ai remis Trac à jour (la version 1.6 vient de sortir il y a quelques jours, c'est la première version stable à supporter Python 3, mais j'utilisais déjà les versions 1.5 qui sont aussi en Python 3 depuis longtemps). J'avais aussi installé Gerrit pour pouvoir recevoir des patchs pour mes projets. Il ne reste plus qu'à déplacer les projets en essayant de ne pas perdre trop d'informations.

    Migrer le dépôt Git est la partie facile: Git est un système décentralisé, on peut récupérer les commits, branches, tags, etc et les pousser ailleurs très facilement (avec l'option --mirror par exemple). Le problème, c'est tout le reste, c'est à dire dans le cas de GitHub, les pages de wiki et les "issues", qui sont l'endroit ou un peu tout l'historique de l'activité du projet est conservé: tous les bugs corrigés, les discussions sur comment implémenter une nouvelle fonctionnalité, etc.; et aussi le futur du projet: les bugs encore à corriger et les nouvelles fonctionalités à implémenter.

    Étrangement, personne n'avait encore écrit de script pour faire cette migration. J'ai dû donc m'atteler à la tâche, en m'inspirant fortement d'un script destiné à migrer de Mantis vers Trac. Ce dernier n'avait été mis à jour ni pour Python 3, ni pour les changements d'APIs survenus dans les versions 1.0, 1.2, 1.4 et 1.6 de Trac. Le premier problème a été rapidement corrigé par 2to3, et le deuxième par une lecture de la documentation d'API et un changement assez répétitif sur le code.

    Du côté de Github, l'interfaçage est plutôt simple avec une API REST exposant toutes les informations nécessaires. Du côté de Trac, il s'agit d'une API Python permettant, au choix, d'utiliser des classes fournissant une interface haut niveau, soit de manipuler directement la base de données de Trac à l'aide de requêtes SQL.

    Au total, l'implémentation du script a demandé moins d'une journée (j'ai commencé hier soir et je termine aujourd'hui en début d'après-midi). Il me reste encore quelques petites choses à faire, mais je vais peut-être les faire à la main pour aller plus vite. Ainsi que finaliser la configuration du Trac pour le projet que je viens d'importer (avec un joli thème, un logo, la description du projet, etc).

    En tout cas, si l'envie vous prend de quitter Github pour rejoindre Trac, le script est à votre disposition dans le wiki trac-hacks: https://trac-hacks.org/wiki/GithubImportScript

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Tour des GULL : hors série

    by Bookynette from Linuxfr.org

    Ah septembre, la fin de l'été, le début de l'automne, les couleurs qui changent, les feuilles au sol qui rendent les pistes cyclables dangereuses…
    Septembre c'est aussi la rentrée scolaire et pour moi qui n'ai pas d'enfant mais tiens une librairie, c'est une période très, très, très chargée. Je n'ai donc pas eu le temps de me déplacer à la rencontre des GULL.
    Mais (et oui, il y a un mais), je ne suis pas restée toute seule dans mon coin à lire des livres… (enfin si, mais pas tout le temps!)
    J'ai eu la chance de pouvoir aller parler de logiciels libres (mais pas que) à différentes occasions:

    UÉMSS (Université d'Été des Mouvements Sociaux et des Solidarités) => bon je triche un peu vu que c'était en août mais ça vaut le coup de vous en toucher quelques mots. Les UEMSS sont organisées tous les deux ans depuis 2018 par un large collectif d’associations, de syndicats et de collectifs citoyens. Moi je les ai découvertes grâce à ATTAC et j'ai pu y participer toute une journée lors d'un forum ouvert où chacun proposait un sujet à débattre. Les niveaux en informatique étaient très variés et j'ai pu parler de notre collectif fétiche des chatons afin d'apporter des solutions éthiques et concrètes mais aussi d'éthique et de politique. Enrichissant et loin de ma zone de confort. On en a beaucoup discuté après, entre libristes, ce qui a engendré ce texte que vous avez peut-être déjà lu.

    La fête de l'Humanité => L'April, Framasoft et d'autres associations ont tenu des stands lors de la fête cette année encore! Après la grande Halle Simone de Beauvoir les années précédentes, la tente sans électricité ni internet de l'année dernière, nous avons eu l'agréable surprise d'avoir un espace vitré, fermé, avec des chaises et une scène pour organiser des débats. Nous le partagions avec les associations scientifiques qui avaient fait une exposition sur les femmes dans les sciences. Ce fut, pour moi, l'occasion d'animer trois conférences:

    • «Quels outils pour militer?», avec l'April, Framasoft, Libre-en-commun et FDN.
    • «Les femmes dans le numérique» avec Isabelle Cholet (une enseignante, chercheuse autrice incroyable et passionnante!!), Mathilde Saliou (journaliste de Nextinpact) et Florence Chabanois (Deputy CTO et Data Protection Officer qui représentait l'association Duchess France). Véritable succès, toutes les chaises étaient occupées, il y avait des gens assis par terre et plein d'autres debout à l'arrière.
    • «Pour un service public du numérique au service des citoyens» avec Haïkel Guemar (Solidaires Informatique) et Sébastien Elka (Pcf, commission numérique). Il aurait dû y avoir également les députés Andy Kerbrat (LFI) et Adrien Taché (EELV), mais l'un a eu des problèmes de train et l'autre a disparu après s'être présenté. Dommage, j'avais préparé de très nombreuses questions sur le projet de loi SREN (Sécuriser et Réguler l'Espace Numérique) que nous surveillons à l'April. Week-end épuisant mais plus que satisfaisant! Merci à toutes les associations qui ont composé ce village libriste!

    La fresque du climat => J'ai pu participer à cette fresque (dont oui, je sais, les documents ne sont pas sous licence libre) avec une dizaine d'autres membres de l'April. L'ambiance était sereine et studieuse. Pour résumer en une phrase: sous forme de jeux, nous avons pu constater que l'activité humaine a des conséquences néfastes sur la planète, la biodiversité animale et végétale mais aussi les océans.

    Debian 30 ans
    Les 30 ans de Debian => Un apéro a été organisé à l'April pour fêter cet anniversaire particulier! Beaucoup de monde (de tous les âges, milieux) comme d'habitude (faudrait voir à agrandir ce local) et des discussions intéressantes. 30 ans déjà, ça passe trop vite.

    Apéro commun entre l'AFPy (Association Francophone Python) et l'April => Nous avons profité du passage sur Paris de la présidente mais aussi d'autres membres de l'AFPy, pour les accueillir, autour d'un verre, et même plusieurs. Toutes les bouteilles (bière et jus de pommes bio) étaient vides en fin de soirée, mais pas les paquets de chips que nous avons dû nous partager! J'ai choppé quelques adresses mail et j'espère avoir le temps de recroiser certaines…

    Le tour des GULL se termine pour le mois de septembre, et comme nous allons bientôt changer de mois, je vous donne une info (spoiler alerte): en octobre j'irai à Toulouse et Lyon!

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    AFPy

    by AFPy - Mastodon from AFPy - Mastodon

    Certains membres de l’AFPy ont pu se réunir ce soir autour d’un apéritif pour parler… (attention le sujet de discussion va vous étonner) de Python.

    Merci à l’@aprilorg de nous avoir accueillis dans ses locaux et de nous avoir partagé leur apéritif.

    Lire la suite…

    Contributions à des logiciels libres par l'équipe Yaal Coop durant l'été 2023

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

    Cet été nous avons décidé de sponsoriser deux auteurs d'outils desquels nous dépendons. C'est un petit montant pour le moment, mais nous espérons qu'à l'avenir il augmentera ou que la liste des récipiendaires s'élargira.

    Nous avons mis une partie de notre énergie sur Canaille, en implémentant le gros morceau de notre engagement à la subvention NLNet, à savoir la généricité des backends de base de données. L'implémentation de la base de données en mémoire nous a permis d'utiliser Canaille dans pytest-iam, un outil qui permet de lancer un serveur OpenID Connect dans des tests unitaires.

    Mécénat

    canaille

    Serveur OpenID Connect simpliste, basé sur OpenLDAP

    wtforms

    Bibliothèque python de gestion de formulaires web

    flask-wtf

    Intégration de WTForms dans Flask

    ihatemoney

    Une application web simple de gestion de budget

    python-slapd

    Interface pythonique pour contrôler un serveur OpenLDAP

    authlib

    Bibliothèque python de gestion des identités et des accès

    pytest-iam

    Serveur OAuth2/OIDC léger pour vos tests unitaires

    Debian

    Lire la suite…

    Summer 2023 FOSS contributions by the Yaal Coop team

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

    This summer we decided to sponsor two authors of tools we are depending on. This is a small amount for the moment, but hopefully this will grow or we add more recipients to the list.

    We spent a bit of energy on Canaille, and implementing the big part of our NLNet subsidy, that is the database backend genericity. The inmemory backend allowed us to use canaille in pytest-iam, a tool that bring a lightweight OpenID Connect provider to be used in your unit tests.

    Sponsoring

    canaille

    Simplistic OpenID Connect provider over OpenLDAP

    wtforms

    A flexible forms validation and rendering library for Python.

    flask-wtf

    Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.

    ihatemoney

    A simple shared budget manager web application

    python-slapd

    Controls a slapd process in a pythonic way

    authlib

    Identity and Access management library for python

    pytest-iam

    A lightweight OAuth2/OIDC server to be used in your test suite

    Debian

    Lire la suite…

    PyConFR 2024 : Strasbourg - Université Math-Info

    by Jeffd from AFPy discuss

    Hello,

    Pour l’édition Novembre 2024 on est en contact avec l’université Math-Info de Strasbourg (5-7 rue rené Descartes ou en face du 5 rue du Général Zimmer) Lien OSM

    Ces bâtiments sont sur le campus principal, pas loin du centre ville et desservi par trois lignes de Tram (C, E, F) qui passent par deux arrêts proches: Université au Nord et Esplanade à l’Est. Le trajet par la ligne C est direct depuis la gare, il faut compter 12minutes de tram et 5 minutes de marche maxi).

    Il y a un grand parking au sud du batiment, vers l’Alinea, mais il est accessible que par bornes (pour des résidents). La rue René Descartes est fermée à la circulation par de gros bloc de pierre (ça semble définitif); L’orga pourra laisser des voitures Allée Gaspard Monge et Konrad Roentgen mais c’est très limité en place sachant que les foodtrucks seront probablement dans ce coin. Le public peut stationner Allée du Général Rouvillois, c’est pas trop loin et gratuit.

    Laura pensait réserver les deux amphis et deux grandes salles. J’ai fais un plan du bâtiment (le haut du plan correspond au sud). Je suis passé, il y avait encore des travaux et les cours avaient repris, donc j’ai pas pu ouvrir toute les portes et connaitre le sens de certaines pièces. Et je me suis basé sur un plan d’évacuation (donc sans indication des usages, je pense qu’on a un autre ensemble de WC vers la seconde entrée.

    • Entrée principale coté EST allée Gaspard Monge (l’allée remonte jusqu’au Tram sans changer de nom) mais elle est pas tout a fait alignée avec l’arrêt) - Possible d’arriver par la rue Zimmer mais c’est moins sympa/visible.
    • En entrant notre stand d’accueil serait probablement sur la gauche, on laisserait les sponsors autour du petit jardin sur la droite (c’est des patios fermés, on peut aller ni dans le petit ni dans le grand). On a la place pour mettre les sponsors en face a face mais je pense qu’on aura assez d’emplacement pour éviter ça.
    • le petit-déjeuner serait dans la Cafétéria, c’est assez grand, y’a des distributeur de snack du coté de la cloison avec la grande Salle 1 (espéreront que ça atténue bien le bruit). J’ai pas le souvenir la cloison dans la cafet.
    • En dessous de la cafet et entre la salle 1 et la salle 2 on a 3 autres salles de cours (sans ordis)
    • De souvenir les salles tout en bas du plan (avec 3 portes) sont des salles avec des ordis, donc on aura pas accès.
    • On imaginait faire les ateliers dans la colonne verticale de salle à l’opposé des amphis (mais c’est pas accessible)
    • Y’a pas mal d’amménagement et de tables en exterieur, plutot du coté Descartes que Roentgen de souvenir
    • En intérieur en dessous de l’escalier d’accès au grand amphi et derrière le petit amphi on a des tables, le probleme c’est que c’est accessible que par escalier. Les tables bougent pas de ce que j’ai vu.

    Accessibilité
    J’ai mis un hachuré jaune-noir pour les escaliers, en vif ceux qui gênent plus ou moins, en foncé/sombre ceux qui sont pas problématiques

    • On peut entrer dans les amphis par le bas (petites fleches bleu pointillés) de chaque cotés.
    • la salle 1, tout comme la cafet, c’est de plain pied
    • la salle 2 en revanche on doit soit monter trois marches et y’a rien pour se tenir, soit contourner par l’extérieur et entrer par la porte2 (il y a des escaliers mais je crois qu’on a aussi une rampe)
    • les salles qu’on prévoyait pour les ateliers ont, d’après mon plan, des escaliers (quelques marches) mais j’ai pas le souvenir de les avoir vu lors de ma rencontre avec le directeur. C’est des points que je vais re-vérifier

    Si jamais vous avez des questions, hésitez pas à ma faire un retour rapide (Ici ou en MP) je vais tenter de repasser pour lever quelques doutes.

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Rikiki, le "plus petit wiki du monde en python" (ou pas)

    by Mindiell from AFPy discuss

    Je me suis trouvé un nouveau défi: faire un tout petit wiki.

    C’est désormais chose faite : Il pourrait être “le plus petit code source de wiki du monde en python3” (laissez moi y croire 5 minutes :wink: ) avec ses 532 octets.

    Il obéit à quelques contraintes de base pour tout wiki :

    • Génération automatique de lien : Toute chaîne de caractères en CamelCase est transformée en lien vers une nouvelle page.
    • Contenu éditable par tout le monde : Aucune sécurité, toute page affiche sa source qui peut être modifiée.
    • Contenu facilement éditable ; C’est du texte brut, hormis les sauts de ligne qui font un paragraphe et donc les liens vers les autres pages à mettre en CamelCase.
    • Rétro-liens : Si une page A pointe vers une page B, cette dernière affichera automatiquement un lien vers la page A.

    screenshot

    Le code source pour les curieux :

    #!/usr/bin/env python3
    import cgi,json as j,re as r
    p,s,c=map(cgi.parse().get,"psc")
    p,o=p[0],open
    s and o(p,"w").write(s[0])
    o(p,"a");o("b","a")
    l,k,v=j.loads(o("b").read()or"{}"),r"(([A-Z][\w]+){2})",r"<a href=?p=\1>\1</a>"
    c=s[0] if s else o(p).read()
    l[p]=[x[0] for x in r.findall(k,c)]
    h=r.sub(k,v,c,r.M)
    h=r.sub(r"\n","<p>",h,r.M)
    j.dump(l,o("b","w"))
    print('Content-Type: text/html\n\n%s<form method=POST><textarea name=s>%s</textarea><input type=submit></form>'%(h,c))
    [n==p and print(r.sub(k,v,m)) for m in l for n in l[m]]
    

    21 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Poste de doctorant assistant d'enseignement et de recherche à l'Ecole Navale

    by Fabrice-64 from AFPy discuss

    L’école navale, à Brest, recherche un doctorant assistant d’enseignement et de recherche.
    Quelques détails sur l’offre:
    Titulaire d’un master (ou équivalent) en informatique, la personne recrutée devra s’investir dans les activités d’enseignement et au sein du laboratoire dans des travaux de recherche liés au traitement de l’information maritime, à l’intelligence artificielle et plus généralement aux sciences des données. La thèse s’effectuera au sein de l’équipe de recherche MoTIM dans l’objectif de contribuer au domaine du Traitement de l’Information Maritime issue de sources hétérogènes (données capteurs, signaux, images, vidéos, informations géographiques, données textuelles) à l’aide d’algorithmes d’intelligence artificielle.

    Voici le lien sur Linkedin : LIEN

    La personne en charge du recrutement est un ami: vous pouvez dire que vous en avez pris connaissance par mon intermédiaire.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Rencontre sur Paris en septembre

    by grewn0uille from AFPy discuss

    Hello,

    Avec @liZe, nous serons sur Paris pour la Paris Web.

    Est-ce qu’il y a des gens sur Paris qui seraient chô pour aller boire un coup et/ou manger quelque part le vendredi 29 septembre en fin de journée / soirée ?

    @debnet Si t’es sur Paris à ce moment là :slight_smile:

    édit : si vous avez des idées de lieux, hésitez pas à partager !

    édit 2 : rdv à l’apéro de l’April

    édit 3 : pensez à vous inscrire sur le pad de l’évènement

    12 messages - 7 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Problème de packaging : conflit entre dépendance git et dependence locale

    by entwanne from AFPy discuss

    Salut,

    J’ai une question un peu tordue pour les férus de packaging.

    Je développe actuellement un projet que je découpe en plusieurs paquets Python (qui seront publiés sur PyPI) dont certains peuvent être hébergés sur un même dépôt git.
    Pas de soucis jusque là mais pour visualiser disons que j’ai un dépôt git avec deux répertoires pouet-engine et pouet-more contenant le code des deux paquets respectifs.

    En plus de ça, je fournis des tests pour ces projets, hébergés sur le même dépôt (logique) mais non inclus dans les paquets Python publiés.
    Comme les tests de pouet-engine et pouet-more peuvent avoir besoin de fonctions communes mais que je ne veux pas encombrer les paquets principaux des détails des tests, j’ajoute dans l’histoire un paquet pouet-test-fixtures hébergé dans le même dépôt pour contenir tout ça, mais pas publié sur PyPI (il n’a pas de raison d’être installé en dehors de l’env de test).

    J’ai ainsi pouet-engine qui n’a pas de dépendance particulière, pouet-engine[dev] qui dépend de pouet-test-fixutres @ git+ssh://..., pouet-test-fixtures qui dépend de pouet-engine, pouet-more qui dépend de pouet-engine et pouet-more[dev] qui dépend de pouet-engine[dev].
    Là encore, ça fonctionne plutôt bien.

    On en arrive maintenant à mon soucis : je suis dans mon env de dev et j’ai envie de tout installer en mode éditable à partir des fichiers locaux (sans aller chercher de dépendances internes sur PyPI ou sur git). Parce que je veux que mes modifications locales dans le répertoire pouet-test-fixtures soient considérées quand j’exécute les tests de pouet-engine.
    Et c’est le cas de la dépendance git qui fait que ça coince.

    Lorsque j’essaie un pip install -e './pouet-engine[dev]' ./pouet-test-fixtures j’obtiens une erreur de résolution parce que j’essaie à la fois d’installer pouet-test-fixtures @ git+ssh://... et pouet-test-fixtures depuis le dossier local.

    ERROR: Cannot install pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet-test-fixtures) and pouet[dev]==0.1.0 because these package versions have conflicting dependencies.
    
    The conflict is caused by:
        The user requested pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet/test-fixtures)
        pouet[dev] 0.1.0 depends on pouet-test-fixtures 0.0.0 (from git+ssh://****@github.com/entwanne/pouet.git#subdirectory=pouet-test-fixtures)
    

    Là j’ai bien une solution alternative qui est de séparer et dupliquer la commande : d’abord installer ./pouet-engine[dev] qui ira tirer la dépendance depuis git puis de réinstaller ./pouet-test-fixtures pour l’écraser avec la version locale, mais ça passe mal à l’échelle quand il y a plusieurs paquets, parce que si j’installe ./pouet-more[dev] ensuite je suis obligé de recommencer toute la manip.

    Des idées pour trouver une solution acceptable à ce soucis ?

    Au besoin je peux mettre à disposition un tel projet-jouet pouet qui reproduit le problème.

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Stage Nantes 5-6 mois] - Concevoir et développer un outil de gestion documentaire simple basé sur le CMS Django Wagtail

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission
    L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.

    Vous aurez pour missions de :
    • Réaliser des maquettes fonctionnelles pour définir les interactions,
    • Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
    office,
    • Développer avec Vue.js la partie “front-office” de l’application,
    • Réaliser les tests unitaires et fonctionnels,
    • Rédiger la documentation technique,
    • Publier en Open Source l’application sur Github avec la documentation nécessaire.

    Profil
    • Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
    • Une expérience en Python et/ou JavaScript est requise,
    • Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez-nous qui vous êtes et ce qui vous motive. Expliquez-nous en quoi vos motivations et vos
    compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Chef-Cheffe de projets produits et services web

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous intégrerez un pôle interdisciplinaire (chefs de projets, ergonomes, graphistes, développeurs Back/Front/Mobile, SIG, DBA…) réparti entre Toulouse, Nantes et Paris, au sein duquel vous aurez pour mission de piloter les projets de nos clients et de participer au développement commercial.

    Vos missions consisteront à :

    • Identifier et mettre en œuvre au sein du projet les besoins technico-fonctionnels des clients
    • Formaliser, organiser, planifier et contrôler les phases de réalisation
    • Piloter et coordonner l’équipe projet
    • Assurer le suivi du planning et le contrôle de la qualité
    • Gérer les engagements vis-à-vis du client et s’assurer de sa satisfaction
    • Fidéliser, entretenir et développer le portefeuille client existant
    • Participer aux phases d’avant-vente en relation avec le client et avec nos équipes, rédiger une proposition commerciale

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).

    Profil

    Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.

    Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.

    Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.

    Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !

    Serait également un plus un background technique dans le développement web.

    Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.

    Informations complémentaires

    Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e Makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Toulouse] - Développeur-Développeuse junior(e) Python/Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous serez accompagné(e) tout au long de votre montée en compétences : encadrement par un développeur sénior (pair-programming, codes reviews…), interactions/transmission de compétences avec les équipes, formations, autoformation etc.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Profil

    De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.

    Vous avez envie d’acquérir certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL JS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Toulouse et Nantes] - Développeur-Développeuse sénior(e) Python Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez en tant que sénior(e) technique sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous accompagnerez la montée en compétences de profils moins expérimentés et partagerez votre savoir, en interne ou en externe (formation) et en présentiel/distanciel.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté Python / Django.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ou en télétravail complet (sous conditions avec un retour en présentiel de 4 jours/mois).

    Ingénieur en études et développement informatiques

    Profil

    Niveau Bac +5 en informatique de préférence**.** Vous justifiez d’une expérience similaire d’au minimum 3 ans des technologies Python et Django, et êtes à l’aise dans un environnement GNU/Linux. Nous apprécierions que vous possédiez certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL GS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Vous appréciez accompagner la montée en compétences de profils moins expérimentés et partager votre savoir.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage Toulouse 5-6 mois] - Concevoir et développer en back end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets :Références | Makina Corpus

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end et sous la responsabilité de développeurs back end, vous aurez pour missions de :

    • Développer des applications Django
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des bibliothèques de cartographie
    • Apprendre les méthodes de tests et de déploiement continu

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    • Création d’une application pour la gestion de l’altimétrie / les géometries 3D depuis Geotrek-admin/altimetry utilisable dans Geotrek-admin mais aussi GeoCRUD
    • Mise a jour du site de gestion des utilisateurs Geotrek
    • Permettre de brancher Geotrek sur un back end d’authentification unifiée

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).

    Vous possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Python : f-string vs str()

    by Olivier Pons from Olivier Pons

    Quelle est la différence de performance entre f"{x}" et str(x) ?

    Voici mes tests qui m’ont surpris, car je m’attendais à l’inverse :

    from typing import Dict

    def benchmark() -> None:
      """Main
      function for benchmark.
      """
      t1 = timeit.timeit("f_str()",
                         globals=globals(),
                         number=50000000)
      t2 = timeit.timeit("u_str()",
                         globals=globals(),
                         number=50000000)
      t3 = timeit.timeit("n_str()",
                         globals=globals(),
                         number=50000000)
      d: Dict[str, float] = {
        "f-string": t1,
        "str": t2,
        "no str": t3
      }
      s: Dict[str, float] = {k: v
                             for k, v
                             in sorted(d.items(),
                                       key=lambda i:
                                       i[1])}
      f: float = min(s.values())
      print("Method\tTime\tPerc.")
      print("------\t----\t-----")
      for k, v in s.items():
        p: float = (v / f) * 100
        print(f"{k}\t{v:.2f}\t{p:.2f}%")

    if __name__ == "__main__":
      import timeit
      class T:
        def __init__(
                self, l: str) -> None:
          self.l: str = l
      o: T = T("test")
      def f_str() -> str:
        return f"{o.l}"
      def u_str() -> str:
        return str(o.l)
      def n_str() -> str:
        return o.l
      benchmark()

    Explications

    • f"{self.label}" utilise le mécanisme d’interpolation de chaînes de caractères de Python qui peut être légèrement plus rapide parce qu’il est optimisé pour concaténer des littéraux de chaîne et des variables ;
    • str(self.label) appelle explicitement le constructeur de la classe str, ce est un peu plus lent en raison de l’appel de fonction.

    Lire la suite…

    Administrateur-Administratrice système et devops

    by makina from AFPy discuss

    Makina Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.
    Découvrez quelques uns de nos projets : Références | Makina Corpus

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    La mission

    Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.

    Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.

    Vos missions en ingénierie infrastructure/administration système et devops consisteront à :

    1) Exploitation du SI de la société (partie administration systèmes) :
    • Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle
    • Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)
    • Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines
    • Superviser les environnements clients (préproduction et production)
    • Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques
    • Développer des outils d’aide aux tâches d’administration système et de supervision

    2) Orchestrer le déploiement de nos applications métiers (partie devops) :
    • Mettre en œuvre et optimiser les processus d’intégration et de déploiement de nos applications métiers Python/Django et PHP (Drupal/Symfony) en fonction des spécificités et besoins des développeurs par le biais de l’intégration continue/déploiement continu (GitLab-CI, Ansible)
    • Conseiller et assister les équipes de développement sur les bonnes pratiques liées au déploiement, aux solutions techniques et enjeux de performance et de sécurité en production
    • Maintenir et faire évoluer des outils, modèles et bases de projet, documentations à destination des développeurs pour les accompagner dans la livraison des applications.

    Vous aurez l’opportunité de :
    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté
    • Jouer un rôle visible dans les communautés des logiciels libres : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Le profil

    Vous avez d’excellentes connaissances et une expérience dans l’administration de systèmes Linux (Debian/Ubuntu) ainsi que dans ces technologies :
    • Écosystème Docker (conteneurs, registry, orchestration)
    • Intégration continue GitLab-CI
    • Gestion de configuration avec Ansible

    Ainsi qu’une connaissance des technologies suivantes :

    • PostgreSQL
    • Scripting bash
    • Prometheus/Grafana
    • Kubernetes
    

    Une connaissance des langages de programmation Python et PHP serait un véritable avantage.

    Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.

    Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler.
    Nos équipes sont mixtes, femmes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Lyon − Vos avis et suggestions sur les meetups Python (que vous ayez déjà participé ou non)

    by grewn0uille from AFPy discuss

    Bonjour tout le monde,

    Si vous êtes sur Lyon et alentours, nous avons créé un sondage pour connaître votre avis sur les meetups Python :sunny:.

    Que vous soyez déjà venu·e ou non, n’hésitez pas à y répondre, ça nous aidera à améliorer les évènements !

    Le sondage est ouvert jusqu’au 30 septembre.

    :arrow_right: CourtBouillon surveys − Meetups Python sur Lyon

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Affichage d'une interface PyQt6

    by KBE from AFPy discuss

    J’ai avec Qt designer, j’ai créé une interface utilisateur que j’ai exportée et nommée gui.ui grâce à pyuic je les transformer en gui. Py, mais maintenant, je ne sais pas comment lancer l’interface pour le lancer, j’ai utilisé ce code.

    depuis gui.gui importer Ui_MainWindow `app = QApplication(sys.argv)
    main_window = Ui_MainWindow()
    main_window.setupUi(main_window)
    main_window.setObjectName("MainWindow")
    main_window.show()
    sys.exit(app.exec_())` 
    

    Toute la coloration syntaxique est bonne et tout est bonne … Mais j’ai une erreur

    R/ATCIFR/ATC-IFR/src/resources/app.py" 
    Traceback (dernier appel le plus récent) :
    Fichier "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
    ligne 21, dans le fichier main() "d:\Dev \Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
    ligne 15, dans le fichier principal main_window.setupUi(main_window) "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ ATC-IFR\src\resources\gui\gui.py",
    ligne 14, dans setupUi MainWindow.setObjectName("MainWindow")
    ^^^^^^^^^^^^^^^^^^^^^^ ^^
    AttributeError : l'objet 'Ui_MainWindow' n'a pas d'attribut 'setObjectName'
    

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Nantes] Admin sys - Ingénieur d'étude @ CNRS

    by glyg from AFPy discuss

    France BioImaging, organisation nationale regroupant les plateformes de microscopie en France, recrute un administrateur système et réseau pour participer au déploiement de solutions de gestion de données dans des datacenters régionaux.

    Vous rejoindrez une équipe d’une dizaine de personnes distribuée entre Nantes, Montpellier et Bordeaux pour aider à la sauvegarde et à l’archivage des données de la recherche.

    Venez travaillez sur des technos 100% open source (OpenStack - Ansible - Debian), pour aider les équipes de recherches dans leur transition vers des pratiques de science ouverte.

    C’est un CDD de 12 mois qui pourra se prolonger.

    Portail Emploi CNRS - Offre d’emploi - Ingénieur d’étude H/F Administrateur systèmes et réseaux pour les données d’imagerie en biologie

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    ConFoo Montreal 2024 : L'appel aux conférenciers est ouvert

    by Yann Larrivee,Nÿco,Benoît Sibaud,Xavier Teyssier from Linuxfr.org

    Titre de l'image

    La conférence ConFoo est de retour pour sa 22e édition ! Du 21 au 23 février 2024 à l’Hôtel Bonaventure de Montréal, venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs de partout en Amérique du Nord !

    Nous sommes présentement à la recherche de conférenciers avides de partager leur expertise et leur savoir dans une multitude de domaine des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, bases de données, intelligence artificielle et plus encore !

    Pouvant être offertes en français ou en anglais, nos présentations sont généralement dans un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers invités profitent d’un traitement privilégié ; avec notamment la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).

    Vous avez jusqu’au 22 septembre prochain pour soumettre votre projet de présentation !

    Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de 400$ en réservant votre inscription d’ici le 16 octobre prochain !

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    PyConFR 2024: Recherche des Sponsors

    by Fabrice-64 from AFPy discuss

    Bonjour à toutes et à tous,
    En relançant le groupe Python sur Strasbourg, @Jeffd, @c24b et moi-même avons estimé que nous pouvions déjà solliciter les sponsors en prévision de la PyConFR 2024, indépendamment du lieu et de la date.
    Pourquoi ?
    Les communicants devraient logiquement faire valider leurs budgets pour 2024 au cours du 2ème semestre.
    Si nous pouvons déjà entrer en relation avec eux, nous pouvons avoir l’espoir d’obtenir plus de réponses positives. Tandis qu’attendre début 2024 pour les solliciter risquerait de les conduire à nous attribuer uniquement des queues de budget.

    Quels sont vos avis sur le sujet ?

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Difference entre invité de commande et visual studio code

    by Yannick from AFPy discuss

    Bonjour,
    Je suis débutant avec python, et je suis en train d’apprendre le langage.
    Je constate une différence au niveau du résultat obtenue dans mes variables
    Exemple :
    Invite de commande :

    >>> Fruit= ["Pomme","Banane","Ananas"]
    >>> Fruit[1]
    'Banane'
    

    Visual Studio code:

    Fruit= ["Pomme","Banane","Ananas"]
    Fruit[1]
    

    Run est vide

    J’ai le même rendu avec une la fonction type

    Invite de commande :

    >>>Nom = "c'est un test"
    >>> type(Nom)
    <class 'str'>
    

    Visual Studio Code

    Nom = "c'est un test"
    type(Nom)
    

    C’est vide

    Ma version python Python 3.11.4
    Ps: extension python installer dans visual code

    Merci d’avance pour votre aide

    7 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Développeur Full Stack sur Lyon (Finance)

    by Fabrice-64 from AFPy discuss

    Voici une offre d’emploi pour un développeur Python expérimenté en banque-finance : [Confidentiel] est une start-up qui propose une plateforme d’investissement offrant une connexion aux marchés financiers ainsi que des services de transfert et de gestion d’argent, à destination des particuliers. Afin de renforcer son équipe et de poursuivre sa croissance, notre client recherche un Développeur Back-end H/F pour développer, maintenir et améliorer ses systèmes de trading.

    Localisation : Lyon

    Rémunération proposée : 45000 - 60000 euros / an

    Stack technique :

    • Python (ou expert en JAVA / C#)
    • AWS Lambdas / DynamoDb, Timestream, APIGateway
    • Linux Servers
    • SQL
    • NoSQL
    • Websockets / Rest API

    Télétravail : 2 jours / semaine

    Profil recherché : Expérience d’au-moins 5 ans sur du développement back-end dans un environnement banque / finance Autonome, désireux/euse de partager son expérience Proactif/ve

    Pour ceux et celles qui pensent être dans le cadre, contactez-moi en DM et je transmettrai votre profil au chasseur de têtes qui a le mandat.


    Et si vous pensez que l’offre est genre mouton à 5 pattes jamais rencontré, dites-le moi aussi, y compris sur le forum: cela me permettra d’aider le chasseur de têtes dans la relation avec le client.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Python sans GIL

    by el-dge from AFPy discuss

    La proposition de retirer le GIL (Global Interpreter Lock) a été acceptée, permettant le multi-threading natif en Python : What's up, Python? The GIL removed, a new compiler, optparse deprecated...

    Ma question est plutôt historique : si le GIL était un si gros frein, pourquoi avoir basé Python sur ce dispositif mono-thread ? Est-ce qu’en 1991, on ne savait pas que les ordinateurs allaient devenir multiprocesseurs et mutli-thread ? Pourquoi ne pas avoir codé Python directement sans GIL (TCL est un langage interprété sans GIL) ? Est-ce juste par ce que c’était plus facile vis à vis de la libc ?

    ( et j’espère qu’il y aura un guide migration en fr …)

    Merci bien d’avance.

    3 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Nuages de points - format e57

    by dancergraham from AFPy discuss

    Bonjour,

    Y-a-t-il des gens qui s’intéressent aux pointclouds avec Python ici ? J’en utilise pour mon travail via les libs pye57, open3d, pyntcloud et autres - je serai content d’échanger avec d’autres autour du sujet - dans ce thread ou via DM.

    The Stanford Bunny in pointcloud format

    J’ai aussi commencé a travailler un nouveau lib pour lecture (et écriture?) des fichiers au format .e57 car pye57 n’est pas trop maintenu en ce moment et pour apprendre un peu de rust. Contributions, commentaires et demandes de features par ici …

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [online] Utilisation de docker avec python

    by asyd from AFPy discuss

    Bonjour à toutes/tous,

    si jamais des gens sont intéressés je peux faire un retour d’expérience sur l’utilisation (du dev jusqu’à la production) de docker pour une application python.

    Cela pourra commencer par une brève introduction à ce qu’est docker.

    Si vous êtes intéressé n’hésitez pas à vous manifester et éventuellement lister des points particuliers que vous souhaiteriez voir abordé

    6 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Nantes - Meetups 2023

    by dancergraham from AFPy discuss

    Bonjour, voici un post wiki pour organiser le Nantes Python Meetup:

    Merci d’utiliser le bouton “Modifier” en bas a droite du message :arrow_heading_down: pour ajouter des infos ou répondre en dessous si vous préférez / n’avez pas de droits de modification…

    Lieux Possibles

    Avec personne nommé comme contacte si possible

    Sujets

    Une librairie préférée? Un projet open source? Un sujet data science / web / IoT / autre…? Merci de répondre ci-dessous avec des propositions de sujet. Vous pouvez me contacter, ou un autre organisateur directement. On peut également faire des meetups en mode “barcamp” sans sujet prévu d’avance.

    • Playwright: python testing for front end apps by Felix ?
    • Django ORM by ???
    • Install party - aider au setup Python (et Conda, django , …?)
    • Préparer un talk pour le Meetup / PyCon / DevFest / …

    Dates

    • 5 juillet 2023 a Onepoint (confirmé)
    • 12 septembre 2023 (proposition)
    • 10 octobre 2023 (proposition)
    • 14 novembre 2023 (proposition)
    • 12 décembre 2023 (proposition)

    Sponsors

    Qui peut payer les rafraichissements (ex. pizzas + boissons) pour un Meetup ?

    Organisateurs

    Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …

    3 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Qui veut aider à améliorer la sécu de logs.afpy.org ?

    by mdk from AFPy discuss

    Si quelqu’un veut faire une contrib simple, j’ai ouvert un ticket ici :

    Le but est de pouvoir utiliser une CSP plus strique que :

    Et le but derrière est donc de passer “A” sur :

    (Bon le but en fait est surtout de se prémunir de XSS via les logs IRC).

    5 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Enseignant·e externe Python

    by grewn0uille from AFPy discuss

    L’ESTBB (école de biotechnologies sur Lyon) recherche un·e intervenant·e externe pour des cours de Python sur l’année scolaire 2023/2024.

    Les cours de Python sont à destination des premières années de la license SVH.

    Il y a au total 7 groupes d’élèves. J’interviens pour 4 de ces groupes et l’école cherche une personne pour assurer les cours des 3 autres groupes.

    Le contenu et les supports des cours sont déjà prêts. Lors du premier semestre, les élèves voient les bases de Python et pour le second semestre, c’est un projet en petit groupe.

    Niveau volume horaire, ça donne 84h de cours (7 cours de 2h pour 3 groupes x 2 semestres).

    N’hésitez pas à me contacter directement en MP ou par mail (lucie@courtbouillon.org) si ça vous intéresse et/ou si vous avez des questions !

    Édit : offre pourvue

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Déploiement d’une application Django

    by Melcore from AFPy discuss

    Bonjour,

    Récemment j’ai créé une application django, j’aime beaucoup la facilité avec laquelle je peux crée ce dont j’ai besoin avec.

    Mais comme à chaque fois quand je crée une app django, une étape m’effraies, le déploiement. J’arrive toujours à m’entremeler les pinceaux avec les statics, les médias, la sécurité .

    Est-ce que vous avez des conseils pour déployer facilement, mettre en place un déploiement automatique, voir une ressource externe pour m’aider à comprendre comment fonctionne le déploiement.

    Merci d’avance.

    4 messages - 4 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Problème de code et de plug in

    by khbael from AFPy discuss

    Salut à toute la communauté. Je vous contacte parce que depuis 2h je je sui confronté au problème suivant. Chaque fois que je tape un valeur et un variable (par exemple nom=Pierre) je reçois le message suivant:

    Traceback (most recent call last):
      File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
        coro = func()
               ^^^^^^
      File "<input>", line 1, in <module>
    NameError: name 'nom_nom' is not defined
    

    Je fais alors appel à votre sagesse et connaissance.

    Bien à vous,

    Konstantinos

    12 messages - 5 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Mini logiciel de connexion

    by python0007 from Linuxfr.org

    main.py fichier principal

    ######################
    from PyQt5 import QtCore, QtGui, QtWidgets
    from projet import Ui_MainWindow
    import sys
    import st
    
    class Bd(QtWidgets.QMainWindow):
        def __init__(self):
            super(Bd, self).__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.Bd = st.Bd()
            self.ui.page.setCurrentIndex(0)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            # Menu de Navigation
            self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
            self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
            self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
            self.ui.QuitterBtn.clicked.connect(lambda: self.close())
            # Fin de Navigation
            self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
            self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
    
        def CreateUserAccount(self):
            Nom = self.ui.lineEditNomCreerCompte.text()
            Email = self.ui.lineEditMailCreerCompte.text()
            Password = self.ui.lineEditPasswordCreerCompte.text()
            Data = (Nom,Email,Password)
            if self.Bd.ConnectUser(Data,) == 0:
                self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
                self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
            self.ui.lineEditNomCreerCompte.setText('')
            self.ui.lineEditMailCreerCompte.setText('')
            self.ui.lineEditPasswordCreerCompte.setText('')
    
        def ValideUser(self):
            Email = self.ui.lineEditMailSeConnecter.text()
            Password = self.ui.lineEditPasswordSeConnecter.text()
            try:
                self.Bd.ValideUser(Email,Password)  # Pass Email and Password separately
                self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
            finally:
                self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
    
    
    if __name__ == "__main__":
        App = QtWidgets.QApplication([])
        Win = Bd()
        Win.show()
        sys.exit(App.exec())

    st.py fichier base de donnée

    #######################
    import sqlite3,smtplib,ssl
    from email.message import EmailMessage
    
    class Bd():
        def __init__(self):
            self.Connexion = sqlite3.connect("ctl.db")
            self.Cursor = self.Connexion.cursor()
    
        def ConnectUser(self,Data):
            Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
            self.Cursor.execute(Req,Data)
            self.Connexion.commit()
            return 0
    
    
        def ValideUser(self,Email,Password):
            Req = "SELECT Email FROM user WHERE Email = ?"
            self.Cursor.execute(Req,(Email,Password))
            return print(self.Cursor.fetchall()[0][0])
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Mini logiciel de connexion besoin d'aide sur mon code

    by python0007 from Linuxfr.org

    main.py fichier principal Besoin d'aide def ValideUser concernant la logique du try pour se connecter

    ######################
    from PyQt5 import QtCore, QtGui, QtWidgets
    from projet import Ui_MainWindow
    import sys
    import st
    
    class Bd(QtWidgets.QMainWindow):
        def __init__(self):
            super(Bd, self).__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.Bd = st.Bd()
            self.ui.page.setCurrentIndex(0)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            # Menu de Navigation
            self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
            self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
            self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
            self.ui.QuitterBtn.clicked.connect(lambda: self.close())
            # Fin de Navigation
            self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
            self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
    
        def CreateUserAccount(self):
            Nom = self.ui.lineEditNomCreerCompte.text()
            Email = self.ui.lineEditMailCreerCompte.text()
            Password = self.ui.lineEditPasswordCreerCompte.text()
            Data = (Nom,Email,Password)
            if self.Bd.ConnectUser(Data,) == 0:
                self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
                self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
            self.ui.lineEditNomCreerCompte.setText('')
            self.ui.lineEditMailCreerCompte.setText('')
            self.ui.lineEditPasswordCreerCompte.setText('')
    
        def ValideUser(self):
            Email = self.ui.lineEditMailSeConnecter.text()
            Password = self.ui.lineEditPasswordSeConnecter.text()
            try:
                self.Bd.ValideUser(Email,Password)  # Pass Email and Password separately
                self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
            finally:
                self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
    
    
    if __name__ == "__main__":
        App = QtWidgets.QApplication([])
        Win = Bd()
        Win.show()
        sys.exit(App.exec())

    st.py fichier base de donnée Besoin d'aide au niveau de def ValideUser et def ValideUser

    #######################
    import sqlite3,smtplib,ssl
    from email.message import EmailMessage
    
    class Bd():
        def __init__(self):
            self.Connexion = sqlite3.connect("ctl.db")
            self.Cursor = self.Connexion.cursor()
    
        def ConnectUser(self,Data):
            Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
            self.Cursor.execute(Req,Data)
            self.Connexion.commit()
            return 0
    
    
        def ValideUser(self,Email,Password):
            Req = "SELECT Email FROM user WHERE Email = ?"
            self.Cursor.execute(Req,(Email,Password))
            return print(self.Cursor.fetchall()[0][0])
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Scripting Python sous Linux 2eme EDITION

    by Christophe B. from Linuxfr.org

    📚 Annonce spéciale ! 📚

    Hello, world

    Je suis ravi de vous annoncer la parution imminente, le 12 Juillet, de la deuxième édition de mon livre "Scripting Python sous Linux" aux Editions ENI

    Cette nouvelle édition fait 100 pages de plus, en fait 99 pages pour être exact et j'ai compté 194 scripts en tout, téléchargeables sur le site de l'éditeur bien entendu.

    De nouveaux sujets sont abordés comme par exemple AWS et boto3, Scapy, RRDTool, OpenStreetMap et Folium, le tout accompagné d'exemples pertinents et de difficulté progressive.

    Je tiens particulièrement à remercier chaleureusement tous ceux qui ont lu et apprécié la première édition, dont certain sont présent sur LinuxFR ;)

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Ingénieur·e Senior Django/Vue - secteur ONGs & charitatif

    by florent-rgoods from AFPy discuss

    RGOODS est LA plateforme SaaS en marque blanche qui permet aux organisations à but non lucratif de recruter de nouveaux donateurs grâce à des services innovants: boutiques en ligne, formulaire de dons, média de communication au sein des entreprises afin de développer le mécénat.

    Un impact clair, fort et traçable tout en construisant une entreprise rentable. La société dispose d’un financement solide et est dirigée par des fondateurs ayant une vaste expérience dans le lancement et la croissance d’entreprises numériques avec un chiffre d’affaires de plus de 2 milliards d’euros.

    RGOODS s’adresse au marché européen et collabore avec les principales ONG et marques européennes comme Médecin Sans Frontières, Amnesty International, Handicap International. Notre engagement est simple : les aider à tisser des liens forts avec leurs sympathisants et à collecter des fonds, afin qu’elles mènent à bien leurs missions.

    Dans ce contexte, nous lançons le développement d’un nouveau produit, basé sur Python, Django et VueJS. L’équipe de développement est composée de 3 développeurs seniors (15 ans d’expérience moyenne) et est destinée à grandir.

    Notre culture du développement logiciel est simple:

    • Utiliser des technologies modernes mais éprouvées
    • Rester simple, agile et respecter les standards
    • Penser expérience utilisateur, fiabilité et sécurité

    Vos missions

    • Concevoir, développer, tester et déployer des applications web à l’aide des technologies en Python/Django et VueJS,
    • Assurer la qualité du code en effectuant des revues de code, des tests unitaires et des tests d’intégration,
    • Participer activement à l’optimisation et la sécurisation des applications en identifiant et en résolvant les problèmes de performances et les vulnérabilités de sécurité,
    • Participer à la mise en place et à la maintenance de l’infrastructure technique supportant les applications ainsi que les outils de développement et de déploiement (hébergement, CI/CD, monitoring, etc.),
    • Participer à la rédaction des documentations techniques et documentations utilisateur, ainsi qu’à la formation et au support technique des utilisateurs en interne.

    Votre profil

    • Vous êtes issu·e d’une école d’ingénieur ou d’un master en informatique (Bac+5),
    • Vous avez une expérience de 5 ans minimum dans le développement d’applications web en utilisant Python/Django, Vue.js, HTML5 & CSS
    • Votre expérience inclut le développement d’applications à forte exigence de sécurité, forte charge, et haute disponibilité,
    • Vous maîtrisez les patterns reconnus d’architecture logicielle et de développement, aussi bien côté backend que frontend,
    • Vous savez vous mettre à la place des utilisateurs et avez pour principal objectif de leur fournir un outil fiable, sécurisé et ergonomique,
    • Vous aimez travailler en équipe et savez que les échanges sont primordiaux dans la réussite d’un projet.

    Pourquoi nous rejoindre ?

    • Vous désirez vous engager dans une mission qui a du sens, et êtes fier·e de contribuer à l’impact de grandes associations comme APF France Handicap, Petits frères des Pauvres, ou encore Surfrider Foundation ?
    • Vous rêvez de travailler sur un produit nouveau, sans dette technique, sur lequel tout est à construire ?
    • Vous souhaitez collaborer avec une équipe dynamique et amicale, qui aime se retrouver autour d’un tableau blanc, mais aussi autour d’un repas ou d’un verre ?
    • Vous avez envie d’un cadre de travail agréable et d’un équilibre vie pro/perso respecté ?

    … alors il est probable que votre place soit parmi nous.

    Type de poste

    Salaire : Entre 50 et 65K, selon expérience
    Avantages : Tickets restaurant
    Disponibilité : ASAP
    Contrat : CDI cadre - forfait jours
    Lieu de travail : Centre ville de Nantes
    Présentiel/Télétravail : Hybride flexible

    Processus de recrutement

    • Envoyez votre candidature en expliquant pourquoi vous souhaitez venir travailler avec nous, accompagnée de votre CV à florent@rgoods.com
    • Rencontre avec Florent, notre CTO
    • Rencontre avec un de nos co-fondateurs

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…