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
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
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
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:
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.
___ 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.
You think that ___ is complicated. I’m going to simplify it for you.
Decorators. Comprehensions.
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.
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 )
Date limite pour postuler : 22 décembre 2024
Meetup de sélection : 26 mars 2024
Équipe de coachs : Léa Coston, Yann Bouvet, Houleymatou Baldé, Antoine Caron, @liZe et moi-même
Formulaire d’inscription : Inscription Tremplin Mixit 2025
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
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 :
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.
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.
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 »
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.
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 :
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
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.
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é.
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…
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…
Thank you to everyone who came to #PyConFR 2024! We hope you had a good time. If you would like to give your feedback for any areas of improvement for future editions, do not hesitate to fill out this survey: https://thym.courtbouillon.org/5
Merci à toutes les personnes étant venues à la #PyConFR 2024 ! Nous espérons que vous avez passé un bon moment. Si vous souhaitez donner votre retour pour toute piste d'amélioration pour les prochaines éditions, n'hésitez pas à remplir ce sondage : https://thym.courtbouillon.org/5
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
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")
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 à :
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!
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"
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.
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.
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.
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 :
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.
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)
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.
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
🇬🇧 Saturday November 2 at #PyConFR, join us for the #PyLadies luncheon!🍽️ It's free, but registration is required. Don't miss this opportunity to meet other Python enthusiasts!
🇫🇷 Samedi 2 novembre à la #PyConFR, rejoignez-nous pour le déjeuner des #PyLadies !🍽️ Un moment convivial et gratuit, mais l'inscription est obligatoire. Ne manquez pas cette occasion de rencontrer d'autres passionnées de Python !
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.
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.
$ 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
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 ?
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.
Hello,
N’ayant plus de train retour pour rentrer sur Clermont Ferrand le dimanche de la pycon, est ce que certain covoiturage sont en place et passerait par cette ville
Merci
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.
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 !
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.
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.
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.
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.
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 😎.
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:
importargparse,stringdefGenerateCheckCharacter(codepoints,text):factor=2summation=0n=len(codepoints)foriinrange(len(text)-1,-1,-1):codePoint=codepoints.index(text[i])addend=factor*codePointfactor=1if(factor==2)else2addend=int(addend/n)+(addend%n)summation+=addendremainder=summation%ncheckCodePoint=(n-remainder)%nreturncodepoints[checkCodePoint]defValidateCheckCharacter(codepoints,text):factor=1summation=0n=len(codepoints)foriinrange(len(text)-1,-1,-1):codePoint=codepoints.index(text[i])addend=factor*codePointfactor=1if(factor==2)else2addend=int(addend/n)+(addend%n)summation+=addendremainder=summation%nreturn(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()ifargs.generate:filename=args.generateelifargs.verify:filename=args.verifyelse:filename=__file__withopen(filename)asfp:text=fp.read()[:-1]ifargs.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 ?
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.
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 …)
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 !
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.
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, là 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 :
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.
Il reste encore des places pour l'espace enfants (de 3 à 12 ans) du jeudi au dimanche , animé par Babychou Services ! Comme l'inscription à la #PyConFR, ce service sera gratuit. 🐣🐥
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.
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.
🇬🇧 The schedule for #PyConFR 2024 is available ! Come and check out in details the workshops and conferences on offer over the 4 days! 🐍 Reminder : registration is mandatory but free of charge.
🇫🇷 Le planning de la #PyConFR 2024 est disponible ! Venez consulter en détail les ateliers et les conférences proposées durant les 4 jours ! 🐍 Rappel : l'inscription est obligatoire, mais gratuite.
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 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 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 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 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.
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 ;
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 alex@alxdr.com, LinkedIn (Baptiste Alexandre) ou sur le discord AFPy (baptistealexandre).
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.
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
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 :)
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).
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.
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.
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.
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.
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.
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 !
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
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
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.).
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 !
🇬🇧 Information for those who have proposed a conference or workshop at #PyConFR 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! 🐍
🇫🇷 Information pour les personnes ayant proposé une conférence, un atelier à la #PyConFR 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 ! 🐍
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 !
⌛️ Dernier rappel ! Ce dimanche 23:59 (Europe/Paris), le CFP pour la #PyConFR 2024 ferme ! 🐍 Que vous soyez débutant ou confirmé, quelque soit le domaine sur lequel vous utilisez Python, n'hésitez surtout pas à proposer un sujet ! #Python#PyCon https://cfp.pycon.fr/pyconfr-2024/cfp
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: ''
L’article est intéressant car il parle vraiment de plein de choses. Je ne suis pas forcément d’accord avec tout, mais c’est une bonne synthèse je trouve.
L’article est intéressant car il parle vraiment de plein de choses. Je ne suis pas forcément d’accord avec tout, mais c’est une bonne synthèse je trouve.
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…
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
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.
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
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
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.
Un clone de cat(1) avec coloration syntaxique et intégration Git
Affiche quel est le thème par défaut lors de l'utilisation du paramètre --list-themes et la coloration désactivée. Cette PR permet d'avoir un comportement cohérent avec la PR précédente où la coloration est activée.
Amélioration de la couverture de code lors de l'utilisation du paramètre --list-languages
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.
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 !
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.
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 !) :
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.
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à).
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
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?
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.
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).
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.
Le scénario décrit en introduction est crédible et peut nous amener au fascisme en
France en 2027
La meilleure stratégie pour éviter cela c’est de faire barrage au RN lors des
législatives
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.
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.
Vous qui me lisez, vous pouvez y faire quelque chose, et ce dès le premier tour.
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.
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.
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.
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.
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
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.
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 :
C’est du tour par tour (un tour par an) ça rappelle la lenteur d’Hyperiums 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
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.
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 :
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()
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
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)
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é.
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.
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:
Gestion de boîtes de réception de courriel via différents services d’e-mail comme Mailchimp, Mailpace, Postmark ou bien SendGrid. Ce module peut collaborer avec les modules d’entrée de documents pour automatiser la réception de document par courriel.
Mise en cache des listes de prix. Tryton peut être configuré pour calculer des prix de ventes via un système de règle et de formule. Quand on a un catalogue produit très grand, ce calcul peut être trop lent, ce module règle le problème en mettant en cache le résultat pour chaque produit.
Place de produit dans un emplacement: la gestion de stock de Tryton est basée sur des emplacements, mais il peut arriver que l’organisation de l’entrepôt définisse une place précise pour chaque produit. Ce module permet de définir celle-ci sans devoir créer des sous-emplacements pour chaque produit.
Plan comptableSYSCOHADA est un plan qui est utilisé dans les pays de l'[[organisation pour l’harmonisation en Afrique du droit des affaires]].
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 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)
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.
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 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 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 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 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 !
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 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%
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
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/) !
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 !
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 ?
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.
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).
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
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)
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,
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 :
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.
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)
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.
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
La prochaine session de #PythonRennes aura lieu le jeudi 18 avril 2024 à 18h30 chez Zenika ( pour l’accueil) : Comment builder, packager un projet Python ? Comment le publier automatiquement sur PyPI Github Actions ?
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
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
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.
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.
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é.
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.
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 :
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.
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!
Après de gros coup dur portés au collectif d’organisation, l’événement sera maintenu cette année
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 !
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.
É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 3 supports dont :
Ethi’Kdo - Première carte cadeau française des enseignes 100% éthiques et solidaires
Kadoresto - Première solution de bons et coffrets cadeaux pour les restaurants engagés
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.
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
Court appel avec Laure-Hélène, chargée de missions et office manager
Entretien en visio avec Antonin, CTO actuel d’éthi’Kdo
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”
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
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 :
<svgxmlns="http://www.w3.org/2000/svg"version="1.1"width="200"height="200"><gid="minutes"z="1"><circlecx="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><gid="fives"z="1"><rectx="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><gid="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 --><pathfill="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"/><rectx="98.5"y="5"width="3"height="95"/><rectx="98.5"y="5"width="3"height="95"tal:define="angle python:-path('timeangle')"tal:attributes="transform string:rotate(${angle}, 100, 100)"/></g></svg>
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.--><?pythondef nbars(n): "Size of `n` bars." return n * 9?><svgxmlns="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><rectid="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 --><usehref="#bar"tal:repeat="i range(1)"style="fill:#d5ffff"x="${ start + nbars(i) }"y="44"/><usehref="#bar"tal:repeat="i range(1, 1+exponent)"style="fill:#a4ffb4"x="${ start + nbars(i) }"y="44"/><usehref="#bar"tal:repeat="i range(1+exponent, 1+exponent+fraction)"style="fill:#ffb2b4"x="${ start + nbars(i) }"y="44"/><!-- sign --><gtal:define="x start + nbars(0 + 1/2)"><textstyle="text-anchor: end"><tspanx="${ x + 2 }"y="25">signe</tspan></text><pathclass="above"d="M ${x},31.5 L ${x},41.5"/></g><!-- exponent --><texttal:define="x start + nbars(1 + exponent/2)"><tspanx="${x}"y="12.5">exposant</tspan><tspanx="${x}"y="25">(${exponent} bits)</tspan></text><pathtal: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 --><texttal:define="x start + nbars(1 + exponent + fraction/2)"><tspanx="${x}"y="12.5">fraction</tspan><tspanx="${x}"y="25">(${fraction} bits)</tspan></text><pathtal: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 --><gtal:repeat="b (0, fraction, fraction+exponent)"><gtal:omit-tag=""tal:define="x start + nbars(1/2+exponent+fraction - b)"><circlecx="${x}"cy="79"r="3.7"/><textx="${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 :
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/
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. ↩
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. ↩
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 ↩
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
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 :
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"
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.
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 python3importargparseimportloggingimportpathlibimportsqlite3importcoloredlogsclassBook: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]defcorrect_amazon_url(self):ifnotself.amazon_url.startswith("http"):print("YOLO")self.amazon_url="yolo"defcorrect_fnac_url(self):ifself.fnac_url!="":print("coucou")self.fnac_url="coucou"defmain(args):logger.debug(args)connection=sqlite3.connect(args.db)cursor=connection.cursor()cursor.execute(f"SELECT * FROM {args.table}")forrowincursor.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()ifargs.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")ifnotargs.verbose:coloredlogs.install(level="ERROR",logger=logger)elifargs.verbose==1:coloredlogs.install(level="WARNING",logger=logger)elifargs.verbose==2:coloredlogs.install(level="INFO",logger=logger)elifargs.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 ?
Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain
Bus 23, 59, 81 ou 91 arret Maison des arts
+ Tram 1 arret Frachon a 15 minutes a pied
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.
Comment écrire un moteur de recherche en 80 lignes de Python ? Cet article décrit les principaux composants d’un moteur de recherche : le Crawler, l’Inverted index et le Ranker.
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.
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
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…
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
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
Ê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
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
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.
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 :
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
Explorez des méthodes éprouvées pour sécuriser et optimiser le build de vos images Docker. Maîtrisez les bonnes pratiques pour builder des applications Docker sûres.
by Yann Larrivee,Benoît Sibaud,Ysabeau 🧶 🧦 from Linuxfr.org
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.
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
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
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).
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.
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.
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 JAMAISsudo 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 Yn’est absolument pas équivalent à pip install X Y, et c’est la seconde forme qui est correcte.
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,
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.
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.
À 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 :
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.
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 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 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.
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.
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).
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).
À 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).
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 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 :
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.
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.
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 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 :
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 là 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.
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.
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é, …
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
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” ?
Pour ce dernier meetup de 2023, nous vous proposons un format Lightning Talks !
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
Nous serons accueillis par Lowit (métro Part-Dieu).
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.
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
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à.
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.
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 :
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 :
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 :
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 :
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é.
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
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.
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 :
pytest-iam, un outil qui permet de préparer et lancer une instance de Canaille, afin d'être utilisée dans des suites de tests unitaires avec pytest.
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 !
enfin, un logiciel qui implémente LDAP, ici je parle indifféremment du protocole ou de ses implémentations ↩︎
ce que nous avons fait, notre numéro à l’IANA est le 56207↩︎
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 ↩︎
le supermarché coopératif de l’agglomération bordelaise ↩︎
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.
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):
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.
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.
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.
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!
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())
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)
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.
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.
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.
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.
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.
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
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, là ou encore là. 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.
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 setrouveconcentrerquelquesdifficultésdedistributionetd’installationcoriaces, enraisondecodeC++.
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 :
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 :
L’histoire du packaging Python
Tour de l’écosystème actuel
Le casse-tête du code compilé
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 :
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 bootstrapepip 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 :
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.
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.
Bonjour,
Je cherche une librairie pour gérer des graphes au sens mathématique du mot. C’est a dire un objet avec des sommets, des arêtes et les centaines de fonctionnalités liées à ce sujet. (Voir Lexique de la théorie des graphes. J’ai trouvé entre-temps: " Networkx". Mais peut-être y a t’il mieux?
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 :
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 :
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)
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).
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).
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.
Pour les Pythonistes : un article qui donne des bonnes pratiques pour écrire du clean code avec Django. Réduire le couplage, granularité des tests, utilisation des modèles et des vues, etc.
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).
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.
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.
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.
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.
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 !
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 ?
Environnement international
Bonne ambiance dans l’équipe
Possibilité de télétravail
Avantage prévoyance professionnelle
…
Pourriez-vous publier cette offre d’emploi sur votre « job board », svp ?
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…
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.
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:)
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.
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 :
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
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.
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:)
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.
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)
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, 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:)
Makina Corpusdé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.
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)
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érienceen développement web avec lestechnologies 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, 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:)
Makina Corpusconç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.
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 :
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.
Makina Corpusdé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.
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 posteet 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 minimumcar 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.
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.
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).
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.
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!
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
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.
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.
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.
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 ) 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.
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]]
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.
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 ?
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.
Nous avons fréquemment des demandes de support sur la partie conteneurs avec Kubernetes, il nous semble important de clarifier notre approche sur ce type de produit.
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.
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.
Makina Corpusdé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.
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 posteet 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 minimumcar 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.
Makina Corpusdé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.
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)
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érienceen développement web avec lestechnologies 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:)
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.
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)
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:)
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.
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:)
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.
Makina Corpusconç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 :
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.
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.
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'
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.
by Yann Larrivee,Nÿco,Benoît Sibaud,Xavier Teyssier from Linuxfr.org
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.).
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 !
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.
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 :
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.
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 …)
Grosse annonce pour les Pythonistes : la proposition de retirer le GIL (Global Interpreter Lock) a été acceptée, permettant le multi-threading natif en Python, une version expérimentale va bientôt être publiée
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.
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 …
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é
Merci d’utiliser le bouton “Modifier” en bas a droite du message pour ajouter des infos ou répondre en dessous si vous préférez / n’avez pas de droits de modification…
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 / …
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 !
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.
Pour le Meetup de juillet à Grenoble, on sera sur un format “estival” : on échangera autour d’un verre sur le bilan des 10 Meetups de la saison 2022-2023.
j’ai cette erreur en essayant d’exécuter un script python: can't open file 'C:\\Users\\smain\\Desktop\\scrappython\\search.py': [Errno 2] No such file or directory chatgpt ne m’a pas aidé beaucoup donc je viens vers vous en vous remerciant par avance.
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.
######################fromPyQt5importQtCore,QtGui,QtWidgetsfromprojetimportUi_MainWindowimportsysimportstclassBd(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 Navigationself.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 Navigationself.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)self.ui.SeconncterBtn.clicked.connect(self.ValideUser)defCreateUserAccount(self):Nom=self.ui.lineEditNomCreerCompte.text()Email=self.ui.lineEditMailCreerCompte.text()Password=self.ui.lineEditPasswordCreerCompte.text()Data=(Nom,Email,Password)ifself.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('')defValideUser(self):Email=self.ui.lineEditMailSeConnecter.text()Password=self.ui.lineEditPasswordSeConnecter.text()try:self.Bd.ValideUser(Email,Password)# Pass Email and Password separatelyself.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
#######################importsqlite3,smtplib,sslfromemail.messageimportEmailMessageclassBd():def__init__(self):self.Connexion=sqlite3.connect("ctl.db")self.Cursor=self.Connexion.cursor()defConnectUser(self,Data):Req="INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"self.Cursor.execute(Req,Data)self.Connexion.commit()return0defValideUser(self,Email,Password):Req="SELECT Email FROM user WHERE Email = ?"self.Cursor.execute(Req,(Email,Password))returnprint(self.Cursor.fetchall()[0][0])
main.py fichier principal Besoin d'aide def ValideUser concernant la logique du try pour se connecter
######################fromPyQt5importQtCore,QtGui,QtWidgetsfromprojetimportUi_MainWindowimportsysimportstclassBd(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 Navigationself.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 Navigationself.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)self.ui.SeconncterBtn.clicked.connect(self.ValideUser)defCreateUserAccount(self):Nom=self.ui.lineEditNomCreerCompte.text()Email=self.ui.lineEditMailCreerCompte.text()Password=self.ui.lineEditPasswordCreerCompte.text()Data=(Nom,Email,Password)ifself.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('')defValideUser(self):Email=self.ui.lineEditMailSeConnecter.text()Password=self.ui.lineEditPasswordSeConnecter.text()try:self.Bd.ValideUser(Email,Password)# Pass Email and Password separatelyself.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
#######################importsqlite3,smtplib,sslfromemail.messageimportEmailMessageclassBd():def__init__(self):self.Connexion=sqlite3.connect("ctl.db")self.Cursor=self.Connexion.cursor()defConnectUser(self,Data):Req="INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"self.Cursor.execute(Req,Data)self.Connexion.commit()return0defValideUser(self,Email,Password):Req="SELECT Email FROM user WHERE Email = ?"self.Cursor.execute(Req,(Email,Password))returnprint(self.Cursor.fetchall()[0][0])
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 ;)
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